26b29e1d7e
Cold load served ALL static + API responses uncompressed and without cache headers (~3.7MB over the wire). Delivery only — feature behavior unchanged; no DB/API-contract/MCP changes. - apps/client/vite.config.ts: vite-plugin-compression2 emits .br + .gz next to each built asset (excludes index.html, which the server rewrites at boot with window.CONFIG — a precompressed copy would go stale). Build emits 187 .br / 175 .gz under dist/assets. - static.module.ts: @fastify/static `preCompressed: true` serves the .br/.gz neighbour; `setHeaders` sets `immutable` ONLY for content-hashed /assets/*, `no-cache` for index.html, and leaves non-hashed files (locales, vad, icons, manifest) on default etag/last-modified revalidation. - main.ts: @fastify/compress (threshold 1024) compresses dynamic API JSON + the rewritten share-SEO HTML. SSE is safe on two counts: `text/event-stream` is not mime-db-compressible (allowlist skips it) AND the AI-chat stream hijacks the raw socket (pipeUIMessageStreamToResponse -> res.raw), bypassing the Fastify onSend lifecycle entirely. No double-compression with preCompressed static (compress skips already-Content-Encoding'd responses). - docker-compose.yml: comment recommending an optional HTTP/2 + brotli reverse proxy (not required). Deps: apps/client vite-plugin-compression2 2.5.3 (dev), apps/server @fastify/compress 9.0.0 (matches fastify 5.8.5). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
46 lines
1.3 KiB
YAML
46 lines
1.3 KiB
YAML
services:
|
|
docmost:
|
|
image: ghcr.io/vvzvlad/gitmost:latest
|
|
depends_on:
|
|
- db
|
|
- redis
|
|
environment:
|
|
APP_URL: 'http://localhost:3000'
|
|
APP_SECRET: 'REPLACE_WITH_LONG_SECRET'
|
|
DATABASE_URL: 'postgresql://docmost:STRONG_DB_PASSWORD@db:5432/docmost'
|
|
REDIS_URL: 'redis://redis:6379'
|
|
ports:
|
|
- "3000:3000"
|
|
restart: unless-stopped
|
|
# The app already serves precompressed (brotli/gzip) static assets with
|
|
# long-lived cache headers and gzips dynamic API responses. For the best
|
|
# cold-load latency you can OPTIONALLY put a reverse proxy (caddy / nginx /
|
|
# traefik) in front with HTTP/2 (or HTTP/3) and brotli enabled — none is
|
|
# required for compression to work.
|
|
volumes:
|
|
- docmost:/app/data/storage
|
|
|
|
db:
|
|
# pgvector image (same Postgres major as postgres:18) so `CREATE EXTENSION
|
|
# vector` succeeds for the page_embeddings RAG table.
|
|
image: pgvector/pgvector:pg18
|
|
environment:
|
|
POSTGRES_DB: docmost
|
|
POSTGRES_USER: docmost
|
|
POSTGRES_PASSWORD: STRONG_DB_PASSWORD
|
|
restart: unless-stopped
|
|
volumes:
|
|
- db_data:/var/lib/postgresql
|
|
|
|
redis:
|
|
image: redis:8
|
|
command: ["redis-server", "--appendonly", "yes", "--maxmemory-policy", "noeviction"]
|
|
restart: unless-stopped
|
|
volumes:
|
|
- redis_data:/data
|
|
|
|
volumes:
|
|
docmost:
|
|
db_data:
|
|
redis_data:
|