docs: add app screenshots, default compose to published :latest images

- docker-compose.yml now references ghcr.io/dvorinka/containr-*:latest with
  pull_policy: missing, so `docker compose up` pulls published images by
  default; CONTAINR_VERSION pins a release tag, build config retained for
  source builds
- install.sh pulls instead of always building (CONTAINR_BUILD=1 or a failed
  pull falls back to a source build)
- README gains a Screenshots section (dashboard, canvas, service detail,
  databases) captured from a live local stack, plus updated install docs

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

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
Tomas DvorakandDevin committed 2026-09-21 16:20:16 +02:00
1 parent c0733dc30c
commit 430370dbc7
8 files changed
+43 -10

No files matched your search

+4
View File
@@ -11,6 +11,10 @@ API_PORT=8082
POSTGRES_PORT=5432 POSTGRES_PORT=5432
REDIS_PORT=6379 REDIS_PORT=6379
# Image tag to pull from GHCR (e.g. latest, 0.1.1). Use CONTAINR_BUILD=1
# with install.sh to build from source instead.
CONTAINR_VERSION=latest
# Database Configuration # Database Configuration
POSTGRES_DB=containr POSTGRES_DB=containr
POSTGRES_USER=containr_user POSTGRES_USER=containr_user
+20 -5
View File
@@ -11,6 +11,7 @@
<p align="center"> <p align="center">
<a href="#quick-start">Quick Start</a> • <a href="#quick-start">Quick Start</a> •
<a href="#screenshots">Screenshots</a> •
<a href="#features">Features</a> • <a href="#features">Features</a> •
<a href="#architecture">Architecture</a> • <a href="#architecture">Architecture</a> •
<a href="docs/guides/">Guides</a> • <a href="docs/guides/">Guides</a> •
@@ -34,6 +35,16 @@ The UI is inspired by Railway's project canvas: services appear as nodes,
connections are inferred automatically, and everything — logs, metrics, connections are inferred automatically, and everything — logs, metrics,
deployments, builds — is one click away. deployments, builds — is one click away.
## Screenshots
| Projects dashboard | Project canvas |
| --- | --- |
| ![Projects dashboard with host telemetry](docs/screenshots/dashboard.png) | ![Visual service canvas with two services](docs/screenshots/canvas.png) |
| Service detail | Managed databases |
| --- | --- |
| ![Service view with metrics, logs and config tabs](docs/screenshots/service-detail.png) | ![Managed database list showing a running PostgreSQL](docs/screenshots/databases.png) |
## Features ## Features
- **Project canvas** — visual service topology with groups, drag/drop layout, - **Project canvas** — visual service topology with groups, drag/drop layout,
@@ -84,8 +95,10 @@ cd Containr
``` ```
The script creates `.env` from `.env.example`, fills in all required secrets The script creates `.env` from `.env.example`, fills in all required secrets
with random values, builds the images, and starts the stack. It keeps an with random values, pulls the published `:latest` images from GHCR, and
existing `.env` untouched, so it is safe to re-run. starts the stack. It keeps an existing `.env` untouched, so it is safe to
re-run. Set `CONTAINR_BUILD=1` to build from source instead, or
`CONTAINR_VERSION` in `.env` to pin a release tag (e.g. `0.1.1`).
Frontend at `http://localhost:3000`, API at `http://localhost:8082`. Frontend at `http://localhost:3000`, API at `http://localhost:8082`.
@@ -93,11 +106,13 @@ Frontend at `http://localhost:3000`, API at `http://localhost:8082`.
```bash ```bash
cp .env.example .env # fill in secrets cp .env.example .env # fill in secrets
docker compose up -d --build docker compose up -d # pulls ghcr.io/dvorinka/containr-*:latest
``` ```
Host ports can be remapped in `.env` (`HTTP_PORT`, `API_PORT`, Compose pulls the published images by default; run `docker compose up -d
`POSTGRES_PORT`, `REDIS_PORT`) if the defaults collide with other services. --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 ### Local development
+4
View File
@@ -33,6 +33,8 @@ services:
restart: unless-stopped restart: unless-stopped
backend: backend:
image: ghcr.io/dvorinka/containr-backend:${CONTAINR_VERSION:-latest}
pull_policy: missing
build: build:
context: ./app/backend context: ./app/backend
dockerfile: Dockerfile dockerfile: Dockerfile
@@ -94,6 +96,8 @@ services:
start_period: 30s start_period: 30s
frontend: frontend:
image: ghcr.io/dvorinka/containr-frontend:${CONTAINR_VERSION:-latest}
pull_policy: missing
build: build:
context: ./app/frontend context: ./app/frontend
dockerfile: Dockerfile dockerfile: Dockerfile
Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

+15 -5
View File
@@ -1,6 +1,7 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Containr one-shot installer: creates .env with generated secrets, builds # Containr one-shot installer: creates .env with generated secrets, pulls the
# images, boots the stack, and waits for the API to report healthy. # published images (or builds from source), boots the stack, and waits for
# the API to report healthy.
set -euo pipefail set -euo pipefail
cd "$(dirname "$0")" cd "$(dirname "$0")"
@@ -45,9 +46,18 @@ fi
HTTP_PORT="${HTTP_PORT:-3000}" HTTP_PORT="${HTTP_PORT:-3000}"
API_PORT="${API_PORT:-8082}" API_PORT="${API_PORT:-8082}"
# Build and boot # Boot: pull published :latest images by default (CONTAINR_VERSION pins a
info "Building images and starting the stack..." # release). Build from source instead with CONTAINR_BUILD=1, or as fallback
docker compose up -d --build # when the registry is unreachable.
if [[ "${CONTAINR_BUILD:-}" == "1" ]]; then
info "CONTAINR_BUILD=1 - building images from source..."
docker compose build
elif ! docker compose pull; then
info "Image pull failed - building from source instead..."
docker compose build
fi
info "Starting the stack..."
docker compose up -d
# Wait for the API # Wait for the API
info "Waiting for the API on http://localhost:${API_PORT}/health ..." info "Waiting for the API on http://localhost:${API_PORT}/health ..."