Run an instance
An instance is the reference app under your name and your domain: landing page at /, app at /app, all from one finished container image. What differs per instance (name, colours, services) comes at runtime from configuration and assets; nothing is built, and you do not need the monorepo.
What you need
Docker with the Compose plugin, a server with a domain for production, or just a computer for the preview. The deployment files live in the repository under deploy/app/; take the folder from the release you want to run (release tags are named app-vX.Y.Z):
mkdir rls-instance && cd rls-instancecurl -fL https://github.com/real-life-org/real-life-stack/archive/refs/tags/app-v0.4.0.tar.gz | tar -xz --strip-components=3 real-life-stack-app-v0.4.0/deploy/appcp .env.example .env1. Preview, without a domain
docker compose -p rls-vorschau -f docker-compose.preview.yml up -d-p rls-vorschau gives the preview a Compose project name of its own. Without it the project would be named like the production one (both files call the service app), and starting the preview in the same directory would replace the running container.
http://localhost:8080/ shows the landing page, http://localhost:8080/app/ the app, http://localhost:8080/app/config.json the configuration every browser receives. The preview takes the image edge (state of the main branch) and the name “Vorschau” until you fill in .env; RLS_PORT changes the port. It sets up no TLS and belongs in a trusted network.
2. What is yours
deploy/app/├── .env domain, name, connector, services, image tag├── landing/ your landing page — free HTML at /└── branding/ theme.json · favicon.svg · optionally config.jsonlanding/ and branding/ are mounted read-only into the container. What is served directly (the landing page, theme.json, favicon.svg) takes effect on the next page load. Two things the container reads only at start: .env, from which it generates config.json, and a branding/config.json of your own, which it copies there. The two need different commands: after a change to .env run docker compose up -d, because Compose detects the changed environment variables and recreates the container (a restart would not pick them up). After a change to branding/config.json or a newly added theme.json run docker compose restart app, because nothing changes for Compose here, an up -d would leave the container running; only the restart runs the start-up again. Changes to an existing theme.json take effect immediately.
branding/theme.json sets colour tokens, separately for light and dark; the names must be tokens of the toolkit, an unknown name is dropped and reported in the browser console. What exactly the app reads and in which order is under Runtime configuration.
3. Under your domain
docker-compose.yml expects a running Traefik with the external Docker network web, the entry point websecure and the certificate resolver letsencrypt; it does not install it. Set the required fields in .env, without which Compose refuses to start:
RLS_DOMAIN=netzwerk.example.orgRLS_APP_NAME=Unser NetzwerkRLS_IMAGE_TAG=0.4RLS_DEFAULT_CONNECTOR=wotThen point DNS at the server, docker compose up -d, and check HTTPS, landing page and app. If your Traefik network has another name, set TRAEFIK_NETWORK.
4. Choose the connector
The app instance serves only static files; the data lives where the Connector Die Implementierung des DataInterface für eine konkrete Datenquelle, ergänzt um unterstützte Capabilities. Die Steckstelle des Stacks nach unten. GlossarConnector The implementation of the DataInterface for one data source, plus the capabilities it supports. The stack's socket downward. Glossary points.
RLS_DEFAULT_CONNECTOR |
Data | Also needed |
|---|---|---|
wot (default) |
end-to-end encrypted in the Web of Trust | a relay; as long as there is a shared one, wss://relay.web-of-trust.de is preset, your own goes into RLS_RELAY_URL |
supabase |
centrally in a Supabase backend | RLS_SUPABASE_URL and RLS_SUPABASE_ANON_KEY; a backend of your own, see Run a Supabase backend |
local |
only in this browser | nothing; for trying out, no multi-user operation |
mock |
in memory, with sample data | nothing; demos only |
An unknown value is dropped, the app falls back to wot. A user can override the connector with ?connector= in the address.
5. Update
RLS_IMAGE_TAG is required, there is deliberately no latest: 0.4.0 is exactly this version, 0.4 follows fixes within the minor version, edge is the main branch for trying out. A major tag comes only with 1.0. To update, check the new tag in a preview with its own project name and port (RLS_PORT=8081 RLS_IMAGE_TAG=0.5 docker compose -p rls-vorschau -f docker-compose.preview.yml up -d), then set it in .env, docker compose pull && docker compose up -d. The old image can be started again; whether older software works with data that has changed since is not guaranteed. An image rollback is no data restore. Where the versions come from: Versions and releases.
Limits
The landing page may be anything, it is a page of its own. The app layout is not: there are tokens, name and favicon, but no code of your own. Anything beyond that would mean forking the stack, and the next update would break the instance. Whatever surface you need that the toolkit lacks is a contribution to the stack (Working on the stack together).
When something does not work
- Container does not start:
docker compose logs app. If a required field is missing, Compose says which. - Configuration does not change: after
.envchangesdocker compose up -d(recreates the container with the new variables), after changes tobranding/config.jsondocker compose restart app(runs the start-up again). Aconfig.jsonof your own overrides all environment variables. - Colours have no effect: read the browser console; an unknown token name is named there.
- App runs, but nobody sees the others: check connector, relay address and membership in the Space Der gemeinsame Arbeits-, Mitgliedschafts- und Sichtbarkeitskontext. Im Datenvertrag heißt er Group. GlossarSpace The shared context for work, membership and visibility. In the data contract it is called Group. Glossary.