Direct Docker deployment
The wrapper is the normal operator path. If you want every Docker command in front of you, initialize the same local stack directly:
mkdir -p ~/.config/pr0xteus
docker run --rm --user "$(id -u):$(id -g)" \
-v "$HOME/.config/pr0xteus:/config" \
psyb0t/pr0xteus:latest config init \
--config-dir /config \
--host-config-dir "$HOME/.config/pr0xteus" \
--controller-image psyb0t/pr0xteus:latest
Add your WireGuard file and edit the generated pool and routing files exactly as in the walkthrough. Validate and start it with Docker itself:
docker run --rm --user "$(id -u):$(id -g)" \
-v "$HOME/.config/pr0xteus:/config:ro" \
psyb0t/pr0xteus:latest config check --config-dir /config
docker compose --project-directory "$HOME/.config/pr0xteus" \
--env-file "$HOME/.config/pr0xteus/.env" \
-f "$HOME/.config/pr0xteus/docker-compose.yml" \
-f "$HOME/.config/pr0xteus/docker-compose.host-ports.yml" \
up --detach --pull always
If .env has PR0XTEUS_DISABLE_HOST_PORTS=true, use the generated no-host override instead of the host-ports override:
docker compose --project-directory "$HOME/.config/pr0xteus" \
--env-file "$HOME/.config/pr0xteus/.env" \
-f "$HOME/.config/pr0xteus/docker-compose.yml" \
-f "$HOME/.config/pr0xteus/docker-compose.no-host-ports.yml" \
up --detach --pull always
That local docker-compose.yml is generated by the image and is yours to inspect or run directly. config init also refreshes .env.example while preserving the real .env. The wrapper is only a small guardrail around these same commands. Deployment details include the direct Tailscale command too.