openship
★ 14.8kA self-hosted alternative to Vercel Heroku
Apache License 2.0Open Source — No Paywall5 Containers — 5 containers — moderate hosting footprintCompose · Binary · Package +1Needs Postgres10+ active committers (12mo)
About
Openship is a self-hostable deployment platform aimed at individuals and teams that want to manage application delivery without assembling a separate stack of CI/CD, routing, and TLS tools. It...
Community Ratings
Ease of Setup
—
Documentation
—
Resource Usage
—
Feature Completeness
5.0
Paywall Fairness
5.0
Maintenance
—
Community
—
New this week
Read recap →Weekly Recap — Oct 9, 2026 – Oct 16, 2026Oct 16, 2026
Features
- built-in CI/CD
- desktop app
- web dashboard
- CLI
- SSH server deployment
- push-to-deploy
- automatic domain routing
- Let's Encrypt TLS
- boot service setup
- shell completion
Details
- Last Updated
- Oct 17, 2026
- Created
- Mar 5, 2026
- Install Methods
- docker-composebinarypackage-managersource
- Requirements
- DockerPostgresRedisNode 22+BungitSSH
- Authentication
- local
- API
- REST
- Privacy & Independence
- Cloud: Optional
- User Model
- Multi-User
- Deployment
Deployment: Docker Compose ✓5 Containers — moderate hosting footprintRuns as 5 containers
Run openship with Docker Compose
Compose file from the openship project repository.
5 services · database: postgres · infra: postgres, redis
no resource limits declared
needs persistent storage (2 volumes)
docker-compose.yml · @ d03378b · scanned Sep 23, 2026
# ──────────────────────────────────────────────────────────
# Openship — Docker Compose (SaaS / from-source control plane)
#
# cp .env.example .env # then edit
# docker compose up -d --build
#
# This is the CONTROL PLANE: it BUILDS api + dashboard + web from source and
# runs postgres + redis. It's what we deploy for the openship.io SaaS, and what
# a from-source contributor runs locally. The MODE is decided entirely by .env —
# no profiles, no per-mode service variants:
# • SaaS (our env): CLOUD_MODE=true + OPENSHIP_TARGET=cloud-saas + Oblien /
# GitHub App / secrets. Deployed apps run in Oblien
# sandboxes — the control plane never runs them here, so
# there is deliberately NO Docker socket and NO edge.
# • From-source dev: CLOUD_MODE=false (the .env.example default).
#
# SELF-HOSTING (run your own apps as host containers with the OpenResty edge on
# :80/:443) is a DIFFERENT stack — the pull-based images + `edge` + Docker-out-
# of-Docker. That lives in docker/docker-compose.yml (or install it with the
# `openship up` CLI). Don't add the edge/socket here; this stays a clean,
# unprivileged control plane.
#
# Services:
# • postgres → private :5432 (storage)
# • redis → private :6379 (queue + cache + rate-limit)
# • api → :4000 (override: API_PORT)
# • dashboard→ :3001 (override: DASHBOARD_PORT)
# • web → :3000 (override: WEB_PORT) landing site (openship.io)
#
# The API + dashboard bind fixed internal ports via PORT (the API honors PORT
# regardless of OPENSHIP_TARGET); a reverse proxy maps the public domains to
# them. postgres/redis are internal-only. The API auto-migrates Postgres on boot.
#
# REMOTE ACCESS: reaching this from another machine (LAN IP or a reverse proxy)
# requires OPENSHIP_PUBLIC_URL in .env — else the dashboard loads but login is
# rejected (403 ORIGIN_REJECTED). Behind a proxy also set TRUST_PROXY=true.
#
# BIND INTERFACE: the api/dashboard/web ports publish on 127.0.0.1 (loopback)
# by default, so nothing is exposed off-box unless you say so — a same-host
# reverse proxy still reaches them over loopback. If your proxy runs on ANOTHER
# machine (or you want direct off-box access), set OPENSHIP_BIND_ADDR to the
# interface to publish on, e.g. OPENSHIP_BIND_ADDR=0.0.0.0 (all) or a specific
# LAN IP. Prefer fronting with a proxy over binding 0.0.0.0.
# ──────────────────────────────────────────────────────────
services:
# ─── Database (storage, private) ──────────────────────
postgres:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: ${POSTGRES_USER:-openship}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-openship}
POSTGRES_DB: ${POSTGRES_DB:-openship}
# PRIVATE: not published to the host. api reaches it at postgres:5432.
expose:
- "5432"
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-openship} -d ${POSTGRES_DB:-openship}"]
interval: 5s
timeout: 3s
retries: 12
# ─── Cache / Queue / Rate-limit (private) ─────────────
redis:
image: redis:7-alpine
restart: unless-stopped
command: ["redis-server", "--appendonly", "yes"]
# PRIVATE: not published to the host. api reaches it at redis:6379.
expose:
- "6379"
volumes:
- redis_data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 12
# ─── API (control plane) ──────────────────────────────
api:
build:
context: .
dockerfile: apps/api/Dockerfile
restart: unless-stopped
ports:
# Loopback by default (nothing exposed off-box); OPENSHIP_BIND_ADDR opts
# into a public/LAN interface. See the "BIND INTERFACE" note above.
- "${OPENSHIP_BIND_ADDR:-127.0.0.1}:${API_PORT:-4000}:${API_PORT:-4000}"
# Mode + secrets (CLOUD_MODE, DEPLOY_MODE, OPENSHIP_TARGET, Oblien, GitHub
# App, auth secrets, …) all come from .env. The values below OVERRIDE it
# with the fixed internal port + in-cluster service DNS (compose
# `environment` wins over `env_file`).
env_file:
- .env
environment:
NODE_ENV: production
PORT: "${API_PORT:-4000}"
DATABASE_URL: postgresql://${POSTGRES_USER:-openship}:${POSTGRES_PASSWORD:-openship}@postgres:5432/${POSTGRES_DB:-openship}
REDIS_URL: redis://redis:6379
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
healthcheck:
test: ["CMD-SHELL", "bun -e \"fetch('http://127.0.0.1:${API_PORT:-4000}/api/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))\""]
interval: 10s
timeout: 5s
retries: 12
start_period: 40s
# ─── Dashboard (app UI) ───────────────────────────────
dashboard:
build:
context: .
dockerfile: apps/dashboard/Dockerfile
restart: unless-stopped
ports:
- "${OPENSHIP_BIND_ADDR:-127.0.0.1}:${DASHBOARD_PORT:-3001}:${DASHBOARD_PORT:-3001}"
env_file:
- .env
environment:
NODE_ENV: production
PORT: "${DASHBOARD_PORT:-3001}"
INTERNAL_API_URL: http://api:${API_PORT:-4000}
depends_on:
api:
condition: service_healthy
# ─── Web / Landing ────────────────────────────────────
web:
build:
context: .
dockerfile: apps/web/Dockerfile
restart: unless-stopped
ports:
- "${OPENSHIP_BIND_ADDR:-127.0.0.1}:${WEB_PORT:-3000}:${WEB_PORT:-3000}"
environment:
NODE_ENV: production
PORT: "${WEB_PORT:-3000}"
volumes:
postgres_data:
redis_data:
This file may be out of date. Check the openship documentation for current setup steps.
Tags
Track your self-hosted stack
Bookmark software to try, rate tools you've used, and keep your collection in one place.
Metadata extracted from README on Sep 18, 2026
Related Software
CapRover
15.2k
CapRover is a deployment platform and webserver manager for NodeJS, Python, PHP, ASP.NET, Ruby, and common databases.
Platform as a ServiceSelf Hosting SolutionsWeb Servers+4
Not FOSS
Appsmith
41.1k
An open-source low-code platform for building, deploying, and maintaining custom applications.
Low Code DevelopmentPermissive LicenseAutomation Tools+3
Coolify
63.1k
Coolify is an open-source, self-hostable platform for managing servers, applications, and databases as an alternative to Heroku, Netlify, and Vercel.
Platform as a ServiceSelf Hosting SolutionsPermissive License+3
4 Containers
Dokploy
37.8k
Dokploy is a self-hostable Platform as a Service for deploying and managing applications and databases.
Platform as a ServiceSelf Hosting SolutionsPermissive License+4
FOSS with Issues
Tipi
9.7k
A personal homeserver orchestrator for managing and running multiple services on a single server through a web interface.
Self Hosting SolutionsPersonal DashboardsPlatform as a Service+2
Dockge
24.6k
Dockge is a self-hosted, reactive web UI for managing Docker Compose stacks, including editing, starting, stopping, and updating compose files.
Self Hosting SolutionsPlatform as a ServiceAutomation Tools+1
Single ContainerFully FOSS
Tsuru
5.3k
tsuru is an open source Platform as a Service (PaaS) for faster, easier application deployments.
Platform as a ServiceSelf Hosting SolutionsAutomation Tools+1
CasaOS
37.3k
CasaOS is a personal cloud and home server platform with a friendly UI for managing apps, drives, files, and widgets.
Self Hosting SolutionsPersonal DashboardsPlatform as a Service+2
Websoft9
2.1k
Websoft9 is a web-based Linux/PaaS control panel for running and managing 200+ open source applications on a self-hosted server.
Self Hosting SolutionsPlatform as a ServiceAutomation Tools+3
piku
6.6k
piku is a lightweight micro-PaaS that lets users deploy applications to their own servers with git push.
Platform as a ServiceSelf Hosting SolutionsAutomation Tools+1
Canine
2.9k
Canine is a self-hosted Kubernetes deployment platform that simplifies PaaS-style application deployment and management on your own Kubernetes infrastructure.
Platform as a ServiceSelf Hosting SolutionsAutomation Tools+2
Windmill
18.2k
Windmill is an open-source developer platform for building APIs, background jobs, workflows, and internal UIs, with autogenerated forms and low-code app building.
FOSS with IssuesLow Code DevelopmentAutomation Tools+4
Open CoreFOSS with Issues
