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 CONSTELLATION_URL: ${CONSTELLATION_URL:-}
62 SLINGSHOT_URL: ${SLINGSHOT_URL:-}
63 JETSTREAM_URL: ${JETSTREAM_URL:-}
64
65 FRONTEND_LOGO: ${FRONTEND_LOGO:-}
66 FRONTEND_API_URL: ${FRONTEND_API_URL:-}
67 FRONTEND_MEDIA_URL: ${FRONTEND_MEDIA_URL:-}
68 FRONTEND_CACHE_URL: ${FRONTEND_CACHE_URL:-}
69 FRONTEND_CACHE_BACKUP_URLS: ${FRONTEND_CACHE_BACKUP_URLS:-}
70 FRONTEND_SHORTEN_POSTS: ${FRONTEND_SHORTEN_POSTS:-}
71 FRONTEND_DISABLE_PWA: ${FRONTEND_DISABLE_PWA:-}
72 FRONTEND_MAINTENANCE: ${FRONTEND_MAINTENANCE:-}
73 FRONTEND_SHORT_TITLE: ${FRONTEND_SHORT_TITLE:-}
74 FRONTEND_LONG_TITLE: ${FRONTEND_LONG_TITLE:-}
75 FRONTEND_DESCRIPTION: ${FRONTEND_DESCRIPTION:-}
76
77 REGISTRATION_LEVEL: ${REGISTRATION_LEVEL:-}
78 REGISTRATION_MINIMUM_AGE: ${REGISTRATION_MINIMUM_AGE:-}
79 REGISTRATIONS_DISABLED_TEXT: ${REGISTRATIONS_DISABLED_TEXT:-}
80 BUBBLE_SERVERS_SHOW_TYPE: ${BUBBLE_SERVERS_SHOW_TYPE:-}
81 BLOCKED_SERVERS_SHOW_TYPE: ${BLOCKED_SERVERS_SHOW_TYPE:-}
82 AUTOFOLLOW_MAIN_ADMIN: ${AUTOFOLLOW_MAIN_ADMIN:-}
83 PDS_PLC_ROTATION_KEY_K256_PRIVATE_KEY_HEX: ${PDS_PLC_ROTATION_KEY_K256_PRIVATE_KEY_HEX:-}
84
85 FRONTEND_FQDN_URL: https://${DOMAIN_NAME}
86
87 ENABLE_RAW_OUTPUT: ${ENABLE_RAW_OUTPUT:-}
88 deploy:
89 mode: replicated
90 replicas: 3
91 volumes:
92 - ./packages/backend/uploads:/app/packages/backend/uploads
93 - ./packages/backend/cache:/app/packages/backend/cache
94 - frontend:/app/packages/frontend:ro
95
96 migration:
97 <<: *default_backend
98 depends_on:
99 db:
100 condition: service_started
101 redis:
102 condition: service_started
103 frontend:
104 condition: service_started
105 restart: no
106 deploy:
107 mode: replicated
108 replicas: 1
109 command: "npm exec tsx migrate.ts init-container"
110
111 frontend:
112 restart: unless-stopped
113 build:
114 context: .
115 dockerfile: packages/frontend/Dockerfile
116 ports:
117 - 80:80
118 - 443:443
119 extra_hosts:
120 - "host.docker.internal:host-gateway"
121 environment:
122 DOMAIN_NAME: ${DOMAIN_NAME}
123 PDS_DOMAIN_NAME: ${PDS_DOMAIN_NAME}
124 CACHE_DOMAIN: ${CACHE_DOMAIN}
125 MEDIA_DOMAIN: ${MEDIA_DOMAIN}
126
127 DONATION_URL: ${DONATION_URL}
128 ACME_EMAIL: ${ACME_EMAIL}
129 FRONTEND_SHORT_TITLE: ${FRONTEND_SHORT_TITLE:-}
130 FRONTEND_LONG_TITLE: ${FRONTEND_LONG_TITLE:-}
131 FRONTEND_DESCRIPTION: ${FRONTEND_DESCRIPTION:-}
132 REGISTRATION_LEVEL: ${REGISTRATION_LEVEL:-}
133 REGISTRATIONS_DISABLED_TEXT: ${REGISTRATIONS_DISABLED_TEXT:-}
134 BUBBLE_SERVERS_SHOW_TYPE: ${BUBBLE_SERVERS_SHOW_TYPE:-}
135 BLOCKED_SERVERS_SHOW_TYPE: ${BLOCKED_SERVERS_SHOW_TYPE:-}
136 AUTOFOLLOW_MAIN_ADMIN: ${AUTOFOLLOW_MAIN_ADMIN:-}
137 PDS_PLC_ROTATION_KEY_K256_PRIVATE_KEY_HEX: ${PDS_PLC_ROTATION_KEY_K256_PRIVATE_KEY_HEX:-}
138 REGISTRATION_MINIMUM_AGE: ${REGISTRATION_MINIMUM_AGE:-}
139 CACHE_HOST: "cache:9000"
140 BACKEND_HOST: "wafrn-backend-1:9000 wafrn-backend-2:9000 wafrn-backend-3:9000"
141 WEBSOCKET_HOST: "wafrn-websocket-1:9000"
142
143 volumes:
144 - "caddy:/data"
145 - "frontend:/var/www/html/frontend"
146 - ./packages/backend/uploads:/var/www/html/uploads
147 - ./packages/caddy:/etc/caddy/config
148
149 db:
150 build:
151 context: monitoring/database
152 dockerfile: Dockerfile
153 restart: unless-stopped
154 shm_size: '2gb'
155 environment:
156 POSTGRES_USER: ${POSTGRES_USER}
157 POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
158 POSTGRES_DB: ${POSTGRES_DBNAME}
159 POSTGRES_METRICS_USER: ${POSTGRES_METRICS_USER}
160 POSTGRES_METRICS_PASSWORD: ${POSTGRES_METRICS_PASSWORD}
161 POSTGRES_METRICS_DBNAME: ${POSTGRES_METRICS_DBNAME}
162 volumes:
163 - dbpg:/var/lib/postgresql/data
164
165 adminer:
166 image: adminer
167 restart: unless-stopped
168
169 redis:
170 image: redis:8.4
171 restart: unless-stopped
172 volumes:
173 - redis:/data
174
175 pds:
176 image: ghcr.io/bluesky-social/pds:0.4
177 restart: unless-stopped
178 profiles:
179 - bluesky
180 environment:
181 PDS_HOSTNAME: ${PDS_DOMAIN_NAME}
182 PDS_JWT_SECRET: ${PDS_JWT_SECRET}
183 PDS_ADMIN_PASSWORD: ${PDS_ADMIN_PASSWORD}
184 PDS_PLC_ROTATION_KEY_K256_PRIVATE_KEY_HEX: ${PDS_PLC_ROTATION_KEY_K256_PRIVATE_KEY_HEX}
185 PDS_DATA_DIRECTORY: /pds
186 PDS_BLOBSTORE_DISK_LOCATION: /pds/blocks
187 PDS_BLOB_UPLOAD_LIMIT: 157286400
188 PDS_DID_PLC_URL: "https://plc.directory"
189 #PDS_BSKY_APP_VIEW_URL: "https://api.blacksky.community"
190 #PDS_BSKY_APP_VIEW_DID: "did:web:api.blacksky.community"
191 PDS_BSKY_APP_VIEW_URL: ${PDS_APPVIEW_URL:-https://api.bsky.app}
192 PDS_BSKY_APP_VIEW_DID: ${PDS_APPVIEW_DID:-did:web:api.bsky.app}
193 PDS_REPORT_SERVICE_URL: ${PDS_MOD_URL:-https://mod.bsky.app}
194 PDS_REPORT_SERVICE_DID: ${PDS_MOD_DID:-did:plc:ar7c4by46qjdydhdevvrndac}
195 PDS_CRAWLERS: ${PDS_CRAWLERS:-https://bsky.network, https://atproto.africa}
196 PDS_SERVICE_HANDLE_DOMAINS: ${PDS_HANDLE_DOMAINS:-.${PDS_DOMAIN_NAME}}
197 PDS_EMAIL_SMTP_URL: "smtps://${SMTP_USER}:${SMTP_PASSWORD}@${SMTP_HOST}:${SMTP_PORT}"
198 PDS_EMAIL_FROM_ADDRESS: "${SMTP_FROM}"
199 LOG_ENABLED: true
200 volumes:
201 - pds:/pds
202
203 pds_worker:
204 <<: *default_backend
205 deploy:
206 mode: replicated
207 replicas: 1
208 profiles:
209 - bluesky
210 command: "npm exec tsx atproto.ts"
211
212 cache:
213 <<: *default_backend
214 deploy:
215 mode: replicated
216 replicas: 1
217 websocket:
218 <<: *default_backend
219 deploy:
220 mode: replicated
221 replicas: 1
222 command: "npm exec tsx websocket.ts"
223
224 workers:
225 <<: *default_backend
226 build:
227 <<: *default_backend_build
228 environment:
229 <<: *default_backend_env_vars
230 USE_WORKERS: true
231 deploy:
232 mode: replicated
233 replicas: 3
234
235 prometheus:
236 restart: unless-stopped
237 image: prom/prometheus:latest
238 volumes:
239 - ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml
240 - prometheus_data:/prometheus
241 command:
242 - '--config.file=/etc/prometheus/prometheus.yml'
243 - '--storage.tsdb.path=/prometheus'
244 - '--web.console.libraries=/usr/share/prometheus/console_libraries'
245 - '--web.console.templates=/usr/share/prometheus/consoles'
246
247 cadvisor:
248 restart: unless-stopped
249 image: gcr.io/cadvisor/cadvisor:latest
250 command:
251 - '-port=8081'
252 environment:
253 CADVISOR_HEALTHCHECK_URL: http://localhost:8081/healthz
254 volumes:
255 - /:/rootfs:ro
256 - /var/run:/var/run:rw
257 - /sys:/sys:ro
258 - /var/lib/docker/:/var/lib/docker:ro
259
260 node-exporter:
261 restart: unless-stopped
262 image: prom/node-exporter:latest
263 volumes:
264 - /proc:/host/proc:ro
265 - /sys:/host/sys:ro
266 - /:/rootfs:ro
267 command:
268 - '--path.procfs=/host/proc'
269 - '--path.sysfs=/host/sys'
270 - '--collector.filesystem.ignored-mount-points="^/(sys|proc|dev|host|etc)($$|/)"'
271
272 grafana:
273 build:
274 context: monitoring/grafana
275 dockerfile: Dockerfile
276 volumes:
277 - grafana_data:/var/lib/grafana
278 restart: unless-stopped
279 environment:
280 GF_SERVER_HTTP_PORT: 2345
281 GF_SECURITY_ADMIN_PASSWORD: ${GF_SECURITY_ADMIN_PASSWORD}
282 GF_USERS_ALLOW_SIGN_UP: false
283
284 GF_SMTP_ENABLED: true
285 GF_SMTP_HOST: ${SMTP_HOST}:${SMTP_PORT}
286 GF_SMTP_FROM_ADDRESS: ${SMTP_FROM}
287 GF_SERVER_DOMAIN: ${DOMAIN_NAME}
288 GF_SMTP_FROM_NAME: ${SMTP_FROM}
289 GF_SMTP_USER: "${SMTP_USER}"
290 GF_SMTP_PASSWORD: "${SMTP_PASSWORD}"
291
292 POSTGRES_METRICS_USER: ${POSTGRES_METRICS_USER}
293 POSTGRES_METRICS_PASSWORD: ${POSTGRES_METRICS_PASSWORD}
294 POSTGRES_METRICS_DBNAME: ${POSTGRES_METRICS_DBNAME}
295
296 pgwatch:
297 build:
298 context: monitoring/pgwatch
299 dockerfile: Dockerfile
300 args:
301 POSTGRES_USER: ${POSTGRES_USER}
302 POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
303 POSTGRES_DB: ${POSTGRES_DBNAME}
304 restart: unless-stopped
305 environment:
306 POSTGRES_METRICS_USER: ${POSTGRES_METRICS_USER}
307 POSTGRES_METRICS_PASSWORD: ${POSTGRES_METRICS_PASSWORD}
308 POSTGRES_METRICS_DBNAME: ${POSTGRES_METRICS_DBNAME}
309 command:
310 - "--web-disable=all"
311 - "--sources=/sources.yaml"
312 - "--sink=postgresql://${POSTGRES_METRICS_USER}:${POSTGRES_METRICS_PASSWORD}@db:5432/${POSTGRES_METRICS_DBNAME}"
313 depends_on:
314 db:
315 condition: service_started
316
317volumes:
318 dbpg:
319 caddy:
320 pds:
321 frontend:
322 redis:
323 prometheus_data:
324 grafana_data:
325
326
327networks:
328 default:
329 enable_ipv6: true