Archon/deploy/.env.example
DIY Smart Code d89bc767d2
fix(setup): align PORT default on 3090 across .env.example, wizard, and JSDoc (#1152) (#1271)
The server's getPort() fallback changed from 3000 to 3090 in the Hono
migration (#318), but .env.example, the setup wizard's generated .env,
and the JSDoc describing the fallback were not updated — leaving three
different sources of truth for "the default PORT."

When the wizard writes PORT=3000 to ~/.archon/.env (which the Hono
server loads with override: true, while Vite only reads repo-local
.env), the two processes can land on different ports silently. That
mismatch is the real mechanism behind the failure described in #1152.

- .env.example: comment out PORT, document 3090 as the default
- packages/cli/src/commands/setup.ts: wizard no longer writes PORT=3000
  into the generated .env; fix the "Additional Options" note
- packages/cli/src/commands/setup.test.ts: assert no bare PORT= line and
  the commented default is present
- packages/core/src/utils/port-allocation.ts: fix stale JSDoc "default
  3000" -> "default 3090"
- deploy/.env.example: keep Docker default at 3000 (compose/Caddy target
  that) but annotate it so users don't copy it for local dev

Single source of truth for the local-dev default is now basePort in
port-allocation.ts.
2026-04-17 14:15:37 +02:00

74 lines
3 KiB
Text

# Remote Coding Agent - Environment Configuration
# Copy to .env and fill in your values
# ============================================
# Database (Optional — SQLite is the default for local dev)
# ============================================
# For local development, omit DATABASE_URL entirely — SQLite at ~/.archon/archon.db
# is auto-initialized with zero setup.
#
# For cloud/production deployments, use a managed PostgreSQL (Supabase, Neon, etc.):
DATABASE_URL=postgresql://user:password@host:5432/dbname
# Or uncomment postgres service in docker-compose.yml and use:
# DATABASE_URL=postgresql://postgres:postgres@postgres:5432/remote_coding_agent
# ============================================
# Required: AI Assistant (at least one)
# ============================================
# Claude (recommended) - Get token: claude setup-token
CLAUDE_CODE_OAUTH_TOKEN=sk-ant-oat01-...
# Or Codex - Get from ~/.codex/auth.json after: codex login
# CODEX_ID_TOKEN=...
# CODEX_ACCESS_TOKEN=...
# CODEX_REFRESH_TOKEN=...
# CODEX_ACCOUNT_ID=...
# ============================================
# Required: Platform (at least one)
# ============================================
# Telegram - Create bot via @BotFather
TELEGRAM_BOT_TOKEN=123456789:ABC...
# Discord - Create bot at discord.com/developers
# DISCORD_BOT_TOKEN=...
# Slack - Create app at api.slack.com/apps
# SLACK_BOT_TOKEN=xoxb-...
# SLACK_APP_TOKEN=xapp-...
# GitHub Webhooks
# GH_TOKEN=ghp_...
# GITHUB_TOKEN=ghp_...
# WEBHOOK_SECRET=...
# ============================================
# Optional
# ============================================
PORT=3000 # Docker deployment default (the included compose/Caddy configs target :3000). For local dev (no Docker), omit PORT — server and Vite proxy both default to 3090.
# TELEGRAM_STREAMING_MODE=stream
# DISCORD_STREAMING_MODE=batch
# ============================================
# Basic Auth (optional — recommended for cloud)
# ============================================
# Protects the Web UI and API when exposed to the internet.
# Webhooks (/webhooks/*) and health check (/api/health) are excluded.
# Leave empty to disable (e.g. when using IP-based firewall rules instead).
# To enable:
# 1. Generate hash: docker run caddy caddy hash-password --plaintext 'YOUR_PASSWORD'
# 2. Uncomment and fill in (use $$ to escape $ in bcrypt hashes):
# CADDY_BASIC_AUTH=basicauth @protected { admin $$2a$$14$$REPLACE_WITH_HASH }
# ============================================
# Form Auth (optional — requires --profile auth)
# ============================================
# HTML login page via Caddy forward_auth. Alternative to CADDY_BASIC_AUTH.
# Generate hash: docker run --rm node:22-alpine sh -c \
# "npm install -g bcryptjs 2>/dev/null; node -e \"require('bcryptjs').hash('PASS',12,(e,h)=>console.log(h))\""
# Generate secret: docker run --rm node:22-alpine node -e \
# "console.log(require('crypto').randomBytes(32).toString('hex'))"
# AUTH_USERNAME=admin
# AUTH_PASSWORD_HASH=$2b$12$REPLACE_WITH_HASH
# COOKIE_SECRET=REPLACE_WITH_64_HEX_CHARS