mirror of
https://github.com/getpaseo/paseo.git
synced 2026-07-29 12:01:31 +00:00
* Add Docker images and agent Docker Mods Ship official container images that run the Paseo daemon headless. One Dockerfile parametrized by BASE_IMAGE covers Debian 12/13, Ubuntu 22.04/24.04 and Alpine; it bundles Node 22, the npm-published server + CLI, a vendored s6-overlay as PID 1, and a small Docker Mods loader. Agents are chosen at runtime via DOCKER_MODS (pipe-separated mod images). Each mod is a FROM scratch image carrying only an install hook that runs `npm install -g <agent-cli>`; the loader pulls the layers from the registry, extracts them, and runs the hook before the daemon starts, so any requested agent is on PATH when Paseo probes provider availability. - docker/base: Dockerfile, install scripts, s6 services, mods loader - docker/mods/*: claude-code, codex, copilot, opencode, pi - docker/docker-compose.example.yml + docker/README.md - .github/workflows/docker.yml: multi-arch (amd64/arm64) buildx matrix, publishes to ghcr.io/getpaseo on version tags - docs/docker.md + CLAUDE.md docs index row * feat(docker): print pairing QR and link on daemon startup Add an s6 oneshot service that waits for the daemon to listen, then runs `paseo daemon pair` so the pairing QR code and link surface in the container logs. Best-effort: never blocks boot, skips gracefully when relay is disabled. Opt out with PASEO_PAIRING_QR=0. * build(docker): add Arch image support * ci(docker): build Arch without Buildx * docs(docker): document paseo env contract * feat(docker): add opt-in sudo mode * docs(docker): link env references * fix(docker): create agent config dirs * fix(docker): default home to /home/paseo * docs(docker): document agent auth setup * docs(docker): document relay port setup * fix(docker): install Node from tarball * docs: add Docker quick start * docs(docker): remove legacy home example * docs(docker): set container hostname * fix(docker): prepare opencode storage * fix(docker): allow paseo login shell * fix docker opencode permissions * ci(docker): use Node 24 actions * fix(docker): install bzip2 runtime tools * fix(docker): update Pi mod package * fix(docker): quiet default daemon logs * fix(docker): split home from state Docker images now keep HOME at /home/paseo and store Paseo daemon state under /home/paseo/.paseo by default. Existing volumes can keep the old layout by setting PASEO_HOME=/home/paseo. * fix(docker): keep mods out of paseo home * ci(docker): skip alpine arm64 builds * fix(docker): address review findings * fix(docker): verify s6 overlay downloads * fix(docker): honor custom healthcheck port * fix(docker): fail on mod extraction errors * feat(docker): add official container image Ship a focused daemon image with the bundled web UI enabled and document extending it with agent CLIs. * ci(docker): publish images only on stable releases * fix(docker): check daemon health over HTTP --------- Co-authored-by: Herbrant <cdavide98carnemolla@gmail.com>
79 lines
1.9 KiB
Bash
79 lines
1.9 KiB
Bash
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
IMAGE_HOME="/home/paseo"
|
|
|
|
: "${HOME:=$IMAGE_HOME}"
|
|
: "${PASEO_HOME:=${HOME}/.paseo}"
|
|
: "${PASEO_LISTEN:=0.0.0.0:6767}"
|
|
: "${PASEO_WEB_UI_ENABLED:=true}"
|
|
: "${PASEO_LOG_LEVEL:=info}"
|
|
: "${PASEO_LOG_FORMAT:=json}"
|
|
: "${CLAUDE_CONFIG_DIR:=${HOME}/.claude}"
|
|
: "${CODEX_HOME:=${HOME}/.codex}"
|
|
: "${XDG_CONFIG_HOME:=${HOME}/.config}"
|
|
: "${XDG_DATA_HOME:=${HOME}/.local/share}"
|
|
: "${XDG_STATE_HOME:=${HOME}/.local/state}"
|
|
: "${XDG_CACHE_HOME:=${HOME}/.cache}"
|
|
|
|
export HOME
|
|
export PASEO_HOME
|
|
export PASEO_LISTEN
|
|
export PASEO_WEB_UI_ENABLED
|
|
export PASEO_LOG_LEVEL
|
|
export PASEO_LOG_FORMAT
|
|
export CLAUDE_CONFIG_DIR
|
|
export CODEX_HOME
|
|
export XDG_CONFIG_HOME
|
|
export XDG_DATA_HOME
|
|
export XDG_STATE_HOME
|
|
export XDG_CACHE_HOME
|
|
|
|
ensure_dir() {
|
|
local dir="$1"
|
|
mkdir -p "$dir"
|
|
if [[ "$(id -u)" == "0" ]]; then
|
|
local owner
|
|
owner="$(stat -c "%u" "$dir")"
|
|
if [[ "$owner" == "0" ]]; then
|
|
chown paseo:paseo "$dir"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
ensure_dir "$HOME"
|
|
ensure_dir "$PASEO_HOME"
|
|
ensure_dir "$CLAUDE_CONFIG_DIR"
|
|
ensure_dir "$CODEX_HOME"
|
|
ensure_dir "$XDG_CONFIG_HOME"
|
|
ensure_dir "$XDG_DATA_HOME"
|
|
ensure_dir "$XDG_STATE_HOME"
|
|
ensure_dir "$XDG_CACHE_HOME"
|
|
|
|
if [[ "$#" -gt 0 ]]; then
|
|
if [[ "$(id -u)" == "0" ]]; then
|
|
exec gosu paseo "$@"
|
|
fi
|
|
exec "$@"
|
|
fi
|
|
|
|
if [[ -z "${PASEO_PASSWORD:-}" ]]; then
|
|
{
|
|
echo "[paseo] WARNING: PASEO_PASSWORD is not set."
|
|
echo "[paseo] The daemon accepts unauthenticated control connections from any client that can reach it."
|
|
echo "[paseo] Set PASEO_PASSWORD for any published port or network-reachable deployment."
|
|
} >&2
|
|
fi
|
|
|
|
if [[ ! -f /etc/paseo-server-entry ]]; then
|
|
echo "[paseo] FATAL: /etc/paseo-server-entry is missing." >&2
|
|
exit 1
|
|
fi
|
|
|
|
entry="$(cat /etc/paseo-server-entry)"
|
|
echo "[paseo] starting daemon on ${PASEO_LISTEN} with web UI ${PASEO_WEB_UI_ENABLED}"
|
|
if [[ "$(id -u)" == "0" ]]; then
|
|
exec gosu paseo node "$entry"
|
|
fi
|
|
exec node "$entry"
|