Dockerfile, transfers the image to an Ubuntu VPS over SSH, and runs it behind Traefik with automatic HTTPS. It is a lightweight alternative to a web-based deployment panel.
Arct Cloud provides the unmanaged virtual machine. Sidekick and the applications it deploys are not preinstalled or managed by Arct Cloud; you remain responsible for server security, application data, backups, updates, and recovery.
Requirements
The practical recommendation is suitable for Sidekick, Traefik, and one lightweight application. Size the server for the applications you deploy, and allow additional storage for Docker images and application logs.
On your local computer, you also need:
- Homebrew, Sidekick, SOPS, and age
- A running Docker engine
- An SSH agent with the private key selected during server deployment
ssh,scp, andrsync- An application with a working
Dockerfile - A domain name, or Sidekick’s default
sslip.iohostname for testing
Install Sidekick and Deploy an App
1
Deploy a fresh Ubuntu server
Deploy a server, select Ubuntu 24.04 LTS, and add an SSH key. Use a fresh VPS because
sidekick init upgrades packages, installs Docker, and configures Traefik to own ports 80 and 443.Do not install Nginx, Caddy, or another Traefik instance on the same server before initialization.2
Restrict inbound access
Attach and verify a network-level firewall or ACL before running Sidekick:
Sidekick does not currently configure a firewall or rate limits. Application ports are routed inside Docker and should not be opened on the host.
3
Bootstrap the Sidekick account
Arct Cloud Ubuntu images use From your local computer, verify both key access and passwordless sudo:
ubuntu as the default SSH user, while Sidekick initializes through either root or an existing sidekick account. Connect as ubuntu and create the account without enabling root SSH:4
Prepare your local computer
Install the current release and its secret-management dependencies with Homebrew:Make sure Docker is running. Sidekick requires an SSH agent even when a key exists in the default Replace the key path when you use a different key. The first SSH connection records the server host key; verify its fingerprint before accepting it.
.ssh directory:5
Initialize the VPS
Run the initializer on your local computer:Enter the VPS IPv4 address and an email address for ACME certificate notices. Current Sidekick versions may also ask you to name the VPS. The initializer connects as Keep an encrypted off-device copy. The matching age private key is required to decrypt the encrypted environment file stored on the VPS.
sidekick, updates Ubuntu, installs Docker and the server-side encryption tools, and starts Traefik.Sidekick stores the age private key in its local configuration. Restrict and back up that file immediately:6
Verify the server
Start a new SSH session so Docker group membership takes effect, then inspect the installation:Confirm that Traefik is running and only expected ports are published. Do not assume the initializer disabled root or password authentication. Keep this session open and add an early SSH configuration drop-in:Verify that all three effective values are
no. From a second local terminal, confirm ssh sidekick@YOUR_SERVER_IP still works before closing the original session. Use the Arct Cloud VNC console if you lose SSH access.7
Prepare DNS and the application
For a custom hostname such as
app.example.com, create an A record pointing to the VPS public IPv4 address. Add an AAAA record only when IPv6 is configured and reachable.In the application directory, confirm that:Dockerfilebuilds successfully on your local Docker engine- The application listens on
0.0.0.0, not only127.0.0.1 - You know the container’s HTTP port
.envis excluded from Git
8
Launch the application
From the directory containing Provide these values when prompted:
Dockerfile, run:Sidekick builds the Linux image locally, transfers it directly to the VPS without a registry, creates the Compose service, and routes the hostname through Traefik. It writes deployment metadata to
sidekick.yml in the project directory.9
Verify HTTPS
Wait for DNS and certificate issuance, then check the public endpoint:Confirm the certificate hostname, application logs, and a representative request before sending production traffic.
Deploy Updates and Previews
Run a normal update from the application directory:sidekick.yml after reviewing it, but never commit .env or the global Sidekick configuration. With a custom application domain, preview URLs are subdomains of that hostname, so configure matching DNS records before relying on previews. Sidekick’s generated sslip.io hostname is simpler for initial testing.
Security, Data, and Maintenance
- Sidekick’s firewall and rate-limiting support is not implemented. Keep the upstream network policy in place and review it whenever a workload changes.
- The
sidekickaccount, Docker daemon, and Traefik’s Docker socket are privileged infrastructure. A compromised deployment key can compromise every workload on the VPS. - Sidekick-managed applications share the external
sidekickDocker network. Do not treat that network as isolation between mutually untrusted applications. - Store durable data in a separately backed-up service. Sidekick does not create or back up persistent volumes for the generated application service.
- Back up
~/.config/sidekick/default.yaml, each project’ssidekick.yml, DNS records, and all external data stores. Test restoration on a replacement VPS. - Before
brew upgrade sidekick, review the release notes and keep a recoverable copy of configuration and application data. Patch Ubuntu and monitordf -handdocker system dfregularly.
Sidekick’s released documentation and current source can differ. Check
sidekick --help for the commands installed on your workstation and review upstream changes before using it for a critical workload.Troubleshooting
Sidekick cannot connect over SSH
Sidekick cannot connect over SSH
Confirm port
22 allows your current public IP, ssh sidekick@YOUR_SERVER_IP succeeds, ssh-add -l lists the correct key, and sudo -n true works for the sidekick account. Resolve host-key warnings instead of disabling verification.Initialization fails on ports 80 or 443
Initialization fails on ports 80 or 443
Run
sudo ss -lntp | grep -E ':(80|443) ' on the VPS. Stop or remove the conflicting reverse proxy before retrying; Sidekick’s Traefik must own both ports.HTTPS certificate issuance fails
HTTPS certificate issuance fails
Confirm the
A record resolves to this VPS and ports 80 and 443 are reachable. Do not proxy the record through another service until the direct Sidekick route works.Traefik returns 502 Bad Gateway
Traefik returns 502 Bad Gateway
Confirm the port entered during
sidekick launch matches the application’s container port and the process listens on 0.0.0.0. Inspect docker ps and the application container logs over SSH.The local image build fails
The local image build fails
Confirm Docker is running and build the same
Dockerfile manually with docker build -t sidekick-test .. Fix the first build error before rerunning Sidekick.A preview hostname does not resolve
A preview hostname does not resolve
Preview URLs prepend a commit hash to the application hostname. Add wildcard DNS for the custom hostname or use the generated
sslip.io hostname while testing.Official Resources
Sidekick Documentation
Official concepts, commands, and design documentation.
Sidekick on GitHub
Source code, roadmap, license, and issue tracker.
Sidekick Releases
Release binaries and version history.
Sidekick is developed by the Sidekick project. Arct Cloud is an independent infrastructure provider and is not affiliated with, sponsored by, or endorsed by Sidekick.