157 lines
5.0 KiB
YAML
157 lines
5.0 KiB
YAML
name: rf4-spotter
|
|
|
|
services:
|
|
proxy:
|
|
image: caddy:2.10.2-alpine
|
|
restart: unless-stopped
|
|
environment:
|
|
SITE_DOMAIN: ${SITE_DOMAIN:?Set SITE_DOMAIN}
|
|
FILES_DOMAIN: ${FILES_DOMAIN:?Set FILES_DOMAIN}
|
|
ACME_EMAIL: ${ACME_EMAIL:?Set ACME_EMAIL}
|
|
ADMIN_BASIC_USER: ${ADMIN_BASIC_USER:?Set ADMIN_BASIC_USER}
|
|
ADMIN_BASIC_PASSWORD_HASH: ${ADMIN_BASIC_PASSWORD_HASH:?Set ADMIN_BASIC_PASSWORD_HASH}
|
|
ports:
|
|
- "80:80"
|
|
- "443:443"
|
|
- "443:443/udp"
|
|
volumes:
|
|
- ./deploy/Caddyfile:/etc/caddy/Caddyfile:ro
|
|
- caddy_data:/data
|
|
- caddy_config:/config
|
|
depends_on:
|
|
web:
|
|
condition: service_healthy
|
|
networks: [edge, backend]
|
|
security_opt: [no-new-privileges:true]
|
|
deploy:
|
|
resources:
|
|
limits: {cpus: "0.50", memory: 256M}
|
|
|
|
db:
|
|
image: postgres:17-alpine
|
|
restart: unless-stopped
|
|
environment:
|
|
POSTGRES_DB: ${POSTGRES_DB:-rf4_spotter}
|
|
POSTGRES_USER: ${POSTGRES_USER:-rf4}
|
|
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD}
|
|
volumes:
|
|
- postgres_data:/var/lib/postgresql/data
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-rf4} -d ${POSTGRES_DB:-rf4_spotter}"]
|
|
interval: 10s
|
|
timeout: 5s
|
|
retries: 10
|
|
networks: [backend]
|
|
security_opt: [no-new-privileges:true]
|
|
deploy:
|
|
resources:
|
|
limits: {cpus: "1.00", memory: 1G}
|
|
|
|
minio:
|
|
image: minio/minio:RELEASE.2025-07-23T15-54-02Z
|
|
command: server /data
|
|
restart: unless-stopped
|
|
environment:
|
|
MINIO_ROOT_USER: ${S3_ACCESS_KEY:?Set S3_ACCESS_KEY}
|
|
MINIO_ROOT_PASSWORD: ${S3_SECRET_KEY:?Set S3_SECRET_KEY}
|
|
volumes:
|
|
- minio_data:/data
|
|
healthcheck:
|
|
test: ["CMD", "curl", "-fsS", "http://localhost:9000/minio/health/live"]
|
|
interval: 10s
|
|
timeout: 5s
|
|
retries: 10
|
|
networks: [backend]
|
|
security_opt: [no-new-privileges:true]
|
|
deploy:
|
|
resources:
|
|
limits: {cpus: "0.75", memory: 1G}
|
|
|
|
api:
|
|
build:
|
|
context: .
|
|
dockerfile: apps/api/Dockerfile
|
|
restart: unless-stopped
|
|
environment:
|
|
DEPLOYMENT_ENVIRONMENT: production
|
|
DATABASE_URL: ${DATABASE_URL:?Set DATABASE_URL}
|
|
ADMIN_TOKEN: ${ADMIN_TOKEN:?Set ADMIN_TOKEN}
|
|
CORS_ORIGINS: '["https://${SITE_DOMAIN:?Set SITE_DOMAIN}"]'
|
|
S3_ENDPOINT_URL: http://minio:9000
|
|
S3_PUBLIC_ENDPOINT_URL: https://${FILES_DOMAIN:?Set FILES_DOMAIN}
|
|
S3_ACCESS_KEY: ${S3_ACCESS_KEY:?Set S3_ACCESS_KEY}
|
|
S3_SECRET_KEY: ${S3_SECRET_KEY:?Set S3_SECRET_KEY}
|
|
S3_BUCKET: ${S3_BUCKET:-catch-screenshots}
|
|
OFFICIAL_RECORDS_URL: ${OFFICIAL_RECORDS_URL:-https://rf4game.de/records/region/RU/}
|
|
OFFICIAL_RECORDS_REGION: ${OFFICIAL_RECORDS_REGION:-RU}
|
|
OFFICIAL_RECORDS_CATEGORY: ${OFFICIAL_RECORDS_CATEGORY:-records}
|
|
OFFICIAL_IMPORT_REQUIRED: ${OFFICIAL_IMPORT_REQUIRED:-false}
|
|
SEED_DEMO_DATA: "false"
|
|
IMPORT_INTERVAL_SECONDS: ${IMPORT_INTERVAL_SECONDS:-3600}
|
|
RATE_LIMIT_SECRET: ${RATE_LIMIT_SECRET:?Set RATE_LIMIT_SECRET}
|
|
RETENTION_SUBMISSION_DAYS: ${RETENTION_SUBMISSION_DAYS:-1}
|
|
RETENTION_UNREVIEWED_DAYS: ${RETENTION_UNREVIEWED_DAYS:-30}
|
|
RETENTION_APPROVED_PERSONAL_DAYS: ${RETENTION_APPROVED_PERSONAL_DAYS:-180}
|
|
RETENTION_STAGING_DAYS: ${RETENTION_STAGING_DAYS:-90}
|
|
RETENTION_AUDIT_DAYS: ${RETENTION_AUDIT_DAYS:-365}
|
|
RETENTION_PUBLISHED_PAYLOAD_DAYS: ${RETENTION_PUBLISHED_PAYLOAD_DAYS:-365}
|
|
LOG_LEVEL: ${LOG_LEVEL:-INFO}
|
|
depends_on:
|
|
db: {condition: service_healthy}
|
|
minio: {condition: service_healthy}
|
|
healthcheck:
|
|
test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/ready')"]
|
|
interval: 10s
|
|
timeout: 5s
|
|
retries: 12
|
|
networks: [backend, edge]
|
|
security_opt: [no-new-privileges:true]
|
|
deploy:
|
|
resources:
|
|
limits: {cpus: "1.00", memory: 1G}
|
|
|
|
web:
|
|
build:
|
|
context: ./apps/web
|
|
args:
|
|
PUBLIC_API_URL: https://${SITE_DOMAIN:?Set SITE_DOMAIN}
|
|
restart: unless-stopped
|
|
environment:
|
|
PUBLIC_API_URL: https://${SITE_DOMAIN:?Set SITE_DOMAIN}
|
|
API_INTERNAL_URL: http://api:8000
|
|
depends_on:
|
|
api: {condition: service_healthy}
|
|
healthcheck:
|
|
test: ["CMD", "node", "-e", "fetch('http://localhost:4321').then(r=>{if(!r.ok)process.exit(1)}).catch(()=>process.exit(1))"]
|
|
interval: 10s
|
|
timeout: 5s
|
|
retries: 10
|
|
networks: [backend]
|
|
security_opt: [no-new-privileges:true]
|
|
deploy:
|
|
resources:
|
|
limits: {cpus: "0.75", memory: 512M}
|
|
|
|
storage-tool:
|
|
image: minio/mc:RELEASE.2025-07-21T05-28-08Z
|
|
profiles: [tools]
|
|
environment:
|
|
S3_ACCESS_KEY: ${S3_ACCESS_KEY:?Set S3_ACCESS_KEY}
|
|
S3_SECRET_KEY: ${S3_SECRET_KEY:?Set S3_SECRET_KEY}
|
|
S3_BUCKET: ${S3_BUCKET:-catch-screenshots}
|
|
volumes:
|
|
- ${BACKUP_DIRECTORY:-./backups}:/backup
|
|
networks: [backend]
|
|
security_opt: [no-new-privileges:true]
|
|
|
|
networks:
|
|
edge:
|
|
backend:
|
|
internal: true
|
|
|
|
volumes:
|
|
postgres_data:
|
|
minio_data:
|
|
caddy_data:
|
|
caddy_config:
|