# Self-Hosted: MongoDB + Redis + Server + Client + Auth # Usage: docker compose -f docker-compose.selfhost.yml --env-file .env.selfhost up -d services: # ── Infrastructure ────────────────────────────────────────── mongodb: image: mongo:7 restart: unless-stopped volumes: - mongodb_data:/data/db healthcheck: test: ['CMD', 'mongosh', '--eval', "db.adminCommand('ping')"] interval: 10s timeout: 5s start_period: 20s retries: 3 redis: image: redis:7-alpine restart: unless-stopped command: redis-server --appendonly yes --maxmemory-policy noeviction --maxmemory 256mb --requirepass ${REDIS_PASSWORD:-} volumes: - redis_data:/data healthcheck: test: [ 'CMD', 'sh', '-c', 'redis-cli -a "$$REDIS_PASSWORD" ping 2>/dev/null || redis-cli ping', ] interval: 10s timeout: 5s retries: 3 # ── Backend ───────────────────────────────────────────────── tenant-server: image: buildbaseapp/tenant-server:0.0.5 restart: unless-stopped read_only: true security_opt: - no-new-privileges:true cap_drop: - ALL tmpfs: - /tmp - /var/log ports: - '${TENANT_SERVER_PORT:-4101}:3000' environment: - NODE_ENV=production - PORT=3000 - SERVER_URL=${TENANT_SERVER_URL:-http://localhost:4101} - APPLICATION_URL=${CLIENT_URL:-http://localhost:4100} - AUTH_SERVER_URL=${AUTH_URL:-http://localhost:4103} - MONGO_CONNECTION_URL=mongodb://mongodb:27017/ - REDIS_HOST=redis - REDIS_PORT=6379 - REDIS_PASSWORD=${REDIS_PASSWORD:-} - INSTALLATION_API_KEY=${INSTALLATION_API_KEY:-} - INSTALLATION_ID=${INSTALLATION_ID:-} - JWT_PASS=${JWT_PASS:-localdev_jwt_secret_do_not_use_in_production} - OAUTH2_SECRET=${OAUTH2_SECRET:-localdev_oauth2_secret_do_not_use_in_production} - DB_ENCRYPTION_KEY=${DB_ENCRYPTION_KEY:-localdev_db_encryption_key_do_not_use_in_production} - SECRET_KEY=${SECRET_KEY:-localdev_secret_key_do_not_use_in_production} - CORS_WHITELISTED_DOMAINS=${CLIENT_URL:-http://localhost:4100},${AUTH_URL:-http://localhost:4103} depends_on: mongodb: condition: service_healthy redis: condition: service_healthy healthcheck: test: ['CMD', 'wget', '-qO-', 'http://127.0.0.1:3000/api/ready'] interval: 15s timeout: 5s start_period: 45s retries: 3 deploy: resources: limits: memory: 1024M logging: driver: json-file options: max-size: '100m' max-file: '5' # ── Frontend ──────────────────────────────────────────────── client: image: buildbaseapp/client:0.0.5 restart: unless-stopped ports: - '${CLIENT_PORT:-4100}:3000' environment: - NEXT_PUBLIC_SERVER_URL=${TENANT_SERVER_URL:-http://localhost:4101} - NEXT_PUBLIC_DEFAULT_TENANT_SERVER_URL=${TENANT_SERVER_URL:-http://localhost:4101} - NEXT_PUBLIC_INSTALLATION_ID=${INSTALLATION_ID:-} auth: image: buildbaseapp/auth:0.0.5 restart: unless-stopped ports: - '${AUTH_PORT:-4103}:3000' environment: - NEXT_PUBLIC_SERVER_URL=${TENANT_SERVER_URL:-http://localhost:4101} volumes: mongodb_data: redis_data: