Overview
Mail traffic (14 days)
Privacy-safe: only counts and sizes by local mailbox — no subjects or bodies. Open statistics · Traffic list
{% if traffic_chart_svg %}No traffic chart yet. Stats are collected from Postfix logs every few minutes.
{% endif %} {% if mail_summary and mail_summary.today %}System Status
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 %}Mail traffic
Only local mailbox, direction, size and time — no subjects, bodies or remote addresses.
| When | Direction | Mailbox | Size |
|---|---|---|---|
| {{ item.event_at }} | {{ 'Received' if item.direction == 'inbound' else 'Sent' }} | {{ item.mailbox }} |
{{ item.size_human }} ({{ item.size_bytes }} B) |
| No traffic events yet. Wait for the collector timer or open Statistics and click “Collect now”. | |||
Statistics
{{ mail_summary.privacy_note if mail_summary else 'Privacy-safe traffic statistics.' }} Retention: {{ mail_summary.retention_days if mail_summary else '—' }} days.
{% if mail_summary %}Daily chart ({{ stats_days }} days)
{% if traffic_chart_svg %}{{ traffic_chart_svg|safe }}{% else %}No data
{% endif %}By day
| Day | In | Out | In bytes | Out bytes |
|---|---|---|---|---|
| {{ row.day }} | {{ row.inbound_count }} | {{ row.outbound_count }} | {{ row.inbound_bytes }} | {{ row.outbound_bytes }} |
| No daily data yet. | ||||
By mailbox ({{ stats_days }} days)
| Mailbox | In | Out | In bytes | Out bytes |
|---|---|---|---|---|
{{ row.mailbox }} |
{{ row.inbound_count }} | {{ row.outbound_count }} | {{ row.inbound_bytes }} | {{ row.outbound_bytes }} |
| No per-mailbox data yet. | ||||
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 }}
Domain settings
DKIM rotation
Active selector: {{ selected_domain.dkim_selector or 'none' }}
{% if selected_domain.dkim_rotated_at %} · last rotation {{ selected_domain.dkim_rotated_at }}{% endif %}
Previous selector kept for overlap: {{ selected_domain.dkim_previous_selector }}
{% if selected_domain.dkim_previous_expires_at %} until {{ selected_domain.dkim_previous_expires_at }}{% endif %}
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 (Cloudflare)
Last sync: {{ selected_domain.dns_last_sync_status or 'never' }}
Accounts
Add account| Storage quota | Send limits (0=global) | Effective send | Password | Status | Suspend / restore | Delete | |
|---|---|---|---|---|---|---|---|
| {{ account.email }} | {{ account.effective_send_rate_per_hour or 0 }}/h · {{ account.effective_send_rate_per_day or 0 }}/d · {{ account.effective_send_rate_per_month or 0 }}/mo | {{ '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 %}Mailbox import
Transfer every folder and message (including Sent) from a remote IMAP server into a local Limristem mailbox. Jobs run in a dedicated queue.
Source IMAP credentials
Choose the local destination account, then enter the remote mailbox credentials. Use Test connection before queuing a full import.
{% if not import_accounts %}Create at least one local account before importing mail.
{% else %} {% endif %}Bulk import from file
Download the example file, fill it with every mailbox you want to migrate (one entry per account, with the remote IMAP credentials), then upload it. A separate import job is queued for each account and jobs run one by one with live progress on the Jobs tab.
Up to 500 accounts per file (2 MiB max). If destination_email is omitted, source_username is used. Missing mailboxes on existing domains are created automatically with the source password.
Bulk import result
{{ bulk_import_result.queued_count }} job(s) queued out of {{ bulk_import_result.total }} entries {% if bulk_import_result.accounts_created %} · {{ bulk_import_result.accounts_created }} account(s) created{% endif %} {% if bulk_import_result.error_count %} · {{ bulk_import_result.error_count }} row(s) skipped{% endif %}
{% if bulk_import_result.queued %}| Row | Destination | Job | Account |
|---|---|---|---|
| {{ item.row }} | {{ item.destination_username }} | #{{ item.id }} | {% if item.account_created %}created{% else %}existing{% endif %} |
| Row | Destination | Problem |
|---|---|---|
| {{ item.row }} | {{ item.destination_email or '—' }} | {{ item.detail }} |
Import jobs
Live progress refreshes every 2 seconds while jobs are pending or running.
| ID | Status | Destination | Source | Progress | Transferred | Speed | ETA | Folder | Actions |
|---|---|---|---|---|---|---|---|---|---|
| {{ job.id }} | {{ job.status }} | {{ job.destination_username }} | {{ job.source_username }} |
|
{{ job.bytes_done_human }} | {{ job.speed_human }} | {{ job.eta_human or '—' }} | {{ job.current_folder or '—' }} {% if job.status_message %}{% endif %} {% if job.last_error %}{% endif %} | {% if job.status in ['pending', 'running'] %} {% endif %} {% if job.status not in ['running'] %} {% endif %} |
No import jobs yet. Start one from the New import tab.
{% endif %}Backups
{{ 'Edit schedule' if selected_backup_schedule.get('id') else 'Create schedule' }}
Backup schedules
Create new schedule| 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 |
{{ 'Edit storage' if selected_backup_storage.get('id') else 'Create storage' }}
Backup storages
Create new storage| 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
Admin MFA (panel + API)
TOTP and/or SMS OTP protect the web panel and the management API.
SMTP/IMAP/POP cannot do interactive OTP mid-session — for mailboxes use
app passwords (API /accounts/{id}/app-passwords) and optionally
require_app_password.
TOTP (authenticator app)
Status: {% if mfa_status and mfa_status.totp_enabled %}enabled {% elif mfa_status and mfa_status.totp_pending %}pending confirmation {% else %}disabled{% endif %}
{% if totp_enroll %}Secret (store offline / scan with authenticator):
{{ totp_enroll.secret }}
URI: {{ totp_enroll.provisioning_uri }}
{% else %} {% if mfa_status and (mfa_status.totp_enabled or mfa_status.totp_pending) %} {% endif %} {% endif %}SMS OTP
Status: {% if mfa_status and mfa_status.sms_enabled %}enabled ({{ mfa_status.sms_phone_masked }}) {% else %}disabled{% endif %}
SMS providers
Headers: X-Client-Id, X-Client-Secret, X-Api-Key (Crilide API style).
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
Operations
Deliverability, outbound IP reputation self-checks, connectivity probes, inbound DNSBL helpers.
Deliverability check
End-to-end connectivity
TCP + TLS probes to SMTP/IMAP/HTTPS (no mailbox password required).
Inbound DNSBL (Rspamd)
{{ rbl_config.warning }}
Last result
{{ operations_result }}
Recent IP reputation checks
| When | IP | Source | Listed | Detail |
|---|---|---|---|---|
| {{ row.checked_at }} | {{ row.entity_value }} |
{{ row.source }} | {{ 'yes' if row.listed else 'no' }} | {{ row.detail or '' }} |
Topology wizard
How this instance is deployed: Standalone, Routed Mesh, or Storage Cluster.
{{ topology.local_server_id }}Choose deployment mode
{% if internode_token_once %}{{ internode_token_once }}
Registered servers
| ID | Name | Hostname | SMTP | Role | Local | Active |
|---|---|---|---|---|---|---|
{{ s.server_id }} |
{{ s.display_name }} | {{ s.hostname }} | {{ s.smtp_host }}:{{ s.smtp_port }} | {{ s.role }} | {{ 'yes' if s.is_local else 'no' }} | {{ 'yes' if s.is_active else 'no' }} |
| No peers registered (standalone or not yet joined). | ||||||
Logs
{{ log_content }}
Settings
General settings
{% if settings_info.get('panel_favicon_path') %} {% endif %}Version and updates
| Hostname | {{ settings_info.get('hostname', hostname) }} |
| Update channel | {{ settings_info.get('update_channel', 'stable') }} |
| Check endpoint | {{ settings_info.get('update_check_url') or (settings_info.get('update_status') or {}).get('endpoint', '—') }} |
| Current version | {{ settings_info.get('current_version', 'unknown') }} |
| Latest version | {{ (settings_info.get('update_status') or {}).get('latest_version', 'not checked yet') }} |
| Update available | {{ 'yes' if (settings_info.get('update_status') or {}).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') }} |
| Subject | {{ ssl_info['cert_info'].get('subject', 'N/A') }} |
| Issuer | {{ ssl_info['cert_info'].get('issuer', 'N/A') }} |
| Valid From | {{ ssl_info['cert_info'].get('not_valid_before', 'N/A') }} |
| Valid To | {{ ssl_info['cert_info'].get('not_valid_after', 'N/A') }} |
The same certificate is reused for Postfix, Dovecot, and the HTTPS endpoints served by Nginx.
{% else %}Notice: Postfix and/or Dovecot are using different certificates!
| Postfix Cert Path | {{ ssl_info.get('postfix_cert_path', 'N/A') }} |
| Postfix Cert Subject | {{ ssl_info['postfix_cert_info'].get('subject', 'N/A') }} |
| Dovecot Cert Path | {{ ssl_info.get('dovecot_cert_path', 'N/A') }} |
| Dovecot Cert Subject | {{ ssl_info['dovecot_cert_info'].get('subject', '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 & anti-spam
Auth lockouts, max message size, SMTP rates, and per-user authenticated send quotas (Rspamd).
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') }} |
{{ 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 |