Self-Hosting

Run the entire Shipyard platform on your own server with Docker Compose.

Architecture

The Shipyard platform consists of four services:

ServicePurposePort
CaddyEdge proxy with automatic TLS, routes requests by domain80, 443
APIHono REST API (auth, projects, deployments, storage)3001
DashboardAstro web UI for managing projects4321
MinIOS3-compatible object storage for deployment artifacts9000, 9001

Requirements

  • A Linux server (Ubuntu 22.04+, Debian 12+, or similar)
  • Docker and Docker Compose v2
  • A domain with DNS configured (wildcard *.yourdomain.com)
  • Ports 80 and 443 open
  • At least 1 GB RAM, 10 GB disk

Quick setup

1. Clone the repository

Terminal
git clone https://github.com/DecOperations/shipyard.wtf.git
cd shipyard.wtf

2. Configure environment

Terminal
cp .env.example .env

Edit .env with your values:

.env
# Your domain (must have *.domain pointing to this server)
DOMAIN=shipyard.example.com
ACME_EMAIL=admin@example.com

# Privy authentication (get from privy.io)
PRIVY_APP_ID=your-app-id
PRIVY_APP_SECRET=your-app-secret

# S3 storage (defaults to local MinIO)
S3_ENDPOINT=http://minio:9000
S3_BUCKET=shipyard
S3_ACCESS_KEY=changeme
S3_SECRET_KEY=changeme-secret

# Fly.io (for provisioning user deployments)
FLY_API_TOKEN=your-fly-token
FLY_ORG=personal

3. Set up DNS

Point your domain and wildcard to the server:

TypeNameValue
Ashipyard.example.comyour-server-ip
A*.shipyard.example.comyour-server-ip

4. Deploy

Terminal
docker compose up -d

That's it. Your services will be available at:

  • Dashboard: https://dash.shipyard.example.com
  • API: https://api.shipyard.example.com
  • MinIO Console: https://s3.shipyard.example.com

Configure the CLI

Point the CLI at your self-hosted API:

Terminal
shipyard --api-url https://api.shipyard.example.com login

# Or set it permanently:
export SHIPYARD_API_URL=https://api.shipyard.example.com

Services overview

Caddy (edge proxy)

Caddy handles all incoming HTTP/HTTPS traffic. It automatically provisions Let's Encrypt certificates and routes requests based on subdomain:

  • dash.* → Dashboard
  • api.* → API server
  • s3.* → MinIO console
  • *.* → API (deployment proxy)

API server

The Hono API handles authentication, project management, deployment orchestration, and presigned URL generation for S3 uploads. It uses SQLite (via libSQL) for the database, stored at /data/shipyard.db inside the container.

MinIO

Self-hosted S3-compatible storage. Deployment artifacts are uploaded here. You can replace MinIO with any S3-compatible provider (AWS S3, Storj, Backblaze B2) by changing the S3_* environment variables.

Upgrading

Terminal
cd shipyard.wtf
git pull
docker compose build
docker compose up -d

Backups

Back up these Docker volumes regularly:

  • api_data — SQLite database
  • minio_data — Deployment artifacts
  • caddy_data — TLS certificates

Next steps