A docker based hosting platform for your VPS https://shed.land
  • Go 65.4%
  • TypeScript 22.7%
  • MDX 7.5%
  • CSS 3.6%
  • Shell 0.6%
  • Other 0.1%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Kyle Dickey 4f0af30697
Merge pull request #34 from kyledickey/ktd/shedlab
shedlab: throwaway shed instances in local VMs
2026-10-30 19:56:21 -06:00
.agents/skills/shedlab shedlab: project skill and docs 2026-10-30 19:35:40 -06:00
.github ci: run the dashboard checks on shed-md 2026-10-29 22:34:09 -06:00
cmd shedlab: restore sessions and remap snapshot domains 2026-10-30 19:50:55 -06:00
deploy update: stable and nightly channels 2026-10-29 20:24:15 -06:00
docs ci: run the dashboard checks on shed-md 2026-10-29 22:34:09 -06:00
internal github: set the App's webhook URL 2026-10-30 19:19:47 -06:00
skills/shed docs: create the 1Password vault yourself 2026-10-23 20:10:07 -06:00
web shedlab: project skill and docs 2026-10-30 19:35:40 -06:00
.gitignore onepassword: never cancel SDK calls midway 2026-10-29 22:03:50 -06:00
AGENTS.md shedlab: project skill and docs 2026-10-30 19:35:40 -06:00
CHANGELOG.md changelog: rewrite in the release notes style 2026-10-29 20:24:15 -06:00
CLAUDE.md Add AGENTS.md 2026-10-04 01:42:54 -06:00
go.mod shedlab: throwaway shed instances in local VMs 2026-10-30 19:19:47 -06:00
go.sum shedlab: throwaway shed instances in local VMs 2026-10-30 19:19:47 -06:00
LICENSE Create LICENSE 2026-10-06 13:07:22 -06:00
Makefile update: stable and nightly channels 2026-10-29 20:24:15 -06:00
README.md Add public site with prerendered docs 2026-10-05 10:54:58 -06:00

shed

shed is a self-hosted, single-server deployment platform inspired by Railway. One Go binary runs the dashboard, the API, the deploy pipeline, and an embedded Caddy reverse proxy with automatic HTTPS; Docker runs the workloads.

  • Deploy apps from GitHub repositories (Dockerfile, or Railpack when there is none) or from Docker images, automatically on push, optionally after CI passes.
  • One-click Postgres, MySQL, MongoDB, and Redis with persistent volumes.
  • Per-service variables with ${{ service.KEY }} references, domains, deployment history with rollbacks, and build and runtime logs.

See docs/design.md for how it works.

Requirements

  • Linux with Docker Engine and the buildx plugin
  • git and railpack on PATH
  • Ports 80 and 443 free for the proxy

Install

curl -fsSL https://shed.land/install.sh | sudo bash

The installer adds whatever is missing (Docker with buildx, git, railpack), asks for the dashboard domain, an optional apps base domain and ACME email, and the GitHub logins allowed to sign in, then installs the latest release, writes /etc/shed/shed.toml, starts the systemd service, and prints the setup URL and token. Run it again on an installed host to upgrade the binary and keep the config.

To run it unattended, pass the answers as environment variables (SHED_BASE_DOMAIN, SHED_ACME_EMAIL, and SHED_VERSION are optional):

curl -fsSL https://shed.land/install.sh \
  | sudo SHED_DOMAIN=shed.example.com SHED_ALLOWED_USERS=your-github-login SHED_YES=1 bash

Manual install

make build                                   # needs Go and Bun
sudo install bin/shed /usr/local/bin/shed
sudo mkdir -p /etc/shed
sudo cp deploy/shed.example.toml /etc/shed/shed.toml   # then edit it
sudo cp deploy/shed.service /etc/systemd/system/
sudo systemctl enable --now shed

Set server.url (the public dashboard URL), proxy.acme_email, and auth.allowed_users = ["your-github-login"]. Every setting can also be given as an environment variable, such as SHED_SERVER_URL. Logs go to shed.log next to the config file and to the journal.

DNS

  • An A (and AAAA) record for the dashboard host in server.url, pointing at the server.
  • For generated service domains, set proxy.base_domain (for example apps.example.com) and add a wildcard record *.apps.example.com pointing at the server.
  • Custom domains need their own record pointing at the server.

First run

  1. On first start, shed logs a one-time setup token. The installer prints it with the setup URL; otherwise find it with journalctl -u shed | grep token.
  2. Open the dashboard, enter the token, and follow the link to create the GitHub App. GitHub sends you back to shed, which stores the App's credentials.
  3. Install the App on the accounts or repositories you want to deploy.
  4. Sign in with a GitHub login listed in auth.allowed_users. There is no automatic first-user enrollment.

Development

make test                      # Go tests
cp deploy/shed.example.toml shed.dev.toml
# In shed.dev.toml: url = "http://localhost:5173", a writable data.dir, and
# proxy.enabled = false.
make dev                       # runs shed with shed.dev.toml
cd web && bun run dev --port 5173 --strictPort  # dashboard with hot reload