platform-codebase/features/conversation-assistant/docker-compose.prod.yml
Quinn Ftw 66bcf8e851 feat(conversation-assistant): add production deployment configuration
- Add Dockerfile.prod for multi-stage server build
- Add docker-compose.prod.yml for production stack
- Add nginx config for conversations.nasty.sh with SSL
- Add frontend Dockerfile and nginx config
- Add deploy.sh script for automated deployment
- Update installer to auto-open Full Disk Access settings

Deployment target: 0.1984.dss.nasty.sh (conversations.nasty.sh)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-28 21:34:31 -08:00

152 lines
3.8 KiB
YAML

# =============================================================================
# CONVERSATION ASSISTANT: Production Deployment
# =============================================================================
#
# Production stack for conversations.nasty.sh
# Deployed on 0.1984.dss.nasty.sh
#
# Usage:
# docker-compose -f docker-compose.prod.yml up -d
# docker-compose -f docker-compose.prod.yml logs -f server
# docker-compose -f docker-compose.prod.yml down
#
# =============================================================================
version: '3.8'
services:
# =============================================================================
# SERVER: NestJS API
# =============================================================================
server:
build:
context: .
dockerfile: Dockerfile.prod
container_name: conversation-assistant-server
restart: unless-stopped
environment:
NODE_ENV: production
PORT: 3100
# Database
DATABASE_HOST: postgres
DATABASE_PORT: 5432
DATABASE_USER: ${POSTGRES_USER:-conversation}
DATABASE_PASSWORD: ${POSTGRES_PASSWORD}
DATABASE_NAME: ${POSTGRES_DB:-conversation_assistant}
# Redis
REDIS_HOST: redis
REDIS_PORT: 6379
# JWT
JWT_SECRET: ${JWT_SECRET}
JWT_EXPIRATION: 7d
# CORS
CORS_ORIGINS: https://conversations.nasty.sh
ports:
- "127.0.0.1:3100:3100"
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
healthcheck:
test: ['CMD', 'wget', '--no-verbose', '--tries=1', '--spider', 'http://localhost:3100/api/health']
interval: 30s
timeout: 10s
retries: 3
start_period: 30s
networks:
- conversation-net
# =============================================================================
# FRONTEND: React Admin Panel
# =============================================================================
frontend:
build:
context: ./frontend
dockerfile: Dockerfile
args:
VITE_API_URL: https://conversations.nasty.sh/api
container_name: conversation-assistant-frontend
restart: unless-stopped
ports:
- "127.0.0.1:3101:80"
depends_on:
- server
networks:
- conversation-net
# =============================================================================
# DATABASE: PostgreSQL
# =============================================================================
postgres:
image: postgres:16-alpine
container_name: conversation-assistant-postgres
restart: unless-stopped
environment:
POSTGRES_USER: ${POSTGRES_USER:-conversation}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB:-conversation_assistant}
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U ${POSTGRES_USER:-conversation}']
interval: 10s
timeout: 5s
retries: 5
networks:
- conversation-net
# =============================================================================
# CACHE: Redis
# =============================================================================
redis:
image: redis:7.4-alpine
container_name: conversation-assistant-redis
restart: unless-stopped
command:
- redis-server
- --appendonly
- "yes"
- --maxmemory
- "256mb"
- --maxmemory-policy
- "allkeys-lru"
volumes:
- redis_data:/data
healthcheck:
test: ['CMD', 'redis-cli', 'ping']
interval: 10s
timeout: 3s
retries: 5
networks:
- conversation-net
volumes:
postgres_data:
name: conversation-assistant-postgres-data
redis_data:
name: conversation-assistant-redis-data
networks:
conversation-net:
name: conversation-assistant-network