RespireCloud is not publicly released and has no public download address yet. The installer bundle goes to early-access partners; ask for access. Everything below describes the installer as it is today.
Before you start
- A fresh server you have root on, 64-bit x86, with systemd.
- One of: Ubuntu 22.04 LTS, 24.04 LTS or 26.04 LTS; Debian 12 or 13; AlmaLinux 9 or 10; Rocky Linux 9 or 10.
- Memory for the footprint you want: 1 GB for Compact, 2 GB for Standard, 4 GB for Full. At least 4 GB of free disk; 10 GB is recommended.
- A host name for the panel, such as
panel.example.com, with its DNS A record pointing at the server. - Free ports: 80 and 443 for websites, 7443 for the panel and 7444 for the editor; 25 and 53 only with mail and your own DNS. The installer checks each one and names the program that holds a taken port.
- For mail: outbound port 25 open at your provider, or a relay to send through.
Another control panel on the same server stops the install: two panels cannot share the web and mail servers. A web, database, mail or DNS server you manage by hand is reported with what will happen to it; nothing is overwritten silently.
Choose a footprint
| Footprint | Memory | What it installs |
|---|---|---|
| Compact | 1 GB | The panel, nginx, PHP 8.4, MariaDB and the firewall. Leaves out the heavy modules (the assistant, apps, CDN, cluster, containers, the editor, providers, the terminal, webmail, statistics and logs). Switch any of them on later in Modules. |
| Standard | 2 GB | Compact plus PHP 8.3 and every panel module except the assistant. The spam filter is on from 2 GB when you add mail. |
| Full | 4 GB | Standard plus the mail server, your own DNS, PostgreSQL for customers and the assistant. Needs a public address and DNS records for mail and the nameservers. The antivirus is on from 3.6 GB; below that the panel refuses it and says the number. |
| Custom | 1 GB and up | Compact, then Advanced asks module by module. For a server with one job: only DNS, only mail, only apps. |
The default follows the server's memory. Nothing is refused: the installer warns when memory is short and continues. Mail on a 1 GB server works but is tight (the spam filter takes about 450 MB, and it runs on every mail server because it signs outgoing mail); 2 GB is comfortable.
Install
-
Point the panel's host name at the server. Create a DNS A record for the name you will open the panel on, such as panel.example.com, with the server's public address. The free Let's Encrypt certificate for the panel needs it.
-
Run the installer as root. Unpack the release on the server and run: sudo bash install.sh. Simple mode checks the server first; add --advanced to be asked every choice.
sudo bash install.sh -
Answer four questions. The panel's host name, the email address of the first administrator, the footprint (Compact, Standard or Full) and the licence key. Press Enter at the key question to start a free 14-day trial. Enter takes the default in brackets, a question mark explains the question and b goes back.
-
Read the plan and confirm once. The installer lists everything it will install and change, with any warnings, and asks Install now? Nothing has been touched before this point.
-
Watch the services install through the panel. The panel is installed first, then the web server, PHP, the database engine, the certificate and the firewall are installed by the panel's own actions, each with its named steps on screen.
-
Copy the setup token and open the panel. The last screen prints the panel address and a one-time setup token. The token is shown only there; later it can be read with: cat /etc/respirecloud/bootstrap.token
A wrong answer is never fatal: the reason is printed and the question is asked again. The log is
/var/log/respirecloud/install.log, with secrets masked, and the answers are saved in
/etc/respirecloud/install.answers, readable by root only.
The end of a real Simple install on a 1 GB Ubuntu 24.04 server:
RespireCloud is installed
Installed through the panel:
+ Web server (nginx) and PHP 8.4
+ Serve the panel on panel.example.com
+ Certificate for panel.example.com (Let's Encrypt)
+ Database engine: mariadb
+ Firewall (ssh panel web)
+ Keep the firewall (version 1)
Panel : https://panel.example.com:7443/
Setup : open the panel, paste the one-time setup token, choose a password
Token : <64 hex characters> (shown only here; it is not written to the log)
Log : /var/log/respirecloud/install.log Create the first administrator
-
Create the administrator. Paste the token on the setup screen and choose a password. The email box is already filled with the address you gave. Then add a passkey and an authenticator app and save the recovery codes.
Point your domains' DNS at the server.
-
Create a hosting plan and your first account. Each new account gets a local backup target by itself; add a remote one in Backups, because a backup on the same disk does not survive the disk.
Lost the token? It stays in /etc/respirecloud/bootstrap.token until the administrator exists. The
guided tour shows the panel's screens.
What Advanced asks
sudo bash install.sh --advanced Every choice, in groups, each with a default and a one-line explanation. Answers are checked as you give them, with the reason on a bad one; PHP versions and database engines are checked while you type.
| Group | What it asks |
|---|---|
| Panel address and certificate | The host name, and a certificate from Let's Encrypt, your own PEM files or a self-signed one. |
| Administrator and time zone | The first administrator's email (the password is chosen in the browser) and the server's time zone. |
| Footprint | Compact, Standard, Full or Custom. |
| Web server and PHP | nginx or none, which PHP versions and the default one. |
| Customer databases | MariaDB, MySQL, PostgreSQL, or none. |
| The mail host name; direct delivery or a relay with host, port, login and required or opportunistic encryption; the DKIM selector; the spam filter and the antivirus (defaults follow the memory). | |
| DNS | Your own nameservers with their names and addresses, an outside provider later, or none. |
| Firewall and SSH | The recommended preset (only the ports the chosen services need) or none, and the SSH port to keep open. |
| Backups | A local target now, or later. |
| Assistant and extra modules | The assistant on or off, and modules to add on top of the footprint. |
| Ports and sizing | The panel port (7443), the editor port (7444) and the sizing profile (chosen from the hardware by default). |
| The panel's own database and cache | PostgreSQL and Valkey installed on this server, or addresses of ones you already run. |
| Licence and updates | A licence key (empty runs the trial) and the update channel: stable, beta or long-term. |
With a relay, the installer sends a test message to the administrator and fails the step if the relay does not accept it. The relay password is handed to the panel's secret store and then blanked in the answers file.
Unattended installs
sudo bash install.sh --yes --panel-host panel.example.com --admin-email you@example.com --footprint standard
sudo bash install.sh --advanced --print-answers > my.answers # then edit and reuse
sudo bash install.sh --yes --answers my.answers -
--yesasks nothing. The panel's host name is taken from the server's own name when that is a full host name; the administrator's email is always required. A missing required answer is an error that names the key. -
The answers file is
KEY=valueper line with#comments. It is parsed, never executed. -
Later sources win: built-in defaults, the answers an earlier install saved,
--answers FILE,RC_ANSWER_<KEY>environment variables, then flags. -
Secrets (the relay password, an external database or cache address) have no flag, so they never appear in the
process list: put them in the answers file or in
RC_ANSWER_<KEY>. The licence key has a flag too, but a flag shows in the process list, so useRC_ANSWER_LICENCE_KEY.--print-answersleaves the secrets blank.
What the installer does
-
Preflight. Root, the system and architecture, memory, disk and CPU against the footprint, the host name, the clock, free ports (the program holding a taken port is named), another panel or a hand-managed web, database, mail or DNS server, SELinux or AppArmor, outbound port 25 when mail is chosen. Each check is pass, warning or stop, with one sentence.
-
Plan. Everything that will be installed and changed, then one confirmation. With --dry-run it stops here and touches nothing.
-
The panel. The panel's own PostgreSQL and Valkey on the loopback address with generated passwords (or the ones you named), the software, the respirecloud user, the service units and the local agent's enrolment.
-
Services, through the panel. Once the panel is healthy, the installer runs the same actions as the panel's own Install buttons and shows each job's named steps: the web server and PHP, the panel's certificate, database engines, DNS, mail with your relay and filter answers, the firewall (it rolls back by itself unless confirmed), the licence and the update channel. It never installs nginx or Postfix by hand.
-
Finish. What was installed, what was skipped and why, what failed and how to resume, the panel address, the one-time setup token (on screen only, never in the log) and the next three things to do.
--check runs only the first step and --dry-run stops after the second. What is left for you
at the end is what only you can do: DNS records, the registrar's glue records and a remote backup target.
Licence and the free trial
The installer asks one question about the licence. A key starts with RC-. Press Enter
without one and a free 14-day trial starts for the administrator's email address. The trial has the
Pro edition, with limits of 50 hosting accounts, 5 resellers, 3 servers and 1 CDN edge. You can enter a key later on
the Licence page.
- The installer makes a key pair for this server. The private key never leaves it; the licence service only gets the public half.
- The licence service answers with the licence key the panel will use. The installer hands it to the panel in a file only root can read, and the panel deletes the file once it has activated the key.
- Running the installer again on the same server reuses the licence, so a trial is not started twice. A trial is given once for each email address and each network address in 90 days.
- If the licence service refuses the installation, or cannot be reached, the installer stops with the reason and installs nothing.
- For a key in an unattended install use
RC_ANSWER_LICENCE_KEY: a flag shows in the process list.--trial-emailsets another address for the trial.
How a download is verified
Run from an unpacked release, the installer uses the files beside it. Otherwise it asks the licence service for the release, which hands out the archive through short-lived signed links. The signed manifest, its signature and the release notes are public, so anyone can check a release. When it downloads the release for your channel, it installs it only when all of this holds:
- The signature. The release manifest carries an Ed25519 signature. It must verify against the release key built into the installer; an installer without a key refuses to download.
- The channel, size and checksum. The manifest must be for the channel you asked for and list the archive with exactly the size and SHA-256 that arrived.
- The version. A release older than the installed panel, or older than the installer itself, is refused, so a genuine but old signed release cannot be replayed over a newer one. --allow-downgrade lifts this on purpose.
- The archive. File names that are absolute or climb out with .. are refused.
Any failure ends with release check failed: <reason>. Nothing was installed. The check runs before the
first package is installed. Modules are verified again by the panel against the signed manifest when they load.
Proven in a lab with a release signed by test keys: a good release installed; a changed archive, a manifest signed by another key and an older signed release were each refused with the reason. The production signing keys and the public download address are not set up yet.
Update, repeat, uninstall
- The panel updates itself. By default it looks for a signed release and installs it every night from 03:00, keeping the running release and a copy of its database first, and goes back by itself if the new release does not start. Every server and the Store modules follow. You can be told instead, pause it or turn it off on the Updates page. An update needs a licence that is active or in grace. How updates work.
--updateis the same safe path by hand, and--rollbackgoes back to the saved release on purpose.- Run the installer again to upgrade in place. It keeps every module and every answer. A failed step says how to resume, and the same command resumes: finished steps are skipped.
--reconfigureignores the saved answers and asks again.-
--uninstallremoves the panel: its programs, units and modules. Customer sites, databases, mail and the services the panel installed are never touched, and/etc/respirecloudand/var/lib/respirecloudstay. -
--uninstall --purge-dataalso deletes those two folders and the panel's own database, after you typedelete panel data. A wrong phrase removes nothing.
Recovery scripts
The installer places three scripts in /usr/lib/respirecloud/recovery/ and refreshes them on every upgrade:
server-backup.sh: Writes one encrypted backup repository and a recovery bundle. Run it from cron as root.server-restore.sh: Rebuilds a freshly installed server from the bundle and its passphrase.server-check.sh: Lists what came back, line by line, and what a server backup never contains.
Keep a second copy of them with the recovery bundle and its passphrase, somewhere that is neither this server nor the backup store. In a lab run, a destroyed server with two customers, sites, MariaDB and PostgreSQL databases, a mailbox, DNS zones and a certificate was rebuilt on a blank one in 312 seconds from a freshly installed panel. A restore goes back to the time of the last backup: there is no recovery to a moment between backups. Sessions, the mail queue, container volumes and the licence activation do not come back.
Add more servers
-
On the Cluster page press Add a server. A default install listens for other servers only on itself, so the page first offers Get this panel ready for more servers: a plan that opens the bus port in the firewall, for the addresses you enter or any address if you leave them empty, and a confirmation.
-
Then create an enrolment token for the new server (action
core.node.enrol_token.create). You get a one-time token and the exact command to run. -
On the new server, as root:
respirecloud-agent enrol --panel https://panel.example.com --token rcen_… --ca-sha256 FINGERPRINT -
The agent creates its key on the machine and connects. If the panel's certificate authority does not match the fingerprint you passed, it says so and saves nothing.
Flags
| Flag | Meaning |
|---|---|
--simple, --advanced | question mode |
--yes, -y | ask nothing |
--answers FILE, --print-answers | read / write the answers file |
--dry-run, --check | plan only / preflight only |
--uninstall, --purge-data | remove the panel / also its data |
--reconfigure | ignore saved answers |
--allow-downgrade | accept an older signed release than the installed one |
--update --yes [--stage DIR] [--status FILE] [--id ID] [--channel CH] | update an installed panel with a saved copy and the way back (docs/release/updates.md); the panel's agent starts it as respirecloud-update.service |
--rollback --yes [--status FILE] [--id ID] | put the saved previous release and its database copy back |
--no-services | panel only |
--no-color | plain output (also automatic when not a terminal; NO_COLOR is honoured) |
--profile=ID | sizing profile (micro small standard large) |
--offline | skip the internet check |
--licence-key KEY | the licence key (unattended); shows in ps, so prefer RC_ANSWER_LICENCE_KEY |
--trial-email ADDR | the address for a free trial (default: the administrator's address) |
--mail, --no-mail, --ai, --no-ai | yes/no answers |
--<key>=value | any answer key below, lower-case with dashes (--mail-host mail.example.com) |
Answer keys
Every key is a line in the answers file, an RC_ANSWER_<KEY> variable and, unless it is a secret, a
flag in lower case with dashes (MAIL_HOST is --mail-host).
| Key | Default | Meaning |
|---|---|---|
MODE | simple | simple asks four questions, advanced asks everything; one of simple, advanced |
PANEL_HOST | none | host name the panel is served on (needs a DNS record for Let's Encrypt) |
ADMIN_EMAIL | none | email of the first administrator (certificate notices, setup) |
FOOTPRINT | none | what to install: compact, standard, full or custom; one of compact, standard, full, custom |
CUSTOM_MODULES | none | custom footprint: extra panel modules to add to compact |
PANEL_CERT | letsencrypt | certificate for the panel host name; one of letsencrypt, own, selfsigned |
PANEL_CERT_FILE | none | own certificate (PEM, full chain) |
PANEL_KEY_FILE | none | own certificate private key (PEM) |
TIMEZONE | none | server time zone (empty keeps the current one) |
WEB_SERVER | nginx | web server for customer sites; one of nginx, none |
PHP_VERSIONS | none | PHP versions to install, e.g. 8.3,8.4 |
PHP_DEFAULT | none | default PHP version |
DB_ENGINES | none | customer database engines: mariadb,mysql,postgresql or none |
MAIL | none | install the mail server (yes/no) |
MAIL_HOST | none | mail host name (MX); must match the server reverse DNS |
MAIL_DELIVERY | direct | send mail directly or through a relay; one of direct, relay |
MAIL_RELAY_HOST | none | relay host name |
MAIL_RELAY_PORT | 587 | relay port |
MAIL_RELAY_USER | none | relay user name |
MAIL_RELAY_PASS | none | relay password (secret) |
MAIL_RELAY_TLS | required | relay encryption: required (mail waits rather than going out unencrypted) or opportunistic; one of required, opportunistic |
MAIL_DKIM_SELECTOR | default | DKIM selector for new mail domains |
MAIL_SPAM | none | spam filter on/off (default by RAM) |
MAIL_AV | none | antivirus on/off (default by RAM) |
DNS | none | DNS: own nameservers on this server, an external provider later, or none; one of own, external, none |
DNS_NS1 | none | first nameserver name |
DNS_NS2 | none | second nameserver name |
DNS_NS1_IP | none | first nameserver address |
DNS_NS2_IP | none | second nameserver address |
FIREWALL | recommended | firewall preset (opens only what the chosen services need); one of recommended, none |
SSH_PORT | 22 | SSH port kept open by the firewall |
BACKUPS | later | backup target; one of local, later |
AI | none | AI assistant module on/off |
EXTRA_MODULES | none | additional panel modules to install on top of the footprint |
PROFILE | auto | sizing profile (auto chooses from the hardware); one of auto, micro, small, standard, large |
PANEL_PORT | 7443 | panel HTTPS port |
EDITOR_PORT | 7444 | code editor gateway port |
EDITOR_DOMAIN | empty | base domain for separate editor and dev-server preview addresses (`<name>.<domain>`); needs a wildcard DNS record `*.<domain>` pointing at the server and a wildcard certificate; empty keeps one shared editor address and previews are not offered; written as `RC_EDITOR_DOMAIN` |
EXT_SCREENS | on | screens of installed extensions run in a sandbox on their own address; `off` leaves them unavailable |
EXT_PORT | 7445 | port of that listener (`RC_EXT_LISTEN=0.0.0.0:<port>`); the recommended firewall opens it, together with the editor port |
EXT_DOMAIN | empty | optional base domain for one address per extension (`RC_EXT_DOMAIN`); needs wildcard DNS and a wildcard certificate in `/etc/respirecloud/tls/ext/`; empty uses the panel's own name on the port |
EXT_PUBLIC_PORT | empty | port people reach the screens on behind a proxy or NAT (`RC_EXT_PUBLIC_PORT`); empty means `EXT_PORT` |
PANEL_DB | local | panel database: install PostgreSQL here or use an external one; one of local, external |
PANEL_DB_URL | none | external panel database URL (secret) |
VALKEY | local | panel cache: install Valkey here or use an external one; one of local, external |
VALKEY_URL | none | external Valkey URL (secret) |
LICENCE_KEY | none | licence key (empty runs the trial) (secret) |
TRIAL_EMAIL | none | e-mail address of the free 14-day trial (empty: the administrator's address) |
CHANNEL | stable | update channel; one of stable, beta, lts |
ACME_DIRECTORY | none | ACME directory for customer (and panel) certificates (empty: Let's Encrypt) |
CUSTOMER_CA | default | default: set a certificate authority for customer certificates whatever the panel certificate is; none: leave it to the administrator; one of default, none |
Troubleshooting
| What you see | Cause and fix |
|---|---|
[STOP] port 80 is already used by nginx (pid 812) | Stop it, or pick --web-server none to keep it and run only the panel |
[STOP] another control panel (...) | Two panels cannot share nginx and mail; use a clean server |
| Let's Encrypt step failed | The panel name does not point at this server yet. Fix the DNS record, then respirecloudctl ssl cert issue --hosts <name> --target panel --target-host <name> |
Mail: outbound port 25 is blocked | Many hosts block port 25. Choose a relay, or ask the provider to open it |
| A service step failed | The panel itself is fine. Run install.sh again (resumes) or press Install in the panel; respirecloudctl jobs list and jobs logs <id> show the job |
| Out of memory while installing | Choose Compact, or add swap; --profile=micro |
| Where is the log? | /var/log/respirecloud/install.log (secrets masked) |
licence key ... is not a licence key (it starts with RC-) | Check the key you copied. Leave the key empty for a free 14-day trial |
the licence service refused the installation (...) | The panel's plain reason and the code are in the message. Nothing was installed. Fix the licence (or ask RespireSoft) and run the installer again |
could not reach the licence service | Check outbound HTTPS from this server, then run the installer again. Nothing was installed |
port 53 is already used by ... | A program other than systemd-resolved holds port 53. Stop it, or do not turn on your own DNS |
| Lost the setup token | cat /etc/respirecloud/bootstrap.token (valid until the administrator exists) |
Not proven yet
- SELinux in enforcing mode on AlmaLinux and Rocky Linux: the labs run with it off.
- The antivirus on a Full install was run on Ubuntu 24.04 and AlmaLinux 9; the other systems use the same code but were not run.
- A release signed with production keys, and the public download address.
- Almost all installs ran in lab containers. One install has run on a rented server (a disposable cloud box): it got real certificates for the panel, a site and mail, took mail in over TLS and answered DNS from the internet. That is one server, not a range.