services: db: image: postgres:18-bookworm environment: TZ: Europe/Rome PGTZ: Europe/Rome POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} restart: unless-stopped networks: - dokploy-network expose: - 5432 volumes: - dbdata_v18:/var/lib/postgresql healthcheck: test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"] interval: 1s timeout: 5s retries: 10 migrate: image: migrate/migrate:latest depends_on: db: condition: service_healthy environment: - RECREATION_TOKEN=${RANDOM:-1} volumes: - ./apps/db/migrations:/migrations:ro networks: - dokploy-network command: [ "-verbose", "-path", "/migrations", "-database", "postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:${PGPORT}/${POSTGRES_DB}?sslmode=disable", "up" ] restart: "no" db-backup: build: ./apps/db-backup/ restart: always pull_policy: build depends_on: db: condition: service_healthy environment: POSTGRES_HOST: db POSTGRES_PORT: ${PGPORT} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} BACKUP_DIR: /backups BACKUP_KEEP_COUNT: ${BACKUP_KEEP_COUNT} BACKUP_SCHEDULE: ${BACKUP_SCHEDULE} AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} S3_BUCKET: ${S3_BUCKET} S3_ENDPOINT: ${S3_ENDPOINT} volumes: - ./backups:/backups networks: - dokploy-network backend: image: "${IMAGE_REGISTRY:-ghcr.io}/${OWNER:-marcopedone}/${PREFIX:-infoalloggi}-backend:${TAG:-latest}" networks: - dokploy-network expose: - 1323 restart: unless-stopped pull_policy: "always" environment: POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} PGHOST: db PGPORT: "5432" IMAGEOPTION: "true" CONCURRENT_IMAGES: ${CONCURRENT_IMAGES} healthcheck: test: ["CMD", "curl", "-f", "http://localhost:1323"] interval: 10s timeout: 5s retries: 5 depends_on: db: condition: service_healthy web: image: "${IMAGE_REGISTRY:-ghcr.io}/${OWNER:-marcopedone}/${PREFIX:-infoalloggi}-web:${TAG:-latest}" working_dir: /app restart: unless-stopped pull_policy: "always" environment: INTERNAL_BASE_URL: http://web:3000 POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} PGHOST: db PGPORT: "5432" BACKENDSERVER_URL: http://backend:1323 BASE_URL: ${BASE_URL} NEXT_PUBLIC_BASE_URL: ${BASE_URL} STRIPE_SECRET_KEY: ${STRIPE_SECRET_KEY} NEXT_PUBLIC_STRIPE_PUBLIC_KEY: ${NEXT_PUBLIC_STRIPE_PUBLIC_KEY} STRIPE_WEBHOOK_SECRET: ${STRIPE_WEBHOOK_SECRET} FIC_CLIENT_ID: ${FIC_CLIENT_ID} FIC_ACCESS_TOKEN: ${FIC_ACCESS_TOKEN} FIC_COMPANY_ID: ${FIC_COMPANY_ID} ARUBA_USER: ${ARUBA_USER} ARUBA_PASS: ${ARUBA_PASS} EXP_API_USER: ${EXP_API_USER} EXP_API_PASS: ${EXP_API_PASS} JWT_SECRET: ${JWT_SECRET} SKEBBY_USER: ${SKEBBY_USER} SKEBBY_PASS: ${SKEBBY_PASS} networks: - dokploy-network expose: - 3000 labels: - "traefik.enable=true" # HTTP ROUTER - "traefik.http.routers.info-http.rule=Host(`${DOMAIN}`) || Host(`www.${DOMAIN}`)" - "traefik.http.routers.info-http.entrypoints=web" - "traefik.http.routers.info-http.service=info-http" - "traefik.http.routers.info-http.middlewares=redirect-to-https@file" - "traefik.http.services.info-http.loadbalancer.server.port=3000" # HTTPS FOR WWW - "traefik.http.routers.info-www.rule=Host(`www.${DOMAIN}`)" - "traefik.http.routers.info-www.entrypoints=websecure" - "traefik.http.routers.info-www.service=info" - "traefik.http.routers.info-www.tls.certresolver=letsencrypt" - "traefik.http.routers.info-www.middlewares=info-redirect-apex" # APEX REDIRECT - "traefik.http.middlewares.info-redirect-apex.redirectregex.regex=^https?://www\\.(.*)" - "traefik.http.middlewares.info-redirect-apex.redirectregex.replacement=https://$$1" - "traefik.http.middlewares.info-redirect-apex.redirectregex.permanent=true" # CANONICAL DOMAIN - "traefik.http.routers.info.rule=Host(`${DOMAIN}`)" - "traefik.http.routers.info.entrypoints=websecure" - "traefik.http.routers.info.service=info" - "traefik.http.routers.info.tls.certresolver=letsencrypt" - "traefik.http.services.info.loadbalancer.server.port=3000" # MAINTENANCE MIDDLEWARE - "traefik.http.routers.info.middlewares=catch-maintenance@docker" depends_on: backend: condition: service_healthy db: condition: service_healthy maintenance-page: image: nginx:alpine restart: always networks: - dokploy-network volumes: - ./manutenzione.sh:/manutenzione.sh:ro entrypoint: ["/bin/sh", "/manutenzione.sh"] labels: - "traefik.enable=true" - "traefik.http.routers.maint.rule=Host(`${DOMAIN}`)" - "traefik.http.routers.maint.priority=1" - "traefik.http.routers.maint.entrypoints=websecure" - "traefik.http.services.maintenance-page.loadbalancer.server.port=80" - "traefik.http.middlewares.catch-maintenance.errors.status=500-599" - "traefik.http.middlewares.catch-maintenance.errors.service=maintenance-page" - "traefik.http.middlewares.catch-maintenance.errors.query=/" networks: dokploy-network: external: true volumes: dbdata_v18: