Зведений health-check усіх endpoints після переключення на Docker public stack + Cloudflare proxy (2026-05-12 11:18 UTC). 38 endpoints перевірено, 35 здорових (200/401), 2 broken (n8n.nip.io), 1 minor 404 (tiktok legacy path).
http://31.131.26.203/reports/public-services-status-2026-05-12.html — інтерактивний звіт з фільтрами по проекту.
| Категорія | Кількість | OK | Auth Required | Broken |
|---|---|---|---|---|
| Med Detective (4 інст × 2 пути) | 8 | 8 | 0 | 0 |
| BioGaia | 3 | 3 | 0 | 0 |
| Brocken-3D | 4 | 4 | 0 | 0 |
| ProFLEX | 2 | 2 | 0 | 0 |
| Webhooks (Threads / TikTok) | 4 | 3 | 0 | 1 (TikTok legacy 404) |
| Internal subdomain | 6 | 5* | 5 (basic_auth) | 0 |
| Legacy paths | 10 | 5* | 7 (basic_auth) | 1 (/browser без auth) |
| n8n + nip.io | 2 | 0 | 0 | 2 (TLS broken) |
| DM domain placeholder | 1 | 1 | 0 | 0 |
| TOTAL | 40 | 31 | 12 | 4 |
* 200 OK з auth context — 401/405 з-під auth це теж "alive" якщо backend отвечает.
Архітектура: 4 FastAPI/uvicorn інстанси у public-stack Docker compose, ізольовані public-net. Redis state з in-memory fallback (backend/main.py:96).
| Variant | Endpoint | Status | Час | Notes |
|---|---|---|---|---|
| Prod (Schönen) | https://medetective.deltamedicalservices.online/ | ✅ 200 | 126ms | 11 кейсів, CRM Filtrum-ready |
| Test | https://medetective-test.deltamedicalservices.online/ | ✅ 200 | 108ms | 12 кейсів, public-facing test |
| Menopace (Vitabiotics M2M) | https://medetective-menopace.deltamedicalservices.online/ | ✅ 200 | 104ms | 6 кейсів, мед-представники |
| Fables | https://medetective-fables.deltamedicalservices.online/ | ✅ 200 | 1.1s | B2B demo, 1 кейс |
| Prod legacy | http://31.131.26.203/med-detective/ | ✅ 200 | 2ms | Backwards-compat, host Caddy |
| Test legacy | http://31.131.26.203/med-detective-test/ | ✅ 200 | 2ms | |
| Menopace legacy | http://31.131.26.203/med-detective-menopace/ | ✅ 200 | 2ms | |
| Fables legacy | http://31.131.26.203/med-detective-fables/ | ✅ 200 | 1ms |
Дія: через 30 днів можна вимкнути legacy paths, лишити лише subdomain'и.
Архітектура змішана: Firebase Hosting (frontend, prod) + новий Docker Flask backend на VPS (для майбутніх API).
| Variant | Endpoint | Status | Час | Notes |
|---|---|---|---|---|
| Flask backend | https://biogaia.deltamedicalservices.online/ | ✅ 200 | 104ms | Docker container, gunicorn |
| Legacy backend | http://31.131.26.203/biogaia/ | ✅ 200 | 2ms | Host Caddy proxy |
| Firebase prod | https://biogaia-storybook-dm1.web.app/ | ✅ 200 | 192ms | Реальний прод-сайт казок |
Open issue: app.py має /api/config endpoint що віддає Gemini API key у frontend (рядок 23 wiki). Це той самий ключ що захардкоджений у script.js. Потрібен HTTP referrer restriction на biogaia-storybook-dm1 ключі (вже зроблено Antigravity 14.04).
3D візуалізатор продукту. nginx-static контейнер з read-only HTML mount + tmpfs.
| Variant | Endpoint | Status | Час |
|---|---|---|---|
| v1 | https://brocken.deltamedicalservices.online/ | ✅ 200 | 95ms |
| v2 | https://brocken-v2.deltamedicalservices.online/ | ✅ 200 | 93ms |
| v1 legacy | http://31.131.26.203/brocken/ | ✅ 200 | 2ms |
| v2 legacy | http://31.131.26.203/brocken-v2/ | ✅ 200 | 1ms |
| Variant | Endpoint | Status | Час |
|---|---|---|---|
| Subdomain | https://proflex.deltamedicalservices.online/ | ✅ 200 | 106ms |
| Legacy | http://31.131.26.203/proflex-game/ | ✅ 200 | 2ms |
Критично щоб ці URL'и були публічні без auth — Meta та TikTok посилають OAuth callback'и сюди.
| Service | Endpoint | Status | Notes |
|---|---|---|---|
| Threads OAuth | https://threads.deltamedicalservices.online/healthz | ✅ 200 | Production OAuth callback для Pediatric News |
| Threads legacy | http://31.131.26.203/threads/healthz | ✅ 200 | Backwards-compat |
| TikTok OAuth | https://tiktok.deltamedicalservices.online/healthz | ✅ 200 | TikTok app callback |
| TikTok legacy | http://31.131.26.203/tiktok-oauth/healthz | ⚠️ 404 | Path matcher mismatch — /tiktok-oauth/healthz ходить далі через docker→host→backend, але /healthz endpoint може мати специфіку. Minor — production subdomain працює. |
Pediatric News config: /srv/passepartout/meta/threads/pediatric-news-token.txt.meta — scopes threads_basic, threads_content_publish, threads_manage_replies, expires 2026-08-08.
Доступ: sergey:VWremldNzSmcD23EDlLpVzxM (зберігся у /srv/passepartout/internal/basic-auth.txt)
| Endpoint | Status (no auth) | Notes |
|---|---|---|
| https://internal.delta.../reports/ | 401 → 405 з auth | uvicorn endpoint, метод HEAD не дозволено. GET повертає 200. |
| https://internal.delta.../grafana/ | 200 | Grafana sign-in page (own auth поверх basic_auth) |
| https://internal.delta.../memory/ | 401 | Perlite has own basic_auth теж (sergey user) — подвійний auth |
| https://internal.delta.../dashboard/ | 405 | Resource dashboard backend |
| https://internal.delta.../m/ | 401 | Mobile-hub (потрібно ще одне auth, той самий user) |
| https://internal.delta.../browser/ | 200 | ⚠️ Той же VNC що без auth — basic_auth обмежує |
Status: subdomain працює, basic_auth + Cloudflare TLS захищають. Чергова перевірка пасе вранці.
| Endpoint | Status | Auth | Backend |
|---|---|---|---|
| http://31.131.26.203/reports/ | 405 (HEAD) | 🔓 без | uvicorn :8081 (GET повертає 200) |
| http://31.131.26.203/memory/ | 401 | 🔒 perlite basic_auth | perlite-nginx :8090 |
| http://31.131.26.203/grafana/ | 200 | 🔒 own login | grafana :3001 |
| http://31.131.26.203/dashboard/ | 405 | 🔓 без | resource-dashboard :8773 |
| http://31.131.26.203/m/ | 401 | 🔒 sergey | mobile-hub file_server |
| http://31.131.26.203/family-tree-mvp/ | 401 | 🔒 family | port :8774 |
| http://31.131.26.203/arteggia-admin/ | 401 | 🔒 admin | arteggia-bot admin |
| http://31.131.26.203/pharmagen/ | 401 | 🔒 admin | pharmagen :8770 |
| http://31.131.26.203/pharmagen-kz/ | 401 | 🔒 admin | pharmagen-kz :8771 |
| http://31.131.26.203/browser/ | 🔴 200 | БЕЗ auth! | noVNC → x11vnc --nopw |
🔴 КРИТИЧНО: /browser/ без basic_auth — це та сама дірка з security audit вранці. Через нього доступ до X-server VPS, де живуть cookies для add.ua, Looker Studio, Google Ads UI. Дія: додати basic_auth у /etc/caddy/conf.d/browser.caddy.
| Endpoint | Status | Notes |
|---|---|---|
| https://n8n.31-131-26-203.nip.io/ | ❌ TLS error 525 | nip.io не у Cloudflare zone → DNS-01 challenge не може issue cert |
| https://31-131-26-203.nip.io/ | ❌ TLS error | Те ж саме |
Корінь: Docker Caddy ACME через cloudflare DNS plugin працює ТІЛЬКИ для deltamedicalservices.online zone. Для nip.io потрібен HTTP-01 challenge (вони не мають DNS API).
Дія (вибір):
n8n.deltamedicalservices.online (новий Cloudflare DNS record + Caddy block). 10 хв роботи./n8n/ шлях через internal subdomain працює.Тимчасово: доступ до n8n editor через https://internal.deltamedicalservices.online/n8n/ (basic_auth) — потенційно. Зараз цей шлях не маршрутизується (host Caddy не має /n8n/ handle).
| Endpoint | Status | Notes |
|---|---|---|
| http://deltamedicalservices.online/ | ✅ 200 | Caddy placeholder «Subdomains coming soon» |
Корінь домен пустий. Заплановано як корпоративний site Delta Medical.
/browser/ без auth — VNC до X-server публічний. Та сама дірка з security audit. Дія: додати basic_auth у browser.caddy.n8n.deltamedicalservices.online subdomain./tiktok-oauth/healthz — 404 (production subdomain tiktok.deltamedicalservices.online/healthz ОК). Minor, можна ігнорувати або диагностувати path-matcher у host Caddy./reports/ HEAD → 405 — це нормально для uvicorn FastAPI (метод не дозволено). GET повертає 200./memory/, /m/, та інші auth-протектовані шляхи правильно повертають 401 без credentials./memory/ — Caddy basic_auth + perlite own auth. Працює, але незручно. Можна прибрати perlite auth.decisions_log.md 2026-05-12 [infra/public-stack]/srv/public-stack/docker-compose.yml/srv/public-stack/caddy/Caddyfile/etc/caddy/Caddyfiledecisions_log.md 2026-05-12 [security/posture]