networks:
  traefik-net:
    external: true
    name: traefik-net

x-traefik: &x-traefik
  networks:
    - traefik-net
    - default

volumes:
  forgejo-data:
    name: forgejo
  forgejo-database-data:
    name: forgejo-database-data
  forgejo-pg-backup:
    name: forgejo-pg-backup

services:
  forgejo:
    image: codeberg.org/forgejo/forgejo:8
    depends_on:
      - db
    volumes:
      - forgejo-data:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    env_file:
      - .env
    <<: *x-traefik
    deploy:
      labels:
        - traefik.enable=true
        - traefik.docker.network=traefik-net
        - traefik.http.routers.forgejo.rule=Host(`${HOST}`)
        - traefik.http.routers.forgejo.entrypoints=${ENTRYPOINTS:-websecure}
        - traefik.http.routers.forgejo.tls.certresolver=le
        - traefik.http.services.forgejo.loadbalancer.server.port=3000

  db:
    image: docker.io/library/postgres:16
    volumes:
      - forgejo-database-data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=${FORGEJO__database__NAME}
      - POSTGRES_USER=${FORGEJO__database__USER}
      - POSTGRES_PASSWORD=${FORGEJO__database__PASSWD}

  database-backup:
    image: prodrigestivill/postgres-backup-local:16
    depends_on:
      - db
    volumes:
      - forgejo-pg-backup:/backups
    environment:
      - POSTGRES_EXTRA_OPTS=-Z 6 -F c
      - POSTGRES_DB=${FORGEJO__database__NAME}
      - POSTGRES_USER=${FORGEJO__database__USER}
      - POSTGRES_PASSWORD=${FORGEJO__database__PASSWD}
      - POSTGRES_HOST=db