Skip to content
Open source, AGPL v3.See the plans

Docs

Install

Install Reloop CRM with one command, what the installer asks, and how to answer without questions.

curl -fsSL https://reloopcrm.com/install.sh | sh

The script installs into ~/reloop/deploy. Set RELOOP_DIR to choose another folder.

What install.sh asks

  1. Domain. A name like crm.example.com, or Enter for localhost. With localhost the app opens at http://localhost:3000. Sign-in works there because the session cookie drops the __Secure- prefix on plain http. A real domain gets HTTPS and the secure cookie.
  2. Existing reverse proxy. Asked only for a domain. Answer "no" and the bundled Caddy gets a certificate and serves HTTPS on ports 80 and 443.
  3. Owner email. The first account. It is the only address in ALLOWED_SIGN_IN.
  4. Owner password. 12 to 128 characters. You type it twice. It is never written to disk.

The script then:

  • reads the newest release from GitHub and writes it to RELOOP_VERSION, so the install runs a released version and not a branch build,
  • downloads docker-compose.yml and the Caddyfile from that release tag,
  • generates POSTGRES_PASSWORD, BETTER_AUTH_SECRET, AGENT_BRIDGE_SECRET and CRON_SECRET with openssl,
  • writes deploy/.env with permissions 600,
  • pulls the images and starts them with Docker Compose,
  • creates the owner account and prints the address to open.

Running the script again keeps an existing deploy/.env. It never replaces a secret and never touches the database volume. After the stack is up it asks the API whether an account exists. When none does, for example because the first run failed after writing deploy/.env, it asks for the owner email and password again and creates the account. When one does, it leaves that account and its password alone.

Which version it installs

RELOOP_VERSION in deploy/.env decides which images run, and the installer pins it to the newest release. A release tag is built from a tag, so nothing that lands on main reaches your server until it is released.

To pick the version yourself, set it before you run the script:

RELOOP_VERSION=0.22.0 sh install.sh

To follow the newest images instead, set RELOOP_VERSION=latest. That is the setting the Update button needs, and it also takes every build of main, so it trades the pin for the convenience. The installer never changes an existing deploy/.env, so an install made before this keeps what it has.

Install without questions

Set the answers as variables and the script asks nothing:

curl -fsSL https://reloopcrm.com/install.sh -o install.sh
RELOOP_DOMAIN=crm.example.com RELOOP_EMAIL=you@example.com RELOOP_PASSWORD='a long password' sh install.sh

A real domain needs one variable more, because the script otherwise asks whether this server already runs a proxy on ports 80 and 443. Set RELOOP_OWN_PROXY=n to let Caddy take those ports, or RELOOP_OWN_PROXY=y to keep your own proxy in front and let the app listen on 127.0.0.1:3000:

RELOOP_DOMAIN=crm.example.com RELOOP_EMAIL=you@example.com \
  RELOOP_PASSWORD='a long password' RELOOP_OWN_PROXY=n sh install.sh

Without it the script stops at that question, and over ssh host '…' it stops without printing anything, because the question reads from the terminal and ssh gives the command none. Either set the variable or run ssh -t.

This also helps on a keyboard where @ needs the Option key. Some terminals send Option as Meta, so a typed @ arrives as ^[.