Statup
Language, English
GitHub
Get started / Install on Linux

Get started

Install on Linux

Install Statup as a systemd service on a Linux server without Docker, with one command that also upgrades and removes it.

One script installs Statup as a systemd service on any Linux distribution with systemd, x86-64 or ARM (aarch64). Docker stays the main way to install Statup.

Requirements

  • systemd, and a 64-bit machine: x86_64 or aarch64.
  • root, through sudo for example.
  • curl or wget.

Install

Shell
curl -fsSL https://github.com/karl-cta/statup/releases/latest/download/install.sh | sudo sh

Important

With --yes and an active firewall, ufw or firewalld, the script opens the port without asking. Add --no-firewall to leave the firewall as it is. Nothing is opened when Statup listens on this machine only.

The script asks a few questions, one at a time, then downloads Statup, checks its checksum, installs it and waits until it answers. It ends with the address of the instance. Open it to create the administrator: see First launch.

Questions

Press Enter to take the value in brackets. An option given on the command line answers its question, which is then not asked.

QuestionOptionDefault
Program folder--prefix <dir>/opt/statup
Data folder--data-dir <dir>/var/lib/statup
Backup folder--backup-dir <dir>backups in the data folder
Port--port <port>3000
Listen on every address, or on this machine only--listen <value>all
Account of the service--user <name>statup
Open the port in the firewall--firewall, --no-firewallyes
  • --listen takes all (every address), local (this machine only, for a reverse proxy on it) or an IP address.
  • The firewall question is asked only when ufw or firewalld is active and Statup does not listen on this machine only.
  • A folder is a full path of letters, digits, dots, dashes and underscores, and not a system folder such as /opt or /var/lib. An existing folder that holds files of another account is refused.
  • The questions need a terminal. Without one, the script stops and asks for --yes.
  • When /etc/statup/statup.env exists, from an earlier install that was removed, its settings are kept and only the program folder and the account are asked.

Other options

OptionEffect
--version <x.y.z>The version to install. By default, the latest.
--archive <file>Installs from an archive already downloaded.
--mirror <url>Downloads from a copy of the release files. Needs --version.
--yesTakes the default of every question not answered, and confirms --uninstall.
--uninstallRemoves Statup and keeps its data, settings and account.
--helpShows the list of options.

See Without access to GitHub for --archive and --mirror.

Install without questions

For Ansible or a script, give --yes and the options you need:

Shell
curl -fsSL https://github.com/karl-cta/statup/releases/latest/download/install.sh | sudo sh -s -- --yes --port 8080 --listen local

What the script installs

ItemWhere
Program/opt/statup: statup, static/, the license files and a VERSION file, owned by root.
Data/var/lib/statup: the database, uploads/ and the backups, owned by the service account, mode 750.
Accountstatup, a system account without login, created when it does not exist.
Settings/etc/statup/statup.env, owned by root and readable by the service account only.
Service/etc/systemd/system/statup.service, enabled and started.
Command/usr/local/bin/statup, to run the commands of Statup.

The service starts after the network, restarts after a failure and is limited to what it needs: of the powers of root, only the one to listen on a port below 1024, no new privileges, a private /tmp, the file system read-only except the data and backup folders, and the home folders hidden, or read-only when one of the two folders is under /home.

Logs go to the journal: journalctl -u statup.

Change a setting

/etc/statup/statup.env holds HOST, PORT, DATABASE_URL, UPLOAD_DIR and BACKUP_DIR. Add any other setting to it, one NAME=value per line, then restart:

Shell
sudo nano /etc/statup/statup.env
sudo systemctl restart statup
  • After a change of DATABASE_URL, UPLOAD_DIR or BACKUP_DIR, run the install command again: it creates the new folder and lets the service write to it, which a restart alone does not.
  • The firewall rule opened at install stays on the old port after a change of PORT.
  • Keep DATABASE_URL a plain path: an upgrade finds the data folder from it, and a path with parameters, such as ?mode=rwc, would mislead it.
  • The unit file is written again at each upgrade: settings belong in statup.env.

Maintenance commands

statup runs the commands as the account of the service, with its settings. Use sudo:

Shell
sudo statup backup
sudo statup reset-password you@example.com

backup writes to the backup folder. With --output, the file must be in the data folder or the backup folder: the service account cannot write elsewhere, and the command fails.

To restore, stop Statup. The command reads the file as the service account, so a file in your own folder is out of its reach: copy it to the backup folder first.

Shell
sudo systemctl stop statup
sudo cp statup-backup-2026-10-29-163045.db /var/lib/statup/backups/
sudo chown statup: /var/lib/statup/backups/statup-backup-2026-10-29-163045.db
sudo statup restore /var/lib/statup/backups/statup-backup-2026-10-29-163045.db
sudo systemctl start statup

Replace statup in chown with your account if you chose another. More on backups in Backups.

Upgrade

Run the install command again. The script finds the installed Statup and updates it: it keeps the settings, replaces the program and restarts the service. The options of a new install are ignored, and it says so. To choose the version, add --version.

Shell
curl -fsSL https://github.com/karl-cta/statup/releases/latest/download/install.sh | sudo sh
  • Statup backs up the database before an upgrade changes it: see Upgrading.
  • An older version than the installed one is refused unless you confirm, as its database may be too new for it. With --yes, it is refused.
  • The script waits up to 30 seconds for Statup to answer. A long upgrade, such as the backup of a large database, can end on “does not answer” while Statup is still starting: read journalctl -u statup.

Uninstall

Shell
curl -fsSL https://github.com/karl-cta/statup/releases/latest/download/install.sh | sudo sh -s -- --uninstall

The script asks first; --yes skips the question. It stops and removes the service, the statup command and the program files. It keeps the data and backup folders, /etc/statup/statup.env, the account and any firewall rule. Installing again with the same account finds the settings and keeps them.

Without access to GitHub

Download install.sh, the archive of your machine and SHA256SUMS from the release page on another computer, and copy them over. The archive is named statup-<version>-linux-x86_64.tar.gz or statup-<version>-linux-aarch64.tar.gz, as uname -m tells.

The script does not check an archive it is given. Check it yourself, then install it:

Shell
sha256sum -c SHA256SUMS --ignore-missing
sudo sh install.sh --archive statup-0.12.0-linux-x86_64.tar.gz

To serve the files from your own server, copy the archive and SHA256SUMS under <url>/v<version>/, and install.sh wherever you keep scripts. The script downloads them from there and refuses an archive whose checksum differs.

Shell
sudo sh install.sh --mirror https://files.example.com/statup --version 0.12.0