Panel settings
Most of the panel configuration can be changed on the Settings page, without SSH. Values you save there are kept in /var/lib/wardpane/settings.json and take priority over /opt/wardpane/.env.
Groups
| Group | What is in it |
|---|---|
| Panel access | sign-in name and password, signing in as root, the IP allow list, brute-force limits, session lifetime |
| Certificates | the Let’s Encrypt email, staging, the IP certificate, public IPv4 and IPv6 addresses |
| Integrations | the Cloudflare API token, the MaxMind key for GeoIP updates, public IP feeds |
| PHP | the sandbox level |
| Server | read-only information |
| Restart panel | restarts the panel service |
Where values come from
The order is: the built-in default, then .env, then settings.json. Every setting shows where its current value comes from (default, from .env, from panel), and you can reset it to the .env value with one button.
The Cloudflare token and the MaxMind key are never sent to the browser; the page only shows whether they are set. On disk they are stored as plain text, the same as in .env. Only the panel can read the file, and it goes into the update backups, which only root can read.
Each save keeps the previous file as settings.json.bak. A card is saved as a whole or not at all, and if something is wrong, every error is shown next to its field in one go.
What applies when
The sign-in name and password, PANEL_ALLOW_IPS, sign-in limits, session lifetime, ACME_EMAIL, Cloudflare, MaxMind and IP_FEEDS apply as soon as you save them.
ACME_STAGING, IP_CERT, PUBLIC_IP, PUBLIC_IPV6 and PHP_SANDBOX apply after a restart. They are marked “applies after restart”, and once you save one of them, the dashboard reminds you that a restart is pending.
Ports, BIND_ADDRESS and paths (DATA_DIR, WWW_ROOT, GEOIP_DIR) can be set only in .env. The installer sets up the firewall, systemd units, permissions and backups for these values, so change them in .env and run install.sh again.
Changing the password and name
The password has its own form under Panel access. You enter the current password first, and a wrong one counts as a failed sign-in. The new password must be 12 to 128 characters long; it is stored as an scrypt hash, and saving it ends all other sessions. Changing the sign-in name works the same way: it asks for the current password and signs out the other sessions.
The IP allow list
PANEL_ALLOW_IPS is not saved if the new list does not include the address you are using right now, so you cannot lock yourself out of the panel. If you connect over IPv6 and allow only your exact address instead of your /64, the panel warns you, because IPv6 addresses change over time. More in panel security.
Restarting the panel
Restart panel works when the panel runs under systemd. The panel saves its data, gives requests in flight up to five seconds to finish and exits. systemd starts it again while the page waits for it to come back. For a few seconds the panel and all sites are unavailable, and everyone has to sign in again. From the console:
sudo systemctl restart wardpane
Lost access
If you forgot a name or password set in the panel, locked yourself out with the allow list, or settings.json is damaged, run this on the server:
sudo node /opt/wardpane/bin/unlock-login.js --reset-access # name, password, allow list and root sign-in from .env again
sudo node /opt/wardpane/bin/unlock-login.js --reset-access=allow-ips # only PANEL_ALLOW_IPS (or user, password, root-login)
sudo systemctl restart wardpane
The previous file is kept as settings.json.before-reset-<time>; other settings stay. To reset the password, PANEL_PASSWORD must be set in .env.
.env reference
| Variable | Default | In the panel | Meaning |
|---|---|---|---|
PANEL_USER / PANEL_PASSWORD |
admin / none |
at once | sign-in to the panel |
PANEL_PORT |
1500 |
no | panel port |
HTTP_PORT / HTTPS_PORT / BIND_ADDRESS |
80 / 443 / 0.0.0.0 |
no | ports and address for the sites |
ACME_EMAIL |
none | at once | Let’s Encrypt account email; without it no certificates are issued |
ACME_STAGING |
false |
restart | Let’s Encrypt test environment |
IP_CERT |
true |
restart | issue a certificate for the server IP |
PUBLIC_IP |
detected | restart | public IPv4 of the server |
PUBLIC_IPV6 |
all global IPv6 addresses | restart | public IPv6 addresses, or none; used to check AAAA records before ordering certificates |
WWW_ROOT |
/var/www |
no | root of the site folders |
DATA_DIR |
/var/lib/wardpane |
no | data, panel settings, certificates, the ACME account |
GEOIP_DIR |
$DATA_DIR/geoip |
no | MaxMind .mmdb databases |
MAXMIND_ACCOUNT_ID / MAXMIND_LICENSE_KEY / MAXMIND_EDITIONS |
none | at once | automatic GeoIP updates |
CLOUDFLARE_API_TOKEN / CLOUDFLARE_LIFT_UNDER_ATTACK |
none / true |
at once | Cloudflare API access; whether to lift Under Attack mode during a challenge if the exception rule cannot be created |
IP_FEEDS |
none | at once | public IP blocklists: spamhausDrop, fireholLevel1, blocklistDe |
PANEL_ALLOW_IPS |
none | at once | who can reach the panel at all |
PHP_SANDBOX |
strict |
restart | strict or basic |
LOGIN_MAX_ATTEMPTS / LOGIN_BLOCK_MINUTES |
5 / 15 |
at once | brute-force protection |
SESSION_HOURS / SESSION_IDLE_MINUTES |
12 / 120 |
at once | maximum session length and idle sign-out |
ROOT_LOGIN |
false |
at once | allow signing in as root with the root password |
After editing .env, restart the panel with sudo systemctl restart wardpane. A value saved in the panel wins over .env; reset it in Settings to let .env apply again.