diff --git a/deploy/docker-compose.test.yml b/deploy/docker-compose.test.yml new file mode 100644 index 00000000..93805d25 --- /dev/null +++ b/deploy/docker-compose.test.yml @@ -0,0 +1,119 @@ +name: mmapp-test + +services: + postgres: + image: ${POSTGRES_IMAGE_TAG:-postgres:18-alpine} + container_name: mmapp-test-postgres + restart: unless-stopped + logging: + driver: json-file + options: + max-size: "10m" + max-file: "3" + shm_size: "256mb" + environment: + POSTGRES_USER: mmapp + POSTGRES_DB: mmapp + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?set POSTGRES_PASSWORD in .env} + POSTGRES_INITDB_ARGS: "--encoding=UTF8 --locale=C.UTF-8 --data-checksums" + TZ: UTC + PGTZ: UTC + command: + - postgres + - -c + - timezone=UTC + - -c + - listen_addresses=* + - -c + - max_connections=100 + - -c + - shared_buffers=256MB + - -c + - work_mem=16MB + - -c + - maintenance_work_mem=128MB + - -c + - wal_compression=lz4 + - -c + - default_toast_compression=lz4 + - -c + - io_method=worker + - -c + - io_workers=3 + - -c + - effective_io_concurrency=200 + - -c + - max_wal_size=2GB + - -c + - checkpoint_timeout=15min + - -c + - checkpoint_completion_target=0.9 + volumes: + # PostgreSQL 18+: VOLUME is /var/lib/postgresql (PGDATA = .../18/docker) + - mmapp-pgdata:/var/lib/postgresql + healthcheck: + test: ["CMD-SHELL", "pg_isready -U mmapp -d mmapp"] + interval: 5s + timeout: 5s + retries: 10 + + backend: + image: mmapp-test/backend:${MMAPP_IMAGE_TAG:?set MMAPP_IMAGE_TAG} + container_name: mmapp-test-backend + restart: unless-stopped + logging: + driver: json-file + options: + max-size: "10m" + max-file: "3" + depends_on: + postgres: + condition: service_healthy + ports: + - "127.0.0.1:8000:8000" + # IPFIX: только на WG-адресе хоста после `wg-quick up wg-flow`, не 0.0.0.0 + # - "10.255.254.1:4739:4739/udp" + environment: + CORS_ORIGIN: ${CORS_ORIGIN:-http://localhost:3000} + DATABASE_URL: postgres://mmapp:${POSTGRES_PASSWORD}@postgres:5432/mmapp + DATABASE_PATH: /app/data/mikrotik.db + AUTH_REQUIRED: ${AUTH_REQUIRED:-false} + AUTH_JWT_SECRET: ${AUTH_JWT_SECRET:?set AUTH_JWT_SECRET} + AUTH_ISSUER: ${AUTH_ISSUER:-https://auth.test.local} + AUTH_PORTAL_URL: ${AUTH_PORTAL_URL:-http://localhost:5175} + # IPFIX: внутри контейнера слушаем все интерфейсы; на хосте UDP 4739 публикуется только на WG-IP + FLOW_LISTEN_HOST: "0.0.0.0" + volumes: + - ./data:/app/data + healthcheck: + test: + [ + "CMD", + "node", + "-e", + "fetch('http://127.0.0.1:8000/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))", + ] + interval: 30s + timeout: 5s + retries: 3 + start_period: 300s + + frontend: + image: mmapp-test/frontend:${MMAPP_IMAGE_TAG:?set MMAPP_IMAGE_TAG} + container_name: mmapp-test-frontend + restart: unless-stopped + logging: + driver: json-file + options: + max-size: "10m" + max-file: "3" + depends_on: + - backend + ports: + - "127.0.0.1:3000:3000" + environment: + BACKEND_INTERNAL_URL: http://backend:8000 + + +volumes: + mmapp-pgdata: diff --git a/deploy/env.test.example b/deploy/env.test.example new file mode 100644 index 00000000..92167009 --- /dev/null +++ b/deploy/env.test.example @@ -0,0 +1,9 @@ +# Save as /opt/mmapp-test/.env on the test server (mode 0600). +# Generate unique hex secrets on that server; never reuse production credentials. +POSTGRES_PASSWORD= +AUTH_JWT_SECRET= +MMAPP_IMAGE_TAG=ux-6255f44 +AUTH_REQUIRED=false +AUTH_ISSUER=https://auth.test.local +AUTH_PORTAL_URL=http://localhost:5175 +CORS_ORIGIN=http://localhost:3000 diff --git a/docs/ux-ui-plan.md b/docs/ux-ui-plan.md index cfc278ee..acbda83e 100644 --- a/docs/ux-ui-plan.md +++ b/docs/ux-ui-plan.md @@ -1,12 +1,12 @@ # План реализации UX/UI по пятичасовым окнам -Актуальное продолжение 2026-10-07: блоки12.3.79–83 и общая локальная приёмка завершены. Main:1186/1186 на9680a64; context:221/221 на683148d с тем же runtime;44 чистых теста и HTTP/RBAC прошли. План и оба журнала согласованы, все записи этапа12 датированы. Следующий этап12.5 — внешняя приёмка по подготовленному протоколу; она не выполнена и требует отдельного стенда PostgreSQL/RouterOS/интеграций. +Актуальное продолжение 2026-10-07: 12.5.1 — сервер161.104.46.222 подготовлен: Docker29.8.2,Compose5.6.0,Buildx,4GiB swap,отдельный тестовый Compose и PostgreSQL18.6 healthy. Следующий12.5.2: сборка закреплённых frontend/backend образов и bootstrap/smoke. Реальные сценарии12.5 ещё не выполнены; предыдущие main1186/context221 и44 чистых теста сохранены. Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-07. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат. ## Актуальная точка продолжения — 2026-10-07 -Этапы0–11 завершены в описанных локальных границах. Локальная часть этапа12 проверена до12.3.83: main12.4.10 —1186/1186 на9680a64, context12.4.11 —221/221 на683148d с тем же runtime. Дополнительно прошли44 чистых теста, HTTP/DI/RBAC speed API и сборки. Этап12 остаётся открытым: следующая внешняя12.5 требует отдельного стенда. Протокол и ограничения: [внешняя приёмка](ux-ui-external-acceptance.md); точные результаты: [подробный журнал этапа12](ux-ui-stage-12.md). +Этапы0–11 завершены в описанных локальных границах. Локальная часть этапа12 проверена до12.3.83: main12.4.10 —1186/1186 на9680a64, context12.4.11 —221/221 на683148d с тем же runtime. Дополнительно прошли44 чистых теста, HTTP/DI/RBAC speed API и сборки. Этап12 остаётся открытым: стенд12.5.1 подготовлен на161.104.46.222;следующий12.5.2 — сборка и bootstrap/smoke,затем внешние сценарии. Протокол и ограничения: [внешняя приёмка](ux-ui-external-acceptance.md); точные результаты: [подробный журнал этапа12](ux-ui-stage-12.md). Реальные pg_dump/pg_restore, PG rollback и остановка UDP worker требуют внешней приёмки. Датированные продолжения ниже — история; точный следующий шаг также указан в начале [журнала](ux-ui-progress.md). diff --git a/docs/ux-ui-progress.md b/docs/ux-ui-progress.md index 6d9bddb8..a09f58dc 100644 --- a/docs/ux-ui-progress.md +++ b/docs/ux-ui-progress.md @@ -1,6 +1,6 @@ # UX/UI: журнал реализации -Актуальное продолжение 2026-10-07: блоки12.3.79–83 и общая локальная приёмка завершены. Main:1186/1186 на9680a64; context:221/221 на683148d с тем же runtime;44 чистых теста и HTTP/RBAC прошли. План и оба журнала согласованы, все записи этапа12 датированы. Следующий этап12.5 — внешняя приёмка по подготовленному протоколу; она не выполнена и требует отдельного стенда PostgreSQL/RouterOS/интеграций. +Актуальное продолжение 2026-10-07: 12.5.1 — сервер161.104.46.222 подготовлен: Docker29.8.2,Compose5.6.0,Buildx,4GiB swap,отдельный тестовый Compose и PostgreSQL18.6 healthy. Следующий12.5.2: сборка закреплённых frontend/backend образов и bootstrap/smoke. Реальные сценарии12.5 ещё не выполнены; предыдущие main1186/context221 и44 чистых теста сохранены. Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения. Записи расположены от новых к старым; подробная история этапа12 также сохранена в [ux-ui-stage-12.md](ux-ui-stage-12.md). @@ -32,7 +32,15 @@ | 10 | Маршрутизация, диагностика, карта и терминал | Завершён в границах локальной приёмки 2026-10-01; блоки 10.1–10.71, внешние ограничения в 10.71 | | 11А | Пользователи, контейнеры, сертификаты и резервные копии | Завершён в границах локальной приёмки 2026-10-01; 11А.1–11А.33, внешние ограничения в 11А.33 | | 11Б | Оповещения, сбор данных, интеграции, релизы и настройки | Завершён в границах локальной приёмки 2026-10-03; ограничения и evidence в11Б.7 | -| 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка завершена в описанных границах:12.3.83,main1186/1186,context221/221. Этап остаётся в работе: внешняя12.5 не выполнена. | +| 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка завершена в описанных границах:12.3.83,main1186/1186,context221/221. Этап остаётся в работе: стенд12.5.1 подготовлен,bootstrap/сценарии12.5 не выполнены. | + +## 12.5.1 — подготовка удалённого тестового Docker-стенда (2026-10-07) + +По прямому поручению пользователя подготовлен временный сервер161.104.46.222,root,Debian13.7 trixie/x86_64. До установки Docker отсутствовал;1CPU/1973MiB RAM,23GiB свободно. Установлены Docker Engine29.8.2,Compose5.6.0,Buildx0.37.1 из официального apt repository,git/python3 и4GiB swap. Docker systemd enabled/active,hello-world passed. SSH и сетевые настройки подключения сохранены. + +Создан /opt/mmapp-test (0700),Compose по main с отдельными именами/project/data,ограничением logs,loopback3000/8000 и фиксированными тегами. Пароль SSH не сохранён в репозитории; PG/JWT secrets сгенерированы на сервере в.env0600 без вывода. Compose config --quiet passed; SHA256 совпал с локальным шаблоном. Реальный PostgreSQL18.6 запущен,healthy и SELECT version() passed; порт БД не опубликован. [Паспорт и дальнейшие команды](ux-ui-test-server.md), [Compose](../deploy/docker-compose.test.yml), [env-шаблон](../deploy/env.test.example). + +Это подготовка инфраструктуры, не приёмка PG-1/restore/native: backend/frontend ещё не собраны и не запущены, bootstrap не выполнен. Следующий12.5.2 — чистые CI build contexts,закреплённые образы без push,bootstrap/health и начало PG-протокола. Локально docker CLI отсутствует; серверный Docker готов. Публикация Gitea/CI не выполнялась; локальный коммит без push. Ресурсы стенда не представляют production performance. ## 12.4.11 — общая context регрессия после speed API/UI (2026-10-07) diff --git a/docs/ux-ui-stage-12.md b/docs/ux-ui-stage-12.md index 2dc87cff..2669f98f 100644 --- a/docs/ux-ui-stage-12.md +++ b/docs/ux-ui-stage-12.md @@ -1,6 +1,6 @@ # Этап 12: итоговая приёмка UX/UI -Актуальное продолжение 2026-10-07: блоки12.3.79–83 и общая локальная приёмка завершены. Main:1186/1186 на9680a64; context:221/221 на683148d с тем же runtime;44 чистых теста и HTTP/RBAC прошли. План и оба журнала согласованы, все записи этапа12 датированы. Следующий этап12.5 — внешняя приёмка по подготовленному протоколу; она не выполнена и требует отдельного стенда PostgreSQL/RouterOS/интеграций. +Актуальное продолжение 2026-10-07: 12.5.1 — сервер161.104.46.222 подготовлен: Docker29.8.2,Compose5.6.0,Buildx,4GiB swap,отдельный тестовый Compose и PostgreSQL18.6 healthy. Следующий12.5.2: сборка закреплённых frontend/backend образов и bootstrap/smoke. Реальные сценарии12.5 ещё не выполнены; предыдущие main1186/context221 и44 чистых теста сохранены. План: [ux-ui-plan.md](ux-ui-plan.md). Фактические результаты: [ux-ui-progress.md](ux-ui-progress.md). Подготовлен после сводных проверок 11Б; завершение каждого блока требует локального коммита без push. @@ -952,3 +952,11 @@ Runtime HEAD9680a6422ba951a1737207663acbd6d562710b62:1186/1186passed,193files,0u Main1186/1186 на9680a64 и эта context матрица теперь включают runtime блоков79–83. Дополнительно7 чистых producer DTO checks подтвердили ISO преобразование PostgreSQL timestamp с сохранением instant, nullable/zero и отказ от неверных записей. Вместе с предыдущими37 —44 чистых теста; HTTP/DI/RBAC speed command/catalog и contracts/backend/frontend builds passed. Реального подключения к PostgreSQL/RouterOS не было. Следующий12.5: [подготовленный протокол внешней приёмки](ux-ui-external-acceptance.md). По имеющимся локальным мокам нельзя подтвердить реальные PG rollback/row locks/commit acknowledgement, RouterOS и внешние интеграции. Для этого нужен отдельный стенд. Этап12 остаётся открытым до внешней приёмки; локальные матрицы не являются заявлением о полной production готовности. Локальные коммиты без push; чужие изменения сохранены. + +## 12.5.1 — подготовка удалённого тестового Docker-стенда (2026-10-07) + +По прямому поручению пользователя подготовлен временный сервер161.104.46.222,root,Debian13.7 trixie/x86_64. До установки Docker отсутствовал;1CPU/1973MiB RAM,23GiB свободно. Установлены Docker Engine29.8.2,Compose5.6.0,Buildx0.37.1 из официального apt repository,git/python3 и4GiB swap. Docker systemd enabled/active,hello-world passed. SSH и сетевые настройки подключения сохранены. + +Создан /opt/mmapp-test (0700),Compose по main с отдельными именами/project/data,ограничением logs,loopback3000/8000 и фиксированными тегами. Пароль SSH не сохранён в репозитории; PG/JWT secrets сгенерированы на сервере в.env0600 без вывода. Compose config --quiet passed; SHA256 совпал с локальным шаблоном. Реальный PostgreSQL18.6 запущен,healthy и SELECT version() passed; порт БД не опубликован. [Паспорт и дальнейшие команды](ux-ui-test-server.md), [Compose](../deploy/docker-compose.test.yml), [env-шаблон](../deploy/env.test.example). + +Это подготовка инфраструктуры, не приёмка PG-1/restore/native: backend/frontend ещё не собраны и не запущены, bootstrap не выполнен. Следующий12.5.2 — чистые CI build contexts,закреплённые образы без push,bootstrap/health и начало PG-протокола. Локально docker CLI отсутствует; серверный Docker готов. Публикация Gitea/CI не выполнялась; локальный коммит без push. Ресурсы стенда не представляют production performance. diff --git a/docs/ux-ui-test-server.md b/docs/ux-ui-test-server.md new file mode 100644 index 00000000..945a7ca7 --- /dev/null +++ b/docs/ux-ui-test-server.md @@ -0,0 +1,46 @@ +# Тестовый сервер UX/UI — 2026-10-07 + +Сервер161.104.46.222 предоставлен пользователем для временного тестирования с последующим удалением. Подготовка выполнена по структуре deploy/docker-compose.yml из main. Приложение ещё не собрано и не запущено. + +| Параметр | Проверенное состояние | +| --- | --- | +| ОС / архитектура | Debian13 trixie13.7 / x86_64 | +| Ресурсы | 1CPU,1973MiB RAM,4GiB swap; исходно23GiB свободного диска | +| Docker Engine | 29.8.2;systemd enabled/active;hello-world passed | +| Compose / Buildx | v5.6.0 / v0.37.1 | +| Каталог | /opt/mmapp-test;0700 | +| Конфигурация | /opt/mmapp-test/compose.yaml;0600;docker compose config --quiet passed | +| Секреты | Сгенерированы только на сервере в /opt/mmapp-test/.env;0600;в Git не сохранены | +| PostgreSQL | postgres:18-alpine,18.6;mmapp-test-postgres healthy;SELECT version() passed | +| Данные | Отдельный Compose project mmapp-test,том mmapp-test_mmapp-pgdata и каталог ./data | +| Доступ | PostgreSQL не публикуется;frontend3000/backend8000 привязаны к127.0.0.1 после запуска | +| Образы приложения | mmapp-test/backend:ux-6255f44 и mmapp-test/frontend:ux-6255f44;ещё не созданы | + +Compose SHA256:99900547ed18b62e2cdcf9aae3975cbd6c3598a699a79dc04a4b7a0fec295348. Локальный и удалённый файлы совпали. Шаблоны: [Compose](../deploy/docker-compose.test.yml), [env без секретов](../deploy/env.test.example). + +## Развёртывание приложения + +Следующий блок: подготовить чистые frontend/backend build contexts по .gitea/workflows/docker.yml для проверенного runtime и собрать закреплённые образы без push. Локально docker CLI сейчас отсутствует, на сервере доступен Docker. В корневом .dockerignore исключён backend, поэтому обычный backend build из корня не повторяет CI: использовать отдельный backend context, как main workflow. Не передавать .env.local,backend/.env,ключи и локальные node_modules/.next. + +После сборки/загрузки образов выполнить на сервере: + +~~~bash +cd /opt/mmapp-test +docker compose config --quiet +docker compose up -d --wait --wait-timeout 300 postgres backend frontend +docker compose ps +curl -fsS http://127.0.0.1:8000/health +curl -fsS http://127.0.0.1:3000/health +~~~ + +Для браузера на рабочем ПК открыть SSH-туннель в отдельном терминале: + +~~~powershell +ssh -N -L 3000:127.0.0.1:3000 -L 8000:127.0.0.1:8000 root@161.104.46.222 +~~~ + +После запуска frontend открыть http://localhost:3000. AUTH_REQUIRED=false допустим для этого доступа через loopback/SSH; при приёмке прав включить AUTH_REQUIRED и согласованный тестовый issuer/Portal, используя серверный JWT secret. Конфигурация фиксирует конкретный image tag; автообновление main:latest не используется. + +## Границы результата + +Это подготовка инфраструктуры12.5.1, не закрытие PostgreSQL PG-1: bootstrap/migrations ещё не выполнялись backend. Backup/restore,отказы транзакций,concurrency,workers,RouterOS,Telegram и остальные сценарии [12.5](ux-ui-external-acceptance.md) не выполнены. Для сети потребуются отдельные тестовые устройства/CHR; для интеграций — тестовые учётные записи. 1CPU/2GiB не представляют production performance.