services: # PostgreSQL Database postgres: image: postgres:16-alpine container_name: postgres restart: unless-stopped networks: - app-internal environment: - TZ=Europe/Berlin - POSTGRES_DB=${POSTGRES_DB:-michaelschiemer} - POSTGRES_USER=${POSTGRES_USER:-postgres} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - PGDATA=/var/lib/postgresql/data/pgdata volumes: - postgres-data:/var/lib/postgresql/data - ./conf.d:/etc/postgresql/conf.d:ro - ./backups:/backups - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro command: > postgres -c config_file=/etc/postgresql/conf.d/postgresql.conf healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-michaelschiemer}"] interval: 30s timeout: 10s retries: 3 start_period: 40s shm_size: 256mb deploy: resources: limits: memory: 2G reservations: memory: 512M # Automated Backup Service postgres-backup: image: postgres:16-alpine container_name: postgres-backup restart: unless-stopped networks: - app-internal environment: - TZ=Europe/Berlin - POSTGRES_HOST=postgres - POSTGRES_DB=${POSTGRES_DB:-michaelschiemer} - POSTGRES_USER=${POSTGRES_USER:-postgres} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - BACKUP_RETENTION_DAYS=${BACKUP_RETENTION_DAYS:-7} - BACKUP_SCHEDULE=${BACKUP_SCHEDULE:-0 2 * * *} volumes: - ./backups:/backups - ./scripts:/scripts:ro - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro entrypoint: ["/scripts/backup-entrypoint.sh"] depends_on: postgres: condition: service_healthy volumes: postgres-data: name: postgres-data networks: app-internal: external: true