본문으로 이동
주 메뉴
주 메뉴
사이드바로 이동
숨기기
둘러보기
대문
최근 바뀜
임의의 문서로
미디어위키 도움말
특수 문서 목록
LS Taiwan
검색
검색
보이기
계정 만들기
로그인
개인 도구
계정 만들기
로그인
로그아웃한 편집자를 위한 문서
더 알아보기
기여
토론
ERP code 수정
편집하기 (부분)
문서
토론
한국어
읽기
편집
역사 보기
도구
도구
사이드바로 이동
숨기기
동작
읽기
편집
역사 보기
일반
여기를 가리키는 문서
가리키는 글의 최근 바뀜
문서 정보
보이기
사이드바로 이동
숨기기
경고:
로그인하지 않았습니다. 편집을 하면 IP 주소가 공개되게 됩니다.
로그인
하거나
계정을 생성하면
편집자가 사용자 이름으로 기록되고, 다른 장점도 있습니다.
스팸 방지 검사입니다. 이것을 입력하지
마세요
!
===전통적인 방법=== * Cron, ssh이용 Docker 환경에서 Dolibarr 서버의 데이터베이스와 디렉토리를 매일 한 번 원격으로 백업하여 로컬로 가져오는 자동화된 프로세스를 구축하는 방법을 안내해 드리겠습니다. 이 과정은 로컬 머신에서 실행되는 스크립트를 통해 원격 Docker 호스트에 접속하고, Docker 컨테이너 내의 데이터를 백업한 후, 그 파일을 로컬 머신으로 가져오는 방식으로 진행됩니다. **사전 준비 사항:** 1. **SSH 접속 설정 (로컬 → 원격 서버):** * 로컬 머신에서 원격 Docker 호스트로 비밀번호 입력 없이 SSH 접속이 가능하도록 SSH 키 기반 인증을 설정합니다. * 로컬 머신에 SSH 키 쌍이 없다면 생성합니다: `ssh-keygen -t rsa -b 4096` * 생성된 공개키 (`~/.ssh/id_rsa.pub`)의 내용을 원격 서버의 `~/.ssh/authorized_keys` 파일에 추가합니다. * 원격 서버의 SSH 포트가 기본 포트(22)가 아니라면 해당 포트 번호를 기억해 둡니다. 2. **원격 서버 정보 확인:** * 원격 Docker 호스트의 IP 주소 또는 도메인 이름 * 원격 서버 접속을 위한 SSH 사용자 이름 * Dolibarr 데이터베이스 컨테이너 이름 또는 ID * Dolibarr 애플리케이션 컨테이너 이름 또는 ID * Dolibarr `documents` 디렉토리 경로 (컨테이너 내부) * Dolibarr `conf` 디렉토리 경로 (컨테이너 내부, 보통 `htdocs/conf`) * 데이터베이스 이름, 사용자, 비밀번호 (Dolibarr 설정 파일 `htdocs/conf/conf.php` 또는 Docker 환경 변수에서 확인) 3. **로컬 머신 준비:** * `ssh`, `scp` (또는 `rsync`) 명령어가 설치되어 있어야 합니다. (대부분의 Linux, macOS에는 기본 설치) * 백업 파일을 저장할 로컬 디렉토리 생성. **자동 백업 스크립트 (Bash 셸 스크립트 예시)** 아래는 로컬 머신에서 실행할 셸 스크립트 예시입니다. 필요에 따라 수정하여 사용하세요. ```bash #!/bin/bash # --- 설정 변수 --- # 원격 서버 정보 REMOTE_USER="your_remote_ssh_user" REMOTE_HOST="your_remote_server_ip_or_domain" REMOTE_SSH_PORT="22" # 원격 SSH 포트 (기본값이 아니라면 변경) # SSH 키 경로 (비밀번호 없는 접속을 위해 특정 키를 사용한다면 지정, 예: ~/.ssh/my_remote_key) # SSH_KEY_PATH="~/.ssh/id_rsa" # 기본 키를 사용한다면 주석 처리하거나 비워둘 수 있음 # Docker 컨테이너 정보 (원격 서버 기준) DB_CONTAINER_NAME="dolibarr_mariadb_container_name" # 실제 MariaDB/MySQL 컨테이너 이름 APP_CONTAINER_NAME="dolibarr_app_container_name" # 실제 Dolibarr 앱 컨테이너 이름 # Dolibarr 데이터베이스 정보 DB_NAME="dolibarr_db_name" DB_USER="dolibarr_db_user" DB_PASSWORD="dolibarr_db_password" # 백업 대상 디렉토리 경로 (Dolibarr 앱 컨테이너 내부) # 중요: 이 경로는 Dolibarr 설치 및 Docker 설정에 따라 다를 수 있습니다. # 일반적으로 documents 디렉토리는 /var/www/documents 또는 /var/lib/dolibarr/documents 등일 수 있습니다. # conf 디렉토리는 /var/www/html/conf 또는 Dolibarr 웹 루트 아래의 htdocs/conf 입니다. DOCUMENTS_DIR_PATH_IN_CONTAINER="/var/www/documents" CONF_DIR_PATH_IN_CONTAINER="/var/www/html/conf" # 예시 경로, 실제 경로로 수정 # 로컬 백업 저장 경로 LOCAL_BACKUP_DIR="/path/to/your/local/backup_folder" # 로컬 머신에 백업 파일을 저장할 경로 # 백업 파일 이름 설정 DATE_FORMAT=$(date +%Y%m%d_%H%M%S) DB_BACKUP_FILENAME="dolibarr_db_backup_${DATE_FORMAT}.sql.gz" FILES_BACKUP_FILENAME="dolibarr_files_backup_${DATE_FORMAT}.tar.gz" # 원격 서버에 임시로 백업 파일을 저장할 경로 REMOTE_TEMP_BACKUP_DIR="/tmp/dolibarr_backups" # 원격 서버의 임시 저장 경로 # SSH 옵션 SSH_OPTS="" if [ ! -z "$SSH_KEY_PATH" ]; then SSH_OPTS="-i $SSH_KEY_PATH" fi # --- 스크립트 시작 --- echo "Dolibarr 백업 스크립트 시작: $(date)" # 1. 원격 서버에 임시 백업 디렉토리 생성 ssh $SSH_OPTS -p $REMOTE_SSH_PORT $REMOTE_USER@$REMOTE_HOST "mkdir -p $REMOTE_TEMP_BACKUP_DIR" if [ $? -ne 0 ]; then echo "오류: 원격 서버에 임시 백업 디렉토리($REMOTE_TEMP_BACKUP_DIR) 생성 실패." exit 1 fi # 2. 데이터베이스 백업 (원격 Docker 컨테이너 내에서 실행 후 원격 호스트로 복사) echo "데이터베이스 백업 중..." # mysqldump 실행 및 압축. Docker 컨테이너 내에서 직접 압축하는 것이 효율적일 수 있음. # DB_PASSWORD를 환경 변수로 전달하여 보안 강화 ssh $SSH_OPTS -p $REMOTE_SSH_PORT $REMOTE_USER@$REMOTE_HOST \ "docker exec -e MYSQL_PWD='$DB_PASSWORD' $DB_CONTAINER_NAME sh -c 'mysqldump -u $DB_USER -h localhost $DB_NAME | gzip' > $REMOTE_TEMP_BACKUP_DIR/$DB_BACKUP_FILENAME" if [ $? -ne 0 ]; then echo "오류: 데이터베이스 백업 실패." ssh $SSH_OPTS -p $REMOTE_SSH_PORT $REMOTE_USER@$REMOTE_HOST "rm -rf $REMOTE_TEMP_BACKUP_DIR" # 임시 디렉토리 정리 exit 1 fi echo "데이터베이스 백업 완료: $DB_BACKUP_FILENAME" # 3. 디렉토리 백업 (documents, conf 디렉토리 - 원격 Docker 컨테이너 내에서 실행 후 원격 호스트로 복사) echo "디렉토리 백업 중 (documents, conf)..." # 컨테이너 내에서 직접 tar로 묶어서 압축 후 호스트로 전달 # 중요: DOCUMENTS_DIR_PATH_IN_CONTAINER와 CONF_DIR_PATH_IN_CONTAINER가 실제 컨테이너 내 경로인지 확인 필요 # 두 디렉토리가 동일한 상위 디렉토리에 있다면, 한 번의 tar 명령으로 처리 가능. 여기서는 개별적으로 처리하거나, # docker exec 명령 내에서 cd 명령과 함께 상대 경로를 사용할 수 있습니다. # 여기서는 두 디렉토리를 포함하는 상위 디렉토리가 있다면 그 기준으로 하는 것이 좋으나, # 명확하지 않으므로 각각의 절대 경로를 tar에 전달하는 방식으로 구성 (만약 tar가 컨테이너 내에서 이 경로들을 올바르게 인지한다면) # 또는, 각 디렉토리를 개별 파일로 압축할 수도 있습니다. # 좀 더 안정적인 방법은 docker cp를 사용하여 호스트로 먼저 복사 후 압축하거나, 볼륨을 직접 압축하는 것입니다. # 여기서는 docker exec를 이용해 컨테이너 내에서 압축하는 예를 보입니다. # /app/documents, /app/htdocs/conf 와 같이 공통 부모가 있다면 /app 을 대상으로 할 수도 있습니다. # 여기서는 두 경로를 함께 압축하는 예시를 보여줍니다. (두 경로가 동일한 파일 시스템에 있어야 함) # 만약 별도의 볼륨이라면 각각 백업해야 합니다. # documents와 conf 디렉토리의 부모 디렉토리를 알아야 효율적으로 tar 가능 # 여기서는 예시로 /var/www/ 가 두 디렉토리의 공통 부모라고 가정하고, # documents는 html/documents (상대경로), conf는 html/conf (상대경로) 라고 가정합니다. # 실제로는 `docker inspect APP_CONTAINER_NAME`을 통해 마운트된 볼륨이나 경로를 확인해야 합니다. # 가장 확실한 방법은 각 디렉토리를 개별적으로 압축하거나, 볼륨을 호스트에서 직접 백업하는 것입니다. # 여기서는 두 디렉토리를 하나의 아카이브로 묶는다고 가정하고, # 컨테이너 내의 작업 디렉토리를 설정한 후 상대 경로로 지정합니다. # 예: Dolibarr 파일들이 /var/www/html 에 있다면 ssh $SSH_OPTS -p $REMOTE_SSH_PORT $REMOTE_USER@$REMOTE_HOST \ "docker exec $APP_CONTAINER_NAME sh -c 'tar -czf - -C $(dirname $DOCUMENTS_DIR_PATH_IN_CONTAINER) $(basename $DOCUMENTS_DIR_PATH_IN_CONTAINER) -C $(dirname $CONF_DIR_PATH_IN_CONTAINER) $(basename $CONF_DIR_PATH_IN_CONTAINER)' > $REMOTE_TEMP_BACKUP_DIR/$FILES_BACKUP_FILENAME" # 위 명령은 DOCUMENTS_DIR_PATH_IN_CONTAINER 와 CONF_DIR_PATH_IN_CONTAINER 의 부모 디렉토리가 다를 경우 문제가 될 수 있습니다. # 더 안전한 방법은 다음과 같이 각 디렉토리를 명시적으로 지정하는 것입니다 (만약 이 경로들이 컨테이너 루트 기준이라면). # ssh $SSH_OPTS -p $REMOTE_SSH_PORT $REMOTE_USER@$REMOTE_HOST \ # "docker exec $APP_CONTAINER_NAME tar -czf - $DOCUMENTS_DIR_PATH_IN_CONTAINER $CONF_DIR_PATH_IN_CONTAINER" > $REMOTE_TEMP_BACKUP_DIR/$FILES_BACKUP_FILENAME # 만약 documents 디렉토리가 볼륨으로 마운트되어 있다면 (예: /host/path/to/documents -> /var/www/documents) # 호스트에서 직접 해당 /host/path/to/documents를 압축하는 것이 더 간단할 수 있습니다. if [ $? -ne 0 ]; then echo "오류: 디렉토리 백업 실패." ssh $SSH_OPTS -p $REMOTE_SSH_PORT $REMOTE_USER@$REMOTE_HOST "rm -rf $REMOTE_TEMP_BACKUP_DIR" # 임시 디렉토리 정리 exit 1 fi echo "디렉토리 백업 완료: $FILES_BACKUP_FILENAME" # 4. 백업 파일들을 로컬 머신으로 복사 echo "백업 파일들을 로컬 머신으로 복사 중..." mkdir -p $LOCAL_BACKUP_DIR # 로컬 백업 디렉토리 생성 (없을 경우) scp $SSH_OPTS -P $REMOTE_SSH_PORT $REMOTE_USER@$REMOTE_HOST:$REMOTE_TEMP_BACKUP_DIR/$DB_BACKUP_FILENAME $LOCAL_BACKUP_DIR/ if [ $? -ne 0 ]; then echo "오류: 데이터베이스 백업 파일 로컬 복사 실패." ssh $SSH_OPTS -p $REMOTE_SSH_PORT $REMOTE_USER@$REMOTE_HOST "rm -rf $REMOTE_TEMP_BACKUP_DIR" exit 1 fi scp $SSH_OPTS -P $REMOTE_SSH_PORT $REMOTE_USER@$REMOTE_HOST:$REMOTE_TEMP_BACKUP_DIR/$FILES_BACKUP_FILENAME $LOCAL_BACKUP_DIR/ if [ $? -ne 0 ]; then echo "오류: 디렉토리 백업 파일 로컬 복사 실패." ssh $SSH_OPTS -p $REMOTE_SSH_PORT $REMOTE_USER@$REMOTE_HOST "rm -rf $REMOTE_TEMP_BACKUP_DIR" exit 1 fi echo "백업 파일 로컬 복사 완료." # 5. 원격 서버의 임시 백업 파일 삭제 echo "원격 서버의 임시 백업 파일 삭제 중..." ssh $SSH_OPTS -p $REMOTE_SSH_PORT $REMOTE_USER@$REMOTE_HOST "rm -rf $REMOTE_TEMP_BACKUP_DIR" echo "원격 서버 임시 파일 삭제 완료." # 6. (선택 사항) 로컬에 오래된 백업 파일 삭제 (예: 30일 이상된 파일 삭제) # DAYS_TO_KEEP=30 # find $LOCAL_BACKUP_DIR -type f -name "dolibarr_db_backup_*.sql.gz" -mtime +$DAYS_TO_KEEP -exec rm -f {} \; # find $LOCAL_BACKUP_DIR -type f -name "dolibarr_files_backup_*.tar.gz" -mtime +$DAYS_TO_KEEP -exec rm -f {} \; # echo "오래된 로컬 백업 파일 정리 완료 (보관 기간: ${DAYS_TO_KEEP}일)." echo "Dolibarr 백업 스크립트 완료: $(date)" exit 0 ``` **스크립트 사용 방법 및 주의사항:** 1. **스크립트 수정:** * `--- 설정 변수 ---` 섹션의 모든 변수들을 실제 사용자의 환경에 맞게 정확히 수정해야 합니다. * 특히 `DOCUMENTS_DIR_PATH_IN_CONTAINER`와 `CONF_DIR_PATH_IN_CONTAINER`는 Dolibarr Docker 설정에 따라 매우 다를 수 있으므로, `docker inspect APP_CONTAINER_NAME` 명령 등을 통해 정확한 경로를 확인하거나, Docker 볼륨을 사용한다면 호스트 경로를 직접 압축하는 방식을 고려하세요. * 만약 `documents` 디렉토리와 `conf` 디렉토리가 Docker 볼륨으로 호스트 머신에 마운트되어 있다면, `docker exec`를 사용하는 대신 SSH로 원격 호스트에 접속하여 해당 호스트 경로를 직접 `tar`로 압축하는 것이 더 간단하고 효율적일 수 있습니다. 이 경우 스크립트의 디렉토리 백업 부분을 수정해야 합니다. * 예시 (호스트에서 직접 볼륨 백업): ```bash # REMOTE_HOST_DOCUMENTS_PATH="/path/on/host/to/documents_volume" # REMOTE_HOST_CONF_PATH="/path/on/host/to/conf_volume" # ssh $SSH_OPTS -p $REMOTE_SSH_PORT $REMOTE_USER@$REMOTE_HOST \ # "tar -czf $REMOTE_TEMP_BACKUP_DIR/$FILES_BACKUP_FILENAME -C $(dirname $REMOTE_HOST_DOCUMENTS_PATH) $(basename $REMOTE_HOST_DOCUMENTS_PATH) -C $(dirname $REMOTE_HOST_CONF_PATH) $(basename $REMOTE_HOST_CONF_PATH)" ``` 2. **실행 권한 부여:** * 스크립트를 저장한 후 실행 권한을 부여합니다: `chmod +x your_backup_script_name.sh` 3. **테스트 실행:** * 스크립트를 수동으로 실행하여 모든 과정이 정상적으로 작동하는지, 오류는 없는지 꼼꼼히 확인합니다. * 특히 파일 경로, 컨테이너 이름, 데이터베이스 정보 등이 정확한지 확인합니다. * 백업된 파일이 로컬에 정상적으로 생성되고, 압축 해제 시 내용이 올바른지 확인합니다. 4. **자동 실행 등록 (Cron 작업):** * 로컬 머신에서 `crontab -e` 명령을 사용하여 cron 작업을 등록합니다. * 예시 (매일 새벽 3시에 스크립트 실행): ```cron 0 3 * * * /path/to/your/your_backup_script_name.sh >> /path/to/your/backup_log_file.log 2>&1 ``` * 스크립트의 절대 경로를 사용해야 합니다. * 로그 파일 경로를 지정하여 실행 결과 및 오류를 기록하는 것이 좋습니다. * **주의:** cron 환경에서는 사용자의 일반적인 셸 환경 변수가 모두 설정되어 있지 않을 수 있습니다. 스크립트 내에서 필요한 모든 경로를 절대 경로로 지정하거나, 스크립트 상단에서 필요한 환경 변수(예: `PATH`)를 명시적으로 설정하는 것이 안전합니다. SSH 키 경로도 마찬가지입니다. **보안 고려 사항:** * **데이터베이스 비밀번호:** 스크립트에 데이터베이스 비밀번호를 직접 작성하는 것은 보안상 좋지 않습니다. * **대안 1 (권장):** `docker exec` 시 `-e MYSQL_PWD='$DB_PASSWORD'` 와 같이 환경 변수로 전달하면 그나마 덜 노출됩니다. * **대안 2:** 원격 서버의 Docker 컨테이너가 `.my.cnf` 파일과 같은 MySQL/MariaDB 설정 파일을 읽을 수 있도록 설정하고, 해당 파일에 인증 정보를 저장합니다. (Docker 볼륨 매핑 필요) * **대안 3:** HashiCorp Vault 같은 시크릿 관리 도구를 사용하는 것도 고려할 수 있지만, 설정이 복잡해질 수 있습니다. * **SSH 키 보안:** SSH 개인키는 안전하게 보관되어야 하며, 불필요한 권한을 가지지 않도록 설정합니다. * **백업 파일 암호화:** 로컬로 가져온 백업 파일에 민감한 정보가 있다면, 추가적으로 GPG 등을 사용하여 암호화하는 것을 고려할 수 있습니다. 이 스크립트는 기본적인 틀을 제공하며, 사용자의 특정 환경과 요구 사항에 맞게 커스터마이징하여 사용해야 합니다. 특히 Docker 볼륨 사용 여부와 그에 따른 백업 대상 경로 지정이 중요합니다.
요약:
LS Taiwan에서의 모든 기여는 다른 기여자가 편집, 수정, 삭제할 수 있다는 점을 유의해 주세요. 만약 여기에 동의하지 않는다면, 문서를 저장하지 말아 주세요.
또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다(자세한 사항은
LS Taiwan:저작권
문서를 보세요).
저작권이 있는 내용을 허가 없이 저장하지 마세요!
취소
편집 도움말
(새 창에서 열림)
검색
검색
ERP code 수정
편집하기 (부분)
새 주제