unoffical wafrn mirror
wafrn.net
atproto
social-network
activitypub
1services:
2 backend: &default_backend
3 build: &default_backend_build
4 context: .
5 dockerfile: packages/backend/Dockerfile
6 # these args configure private env vars for the backend and public env vars for the frontend
7 depends_on:
8 db:
9 condition: service_started
10 redis:
11 condition: service_started
12 frontend:
13 condition: service_started
14 migration:
15 condition: service_completed_successfully
16 restart: unless-stopped
17 environment: &default_backend_env_vars
18 NODE_ENV: production
19 ADMIN_USER: ${ADMIN_USER}
20 ADMIN_EMAIL: ${ADMIN_EMAIL}
21 ADMIN_PASSWORD: ${ADMIN_PASSWORD}
22 JWT_SECRET: ${JWT_SECRET}
23 DOMAIN_NAME: ${DOMAIN_NAME}
24
25 CACHE_DOMAIN: ${CACHE_DOMAIN}
26 MEDIA_DOMAIN: ${MEDIA_DOMAIN}
27
28 DONATION_URL: ${DONATION_URL}
29
30 SMTP_HOST: ${SMTP_HOST}
31 SMTP_USER: ${SMTP_USER}
32 SMTP_PORT: ${SMTP_PORT}
33 SMTP_PASSWORD: ${SMTP_PASSWORD}
34 SMTP_FROM: ${SMTP_FROM}
35
36 POSTGRES_USER: ${POSTGRES_USER}
37 POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
38 POSTGRES_DBNAME: ${POSTGRES_DBNAME}
39
40 WEBPUSH_EMAIL: ${WEBPUSH_EMAIL}
41 WEBPUSH_PRIVATE: ${WEBPUSH_PRIVATE}
42 WEBPUSH_PUBLIC: ${WEBPUSH_PUBLIC}
43
44 ENABLE_BSKY: ${ENABLE_BSKY}
45 PDS_DOMAIN_NAME: ${PDS_DOMAIN_NAME}
46 PDS_JWT_SECRET: ${PDS_JWT_SECRET}
47 PDS_ADMIN_PASSWORD: ${PDS_ADMIN_PASSWORD}
48
49 USE_WORKERS: false
50 LOG_SQL_QUERIES: ${LOG_SQL_QUERIES:-}
51 UPLOAD_LIMIT: ${UPLOAD_LIMIT:-}
52 POSTS_PER_PAGE: ${POSTS_PER_PAGE:-}
53 LOG_LEVEL: ${LOG_LEVEL:-}
54 BLOCKLIST_URI: ${BLOCKLIST_URI:-}
55 FRONTEND_PATH: ${FRONTEND_PATH:-}
56 DISABLE_REQUIRE_SEND_EMAIL: ${DISABLE_REQUIRE_SEND_EMAIL:-}
57 BLOCKED_IPS: ${BLOCKED_IPS:-}
58 REVIEW_REGISTRATIONS: ${REVIEW_REGISTRATIONS:-}
59 IGNORE_BLOCK_HOSTS: ${IGNORE_BLOCK_HOSTS:-}
60
61 FRONTEND_LOGO: ${FRONTEND_LOGO:-}
62 FRONTEND_API_URL: ${FRONTEND_API_URL:-}
63 FRONTEND_MEDIA_URL: ${FRONTEND_MEDIA_URL:-}
64 FRONTEND_CACHE_URL: ${FRONTEND_CACHE_URL:-}
65 FRONTEND_CACHE_BACKUP_URLS: ${FRONTEND_CACHE_BACKUP_URLS:-}
66 FRONTEND_SHORTEN_POSTS: ${FRONTEND_SHORTEN_POSTS:-}
67 FRONTEND_DISABLE_PWA: ${FRONTEND_DISABLE_PWA:-}
68 FRONTEND_MAINTENANCE: ${FRONTEND_MAINTENANCE:-}
69 FRONTEND_SHORT_TITLE: ${FRONTEND_SHORT_TITLE:-}
70 FRONTEND_LONG_TITLE: ${FRONTEND_LONG_TITLE:-}
71 FRONTEND_DESCRIPTION: ${FRONTEND_DESCRIPTION:-}
72
73 REGISTRATION_LEVEL: ${REGISTRATION_LEVEL:-}
74 REGISTRATION_MINIMUM_AGE: ${REGISTRATION_MINIMUM_AGE:-}
75 REGISTRATIONS_DISABLED_TEXT: ${REGISTRATIONS_DISABLED_TEXT:-}
76 HIDE_BLOCKED_SERVERS: ${HIDE_BLOCKED_SERVERS:-}
77 AUTOFOLLOW_MAIN_ADMIN: ${AUTOFOLLOW_MAIN_ADMIN:-}
78
79 FRONTEND_FQDN_URL: https://${DOMAIN_NAME}
80
81 ENABLE_RAW_OUTPUT: ${ENABLE_RAW_OUTPUT:-}
82 deploy:
83 mode: replicated
84 replicas: 3
85 volumes:
86 - ./packages/backend/uploads:/app/packages/backend/uploads
87 - ./packages/backend/cache:/app/packages/backend/cache
88 - frontend:/app/packages/frontend:ro
89
90 migration:
91 <<: *default_backend
92 depends_on:
93 db:
94 condition: service_started
95 redis:
96 condition: service_started
97 frontend:
98 condition: service_started
99 restart: no
100 deploy:
101 mode: replicated
102 replicas: 1
103 command: "npm exec tsx migrate.ts init-container"
104
105 frontend:
106 restart: unless-stopped
107 build:
108 context: .
109 dockerfile: packages/frontend/Dockerfile
110 ports:
111 - 80:80
112 - 443:443
113 environment:
114 DOMAIN_NAME: ${DOMAIN_NAME}
115 PDS_DOMAIN_NAME: ${PDS_DOMAIN_NAME}
116 CACHE_DOMAIN: ${CACHE_DOMAIN}
117 MEDIA_DOMAIN: ${MEDIA_DOMAIN}
118
119 DONATION_URL: ${DONATION_URL}
120 ACME_EMAIL: ${ACME_EMAIL}
121 FRONTEND_SHORT_TITLE: ${FRONTEND_SHORT_TITLE:-}
122 FRONTEND_LONG_TITLE: ${FRONTEND_LONG_TITLE:-}
123 FRONTEND_DESCRIPTION: ${FRONTEND_DESCRIPTION:-}
124 REGISTRATION_LEVEL: ${REGISTRATION_LEVEL:-}
125 REGISTRATIONS_DISABLED_TEXT: ${REGISTRATIONS_DISABLED_TEXT:-}
126 HIDE_BLOCKED_SERVERS: ${HIDE_BLOCKED_SERVERS:-}
127 AUTOFOLLOW_MAIN_ADMIN: ${AUTOFOLLOW_MAIN_ADMIN:-}
128 REGISTRATION_MINIMUM_AGE: ${REGISTRATION_MINIMUM_AGE:-}
129 CACHE_HOST: "cache:9000"
130 BACKEND_HOST: "wafrn-backend-1:9000 wafrn-backend-2:9000 wafrn-backend-3:9000"
131 WEBSOCKET_HOST: "wafrn-websocket-1:9000"
132
133 volumes:
134 - "caddy:/data"
135 - "frontend:/var/www/html/frontend"
136 - ./packages/backend/uploads:/var/www/html/uploads
137 - ./packages/caddy:/etc/caddy/config
138
139 db:
140 build:
141 context: monitoring/database
142 dockerfile: Dockerfile
143 restart: unless-stopped
144 shm_size: '2gb'
145 environment:
146 POSTGRES_USER: ${POSTGRES_USER}
147 POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
148 POSTGRES_DB: ${POSTGRES_DBNAME}
149 POSTGRES_METRICS_USER: ${POSTGRES_METRICS_USER}
150 POSTGRES_METRICS_PASSWORD: ${POSTGRES_METRICS_PASSWORD}
151 POSTGRES_METRICS_DBNAME: ${POSTGRES_METRICS_DBNAME}
152 volumes:
153 - dbpg:/var/lib/postgresql/data
154
155 adminer:
156 image: adminer
157 restart: unless-stopped
158
159 redis:
160 image: redis:7.2.4
161 restart: unless-stopped
162 volumes:
163 - redis:/data
164
165 pds:
166 image: ghcr.io/bluesky-social/pds:0.4
167 restart: unless-stopped
168 profiles:
169 - bluesky
170 environment:
171 PDS_HOSTNAME: ${PDS_DOMAIN_NAME}
172 PDS_JWT_SECRET: ${PDS_JWT_SECRET}
173 PDS_ADMIN_PASSWORD: ${PDS_ADMIN_PASSWORD}
174 PDS_PLC_ROTATION_KEY_K256_PRIVATE_KEY_HEX: ${PDS_PLC_ROTATION_KEY_K256_PRIVATE_KEY_HEX}
175 PDS_DATA_DIRECTORY: /pds
176 PDS_BLOBSTORE_DISK_LOCATION: /pds/blocks
177 PDS_BLOB_UPLOAD_LIMIT: 157286400
178 PDS_DID_PLC_URL: "https://plc.directory"
179 PDS_BSKY_APP_VIEW_URL: "https://api.bsky.app"
180 PDS_BSKY_APP_VIEW_DID: "did:web:api.bsky.app"
181 PDS_REPORT_SERVICE_URL: "https://mod.bsky.app"
182 PDS_REPORT_SERVICE_DID: "did:plc:ar7c4by46qjdydhdevvrndac"
183 PDS_CRAWLERS: "https://bsky.network, https://atproto.africa"
184 PDS_EMAIL_SMTP_URL: "smtps://${SMTP_USER}:${SMTP_PASSWORD}@${SMTP_HOST}:${SMTP_PORT}"
185 PDS_EMAIL_FROM_ADDRESS: "${SMTP_FROM}"
186 LOG_ENABLED: true
187 volumes:
188 - pds:/pds
189
190 pds_worker:
191 <<: *default_backend
192 deploy:
193 mode: replicated
194 replicas: 1
195 profiles:
196 - bluesky
197 command: "npm exec tsx atproto.ts"
198
199 cache:
200 <<: *default_backend
201 deploy:
202 mode: replicated
203 replicas: 1
204 websocket:
205 <<: *default_backend
206 deploy:
207 mode: replicated
208 replicas: 1
209 command: "npm exec tsx websocket.ts"
210
211 workers:
212 <<: *default_backend
213 build:
214 <<: *default_backend_build
215 environment:
216 <<: *default_backend_env_vars
217 USE_WORKERS: true
218 deploy:
219 mode: replicated
220 replicas: 3
221
222 prometheus:
223 restart: unless-stopped
224 image: prom/prometheus:latest
225 volumes:
226 - ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml
227 - prometheus_data:/prometheus
228 command:
229 - '--config.file=/etc/prometheus/prometheus.yml'
230 - '--storage.tsdb.path=/prometheus'
231 - '--web.console.libraries=/usr/share/prometheus/console_libraries'
232 - '--web.console.templates=/usr/share/prometheus/consoles'
233
234 cadvisor:
235 restart: unless-stopped
236 image: gcr.io/cadvisor/cadvisor:latest
237 command:
238 - '-port=8081'
239 environment:
240 CADVISOR_HEALTHCHECK_URL: http://localhost:8081/healthz
241 volumes:
242 - /:/rootfs:ro
243 - /var/run:/var/run:rw
244 - /sys:/sys:ro
245 - /var/lib/docker/:/var/lib/docker:ro
246
247 node-exporter:
248 restart: unless-stopped
249 image: prom/node-exporter:latest
250 volumes:
251 - /proc:/host/proc:ro
252 - /sys:/host/sys:ro
253 - /:/rootfs:ro
254 command:
255 - '--path.procfs=/host/proc'
256 - '--path.sysfs=/host/sys'
257 - '--collector.filesystem.ignored-mount-points="^/(sys|proc|dev|host|etc)($$|/)"'
258
259 grafana:
260 build:
261 context: monitoring/grafana
262 dockerfile: Dockerfile
263 volumes:
264 - grafana_data:/var/lib/grafana
265 restart: unless-stopped
266 environment:
267 GF_SERVER_HTTP_PORT: 2345
268 GF_SECURITY_ADMIN_PASSWORD: ${GF_SECURITY_ADMIN_PASSWORD}
269 GF_USERS_ALLOW_SIGN_UP: false
270
271 GF_SMTP_ENABLED: true
272 GF_SMTP_HOST: ${SMTP_HOST}:${SMTP_PORT}
273 GF_SMTP_FROM_ADDRESS: ${SMTP_FROM}
274 GF_SERVER_DOMAIN: ${DOMAIN_NAME}
275 GF_SMTP_FROM_NAME: ${SMTP_FROM}
276 GF_SMTP_USER: "${SMTP_USER}"
277 GF_SMTP_PASSWORD: "${SMTP_PASSWORD}"
278
279 POSTGRES_METRICS_USER: ${POSTGRES_METRICS_USER}
280 POSTGRES_METRICS_PASSWORD: ${POSTGRES_METRICS_PASSWORD}
281 POSTGRES_METRICS_DBNAME: ${POSTGRES_METRICS_DBNAME}
282
283 pgwatch:
284 build:
285 context: monitoring/pgwatch
286 dockerfile: Dockerfile
287 args:
288 POSTGRES_USER: ${POSTGRES_USER}
289 POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
290 POSTGRES_DB: ${POSTGRES_DBNAME}
291 restart: unless-stopped
292 environment:
293 POSTGRES_METRICS_USER: ${POSTGRES_METRICS_USER}
294 POSTGRES_METRICS_PASSWORD: ${POSTGRES_METRICS_PASSWORD}
295 POSTGRES_METRICS_DBNAME: ${POSTGRES_METRICS_DBNAME}
296 command:
297 - "--web-disable=all"
298 - "--sources=/sources.yaml"
299 - "--sink=postgresql://${POSTGRES_METRICS_USER}:${POSTGRES_METRICS_PASSWORD}@db:5432/${POSTGRES_METRICS_DBNAME}"
300 depends_on:
301 db:
302 condition: service_started
303
304volumes:
305 dbpg:
306 caddy:
307 pds:
308 frontend:
309 redis:
310 prometheus_data:
311 grafana_data:
312
313networks:
314 default:
315 enable_ipv6: true