Files
Containr/README.md
T
Tomas DvorakandDevin c16b32f56a feat: owner accounts and in-app platform settings
- First registered account becomes admin (users.is_admin, backfilled
  to earliest account); better-auth mirror path does the same
- Public registration closes after bootstrap; admin can reopen it via
  GET/PUT /api/v1/settings (admin-gated) or SIGNUP_ENABLED env
- In-app settings override env vars; secrets stored in app_settings,
  token values never returned by the API
- Saving a Cloudflare Tunnel token pulls and runs a managed
  cloudflared sidecar on the backend's networks; clearing removes it;
  startup restores it from saved settings
- group_add DOCKER_GID grants the non-root backend user Docker socket
  access; install.sh probes the in-container socket gid
- Settings page gains an owner-only Platform section (registration
  toggle, tunnel token, link to Cloudflare dashboard); sign-up page
  stays reachable while registration is open
- OpenAPI spec + generated types updated; manual user creation now
  requires admin

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-21 18:05:22 +02:00

4.2 KiB

Containr

Containr

Self-hosted platform for deploying and managing containerized services. Railway-style project canvases on your own hardware.

Quick Start • Screenshots • Features • Guides • Contributing

CI License: MIT

Containr is an open-source control plane for Docker. Create a project, drop services onto a visual canvas, wire them together with environment variables, and deploy — no Kubernetes, no cloud bill. Services appear as nodes with auto-inferred connections; logs, metrics, builds, and rollbacks are one click away.

Screenshots

Projects dashboard Project canvas
Projects dashboard with host telemetry Visual service canvas with two services
Service detail Managed databases
Service view with metrics, logs and config tabs Managed database list showing a running PostgreSQL

Features

  • Project canvas — visual service topology, groups, drag/drop, auto-inferred connections
  • Deployments & builds — Docker deploys with history, logs, rollback, live build status
  • Git integration — GitHub, GitLab, Bitbucket, Gitea; webhooks, GitHub App
  • Managed databases — one-click provisioning with backup/restore
  • Metrics — per-service Docker stats plus host CPU/memory/disk telemetry
  • Templates, cron, previews — service catalog, scheduled jobs, preview deploys
  • Auth & security — Better Auth sessions (email/password self-hosted), audit logs, vuln scans
  • Networking — Traefik reverse proxy, optional Cloudflare Tunnel

Quick Start

Requires Docker with the Compose plugin, openssl, and curl:

curl -fsSL https://raw.githubusercontent.com/Dvorinka/Containr/main/install.sh | bash

Installs into ./containr, generates secrets, pulls the published :latest images, and starts the stack — UI at http://localhost:3000, API at http://localhost:8082. Non-interactive; re-runs never overwrite .env. On first visit you create the owner account (email/password); registration then closes automatically. The owner can reopen it and configure a Cloudflare Tunnel token under Settings → Platform — in-app values override env vars.

Override with env vars:

curl -fsSL https://raw.githubusercontent.com/Dvorinka/Containr/main/install.sh | \
  HTTP_PORT=8080 CONTAINR_DIR=/opt/containr bash

CONTAINR_VERSION pins a release tag, CONTAINR_REF selects the git ref for downloaded files, CONTAINR_BUILD=1 builds from source. From a git checkout, ./install.sh installs in place; plain docker compose up -d pulls the same images (--build to compile locally).

Local development and self-hosted deployment (Traefik + Cloudflare Tunnel): see docs/guides/ and infra/docker-compose.yml.

Architecture

app/frontend/   React 19 + Vite + TypeScript + Tailwind + React Flow
app/backend/    Go API (Gin) · PostgreSQL · Dragonfly · Docker SDK · Better Auth sidecar
infra/          Self-hosted compose: Traefik + Cloudflare Tunnel
docs/           Guides, OpenAPI spec, design documents

All configuration is via environment variables — see .env.example. Never commit .env or .env.prod; if a secret was ever committed, rotate it.

Documentation


Contributing · Security · MIT License © 2026 Tomas Dvorak