Skip to content

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.

  • 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.

Skip this if you already have them. For a same-host setup:

Terminal window
sudo apt-get install -y postgresql redis-server
sudo 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_panel
echo "requirepass $REDIS_PW" | sudo tee -a /etc/redis/redis.conf >/dev/null
sudo 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.

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:

Terminal window
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 \
bash

It 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:

Terminal window
sudo grep -E '^SUPERUSER_(EMAIL|PASSWORD)=' /etc/gisila/.env

SUPERUSER_EMAIL defaults to admin@<PANEL_DOMAIN>.

Open https://panel.example.com, sign in, then:

  1. Change the password (Settings, or POST /auth/change-password).
  2. Turn on two-factor authentication.
  3. Create accounts for other people from the Users page (POST /auth/users). There is no public sign-up.

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.

If you skipped PANEL_DOMAIN, point DNS at the server and run:

Terminal window
sudo sed -i 's/panel\.example\.com/panel.your-domain.tld/' \
/etc/nginx/sites-available/gisila-panel
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d panel.your-domain.tld
Terminal window
sudo systemctl status gisila-panel gisila-worker
curl -sI https://panel.example.com | head -1
journalctl -fu gisila-worker # should be idle, waiting for jobs

After signing in, GET /system/info (or the dashboard) shows the panel and agent versions and the server’s public IP.