Self-hosting Ronde
Ronde runs on any machine with Docker: the app, a PostgreSQL database, and a one-off container that applies the database migrations of each version. Everything in the Community edition is free, with no limit on meetings or people. A license key turns on the Team or Enterprise features.
Start
Get the files of a release:
mkdir ronde && cd ronde curl -fsSLO https://raw.githubusercontent.com/joinronde/ronde/main/docker/compose.yml curl -fsSL https://raw.githubusercontent.com/joinronde/ronde/main/docker/.env.example -o .envFill in
.env: the address people will open (RONDE_URL) and three secrets.for v in POSTGRES_PASSWORD AUTH_SECRET SECRET_KEY; do sed -i "s|^$v=.*|$v=$(openssl rand -base64 32 | tr -d '/+=')|" .env; doneStart:
docker compose up -dOpen
RONDE_URLand create the first account: it becomes the administrator of the instance.
HTTPS
Point a domain at the machine, set RONDE_DOMAIN=ronde.example.com and RONDE_URL=https://ronde.example.com
in .env, then start with the https profile. Caddy gets and renews the certificate.
docker compose --profile https up -d
Behind your own reverse proxy instead, forward to port RONDE_PORT (3000 by default) and keep the
X-Forwarded-* headers. Server-Sent Events must not be buffered (proxy_buffering off with nginx).
Sign-in links, invitations and reminders need an SMTP server: SMTP_URL=smtp://user:password@smtp.example.com:587
and MAIL_FROM. For a trial, the mail profile starts Mailpit, which catches every email:
echo "SMTP_URL=smtp://mail:1025" >> .env
docker compose --profile mail up -d # emails at http://localhost:8025
To let people fill in their check-in by replying to the reminder, give Ronde a mailbox to read: INBOUND_IMAP_URL=imaps://user:password@imap.example.com:993/INBOX, and INBOUND_ADDRESS when the login is not the email address. Replies are sent there; every minute Ronde reads the ones that answer a reminder, adds their lines to the check-in, confirms by email and moves them to a Ronde folder. Every other message of the mailbox is left as it is, so it can be your usual contact address.
Push notifications (your turn coming up, check-in reminders, the bell) need a pair of keys for the instance: npx web-push generate-vapid-keys, then WEB_PUSH_PUBLIC_KEY and WEB_PUSH_PRIVATE_KEY. Keep them: the devices that turned notifications on depend on them. Ronde must be served over HTTPS; on an iPhone, people add it to the home screen first.
Sign-in
Local accounts and magic links work out of the box. SIGNUP_POLICY decides who may create an account:
invite-only (default), open, or domains with SIGNUP_ALLOWED_DOMAINS. One OpenID Connect provider
(Keycloak, Authentik, Entra ID, Okta…) is set with the OIDC_* variables; Google, GitHub and Microsoft with
their <PROVIDER>_CLIENT_ID and <PROVIDER>_CLIENT_SECRET. Redirect URI: <RONDE_URL>/api/auth/callback/<provider>.
Transcripts without sending sound away
Transcripts (Team) use a speech-to-text service with the OpenAI API. To keep the sound on your servers,
start the whisper profile and point Ronde at it:
cat >> .env <<'ENV'
TRANSCRIPTION_URL=http://whisper:8000/v1
TRANSCRIPTION_MODEL=Systran/faster-whisper-small
ENV
docker compose --profile whisper up -d
Slack
With a Team or Enterprise license, workspaces can add Ronde to Slack: check-in reminders by direct
message, check-ins filled in from a Slack form, notifications in a channel, and the /ronde command. The
instance needs its own Slack app, created once. Slack must reach RONDE_URL over HTTPS.
Get the app's manifest and replace every
https://ronde.example.comin it with yourRONDE_URL:curl -fsSLO https://raw.githubusercontent.com/joinronde/ronde/main/docker/slack-manifest.ymlAt api.slack.com/apps: Create New App › From a manifest, pick your Slack workspace and paste the file.
Copy the keys of Basic Information › App Credentials into
.env(SLACK_CLIENT_ID,SLACK_CLIENT_SECRET,SLACK_SIGNING_SECRET), then rundocker compose up -d.In Ronde, an owner or admin of each workspace opens Settings › Slack › Add to Slack.
To add the app to several Slack workspaces, turn on Manage Distribution in the app's settings.
Microsoft Teams
With a Team or Enterprise license, workspaces can add Ronde to Microsoft Teams: check-in reminders by
personal message, check-ins filled in from a card, notifications in a channel, and the ronde command. The
instance needs its own Teams app, an Azure Bot registered once in your Microsoft organization. Microsoft must
reach RONDE_URL over HTTPS.
- In the Azure portal: Create a resource › Azure Bot, with a handle
(
ronde), the free F0 plan, Type of App: Single Tenant and Create new Microsoft App ID. - In the bot, Settings › Configuration: set the Messaging endpoint to
https://ronde.example.com/api/teams/messages(yourRONDE_URL), save, and copy the Microsoft App ID and the App Tenant ID. - Manage Password, on the same page, opens the app registration: Certificates & secrets › New client secret, then copy its Value (shown once).
- In the bot, Settings › Channels: add Microsoft Teams and accept its terms.
- Put the three values in
.env(TEAMS_APP_ID,TEAMS_TENANT_ID,TEAMS_APP_PASSWORD), then rundocker compose up -d. - In Ronde, an owner or admin of a workspace opens Settings › Microsoft Teams and downloads the app. A Teams administrator uploads it (Teams admin center › Teams apps › Manage apps › Upload new app) and adds it to a team: Ronde posts a card in its channel, and Link to Ronde picks the workspace.
The client secret expires after 6 to 24 months: create the next one before, and replace TEAMS_APP_PASSWORD. A
single-tenant bot serves the people of your own Microsoft organization; to offer the app to other
organizations, it is published in the Teams Store.
Upgrade
docker compose pull && docker compose up -d
The migrate container applies the migrations of the new version before the app starts. Pin a version with
RONDE_VERSION=1.0.0-beta.3 in .env to choose when to upgrade.
Backups
Everything lives in the PostgreSQL volume:
docker compose exec db pg_dump -U ronde ronde | gzip > ronde-$(date +%F).sql.gz
Images
| Image | What it is |
|---|---|
ghcr.io/joinronde/ronde |
The app, every edition (paid features off without a license) |
ghcr.io/joinronde/ronde-ce |
The app without the code of the paid editions (AGPL only) |
ghcr.io/joinronde/ronde-migrate |
The database migrations of the same version |
Every secret variable also accepts <NAME>_FILE (Docker secrets). Education: schools and universities get the
paid plans for free, ask at https://joinronde.com/education.