Added production compose and Dockerfiles
This commit is contained in:
parent
5ec52ddfed
commit
e3a31fca78
4 changed files with 222 additions and 0 deletions
26
compose/prod/celery/Dockerfile
Normal file
26
compose/prod/celery/Dockerfile
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
FROM python:3.12.0-slim
|
||||||
|
|
||||||
|
LABEL org.opencontainers.image.title="Dynavera Celery Worker"
|
||||||
|
LABEL org.opencontainers.image.source="https://git.cs.bham.ac.uk/projects-2025-26/vxn217"
|
||||||
|
|
||||||
|
ENV PYTHONDONTWRITEBYTECODE=1
|
||||||
|
ENV PYTHONUNBUFFERED=1
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install --no-install-recommends -y \
|
||||||
|
build-essential \
|
||||||
|
libpq-dev \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
COPY requirements/django.txt .
|
||||||
|
RUN pip install --no-cache-dir -r django.txt
|
||||||
|
|
||||||
|
COPY manage.py manage.py
|
||||||
|
COPY config config
|
||||||
|
COPY apps apps
|
||||||
|
COPY data data
|
||||||
|
|
||||||
|
RUN mkdir -p /app/static
|
||||||
|
|
||||||
|
CMD ["celery", "-A", "config.celery", "worker", "--loglevel=info"]
|
||||||
50
compose/prod/django/Dockerfile
Normal file
50
compose/prod/django/Dockerfile
Normal file
|
|
@ -0,0 +1,50 @@
|
||||||
|
FROM node:22-alpine AS node
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
COPY package*.json ./
|
||||||
|
|
||||||
|
RUN npm ci
|
||||||
|
|
||||||
|
COPY vite.config.ts .
|
||||||
|
COPY tsconfig.json .
|
||||||
|
COPY package*.json .
|
||||||
|
COPY src ./src
|
||||||
|
COPY index.html .
|
||||||
|
|
||||||
|
RUN npm run build
|
||||||
|
|
||||||
|
FROM python:3.12.0-slim AS python
|
||||||
|
|
||||||
|
LABEL org.opencontainers.image.title="Dynavera - An Agentic Approach to Role-Specific Trainers"
|
||||||
|
LABEL org.opencontainers.image.source="https://git.cs.bham.ac.uk/projects-2025-26/vxn217"
|
||||||
|
LABEL org.opencontainers.image.description="Dynavera (Final Year Project)"
|
||||||
|
|
||||||
|
ENV PYTHONDONTWRITEBYTECODE=1
|
||||||
|
ENV PYTHONUNBUFFERED=1
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install --no-install-recommends -y \
|
||||||
|
build-essential \
|
||||||
|
libpq-dev \
|
||||||
|
wait-for-it \
|
||||||
|
&& apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
COPY requirements/django.txt .
|
||||||
|
RUN pip install --no-cache-dir -r django.txt
|
||||||
|
|
||||||
|
COPY manage.py manage.py
|
||||||
|
COPY config config
|
||||||
|
COPY apps apps
|
||||||
|
COPY data data
|
||||||
|
|
||||||
|
COPY --from=node /app/build ./build
|
||||||
|
|
||||||
|
RUN mkdir -p /app/static
|
||||||
|
|
||||||
|
COPY ./compose/prod/django/start /start
|
||||||
|
RUN sed -i 's/\r$//g' /start && chmod +x /start
|
||||||
|
|
||||||
|
ENTRYPOINT ["/start"]
|
||||||
26
compose/prod/docker-compose.mcp.yml
Normal file
26
compose/prod/docker-compose.mcp.yml
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
services:
|
||||||
|
fyp-mcp-prod:
|
||||||
|
container_name: fyp-mcp-prod
|
||||||
|
build:
|
||||||
|
context: ../../
|
||||||
|
dockerfile: compose/dev/mcp/Dockerfile
|
||||||
|
restart: unless-stopped
|
||||||
|
deploy:
|
||||||
|
mode: replicated
|
||||||
|
replicas: 1
|
||||||
|
resources:
|
||||||
|
reservations:
|
||||||
|
devices:
|
||||||
|
- driver: nvidia
|
||||||
|
count: all
|
||||||
|
capabilities: [gpu]
|
||||||
|
env_file:
|
||||||
|
- ../../.env
|
||||||
|
environment:
|
||||||
|
- MCP_HTTP_HOST=0.0.0.0
|
||||||
|
- MCP_HTTP_PORT=8001
|
||||||
|
- NVIDIA_VISIBLE_DEVICES=all
|
||||||
|
ports:
|
||||||
|
- '0.0.0.0:${MCP_SERVER_PORT}:8001'
|
||||||
|
volumes:
|
||||||
|
- ../../:/app
|
||||||
120
compose/prod/docker-compose.server.yml
Normal file
120
compose/prod/docker-compose.server.yml
Normal file
|
|
@ -0,0 +1,120 @@
|
||||||
|
services:
|
||||||
|
fyp-django-prod:
|
||||||
|
container_name: fyp-django-prod
|
||||||
|
image: {FYP_DJANGO_IMAGE}
|
||||||
|
deploy:
|
||||||
|
mode: replicated
|
||||||
|
replicas: {FYP_DJANGO_REPLICAS}
|
||||||
|
env_file:
|
||||||
|
- ../../.env
|
||||||
|
labels:
|
||||||
|
- "traefik.enable=true"
|
||||||
|
- "traefik.http.routers.fyp-web.rule=Host(`${DJANGO_DOMAIN}`)"
|
||||||
|
- "traefik.http.routers.fyp-web.entrypoints=${DJANGO_ENTRYPOINT}"
|
||||||
|
- "traefik.http.routers.fyp-web.tls.certresolver=${CERTRESOLVER}"
|
||||||
|
- "traefik.http.services.fyp-web.loadbalancer.server.port=${DJANGO_PORT}"
|
||||||
|
- "com.centurylinklabs.watchtower.enable=true"
|
||||||
|
- "com.centurylinklabs.watchtower.scope=fyp"
|
||||||
|
volumes:
|
||||||
|
- ../../static:/app/static
|
||||||
|
- ../../media:/app/media
|
||||||
|
depends_on:
|
||||||
|
fyp-postgres-prod:
|
||||||
|
condition: service_healthy
|
||||||
|
networks:
|
||||||
|
- fyp-network
|
||||||
|
- proxy
|
||||||
|
|
||||||
|
fyp-postgres-prod:
|
||||||
|
container_name: fyp-postgres-prod
|
||||||
|
image: postgres:15-alpine
|
||||||
|
hostname: fyp-postgres-prod
|
||||||
|
restart: unless-stopped
|
||||||
|
env_file:
|
||||||
|
- ../../.env
|
||||||
|
environment:
|
||||||
|
POSTGRES_HOST_AUTH_METHOD: trust
|
||||||
|
volumes:
|
||||||
|
- fyp_postgres_data:/var/lib/postgresql/data
|
||||||
|
healthcheck:
|
||||||
|
test: ['CMD-SHELL', 'pg_isready -h 127.0.0.1 -p 5432 -U ${POSTGRES_USER} -d ${POSTGRES_DB}']
|
||||||
|
interval: 5s
|
||||||
|
timeout: 3s
|
||||||
|
retries: 5
|
||||||
|
networks:
|
||||||
|
- fyp-network
|
||||||
|
|
||||||
|
fyp-redis-prod:
|
||||||
|
container_name: fyp-redis-prod
|
||||||
|
image: redis:7-alpine
|
||||||
|
restart: unless-stopped
|
||||||
|
volumes:
|
||||||
|
- fyp_redis_data:/data
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "redis-cli", "ping"]
|
||||||
|
interval: 5s
|
||||||
|
timeout: 3s
|
||||||
|
retries: 5
|
||||||
|
|
||||||
|
fyp-celery-dev:
|
||||||
|
container_name: fyp-celery-dev
|
||||||
|
image: {FYP_CELERY_IMAGE}
|
||||||
|
env_file:
|
||||||
|
- ../../.env
|
||||||
|
volumes:
|
||||||
|
- ../../:/app
|
||||||
|
- ../../static:/app/static
|
||||||
|
- ../../media:/app/media
|
||||||
|
depends_on:
|
||||||
|
fyp-redis-prod:
|
||||||
|
condition: service_healthy
|
||||||
|
fyp-postgres-prod:
|
||||||
|
condition: service_healthy
|
||||||
|
|
||||||
|
fyp-watchtower-prod:
|
||||||
|
container_name: fyp-watchtower-prod
|
||||||
|
image: containrrr/watchtower
|
||||||
|
command:
|
||||||
|
- "--scope=fyp"
|
||||||
|
- "--label-enable"
|
||||||
|
- "--interval"
|
||||||
|
- "30"
|
||||||
|
- "--rolling-restart"
|
||||||
|
environment:
|
||||||
|
- WATCHTOWER_CLEANUP=true
|
||||||
|
- REPO_USER=${GITLAB_USER}
|
||||||
|
- REPO_PASS=${GITLAB_PASS}
|
||||||
|
volumes:
|
||||||
|
- "/var/run/docker.sock:/var/run/docker.sock"
|
||||||
|
|
||||||
|
fyp-runner-prod:
|
||||||
|
container_name: fyp-runner-prod
|
||||||
|
image: gitlab/gitlab-runner:${GITLAB_RUNNER_IMAGE_TAG}
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
- CI_SERVER_URL=${GITLAB_SERVER_URL}
|
||||||
|
- REGISTRATION_TOKEN=${GITLAB_RUNNER_REGISTRATION_TOKEN}
|
||||||
|
- RUNNER_EXECUTOR=docker
|
||||||
|
- RUNNER_RUN_UNTAGGED=true
|
||||||
|
- RUNNER_TAG_LIST=
|
||||||
|
- DOCKER_TLS_CERTDIR=
|
||||||
|
- DOCKER_IMAGE=${GITLAB_RUNNER_DOCKER_IMAGE}
|
||||||
|
volumes:
|
||||||
|
- gitlab-runner-config:/etc/gitlab-runner
|
||||||
|
- gitlab-machine-config:/root/.docker/machine
|
||||||
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
|
command:
|
||||||
|
- run
|
||||||
|
- "--working-directory=/home/gitlab-runner"
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
fyp_postgres_data:
|
||||||
|
fyp_redis_data:
|
||||||
|
gitlab-runner-config:
|
||||||
|
gitlab-machine-config:
|
||||||
|
|
||||||
|
networks:
|
||||||
|
fyp-network:
|
||||||
|
driver: bridge
|
||||||
|
proxy:
|
||||||
|
external: true
|
||||||
Loading…
Reference in a new issue