name: llamatutor services: production: image: llamatutor:production container_name: llamatutor-production restart: unless-stopped init: true env_file: - .env.production ports: - "127.0.0.1:3100:3000" cpus: 0.75 mem_limit: 768m security_opt: - no-new-privileges:true read_only: true tmpfs: - /tmp - /app/.next/cache:uid=1001,gid=1001 healthcheck: test: [ "CMD", "node", "-e", "fetch('http://127.0.0.1:3000/api/health').then(r=>{if(!r.ok)process.exit(1)}).catch(()=>process.exit(1))", ] interval: 30s timeout: 5s start_period: 20s retries: 3 staging: image: llamatutor:staging container_name: llamatutor-staging restart: unless-stopped init: true env_file: - .env.staging ports: - "127.0.0.1:3101:3000" cpus: 0.5 mem_limit: 512m security_opt: - no-new-privileges:true read_only: true tmpfs: - /tmp - /app/.next/cache:uid=1001,gid=1001 healthcheck: test: [ "CMD", "node", "-e", "fetch('http://127.0.0.1:3000/api/health').then(r=>{if(!r.ok)process.exit(1)}).catch(()=>process.exit(1))", ] interval: 30s timeout: 5s start_period: 20s retries: 3 voice-production: image: llamatutor-voice:production container_name: llamatutor-voice-production restart: unless-stopped init: true env_file: - .env.voice.production environment: PIPECAT_HOST: 127.0.0.1 PIPECAT_PORT: 3200 network_mode: host cpus: 0.75 mem_limit: 768m security_opt: - no-new-privileges:true read_only: true tmpfs: - /tmp healthcheck: test: [ "CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://127.0.0.1:3200/healthz', timeout=3)", ] interval: 30s timeout: 5s start_period: 45s retries: 3 voice-daily-production: image: llamatutor-voice:production container_name: llamatutor-voice-daily-production restart: unless-stopped init: true env_file: - .env.voice.production environment: PIPECAT_TRANSPORT: daily ports: - "127.0.0.1:3202:7860" cpus: 0.75 mem_limit: 768m security_opt: - no-new-privileges:true read_only: true tmpfs: - /tmp healthcheck: test: [ "CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://127.0.0.1:7860/healthz', timeout=3)", ] interval: 30s timeout: 5s start_period: 45s retries: 3 voice-staging: image: llamatutor-voice:staging container_name: llamatutor-voice-staging restart: unless-stopped init: true env_file: - .env.voice.staging environment: PIPECAT_HOST: 127.0.0.1 PIPECAT_PORT: 3201 network_mode: host cpus: 0.75 mem_limit: 768m security_opt: - no-new-privileges:true read_only: true tmpfs: - /tmp healthcheck: test: [ "CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://127.0.0.1:3201/healthz', timeout=3)", ] interval: 30s timeout: 5s start_period: 45s retries: 3 voice-daily-staging: image: llamatutor-voice:staging container_name: llamatutor-voice-daily-staging restart: unless-stopped init: true env_file: - .env.voice.staging environment: PIPECAT_TRANSPORT: daily ports: - "127.0.0.1:3203:7860" cpus: 0.75 mem_limit: 768m security_opt: - no-new-privileges:true read_only: true tmpfs: - /tmp healthcheck: test: [ "CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://127.0.0.1:7860/healthz', timeout=3)", ] interval: 30s timeout: 5s start_period: 45s retries: 3