Replace hardcoded host-side bind-mount paths with env vars so Nomad
jobspecs can reuse the same variables at cutover:
- CLAUDE_BIN_DIR: path to claude CLI binary (resolved at init time)
- CLAUDE_CONFIG_FILE: path to .claude.json (default ${HOME}/.claude.json)
- CLAUDE_DIR: path to .claude directory (default ${HOME}/.claude)
- AGENT_SSH_DIR: path to SSH keys (default ${HOME}/.ssh)
- SOPS_AGE_DIR: path to SOPS age keys (default ${HOME}/.config/sops/age)
generators.sh now writes CLAUDE_BIN_DIR to .env instead of sed-replacing
CLAUDE_BIN_PLACEHOLDER in docker-compose.yml.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
136 lines
9.8 KiB
Text
136 lines
9.8 KiB
Text
# Disinto — Environment Configuration
|
|
# Copy to .env and fill in your values.
|
|
# NEVER commit .env to the repo.
|
|
#
|
|
# With SOPS + age installed, `disinto init` encrypts secrets into .env.enc
|
|
# and removes plaintext .env. To migrate an existing .env: `disinto secrets migrate`
|
|
#
|
|
# Variables marked [SECRET] are credentials that grant access if leaked.
|
|
# Variables marked [CONFIG] are non-sensitive and safe in plaintext.
|
|
|
|
# ── Per-project config ────────────────────────────────────────────────────
|
|
# Project-specific settings (FORGE_REPO, PROJECT_REPO_ROOT, PRIMARY_BRANCH,
|
|
# WOODPECKER_REPO_ID) now live in projects/*.toml — see projects/harb.toml
|
|
# for an example. Do NOT set them here; they leak into every session.
|
|
|
|
# ── Forge (Forgejo) ─────────────────────────────────────────────────────
|
|
FORGE_URL=http://localhost:3000 # [CONFIG] local Forgejo instance
|
|
|
|
# ── Auth tokens ───────────────────────────────────────────────────────────
|
|
# Each agent has its own Forgejo account and API token (#747).
|
|
# Per-agent tokens fall back to FORGE_TOKEN if not set.
|
|
#
|
|
# Tokens and passwords are auto-generated by `disinto init` and stored in .env.
|
|
# Each bot user gets:
|
|
# - FORGE_TOKEN_<BOT> = API token for REST calls (user identity via /api/v1/user)
|
|
# - FORGE_PASS_<BOT> = password for git HTTP push (#361, Forgejo 11.x limitation)
|
|
#
|
|
# Local-model agents (agents-llama) use FORGE_TOKEN_LLAMA / FORGE_PASS_LLAMA
|
|
# with FORGE_BOT_USER_LLAMA=dev-qwen to ensure correct attribution (#563).
|
|
FORGE_TOKEN= # [SECRET] dev-bot API token (default for all agents)
|
|
FORGE_PASS= # [SECRET] dev-bot password for git HTTP push (#361)
|
|
FORGE_TOKEN_LLAMA= # [SECRET] dev-qwen API token (for agents-llama)
|
|
FORGE_PASS_LLAMA= # [SECRET] dev-qwen password for git HTTP push
|
|
FORGE_REVIEW_TOKEN= # [SECRET] review-bot API token
|
|
FORGE_REVIEW_PASS= # [SECRET] review-bot password for git HTTP push
|
|
FORGE_PLANNER_TOKEN= # [SECRET] planner-bot API token
|
|
FORGE_PLANNER_PASS= # [SECRET] planner-bot password for git HTTP push
|
|
FORGE_GARDENER_TOKEN= # [SECRET] gardener-bot API token
|
|
FORGE_GARDENER_PASS= # [SECRET] gardener-bot password for git HTTP push
|
|
FORGE_VAULT_TOKEN= # [SECRET] vault-bot API token
|
|
FORGE_VAULT_PASS= # [SECRET] vault-bot password for git HTTP push
|
|
FORGE_SUPERVISOR_TOKEN= # [SECRET] supervisor-bot API token
|
|
FORGE_SUPERVISOR_PASS= # [SECRET] supervisor-bot password for git HTTP push
|
|
FORGE_PREDICTOR_TOKEN= # [SECRET] predictor-bot API token
|
|
FORGE_PREDICTOR_PASS= # [SECRET] predictor-bot password for git HTTP push
|
|
FORGE_ARCHITECT_TOKEN= # [SECRET] architect-bot API token
|
|
FORGE_ARCHITECT_PASS= # [SECRET] architect-bot password for git HTTP push
|
|
FORGE_FILER_TOKEN= # [SECRET] filer-bot API token (issues:write on project repo only)
|
|
FORGE_FILER_PASS= # [SECRET] filer-bot password for git HTTP push
|
|
FORGE_BOT_USERNAMES=dev-bot,review-bot,planner-bot,gardener-bot,vault-bot,supervisor-bot,predictor-bot,architect-bot,filer-bot
|
|
|
|
# ── Backwards compatibility ───────────────────────────────────────────────
|
|
# If CODEBERG_TOKEN is set but FORGE_TOKEN is not, env.sh falls back to
|
|
# CODEBERG_TOKEN automatically (same for REVIEW_BOT_TOKEN, CODEBERG_REPO,
|
|
# CODEBERG_BOT_USERNAMES). No action needed for existing deployments.
|
|
# Per-agent tokens default to FORGE_TOKEN when unset (single-token setups).
|
|
#
|
|
# Note: `disinto init` auto-generates all bot tokens/passwords when you
|
|
# configure [agents.llama] in a project TOML. The credentials are stored
|
|
# in .env.enc (encrypted) or .env (plaintext fallback).
|
|
|
|
# ── Woodpecker CI ─────────────────────────────────────────────────────────
|
|
WOODPECKER_TOKEN= # [SECRET] Woodpecker API token
|
|
WOODPECKER_SERVER=http://localhost:8000 # [CONFIG] Woodpecker server URL
|
|
WOODPECKER_AGENT_SECRET= # [SECRET] shared secret for server↔agent auth (auto-generated)
|
|
# Woodpecker privileged-plugin allowlist — comma-separated image names
|
|
# Add plugins/docker (and others) here to allow privileged execution
|
|
WOODPECKER_PLUGINS_PRIVILEGED=plugins/docker
|
|
|
|
# WOODPECKER_REPO_ID — now per-project, set in projects/*.toml [ci] section
|
|
|
|
# Woodpecker Postgres (for direct DB queries)
|
|
WOODPECKER_DB_PASSWORD= # [SECRET] Postgres password
|
|
WOODPECKER_DB_USER=woodpecker # [CONFIG] Postgres user
|
|
WOODPECKER_DB_HOST=127.0.0.1 # [CONFIG] Postgres host
|
|
WOODPECKER_DB_NAME=woodpecker # [CONFIG] Postgres database name
|
|
|
|
# ── Chat OAuth (#708) ────────────────────────────────────────────────────
|
|
CHAT_OAUTH_CLIENT_ID= # [SECRET] Chat OAuth2 client ID (auto-generated by init)
|
|
CHAT_OAUTH_CLIENT_SECRET= # [SECRET] Chat OAuth2 client secret (auto-generated by init)
|
|
DISINTO_CHAT_ALLOWED_USERS= # [CONFIG] CSV of allowed usernames (disinto-admin always allowed)
|
|
FORWARD_AUTH_SECRET= # [SECRET] Shared secret for Caddy ↔ chat forward_auth (#709)
|
|
|
|
# ── Vault-only secrets (DO NOT put these in .env) ────────────────────────
|
|
# These tokens grant access to external systems (GitHub, ClawHub, deploy targets).
|
|
# They live ONLY in secrets/<NAME>.enc (age-encrypted, one file per key) and are
|
|
# decrypted into the ephemeral runner container at fire time (#745, #777).
|
|
# lib/env.sh explicitly unsets them so agents can never hold them directly —
|
|
# all external actions go through vault dispatch.
|
|
#
|
|
# GITHUB_TOKEN — GitHub API access (publish, deploy, post)
|
|
# CLAWHUB_TOKEN — ClawHub registry credentials (publish)
|
|
# CADDY_SSH_KEY — SSH key for Caddy log collection
|
|
# (deploy keys) — SSH keys for deployment targets
|
|
#
|
|
# To manage secrets: disinto secrets add/show/remove/list
|
|
|
|
# ── Project-specific secrets ──────────────────────────────────────────────
|
|
# Store all project secrets here so formulas reference env vars, never hardcode.
|
|
BASE_RPC_URL= # [SECRET] on-chain RPC endpoint
|
|
|
|
# ── Local Qwen dev agent (optional) ──────────────────────────────────────
|
|
# Set ENABLE_LLAMA_AGENT=1 to emit agents-llama in docker-compose.yml.
|
|
# Requires a running llama-server reachable at ANTHROPIC_BASE_URL.
|
|
# See docs/agents-llama.md for details.
|
|
ENABLE_LLAMA_AGENT=0 # [CONFIG] 1 = enable agents-llama service
|
|
ANTHROPIC_BASE_URL= # [CONFIG] e.g. http://host.docker.internal:8081
|
|
|
|
# ── Tuning ────────────────────────────────────────────────────────────────
|
|
CLAUDE_TIMEOUT=7200 # [CONFIG] max seconds per Claude invocation
|
|
|
|
# ── Host paths (Nomad-portable) ────────────────────────────────────────────
|
|
# These env vars externalize host-side bind-mount paths from docker-compose.yml.
|
|
# At cutover, Nomad jobspecs reference the same vars — no path translation.
|
|
# Defaults point at current paths so an empty .env override still works.
|
|
CLAUDE_BIN_DIR=/usr/local/bin/claude # [CONFIG] host path to claude CLI binary (resolved by `disinto init`)
|
|
CLAUDE_CONFIG_FILE=${HOME}/.claude.json # [CONFIG] host path to claude config JSON file
|
|
CLAUDE_DIR=${HOME}/.claude # [CONFIG] host path to .claude directory (reproduce/edge)
|
|
AGENT_SSH_DIR=${HOME}/.ssh # [CONFIG] host path to SSH keys directory
|
|
SOPS_AGE_DIR=${HOME}/.config/sops/age # [CONFIG] host path to SOPS age key directory
|
|
|
|
# ── Claude Code shared OAuth state ─────────────────────────────────────────
|
|
# Shared directory used by every factory container so Claude Code's internal
|
|
# proper-lockfile-based OAuth refresh lock works across containers. Both
|
|
# values must live outside $HOME (so docker bind mounts don't depend on UID
|
|
# mapping) and must be the same absolute path on host and inside each
|
|
# container. See docs/CLAUDE-AUTH-CONCURRENCY.md.
|
|
CLAUDE_SHARED_DIR=/var/lib/disinto/claude-shared
|
|
CLAUDE_CONFIG_DIR=${CLAUDE_SHARED_DIR}/config
|
|
|
|
# ── Factory safety ────────────────────────────────────────────────────────
|
|
# Disables Claude Code auto-updater, telemetry, error reporting, and bug
|
|
# command. Factory sessions are production processes — they must never phone
|
|
# home or auto-update mid-session. Added after #725 (crash during red-team run).
|
|
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 # [CONFIG] suppress all non-essential traffic
|
|
|