Files
nibiru-framework.com/docs/docker-compose.yml
stephan a44df81b71 Split docs into apex + www containers, add nginx vhost overrides
The acme-companion on the production host doesn't accept comma-separated
VIRTUAL_HOST / LETSENCRYPT_HOST values, so cert issuance was failing for
the combined `nibiru-framework.com,www.nibiru-framework.com` entry.

docker-compose.yml — now defines two services sharing the same image:
  - docs      → VIRTUAL_HOST=nibiru-framework.com (apex)
  - docs-www  → VIRTUAL_HOST=www.nibiru-framework.com (built once, reused)
A YAML anchor (x-docs-shared-env) keeps the Oracle/LLM/Anthropic config in
lockstep so the two containers can never drift.

docs/nginx/vhost.d/ — per-host nginx-proxy overrides applied at the
location-block level by jwilder/nginx-proxy. Both files set:
  - X-Forwarded-* trust + buffering off (Oracle SSE streaming)
  - HSTS / X-Content-Type / X-Frame / Referrer-Policy / Permissions-Policy
  - gzip with the right MIME set for Astro/Starlight assets
  - Aggressive cache on /_astro/ (immutable hashed bundles)
  - 30-day cache on images/fonts
  - no-store on /sw.js (so PWA updates land)
  - 24-hour cache on /llms.txt for AI crawlers
docs/nginx/README.md explains how to mount these into an existing
nginx-proxy (bind-mount + reload, or bake into the proxy image).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 15:45:02 +02:00

106 lines
3.8 KiB
YAML

# =============================================================================
# Nibiru docs site — production compose for jwilder/nginx-proxy
#
# Two containers: one for the apex domain, one for the www. variant.
# jwilder/nginx-proxy + acme-companion don't accept comma-separated values
# on this host, so each hostname needs its own container with a single
# VIRTUAL_HOST + LETSENCRYPT_HOST. Both serve identical content from the
# same image.
#
# Default LLM backend: Ollama at https://api.neuronetz.ai (your own
# instance). No paid API keys required for normal operation.
#
# Prereqs (one-time, on the host):
# docker network create nginx-proxy
#
# Bring up:
# docker compose up -d --build
#
# Update after a docs change:
# git pull && docker compose up -d --build
# =============================================================================
# Shared environment block — referenced by both services via YAML anchors so
# the Oracle/LLM/Anthropic config stays in lockstep across the two domains.
x-docs-shared-env: &docs-shared-env
# --- Oracle: LLM provider (default = your own Ollama on neuronetz.ai) ---
LLM_PROVIDER: ${LLM_PROVIDER:-ollama}
OLLAMA_BASE_URL: ${OLLAMA_BASE_URL:-https://api.neuronetz.ai}
OLLAMA_CHAT_MODEL: ${OLLAMA_CHAT_MODEL:-qwen2.5-coder:14b}
OLLAMA_EMBED_MODEL: ${OLLAMA_EMBED_MODEL:-nomic-embed-text}
EMBED_PROVIDER: ${EMBED_PROVIDER:-ollama}
# --- Optional fallbacks (only used if LLM_PROVIDER=anthropic / EMBED_PROVIDER=openai) ---
ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY:-}
ANTHROPIC_MODEL: ${ANTHROPIC_MODEL:-claude-haiku-4-5-20251001}
OPENAI_API_KEY: ${OPENAI_API_KEY:-}
OPENAI_EMBED_MODEL: ${OPENAI_EMBED_MODEL:-text-embedding-3-small}
ORACLE_TOP_K: ${ORACLE_TOP_K:-6}
ORACLE_MAX_TOKENS: ${ORACLE_MAX_TOKENS:-800}
HOST: 0.0.0.0
PORT: "4321"
# Healthcheck shared between both containers.
x-docs-healthcheck: &docs-healthcheck
test: ["CMD", "wget", "--quiet", "--spider", "http://127.0.0.1:4321/"]
interval: 30s
timeout: 5s
retries: 3
start_period: 20s
services:
# --- Apex: nibiru-framework.com -------------------------------------------
# Builds the image once. The www service below reuses the same tag.
docs:
build:
context: .
dockerfile: Dockerfile
args:
# Used at build time only — to embed docs into the Oracle index.
OLLAMA_BASE_URL: ${OLLAMA_BASE_URL:-https://api.neuronetz.ai}
OLLAMA_EMBED_MODEL: ${OLLAMA_EMBED_MODEL:-nomic-embed-text}
EMBED_PROVIDER: ${EMBED_PROVIDER:-ollama}
image: nibiru-framework/docs:latest
container_name: nibiru-docs
restart: unless-stopped
expose:
- "4321"
environment:
<<: *docs-shared-env
VIRTUAL_HOST: nibiru-framework.com
VIRTUAL_PORT: "4321"
VIRTUAL_PROTO: "http"
LETSENCRYPT_HOST: nibiru-framework.com
LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL:-stephan.kasdorf@bittomine.com}
healthcheck: *docs-healthcheck
networks:
- nginx-proxy
# --- www. variant: www.nibiru-framework.com -------------------------------
# Same image as `docs`. Started after `docs` so the build is reused (Docker
# would otherwise build it again from scratch).
docs-www:
image: nibiru-framework/docs:latest
container_name: nibiru-docs-www
restart: unless-stopped
depends_on:
- docs
expose:
- "4321"
environment:
<<: *docs-shared-env
VIRTUAL_HOST: www.nibiru-framework.com
VIRTUAL_PORT: "4321"
VIRTUAL_PROTO: "http"
LETSENCRYPT_HOST: www.nibiru-framework.com
LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL:-stephan.kasdorf@bittomine.com}
healthcheck: *docs-healthcheck
networks:
- nginx-proxy
networks:
nginx-proxy:
external: true