mirror of
https://github.com/basnijholt/compose-farm.git
synced 2026-02-03 14:13:26 +00:00
* config: Add local_host and web_stack options Allow configuring local_host and web_stack in compose-farm.yaml instead of requiring environment variables. This makes it easier to deploy the web UI with just a config file mount. - local_host: specifies which host is "local" for Glances connectivity - web_stack: identifies the web UI stack for self-update detection Environment variables (CF_LOCAL_HOST, CF_WEB_STACK) still work as fallback for backwards compatibility. Closes #152 * docs: Clarify glances_stack is used by CLI and web UI * config: Env vars override config, add docs - Change precedence: environment variables now override config values (follows 12-factor app pattern) - Document all CF_* environment variables in configuration.md - Update example-config.yaml to mention env var overrides * config: Consolidate env vars, prefer config options - Update docker-compose.yml to comment out CF_WEB_STACK and CF_LOCAL_HOST (now prefer setting in compose-farm.yaml) - Update init-env to comment out CF_LOCAL_HOST (can be set in config) - Update docker-deployment.md with new "Config option" column - Simplify troubleshooting to prefer config over env vars * config: Generate CF_LOCAL_HOST with config alternative note Instead of commenting out CF_LOCAL_HOST, generate it normally but add a note in the comment that it can also be set as 'local_host' in config. * config: Extend local_host to all web UI operations When running the web UI in a Docker container, is_local() can't detect which host the container is on due to different network namespaces. Previously local_host/CF_LOCAL_HOST only affected Glances connectivity. Now it also affects: - Container exec/shell (runs locally instead of via SSH) - File editing (uses local filesystem instead of SSH) Added is_local_host() helper that checks CF_LOCAL_HOST/config.local_host first, then falls back to is_local() detection. * refactor: DRY get_web_stack helper, add tests - Move get_web_stack to deps.py to avoid duplication in streaming.py and actions.py - Add tests for config.local_host and config.web_stack parsing - Add tests for is_local_host, get_web_stack, and get_local_host helpers - Tests verify env var precedence over config values * glances: rely on CF_WEB_STACK for container mode Restore docker-compose env defaults and document local_host scope. * web: ignore local_host outside container Document container-only behavior and adjust tests. * web: infer local host from web_stack Drop local_host config option and update docs/tests. * Remove CF_LOCAL_HOST override * refactor: move web_stack helpers to Config class - Add get_web_stack() and get_local_host_from_web_stack() as Config methods - Remove duplicate _get_local_host_from_web_stack() from glances.py and deps.py - Update deps.py get_web_stack() to delegate to Config method - Add comprehensive tests for the new Config methods * config: remove web_stack config option The web_stack config option was redundant since: - In Docker, CF_WEB_STACK env var is always set - Outside Docker, the container-specific behavior is disabled anyway Simplify by only using the CF_WEB_STACK environment variable. * refactor: remove get_web_stack wrapper from deps Callers now use config.get_web_stack() directly instead of going through a pointless wrapper function. * prompts: add rule to identify pointless wrapper functions
71 lines
3.2 KiB
YAML
71 lines
3.2 KiB
YAML
services:
|
|
cf:
|
|
image: ghcr.io/basnijholt/compose-farm:latest
|
|
# Run as current user to preserve file ownership on mounted volumes
|
|
# Set CF_UID=$(id -u) CF_GID=$(id -g) in your environment or .env file
|
|
# Defaults to root (0:0) for backwards compatibility
|
|
user: "${CF_UID:-0}:${CF_GID:-0}"
|
|
volumes:
|
|
# Compose directory (contains compose files AND compose-farm.yaml config)
|
|
- ${CF_COMPOSE_DIR:-/opt/stacks}:${CF_COMPOSE_DIR:-/opt/stacks}
|
|
# SSH keys for passwordless auth (generated by `cf ssh setup`)
|
|
# Choose ONE option below (use the same option for both cf and web services):
|
|
# Option 1: Host path (default) - keys at ~/.ssh/compose-farm/id_ed25519
|
|
- ${CF_SSH_DIR:-~/.ssh/compose-farm}:${CF_HOME:-/root}/.ssh/compose-farm
|
|
# Option 2: Named volume - managed by Docker, shared between services
|
|
# - cf-ssh:${CF_HOME:-/root}/.ssh
|
|
# Option 3: SSH agent forwarding (uncomment if using ssh-agent)
|
|
# - ${SSH_AUTH_SOCK}:/ssh-agent:ro
|
|
environment:
|
|
- SSH_AUTH_SOCK=/ssh-agent
|
|
# Config file path (state stored alongside it)
|
|
- CF_CONFIG=${CF_COMPOSE_DIR:-/opt/stacks}/compose-farm.yaml
|
|
# HOME must match the user running the container for SSH to find keys
|
|
- HOME=${CF_HOME:-/root}
|
|
# USER is required for SSH when running as non-root (UID not in /etc/passwd)
|
|
- USER=${CF_USER:-root}
|
|
|
|
web:
|
|
image: ghcr.io/basnijholt/compose-farm:latest
|
|
restart: unless-stopped
|
|
command: web --host 0.0.0.0 --port 9000
|
|
# Run as current user to preserve file ownership on mounted volumes
|
|
user: "${CF_UID:-0}:${CF_GID:-0}"
|
|
volumes:
|
|
- ${CF_COMPOSE_DIR:-/opt/stacks}:${CF_COMPOSE_DIR:-/opt/stacks}
|
|
# SSH keys - use the SAME option as cf service above
|
|
# Option 1: Host path (default)
|
|
- ${CF_SSH_DIR:-~/.ssh/compose-farm}:${CF_HOME:-/root}/.ssh/compose-farm
|
|
# Option 2: Named volume
|
|
# - cf-ssh:${CF_HOME:-/root}/.ssh
|
|
# Option 3: SSH agent forwarding (uncomment if using ssh-agent)
|
|
# - ${SSH_AUTH_SOCK}:/ssh-agent:ro
|
|
# XDG config dir for backups and image digest logs (persists across restarts)
|
|
- ${CF_XDG_CONFIG:-~/.config/compose-farm}:${CF_HOME:-/root}/.config/compose-farm
|
|
environment:
|
|
- SSH_AUTH_SOCK=/ssh-agent
|
|
- CF_CONFIG=${CF_COMPOSE_DIR:-/opt/stacks}/compose-farm.yaml
|
|
# Used to detect self-updates and run via SSH to survive container restart
|
|
- CF_WEB_STACK=compose-farm
|
|
# HOME must match the user running the container for SSH to find keys
|
|
- HOME=${CF_HOME:-/root}
|
|
# USER is required for SSH when running as non-root (UID not in /etc/passwd)
|
|
- USER=${CF_USER:-root}
|
|
labels:
|
|
- traefik.enable=true
|
|
- traefik.http.routers.compose-farm.rule=Host(`compose-farm.${DOMAIN}`)
|
|
- traefik.http.routers.compose-farm.entrypoints=websecure
|
|
- traefik.http.routers.compose-farm-local.rule=Host(`compose-farm.local`)
|
|
- traefik.http.routers.compose-farm-local.entrypoints=web
|
|
- traefik.http.services.compose-farm.loadbalancer.server.port=9000
|
|
networks:
|
|
- mynetwork
|
|
|
|
networks:
|
|
mynetwork:
|
|
external: true
|
|
|
|
volumes:
|
|
cf-ssh:
|
|
# Only used if Option 2 is selected above
|