nginx-proxy (new role): - Shared nginx + certbot under /opt/nginx, replacing the copies that lived inside the Paperclip compose project - Apps publish via tasks_from: add_vhost (cert marker -> issue cert -> write vhost -> nginx -t -> reload); a vhost that fails nginx -t is rolled back - Certs issued one per domain via Cloudflare DNS challenge; domains registered as marker files in cert-domains/; optional LE staging - Stock nginx.conf plus conf.d (directory mounts, not single-file mounts); catch-all server drops unknown Host/SNI - Containers renamed to nginx and certbot hermes_docker (new role): - Official Hermes image, host networking, gateway and dashboard bound to loopback and published through nginx-proxy - Dashboard login via basic-auth provider, secrets from the vault - Main model set from hermes_model (fantasmic endpoint, key from vault); config.yaml overrides are merged from a 0600 staged file that is removed afterwards, so the key never appears in a command line - Data dir owner-only (HERMES_HOME_MODE=0700) paperclip-docker: - Remove nginx, certbot and docker-compose download tasks; deploy with community.docker.docker_compose_v2 (idempotent, remove_orphans) - Stop passing the Cloudflare token and certbot email to the Paperclip container via env_file - Bind Postgres to 127.0.0.1 (host networking exposed it on all interfaces); stop chowning pgdata, which the postgres image owns - Handler recreates the paperclip service so .env changes apply - Domain m-v.wdw-labs.cloud -> cranium-command.wdw-labs.cloud Playbooks: - Add day1_deploy_nginx_proxy.yml and day1_deploy_hermes_docker.yml - deploy_paperclip_stack.yml: run nginx-proxy before paperclip-docker, CLI-based container checks (no Docker SDK dependency) - Remove deploy-hermes.yml Host vars: add nginx_proxy_certbot_email and nginx_proxy_certbot_staging (staging stays on until the switch to real certs).
41 lines
978 B
Django/Jinja
41 lines
978 B
Django/Jinja
{
|
|
"$schema": "https://opencode.ai/config.json",
|
|
"provider": {
|
|
"illuminations": {
|
|
"npm": "@ai-sdk/openai-compatible",
|
|
"name": "illuminations",
|
|
"models": {
|
|
"gemma-4-26b": {
|
|
"id": "Gemma-4-26B-A4B-it-AWQ",
|
|
"name": "Gemma 4 26B (Local AWQ)"
|
|
}
|
|
},
|
|
"options": {
|
|
"baseURL": "{{ illuminations_endpoint }}/v1",
|
|
"headers": {
|
|
"Authorization": "Bearer {env:ILLUMINATIONS_API_KEY}"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"provider": {
|
|
"fantasmic": {
|
|
"npm": "@ai-sdk/openai-compatible",
|
|
"name": "fantasmic",
|
|
"models": {
|
|
"gemma-4-26b-hermes": {
|
|
"id": "Gemma-4-26B-A4B-Hermes-VLM-MLX",
|
|
"name": "Gemma 4 26B (Hermes)"
|
|
}
|
|
},
|
|
"options": {
|
|
"baseURL": "{{ fantasmic_endpoint }}/v1",
|
|
"headers": {
|
|
"Authorization": "Bearer {{ vault_fantasmic_api_key }}"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"model": "vllm/gemma-4-26b"
|
|
}
|