curl -fsSL https://reloopcrm.com/install.sh | shThe script installs into ~/reloop/deploy. Set RELOOP_DIR to choose another folder.
What install.sh asks
- Domain. A name like
crm.example.com, or Enter forlocalhost. Withlocalhostthe app opens athttp://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. - 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.
- Owner email. The first account. It is the only address in
ALLOWED_SIGN_IN. - 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.ymland theCaddyfilefrom that release tag, - generates
POSTGRES_PASSWORD,BETTER_AUTH_SECRET,AGENT_BRIDGE_SECRETandCRON_SECRETwithopenssl, - writes
deploy/.envwith permissions600, - 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.shTo 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.shA 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.shWithout 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 ^[.