services:
  backrest:
    image: ${RESTIC_IMAGE:-garethgeorge/backrest:latest}
    container_name: ${RESTIC_COMPOSE_PROJECT_NAME}_app
    restart: unless-stopped
    hostname: ${RESTIC_HOSTNAME:-falcon}
    volumes:
      # Backrest application data
      - backrest_data:/data
      - backrest_config:/config
      - backrest_cache:/cache
      - backrest_tmp:/tmp

      # Backup destination
      - ${RESTIC_BACKUP_PATH:-/mnt/hidrive/users/valknar/Backup}:/repos

      # Docker volumes to backup (read-only)
      - backup_core_postgres_data:/volumes/core_postgres_data:ro
      - backup_core_redis_data:/volumes/core_redis_data:ro
      - backup_directus_uploads:/volumes/directus_uploads:ro
      - backup_directus_bundle:/volumes/directus_bundle:ro
      - backup_awesome_data:/volumes/awesome_data:ro
      - backup_gotify_data:/volumes/gotify_data:ro
      - backup_scrapyd_data:/volumes/scrapyd_data:ro
      - backup_scrapy_code:/volumes/scrapy_code:ro
      - backup_n8n_data:/volumes/n8n_data:ro
      - backup_filestash_data:/volumes/filestash_data:ro
      - backup_linkwarden_data:/volumes/linkwarden_data:ro
      - backup_linkwarden_meili_data:/volumes/linkwarden_meili_data:ro
      - backup_letsencrypt_data:/volumes/letsencrypt_data:ro
      - backup_vaultwarden_data:/volumes/vaultwarden_data:ro
      - backup_joplin_data:/volumes/joplin_data:ro
      - backup_jelly_config:/volumes/jelly_config:ro

    environment:
      TZ: ${TIMEZONE:-Europe/Berlin}
      BACKREST_DATA: /data
      BACKREST_CONFIG: /config/config.json
      XDG_CACHE_HOME: /cache
      TMPDIR: /tmp

    networks:
      - compose_network

    labels:
      - 'traefik.enable=${RESTIC_TRAEFIK_ENABLED}'
      - 'traefik.http.middlewares.${RESTIC_COMPOSE_PROJECT_NAME}-redirect-web-secure.redirectscheme.scheme=https'
      - 'traefik.http.routers.${RESTIC_COMPOSE_PROJECT_NAME}-web.middlewares=${RESTIC_COMPOSE_PROJECT_NAME}-redirect-web-secure'
      - 'traefik.http.routers.${RESTIC_COMPOSE_PROJECT_NAME}-web.rule=Host(`${RESTIC_TRAEFIK_HOST}`)'
      - 'traefik.http.routers.${RESTIC_COMPOSE_PROJECT_NAME}-web.entrypoints=web'
      - 'traefik.http.routers.${RESTIC_COMPOSE_PROJECT_NAME}-web-secure.rule=Host(`${RESTIC_TRAEFIK_HOST}`)'
      - 'traefik.http.routers.${RESTIC_COMPOSE_PROJECT_NAME}-web-secure.tls.certresolver=resolver'
      - 'traefik.http.routers.${RESTIC_COMPOSE_PROJECT_NAME}-web-secure.entrypoints=web-secure'
      - 'traefik.http.middlewares.${RESTIC_COMPOSE_PROJECT_NAME}-web-secure-compress.compress=true'
      - 'traefik.http.routers.${RESTIC_COMPOSE_PROJECT_NAME}-web-secure.middlewares=${RESTIC_COMPOSE_PROJECT_NAME}-web-secure-compress'
      - 'traefik.http.services.${RESTIC_COMPOSE_PROJECT_NAME}-web-secure.loadbalancer.server.port=9898'
      - 'traefik.docker.network=${NETWORK_NAME}'
      - 'com.centurylinklabs.watchtower.enable=${WATCHTOWER_LABEL_ENABLE}'

volumes:
  backrest_data:
    name: ${RESTIC_COMPOSE_PROJECT_NAME}_data
  backrest_config:
    name: ${RESTIC_COMPOSE_PROJECT_NAME}_config
  backrest_cache:
    name: ${RESTIC_COMPOSE_PROJECT_NAME}_cache
  backrest_tmp:
    name: ${RESTIC_COMPOSE_PROJECT_NAME}_tmp

  # External volumes from other stacks (read-only mounts)
  backup_core_postgres_data:
    name: core_postgres_data
    external: true
  backup_core_redis_data:
    name: core_redis_data
    external: true
  backup_directus_uploads:
    name: core_directus_uploads
    external: true
  backup_directus_bundle:
    name: core_directus_bundle
    external: true
  backup_awesome_data:
    name: awesome_data
    external: true
  backup_gotify_data:
    name: messaging_gotify_data
    external: true
  backup_scrapyd_data:
    name: scrapy_scrapyd_data
    external: true
  backup_scrapy_code:
    name: scrapy_scrapy_code
    external: true
  backup_n8n_data:
    name: n8n_n8n_data
    external: true
  backup_filestash_data:
    name: stash_filestash_data
    external: true
  backup_linkwarden_data:
    name: links_data
    external: true
  backup_linkwarden_meili_data:
    name: links_meili_data
    external: true
  backup_letsencrypt_data:
    name: proxy_letsencrypt_data
    external: true
  backup_vaultwarden_data:
    name: vault_data
    external: true
  backup_joplin_data:
    name: joplin_data
    external: true

  backup_jelly_config:
    name: jelly_config
    external: true

networks:
  compose_network:
    name: ${NETWORK_NAME}
    external: true
