Files
falah-mobile/docker-compose.ha.yml
T
FalahMobile 61baf3ac5d chore: sync all local changes and new files
- Update next.config.ts
- Add netlify.toml, Docker configs, e2e tests
- Add env templates, docs (README, ROADMAP, TODO)
- Add vitest/playwright test configs
- Add component and lib tests
- Add install script, portainer env template
- Update .gitignore (tsbuildinfo, deno.lock, dev.db)
2026-07-02 20:01:48 +08:00

330 lines
8.9 KiB
YAML

# Falah OS v1.3 - High Availability Infrastructure
# Usage: docker-compose -f docker-compose.yml -f docker-compose.ha.yml up -d
version: '3.8'
services:
# =============================================================================
# HIGH AVAILABILITY DATABASE
# =============================================================================
postgres-primary:
image: postgres:16-alpine
container_name: falah-postgres-primary
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=falahsecure
- POSTGRES_DB=falahdb
- POSTGRES_HOST_AUTH_METHOD=trust
volumes:
- postgres-primary-data:/var/lib/postgresql/data
- ./infrastructure/postgres/init.sql:/docker-entrypoint-initdb.d/init.sql
networks:
- falah-network
deploy:
resources:
limits:
cpus: '2.0'
memory: 4G
reservations:
cpus: '1.0'
memory: 2G
command: >
postgres
-c max_connections=300
-c shared_buffers=2GB
-c effective_cache_size=6GB
-c maintenance_work_mem=512MB
-c checkpoint_completion_target=0.9
-c wal_level=replica
-c max_wal_senders=10
-c wal_keep_size=1GB
-c hot_standby=on
postgres-replica-1:
image: postgres:16-alpine
container_name: falah-postgres-replica-1
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=falahsecure
- POSTGRES_DB=falahdb
volumes:
- postgres-replica-1-data:/var/lib/postgresql/data
networks:
- falah-network
depends_on:
- postgres-primary
deploy:
resources:
limits:
cpus: '2.0'
memory: 4G
command: >
postgres
-c hot_standby=on
-c hot_standby_feedback=on
-c max_standby_streaming_delay=30s
postgres-replica-2:
image: postgres:16-alpine
container_name: falah-postgres-replica-2
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=falahsecure
- POSTGRES_DB=falahdb
volumes:
- postgres-replica-2-data:/var/lib/postgresql/data
networks:
- falah-network
depends_on:
- postgres-primary
deploy:
resources:
limits:
cpus: '2.0'
memory: 4G
command: >
postgres
-c hot_standby=on
-c hot_standby_feedback=on
-c max_standby_streaming_delay=30s
# =============================================================================
# REDIS HIGH AVAILABILITY (Sentinel)
# =============================================================================
redis-master:
image: redis:7-alpine
container_name: falah-redis-master
command: >
redis-server
--appendonly yes
--maxmemory 2gb
--maxmemory-policy allkeys-lru
--requirepass falahsecure
volumes:
- redis-master-data:/data
networks:
- falah-network
deploy:
resources:
limits:
cpus: '1.0'
memory: 2G
redis-replica-1:
image: redis:7-alpine
container_name: falah-redis-replica-1
command: >
redis-server
--appendonly yes
--replicaof falah-redis-master 6379
--masterauth falahsecure
--requirepass falahsecure
volumes:
- redis-replica-1-data:/data
networks:
- falah-network
depends_on:
- redis-master
deploy:
resources:
limits:
cpus: '1.0'
memory: 2G
redis-replica-2:
image: redis:7-alpine
container_name: falah-redis-replica-2
command: >
redis-server
--appendonly yes
--replicaof falah-redis-master 6379
--masterauth falahsecure
--requirepass falahsecure
volumes:
- redis-replica-2-data:/data
networks:
- falah-network
depends_on:
- redis-master
deploy:
resources:
limits:
cpus: '1.0'
memory: 2G
redis-sentinel:
image: redis:7-alpine
container_name: falah-redis-sentinel
command: >
redis-sentinel
--sentinel monitor falah-master falah-redis-master 6379 2
--sentinel down-after-milliseconds falah-master 5000
--sentinel failover-timeout falah-master 60000
--sentinel parallel-syncs falah-master 1
volumes:
- ./infrastructure/redis/sentinel.conf:/etc/redis/sentinel.conf
networks:
- falah-network
depends_on:
- redis-master
- redis-replica-1
- redis-replica-2
# =============================================================================
# CONNECTION POOLING
# =============================================================================
pgbouncer:
image: pgbouncer/pgbouncer:latest
container_name: falah-pgbouncer
environment:
- DATABASE_URL=postgresql://postgres:falahsecure@falah-postgres-primary:5432/falahdb
- POOL_MODE=transaction
- MAX_CLIENT_conn=500
- DEFAULT_POOL_SIZE=50
- MIN_POOL_SIZE=10
volumes:
- ./infrastructure/pgbouncer/pgbouncer.ini:/etc/pgbouncer/pgbouncer.ini
- ./infrastructure/pgbouncer/userlist.txt:/etc/pgbouncer/userlist.txt
ports:
- "6432:5432"
networks:
- falah-network
depends_on:
- postgres-primary
# =============================================================================
# LOAD BALANCER (Traefik)
# =============================================================================
traefik:
image: traefik:v3.0
container_name: falah-traefik
command:
- "--api.insecure=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.letsencrypt.acme.email=admin@falah-os.com"
- "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
- "--certificatesresolvers.letsencrypt.acme.tlschallenge=true"
- "--log.level=INFO"
- "--accesslog=true"
ports:
- "80:80"
- "443:443"
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./infrastructure/traefik/traefik.yml:/etc/traefik/traefik.yml:ro
- ./infrastructure/traefik/acme.json:/letsencrypt/acme.json
networks:
- falah-network
restart: unless-stopped
# =============================================================================
# OBSERVABILITY STACK
# =============================================================================
prometheus:
image: prom/prometheus:latest
container_name: falah-prometheus
volumes:
- ./infrastructure/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro
- prometheus-data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--storage.tsdb.retention.time=30d'
ports:
- "9090:9090"
networks:
- falah-network
restart: unless-stopped
grafana:
image: grafana/grafana:latest
container_name: falah-grafana
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD:-changeme}
- GF_INSTALL_PLUGINS=grafana-piechart-panel
volumes:
- grafana-data:/var/lib/grafana
- ./infrastructure/grafana/dashboards:/etc/grafana/provisioning/dashboards:ro
- ./infrastructure/grafana/datasources:/etc/grafana/provisioning/datasources:ro
ports:
- "3000:3000"
networks:
- falah-network
depends_on:
- prometheus
restart: unless-stopped
loki:
image: grafana/loki:latest
container_name: falah-loki
volumes:
- ./infrastructure/loki/loki-config.yml:/etc/loki/local-config.yaml:ro
- loki-data:/loki
ports:
- "3100:3100"
networks:
- falah-network
restart: unless-stopped
promtail:
image: grafana/promtail:latest
container_name: falah-promtail
volumes:
- ./infrastructure/promtail/promtail-config.yml:/etc/promtail/config.yml:ro
- /var/lib/docker/containers:/var/lib/docker/containers:ro
command:
- "-config.file=/etc/promtail/config.yml"
networks:
- falah-network
restart: unless-stopped
alertmanager:
image: prom/alertmanager:latest
container_name: falah-alertmanager
volumes:
- ./infrastructure/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml:ro
- alertmanager-data:/alertmanager
ports:
- "9093:9093"
networks:
- falah-network
restart: unless-stopped
volumes:
postgres-primary-data:
driver: local
postgres-replica-1-data:
driver: local
postgres-replica-2-data:
driver: local
redis-master-data:
driver: local
redis-replica-1-data:
driver: local
redis-replica-2-data:
driver: local
prometheus-data:
driver: local
grafana-data:
driver: local
loki-data:
driver: local
alertmanager-data:
driver: local
networks:
falah-network:
driver: bridge
ipam:
config:
- subnet: 172.28.0.0/16