56 Commits

Author SHA1 Message Date
aleksey 1ef9020c40 Голосовой центр L2: прокси транскрибации POST /v1/ai/transcribe
CI / test (push) Successful in 7m45s
CI / deploy-ift (push) Successful in 2m53s
CI / e2e-ift (push) Successful in 1m23s
CI / deploy-stage (push) Successful in 2m9s
CI / e2e-stage (push) Successful in 1m50s
Back-прокси STT для press-to-talk (канон PRODUCT-AI, голос и тап —
два канала одного движка действий):

- handler_ai_transcribe + logic_ai_transcribe (паттерн logic_geo):
  адаптеры провайдеров xai и openai-совместимый; env STT_PROVIDER,
  STT_URL, STT_API_KEY, STT_MODEL, STT_TIMEOUT_MS, STT_PROXY_URL
- multipart read_file_part в handler_upload_utils (лимит 10 MB)
- ETS rate-limit: 10 req/min на пользователя + глобальный троттлинг
  апстрима; без ключа — 503 unavailable, ошибки апстрима — 502/503
- аудио и транскрипт не персистятся (приват-инвариант канона)
- отдельный httpc-профиль: STT_PROXY_URL применяется только к STT
  (эгресс stt-egress для гео-блокированных провайдеров)
- trails в eventhub_trails.erl, маршрут в eventhub_app.erl,
  docker/.env.example дополнен STT_*

Проверка: eunit модуля 8/8; полный прогон eunit зелёный (1211 тестов),
compile без новых warning'ов.

Refs EventHub/EventHubBack#79
Refs EventHub/EventHubFront#76
2026-08-20 23:56:35 +03:00
aleksey 73d43e5fdc feat(geo): switch geocoder from self-host Photon to OpenCage API
CI / test (push) Successful in 7m44s
CI / deploy-ift (push) Successful in 3m57s
CI / e2e-ift (push) Successful in 1m16s
CI / deploy-stage (push) Successful in 2m36s
CI / e2e-stage (push) Successful in 4m12s
logic_geo проксирует OpenCage (suggest/geocode/reverse): env OPENCAGE_API_KEY,
OPENCAGE_URL, OPENCAGE_TIMEOUT_MS, OPENCAGE_COUNTRYCODE, OPENCAGE_THROTTLE_RPS
(1 rps под free-тариф, 0 - выключить). HTTP 402/403/429 апстрима ->
503 geo_unavailable; source=opencage. Сервис photon и volume photon-data
удалены из swarm compose; eunit-фикстуры под формат OpenCage.

Refs EventHub/EventHubBack#77
2026-08-18 23:30:15 +03:00
aleksey 6b70e1336d feat(geo): Photon proxy, address-only location, nearby search. Refs EventHub/EventHubBack#77
CI / test (push) Successful in 7m38s
CI / deploy-ift (push) Successful in 3m27s
CI / e2e-ift (push) Successful in 1m16s
CI / deploy-stage (push) Successful in 2m18s
CI / e2e-stage (push) Successful in 4m11s
2026-08-17 23:23:10 +03:00
aleksey 12274f9ed0 feat(notify): Web Push subscriptions and email/push prefs.
CI / test (push) Successful in 7m43s
CI / deploy-ift (push) Successful in 3m33s
CI / e2e-ift (push) Successful in 1m28s
CI / deploy-stage (push) Failing after 3m40s
CI / e2e-stage (push) Has been skipped
Prefs in user.preferences; push_subscription table; VAPID send on
reminder/waitlist. Refs EventHub/EventHubBack#75
2026-08-15 20:19:44 +03:00
aleksey 0a1e55e036 feat(email): HTTP API transport via Resend (fallback SMTP).
CI / test (push) Successful in 7m40s
CI / deploy-ift (push) Successful in 3m29s
CI / e2e-ift (push) Successful in 1m27s
CI / deploy-stage (push) Failing after 3m45s
CI / e2e-stage (push) Has been skipped
Outbound SMTP ports are often blocked on VPS; EMAIL_TRANSPORT=http_api
sends via Resend HTTPS (Brevo optional). OpenSMTPd/SMTP remain available.
2026-08-14 23:54:10 +03:00
aleksey 29111cd514 feat(upload): avatar and calendar cover via local disk storage.
POST /v1/user/me/avatar and /v1/calendars/:id/cover; GET /v1/media;
UPLOAD_DIR on eventhub-data volume; MIME/size limits.
Refs EventHub/EventHubBack#71
Refs EventHub/EventHubSpec#8
2026-08-14 21:27:34 +03:00
aleksey 15ae8d4426 feat(email): send booking reminders before event start.
Job process_reminders in subscription_worker; REMINDER_LEAD_HOURS window;
CalenTIQ email + in-app event_reminder; idempotent reminder_sent.
Refs EventHub/EventHubBack#70
2026-08-14 20:59:38 +03:00
aleksey 302e1e5e9e chore: ignore local Traefik certs; keep make-traefik-certs.sh. [skip ci] 2026-08-14 19:46:18 +03:00
aleksey 69ee037d45 feat(email): SMTP via gen_smtp and CalenTIQ HTML templates. Refs EventHub/EventHubBack#68 2026-08-14 18:51:09 +03:00
aleksey e3403f6ed6 fix(ift): ObserverWeb mount at "" so CSS/JS paths are not //css-*
CI / test (push) Successful in 7m23s
CI / deploy-ift (push) Successful in 5m31s
CI / e2e-ift (push) Successful in 1m31s
CI / deploy-stage (push) Successful in 3m16s
CI / e2e-stage (push) Successful in 1m22s
observer_dashboard("/") makes asset href protocol-relative (//css-HASH). Empty path keeps assets at /css-HASH.
2026-08-13 11:27:41 +03:00
aleksey 37011f66a1 fix(ift): mount ObserverWeb dashboard at / on dedicated host
CI / test (push) Successful in 7m42s
CI / deploy-ift (push) Successful in 5m40s
CI / e2e-ift (push) Successful in 1m28s
CI / deploy-stage (push) Successful in 2m12s
CI / e2e-stage (push) Successful in 1m20s
observer.ift.calentiq.com already has its own subdomain; /observer path prefix is redundant.
2026-08-13 10:54:19 +03:00
aleksey 3c2c33f83b feat(ci-reports): publish report.tar.gz archive for offline download
Pack HTML report after publish; link archive in run index and CI log.
Add fetch-ci-report.sh helper for agent curl/extract.

[skip ci]
2026-07-28 13:52:01 +03:00
aleksey 2bfce06dbf Publish EUnit/CT HTML reports to ci-reports host.
Refs EventHub/EventHubBack#62
2026-07-27 22:54:52 +03:00
aleksey 9886dff8bf fix: run observer_web as hidden node to stop OTP global splitting IFT Mnesia cluster.
CI / test (push) Successful in 6m13s
CI / deploy-ift (push) Successful in 4m46s
CI / e2e-ift (push) Successful in 1m25s
CI / deploy-stage (push) Successful in 1m57s
CI / e2e-stage (push) Successful in 1m11s
Without --hidden, observer joins the visible mesh and prevent_overlapping_partitions disconnects eventhub-node1/2 (running_partitioned_network → admin verification-token 404 in e2e).
2026-07-21 22:14:16 +03:00
aleksey cd61aaff20 feat: bake product version from Spec and expose build in health.
Resolve MAJOR.MINOR via EventHubSpec/VERSION; CI run_number as EVENTHUB_BUILD; health returns version/build/git_sha/built_at.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-17 21:48:24 +03:00
aleksey 2b65a804d3 fix(ci): materialize rebar test src_dirs in shared test image. Refs EventHub/EventHubBack#36
CI / test (push) Successful in 28m14s
CI / deploy-ift (push) Successful in 7m42s
CI / e2e-ift (push) Failing after 21m40s
CI / deploy-stage (push) Has been skipped
CI / e2e-stage (push) Has been skipped
2026-07-17 19:35:12 +03:00
aleksey 4fa802702f Rewrite and expand EUnit suite; run unit tests in CI from shared test image. Refs EventHub/EventHubBack#36 [skip ci] 2026-07-17 15:16:46 +03:00
aleksey 9d2780fef4 fix(swarm): per-slot Mnesia volume via Swarm name template.
CI / test (push) Successful in 15m10s
CI / deploy-ift (push) Successful in 7m22s
CI / e2e-ift (push) Successful in 5m21s
CI / deploy-stage (push) Successful in 6m35s
CI / e2e-stage (push) Successful in 15m12s
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-17 10:09:41 +03:00
aleksey 5e569da1d8 fix(mnesia): per-slot volumes hint and harden verification lookup.
CI / test (push) Failing after 5m10s
CI / deploy-ift (push) Has been skipped
CI / e2e-ift (push) Has been skipped
CI / deploy-stage (push) Has been skipped
CI / e2e-stage (push) Has been skipped
Avoid shared Mnesia dir across replicas; make get_or_create_token and CT verify_user resilient to brief cross-node lag.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-17 09:54:10 +03:00
aleksey 94106cf964 fix(mnesia): поднять dump_log_write_threshold; Traefik base v3.3.6. Refs EventHub/EventHubBack#34 Refs EventHub/EventHubDevOps#3 [skip ci] 2026-07-15 17:28:39 +03:00
aleksey 2eeda5c4c4 feat(backend): build identity в health, VERSION bake и auto stage по sha-*
CI / test (push) Successful in 28m3s
2026-07-14 21:25:40 +03:00
aleksey a2ccf167aa chore(docker): prune образов после swarm-deploy, env стендов в gitignore
CI / test (push) Failing after 13m57s
docker/.env.ift и .env.stage локально, не в репозитории; image prune в make docker-swarm-deploy.
2026-07-12 11:58:21 +03:00
aleksey a8e6dcb8f5 fix(docker): crash loop fallback и observer-web на IFT
CI / test (push) Failing after 11m40s
fallback: default_type вне if-блока nginx. observer-web: Hex/deps.compile в образе, без dev-watchers в контейнере.
2026-07-12 11:12:16 +03:00
aleksey 21a2a39746 Co-authored-by:
CI / test (push) Successful in 8m23s
2026-07-11 14:56:18 +03:00
aleksey f79264ece9 Co-authored-by:
CI / test (push) Successful in 10m55s
2026-07-11 14:33:53 +03:00
aleksey e8464b3a8b Add shared Erlang builder/runtime base images from registry.
CI / test (push) Successful in 7m42s
Publish erlang-builder and erlang-runtime as :latest, use them in prod and API test builds, auto-collect NIF libs, and sync CI to pull/push bases before eventhub build.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-11 12:25:42 +03:00
aleksey 76f52030d1 observer-web: multi-stage Dockerfile to reduce registry push size.
CI / test (push) Successful in 15m23s
Deploy stage (core) / deploy-stage-core (push) Failing after 2m58s
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-10 17:02:06 +03:00
aleksey feac915454 Fix observer-web build: use npm tailwind/esbuild instead of GitHub download.
CI / test (push) Successful in 18m45s
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-10 16:16:54 +03:00
aleksey 63cb9e7e02 Deploy IFT: optional observer-web/logrotate, bootstrap build on IFT server.
CI / test (push) Failing after 2m8s
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-10 14:33:19 +03:00
aleksey 7a6551a37c dev: minimal stack (4 services), EVENTHUB_ENV=dev, eventhub alias.
Deploy IFT (core) / deploy-ift-core (push) Failing after 12m34s
CI / test (push) Failing after 32m35s
2026-07-09 23:14:01 +03:00
aleksey 78e95c1608 Scope dev Traefik routes to *.dev.eventhub.local only
Deploy IFT (core) / deploy-ift-core (push) Failing after 10m22s
CI / test (push) Failing after 13m7s
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-08 20:05:38 +03:00
aleksey 6890dffdfe Remove legacy eventhub.local hosts and switch to dev/ift/stage
CI / test (push) Failing after 11m15s
Deploy IFT (core) / deploy-ift-core (push) Failing after 26m15s
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-08 17:52:39 +03:00
aleksey 4a69ef8cd1 Update traefik routing for dev and ignore TLS private keys
CI / test (push) Failing after 13m20s
Deploy IFT (core) / deploy-ift-core (push) Failing after 23m20s
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-08 17:25:13 +03:00
aleksey f4746df4a2 CI/CD: ci, deploy-ift и deploy-stage через EventHubDevOps; фиксы calendar view, archive, API-тесты, traefik-coraza
Deploy IFT (core) / deploy-ift-core (push) Failing after 22m58s
CI / test (push) Failing after 22m59s
2026-07-08 14:50:59 +03:00
aleksey cf8e6bcc07 Fail-fast secrets in stage/prod via EVENTHUB_ENV. Refs EventHub/EventHubBack#25 2026-07-07 19:52:04 +03:00
aleksey 17b2e617d7 bagofix
Test & Deploy to Snapdeploy / build-test-deploy (push) Failing after 24m46s
2026-06-05 23:20:03 +03:00
aleksey 38a299e5b9 CI/CD пайплайн 2026-06-05 22:11:08 +03:00
aleksey 732e7c81b4 fix bot-emulator-users 2026-05-28 21:55:34 +03:00
aleksey 2b91e10f64 add eventhub-admin-ui dependency 2026-05-23 22:35:05 +03:00
aleksey 3abf5c94ee Рефакторинг обработчиков. Финальное тестирование #21 2026-05-18 14:37:59 +03:00
aleksey 40806df62a Рефакторинг обработчиков. Часть 3 #21 2026-05-13 23:02:59 +03:00
aleksey b85885ce83 [Bug] fallback сервис должен отдаваться только на фронт #11 2026-05-05 14:02:19 +03:00
aleksey 83ce92afa4 Настройка репликации. Финал #14 2026-05-03 21:02:29 +03:00
aleksey f36dd3bbc1 Переделать связь нод в кластере на автоматическое обнаружение #9 2026-05-01 22:30:40 +03:00
aleksey 62bc62f990 Добавлена связь с фронтом админки 2026-04-26 22:48:57 +03:00
aleksey 798e532dd7 Rate Limiting 2026-04-25 13:50:16 +03:00
aleksey a8c3f1b887 Ротация логов Traefik 2026-04-25 13:39:46 +03:00
aleksey 9275db1598 LogLynx Веб-интерфейс для анализа логов 2026-04-25 13:34:07 +03:00
aleksey d4178ee39f Настройка Coraza WAF 2026-04-25 12:51:25 +03:00
aleksey 23ccc9aacc Failover Service 2026-04-25 12:22:20 +03:00