Install Bemmoly on a Linux server
One command on a fresh Linux VM installs Docker, Postgres 18, automatic HTTPS, nightly backups and the in-app updater, then prints the address of your workspace. Plan on about five minutes.
The installer pulls the newest stable release, 0.3.0 today: the foundation (setup, people and roles, email, backups and updates) and the Work module, with issues, boards, the backlog and sprints.
1. Get a server
- A VM with 2 vCPU and 4 GB of memory, enough for about 200 people. 2 GB is the minimum; sizing covers larger teams.
- Ubuntu 22.04 or later. Debian 12, Fedora 40 and Amazon Linux 2023 or later are supported by the installer too, but not yet tested end to end as Ubuntu is.
- Root or sudo, 10 GB of free disk, ports 80 and 443 free, and outbound DNS and HTTPS.
-
A domain name with a DNS record pointing at the VM, such as
work.example.com.
The installer checks each of these itself and stops with the fix for anything missing. If the name does not point at the machine yet, it starts with a self-signed certificate, and a real one follows by itself once DNS does.
2. Run the installer
curl -fsSL https://get.bemmoly.com | sh
The script at get.bemmoly.com downloads the installer of the matching release from GitHub, checks its SHA-256 checksum and runs it with your options.
To read it before running it, download it first:
curl -fsSL https://get.bemmoly.com -o install.sh less install.sh sudo sh install.sh --domain work.example.com
Options go after sh -s -- when piping, or straight after the script name:
| Option | What it does |
|---|---|
--domain NAME | The hostname people will use. Asked for when you leave it out. |
--version X.Y.Z | The version to install, or latest or beta. The newest in the channel by default. |
--channel stable|beta | The update channel. Stable by default. |
--modules a,b | Pin the enabled modules. By default an admin chooses them in Settings. |
--no-proxy | Leave out Caddy: you terminate HTTPS, and the app listens on port 8080. |
--no-in-app-updates | Leave out the updater container; update with sudo bemmoly upgrade. |
--database-url URL | Use an existing Postgres 18 instead of the bundled one. |
--image-archive FILE | Load the images from a release bundle instead of pulling them (offline). |
--dir PATH | The install folder. /var/bemmoly by default. |
--yes | Do not ask anything; fail when something is missing. |
3. Watch what it does
- Checks the machine: the operating system, memory, disk, ports and DNS.
- Installs Docker Engine and the Compose plugin if they are missing, or uses yours.
-
Writes
/var/bemmoly: the Compose file, the Caddyfile, a.envwith freshly generated secrets, and thedataandbackupsfolders. - Starts the stack. The app waits for Postgres, applies its schema changes under a lock and starts; Caddy requests the certificate.
-
Schedules the nightly backup and installs the
bemmolycommand, then prints the address.
4. Open the address and finish setup
The first visit runs the setup wizard: the server’s health checks, then the first admin account, then invitations, what AI may do once it arrives in 0.4, and the workspace’s look. Everything can be changed later in Settings. After install shows the steps.
Modules start switched off. To track issues, turn on Work in Settings › Modules and choose who can use it: nobody yet, everyone, or specific teams.
Keep a copy of /var/bemmoly/.env somewhere safe. It holds the key that decrypts
stored credentials and the backup passphrase, and backups do not contain it.
5. Look after it with one command
The installer puts bemmoly in /usr/local/bin. It asks for sudo
itself;
bemmoly help lists everything.
| bemmoly … | What it does |
|---|---|
status | Containers, version, database size, queue, last backup, certificate. |
doctor | Re-runs the installer’s checks and the app’s health checks, with fixes. |
logs [service] [-f] | Recent logs of bemmoly, db, proxy or updater. |
backup / backups | Take a backup now; list every backup with version, size and verification. |
verify <backup> [--drill] | Check a backup’s checksums, or restore it into a temporary database. |
restore <backup|file|s3-url> | Restore a backup; --mount attaches one read-only beside the live data. |
upgrade [version] | Backup, pull, verify, swap, health check; rolls back on its own if the check fails. |
rollback | Go back to the previous version, saying first exactly what it keeps. |
config get | set KEY | Read or change a setting in .env and restart what uses it. |
update-channel [stable|beta] | Show or change the update channel. |
Updates can also run from the app: Settings › Updates shows the release notes and updates with one click, taking a backup first. Checking for new releases is off until an admin turns it on there.
Other ways to run it
Already run Docker Compose? Follow the Docker Compose guide with the same files the installer writes. An existing Postgres, Kubernetes and servers without internet access are covered on self-hosting.