File size: 7,068 Bytes
363cda9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3370983
 
 
 
363cda9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3370983
363cda9
 
 
 
3370983
 
 
 
363cda9
3370983
 
 
363cda9
 
 
3370983
363cda9
 
 
 
 
 
 
3370983
363cda9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3370983
 
363cda9
 
3370983
 
363cda9
 
 
3370983
 
363cda9
 
 
 
 
 
 
3370983
 
363cda9
 
 
 
 
 
 
 
 
 
 
3370983
 
363cda9
 
 
 
 
 
 
3370983
 
 
 
 
 
363cda9
 
 
3370983
363cda9
 
 
 
 
 
 
 
 
 
3370983
363cda9
 
 
3370983
 
363cda9
 
 
 
 
 
 
 
3370983
363cda9
 
 
 
 
 
 
 
 
 
3370983
363cda9
 
3370983
 
363cda9
 
3370983
 
363cda9
 
 
 
 
 
 
3370983
 
363cda9
 
 
3370983
363cda9
 
 
 
 
 
 
 
 
 
3370983
363cda9
 
 
3370983
 
363cda9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
# Run as follows from root:
# >>> docker compose --env-file .env -f docker/docker-compose.yml up --build
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#

services:
  # --- Database Service ---
  # Runs a PostgreSQL 15 instance with persistent storage.
  db:
    image: postgres:15
    container_name: agentic_hr_db
    restart: always
    ports:
      - "5433:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U agentic_user -d agentic_hr"]
      interval: 3s
      timeout: 3s
      retries: 5
    # Hey compose here is env file,
    # pass it to container, but not the .env itself
    env_file:
      - ../.env
    environment:
      POSTGRES_HOST: ${POSTGRES_HOST}
      POSTGRES_PORT: ${POSTGRES_PORT}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: ${POSTGRES_DB}
    networks:
      - hrnet

  candidates_db_init:
    # --- Application Service ---
    # Runs your Python backend inside Docker.
    # Initializes the database or starts the API (depending on command).
    container_name: candidates_db_init
    build:
      context: ..  # build from the project root
      dockerfile: docker/Dockerfile.candidates_db_init
    depends_on:
      db:
        condition: service_healthy
    # Hey compose here is env file, 
    # pass it to container, but not the .env itself
    env_file:
      - ../.env
    environment:
      # Explicitly set POSTGRES_HOST to the service name 'db' for Docker networking
      POSTGRES_HOST: db
      POSTGRES_PORT: 5432
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: ${POSTGRES_DB}
    command: ["python", "-m", "src.backend.database.candidates.init_db"]

    volumes:
      # --- Local code mount (for development only) ---
      # Mounts your entire project source from the host (../)
      # into the container at /app.
      # ✅ Enables live code changes without rebuilding the image.
      # ⚠️ Do NOT use in production – overrides the built image code.
      - ../:/app  # optional: live reload for local dev

    networks:
      - hrnet

  # --- CV Upload ---
  cv_upload_streamlit:
    container_name: cv_upload_streamlit
    build:
      context: ..
      dockerfile: docker/Dockerfile.cv_upload
    ports:
      - "8501:8501"
    depends_on:
      - db
      - supervisor_api
    env_file:
      - ../.env
    environment:
      # Database connection
      POSTGRES_HOST: db
      POSTGRES_PORT: 5432
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: ${POSTGRES_DB}
      DATABASE_URL: postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}
      CV_UPLOAD_PATH: /app/src/backend/database/cvs/uploads
      # App specific
      CV_UPLOAD_API_URL: http://supervisor_api:8080/api/v1/cv
      PYTHONPATH: /app
    volumes:
      # Mount local code for live updates
      - ../:/app
      # Shared volume for CV uploads (persistent)
      - ../src/backend/database/cvs:/app/src/backend/database/cvs
    command: ["streamlit", "run", "src/frontend/streamlit/cv_ui/app.py", "--server.port=8501", "--server.address=0.0.0.0"]
    networks:
      - hrnet

  # --- WebSocket Proxy for OpenAI Realtime API ---
  websocket_proxy:
    container_name: websocket_proxy
    build:
      context: ..
      dockerfile: docker/Dockerfile.voice_proxy
    ports:
      - "8000:8000"
    env_file:
      - ../.env
    depends_on:
      - db
      - candidates_db_init
    environment:
      PYTHONPATH: /app
      OPENAI_API_KEY: ${OPENAI_API_KEY}
      BACKEND_API_URL: http://supervisor_api:8080
      # Database connection
      POSTGRES_HOST: db
      POSTGRES_PORT: 5432
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: ${POSTGRES_DB}
    volumes:
      # Mount local code for live updates
      - ../:/app
    command: ["python", "-m", "uvicorn", "src.frontend.streamlit.voice_screening_ui.proxy:app", "--host", "0.0.0.0", "--port", "8000"]
    networks:
      - hrnet

  # --- Voice Screening UI ---
  voice_screening_ui:
    container_name: voice_screening_ui
    build:
      context: ..
      dockerfile: docker/Dockerfile.voice_screening
    ports:
      - "8502:8501"  # Map host port 8502 to container port 8501
    depends_on:
      - db
      - websocket_proxy
    env_file:
      - ../.env
    environment:
      DATABASE_URL: postgresql://agentic_user:password123@db:5432/agentic_hr
      PYTHONPATH: /app
      WEBSOCKET_PROXY_URL: ws://websocket_proxy:8000/ws/realtime
      BACKEND_API_URL: http://supervisor_api:8080
    volumes:
      # Mount local code for live updates
      - ../:/app
    command: ["streamlit", "run", "src/frontend/streamlit/voice_screening_ui/app.py", "--server.port=8501", "--server.address=0.0.0.0"]
    networks:
      - hrnet

  # --- Supervisor Agent API ---
  supervisor_api:
    container_name: supervisor_api
    build:
      context: ..
      dockerfile: docker/Dockerfile.supervisor_api
    ports:
      - "8080:8080"  # Map host port 8080 to container port 8080
    depends_on:
      - db
    env_file:
      - ../.env
    environment:
      # We set POSTGRES_HOST to 'db' so the agent connects to the container internal network
      POSTGRES_HOST: db
      POSTGRES_PORT: 5432
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: ${POSTGRES_DB}
      PYTHONPATH: /app
      PROMPTLAYER_API_KEY: ${PROMPTLAYER_API_KEY}
      OPENAI_API_KEY: ${OPENAI_API_KEY}
      WEBSOCKET_PROXY_URL: ws://websocket_proxy:8000/ws/realtime
      CV_UPLOAD_PATH: /app/src/backend/database/cvs/uploads
      CV_PARSED_PATH: /app/src/backend/database/cvs/parsed
    volumes:
      # Mount local code for live updates
      - ../:/app
    command: ["uvicorn", "src.backend.api.app:app", "--host", "0.0.0.0", "--port", "8080", "--reload"]
    networks:
      - hrnet

  # --- Supervisor Agent UI ---
  supervisor_ui:
    container_name: supervisor_ui
    build:
      context: ..
      dockerfile: docker/Dockerfile.supervisor
    ports:
      - "8503:8501"  # Map host port 8503 to container port 8501
    depends_on:
      - db
      - supervisor_api
    env_file:
      - ../.env
    environment:
      # We set POSTGRES_HOST to 'db' so the agent connects to the container internal network
      PYTHONPATH: /app
      # API URL for the Streamlit UI to connect to
      SUPERVISOR_API_URL: http://supervisor_api:8080/api/v1/supervisor
    volumes:
      # Mount local code for live updates
      - ../:/app
    command:
      [
        "streamlit",
        "run",
        "src/frontend/streamlit/supervisor_ui/app.py",
        "--server.port=8501",
        "--server.address=0.0.0.0",
      ]
    networks:
      - hrnet

volumes:
  postgres_data:
  cvs_data:
    driver: local

networks:
  hrnet:
    driver: bridge