Skip to main content

elpanctl

elpanctl is the operator CLI: most of what the admin app does, and the server tasks that have no screen, such as initializing the server, backups and the bulk repairs. It runs across all accounts on the server.

It runs in a root shell on the server. The command is root only (/usr/sbin/elpanctl) and switches to the panel's own user itself, so you never run it as another user or through sudo -u.

elpanctl <command> [arguments] [options]

Finding a command​

elpanctl list lists the commands with a one-line description each, grouped by namespace. The namespace is the part before the first colon, and list takes one to show only its commands:

elpanctl list
elpanctl list account
elpanctl help account:create

elpanctl help <command>, or <command> --help, prints a command's arguments and options. Commands are named by their full name (server:admin-user:create); an abbreviation elpanctl happens to accept is not a name to rely on.

The namespaces, by what they are about:

NamespaceWhat it covers
account:*Accounts: create, list, view, edit the limits, suspend, terminate, delete, impersonate, reset credentials.
service:*, host:*Services (DNS zones, websites, mail, identity providers) and the hostnames they are attached to. host:account:*, host:user:* and the others under host: are the mailboxes, forwarders and groups of a mail domain.
server:*The server itself: server:init, server:edit, server:refresh, admin users, server API keys, sign-in help requests, telemetry.
dns:*, certificate:*DNS publication and inspection; certificates and the ACME accounts that issue them.
backup:*, database:*Backup repositories and assets; accounts' databases.
webapp:*The web applications across all accounts: the release catalog and mass upgrades.
ip_address_group:*, appserver:*, webhook:*, oidc:*, assistant:*Shared IP address groups, app servers, webhooks, the identity providers' clients and sessions, the AI assistant's conversations.
housekeeping:*The purges and recounts the timers run, for running one by hand.

Besides a command's own options, every command takes -n (--no-interaction, no questions: for scripts) and -q (--quiet, errors only). A command that asks for confirmation before something destructive usually has --force to skip it.

Output formats​

Commands that list things print a table by default and take --format:

FormatShapeFor
tsvOne row per line, tab-separated, with a header row unless --no-header.awk, cut, xargs.
jsonlOne JSON object per line.jq.

The commands that issue setup links (account:create, account:reset, server:admin-user:create, host:user:reset, ...) also take --format, with text, tsv, jsonl and table. text, the default, is the hand-off view: one block per user with the link, the claim page and the PIN, closed by the note to pass on. In every other format standard output carries the records alone, and the human-facing messages go to standard error, so a script can read the link without parsing prose.

The first column of a tsv listing is usually the identifier the matching *:refresh, *:view or *:remove command takes, which is what makes the pipelines below work.

The *:refresh family​

The panel writes configuration to the host (Apache and nginx vhosts, mail routing, DNS records, Unix users and their lock state, database logins) whenever the thing it describes changes. A *:refresh command rewrites that configuration for one object as if it had just changed, without changing anything in the panel's own records:

CommandTakesRewrites
host:refresh <hostname>A hostname.The host's configuration and DNS records.
service:refresh <uuid>A service UUID (from service:list).That service's configuration.
account:refresh <username or UUID>An account.The account's Unix side, and then its status again: the lock state of its Unix users, its websites, mail gates, DNS and database logins.
host:account:refresh <user@hostname or UUID>A mailbox, forwarder or group.Its mail configuration.
ip_address_group:refresh <group ID>A shared IP address group (from ip_address_group:list).The group's web server configuration (Apache, and the nginx frontend of every host in the group), the name server's and the mail filter's lists of the group's addresses, and the server's own DNS records.
appserver:refresh <ID>An app server.Its configuration.
account_ip_address:refresh <ID>...Account IP addresses.Their configuration.

When to run one:

  • After a release that changes what the server renders. The upgrade runs its own deploy tasks (Updates); when a release note says to refresh a kind of object, this is how.
  • When the host drifted from the panel: the files on it no longer match what the panel holds, e.g. after a configuration file was edited by hand. The refresh puts back what the panel would have written.
  • After a repair of the panel's records, so the host matches them.

Refreshing everything of one kind is a tsv listing piped into the refresh command:

elpanctl account:list --format=tsv --no-header | awk '{print $1}' | xargs -n1 elpanctl account:refresh
elpanctl ip_address_group:list --format=tsv --no-header | awk '{print $1}' | xargs -n1 elpanctl ip_address_group:refresh
elpanctl service:list --format=tsv --no-header --type=userwebsiteservice | awk '{print $1}' | xargs -n1 elpanctl service:refresh

service:list --owner=<username or server> and --type=<type> narrow a service listing to one account or one kind, which is how you refresh, say, every website and nothing else. Hosts and services covers the service types.

server:refresh​

The server has configuration of its own: the system-wide config fragments, the server-owned panel services (the admin app, the account panel, the mail servers, the name servers), its keys, and the splash page on the bare hostname. They are written when the server is created and whenever it changes, which once installed is rarely. server:refresh re-runs that sync:

elpanctl server:refresh

Run it when a release adds something the server is expected to own (a config fragment, a DKIM key), or after installing or removing elpan-haproxy, which decides whether the websites' HTTPS records advertise HTTP/3; the command reports which it is and how many hosts' records it resynced.