Skip to content

Commit 59626c7

Browse files
committed
feat: add Docker and Kubernetes infrastructure for training, inference and dashboard services
1 parent 024a690 commit 59626c7

File tree

9 files changed

+161
-0
lines changed

9 files changed

+161
-0
lines changed

infra/README.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Infraestrutura (conceitual)
2+
3+
Este diretório contém artefatos de infraestrutura para executar o monorepo em ambientes conteinerizados ou orquestrados.
4+
5+
Estrutura:
6+
- docker/
7+
- Dockerfile.inference: imagem do serviço de inferência (Elysia/Bun)
8+
- Dockerfile.dashboard: imagem do dashboard (Vite -> Nginx)
9+
- Dockerfile.training: imagem para job de treinamento on-demand
10+
- docker-compose.yml: orquestração local dos serviços (inference + dashboard). O serviço de training está em profile opcional.
11+
- k8s/
12+
- inference-deployment.yaml, inference-service.yaml
13+
- dashboard-deployment.yaml, dashboard-service.yaml
14+
15+
Observações:
16+
- Artefatos de modelo ficam centralizados em `artifacts/` na raiz e são montados nos containers.
17+
- O banco SQLite (`inference/main.db`) é compartilhado entre treino e inferência. No compose, o DB é efêmero por simplicidade; pode-se bind-mount conforme necessidade.
18+
- As imagens no diretório k8s são placeholders; ajuste com seu registry.

infra/docker-compose.yml

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
version: "3.9"
2+
3+
services:
4+
inference:
5+
build:
6+
context: ..
7+
dockerfile: infra/docker/Dockerfile.inference
8+
ports:
9+
- "3001:3001"
10+
volumes:
11+
- ../artifacts:/app/artifacts
12+
- inference_data:/app/inference
13+
working_dir: /app
14+
15+
dashboard:
16+
build:
17+
context: ..
18+
dockerfile: infra/docker/Dockerfile.dashboard
19+
ports:
20+
- "8080:80"
21+
depends_on:
22+
- inference
23+
24+
training:
25+
build:
26+
context: ..
27+
dockerfile: infra/docker/Dockerfile.training
28+
volumes:
29+
- ../artifacts:/app/artifacts
30+
- inference_data:/app/inference
31+
- ../data:/app/data
32+
profiles: ["training"]
33+
34+
volumes:
35+
inference_data:

infra/docker/Dockerfile.dashboard

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# syntax=docker/dockerfile:1
2+
# Build
3+
FROM oven/bun:1 as builder
4+
WORKDIR /app
5+
COPY . .
6+
RUN bun install --ci
7+
RUN bun --cwd dashboard run build
8+
9+
# Runtime
10+
FROM nginx:alpine
11+
COPY --from=builder /app/dashboard/dist /usr/share/nginx/html
12+
EXPOSE 80
13+
CMD ["nginx", "-g", "daemon off;"]

infra/docker/Dockerfile.inference

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# syntax=docker/dockerfile:1
2+
FROM oven/bun:1
3+
WORKDIR /app
4+
5+
# Copia o monorepo inteiro (conceitual/simples)
6+
COPY . .
7+
8+
# Instala dependências (workspaces)
9+
RUN bun install --ci
10+
11+
EXPOSE 3001
12+
CMD ["bun", "run", "inference/src/index.js"]

infra/docker/Dockerfile.training

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# syntax=docker/dockerfile:1
2+
FROM oven/bun:1
3+
WORKDIR /app
4+
5+
COPY . .
6+
RUN bun install --ci
7+
8+
# Perfil de job: executa e finaliza
9+
CMD ["bun", "--cwd", "training", "run", "train"]
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
apiVersion: apps/v1
2+
kind: Deployment
3+
metadata:
4+
name: dashboard
5+
spec:
6+
replicas: 1
7+
selector:
8+
matchLabels:
9+
app: dashboard
10+
template:
11+
metadata:
12+
labels:
13+
app: dashboard
14+
spec:
15+
containers:
16+
- name: dashboard
17+
image: ghcr.io/your-org/spamguard-dashboard:latest
18+
ports:
19+
- containerPort: 80

infra/k8s/dashboard-service.yaml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
apiVersion: v1
2+
kind: Service
3+
metadata:
4+
name: dashboard
5+
spec:
6+
selector:
7+
app: dashboard
8+
ports:
9+
- name: http
10+
port: 80
11+
targetPort: 80
12+
protocol: TCP
13+
type: ClusterIP
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
apiVersion: apps/v1
2+
kind: Deployment
3+
metadata:
4+
name: inference
5+
spec:
6+
replicas: 1
7+
selector:
8+
matchLabels:
9+
app: inference
10+
template:
11+
metadata:
12+
labels:
13+
app: inference
14+
spec:
15+
containers:
16+
- name: inference
17+
image: ghcr.io/your-org/spamguard-inference:latest
18+
ports:
19+
- containerPort: 3001
20+
volumeMounts:
21+
- name: artifacts
22+
mountPath: /app/artifacts
23+
- name: inference-data
24+
mountPath: /app/inference
25+
volumes:
26+
- name: artifacts
27+
emptyDir: {}
28+
- name: inference-data
29+
emptyDir: {}

infra/k8s/inference-service.yaml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
apiVersion: v1
2+
kind: Service
3+
metadata:
4+
name: inference
5+
spec:
6+
selector:
7+
app: inference
8+
ports:
9+
- name: http
10+
port: 3001
11+
targetPort: 3001
12+
protocol: TCP
13+
type: ClusterIP

0 commit comments

Comments
 (0)