All use cases

1 machine · macOS or Linux · 8–32 GB RAM

Solo Laptop or Mac mini

One machine. All three deployment types. The shape that grows.

First deploy: ~5 minutes

Why pick this shape

  • No networking surprises — localhost is your cluster.
  • Mix `docker`, `local` (Python via uv), and `native` (launchd / systemd) on the same host.
  • The same registry.yml that runs your laptop today scales to 5+ machines later without rewrites.

Registry skeleton

Copy, replace IPs and ssh_user, point CADDY_REGISTRY_PATH at it.

domain: internal
hosts:
  laptop:
    ip: 127.0.0.1
    arch: arm64-apple
    ssh_user: <your-user>
    path: <repo-base-path>
    roles: [everything]
services:
  notes-api:
    hostname: notes.internal
    current_host: laptop
    deployment_type: docker
    docker_compose: /notes-api/docker-compose.yml
    port: 8400
  notes-worker:
    hostname: notes-worker.internal
    current_host: laptop
    deployment_type: local
    service_file: /notes_worker/service.yml
    port: 9001

Bringing it up

docker compose up                        # the demo, on port 8080
./portoser registry validate
./portoser deploy laptop notes-api notes-worker
./portoser health check-all

Common gotchas

  • macOS ships Bash 3.2 — install Bash 5 via Homebrew before running the CLI.
  • Even on a single host, Portoser uses SSH (to localhost). Make sure passwordless local SSH works.
  • A single-host setup has no failover. When the laptop sleeps, the cluster sleeps.

Read the full Solo Laptop walkthrough

Deeper version with more code, more gotchas, and links to operations docs.

Read in docs