# Инструкция запуска Magistr

Ниже — минимальный порядок действий. Подробности по инфраструктуре и секретам находятся в
[`docs/INFRASTRUCTURE.md`](docs/INFRASTRUCTURE.md) и
[`docs/SECURITY_RUNBOOK.md`](docs/SECURITY_RUNBOOK.md).

## 1. Локальный запуск

Нужны Git, Docker Engine, Docker Compose и запущенный Caddy из `../сaddy-proxy/`.

1. В корне проекта создайте локальный файл настроек:

   ```bash
   cp .env.example .env
   openssl rand -base64 36   # значение POSTGRES_PASSWORD
   openssl rand -base64 48   # значение JWT_SECRET
   ```

   Вставьте полученные значения в `.env`. Файл `.env` не коммитьте.

2. Один раз создайте общую Docker-сеть, затем запустите Caddy и Magistr:

   ```bash
   docker network inspect proxy >/dev/null 2>&1 || docker network create proxy
   docker compose -f ../сaddy-proxy/compose.yaml up -d
   docker compose config --quiet
   docker compose up -d --build
   docker compose ps
   ```

3. Откройте `https://localhost` (`http://localhost` перенаправит на HTTPS). Проверьте backend
   через Caddy:

   ```bash
   curl -kfsS https://localhost/actuator/health/readiness
   ```

   Если браузер не доверяет локальному сертификату Caddy, на CachyOS/Arch выполните:

   ```bash
   docker cp caddy:/data/caddy/pki/authorities/local/root.crt /tmp/caddy-local-root.crt
   sudo trust anchor --store /tmp/caddy-local-root.crt
   ```

   До установки проверьте SHA-256 отпечаток командой
   `openssl x509 -in /tmp/caddy-local-root.crt -noout -fingerprint -sha256`, затем полностью
   перезапустите браузер.

   Для первого локального входа: `admin` / `admin`. Эти данные предназначены только для
   разработки.

4. Если запуск не удался:

   ```bash
   docker compose logs --tail=200 backend db frontend
   ```

   Полный локальный сброс БД выполняется командой `docker compose down -v`, но она удалит
   все локальные данные. Обычная остановка без удаления данных: `docker compose down`.

## 2. Первый запуск в production

1. Подготовьте K3s/Kubernetes-кластер и убедитесь, что `kubectl get nodes` работает.
   PostgreSQL в текущие манифесты не входит: заранее создайте доступную из кластера БД для
   каждого университета. Пользователь БД должен иметь права на создание и изменение схемы —
   Flyway применит `V1__init.sql` автоматически.

2. Настройте DNS для `magistr.zuev.company` и остальных tenant-доменов на публичный
   reverse proxy/Ingress. В текущем `../k8s/ingress.yaml` нет секции TLS: для HTTPS нужно
   настроить внешний Caddy с сертификатом либо добавить cert-manager/TLS в кластер.

3. Создайте namespace и четыре обязательных Secret по
   [`docs/SECURITY_RUNBOOK.md`](docs/SECURITY_RUNBOOK.md):

   - `app-secret`: `JWT_SECRET`, `POSTGRES_USER`, `POSTGRES_PASSWORD`;
   - `tenants-secret`: файл `tenants.json`;
   - `otel-postgres-secret`: подключения Collector к БД;
   - `gitea-registry`: доступ к приватным Docker-образам.

   Для `magistr.zuev.company` запись в `tenants.json` должна иметь `"domain": "magistr"`
   и реальный JDBC URL. Не сохраняйте значения Secret в Git или логах.

4. В Gitea Actions добавьте секреты `ZUEV_TOKEN` (доступ к registry) и
   `KUBECONFIG_DATA` (kubeconfig в Base64). Push в `main` соберёт, проверит и опубликует
   образы. При самом первом запуске автоматический deploy может ещё не найти Deployment —
   возьмите два опубликованных digest из CI/registry и выполните bootstrap вручную:

   ```bash
   export BACKEND_IMAGE_REF='gitea.zuev.company/zuev/magistr-backend@sha256:<digest>'
   export FRONTEND_IMAGE_REF='gitea.zuev.company/zuev/magistr-frontend@sha256:<digest>'
   K8S_DIR=../k8s bash scripts/check-production-secrets.sh
   K8S_DIR=../k8s bash scripts/check-artifact-pinning.sh
   kubectl kustomize ../k8s >/dev/null
   bash ../k8s/deploy.sh apply
   ```

5. Проверьте результат:

   ```bash
   bash ../k8s/deploy.sh status
   kubectl rollout status deployment/backend -n magistr --timeout=300s
   kubectl logs -n magistr -l app=backend --tail=200
   curl -fsS https://magistr.zuev.company/
   ```

   После первого входа немедленно смените/отключите все тестовые пароли из `V1__init.sql`.
   Следующие push в `main` CI/CD сможет развёртывать автоматически.

## 3. Что могу выполнить я

По вашей команде я могу подготовить `.env`, запустить и диагностировать локальный Compose,
проверить/исправить код и манифесты, прогнать тесты и dry-run Kubernetes, а при доступном
`kubectl` — проверить состояние кластера.

Без вас я не могу получить реальные пароли и токены, настроить DNS/сертификаты у внешнего
провайдера или войти в Gitea/Kubernetes, если доступы не предоставлены. Production deploy,
ротацию Secret и удаление БД я не выполняю без отдельного явного разрешения: это меняет
внешнюю систему и может прервать работу либо уничтожить данные.
