Repository navigation
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
108 lines (102 loc) · 3.79 KB
/
Copy pathdocker-compose.yml
File metadata and controls
108 lines (102 loc) · 3.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
services:
# ── 1. PostgreSQL Database (Hosted directly on VPS) ───────────────────────────
db:
image: postgres:16-alpine
container_name: dawaisathi_db
restart: always
environment:
POSTGRES_DB: dawaisathi
POSTGRES_USER: ${POSTGRES_USER:-dawaisathi}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-dawaisathi_db_secure_pass_123}
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-dawaisathi} -d dawaisathi"]
interval: 5s
timeout: 5s
retries: 5
networks:
- dawaisathi-network
# ── 2. Flask Backend API & Background Tasks ──────────────────────────────────
backend:
build:
context: ./backend
dockerfile: Dockerfile
container_name: dawaisathi_backend
restart: always
depends_on:
db:
condition: service_healthy
environment:
DATABASE_URL: postgresql://${POSTGRES_USER:-dawaisathi}:${POSTGRES_PASSWORD:-dawaisathi_db_secure_pass_123}@db:5432/dawaisathi
DB_SSLMODE: disable
SECRET_KEY: ${SECRET_KEY:-vps-secret-key-replace-with-random-entropy}
ADMIN_SECRET_KEY: ${ADMIN_SECRET_KEY:-dawaisathi-vps-super-admin-key}
ADMIN_EMAILS: ${ADMIN_EMAILS:-admin@georbit.org}
FRONTEND_URL: ${FRONTEND_URL:-https://dawaisathi.georbit.org}
CORS_ORIGINS: "https://dawaisathi.georbit.org,http://dawaisathi.georbit.org"
GOOGLE_CLIENT_ID: ${GOOGLE_CLIENT_ID}
GOOGLE_CLIENT_SECRET: ${GOOGLE_CLIENT_SECRET}
GOOGLE_REDIRECT_URI: ${GOOGLE_REDIRECT_URI:-https://dawaisathi.georbit.org/api/auth/callback}
GEMINI_API_KEY: ${GEMINI_API_KEY}
OPENROUTER_API_KEY: ${OPENROUTER_API_KEY}
ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY}
CLOUDINARY_URL: ${CLOUDINARY_URL}
TELEGRAM_BOT_TOKEN: ${TELEGRAM_BOT_TOKEN}
TELEGRAM_WEBHOOK_URL: ${TELEGRAM_WEBHOOK_URL:-https://dawaisathi.georbit.org}
VAPID_PUBLIC_KEY: ${VAPID_PUBLIC_KEY}
VAPID_PRIVATE_KEY: ${VAPID_PRIVATE_KEY}
VAPID_CLAIMS_EMAIL: ${VAPID_CLAIMS_EMAIL:-admin@dawaisathi.com}
CRON_SECRET: ${CRON_SECRET}
volumes:
- backend_uploads:/app/uploads
networks:
- dawaisathi-network
# ── 3. Frontend Web Application (React PWA) ───────────────────────────────────
frontend:
build:
context: ./frontend
dockerfile: Dockerfile
args:
VITE_API_URL: ""
container_name: dawaisathi_frontend
restart: always
networks:
- dawaisathi-network
# ── 4. Nginx Reverse Proxy (SSL, Routing, Caching) ───────────────────────────
nginx:
image: nginx:alpine
container_name: dawaisathi_nginx
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d:ro
- ./certbot/conf:/etc/letsencrypt:ro
- ./certbot/www:/var/www/certbot:ro
depends_on:
- frontend
- backend
networks:
- dawaisathi-network
# ── 5. Certbot (Automatic Let's Encrypt SSL Renewal) ─────────────────────────
certbot:
image: certbot/certbot:latest
container_name: dawaisathi_certbot
restart: always
volumes:
- ./certbot/conf:/etc/letsencrypt
- ./certbot/www:/var/www/certbot
entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"
networks:
- dawaisathi-network
volumes:
pgdata:
name: dawaisathi_postgres_data
backend_uploads:
name: dawaisathi_uploads_data
networks:
dawaisathi-network:
name: dawaisathi_net
driver: bridge