- install.sh works outside a checkout: installs into CONTAINR_DIR (default ./containr), downloads docker-compose.yml + .env.example from the repo, generates secrets, pulls published images - CONTAINR_REF selects the git ref for downloads; CONTAINR_BUILD=1 or a failed pull fetches the source tarball and builds locally - env-var overrides (HTTP_PORT/API_PORT/...) are persisted into .env; health-wait ports resolve env -> .env -> defaults - drop fixed `name: containr` from root compose so installs in different directories get distinct project names - README: curl one-liner is the primary install path Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Containr
Self-hosted platform for deploying and managing containerized services. Railway-style project canvases on your own hardware.
Quick Start • Screenshots • Features • Architecture • Guides • Contributing
What is Containr?
Containr is an open-source control plane for Docker. It gives you a project-first deployment workflow — create a project, drop services onto a visual canvas, wire them together with environment variables, and deploy — without Kubernetes, without a cloud bill, and without giving up control of your infrastructure.
The UI is inspired by Railway's project canvas: services appear as nodes, connections are inferred automatically, and everything — logs, metrics, deployments, builds — is one click away.
Screenshots
| Projects dashboard | Project canvas |
|---|---|
![]() |
![]() |
| Service detail | Managed databases |
|---|---|
![]() |
![]() |
Features
- Project canvas — visual service topology with groups, drag/drop layout, and auto-inferred connections
- Deployments — Docker-based deploys with history, logs, and rollback
- Git integration — deploy from GitHub, GitLab, Bitbucket, or Gitea; repository and branch pickers, webhooks, GitHub App support
- Builds — build pipeline with live status over WebSocket
- Service metrics — real CPU/memory/network telemetry from Docker stats
- Templates — one-click service catalog (databases, apps, tooling)
- Databases — managed database services with backup/restore actions
- Cron jobs — scheduled jobs with execution history
- Preview environments — per-project preview deploys
- Variables & environments — per-service env vars, production/preview/dev
- Node monitoring — host CPU, memory, disk, and network telemetry
- Security — audit logs, vulnerability scans, compliance reports
- Auth — Better Auth sessions (email + OAuth), per-user resource scoping
- Self-hosted networking — Traefik reverse proxy, optional Cloudflare Tunnel for exposure without port forwarding
Architecture
app/frontend/ React 19 + Vite + TypeScript + Tailwind + React Flow
app/backend/ Go API (Gin) · PostgreSQL · Redis · Docker SDK · Better Auth sidecar
infra/ Self-hosted compose: Traefik + Cloudflare Tunnel
docs/ Guides, OpenAPI spec, design documents
| Component | Default port |
|---|---|
| Frontend | 3000 (prod) / 5173 (dev) |
| API | 8082 |
| Auth sidecar | 3001 |
| PostgreSQL | 5432 |
| Redis | 6379 |
Quick Start
Easy install (recommended)
Requires Docker with the Compose plugin, openssl, and curl. One-liner,
no clone needed:
curl -fsSL https://raw.githubusercontent.com/Dvorinka/Containr/main/install.sh | bash
Installs into ./containr, generates secrets, pulls the published :latest
images from GHCR, and starts the stack. Non-interactive — configure with
env vars:
curl -fsSL https://raw.githubusercontent.com/Dvorinka/Containr/main/install.sh | \
HTTP_PORT=8080 API_PORT=8082 CONTAINR_DIR=/opt/containr bash
CONTAINR_VERSION pins a release tag (e.g. 0.1.1), CONTAINR_REF selects
the git ref for downloaded files, and CONTAINR_BUILD=1 skips the registry
and builds from source — the installer downloads the source tarball when it
needs to build. An existing .env is never overwritten, so it is safe to
re-run.
From a git checkout, ./install.sh does the same thing in place.
Frontend at http://localhost:3000, API at http://localhost:8082.
Docker Compose (manual)
cp .env.example .env # fill in secrets
docker compose up -d # pulls ghcr.io/dvorinka/containr-*:latest
Compose pulls the published images by default; run docker compose up -d --build to build from source. Host ports can be remapped in .env
(HTTP_PORT, API_PORT, POSTGRES_PORT, REDIS_PORT) if the defaults
collide with other services.
Local development
docker compose up -d postgres redis # data services only
cd app/backend && go run ./cmd/server # API + embedded auth sidecar
cd app/frontend && npm install && npm run dev
Frontend dev server at http://localhost:5173.
Self-hosted with Traefik + Cloudflare Tunnel
See infra/docker-compose.yml and
docs/guides/CLOUDFLARE_SETUP.md.
Configuration
All configuration is via environment variables — see .env.example.
Required for production: JWT_SECRET, BETTER_AUTH_SECRET,
BETTER_AUTH_INTERNAL_TOKEN, database and Redis credentials.
Never commit .env or .env.prod. Both are gitignored; if a secret was
ever committed, rotate it.
Documentation
- docs/guides/ — setup, deployment, Cloudflare, autoscaling
- docs/api/openapi.yaml — API contract
- docs/developers/onboarding.md — contributor onboarding
- docs/design/ — UI design references
make help— common tasks
Contributing
See CONTRIBUTING.md. Issues and PRs welcome.
Security
See SECURITY.md. Report vulnerabilities privately — do not open public issues.
License
MIT © 2026 Tomas Dvorak



