백업, 복원 및 업그레이드
이 자습서에서는 아웃포스트 구성, 액세스 자격 증명, 장치 권한 부여, 모니터링 체크포인트 및 대기 중인 알림을 백업합니다. 원본 이메일 메시지는 이메일 제공업체에 남아 있습니다. 이 백업은 Mailwake 인스턴스를 복원합니다.
1. 보존해야 할 것
복구 가능한 백업에는 다음이 포함됩니다.
-
전체
/data디렉토리:mailwake.db,secret.key및 관련 SQLite 파일. 데이터베이스와 키를 함께 보관하십시오. - 구성 구성: 포트, 볼륨 및 환경 설정.
- 실행 이미지: 데이터베이스와 동일한 프로그램 버전을 복원합니다.
아래 스크립트는 표준 Compose 설치를 대상으로 합니다. 구성과 이미지를 저장하고 아웃포스트를 잠시 중지하고 모든 데이터를 복사한 다음 아웃포스트를 다시 시작합니다. 해당 간격 동안 모니터링이 일시 중지됩니다. 다시 시작한 후 아웃포스트는 저장된 체크포인트에서 재개되고 지난 24시간 이내에 받은 폴더에 여전히 있는 메시지를 따라잡습니다.
설치에서 역방향 프록시 구성이나 기타 호스트 탑재 파일을 사용하는 경우 해당 파일도 백업에 복사합니다. 다른 머신에서 복원할 때 해당 경로를 조정하십시오.
2. 첫 번째 백업 만들기
백업 스크립트 를 다운로드하고
backup.sh 로 저장한 후 서버 설치 디렉터리(예:
~/mailwake/backup.sh )에 넣습니다.
백업 스크립트 보기
#!/bin/sh
# Copyright (C) 2026 Mailwake contributors
# SPDX-License-Identifier: AGPL-3.0-only
# License: https://www.gnu.org/licenses/agpl-3.0.html
# Back up a running Compose installation; execute as a user with Docker access.
set -eu
if [ "$#" -ne 2 ]; then
echo "Usage: backup.sh /absolute/compose-directory /absolute/backup-directory" >&2
exit 2
fi
case "$1:$2" in
/*:/*) ;;
*) echo "Use absolute directory paths." >&2; exit 2 ;;
esac
cd "$1"
umask 077
lock=".mailwake-backup.lock"
if ! mkdir "$lock" 2>/dev/null; then
echo "Could not create $PWD/$lock. Check directory permissions and active backups." >&2
exit 1
fi
restart=0
cleanup() {
result=$?
trap - EXIT
if [ "$restart" -eq 1 ]; then
docker compose start core >&2 || result=1
fi
rmdir "$lock" || result=1
exit "$result"
}
trap cleanup EXIT
trap 'exit 130' INT
trap 'exit 143' TERM
container=$(docker compose ps -q core)
if [ -z "$container" ]; then
echo "Start the Core service before running this backup." >&2
exit 1
fi
mkdir -p "$2"
backup="$2/mailwake-$(date +%Y%m%d-%H%M%S)"
test ! -e "$backup"
staging="$backup.incomplete"
mkdir "$staging"
mkdir "$staging/data"
docker compose config > "$staging/compose.yaml"
docker inspect --format '{{.Image}}' "$container" > "$staging/image-id.txt"
docker image save --output "$staging/image.tar" "$(cat "$staging/image-id.txt")"
restart=1
docker compose stop core >&2
docker compose cp core:/data/. "$staging/data/" >&2
docker compose start core >&2
restart=0
mv "$staging" "$backup"
printf 'Backup saved: %s\n' "$backup"
서버 터미널에서 실행하세요:
sh "$HOME/mailwake/backup.sh" "$HOME/mailwake" "$HOME/mailwake-backups"
결과 확인: 터미널은 새 디렉터리 경로와 함께
Backup saved:를 인쇄하고
docker compose ps는 다시 실행 중인 아웃포스트를
표시합니다. 복사가 실패하면 스크립트는 아웃포스트를 다시 시작하려고
시도하고 실패를 반환합니다. .incomplete로 끝나는
디렉토리는 완료되지 않은 백업입니다. 문제 해결을 위해 보관하세요.
잠금 디렉터리는 예약된 백업과 수동 백업이 겹치는 것을 방지합니다.
호스트가 충돌하거나 프로세스가 강제로 종료되는 경우 먼저 실행 중인
백업이 없는지 확인한 다음 설치 디렉터리에서
.mailwake-backup.lock를 제거하고 스크립트를 다시
실행하세요.
각 백업에는 다음과 같은 레이아웃이 있습니다.
mailwake-20261008-030000/
compose.yaml
image-id.txt
image.tar
data/
mailwake.db
secret.key
...
이미지를 저장하려면 추가 디스크 공간이 필요하며 아웃포스트가
중지되기 전에 수행됩니다. 디렉터리는 개인 권한을 사용하며 암호화된
자격 증명과 해당 키를 모두 포함합니다.
data/mailwake.db , data/secret.key 및
image.tar 가 있는지 확인한 후 아래 복원 연습을 한 번
이상 수행합니다.
3. 새 볼륨으로 복원
원본 인스턴스를 중지하고 원래 볼륨을 유지합니다. 두 인스턴스 모두 사서함과 장치 ID를 공유하므로 한 번에 하나씩만 실행하세요.
cd ~/mailwake
docker compose stop core
backup를 실제 백업 경로로 설정합니다. 새 설치 디렉터리,
해당 이미지 및 구성을 준비합니다.
backup="$HOME/mailwake-backups/mailwake-20261008-030000"
mkdir -p ~/mailwake-restored
cd ~/mailwake-restored
cp "$backup/compose.yaml" ./compose.yaml
docker load --input "$backup/image.tar"
restore_volume="mailwake-restored-$(date +%Y%m%d-%H%M%S)"
cat > compose.override.yaml <<EOF
name: mailwake-restored
services:
core:
image: $(cat "$backup/image-id.txt")
volumes:
core-data:
name: $restore_volume
networks:
default:
name: $restore_volume-network
EOF
Compose는 compose.override.yaml 를 자동으로 로드합니다.
새로운 데이터 볼륨과 정확한 백업 이미지를 선택합니다. 컨테이너를
만들고, 데이터를 복사하고, 컨테이너 사용자의 소유권을 설정하고
시작합니다.
(
set -eu
docker compose create --pull never core
docker compose run --rm --no-deps -T --user 0:0 --entrypoint sh core \
-c 'entries=$(ls -A /data) && test -z "$entries"'
docker compose cp "$backup/data/." core:/data/
docker compose run --rm --no-deps -T --user 0:0 --cap-add CHOWN --entrypoint chown core \
-R 10001:10001 /data
docker compose up -d --pull never
docker compose logs --tail=50 core
)
각 명령이 성공한 후에만 계속하십시오. 빈 볼륨 검사에 실패하면 새로운
restore_volume를 선택하고 재정의를 다시 작성한 후
컨테이너를 다시 생성합니다. 채워진 대상은 오래된 파일과 복원된
데이터를 혼합할 수 있습니다. 이 절차에서는 빈 볼륨을 사용합니다.
결과 확인: 원래 관리자 비밀번호로 로그인하세요.
사서함 및 폴더 선택은 그대로 유지되고 모니터링이 재개되며 장치
권한은 백업에서 제공됩니다. 새로운 설정 화면이 나타나면 복원된
인스턴스를 중지하고 복사 경로와 볼륨 마운트를 확인하세요. 암호
복호화 오류의 경우 데이터베이스와 secret.key가 동일한
백업에서 나온 것인지 확인하세요.
4. 복원된 인스턴스 확인
- 사서함 수, 선택한 폴더를 확인하고 원래 설치와 비교하여 방법을 확인하십시오.
- 채널 테스트 알림을 보내고 휴대폰에 도착하는지 확인하세요.
- 다른 사서함의 새 이메일을 감시 폴더로 보내고 배달 기록을 확인하세요.
- 복원된 인스턴스를 다시 시작하고 다시 로그인한 후 구성 및 모니터링이 지속되는지 확인하세요.
확인되면 복원된 인스턴스에서 역방향 프록시를 지정하고
~/mailwake-restored에서 관리합니다. 해당 디렉터리를
사용하도록 백업 작업을 업데이트합니다. 원본 인스턴스를 중지된 상태로
두고 복구가 확인될 때까지 해당 볼륨과 백업을 유지합니다.
보류 중이거나 실패한 알림은 백업된 상태로 돌아가고 다시 전달될 수 있습니다. 동일한 절차를 사용하여 업그레이드를 롤백하고 이전 데이터와 이미지를 함께 복원합니다.
5. 백업 일정을 계획하고 오프사이트 복사본을 보관하세요.
Linux 서버에서는 먼저 수동 백업을 완료한 후
crontab -e를 사용하여 다음을 추가합니다.
/home/you를 절대 경로로 바꾸십시오.
PATH=/usr/local/bin:/usr/bin:/bin
0 3 * * * /bin/sh /home/you/mailwake/backup.sh /home/you/mailwake /home/you/mailwake-backups >> /home/you/mailwake-backup.log 2>&1
이는 서버의 현지 시간대로 매일 03:00에 실행됩니다. 예약된
사용자에게는 Docker 액세스가 필요합니다. NAS에서는 작업 스케줄러에서
동일한 셸 명령을 사용합니다. 다음 날 로그에서 새 디렉토리와
Backup saved:를 확인하세요. 실패를 해결합니다.
스케줄러는 백업이 복구 가능하다는 것을 설정할 수 없습니다.
동일한 디스크의 백업에는 디스크 또는 머신 오류가 포함되지 않습니다. 완료된 디렉터리를 다른 머신이나 보호된 백업 스토리지(예: SSH를 통해)에 복사합니다.
scp -r "$HOME/mailwake-backups/mailwake-20261008-030000" \
backup-user@backup-host:/srv/mailwake-backups/
소스, 원격 사용자, 호스트 및 대상을 교체합니다. 백업 관리자에게 대상 액세스를 제한합니다. 미사용 암호화가 필요한 경우 업로드하기 전에 암호화된 저장소를 사용하거나 아카이브를 암호화하세요. 가능한 보존 정책은 매일 복사본 7개와 매주 복사본 4개입니다. 이전 백업을 삭제하기 전에 오프사이트 복사본과 최근 복원 작업을 확인하십시오.
Docker Run 설치 백업
Docker Run 설치에서는 mailwake라는 컨테이너와
mailwake-data 볼륨을 사용합니다. 다음 명령은 서브셸에서
실행되며 복사가 실패하면 원래 컨테이너를 다시 시작하려고 시도합니다.
(
set -eu
umask 077
backup="$HOME/mailwake-backups/mailwake-$(date +%Y%m%d-%H%M%S)"
mkdir -p "$backup/data"
docker inspect --format '{{.Image}}' mailwake > "$backup/image-id.txt"
docker image save --output "$backup/image.tar" "$(cat "$backup/image-id.txt")"
trap 'docker start mailwake >/dev/null' EXIT
docker stop mailwake
docker cp mailwake:/data/. "$backup/data/"
docker start mailwake
trap - EXIT
printf 'Backup saved: %s\n' "$backup"
)
Docker Run 명령을 데이터와 함께 저장하세요. 복원하려면 원래
컨테이너를 중지하고 image.tar 를 로드하고 새 볼륨과
컨테이너를 생성한 후 시작하기 전에 데이터를 복사하세요.
(
set -eu
backup="$HOME/mailwake-backups/mailwake-20261008-030000"
image=$(cat "$backup/image-id.txt")
restore_volume="mailwake-restored-$(date +%Y%m%d-%H%M%S)"
docker stop mailwake
docker load --input "$backup/image.tar"
docker volume create "$restore_volume"
docker create --name mailwake-restored --restart unless-stopped \
--stop-timeout 30 --read-only --security-opt no-new-privileges:true --cap-drop ALL \
-p 127.0.0.1:8080:8080 -v "$restore_volume:/data" "$image"
docker run --rm --user 0:0 --entrypoint sh -v "$restore_volume:/data" "$image" \
-c 'entries=$(ls -A /data) && test -z "$entries"'
docker cp "$backup/data/." mailwake-restored:/data/
docker run --rm --user 0:0 --entrypoint chown -v "$restore_volume:/data" "$image" \
-R 10001:10001 /data
docker start mailwake-restored
)
각 명령이 성공한 후에만 계속하고 위의 확인 체크리스트를 따르세요. 원래 컨테이너와 볼륨을 유지하고 복원된 인스턴스가 실행되는 동안 원래 컨테이너는 중지된 상태로 둡니다.
Markdown · AGPL-3.0-only · Mailwake 기여자