{{ notice }}
{% endif %}
{% if error %}
{{ error }}
{% endif %}
{% if page == 'dashboard' %}
Overview
{% for key, value in stats.items() %}
{{ key.replace('_', ' ').title() }}
{{ value }}
{% endfor %}
Recent queue items
{% if recent_queue %}| Queue ID | Sender | Recipients |
|---|---|---|
| {{ item.queue_id }} | {{ item.sender }} |
{% for rcpt in item.recipients or [] %}
{{ rcpt.address }}
{% endfor %}
|
Queue is currently empty.
{% endif %}Recent backups
{% if recent_backups %}| Name | Path |
|---|---|
| {{ item.name }} | {{ item.path }} |
No local backup runs found yet.
{% endif %}Domains
Add domain| Domain | Accounts | Aliases | Redirects | Status | Open |
|---|---|---|---|---|---|
| {{ domain.name }} | {{ domain.account_count }} | {{ domain.alias_count }} | {{ domain.redirect_count }} | {{ 'active' if domain.is_active else 'inactive' }} | Manage |
Create your first domain to manage accounts, aliases, redirects and DKIM.
{% endif %}Create domain
Close{{ selected_domain.name }}
Max accounts{{ selected_domain.max_accounts_display }}
Used accounts{{ selected_domain.used_accounts }}
Available accounts{{ selected_domain.available_accounts }}
Aliases{{ selected_domain.alias_count }}
Redirects{{ selected_domain.redirect_count }}
Status{{ 'Active' if selected_domain.is_active else 'Inactive' }}
DNS provider{{ selected_domain.dns_provider or 'manual' }}
Domain settings
DKIM
Private key path: {{ selected_domain.dkim_private_path or 'not generated yet' }}
{{ selected_domain.dkim_public_key or 'Generate DKIM to populate the public record.' }}
DNS provider
Last sync: {{ selected_domain.dns_last_sync_status or 'never' }}
Accounts
Add account| Current quota | Update quota | Update password | Status | Suspend / restore | Delete | |
|---|---|---|---|---|---|---|
| {{ account.email }} | {{ account.quota_mb }} MB | {{ 'Active' if account.is_active else 'Suspended' }} |
Aliases
Add alias| Alias | Destination | Active | Actions |
|---|---|---|---|
| {{ alias.source }} | {{ alias.destination }} | {{ 'yes' if alias.is_active else 'no' }} |
Redirects
Add redirect| Redirect | Target | Active | Actions |
|---|---|---|---|
| {{ redirect.source }} | {{ redirect.target_email }} | {{ 'yes' if redirect.is_active else 'no' }} |
Suggested DNS records
{{ key }}
{{ value }}
{% endfor %}
Mail Queue
{% if queue %}| Queue ID | Queue | Sender | Recipients | Reason | Actions |
|---|---|---|---|---|---|
| {{ item.queue_id }} | {{ item.display_state or '—' }} | {{ item.sender }} |
{% for rcpt in item.recipients or [] %}
{{ rcpt.address }}
{% endfor %}
|
{{ item.display_reason or '—' }} | {% for action in ['hold', 'release', 'requeue', 'delete'] %} {% endfor %} |
Queue is empty.
{% endif %}Backups
Backup schedules
| Name | Schedule | Storage | DB | Redis | Compression | Status | Actions |
|---|---|---|---|---|---|---|---|
| {{ item.name }} | {{ item.cron_expression }} |
{{ item.storage_id or 'Local only' }} | {{ item.include_database }} | {{ item.include_redis }} | {{ item.compression }} | {{ item.enabled }} | Edit |
Backup storages
New encryption key ready.
{% endif %}
{% if backup_storages %}
| Name | Type | Target | Encryption | Actions |
|---|---|---|---|---|
| {{ item.name }} | {{ item.type }} | {{ item.bucket or item.host or item.path or 'local' }} | {{ item.encrypt }} | Edit |
Available local backup runs
{% if backup_runs %}| Name | Path | Metadata |
|---|---|---|
| {{ item.name }} | {{ item.path }} |
{{ item.metadata or 'n/a' }} |
No local backups found.
{% endif %}Global backup settings
Banned IPs
| Created | IP | Reason | Source | Services | Action |
|---|---|---|---|---|---|
| {{ item.created_at or '—' }} | {{ item.ip }} | {{ item.reason }} | {{ item.source or 'manual' }} | {{ item.services or item.jail or '—' }} | |
| No banned IPs found. | |||||
Firewall
Settings
General settings
Version and updates
| Hostname | {{ settings_info.get('hostname', hostname) }} |
| Current version | {{ settings_info.get('current_version', 'unknown') }} |
| Latest version | {{ settings_info.get('update_status', {}).get('latest_version', 'not checked yet') }} |
| Update available | {{ 'yes' if settings_info.get('update_status', {}).get('update_available') else 'no' }} |
Shared TLS certificate
| Status | {{ ssl_info.get('status', 'unknown') }} |
| Mode | {{ ssl_info.get('mode', 'unknown') }} |
| Hostname | {{ ssl_info.get('hostname', hostname) }} |
| Certificate path | {{ ssl_info.get('cert_path', 'N/A') }} |
| Key path | {{ ssl_info.get('key_path', 'N/A') }} |
SSL actions
Service limits
API Credentials
| Admin user | {{ api_info.get('api_admin_user', 'N/A') }} |
| Endpoint | {{ api_info.get('api_endpoint', 'N/A') }} |
| Hostname | {{ api_info.get('hostname', 'N/A') }} |
API Usage
Authenticate using HTTP Basic Auth with your API admin credentials.
Example requests
curl -u <user>:<pass> {{ api_info.get('api_endpoint', '') }}health
curl -u <user>:<pass> {{ api_info.get('api_endpoint', '') }}domains
curl -u <user>:<pass> {{ api_info.get('api_endpoint', '') }}accounts
Service limits
Shared TLS certificate
| Status | {{ ssl_info.get('status', 'unknown') }} |
| Mode | {{ ssl_info.get('mode', 'unknown') }} |
| Hostname | {{ ssl_info.get('hostname', hostname) }} |
| Certificate path | {{ ssl_info.get('cert_path', 'N/A') }} |
| Key path | {{ ssl_info.get('key_path', 'N/A') }} |
| Cert file present | {{ 'yes' if ssl_info.get('cert_exists') else 'no' }} |
| Key file present | {{ 'yes' if ssl_info.get('key_exists') else 'no' }} |
| Let's Encrypt email | {{ ssl_info.get('le_email', 'N/A') }} |
The same certificate is reused for Postfix, Dovecot, and the HTTPS endpoints served by Nginx.
Upload manual certificate
Generate self-signed certificate
Request Let's Encrypt certificate
API Credentials
| Admin user | {{ api_info.get('api_admin_user', 'N/A') }} |
| API endpoint | {{ api_info.get('api_endpoint', 'N/A') }} |
| Hostname | {{ api_info.get('hostname', 'N/A') }} |
New API password:
Save this password now — it will not be shown again. Only the hash is stored.
{% endif %}
{{ generated_api_password }}
Save this password now — it will not be shown again. Only the hash is stored.
API Usage
Authenticate using HTTP Basic Auth with your API admin credentials.
Example requests
curl -u <user>:<pass> {{ api_info.get('api_endpoint', '') }}health
curl -u <user>:<pass> {{ api_info.get('api_endpoint', '') }}domains
curl -u <user>:<pass> {{ api_info.get('api_endpoint', '') }}accounts
Available endpoints
| Method | Path | Description |
|---|---|---|
| GET | /health | Health check (public) |
| GET | /health/details | Detailed health (admin) |
| GET/POST | /domains | List / create domains |
| GET/POST | /accounts | List / create accounts |
| GET/POST | /aliases | List / create aliases |
| GET/POST | /redirects | List / create redirects |
| GET/POST | /reputation | List / create reputation records |
| GET | /admin/queue | Mail queue management |
| GET | /admin/bans | IP ban management |
| GET/PATCH | /admin/limits | Service limits |
| GET/PATCH | /admin/backups | Backup configuration |
| GET | /admin/ssl | Shared TLS certificate status |
| POST | /admin/ssl/selfsigned | Generate a self-signed certificate |
| POST | /admin/ssl/letsencrypt | Request a Let's Encrypt certificate |
| POST | /admin/ssl/manual | Upload a manual PEM certificate and key |