Home Set up Docker

Set it up with Docker Compose

The shortest path, and the one to use if you are trying it out. One compose file, one command, and a tunnel if you have nowhere public to put it.

What you need

  • Docker and Docker Compose
  • A Slack workspace where you can install an app
  • A way to give Slack an HTTPS URL. A Cloudflare tunnel is fine and needs no open port.

Nothing on this page costs money beyond the machine it runs on, which is the point of running async standups in Slack for free.

1. Create the Slack app

Do this first, because the next step wants three values from it. The Slack app page covers it properly; the short version is: create an app from the manifest, add https://your-domain/oauth/callback as a redirect URL, and copy the client id, client secret and signing secret.

2. Clone and configure

git clone https://github.com/morgenruf/morgenruf.git
cd morgenruf/app
cp .env.example .env

Open .env and set at least these:

SLACK_CLIENT_ID=...
SLACK_CLIENT_SECRET=...
SLACK_SIGNING_SECRET=...
DATABASE_URL=postgresql://morgenruf:password@db:5432/morgenruf
APP_URL=https://standups.your-domain.com
FLASK_SECRET_KEY=$(openssl rand -hex 32)

APP_URL has to be the address Slack will call, not localhost. If you are using a tunnel, put the tunnel's URL here and restart after it changes.

3. Start it

docker compose up -d
docker compose logs -f app

The log will show migrations applying and then Scheduler started. That is the whole startup: there is no separate migration step and no seed data to load.

4. Let Slack reach it

Slack posts events to your app, so it needs a public HTTPS address. If you already run a reverse proxy, point it at port 3000. If you do not:

cloudflared tunnel --url http://localhost:3000

Copy the https://….trycloudflare.com address it prints, set it as APP_URL, and restart with docker compose restart app. For anything permanent, use a named tunnel rather than a quick one, because the quick URL changes each run.

5. Install it

Open your app URL in a browser and authorise the workspace. You become the first admin, and the dashboard opens on an empty Standups page. Create one: channel, questions, the hour, and who takes part. What a standup does once it is running is described separately, as are coffee chats, which stay off until you turn them on.

Keeping it running

  • Upgrades: docker compose pull && docker compose up -d. Migrations apply on start.
  • Backups: it is one Postgres database. pg_dump is the whole story.
  • Logs: docker compose logs -f app. Standups, coffee chat rounds and delivery failures all appear there.

Stuck? The issue tracker and discussions are where setup questions get answered, and CloudDrove will do the whole thing for you if you would rather not.

Questions

Running it with Docker

Can I run this on a Mac mini or a Raspberry Pi?

A Mac mini yes, and it is a good home for it. On a Pi you would need an arm64 image; the published image is amd64, so build it yourself on the Pi or use a small cloud VM instead.

Does Docker Compose bring its own Postgres?

Yes, the bundled compose file starts one for you. For anything you care about, point DATABASE_URL at a managed Postgres instead and keep backups out of the container's lifecycle.

How do I upgrade?

Pull the new image and restart: docker compose pull && docker compose up -d. Migrations run on start, and they are written to be safe to run against a live database.

How do I back it up?

It is one Postgres database, so pg_dump is the whole backup story. No state lives in the container.

Free for every seat, and that is the whole pricing page

Add to Slack puts Morgenruf on the free hosted instance CloudDrove runs, in about two minutes. Or self-host the same MIT code with Docker Compose or Helm and pay only for the server.