Install on a VPS
In this guide you install the panel on a fresh VPS, point a domain at it with a Let’s Encrypt certificate, and sign in as the first superuser.
Prerequisites
Section titled “Prerequisites”- Ubuntu 22.04+ or Debian 12+, x64 or arm64, with root or
sudo. - Ports 80 and 443 open at your provider.
- A DNS name for the panel (for example
panel.example.com) pointing at the server. - PostgreSQL 16+ and Redis that the server can reach. The installer doesn’t install them. They can be local, on your network, or managed.
1 GB of RAM runs the panel plus a handful of small apps. 2 to 4 GB is more comfortable, especially if you build from git on the server.
1. Prepare Postgres and Redis
Section titled “1. Prepare Postgres and Redis”Skip this if you already have them. For a same-host setup:
sudo apt-get install -y postgresql redis-serversudo systemctl enable --now postgresql redis-server
DB_PW="$(openssl rand -hex 16)"; REDIS_PW="$(openssl rand -hex 24)"sudo -u postgres psql -c "CREATE ROLE gisila LOGIN PASSWORD '$DB_PW';"sudo -u postgres createdb --owner=gisila gisila_panelecho "requirepass $REDIS_PW" | sudo tee -a /etc/redis/redis.conf >/dev/nullsudo systemctl restart redis-server
echo "DATABASE_URL='postgresql://gisila:$DB_PW@localhost:5432/gisila_panel'"echo "REDIS_URL='redis://:$REDIS_PW@127.0.0.1:6379'"The installer refuses insecure combinations, because every hosted app can
reach 127.0.0.1:
| Refused | Why |
|---|---|
| Redis with no password, or one under 16 characters | Any app could read and inject panel jobs. |
A well-known Postgres password (gisila, postgres, …) or one under 12 characters |
Any app could log in as the panel. |
| Postgres or Redis on a public address without TLS | Use ?sslmode=require or rediss://. |
GISILA_ALLOW_INSECURE=1 turns the refusals into warnings. Use it only on a
throwaway test machine.
2. Run the prebuilt installer
Section titled “2. Run the prebuilt installer”The prebuilt installer downloads compiled binaries and the web UI from a
GitHub release. It compiles nothing on the server. Put the env vars on env
or bash, not on curl:
curl -fsSL https://raw.githubusercontent.com/gumisofts/gisila_panel/main/infra/install-prebuilt.sh \ | sudo env \ DATABASE_URL='postgresql://gisila:<db-password>@localhost:5432/gisila_panel' \ REDIS_URL='redis://:<redis-password>@127.0.0.1:6379' \ PANEL_DOMAIN=panel.example.com \ ISSUE_TLS=1 \ bashIt installs Nginx, certbot, AppArmor and the psql client, creates the
gisila user and /srv/gisila and /srv/apps, installs gisila-panel,
gisila-worker, gisila-migrate and gisila-agent into /usr/local/bin,
writes /etc/gisila/.env, /etc/gisila/database.yaml and
/etc/gisila/secret.key, runs the migrations, seeds the first superuser,
installs the panel’s Nginx vhost and starts the services. With ISSUE_TLS=1
it also runs certbot for PANEL_DOMAIN.
The installer is idempotent, so you can re-run it. All its options are in Server configuration.
3. Get the first superuser’s credentials
Section titled “3. Get the first superuser’s credentials”The installer generated them into /etc/gisila/.env:
sudo grep -E '^SUPERUSER_(EMAIL|PASSWORD)=' /etc/gisila/.envSUPERUSER_EMAIL defaults to admin@<PANEL_DOMAIN>.
4. Sign in and secure the account
Section titled “4. Sign in and secure the account”Open https://panel.example.com, sign in, then:
- Change the password (Settings, or
POST /auth/change-password). - Turn on two-factor authentication.
- Create accounts for other people from the Users page
(
POST /auth/users). There is no public sign-up.
5. Install a runtime
Section titled “5. Install a runtime”Apps can only target an installed runtime. On the Applications page, install the ones you need (for example Dart 3.x) and pick a version.
Adding the domain later
Section titled “Adding the domain later”If you skipped PANEL_DOMAIN, point DNS at the server and run:
sudo sed -i 's/panel\.example\.com/panel.your-domain.tld/' \ /etc/nginx/sites-available/gisila-panelsudo nginx -t && sudo systemctl reload nginxsudo certbot --nginx -d panel.your-domain.tldVerify it works
Section titled “Verify it works”sudo systemctl status gisila-panel gisila-workercurl -sI https://panel.example.com | head -1journalctl -fu gisila-worker # should be idle, waiting for jobsAfter signing in, GET /system/info (or the dashboard) shows the panel and
agent versions and the server’s public IP.