{% if panel_favicon_url %} {% endif %}

{{ panel_title or 'Limristem eMail Admin Panel' }}

Hostname: {{ hostname }} — authenticated session for {{ panel_user }}

{% if notice %}
{{ 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 %} {% for item in recent_queue %} {% endfor %}
Queue IDSenderRecipients
{{ item.queue_id }} {{ item.sender }} {% for rcpt in item.recipients or [] %}
{{ rcpt.address }}
{% endfor %}
{% else %}

Queue is currently empty.

{% endif %}

Recent backups

{% if recent_backups %} {% for item in recent_backups %} {% endfor %}
NamePath
{{ item.name }} {{ item.path }}
{% else %}

No local backup runs found yet.

{% endif %}
{% elif page == 'domains' %}

Domains

Add domain
{% if domains %} {% for domain in domains %} {% endfor %}
DomainAccountsAliasesRedirectsStatusOpen
{{ domain.name }} {{ domain.account_count }} {{ domain.alias_count }} {{ domain.redirect_count }} {{ 'active' if domain.is_active else 'inactive' }} Manage
{% else %}

Create your first domain to manage accounts, aliases, redirects and DKIM.

{% endif %}
{% if show_create_form %}

Create domain

Close
{% endif %} {% elif page == 'domain-detail' %}

Back to domains

{{ selected_domain.name }}

Add domain
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' }}
{% if active_domain_tab == 'settings' %}

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

{% if selected_domain.dns_has_api_token %} {% endif %}

Last sync: {{ selected_domain.dns_last_sync_status or 'never' }}

{% elif active_domain_tab == 'accounts' %}

Accounts

Add account
{% if show_create_form %}
{% endif %} {% for account in domain_accounts %} {% endfor %}
EmailCurrent quotaUpdate quotaUpdate passwordStatusSuspend / restoreDelete
{{ account.email }} {{ account.quota_mb }} MB
{{ 'Active' if account.is_active else 'Suspended' }}
{% elif active_domain_tab == 'aliases' %}

Aliases

Add alias
{% if show_create_form %}
{% endif %} {% for alias in domain_aliases %} {% endfor %}
AliasDestinationActiveActions
{{ alias.source }} {{ alias.destination }} {{ 'yes' if alias.is_active else 'no' }}
{% elif active_domain_tab == 'redirects' %}

Redirects

Add redirect
{% if show_create_form %}
{% endif %} {% for redirect in domain_redirects %} {% endfor %}
RedirectTargetActiveActions
{{ redirect.source }} {{ redirect.target_email }} {{ 'yes' if redirect.is_active else 'no' }}
{% else %}

Suggested DNS records

{% for key, value in dns_records.items() %}

{{ key }}

{{ value }}
{% endfor %}
{% endif %}
{% elif page == 'queue' %}

Mail Queue

{% if queue %} {% for item in queue %} {% endfor %}
Queue IDQueueSenderRecipientsReasonActions
{{ 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 %}
{% else %}

Queue is empty.

{% endif %}
{% elif page == 'backups' %}

Backups

{% if active_backup_tab == 'schedules' %}

Backup schedules

{% if backup_schedules %} {% for item in backup_schedules %} {% endfor %}
NameScheduleStorageDBRedisCompressionStatusActions
{{ item.name }} {{ item.cron_expression }} {{ item.storage_id or 'Local only' }} {{ item.include_database }} {{ item.include_redis }} {{ item.compression }} {{ item.enabled }} Edit
{% else %} {% endif %}

{{ 'Edit schedule' if selected_backup_schedule.get('id') else 'Create schedule' }}

Cron-style schedule fields: minute hour day month weekday. Use * to match any value.

Limristem eMail uses the database credentials already stored in the main configuration file. A schedule only decides whether the MariaDB dump is included.

{% if selected_backup_schedule.get('id') %} {% endif %} {% elif active_backup_tab == 'storages' %}

Backup storages

{% if private_key_download_token %}
New encryption key ready.
{% endif %} {% if backup_storages %} {% for item in backup_storages %} {% endfor %}
NameTypeTargetEncryptionActions
{{ item.name }} {{ item.type }} {{ item.bucket or item.host or item.path or 'local' }} {{ item.encrypt }} Edit
{% else %} {% endif %}

{{ 'Edit storage' if selected_backup_storage.get('id') else 'Create storage' }}

When encryption is enabled, Limristem eMail keeps only the public key for future backup exports and prompts you to download the private key once.

{% if selected_backup_storage.get('id') %} {% endif %} {% elif active_backup_tab == 'runs' %}

Available local backup runs

{% if backup_runs %} {% for item in backup_runs %} {% endfor %}
NamePathMetadata
{{ item.name }} {{ item.path }} {{ item.metadata or 'n/a' }}
{% else %}

No local backups found.

{% endif %}
{% else %}

Global backup settings

{% for key in backup_field_order %} {% endfor %}
SettingValue
{{ backup_field_labels.get(key, key) }} {% if key in backup_numeric_fields %} {% elif backup_field_options.get(key) %} {% else %} {% endif %}
{% endif %}
{% elif page == 'security' %}

Banned IPs

{% for item in bans %} {% else %} {% endfor %}
CreatedIPReasonSourceServicesAction
{{ item.created_at or '—' }} {{ item.ip }} {{ item.reason }} {{ item.source or 'manual' }} {{ item.services or item.jail or '—' }}
No banned IPs found.

Firewall

{% for rule in firewall_rules %} {% endfor %}
Port / group / rangeProtocolSource IP / subnetStatus

Use one row per nftables rule. Ports may be a single port, a group of ports, or ranges. Leave source empty to allow any origin.

{% elif page == 'settings' %}

Settings

{% if active_settings_tab == 'general' %}

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' }}
{% elif active_settings_tab == 'ssl' %}

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

{% elif active_settings_tab == 'limits' %}

Service limits

{% for key, value in limits.items()|sort %} {% endfor %}
KeyValue
{{ key }}
{% else %}

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
{% endif %}
{% elif page == 'limits' %}

Service limits

{% for key, value in limits.items()|sort %} {% endfor %}
KeyValue
{{ key }}
{% elif page == 'ssl' %}

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

{% elif page == 'api' %}

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') }}
{% if generated_api_password %}
New API password: {{ generated_api_password }}
Save this password now — it will not be shown again. Only the hash is stored.
{% endif %}

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

MethodPathDescription
GET/healthHealth check (public)
GET/health/detailsDetailed health (admin)
GET/POST/domainsList / create domains
GET/POST/accountsList / create accounts
GET/POST/aliasesList / create aliases
GET/POST/redirectsList / create redirects
GET/POST/reputationList / create reputation records
GET/admin/queueMail queue management
GET/admin/bansIP ban management
GET/PATCH/admin/limitsService limits
GET/PATCH/admin/backupsBackup configuration
GET/admin/sslShared TLS certificate status
POST/admin/ssl/selfsignedGenerate a self-signed certificate
POST/admin/ssl/letsencryptRequest a Let's Encrypt certificate
POST/admin/ssl/manualUpload a manual PEM certificate and key
{% endif %}

Accessibility

Text size
Strumenti di Accessibilità