feat: add Dockerfile for tf-docs service + document keep-streaming decision
This commit is contained in:
+14
@@ -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"]
|
||||||
@@ -82,3 +82,47 @@ TL;DR: docs (HTML/CSS/JS, обычно мелкие) стримятся чере
|
|||||||
**Further Considerations**
|
**Further Considerations**
|
||||||
1. Точное значение `STREAM_MAX_BYTES` и итоговый `S3_PUBLIC_BASE_URL` (path-style vs virtual-host style у Ceph RGW) — уточнить на этапе реализации/тестирования, не блокирует план.
|
1. Точное значение `STREAM_MAX_BYTES` и итоговый `S3_PUBLIC_BASE_URL` (path-style vs virtual-host style у Ceph RGW) — уточнить на этапе реализации/тестирования, не блокирует план.
|
||||||
2. Нужен ли листинг версий/лендинг на tf_docs (как у registry `/v1/providers/*/versions`) — сейчас не включено в scope, можно добавить отдельным шагом при необходимости.
|
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` не найдётся в контейнере).
|
||||||
|
|||||||
Reference in New Issue
Block a user