@@ -3,128 +3,42 @@ services:
33 build :
44 context : .
55 dockerfile : Dockerfile.production
6- container_name : prostaff-api
76 restart : unless-stopped
8- labels :
9- - " traefik.enable=true"
10- - " traefik.http.routers.prostaff-api.rule=Host(`prostaff.gg`) || Host(`api.prostaff.gg`)"
11- - " traefik.http.routers.prostaff-api.entrypoints=https"
12- - " traefik.http.routers.prostaff-api.tls=true"
13- - " traefik.http.routers.prostaff-api.tls.certresolver=letsencrypt"
14- - " traefik.http.services.prostaff-api.loadbalancer.server.port=3000"
15- - " traefik.http.services.prostaff-api.loadbalancer.healthcheck.path=/up"
16- - " traefik.http.services.prostaff-api.loadbalancer.healthcheck.interval=30s"
17- - " traefik.http.services.prostaff-api.loadbalancer.healthcheck.timeout=5s"
18- # Request Timeouts
19- - " traefik.http.services.prostaff-api.loadbalancer.responseforwardingtimeouts.dialtimeout=30s"
20- - " traefik.http.services.prostaff-api.loadbalancer.responseforwardingtimeouts.responseheadertimeout=60s"
21- - " traefik.http.services.prostaff-api.loadbalancer.responseforwardingtimeouts.idletimeout=90s"
22- # Rate Limiting (30 req/s per IP - same as nginx config)
23- - " traefik.http.middlewares.prostaff-ratelimit.ratelimit.average=30"
24- - " traefik.http.middlewares.prostaff-ratelimit.ratelimit.period=1s"
25- - " traefik.http.middlewares.prostaff-ratelimit.ratelimit.burst=50"
26- # Compression (gzip replacement)
27- - " traefik.http.middlewares.prostaff-compress.compress=true"
28- # Security Headers
29- - " traefik.http.middlewares.prostaff-security.headers.stsSeconds=63072000"
30- - " traefik.http.middlewares.prostaff-security.headers.stsIncludeSubdomains=true"
31- - " traefik.http.middlewares.prostaff-security.headers.stsPreload=true"
32- - " traefik.http.middlewares.prostaff-security.headers.forceSTSHeader=true"
33- # Chain all middlewares
34- - " traefik.http.routers.prostaff-api.middlewares=prostaff-ratelimit,prostaff-compress,prostaff-security"
357 environment :
368 RAILS_ENV : production
379 DATABASE_URL : ${DATABASE_URL}
38- REPLICA_DATABASE_URL : postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}
39- REDIS_URL : ${REDIS_URL:-redis://redis:6379/1}
40- ELASTICSEARCH_URL : http://elastic:${ELASTIC_PASSWORD:-ChangeMe123!}@elasticsearch:9200
10+ REDIS_URL : ${REDIS_URL}
11+ ELASTICSEARCH_URL : ${ELASTICSEARCH_URL:-http://elastic:9200}
4112 RAILS_LOG_TO_STDOUT : " true"
4213 PORT : 3000
4314 RAILS_MASTER_KEY : ${RAILS_MASTER_KEY}
4415 RIOT_API_KEY : ${RIOT_API_KEY}
16+ CORS_ORIGINS : ${CORS_ORIGINS:-https://prostaff.gg,https://www.prostaff.gg,https://api.prostaff.gg}
17+ JWT_SECRET_KEY : ${JWT_SECRET_KEY}
18+ SECRET_KEY_BASE : ${SECRET_KEY_BASE}
4519 ports :
4620 - " 3000:3000"
47- networks :
48- - default
49- - traefik
50- depends_on :
51- redis :
52- condition : service_healthy
53- elasticsearch :
54- condition : service_healthy
21+ healthcheck :
22+ test : ["CMD-SHELL", "curl -f http://localhost:3000/up || exit 1"]
23+ interval : 30s
24+ timeout : 5s
25+ retries : 3
26+ start_period : 40s
5527
5628 sidekiq :
5729 build :
5830 context : .
5931 dockerfile : Dockerfile.production
60- container_name : prostaff-sidekiq
6132 command : bundle exec sidekiq -C config/sidekiq.yml
33+ restart : unless-stopped
6234 environment :
6335 RAILS_ENV : production
6436 DATABASE_URL : ${DATABASE_URL}
65- REPLICA_DATABASE_URL : postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}
66- REDIS_URL : ${REDIS_URL:-redis://redis:6379/1}
67- ELASTICSEARCH_URL : http://elastic:${ELASTIC_PASSWORD:-ChangeMe123!}@elasticsearch:9200
37+ REDIS_URL : ${REDIS_URL}
38+ ELASTICSEARCH_URL : ${ELASTICSEARCH_URL:-http://elastic:9200}
6839 RAILS_MASTER_KEY : ${RAILS_MASTER_KEY}
6940 RIOT_API_KEY : ${RIOT_API_KEY}
41+ SECRET_KEY_BASE : ${SECRET_KEY_BASE}
7042 depends_on :
71- - api
72- - redis
73-
74- postgres :
75- image : postgres:15-alpine
76- container_name : prostaff-postgres
77- restart : always
78- environment :
79- POSTGRES_DB : ${POSTGRES_DB:-prostaff_production}
80- POSTGRES_USER : ${POSTGRES_USER:-postgres}
81- POSTGRES_PASSWORD : ${POSTGRES_PASSWORD:-ChangeMe123!}
82- volumes :
83- - prostaff_pg_data:/var/lib/postgresql/data
84- healthcheck :
85- test : ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-postgres}"]
86- interval : 10s
87- timeout : 5s
88- retries : 5
89-
90- redis :
91- image : redis:7-alpine
92- container_name : prostaff-redis
93- restart : always
94- volumes :
95- - prostaff_redis_data:/data
96- healthcheck :
97- test : ["CMD", "redis-cli", "ping"]
98- interval : 10s
99- timeout : 5s
100- retries : 5
101-
102- elasticsearch :
103- image : docker.elastic.co/elasticsearch/elasticsearch:8.13.4
104- container_name : prostaff-elasticsearch
105- restart : unless-stopped
106- environment :
107- - discovery.type=single-node
108- - xpack.security.enabled=true
109- - ELASTIC_PASSWORD=${ELASTIC_PASSWORD:-ChangeMe123!}
110- - ES_JAVA_OPTS=-Xms512m -Xmx512m
111- volumes :
112- - prostaff_es_data:/usr/share/elasticsearch/data
113- healthcheck :
114- test : ["CMD-SHELL", "curl -s -u elastic:${ELASTIC_PASSWORD:-ChangeMe123!} http://localhost:9200 >/dev/null || exit 1"]
115- interval : 30s
116- timeout : 10s
117- retries : 5
118-
119- networks :
120- traefik :
121- external : true
122- name : coolify # Coolify's default Traefik network name
123- default :
124- driver : bridge
125-
126- volumes :
127- prostaff_pg_data :
128- prostaff_redis_data :
129- prostaff_es_data :
130-
43+ api :
44+ condition : service_healthy
0 commit comments