# bcard Персональная визитная карточка [mikhailkilin.ru](https://mikhailkilin.ru). ## Стек - **Rust** + [Axum](https://github.com/tokio-rs/axum) — HTTP-сервер - **Tokio** — асинхронный рантайм - **Docker** — multi-stage сборка (builder на `rust:1.75`, финальный образ на `debian:bookworm-slim`) - **Woodpecker CI** — автоматическая сборка и пуш Docker-образа в реестр `git.mikhailkilin.ru` ## Структура ``` . ├── src/ │ └── main.rs # HTTP-сервер, отдаёт HTML на / ├── k8s/ │ └── bcard.yaml # Kubernetes-манифест (Namespace, Deployment, Service, Ingress) ├── Cargo.toml # Зависимости: axum, tokio ├── Dockerfile # Multi-stage сборка └── .woodpecker.yml # CI-пайплайн ``` ## Запуск локально ```bash cargo run ``` Сервер стартует на `http://0.0.0.0:3000`. ## Сборка и запуск через Docker ```bash docker build -t bcard . docker run -p 3000:3000 bcard ``` ## CI/CD и деплой При пуше в репозиторий: 1. **Woodpecker CI** собирает Docker-образ и пушит в `git.mikhailkilin.ru/killingdruid/bcard:latest` 2. **ArgoCD** подхватывает манифесты из `k8s/` и деплоит на кластер Для работы пайплайна в настройках репозитория Woodpecker должны быть заданы секреты `docker_username` и `docker_password`. ## Инфраструктура Сервис разворачивается на K3s-кластере (`k8s/bcard.yaml`): - **Namespace:** `bcard` - **Deployment:** 1 реплика, образ из Gitea-реестра - **Service:** ClusterIP, порт 80 → 3000 - **Ingress:** `mikhailkilin.ru`, TLS через cert-manager (Let's Encrypt)