**Language / Язык:** [English](README.md) | [Русский](README.ru.md) # Лаборатория API-симуляторов (автономная) Четыре опубликованных симулятора и один PostgreSQL. Исходники репозиториев не нужны. Локально — Docker Compose; в Kubernetes — Helm-чарт. ## Структура ``` simulators/ Makefile docker-compose.yml docker/ postgres-init/01-simulators.sql tls/server.{crt,key} # общие lab TLS для Compose gateway ovirt/ovirt-engine.conf vmware/vmware-ports.conf openstack/openstack-ports.conf charts/api-simulators-lab/ # Helm: все четыре симулятора + Ingress ``` Образы: `inecs/proxmox-api-simulator`, `inecs/ovirt-api-simulator`, `inecs/vmware-api-simulator`, `inecs/openstack-api-simulator`. --- ## Docker Compose Данные Postgres — в Compose volume `postgres-data`. ```bash cd /Users/inecs/Разработка/simulators make help make up # pull → migrate → apps → seed; печатает URL make urls # снова вывести Compose-эндпоинты make logs # или: make logs SERVICE=proxmox make restart make down # остановить контейнеры, volume БД сохранить make clean # остановить + удалить volumes, мусор и сети проекта make shell # или: make shell SERVICE=ovirt make push # git add . → многострочный commit (Ctrl-D) → push origin ``` `make up` гоняет migrate/seed через `docker compose run --rm` (profile `init`), поэтому эти контейнеры не остаются в статусе `Exited`. Эквивалент через Compose: ```bash docker compose pull docker compose up -d ``` При первом старте БД создаются из `docker/postgres-init` (только на пустом volume `postgres-data`). Seed выполняется один раз после готовности каждого симулятора. Закрепить тег образа: ```bash IMAGE_TAG=0.1.0 docker compose up -d # или: IMAGE_TAG=0.1.0 make up ``` ### Compose-эндпоинты | Симулятор | URL | |---|---| | Proxmox | http://localhost:8006/ | | oVirt Engine | https://localhost:7443/ | | oVirt Web UI | http://localhost:7500/ | | VMware (HTTPS) | https://localhost:8443/ | | VMware (HTTP) | http://localhost:8081/ | | OpenStack Keystone | http://localhost:9500/ | | OpenStack Nova | http://localhost:8774/ | | OpenStack HTTPS | https://localhost:9443/ | | PostgreSQL | `127.0.0.1:5432` (пользователь `lab` / `lab`) | ### Сброс БД Compose ```bash make clean make up # или: docker compose down -v && docker compose up -d ``` --- ## Kubernetes (Helm) Чарт: `charts/api-simulators-lab`. Перед деплоем настройте: `charts/api-simulators-lab/values.yaml` | Ключ | Назначение | |---|---| | `namespace` | Целевой namespace (`simulators` по умолчанию; `namespaceCreate: true`) | | `ingresses` | Хосты, TLS secrets, annotations (по одному Ingress на запись) | | `certManager` | Let's Encrypt через cert-manager (`letsencrypt-prod`) | | `imageTag` / секреты / `postgres.persistence` | Образы, ключи, PVC | Хосты Ingress по умолчанию (для Let's Encrypt замените на публичный DNS): | Симулятор | Host | |---|---| | Proxmox | https://proxmox.lab.local/ | | oVirt | https://ovirt.lab.local/ | | VMware | https://vmware.lab.local/ | | OpenStack | https://openstack.lab.local/ | ```bash make helm up # предупреждение → подтверждение [y/N] → helm upgrade --install make helm down # uninstall релиза make helm-urls # хосты Ingress из values make helm-template make helm-lint ``` Без подтверждения (CI): `make helm-up HELM_YES=1` Сменить namespace без правки файла: `HELM_NAMESPACE=other make helm-up` Эквивалент Helm: ```bash helm upgrade --install simulators charts/api-simulators-lab \ --namespace simulators --create-namespace --wait ``` ### Как стартует чарт 1. **Namespace** — создаётся из `values.namespace`, если `namespaceCreate: true`. 2. **PostgreSQL** — StatefulSet + init SQL на четыре БД симуляторов. 3. **Симуляторы** — Deployments с init-контейнерами: - `wait-postgres` → `migrate` (идемпотентно; ничего не делает, если схема уже актуальна). 4. **Seed** — Jobs post-install / post-upgrade на каждый симулятор. - Job ждёт ready приложения, затем сидирует. - `seed.skipIfSql` пропускает seed, если в БД уже есть лабораторные данные. 5. **Ingress** — TLS через аннотацию cert-manager `cert-manager.io/cluster-issuer`. - `certManager.createClusterIssuer: true` и `certManager.email` — создать ClusterIssuer из чарта; иначе ожидается уже существующий `letsencrypt-prod`. - Let's Encrypt HTTP-01 требует **публичный DNS** на Ingress-контроллер (не `*.lab.local`). - На каждом Ingress стоят `proxy-intercept-errors: "false"` и `custom-http-errors: "502,503"`, чтобы кластерный брендированный HTML (например «DevOps спит») не подменял JSON/XML симулятора на 404/405/401. **Не** добавляйте 404/405 в `custom-http-errors`. После `helm upgrade` проверьте: `curl -sH 'Accept: application/json' https:///…` — ожидайте тело ошибки API, не HTML. Если HTML остаётся — править controller-level `custom-http-errors` у ingress-nginx (вне этого чарта). --- ## Git `origin` пушит в оба remote (как у остальных симуляторов): - `git@github.com:sergeyantropoff/simulators.git` - `ssh://git@git.antropoff.ru:30022/DevOpsTools/Simulators.git` ```bash make push # stage all → многострочное сообщение (конец — Ctrl-D) → push origin ``` Тот же UX, что в `proxmox_api_simulator`. --- Только лабораторные defaults — не выставляйте стек в публичный Интернет без смены секретов (`ticketSigningKey`, пароли БД, хосты Ingress).