Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2f1bdec676 | |||
| f3ae249ab1 | |||
| b5f31542a2 |
@@ -23,7 +23,7 @@ env:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
test:
|
test:
|
||||||
if: github.event_name == 'workflow_dispatch'
|
if: github.event_name == 'workflow_dispatch' || startsWith(github.ref, 'refs/tags/docs-v')
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
@@ -56,7 +56,7 @@ jobs:
|
|||||||
echo "version=$(echo "$TAG" | sed -E 's/docs-v([0-9.]+).*/\1/')" >> "$GITHUB_OUTPUT"
|
echo "version=$(echo "$TAG" | sed -E 's/docs-v([0-9.]+).*/\1/')" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
build-and-push:
|
build-and-push:
|
||||||
needs: [parse-tag]
|
needs: [test, parse-tag]
|
||||||
if: startsWith(github.ref, 'refs/tags/docs-v')
|
if: startsWith(github.ref, 'refs/tags/docs-v')
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
@@ -97,15 +97,18 @@ jobs:
|
|||||||
git config user.email "ci-bot@sova.local"
|
git config user.email "ci-bot@sova.local"
|
||||||
git config user.name "sova-ci"
|
git config user.name "sova-ci"
|
||||||
MAX_RETRIES=5
|
MAX_RETRIES=5
|
||||||
bump_values() {
|
case "$(uname -m)" in
|
||||||
local file="apps/docs/values-${ENV}.yaml"
|
x86_64|amd64) YQ_ARCH=amd64 ;;
|
||||||
sed -i "s|^ repository:.*| repository: ${IMAGE_DEPLOY}|" "$file"
|
aarch64|arm64) YQ_ARCH=arm64 ;;
|
||||||
sed -i "s|^ tag:.*| tag: ${TAG}|" "$file"
|
*) echo "Unsupported arch: $(uname -m)"; exit 1 ;;
|
||||||
sed -i "s|^ pullPolicy:.*| pullPolicy: IfNotPresent|" "$file"
|
esac
|
||||||
}
|
curl -sSL -o /usr/local/bin/yq "https://github.com/mikefarah/yq/releases/download/v4.44.3/yq_linux_${YQ_ARCH}"
|
||||||
|
chmod +x /usr/local/bin/yq
|
||||||
for attempt in $(seq 1 $MAX_RETRIES); do
|
for attempt in $(seq 1 $MAX_RETRIES); do
|
||||||
git pull --rebase origin "${ENV}"
|
git pull --rebase origin "${ENV}"
|
||||||
bump_values
|
yq -i ".image.repository = \"${IMAGE_DEPLOY}\"" "apps/docs/values-${ENV}.yaml"
|
||||||
|
yq -i ".image.tag = \"${TAG}\"" "apps/docs/values-${ENV}.yaml"
|
||||||
|
yq -i ".image.pullPolicy = \"IfNotPresent\"" "apps/docs/values-${ENV}.yaml"
|
||||||
git add "apps/docs/values-${ENV}.yaml"
|
git add "apps/docs/values-${ENV}.yaml"
|
||||||
git diff --cached --quiet && { echo "No changes"; exit 0; }
|
git diff --cached --quiet && { echo "No changes"; exit 0; }
|
||||||
git commit -m "chore(docs): bump ${ENV} to ${TAG}"
|
git commit -m "chore(docs): bump ${ENV} to ${TAG}"
|
||||||
|
|||||||
@@ -93,6 +93,7 @@ export default defineConfig({
|
|||||||
items: [
|
items: [
|
||||||
{ text: 'Docker Compose', link: '/infrastructure/docker' },
|
{ text: 'Docker Compose', link: '/infrastructure/docker' },
|
||||||
{ text: 'K8s + Terraform + ArgoCD + Gitea', link: '/infrastructure/k8s-cicd-platform-plan' },
|
{ text: 'K8s + Terraform + ArgoCD + Gitea', link: '/infrastructure/k8s-cicd-platform-plan' },
|
||||||
|
{ text: 'Автотестирование (issues/27-test)', link: '/infrastructure/autotesting' },
|
||||||
{ text: 'Backend: внешние сервисы (test/stage/prod)', link: '/infrastructure/backend-external-services' },
|
{ text: 'Backend: внешние сервисы (test/stage/prod)', link: '/infrastructure/backend-external-services' },
|
||||||
{
|
{
|
||||||
text: 'Локальная ферма k8s (Multipass)',
|
text: 'Локальная ферма k8s (Multipass)',
|
||||||
@@ -119,8 +120,6 @@ export default defineConfig({
|
|||||||
{ text: 'ArgoCD: приложения', link: '/infrastructure/test-contour/guides/argocd' },
|
{ text: 'ArgoCD: приложения', link: '/infrastructure/test-contour/guides/argocd' },
|
||||||
{ text: 'Grafana / Prometheus / Loki', link: '/infrastructure/test-contour/guides/monitoring' },
|
{ text: 'Grafana / Prometheus / Loki', link: '/infrastructure/test-contour/guides/monitoring' },
|
||||||
{ text: 'Redmine', link: '/infrastructure/test-contour/guides/redmine' },
|
{ text: 'Redmine', link: '/infrastructure/test-contour/guides/redmine' },
|
||||||
{ text: 'CLOUD-SITE-TEST-01 (удалённый сервер)', link: '/infrastructure/test-contour/cloud-site-test-01' },
|
|
||||||
{ text: 'Как развернуть (пошагово)', link: '/infrastructure/test-contour/deploy-walkthrough' },
|
|
||||||
{ text: 'Что сделано + перенос на сервер', link: '/infrastructure/test-contour/test-contour-article' },
|
{ text: 'Что сделано + перенос на сервер', link: '/infrastructure/test-contour/test-contour-article' },
|
||||||
{ text: 'Git-flow: ветки и релизы', link: '/infrastructure/test-contour/git-flow' },
|
{ text: 'Git-flow: ветки и релизы', link: '/infrastructure/test-contour/git-flow' },
|
||||||
{ text: 'Система тегов CI/CD', link: '/infrastructure/test-contour/tags' },
|
{ text: 'Система тегов CI/CD', link: '/infrastructure/test-contour/tags' },
|
||||||
|
|||||||
@@ -0,0 +1,107 @@
|
|||||||
|
# Автотестирование Sova
|
||||||
|
|
||||||
|
Ветка внедрения: **`issues/27-test`** в репозиториях `k8s/sova-*`.
|
||||||
|
|
||||||
|
## Правило по контурам
|
||||||
|
|
||||||
|
| Контур (тег) | Тесты в CI | E2E |
|
||||||
|
|--------------|------------|-----|
|
||||||
|
| **`*-test`** | Unit + integration (backend), Jest (adminpanel), PHPUnit (cabinet) | Smoke + full (Playwright, mocks) |
|
||||||
|
| **`*-stage`** | То же pre-deploy | Только smoke read-only |
|
||||||
|
| **`*-prod`** | **Нет** автотестов | **Нет** |
|
||||||
|
|
||||||
|
Тесты **никогда** не гоняются на production-окружении. Запуск привязан к git-тегам `backend-v*`, `adminpanel-v*`, … в Gitea Actions.
|
||||||
|
|
||||||
|
## Пирамида
|
||||||
|
|
||||||
|
### 1. Backend (`sova-backend`)
|
||||||
|
|
||||||
|
- **Инструменты:** PHPUnit 12, Zenstruck Foundry (далее).
|
||||||
|
- **Unit:** `tests/Unit`, `tests/Service` — без БД.
|
||||||
|
- **Integration:** `tests/Controller`, `tests/Integration` — с PostgreSQL в CI (только тег `*-test`, `continue-on-error` на старте).
|
||||||
|
- **Логи E2E:** `App\Log\TestTraceProcessor` — заголовки `X-Is-Auto-Test`, `X-Test-Trace-Id` → `extra.is_test`, `extra.test_trace_id` в Loki.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
composer phpunit:unit
|
||||||
|
composer phpunit:coverage # var/coverage/clover.xml
|
||||||
|
```
|
||||||
|
|
||||||
|
**CI:** `.gitea/workflows/build.yml` — job `test` на `test|stage`, артефакт `backend-coverage-*` (14 дней).
|
||||||
|
|
||||||
|
### 2. adminPanel (`sova-adminpanel`)
|
||||||
|
|
||||||
|
- **Инструменты:** Jest + React Testing Library (миграция на Vitest — в roadmap).
|
||||||
|
- **CI:** `npm run test:ci` (coverage lcov), lint, build до образа.
|
||||||
|
|
||||||
|
### 3. E2E (`sova-e2e`)
|
||||||
|
|
||||||
|
- **Инструменты:** Playwright.
|
||||||
|
- **Проекты:** `smoke-readonly` (stage), `full-e2e` (test, сценарии в `tests/e2e/`).
|
||||||
|
- **CI:** `.gitea/workflows/e2e-tests.yml` — `workflow_dispatch` или тег `e2e-v*-*`.
|
||||||
|
|
||||||
|
Локально:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd k8s/sova-e2e
|
||||||
|
npm install && npx playwright install chromium
|
||||||
|
export API_BASE_URL=http://192.168.252.6 API_HOST=api.test.sova.local
|
||||||
|
npm run test:smoke
|
||||||
|
```
|
||||||
|
|
||||||
|
## Loki (Grafana Explore)
|
||||||
|
|
||||||
|
После деплоя с прогоном E2E:
|
||||||
|
|
||||||
|
```logql
|
||||||
|
{namespace="sova-test"} | json | extra_is_test="true" | extra_test_trace_id="<GITHUB_RUN_ID>"
|
||||||
|
```
|
||||||
|
|
||||||
|
## CI/CD: две фазы
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart LR
|
||||||
|
tag[Git tag *-test] --> pre[Pre-deploy: unit/coverage]
|
||||||
|
pre --> build[Build image]
|
||||||
|
build --> deploy[sova-deploy GitOps]
|
||||||
|
deploy --> e2e[Post-deploy: sova-e2e]
|
||||||
|
```
|
||||||
|
|
||||||
|
1. **Pre-deploy** — в workflow каждого приложения (`build.yml`).
|
||||||
|
2. **Post-deploy** — репозиторий `sova-e2e`, ожидание Argo CD (`scripts/wait-for-argocd.sh`), отчёт Playwright HTML в artifacts.
|
||||||
|
|
||||||
|
## Проверка деплоя на test (локальная ферма)
|
||||||
|
|
||||||
|
После `./scripts/release-tag.sh backend backend-v1.0.6-test test` (и аналоги для adminpanel, cabinet, docs):
|
||||||
|
|
||||||
|
| Проверка | Команда / URL |
|
||||||
|
|----------|----------------|
|
||||||
|
| Образы в кластере | `kubectl get deploy -n sova-test` → теги `*-v1.0.x-test` |
|
||||||
|
| API smoke | `curl -H "Host: api.test.sova.local" http://192.168.252.6/news/list` |
|
||||||
|
| admin login | `curl -H "Host: admin.test.sova.local" http://192.168.252.6/login` |
|
||||||
|
| Docs | `curl -H "Host: docs.sova.local" http://192.168.252.6/` (или `docs.test.sova.local` после sync ingress) |
|
||||||
|
| Playwright | `cd sova-e2e && npm run test:smoke` |
|
||||||
|
|
||||||
|
Gitea Actions: артефакты `backend-coverage-*`, `adminpanel-coverage-*` (14 дней).
|
||||||
|
|
||||||
|
## Покрытие (test contour)
|
||||||
|
|
||||||
|
При теге `backend-v1.0.x-test` / `adminpanel-v1.0.x-test` в Gitea Actions → **Artifacts**:
|
||||||
|
|
||||||
|
- `backend-coverage-<tag>/` — Clover + HTML
|
||||||
|
- `adminpanel-coverage-<tag>/` — lcov
|
||||||
|
|
||||||
|
Просмотр: скачать артефакт job `test` или открыть summary в логе (`coverage` text-summary).
|
||||||
|
|
||||||
|
## Дорожная карта
|
||||||
|
|
||||||
|
| Месяц | Задачи |
|
||||||
|
|-------|--------|
|
||||||
|
| **1** (текущая ветка) | PHPUnit unit + coverage, Jest CI, TestTraceProcessor, sova-e2e smoke, документация |
|
||||||
|
| **2** | PG в runner, миграции, SpecialistRepository integration; 3 smoke в пайплайне |
|
||||||
|
| **3** | Full E2E JWT/CRUD/запись; nightly test; Telegram alerts |
|
||||||
|
|
||||||
|
## Связанные страницы
|
||||||
|
|
||||||
|
- [CI/CD и Loki (local-k8s)](./local-k8s/ci-and-logs)
|
||||||
|
- [Gitea CI (test-contour)](./test-contour/guides/gitea-ci)
|
||||||
|
- [Backend content CRUD](../apps/backend-content-crud)
|
||||||
@@ -9,6 +9,7 @@
|
|||||||
| [CI/CD и Loki](./ci-and-logs) | теги, registry, Grafana Explore |
|
| [CI/CD и Loki](./ci-and-logs) | теги, registry, Grafana Explore |
|
||||||
| [Чеклист проверки](./checklist-verify) | smoke после поднятия |
|
| [Чеклист проверки](./checklist-verify) | smoke после поднятия |
|
||||||
| [Git-flow (кратко)](./git-flow) | ветки, теги → [полная версия](../test-contour/git-flow) |
|
| [Git-flow (кратко)](./git-flow) | ветки, теги → [полная версия](../test-contour/git-flow) |
|
||||||
|
| [Автотестирование](../autotesting) | ветка `issues/27-test`, CI, coverage, Playwright |
|
||||||
|
|
||||||
План платформы: [K8s + Terraform + ArgoCD](../k8s-cicd-platform-plan).
|
План платформы: [K8s + Terraform + ArgoCD](../k8s-cicd-platform-plan).
|
||||||
|
|
||||||
|
|||||||
@@ -1,286 +0,0 @@
|
|||||||
# CLOUD-SITE-TEST-01: удалённый test-контур SOVA
|
|
||||||
|
|
||||||
Полное описание развёртывания test-песочницы на сервере **CLOUD-SITE-TEST-01**: сеть, домены, TLS, basic auth, платформа, приложения, CI/CD и мониторинг.
|
|
||||||
|
|
||||||
## Сводка
|
|
||||||
|
|
||||||
| Параметр | Значение |
|
|
||||||
|----------|----------|
|
|
||||||
| Сервер | `CLOUD-SITE-TEST-01` |
|
|
||||||
| ОС / k3s | Linux, k3s v1.30+ (single-node) |
|
|
||||||
| RAM | 12 GB (+ swap 8 GB) |
|
|
||||||
| VPN / SSH / kubectl | `10.0.186.3` |
|
|
||||||
| Публичный IP (DNS) | `46.243.172.227` |
|
|
||||||
| Базовый домен | `dev.sovamed.ru` |
|
|
||||||
| TLS | Let's Encrypt (cert-manager, HTTP-01) |
|
|
||||||
| GitOps | ArgoCD → Gitea `sova/sova-deploy` branch `test` |
|
|
||||||
| CI | Gitea Actions + runner in-cluster |
|
|
||||||
| Защита периметра | nginx ingress basic auth (все публичные URL) |
|
|
||||||
|
|
||||||
## Схема
|
|
||||||
|
|
||||||
```mermaid
|
|
||||||
flowchart TB
|
|
||||||
Internet["Internet / VPN"]
|
|
||||||
DNS["DNS *.dev.sovamed.ru → 46.243.172.227"]
|
|
||||||
LB["ingress-nginx LoadBalancer :80/:443"]
|
|
||||||
Auth["Basic Auth + TLS"]
|
|
||||||
Apps["Apps: api, adm, cabinet, docs"]
|
|
||||||
Plat["Platform: git, argocd, grafana"]
|
|
||||||
Data["PostgreSQL, MySQL, Redis"]
|
|
||||||
CI["Gitea Actions → registry → GitOps"]
|
|
||||||
|
|
||||||
Internet --> DNS --> LB --> Auth
|
|
||||||
Auth --> Apps
|
|
||||||
Auth --> Plat
|
|
||||||
Apps --> Data
|
|
||||||
CI --> Plat
|
|
||||||
Plat --> Apps
|
|
||||||
```
|
|
||||||
|
|
||||||
## Сеть и доступ
|
|
||||||
|
|
||||||
### Два «мира» адресации
|
|
||||||
|
|
||||||
- **Из VPN / офисной сети:** SSH и `kubectl` на `10.0.186.3` (см. `k3s/remote.env`).
|
|
||||||
- **Из интернета:** браузер и DNS на `46.243.172.227` — A-записи `*.dev.sovamed.ru`.
|
|
||||||
|
|
||||||
Kubeconfig локально: `~/.kube/config-sova-remote-test`.
|
|
||||||
|
|
||||||
### /etc/hosts (опционально)
|
|
||||||
|
|
||||||
Если DNS ещё не резолвится, добавьте на рабочую машину:
|
|
||||||
|
|
||||||
```
|
|
||||||
46.243.172.227 git.dev.sovamed.ru argocd.dev.sovamed.ru grafana.dev.sovamed.ru
|
|
||||||
46.243.172.227 api.dev.sovamed.ru adm.dev.sovamed.ru cabinet.dev.sovamed.ru docs.dev.sovamed.ru
|
|
||||||
```
|
|
||||||
|
|
||||||
На ноде k3s для pull образов: `10.0.186.3 git.dev.sovamed.ru git.sova.local` → registry mirror.
|
|
||||||
|
|
||||||
## Домены и сервисы
|
|
||||||
|
|
||||||
| URL | Назначение | Namespace |
|
|
||||||
|-----|------------|-----------|
|
|
||||||
| https://git.dev.sovamed.ru | Gitea + Container Registry + Actions | `gitea` |
|
|
||||||
| https://argocd.dev.sovamed.ru | ArgoCD UI | `argocd` |
|
|
||||||
| https://grafana.dev.sovamed.ru | Grafana (метрики + Loki) | `monitoring` |
|
|
||||||
| https://api.dev.sovamed.ru | Backend API | `sova-test` |
|
|
||||||
| https://adm.dev.sovamed.ru | Admin Panel | `sova-test` |
|
|
||||||
| https://cabinet.dev.sovamed.ru | Cabinet (ЛК) | `sova-test` |
|
|
||||||
| https://docs.dev.sovamed.ru | Документация (VitePress) | `sova-test` |
|
|
||||||
|
|
||||||
Redmine на этом контуре **отключён** (`SKIP_REDMINE=1`).
|
|
||||||
|
|
||||||
## TLS (Let's Encrypt)
|
|
||||||
|
|
||||||
1. **cert-manager** в namespace `cert-manager`.
|
|
||||||
2. **ClusterIssuer** `letsencrypt-prod` — HTTP-01 через ingress-nginx.
|
|
||||||
3. На каждом Ingress: annotation `cert-manager.io/cluster-issuer: letsencrypt-prod` + блок `tls`.
|
|
||||||
4. **Требование:** порт **80** с интернета до `46.243.172.227` (ACME challenge).
|
|
||||||
|
|
||||||
Подробнее: `k3s/TLS.md`.
|
|
||||||
|
|
||||||
Проверка сертификатов:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
kubectl get certificate -A
|
|
||||||
curl -vI https://api.dev.sovamed.ru 2>&1 | grep subject
|
|
||||||
```
|
|
||||||
|
|
||||||
## Basic Auth на ingress (периметр)
|
|
||||||
|
|
||||||
Все публичные URL закрыты **HTTP Basic Auth** на уровне **ingress-nginx** (LoadBalancer 80/443).
|
|
||||||
|
|
||||||
| Параметр | Значение |
|
|
||||||
|----------|----------|
|
|
||||||
| Логин | `sova-contour` |
|
|
||||||
| Пароль | см. `k8s/.generated/platform-credentials.env` → `BASIC_AUTH_PASS` |
|
|
||||||
| Secret в кластере | `contour-basic-auth` (ключ `auth`, формат htpasswd) |
|
|
||||||
| Namespaces | `argocd`, `gitea`, `monitoring`, `sova-test` |
|
|
||||||
|
|
||||||
### Поведение
|
|
||||||
|
|
||||||
1. Браузер запрашивает **basic auth** (периметр).
|
|
||||||
2. Затем — логин приложения (Gitea, ArgoCD, Grafana, API и т.д.).
|
|
||||||
|
|
||||||
Чтобы CI/CD и `git push` работали без Basic в заголовке `Authorization`, для **git.dev.sovamed.ru** используются **два Ingress**:
|
|
||||||
|
|
||||||
| Ingress | Пути | Basic auth |
|
|
||||||
|---------|------|------------|
|
|
||||||
| `gitea-api` | `/api`, `/v2`, `/sova`, `/.well-known/acme-challenge` | нет |
|
|
||||||
| `gitea` | `/` (веб-UI) | да |
|
|
||||||
|
|
||||||
### Управление
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Создать/обновить секреты (пароль из platform-credentials.env)
|
|
||||||
./scripts/bootstrap-ingress-basic-auth.sh
|
|
||||||
|
|
||||||
# Применить аннотации на platform ingress
|
|
||||||
ENABLE_TLS=1 GITEA_DOMAIN=git.dev.sovamed.ru \
|
|
||||||
ARGOCD_DOMAIN=argocd.dev.sovamed.ru \
|
|
||||||
GRAFANA_DOMAIN=grafana.dev.sovamed.ru \
|
|
||||||
./scripts/deploy-platform-ingress.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
Приложения (api, adm, cabinet, docs): GitOps через `values-test.yaml` → `ingress.basicAuth.enabled: true`.
|
|
||||||
|
|
||||||
## Платформенный стек
|
|
||||||
|
|
||||||
Устанавливается `k8s/scripts/deploy-platform-remote.sh`:
|
|
||||||
|
|
||||||
| Компонент | Helm chart | Namespace |
|
|
||||||
|-----------|------------|-----------|
|
|
||||||
| ingress-nginx | ingress-nginx | `ingress` |
|
|
||||||
| cert-manager | cert-manager | `cert-manager` |
|
|
||||||
| sealed-secrets | sealed-secrets | `kube-system` |
|
|
||||||
| ArgoCD | argo-cd | `argocd` |
|
|
||||||
| Prometheus + Grafana | kube-prometheus-stack | `monitoring` |
|
|
||||||
| Loki + Promtail | loki-stack | `monitoring` |
|
|
||||||
| Gitea + Registry + Actions | gitea | `gitea` |
|
|
||||||
|
|
||||||
Lite-профиль для 12 GB: `sova-deploy/platform/monitoring/values-lite-12gb.yaml`.
|
|
||||||
|
|
||||||
**Grafana + Loki:** datasource Loki подключается через `grafana.additionalDataSources` в Helm (не отдельный ConfigMap — иначе Grafana 13 падает). Explore → Loki → `{namespace="sova-test"}`.
|
|
||||||
|
|
||||||
## Приложения и данные
|
|
||||||
|
|
||||||
ArgoCD ApplicationSet `test-contour` (`sova-deploy/argocd/apps/test-contour.yaml`):
|
|
||||||
|
|
||||||
| App | Helm path | Namespace |
|
|
||||||
|-----|-----------|-----------|
|
|
||||||
| backend-test | `apps/backend` | `sova-test` |
|
|
||||||
| adminpanel-test | `apps/adminpanel` | `sova-test` |
|
|
||||||
| cabinet-test | `apps/cabinet` | `sova-test` |
|
|
||||||
| docs-test | `apps/docs` | `sova-test` |
|
|
||||||
| data-test | `data/test` | `sova-data-test` |
|
|
||||||
| mocks-test | `apps/mocks` | `sova-mocks` |
|
|
||||||
|
|
||||||
Базы: PostgreSQL (backend + cabinet), MySQL (Bitrix stub), Redis. Пароли — в `platform-credentials.env` и `sova-deploy/data/test/values.yaml` (GitOps).
|
|
||||||
|
|
||||||
### Тестовые пользователи приложений
|
|
||||||
|
|
||||||
| Сервис | Логин | Пароль (test seed) |
|
|
||||||
|--------|-------|---------------------|
|
|
||||||
| Admin Panel | `local.backend@example.test` | см. `APP_ADMIN_PASS` |
|
|
||||||
| Cabinet | `local.cabinet@example.test` | см. `APP_CABINET_PASS` |
|
|
||||||
|
|
||||||
Admin Panel ходит в API `https://api.dev.sovamed.ru` (runtime `env.js` + `runtimeEnv.API_BASE_URL` в Helm).
|
|
||||||
|
|
||||||
## CI/CD и теги
|
|
||||||
|
|
||||||
### Git-flow
|
|
||||||
|
|
||||||
- Ветки: `prod`, `test`, `stage`, `issues/27-*`
|
|
||||||
- Test-контур деплоится с ветки **`test`** репозиториев и `sova-deploy`.
|
|
||||||
|
|
||||||
### Формат тега
|
|
||||||
|
|
||||||
```
|
|
||||||
{component}-v{semver}-{env}
|
|
||||||
```
|
|
||||||
|
|
||||||
Примеры: `backend-v1.0.13-test`, `docs-v1.0.14-test`.
|
|
||||||
|
|
||||||
### Pipeline (Gitea Actions)
|
|
||||||
|
|
||||||
1. Push тега `*-test` → workflow `build.yml`
|
|
||||||
2. Docker build → push в Gitea Registry (`git.sova.local/sova/{repo}`)
|
|
||||||
3. Job `deploy-gitops` обновляет `apps/{repo}/values-test.yaml` в `sova-deploy`
|
|
||||||
4. ArgoCD sync → rollout pods
|
|
||||||
|
|
||||||
Релиз с локальной машины:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
export KUBECONFIG=~/.kube/config-sova-remote-test
|
|
||||||
export VM_IP=10.0.186.3 GITEA_SCHEME=https GITEA_HTTP_PORT=443 GITEA_INSECURE_TLS=1
|
|
||||||
export GITEA_HOST=git.dev.sovamed.ru
|
|
||||||
|
|
||||||
./scripts/release-tag.sh docs docs-v1.0.14-test
|
|
||||||
```
|
|
||||||
|
|
||||||
## Bootstrap с нуля
|
|
||||||
|
|
||||||
Оркестратор: `k3s/scripts/bootstrap-remote-test.sh` (читает `k3s/remote.env`).
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd k3s
|
|
||||||
cp remote.env.example remote.env # заполнить SSH, домены
|
|
||||||
./scripts/bootstrap-remote-test.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
Основные шаги:
|
|
||||||
|
|
||||||
1. k3s на сервере, swap, kubeconfig
|
|
||||||
2. Platform (ingress, cert-manager, Gitea, ArgoCD, monitoring)
|
|
||||||
3. **basic auth** + platform ingress
|
|
||||||
4. Gitea org/repos, CI runner, registry mirror
|
|
||||||
5. ArgoCD apps, TLS issuers, sync test-contour
|
|
||||||
6. (опционально) push тегов приложений
|
|
||||||
|
|
||||||
Повторный bootstrap с середины: `BOOTSTRAP_FROM_STEP=4` в `remote.env`.
|
|
||||||
|
|
||||||
## Креды и секреты
|
|
||||||
|
|
||||||
Файл **`k8s/.generated/platform-credentials.env`** (не в git):
|
|
||||||
|
|
||||||
| Переменная | Назначение |
|
|
||||||
|------------|------------|
|
|
||||||
| `GITEA_ADMIN` / `GITEA_ADMIN_PASS` | Gitea admin |
|
|
||||||
| `ARGOCD_PASS` | ArgoCD admin |
|
|
||||||
| `GRAFANA_PASS` | Grafana admin |
|
|
||||||
| `BASIC_AUTH_USER` / `BASIC_AUTH_PASS` | Периметр ingress |
|
|
||||||
| `PG_PASS`, `MYSQL_*`, `REDIS_PASS` | Базы данных |
|
|
||||||
| `APP_ADMIN_PASS`, `APP_CABINET_PASS` | Seed-пользователи |
|
|
||||||
|
|
||||||
Печать: `./scripts/print-credentials.sh`
|
|
||||||
|
|
||||||
## Мониторинг и логи
|
|
||||||
|
|
||||||
- **Grafana:** https://grafana.dev.sovamed.ru — дашборды kube-prometheus
|
|
||||||
- **Loki:** Explore → `{namespace="sova-test"}` | `{namespace="gitea"}`
|
|
||||||
- **Prometheus:** in-cluster `kube-prometheus-kube-prome-prometheus.monitoring:9090` (публичный ingress не настроен)
|
|
||||||
|
|
||||||
## Типовые операции
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Kubeconfig
|
|
||||||
export KUBECONFIG=~/.kube/config-sova-remote-test
|
|
||||||
|
|
||||||
# Статус ArgoCD apps
|
|
||||||
kubectl get applications -n argocd
|
|
||||||
|
|
||||||
# Sync вручную
|
|
||||||
kubectl annotate application backend-test -n argocd argocd.argoproj.io/refresh=hard --overwrite
|
|
||||||
|
|
||||||
# Логи backend
|
|
||||||
kubectl logs -n sova-test deploy/backend -c php-fpm --tail=50
|
|
||||||
|
|
||||||
# Обновить basic auth пароль
|
|
||||||
# 1) правка BASIC_AUTH_PASS в platform-credentials.env
|
|
||||||
# 2) ./scripts/bootstrap-ingress-basic-auth.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
## Отличия от локальной Multipass-фермы
|
|
||||||
|
|
||||||
| | Локально (Multipass) | CLOUD-SITE-TEST-01 |
|
|
||||||
|--|----------------------|---------------------|
|
|
||||||
| Домены | `*.sova.local`, NodePort | `*.dev.sovamed.ru`, LB 443 |
|
|
||||||
| TLS | часто self-signed / off | Let's Encrypt |
|
|
||||||
| Basic auth | нет | да (ingress) |
|
|
||||||
| Redmine | опционально | выключен |
|
|
||||||
| IP | VM Multipass | 46.243.172.227 / VPN 10.0.186.3 |
|
|
||||||
|
|
||||||
## Связанные документы
|
|
||||||
|
|
||||||
- [Git-flow и теги](./git-flow.md)
|
|
||||||
- [Система тегов CI/CD](./tags.md)
|
|
||||||
- [Gitea CI](./guides/gitea-ci.md)
|
|
||||||
- [ArgoCD apps](./guides/argocd.md)
|
|
||||||
- [Grafana / Loki](./guides/monitoring.md)
|
|
||||||
- [k3s/TLS.md](https://github.com/sova/k3s/TLS.md) — в репозитории `k3s/TLS.md`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
*Документ актуален для контура CLOUD-SITE-TEST-01 (июнь 2026). Обновление docs: тег `docs-v*-test` → CI → https://docs.dev.sovamed.ru*
|
|
||||||
@@ -1,356 +0,0 @@
|
|||||||
# Как развернуть test-контур на CLOUD-SITE-TEST-01
|
|
||||||
|
|
||||||
Пошаговый рассказ: что делали при переносе песочницы с локальной Multipass-VM на удалённый сервер **CLOUD-SITE-TEST-01** (`dev.sovamed.ru`). Для справочника по архитектуре см. [CLOUD-SITE-TEST-01](./cloud-site-test-01.md), для общего плана — [`k3s/DEPLOY.md`](../../../../k3s/DEPLOY.md).
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 0. Что было до этого
|
|
||||||
|
|
||||||
Локально крутилась **Multipass-ферма** (`vm-k8s-git`, `*.sova.local`, NodePort). Для общего test-контура на железе решили:
|
|
||||||
|
|
||||||
- один сервер, один **k3s**;
|
|
||||||
- публичные домены **`*.dev.sovamed.ru`**;
|
|
||||||
- **Let's Encrypt** вместо self-signed;
|
|
||||||
- **без Redmine** (экономия RAM);
|
|
||||||
- CI/CD и GitOps — как на локалке: Gitea → ArgoCD → Helm.
|
|
||||||
|
|
||||||
Исходники лежат в монорепо: оркестрация в **`k3s/`**, приложения и Helm — в **`k8s/`**.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 1. Подготовка сервера и DNS
|
|
||||||
|
|
||||||
### Сервер
|
|
||||||
|
|
||||||
| | |
|
|
||||||
|--|--|
|
|
||||||
| Имя | CLOUD-SITE-TEST-01 |
|
|
||||||
| Публичный IP | `46.243.172.227` |
|
|
||||||
| VPN / SSH / kubectl | `10.0.186.3` |
|
|
||||||
| Пользователь | `petrov` |
|
|
||||||
| RAM | 12 GB (+ swap 8 GB) |
|
|
||||||
|
|
||||||
### DNS
|
|
||||||
|
|
||||||
A-записи на **`46.243.172.227`**:
|
|
||||||
|
|
||||||
```
|
|
||||||
git.dev.sovamed.ru
|
|
||||||
argocd.dev.sovamed.ru
|
|
||||||
grafana.dev.sovamed.ru
|
|
||||||
api.dev.sovamed.ru
|
|
||||||
adm.dev.sovamed.ru
|
|
||||||
cabinet.dev.sovamed.ru
|
|
||||||
docs.dev.sovamed.ru
|
|
||||||
```
|
|
||||||
|
|
||||||
Порт **80** с интернета обязателен — без него Let's Encrypt (HTTP-01) не выпустит сертификаты.
|
|
||||||
|
|
||||||
### VPN
|
|
||||||
|
|
||||||
SSH и `kubectl` с рабочей машины — через VPN на **`10.0.186.3`**. Браузер — на публичные URL через DNS.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 2. Настройка на Mac
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd k3s
|
|
||||||
cp remote.env.example remote.env
|
|
||||||
```
|
|
||||||
|
|
||||||
Заполнил **`remote.env`** (главное):
|
|
||||||
|
|
||||||
```bash
|
|
||||||
SERVER_IP=10.0.186.3 # VPN для SSH/kubectl
|
|
||||||
BASE_DOMAIN=dev.sovamed.ru
|
|
||||||
GITEA_DOMAIN=git.dev.sovamed.ru
|
|
||||||
API_DOMAIN=api.dev.sovamed.ru
|
|
||||||
# ... остальные домены
|
|
||||||
ENABLE_TLS=1
|
|
||||||
LETSENCRYPT_EMAIL=devops@sovamed.ru
|
|
||||||
CLUSTER_ISSUER=letsencrypt-prod
|
|
||||||
SWAP_GB=8
|
|
||||||
SKIP_REDMINE=1
|
|
||||||
KUBECONFIG_PATH=~/.kube/config-sova-remote-test
|
|
||||||
```
|
|
||||||
|
|
||||||
SSH-пароль и sudo — в `remote.env` (или ключ). **SSH-пароль на сервере потом не меняли** — только сервисные креды в k8s.
|
|
||||||
|
|
||||||
Права на скрипты:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
chmod +x scripts/*.sh scripts/lib/*.sh
|
|
||||||
chmod +x ../k8s/scripts/*.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
Проверка:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
ssh petrov@10.0.186.3
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 3. Автоматический bootstrap (основной прогон)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd k3s
|
|
||||||
./scripts/bootstrap-remote-test.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
Скрипт **`bootstrap-remote-test.sh`** по шагам:
|
|
||||||
|
|
||||||
| Шаг | Что происходит |
|
|
||||||
|-----|----------------|
|
|
||||||
| **1** | На сервере: swap 8 GB, apt, установка **k3s** (`--disable traefik`), скачивание **kubeconfig** на Mac |
|
|
||||||
| **2** | Platform: ingress-nginx (LB 80/443), cert-manager, sealed-secrets, ArgoCD, Prometheus/Grafana, Loki, Gitea; **basic auth** + ingress для git/argocd/grafana |
|
|
||||||
| **3** | Gitea: org `sova`, push репозиториев (backend, adminpanel, cabinet, docs, sova-deploy, sova-mocks) |
|
|
||||||
| **4** | Gitea Actions runner, CI secrets, **registries.yaml** на ноде для pull образов |
|
|
||||||
| **5** | PostgreSQL, MySQL, Redis, WireMock/Mailpit, db-init |
|
|
||||||
| **6** | ArgoCD: project, test-contour apps, ожидание Healthy |
|
|
||||||
| **7** | TLS: ClusterIssuer Let's Encrypt, выпуск сертификатов |
|
|
||||||
| **8** | Итог: список URL и паролей |
|
|
||||||
|
|
||||||
Если упало на середине — продолжить:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
BOOTSTRAP_FROM_STEP=4 ./scripts/bootstrap-remote-test.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
Kubeconfig после шага 1:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
export KUBECONFIG=~/.kube/config-sova-remote-test
|
|
||||||
kubectl get nodes
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 4. Что правили после bootstrap
|
|
||||||
|
|
||||||
Автомат не покрывает всё — ниже реальные доработки на этом контуре.
|
|
||||||
|
|
||||||
### 4.1. Домены в GitOps
|
|
||||||
|
|
||||||
В **`k8s/sova-deploy/apps/*/values-test.yaml`** выставили хосты `*.dev.sovamed.ru`, TLS, образы из Gitea registry:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
ingress:
|
|
||||||
host: api.dev.sovamed.ru
|
|
||||||
tls:
|
|
||||||
enabled: true
|
|
||||||
clusterIssuer: letsencrypt-prod
|
|
||||||
image:
|
|
||||||
repository: git.sova.local/sova/backend
|
|
||||||
tag: backend-v1.0.13-test
|
|
||||||
```
|
|
||||||
|
|
||||||
Запушили ветку **`test`** в Gitea (`sova/sova-deploy`) → ArgoCD подхватил.
|
|
||||||
|
|
||||||
### 4.2. Registry и pull образов
|
|
||||||
|
|
||||||
CI пушит в registry под **`git.sova.local`**, нода должна резолвить registry:
|
|
||||||
|
|
||||||
- **`/etc/hosts`** на сервере: `10.0.186.3 git.dev.sovamed.ru git.sova.local`
|
|
||||||
- **`/etc/rancher/k3s/registries.yaml`** — mirror + credentials
|
|
||||||
- Скрипт: `k8s/scripts/configure-k3s-registry-remote.sh`
|
|
||||||
|
|
||||||
### 4.3. CI/CD под HTTPS
|
|
||||||
|
|
||||||
Обновили workflow **`build.yml`** в app-репозиториях и скрипты (`gitea-url.sh`, `release-tag.sh`, `bootstrap-gitea-ci-secrets.sh`) — Gitea с Mac/VPN через `https://10.0.186.3` + заголовок `Host: git.dev.sovamed.ru`.
|
|
||||||
|
|
||||||
Проверка релиза:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd k8s
|
|
||||||
export KUBECONFIG=~/.kube/config-sova-remote-test
|
|
||||||
export VM_IP=10.0.186.3 GITEA_SCHEME=https GITEA_HTTP_PORT=443 GITEA_INSECURE_TLS=1
|
|
||||||
export GITEA_HOST=git.dev.sovamed.ru
|
|
||||||
|
|
||||||
./scripts/release-tag.sh backend backend-v1.0.13-test
|
|
||||||
```
|
|
||||||
|
|
||||||
Цепочка: **тег → Gitea Actions → образ в registry → commit в sova-deploy → ArgoCD sync → pod**.
|
|
||||||
|
|
||||||
### 4.4. Ветки issues/27
|
|
||||||
|
|
||||||
Перенесли feature-ветки из монорепо в Gitea и смержили в **`test`**:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
./scripts/migrate-issues-27-branches.sh
|
|
||||||
# merge issues/27 → test для backend, adminpanel, cabinet
|
|
||||||
```
|
|
||||||
|
|
||||||
### 4.5. TLS на приложениях
|
|
||||||
|
|
||||||
После sync ArgoCD ingress терял TLS — добавили блок `tls` в Helm-шаблоны `sova-deploy/apps/*/templates/all.yaml` и `ingress.tls.enabled` в values-test.
|
|
||||||
|
|
||||||
### 4.6. Redmine убрали
|
|
||||||
|
|
||||||
Redmine на этом сервере не нужен:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
kubectl delete application redmine-test -n argocd
|
|
||||||
```
|
|
||||||
|
|
||||||
### 4.7. Пароли
|
|
||||||
|
|
||||||
Сгенерировали сложные пароли для Gitea, ArgoCD, Grafana, БД, app secrets. Применили:
|
|
||||||
|
|
||||||
- helm/API для platform;
|
|
||||||
- `ALTER USER` в PostgreSQL/MySQL;
|
|
||||||
- GitOps (`sova-deploy/data/test`, `apps/*/values.yaml`);
|
|
||||||
- bcrypt для seed-пользователей admin/cabinet.
|
|
||||||
|
|
||||||
Все креды — **`k8s/.generated/platform-credentials.env`** (не в git). SSH не трогали.
|
|
||||||
|
|
||||||
### 4.8. Admin Panel — API URL
|
|
||||||
|
|
||||||
Admin Panel не логинился: в **`values-test.yaml`** был ключ `env:` вместо **`runtimeEnv:`** → в pod уходил `http://api.test.sova.local`. Исправили:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
runtimeEnv:
|
|
||||||
API_BASE_URL: https://api.dev.sovamed.ru
|
|
||||||
```
|
|
||||||
|
|
||||||
### 4.9. Grafana + Loki
|
|
||||||
|
|
||||||
Grafana падала из-за двух default datasource. Решение:
|
|
||||||
|
|
||||||
- Loki подключён через **`grafana.additionalDataSources`** в `values-lite-12gb.yaml`;
|
|
||||||
- отдельный ConfigMap `loki-loki-stack` удаляется после helm loki-stack.
|
|
||||||
|
|
||||||
### 4.10. Basic Auth на периметре
|
|
||||||
|
|
||||||
Все публичные URL закрыты **HTTP Basic Auth** на ingress:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
./scripts/bootstrap-ingress-basic-auth.sh # secret contour-basic-auth
|
|
||||||
./scripts/deploy-platform-ingress.sh # platform ingress
|
|
||||||
```
|
|
||||||
|
|
||||||
Логin: **`sova-contour`**, пароль — в `platform-credentials.env`.
|
|
||||||
|
|
||||||
Для Gitea — **два Ingress**: `/api`, `/v2`, `/sova` без auth (CI/git), веб-UI `/` — с auth.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 5. Типичный рабочий цикл после развёртывания
|
|
||||||
|
|
||||||
### kubectl
|
|
||||||
|
|
||||||
```bash
|
|
||||||
export KUBECONFIG=~/.kube/config-sova-remote-test
|
|
||||||
kubectl get applications -n argocd
|
|
||||||
kubectl get pods -n sova-test
|
|
||||||
```
|
|
||||||
|
|
||||||
### Выкат новой версии приложения
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd k8s
|
|
||||||
./scripts/release-tag.sh backend backend-v1.0.14-test
|
|
||||||
# аналогично: adminpanel, cabinet, docs
|
|
||||||
```
|
|
||||||
|
|
||||||
### Выкат документации
|
|
||||||
|
|
||||||
```bash
|
|
||||||
./scripts/release-tag.sh docs docs-v1.0.15-test
|
|
||||||
```
|
|
||||||
|
|
||||||
### ArgoCD sync вручную
|
|
||||||
|
|
||||||
```bash
|
|
||||||
kubectl annotate application backend-test -n argocd argocd.argoproj.io/refresh=hard --overwrite
|
|
||||||
```
|
|
||||||
|
|
||||||
### Креды
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cat k8s/.generated/platform-credentials.env
|
|
||||||
./scripts/print-credentials.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 6. Проверка «всё живо»
|
|
||||||
|
|
||||||
```bash
|
|
||||||
export KUBECONFIG=~/.kube/config-sova-remote-test
|
|
||||||
source k8s/.generated/platform-credentials.env
|
|
||||||
|
|
||||||
# Basic auth + TLS
|
|
||||||
curl -sk -o /dev/null -w "%{http_code}\n" -u "${BASIC_AUTH_USER}:${BASIC_AUTH_PASS}" \
|
|
||||||
-H "Host: api.dev.sovamed.ru" https://10.0.186.3/
|
|
||||||
|
|
||||||
# ArgoCD
|
|
||||||
kubectl get applications -n argocd
|
|
||||||
|
|
||||||
# Сертификаты
|
|
||||||
kubectl get certificate -A
|
|
||||||
|
|
||||||
# CI
|
|
||||||
curl -sk -u "gitea_admin:${GITEA_ADMIN_PASS}" -H "Host: git.dev.sovamed.ru" \
|
|
||||||
"https://10.0.186.3/api/v1/repos/sova/backend/actions/runs?limit=1"
|
|
||||||
```
|
|
||||||
|
|
||||||
Чеклист:
|
|
||||||
|
|
||||||
- [ ] `kubectl get nodes` — Ready
|
|
||||||
- [ ] ArgoCD apps — Synced / Healthy
|
|
||||||
- [ ] URL открываются (с basic auth → затем логин сервиса)
|
|
||||||
- [ ] `kubectl get certificate -A` — Ready
|
|
||||||
- [ ] CI по тегу `*-test` — success
|
|
||||||
- [ ] Grafana Explore → Loki → `{namespace="sova-test"}`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 7. Карта скриптов (что за что отвечает)
|
|
||||||
|
|
||||||
```
|
|
||||||
k3s/scripts/bootstrap-remote-test.sh ← главная команда «развернуть всё»
|
|
||||||
k3s/remote.env ← IP, домены, TLS, SSH
|
|
||||||
|
|
||||||
k8s/scripts/deploy-platform-remote.sh ← Helm: ingress, cert-manager, ArgoCD, Gitea…
|
|
||||||
k8s/scripts/deploy-platform-ingress.sh ← Ingress git / argocd / grafana (+ basic auth)
|
|
||||||
k8s/scripts/bootstrap-ingress-basic-auth.sh
|
|
||||||
k8s/scripts/bootstrap-gitea.sh ← org, repos, admin
|
|
||||||
k8s/scripts/bootstrap-gitea-runner.sh ← Actions runner
|
|
||||||
k8s/scripts/bootstrap-gitea-ci-secrets.sh
|
|
||||||
k8s/scripts/configure-k3s-registry-remote.sh
|
|
||||||
k8s/scripts/deploy-test-stack.sh ← БД + mocks (DATA_ONLY=1)
|
|
||||||
k8s/scripts/bootstrap-argocd.sh ← GitOps apps
|
|
||||||
k8s/scripts/bootstrap-tls.sh ← Let's Encrypt
|
|
||||||
k8s/scripts/release-tag.sh ← тег → CI → deploy
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 8. Частые проблемы
|
|
||||||
|
|
||||||
| Симптом | Что делали |
|
|
||||||
|---------|------------|
|
|
||||||
| ImagePullBackOff | `configure-k3s-registry-remote.sh`, `/etc/hosts` на ноде |
|
|
||||||
| ArgoCD «Failed to authenticate» к Gitea | обновить secret `repo-sova-deploy` с новым паролем Gitea |
|
|
||||||
| Admin Panel не логинится | `runtimeEnv.API_BASE_URL`, не `env:` |
|
|
||||||
| Grafana CrashLoop | один default datasource; Loki через Helm `additionalDataSources` |
|
|
||||||
| Symfony «parameter 3Dbi6a» | в `REDIS_URL`/`DATABASE_URL` удвоить `%` → `%%` для GitOps |
|
|
||||||
| CI 403 на push | проверить Gitea credentials, `gitea_git_remote_url` (URL-encode пароля) |
|
|
||||||
| Let's Encrypt pending | DNS, порт 80, `/.well-known/acme-challenge` без auth |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 9. Ссылки
|
|
||||||
|
|
||||||
- [CLOUD-SITE-TEST-01 — справочник по системе](./cloud-site-test-01.md)
|
|
||||||
- [Gitea CI / теги](./guides/gitea-ci.md)
|
|
||||||
- [Система тегов](./tags.md)
|
|
||||||
- [ArgoCD apps](./argocd-apps.md)
|
|
||||||
- [Grafana / Loki](./guides/monitoring.md)
|
|
||||||
- [`k3s/TLS.md`](../../../../k3s/TLS.md)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
*Документ описывает фактический процесс развёртывания test-контура на CLOUD-SITE-TEST-01 (2026).*
|
|
||||||
@@ -16,8 +16,6 @@
|
|||||||
|
|
||||||
### Текстовая документация
|
### Текстовая документация
|
||||||
|
|
||||||
- [**CLOUD-SITE-TEST-01: удалённый test-сервер**](./cloud-site-test-01) — домены, TLS, basic auth, CI/CD, мониторинг
|
|
||||||
- [**Как развернуть test-контур (пошагово)**](./deploy-walkthrough) — bootstrap, доработки, рабочий цикл
|
|
||||||
- [Git-flow: ветки, теги, автодеплой](./git-flow) — prod / test / stage, PR, пример через UI Gitea
|
- [Git-flow: ветки, теги, автодеплой](./git-flow) — prod / test / stage, PR, пример через UI Gitea
|
||||||
- [Test-контур: что сделано и перенос на server](./test-contour-article) — полная статья
|
- [Test-контур: что сделано и перенос на server](./test-contour-article) — полная статья
|
||||||
- [Система тегов CI/CD](./tags) — формат тегов и release-скрипт
|
- [Система тегов CI/CD](./tags) — формат тегов и release-скрипт
|
||||||
|
|||||||
Reference in New Issue
Block a user