summaryrefslogtreecommitdiff
path: root/playbooks/roles/backup/templates/stacks/docker-compose.yml
blob: 9089a8a3eab1ba89ab469d29790d2e45d399aba7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
services:
  backup:
    image: python:3.11-alpine
    volumes:
      - "{{ swarm_base }}:/mnt/source:ro"
      - "{{ backup_base }}/volumes/backups:/backups"
      - "{{ backup_base }}/volumes/work:/work"
      - "{{ backup_base }}/volumes/scripts:/scripts"
{% if borg_repo.startswith('ssh://') %}
      - "{{ backup_base }}/volumes/ssh:/root/.ssh:ro"
{% endif %}
    environment:
      - TZ={{ timezone }}
      - DEPLOYMENT_TIME={{ deployment_time }}
      - BACKUP_RETENTION_DAYS={{ backup_retention_days | default(14) }}
      - NTFY_TOPIC={{ ntfy_topic }}
      - PYTHONUNBUFFERED=1
      - BORG_REPO={{ borg_repo }}
      - BORG_PASSPHRASE={{ borg_passphrase }}
      - BORG_COMPRESSION={{ borg_compression }}
      - BORG_KEEP_DAILY={{ borg_keep_daily }}
      - BORG_KEEP_WEEKLY={{ borg_keep_weekly }}
      - BORG_KEEP_MONTHLY={{ borg_keep_monthly }}
    command: >
      sh -c "
        apk add --no-cache borgbackup openssh-client &&
        chmod +x /scripts/*.py &&
        mkdir -p /scripts/logs &&
{% if homelab_build %}
        python3 /scripts/backup.py /mnt/source --blocklist {{ blocklist }} --work-dir /work --backup-dir /backups
{% else %}
        echo '0 2 * * * cd /scripts && python3 backup.py /mnt/source --blocklist {{ blocklist }} --work-dir /work --backup-dir /backups >> logs/backup-$$(date +\\%Y\\%m\\%d).log 2>&1' > /etc/crontabs/root &&
        echo '0 4 * * * cd /scripts && python3 cleanup.py /backups --blocklist {{ blocklist }} --retention-days ${BACKUP_RETENTION_DAYS} >> logs/cleanup-$$(date +\\%Y\\%m\\%d).log 2>&1' >> /etc/crontabs/root &&
        crond -f
{% endif %}
      "
    networks:
      - proxy
    deploy:
      mode: replicated
      replicas: 1
      update_config:
        parallelism: 1
        failure_action: rollback
        order: start-first
        delay: 5s
        monitor: 30s
      placement:
        constraints:
          - node.role == manager

networks:
  proxy:
    external: true