# Production Docker Compose services: app: image: codeberg.org/lvl0/buckets:latest container_name: buckets_app restart: always ports: - "8100:8000" environment: # Required from user APP_KEY: "${APP_KEY}" # Critical - must persist across deployments APP_URL: "${APP_URL}" DB_DATABASE: "${DB_DATABASE}" DB_USERNAME: "${DB_USERNAME}" DB_PASSWORD: "${DB_PASSWORD}" # Optional email configuration MAIL_HOST: "${MAIL_HOST:-}" MAIL_PORT: "${MAIL_PORT:-587}" MAIL_USERNAME: "${MAIL_USERNAME:-}" MAIL_PASSWORD: "${MAIL_PASSWORD:-}" MAIL_FROM_ADDRESS: "${MAIL_FROM_ADDRESS:-noreply@example.com}" volumes: # Only persist storage in production - app_storage:/app/storage - app_logs:/app/storage/logs depends_on: - db networks: - buckets healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/up"] interval: 30s timeout: 10s retries: 3 start_period: 40s db: image: mariadb:11 container_name: buckets_db restart: always environment: MYSQL_DATABASE: "${DB_DATABASE}" MYSQL_USER: "${DB_USERNAME}" MYSQL_PASSWORD: "${DB_PASSWORD}" MYSQL_ROOT_PASSWORD: "${DB_ROOT_PASSWORD}" volumes: - db_data:/var/lib/mysql networks: - buckets # Optional: Redis for production caching/sessions # redis: # image: redis:7-alpine # container_name: buckets_redis # restart: always # command: redis-server --requirepass ${REDIS_PASSWORD} # volumes: # - redis_data:/data # networks: # - buckets # healthcheck: # test: ["CMD", "redis-cli", "ping"] # interval: 30s # timeout: 10s # retries: 3 # Optional: Backup service # backup: # image: mariadb:11 # container_name: buckets_backup # restart: always # environment: # MYSQL_HOST: db # MYSQL_USER: root # MYSQL_PASSWORD: "${DB_ROOT_PASSWORD}" # volumes: # - ./database/backups:/backups # - ./scripts/backup.sh:/backup.sh:ro # entrypoint: ["/bin/sh"] # command: ["-c", "while true; do /backup.sh; sleep 86400; done"] # depends_on: # - db # networks: # - buckets networks: buckets: driver: bridge volumes: db_data: driver: local app_storage: driver: local app_logs: driver: local # redis_data: # driver: local