From fe67511203883ff54d1c9fcec15aad6a32a827c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Wed, 2 Sep 2026 14:40:48 +0300 Subject: [PATCH] feat: add Dockerfile for tf-docs service + document keep-streaming decision --- Dockerfile | 14 ++++++ ...26-09-02_docs_pipeline_and_tf_docs_plan.md | 44 +++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..770ced0 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,14 @@ +FROM node:18-alpine + +WORKDIR /app + +COPY package.json package-lock.json ./ +RUN npm ci --omit=dev + +COPY server.js ./ + +ENV NODE_ENV=production + +EXPOSE 3000 + +CMD ["node", "server.js"] diff --git a/HISTORY/2026-09-02_docs_pipeline_and_tf_docs_plan.md b/HISTORY/2026-09-02_docs_pipeline_and_tf_docs_plan.md index 8d738f7..1f55f4b 100644 --- a/HISTORY/2026-09-02_docs_pipeline_and_tf_docs_plan.md +++ b/HISTORY/2026-09-02_docs_pipeline_and_tf_docs_plan.md @@ -82,3 +82,47 @@ TL;DR: docs (HTML/CSS/JS, обычно мелкие) стримятся чере **Further Considerations** 1. Точное значение `STREAM_MAX_BYTES` и итоговый `S3_PUBLIC_BASE_URL` (path-style vs virtual-host style у Ceph RGW) — уточнить на этапе реализации/тестирования, не блокирует план. 2. Нужен ли листинг версий/лендинг на tf_docs (как у registry `/v1/providers/*/versions`) — сейчас не включено в scope, можно добавить отдельным шагом при необходимости. + +--- + +## Решение по вариантам реализации (2026-09-02, дополнение) + +Обнаружено, что `tf_docs/server.js` уже закоммичен (`4876f82 feat: add S3-backed documentation streaming service`) и использует `@aws-sdk/client-s3` (`GetObjectCommand` + `HeadBucketCommand`) — стримит весь контент через pod, без redirect. Зависимость `@aws-sdk/client-s3@3.879.0` уже в `package.json`. + +Рассматривались два варианта: + +1. **Redirect-версия** (по плану выше): мелкие HTML/CSS/JS стримить через pod, крупные/нестандартные файлы отдавать `302` на прямой публичный S3 URL; только stdlib Node. +2. **AWS SDK-версия** (закоммиченная): стримить весь контент через pod. + +**Принято решение: оставить вариант 2, протестировать; перейти на вариант 1 только при реальных проблемах (таймауты/обрывы на крупных файлах).** + +Обоснование: + +- типовая документация MkDocs — мелкие HTML/CSS/JS, стриминг через pod не создаёт проблем; +- вариант 2 позволяет держать бакет `docs/*` приватным (без public policy); +- redirect нужен только при появлении крупных вложений (attachments/zip/pdf/видео). + +Критерии перехода на вариант 1: + +- крупный файл (pdf/zip > 2MB) через `/docs/...` обрывается или таймаутит; +- деградация при параллельных запросах; +- неприемлемая latency двойного hop (браузер → pod → S3). + +Прецедент для варианта 1: инцидент `/v1/proxy` для бинарников провайдера — стриминг ZIP через pod обрывался на ~20KB, заменён на HTTP 302 redirect (см. `tf_registry/HISTORY/incident-2026-09-01-proxy-s3-dns.md`). + +Redirect-версия (вариант 1) сгенерирована DeepSeek Flash, но **не записана** в `server.js`, чтобы не перезаписывать закоммиченный код. При переходе менять только `server.js`. + +**Dockerfile** — до этого отсутствовал, создан и скорректирован под вариант 2: + +```dockerfile +FROM node:18-alpine +WORKDIR /app +COPY package.json package-lock.json ./ +RUN npm ci --omit=dev +COPY server.js ./ +ENV NODE_ENV=production +EXPOSE 3000 +CMD ["node", "server.js"] +``` + +(установка зависимостей обязательна — иначе `@aws-sdk/client-s3` не найдётся в контейнере).