diff --git a/kopia/docker-compose-init.yml b/kopia/docker-compose-init.yml new file mode 100644 index 0000000..0015752 --- /dev/null +++ b/kopia/docker-compose-init.yml @@ -0,0 +1,78 @@ +# Run once: docker compose -f docker-compose-init.yml up --build --force-recreate + +services: + kopia_init: + image: kopia/kopia:latest + container_name: kopia_init + # Use the passwords from .env + environment: + - KOPIA_REPOSITORY_PASSWORD=${KOPIA_REPOSITORY_PASSWORD} + - PUID=1000 + - PGID=1000 + + # Volumes MUST match the server setup so the repository is initialized in the correct place. + volumes: + - kopia_config:/app/config + - kopia_cache:/app/cache + - kopia_logs:/app/logs + - g:/kopia-backups:/app/repository # CRITICAL: This is where the repo will be created + + # --- YOUR SOURCE DATA --- + # Maps your host's E:\installers and H:\immich-photos to specific paths inside the container. + # ':ro' (read-only) is a safety best practice. + - e:/installers:/source/installers:ro + - h:/immich-photos:/source/immich-photos:ro + + # Override the default Kopia ENTRYPOINT to use the standard shell. + entrypoint: /bin/sh + + # This command now runs 4 steps sequentially: + # 1. Create the repository. + # 2. Connect to it (so subsequent commands work). + # 3. SET POLICY for /source/installers (12h interval + retention). + # 4. SET POLICY for /source/immich-photos (12h interval + retention). + command: + - -c + - | + # 1. Create the Kopia Repository + echo 'Creating new Kopia repository at /app/repository...' + kopia repository create filesystem \ + --path=/app/repository \ + --password=${KOPIA_REPOSITORY_PASSWORD} \ + && \ + # 2. Explicitly connect to the repository non-interactively. + # This is CRITICAL for the policy commands to work. + echo 'Connecting to repository non-interactively...' && \ + kopia repository connect filesystem \ + --path=/app/repository \ + --password=${KOPIA_REPOSITORY_PASSWORD} \ + && \ + # 3. SET POLICY for installers (Schedule: 12h) + # This does NOT run a snapshot. It just saves the schedule. + echo 'Setting 12-hour schedule for /source/installers...' && \ + kopia policy set /source/installers \ + --snapshot-interval 12h \ + --keep-daily 7 \ + --keep-weekly 4 \ + --keep-monthly 12 \ + --password=${KOPIA_REPOSITORY_PASSWORD} \ + && \ + # 4. SET POLICY for immich-photos (Schedule: 12h) + echo 'Setting 12-hour schedule for /source/immich-photos...' && \ + kopia policy set /source/immich-photos \ + --snapshot-interval 12h \ + --keep-daily 7 \ + --keep-weekly 4 \ + --keep-monthly 12 \ + --password=${KOPIA_REPOSITORY_PASSWORD} + + echo 'Initialization complete. Repository created and policies set.' + + # Do not restart since it's a one-off command + restart: "no" + +# Re-using the same Docker-managed volumes +volumes: + kopia_config: + kopia_cache: + kopia_logs: diff --git a/kopia/docker-compose.yml b/kopia/docker-compose.yml index 7f0f717..d1d962c 100644 --- a/kopia/docker-compose.yml +++ b/kopia/docker-compose.yml @@ -24,14 +24,15 @@ services: - kopia_logs:/app/logs # --- YOUR BACKUP DESTINATION --- - # Maps your host's F:\test_backup to /app/repository inside the container. + # Maps your host's G:\kopia-backups to /app/repository inside the container. # Kopia will write its backup data here. - - f:/test_backup:/app/repository + - g:/kopia-backups:/app/repository # --- YOUR SOURCE DATA --- - # Maps your host's E:\installers to /source/installers inside the container. + # Maps your host's E:\installers and H:\immich-photos to /source/installers inside the container. # ':ro' (read-only) is a safety best practice. - e:/installers:/source/installers:ro + - h:/immich-photos:/source/immich-photos:ro command: - server @@ -39,6 +40,7 @@ services: - --ui - --address=0.0.0.0:51515 - --insecure + - --password=${KOPIA_REPOSITORY_PASSWORD} - --server-username=${KOPIA_SERVER_USERNAME} - --server-password=${KOPIA_SERVER_PASSWORD} restart: unless-stopped