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