From 1e225e9af3d96ad79084f740ce6dbad436fcf916 Mon Sep 17 00:00:00 2001 From: Mikhail Kilin Date: Tue, 17 Mar 2026 22:29:20 +0300 Subject: [PATCH] Add k3s deployment: Dockerfiles, nginx config, CI pipeline MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Backend Dockerfile: multi-stage rust:1.87 → debian:bookworm-slim - Frontend Dockerfile: multi-stage node:22-alpine → nginx:alpine - Frontend nginx.conf: serve static + proxy /api/ to backend service - Change API_URL to relative /api for containerized deployment - Woodpecker CI pipeline to build and push images to Gitea Registry - Add repository URL to CLAUDE.md Co-Authored-By: Claude Opus 4.6 (1M context) --- .woodpecker.yml | 30 ++++++++++++++++++++++++++++++ CLAUDE.md | 2 ++ backend/Dockerfile | 19 +++++++++++++++++++ frontend/Dockerfile | 16 ++++++++++++++++ frontend/nginx.conf | 17 +++++++++++++++++ frontend/src/api.ts | 2 +- 6 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 .woodpecker.yml create mode 100644 backend/Dockerfile create mode 100644 frontend/Dockerfile create mode 100644 frontend/nginx.conf diff --git a/.woodpecker.yml b/.woodpecker.yml new file mode 100644 index 0000000..15c1899 --- /dev/null +++ b/.woodpecker.yml @@ -0,0 +1,30 @@ +when: + branch: main + event: push + +steps: + - name: build-backend + image: woodpeckerci/plugin-docker-buildx + settings: + repo: git.mikhailkilin.ru/killingdruid/bbb-backend + registry: git.mikhailkilin.ru + dockerfile: backend/Dockerfile + context: backend + tags: latest + username: + from_secret: gitea_username + password: + from_secret: gitea_password + + - name: build-frontend + image: woodpeckerci/plugin-docker-buildx + settings: + repo: git.mikhailkilin.ru/killingdruid/bbb-frontend + registry: git.mikhailkilin.ru + dockerfile: frontend/Dockerfile + context: frontend + tags: latest + username: + from_secret: gitea_username + password: + from_secret: gitea_password diff --git a/CLAUDE.md b/CLAUDE.md index 5990337..edf7e6c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,5 +1,7 @@ # Blood Brain Barrier +**Репозиторий:** https://git.mikhailkilin.ru/killingdruid/blood-brain-barrier + Веб-приложение для хранения текстовых записей. Пользователь вводит текст через textarea, сохраняет в PostgreSQL, просматривает список всех записей с возможностью удаления и копирования. ## Стек diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 0000000..9d78d9c --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,19 @@ +FROM rust:1.87 AS builder + +WORKDIR /app +COPY Cargo.toml Cargo.lock* ./ +COPY src/ src/ + +RUN cargo build --release + +FROM debian:bookworm-slim + +RUN apt-get update && apt-get install -y --no-install-recommends \ + libssl3 ca-certificates \ + && rm -rf /var/lib/apt/lists/* + +COPY --from=builder /app/target/release/backend /usr/local/bin/backend + +EXPOSE 3000 + +CMD ["backend"] diff --git a/frontend/Dockerfile b/frontend/Dockerfile new file mode 100644 index 0000000..6cbdc04 --- /dev/null +++ b/frontend/Dockerfile @@ -0,0 +1,16 @@ +FROM node:22-alpine AS builder + +WORKDIR /app +COPY package.json package-lock.json* ./ +RUN npm ci +COPY . . +RUN npm run build + +FROM nginx:alpine + +COPY --from=builder /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/conf.d/default.conf + +EXPOSE 80 + +CMD ["nginx", "-g", "daemon off;"] diff --git a/frontend/nginx.conf b/frontend/nginx.conf new file mode 100644 index 0000000..6d4bc96 --- /dev/null +++ b/frontend/nginx.conf @@ -0,0 +1,17 @@ +server { + listen 80; + server_name _; + + location / { + root /usr/share/nginx/html; + index index.html; + try_files $uri $uri/ /index.html; + } + + location /api/ { + proxy_pass http://bbb-backend.bbb.svc.cluster.local:3000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } +} diff --git a/frontend/src/api.ts b/frontend/src/api.ts index e86e774..58bb5de 100644 --- a/frontend/src/api.ts +++ b/frontend/src/api.ts @@ -1,4 +1,4 @@ -const API_URL = "http://localhost:3000/api"; +const API_URL = "/api"; export interface EntryMeta { id: number;