Operator manual · Setting up

First-time setup

The first start of your server, claiming it with your phone, the first owner, and what the setup wizard does and does not do.

Before the first start

Your server keeps everything in one folder, data, next to docker-compose.yml. The server sees it as /data. Back up that folder and you have backed up the whole community.

A new server has no admin password, and you do not put one in the .env file. If ADMIN_PASSWORD is there, a new server ignores it, and its log says so at every start until you take it out of .env. The community's first owner claims it with a one-time claim code instead: see Claim your community: the address, then your phone, below.

On its first start the server makes the claim code and puts it in a file, data/claim-code.txt, that only the server can read. It never prints the code in the log, because the log is kept for as long as the server runs and gets copied into support requests. beanpool claim shows it to you. You can also read it with: docker compose exec beanpool-node cat /data/claim-code.txt

Docker and live-restore

Docker can restart, or take a patch update (the last number of its version, for example 27.3.1 to 27.3.2), without stopping your community when live-restore is enabled. A new version number in the first two places (27.3 to 27.4) can still stop it, so update Docker in a quiet hour, as before. It is an optional step below the install block in the README (the one-paste block on beanpool.org/start leaves it out), safe to skip, and an AI assistant doing the install always does it. A server installed without it, or before it existed, needs it once. It takes root: as root, run the commands as they are, and otherwise put sudo in front of each one (type sudo -v and your password first, so a password prompt never lands in the middle of what you paste). Check first that the machine has systemd (command -v systemctl prints a path) and that Docker is running (docker info prints without an error). Without systemd, leave live-restore off: the server runs fine without it. With both, run docker info --format '{{.LiveRestoreEnabled}}' first: if it already prints true, stop and leave daemon.json alone, because live-restore is already on (perhaps as a --live-restore flag in Docker's systemd unit), and a second copy of it in daemon.json would stop Docker from starting. If it prints false, add {"live-restore": true} to /etc/docker/daemon.json. If the file is missing, create it with just that. If it exists, copy it to daemon.json.new with cp -p, which keeps its permissions (a file that holds proxy or registry passwords may be readable by root only), add the key to the copy and keep every other key, check that the copy is valid JSON, then move it over the original with mv, so a half-written file is never left for Docker to read. If the original is not valid JSON, leave it alone and fix it first. Then run systemctl reload docker (never a restart) and check that docker info --format '{{.LiveRestoreEnabled}}' prints true.

Servers that still have a password

A server set up before the claim code keeps its admin password exactly as it was. Its first password was the ADMIN_PASSWORD in .env, or one the server made up and put in data/first-admin-password.txt. Read that file with: docker compose exec beanpool-node cat /data/first-admin-password.txt. Until you change the password in Access & Security, every start reminds you in the log that the file is still there, without printing the password. The file is deleted the moment you change it. The server reads ADMIN_PASSWORD only on its first start, so to change the password, use Settings.

What the first start creates

Your community needs an address phones can reach

The BeanPool app reaches a server on the internet only over https. Before you claim your community, choose one of these three. Each works as well as the others:

A name survives a change of server; a number does not. If your server or its IP address changes, every member has to type the new one, while a name can be pointed at the new server. You can add a .beanpool.org name later in Settings → Public Address, or your own domain under Your own address there: members who use the IP address keep working, and new members are sent to the name. Members' phones then offer to move to the name, once each has checked it is the same community (see A number or a name, in Address, identity and peers).

Your own address, under Settings → Public Address, shows each certificate your server holds, when it renews, and why the last try failed if it did. If a certificate is not renewed in time, the owners are told (see Updates and health).

Behind a home router with no ports open, use a name: nothing on the internet can reach your server to check its IP address or a domain.

A plain http:// address, such as http://203.0.113.7, works only on a home network. A phone never uses plain http to a server on the internet, so a claim QR code that carries one does not open. beanpool claim warns you before it shows such a QR code, and when you press Enter to skip the name on a server with no https address. Run it again with --ip, a name or your own address: the claim code waits until a phone uses it.

Setting your server up with an AI assistant? See Setting up your server with an AI assistant: what to ask it, and what stays yours.

Claim your community: the address, then your phone

First, on the phone that will own the community: install BeanPool from Google Play or the App Store. You don't need an account first, an invite, or anything from the BeanPool project: the claim makes your BeanPool account on that phone. Scan the QR code below, type your name under Your name here and tap Claim and become owner. Then BeanPool shows you your 12 words: write them on paper. A phone that already has a BeanPool account claims with it.

The last step of an install, on the server:

docker compose exec beanpool-node beanpool claim

To scan the QR code, point your phone's camera at it: the camera opens it in BeanPool, on Claim ‹name› with the code filled in. Or open BeanPool yourself and tap Installed BeanPool on a server? Claim it (with an account already: Find a community or Start a community, then Set up a new community server), then Scan the code. If the QR code carries no address, BeanPool fills in the code and asks for your server's address. To type the code instead, it is the part after claim- that beanpool claim shows: the empty box shows xxxx-xxxx-xxxx-xxxx, an example, not a code.

An owner's phone needs a screen lock (a PIN, a pattern, a fingerprint or a face): it is how you manage the community. Without one, the claim screen says Set a screen lock first and nothing is made. With no account on the phone, the claim then goes on as joining does: Your Photo, Safety Backup with your 12 words (and, if you like, Add a sign-in as a second way back, kept by your own community, never by the BeanPool project), How it Works, and last You own ‹name›, with Set the address or Open Settings. It also says: Next: confirm your community's core settings in Settings. About five minutes; your community runs meanwhile. If the server's answer doesn't come back, the account stays on the phone and the screen says We couldn't confirm the claim yet. It may have worked.: tap Check again, and BeanPool comes back to it the next time it opens. If another phone claimed the community first, it says Someone already owns ‹name›., and nothing is left on your phone.

If the community already has an owner, it says so: use beanpool recover instead. To make an owner without a phone claim, give the key the phone shows in Settings: beanpool claim --key KEY --callsign NAME. It prints that owner's break-glass code once, and the community is told.

Open Settings

Go to your server's address followed by /settings, for example https://example.org/settings. While your community has no owner yet, the page shows how to claim it: see A community with no owner yet, below. Once it has one, owners and admins sign in from the BeanPool app: see Signing in to Settings. On a server that still has an admin password, you can also sign in with it. The first time, Settings opens on one card: set up two-factor sign-in with an authenticator app on your phone, and write down the eight backup codes it shows. Settings does not open on the password alone: nothing else opens until the server accepts a code from the authenticator. Do it straight away: until then, tools that send the password with every request are refused too (give them an automation token instead, see Access and security). Then Settings opens.

Confirm the core settings

Open Core settings, the last item in the left menu, and press Walk through them. It takes about five minutes, one setting a step, and your community runs meanwhile. A local community also sets its place there. At the end, Confirm and lock locks them; from then on each change asks you to unlock it first. See Core settings.

A community with no owner yet

On a new server, the sign-in page at /settings first says This community has no owner yet. and shows how to claim it: see Claim your community: the address, then your phone above.

The page's QR code carries only your server's address, as it is in the browser's address bar, and a short number that names the waiting code. It never carries the code itself: anyone can open this page, so the code is only ever read on the server. The address is written out under the QR code too, so you can check it. Open the page at the address the app will use (for example https://yourtown.beanpool.org/settings), not the server's home-network address. When opened at an unlisted address, the page shows Open this page at … to scan instead of the QR code, because the node answers only at its listed names.

The page checks every few seconds, and the moment the community has an owner it turns into the normal sign-in by itself. It stops checking while the tab is in the background, and checks again when you come back to it. Only when the first check fails does the page show the normal sign-in (a later failure keeps the card), so a server that still has a password can always be signed in to with it.

Below the claim, This server also has an admin password opens the password sign-in, only on a server that still has one. A new server has no admin password, so it does not show it.

The setup wizard

Settings never opens the setup wizard by itself: every server already has members it made itself, such as the built-in BeanPool account. Open it from Home with Launch Cold-Start Wizard →. You can leave it at any step and open it again later. It records that you finished it in this browser only.

The first-time setup wizard in Settings
The first-time setup wizard in Settings

What it does:

A step shows ✓ only when it really happened. You can move on from any step without finishing it.

What it does not do yet:

The first owner

Making an invite never makes an owner. On a new server the first owner is the phone that claims it (see Claim your community, above), on the global community too. From then on that phone opens Settings as owner from the app's Manage button. Owners have no new-account limits.

When the first real people have joined, make at least one of them a second owner: open People & Safety → Owners & admins and add them, or open the person and choose 👑 Grant Owner. Keep at least two owners, so a lost phone does not lock the community out.

A server set up before the claim code may already have a member called Admin, made owner by an older version so the first invites had someone to come from. Nobody holds its key, so nobody can sign in as it. On such a server, the password holder makes a real person owner the same way, with 👑 Grant Owner.

Then

The whole manual is on your community's server, matching the version it runs: sign in to Settings (your server's address followed by /settings) and press Manual, or the ? beside a screen's title. Only this part of it is on the website. Manual version 157.