Skip to content

Panel settings ​

Almost everything is configured from the interface, with no file editing and no restart: the Settings page. Changes apply immediately.

A value is resolved through the chain database → .env → built-in default. Until a setting is touched in the interface, whatever is in .env or in the code applies; after the first change it lives in the database and .env no longer affects it.

The list marks each setting: DB — overridden and stored in the database, .env — taken from the environment, Default — from the code. A few values are read-only: they are managed from their own pages and listed here for completeness.

This page is generated from the code

Names, descriptions and defaults come straight from the panel settings catalogue, so they cannot drift from what you see in the interface. Regenerate with python scripts/gen_settings_docs.py.

⚙️ General ​

The basics: language, logs, access to the Remnawave panel, third-party service keys. Some values here are secrets managed on their own pages and shown in the list for reference only.

SettingKeyDefaultWhat it does
🌐 Bot languagebot_languageruBot interface language (DEFAULT_LOCALE)
📝 Log levellog_levelINFOLog detail level (requires restart) (LOG_LEVEL)
📦 Max log file size (MB)log_max_size_mb10Maximum size of a single log file before rotation
🗂️ Log backup countlog_backup_count5Number of compressed backup files kept after rotation
🌍 MaxMind GeoIP sourcemaxmind_sourceautoauto — GitHub mirrors (P3TERX, GitSquared), then MaxMind; github — mirrors only (no key); maxmind — official only (key required). Own mirror — MAXMIND_MIRROR_URL variable (MAXMIND_SOURCE)
🏷️ Panel namepanel_nameemptyProject name displayed in the sidebar (next to the logo)
🕒 Time zonedisplay_timezoneEurope/MoscowIANA zone. All times are shown in it: web panel, bot, notifications, exports, report and backup times. The database and the API keep time in UTC
🔗 Public panel URLweb_panel_public_urlemptyhttps address of the web panel. Used by the bot's "Open panel" button (Telegram Mini App). Empty — falls back to APP_PUBLIC_URL (APP_PUBLIC_URL)
Access token lifetime (minutes)web_session_access_minutes30Lifetime of the web panel access token. Applies to new logins and refreshes. Recommended: 30-120 min (WEB_JWT_EXPIRE_MINUTES)
Session lifetime (hours)web_session_refresh_hours6Total session lifetime (refresh token). While it is valid the user stays signed in; after that a new login with 2FA is required. Recommended: 12-24h (WEB_JWT_REFRESH_HOURS)
DNS: Cloudflare (encrypted)dns_creds_cloudflareemptyManaged on the DNS page, not here (read-only)
DNS: Timeweb Cloud (encrypted)dns_creds_timewebemptyManaged on the DNS page, not here (read-only)
DNS: reg.ru (encrypted)dns_creds_regruemptyManaged on the DNS page, not here (read-only)
DNS: Selectel (encrypted)dns_creds_selectelemptyManaged on the DNS page, not here (read-only)
DNS: Aeza (encrypted)dns_creds_aezaemptyManaged on the DNS page, not here (read-only)
BS-Check: bschekbot token (encrypted)bscheck_tokenemptyThe bsk_live_ token (bsbord) used to test nodes through mobile carriers. Edited on the nodes page (read-only)
Reputation: ipinfo.io token (encrypted)reputation_ipinfo_tokenemptyManaged on the BS-Check page (read-only)
Reputation: IPQualityScore token (encrypted)reputation_ipqs_tokenemptyManaged on the BS-Check page (read-only)
Reputation: AbuseIPDB token (encrypted)reputation_abuseipdb_tokenemptyManaged on the BS-Check page (read-only)
OAuth: Google client_idoauth_google_client_idemptyManaged in the OAuth settings (read-only)
OAuth: Google secret (encrypted)oauth_google_client_secretemptyManaged in the OAuth settings (read-only)
OAuth: GitHub client_idoauth_github_client_idemptyManaged in the OAuth settings (read-only)
OAuth: GitHub secret (encrypted)oauth_github_client_secretemptyManaged in the OAuth settings (read-only)
OAuth: OIDC client_idoauth_oidc_client_idemptyManaged in the OAuth settings (read-only)
OAuth: OIDC secret (encrypted)oauth_oidc_client_secretemptyManaged in the OAuth settings (read-only)
OAuth: OIDC issuer URLoauth_oidc_issueremptyManaged in the OAuth settings (read-only)
OAuth: OIDC button labeloauth_oidc_nameemptyManaged in the OAuth settings (read-only)

🔔 Notifications ​

Where and what to write in Telegram. Topics spread events across forum threads, notification types switch individual events on and off.

Main ​

SettingKeyDefaultWhat it does
💬 Notifications chat IDnotifications_chat_idemptyTelegram chat/group ID for notifications (NOTIFICATIONS_CHAT_ID)
✨ Rich notification stylingnotifications_rich_enabledtrueSend Telegram notifications as rich cards (Bot API 10.1+): tables, collapsible sections, quotes, buttons right in the card, fields copied with a tap. Falls back to plain HTML automatically if Telegram rejects it

🔔 Telegram notification types ​

SettingKeyDefaultWhat it does
👤 Usersnotifications_users_enabledtrueSend Telegram notifications about users
🖥️ Nodesnotifications_nodes_enabledtrueSend Telegram notifications about nodes
🔧 Servicenotifications_service_enabledtrueSend service Telegram notifications
🔑 HWIDnotifications_hwid_enabledtrueSend Telegram notifications about HWID devices
💼 CRMnotifications_crm_enabledtrueSend Telegram notifications about CRM and infrastructure billing
❗ Errorsnotifications_errors_enabledtrueSend Telegram notifications about errors
🛡️ Violationsnotifications_violations_enabledtrueSend Telegram notifications about violations
💰 Financenotifications_finance_enabledtrueSend financial Telegram notifications and reminders

💬 Notification topics ​

SettingKeyDefaultWhat it does
💬 Topic: Default (fallback)notifications_topic_idemptyDefault topic ID, used when a specific topic is not set (NOTIFICATIONS_TOPIC_ID)
👤 Topic: Usersnotifications_topic_usersemptyTopic ID for user notifications (NOTIFICATIONS_TOPIC_USERS)
🖥️ Topic: Nodesnotifications_topic_nodesemptyTopic ID for node notifications (NOTIFICATIONS_TOPIC_NODES)
🔧 Topic: Servicenotifications_topic_serviceemptyTopic ID for service notifications (NOTIFICATIONS_TOPIC_SERVICE)
🔑 Topic: HWIDnotifications_topic_hwidemptyTopic ID for HWID notifications (NOTIFICATIONS_TOPIC_HWID)
💼 Topic: CRMnotifications_topic_crmemptyTopic ID for CRM and infrastructure billing (NOTIFICATIONS_TOPIC_CRM)
🛡️ Topic: Violationsnotifications_topic_violationsemptyTopic ID for violation notifications (NOTIFICATIONS_TOPIC_VIOLATIONS)
❗ Topic: Errorsnotifications_topic_errorsemptyTopic ID for error notifications (NOTIFICATIONS_TOPIC_ERRORS)
💰 Topic: Financenotifications_topic_financeemptyTopic ID for financial notifications and reminders (NOTIFICATIONS_TOPIC_FINANCE)
💾 Topic: Backupsnotifications_topic_backupsemptyTopic ID for backup files; empty — they go to the service topic (NOTIFICATIONS_TOPIC_BACKUPS)

🛡️ Violation Detection ​

The largest section: analyzers, thresholds, automatic actions and retention. What the analyzers mean and how to review incidents is in Anti-abuse.

Main ​

SettingKeyDefaultWhat it does
🛡️ Violation detectionviolations_enabledtrueGlobal on/off switch for the violation detector
📐 Min notification scoreviolations_min_score50.0Minimum violation score to trigger a notification (default 50)
⏱️ Temporal analyzerviolations_analyzer_temporaltrueAnalyses simultaneous connections and rapid-switch patterns
🌍 Geo analyzerviolations_analyzer_geotrueDetects impossible travel and suspicious geolocation
🏢 ASN analyzerviolations_analyzer_asntrueProvider classification (VPN, datacenter, mobile carrier)
👤 Profile analyzerviolations_analyzer_profiletrueDetects deviations from the user's usual behaviour
📱 Device analyzerviolations_analyzer_devicetrueDetects unique device fingerprints (OS, client)
🔑 HWID cross-account analyzerviolations_analyzer_hwidtrueDetects the same HWID used across multiple accounts (trial abuse)
🔤 User-Agent analyzerviolations_analyzer_user_agenttrueDetects double tunnels (vless:// in UA), bots (curl, Go-http-client), and unknown clients

📐 Detection thresholds ​

SettingKeyDefaultWhat it does
🌐 Shared simultaneous IP limitviolations_max_simultaneous_ips0One simultaneous-source limit for all users instead of their device limit; network-switch and CGNAT buffers are added on top. 0 = each user's own device limit from the panel
📏 Max inter-city distance (km)violations_geo_max_city_distance_km50Distance between cities below which movement is not considered suspicious
👥 Max accounts per HWIDviolations_hwid_max_accounts2How many distinct accounts may share one HWID WITHOUT triggering — a violation starts at the next account (value 2 → fires on the third). Subscriptions of the same person count as one account: grouped by telegram_id, or by email when the user signed up without Telegram
Max subscriptions per account on one HWIDviolations_hwid_max_per_account10How many panel UUIDs (subscriptions) of a single telegram_id are allowed on one HWID. Guards against multi-plan abuse. 0 = unlimited
📱 Mobile CGNAT buffer (IPs)violations_mobile_cgnat_buffer3Extra simultaneous IPs allowed for mobile connections beyond the device limit (CGNAT gives 3-5 IPs from one device)
🎁 Max active trials per HWIDviolations_hwid_max_active_trials1How many distinct accounts with a LIVE trial subscription may share one device without triggering. Catches trial farming via fresh accounts while ignoring both the normal «trial expired → paid plan purchased» upgrade and two paying people sharing a device. Trial status is determined by the tag and internal squad settings below. 0 = disabled
♻️ Max trial subscriptions per account per HWIDviolations_hwid_max_trial_subs1How many times one person may take a trial from the same device — counting expired and disabled ones. Closes the workaround where a second trial is taken on a fresh subscription with the same telegram_id linked to it: to every other check that is one account with one live trial. Ignores both the «trial → paid» upgrade and two different people sharing a tablet. 0 = disabled
Check cooldown (min)violation_check_cooldown_minutes15Minimum interval between repeated detector checks of the same user (load throttling). Not the same as the notification cooldown
Violation retention (days)violation_retention_days90How many days violation records are kept before automatic cleanup
Connection retention (days)connections_retention_days30How many days the user connection history is kept before automatic cleanup
HWID scan interval (min)violations_hwid_scan_interval_minutes30How often offline users sharing a HWID are checked for cross-account abuse (the batch detector only sees users who are online)
Хранение метрик нод (дни)metrics_retention_days30Сколько дней хранить снимки метрик нод до автоочистки. Раньше срок был зашит в коде, а сама очистка шла только при отчёте от ноды: на простое таблица росла без ограничения
Torrent event retention (days)torrent_retention_days90How many days recorded torrent events are kept before automatic cleanup
📅 Max SRH record age (days)violation_ua_max_age_days0Ignore subscription requests older than N days. 0 = analyse all records
Torrent detection via nDPIndpi_detection_enabledfalseXray only recognises BitTorrent by the plaintext handshake, so encrypted streams, DHT and uTP slip past. nDPI sees those too. Requires the nDPId daemon on the node: the setting is pushed to agents as a command, no .env editing needed
🔗 Min score for link in UAviolation_ua_link_floor70Minimum violation score when a subscription link (vless://) is detected in User-Agent. 70 = warn, 80 = soft_block
🤖 Min score for bot UAviolation_ua_bot_floor55Minimum violation score for curl/Go-http-client/python-requests User-Agents
🗑️ SRH retention (days)srh_retention_days90Delete synced Subscription Request History records older than N days. 0 = keep forever

🔤 User-Agent patterns ​

SettingKeyDefaultWhat it does
✅ Extra whitelist UA (regex)violation_ua_whitelist_extra[]JSON array of regex patterns for new VPN clients. Example: ["^NewClash/", "^MyClient/"]
🚫 Extra blacklist UA (regex)violation_ua_blacklist_extra[]JSON array of regex patterns for suspicious UAs. Example: ["^SuspiciousBot/"]

🚫 Hard block ​

SettingKeyDefaultWhat it does
🚫 Hard block: max IPsviolations_hard_block_ips50Number of unique IPs to trigger an automatic hard block
🚫 Hard block: max simultaneousviolations_hard_block_simultaneous20Number of simultaneous connections to trigger a hard block
🚫 Hard block: max devicesviolations_hard_block_devices80Number of unique device fingerprints to trigger a hard block
🚫 Hard block: max HWID matchesviolations_hard_block_hwid_matches10Number of matching HWIDs (same model) to trigger a hard block
🚫 Hard block: accounts on one HWIDviolations_hard_block_hwid_accounts5How many distinct accounts on a single device (HWID) counts as mass trial abuse and triggers a hard block. Subscriptions of the same telegram_id count as one account. 0 = disabled
🚫 Hard block: sources above the device limitviolations_hard_block_simultaneous_excess0Hard block when simultaneous sources exceed the user's device limit by more than this number: with 5 and a limit of 1 — from 7 sources, with a limit of 3 — from 9. The sources must also exceed the threshold with network-switch and CGNAT buffers. Does not apply to unlimited users (limit 0). 0 = disabled

🆓 Trial user detection ​

SettingKeyDefaultWhat it does
🏷️ Trial user tagsviolations_trial_tagstrialComma-separated tags that mark a user as trial (e.g. trial,test,free)
👥 Trial internal squadsviolations_trial_squad_uuids[]Select internal squads whose users are considered trial

🧲 Torrent blocker ​

SettingKeyDefaultWhat it does
🧲 Torrent detectiontorrent_detection_enabledtrueEnable/disable torrent traffic detection via Xray routing
⚡ Auto-action on torrenttorrent_auto_actionnotifyAction on torrent traffic: notify (alert only), block_user (block)
🔕 Torrent notification cooldown (min)torrent_notification_cooldown_minutes30Minimum interval between torrent notifications for the same user
Event threshold for a violationtorrent_min_events5How many torrent events must pile up for one user within half an hour before a violation is raised. Real exchange produces hundreds of events in minutes — single hits are nDPI noise. 1 raises a violation on the very first event
Distinct peers threshold (swarm)torrent_min_peers3How many DIFFERENT addresses the exchange must span within half an hour. Torrent means a swarm of dozens of peers; events against one and the same address are what a long ordinary connection produces — antivirus traffic and game launchers were caught exactly this way. 1 disables the swarm check
Events per address (exchange depth)torrent_min_events_per_peer1.5How many events per address, on average, the exchange must show within half an hour. A torrent client keeps trading with the same peers for a long time, so it has several events per address; a game launcher or a DHT lookup touches each address once. 1 disables the check
Not torrent, by address ownertorrent_asn_whitelistkaspersky,gaijin,blizzard,valve,wargaming,microsoft,epic games,riot games,steamComma-separated fragments of organisation names whose addresses are never treated as a violation. Game launchers ship updates over real BitTorrent (War Thunder among them), so the verdict on them is correct — only the counterpart differs. Leave empty to use the built-in list

general ​

SettingKeyDefaultWhat it does
Violation history window (days)violation_recap_days30The period used to count a user's violations for the repeat-offender badge and the history block. Annulled ones are shown separately — you see both how often the person was flagged and how much of that turned out to be a detector error

📈 Traffic usage ​

SettingKeyDefaultWhat it does
📈 Traffic usage monitortraffic_rate_enabledfalseTracks abnormally high traffic consumption over a period
📊 Threshold (GB per window)traffic_rate_threshold_gb10.0Notify when a user consumes more than this amount in the window
⏱️ Check window (min)traffic_rate_window_minutes60Time window for traffic accounting (default 60 = 1 hour)
🔁 Check interval (min)traffic_rate_check_interval_minutes5How often to check traffic consumption
🔕 Notification cooldown (min)traffic_rate_cooldown_minutes60Minimum interval between repeated notifications for the same user
⚡ Auto-action on breachtraffic_rate_auto_actionnotifyAction on excessive traffic: notify only or auto-block
🚫 Auto-block threshold (GB)traffic_rate_auto_block_gb50.0Auto-block when traffic in the window exceeds this value. Only takes effect when auto-action = block_user

throttle ​

SettingKeyDefaultWhat it does
Speed throttlingthrottle_enabledtrueAllow the soft block — cut a violator's speed instead of cutting them off entirely. Requires agent 1.7.0+ on the nodes; with agent 1.9.0 the node shaper does it, in both directions
Default speed (kbit/s)throttle_default_kbit1024How hard to throttle when no speed is given. 0 or empty means no limit: the bot button and automatic actions throttle nothing. At 1024 sites and messengers still work while video and torrents do not: the person notices the internet is odd and comes to sort it out instead of silently losing access
Default throttle duration (h)throttle_default_hours0How many hours before the throttle lifts itself when no expiry is given. 0 keeps it until lifted by hand
Reserve squad for violatorsthrottle_squad_uuidemptyUUID of the internal squad to move a punished user into on top of the throttle. Previous squads are remembered and restored when the throttle is lifted. Empty — leave squads alone and only cut the speed
Throttle speed automaticallyviolation_auto_soft_throttlefalseCut the speed as soon as the detector recommends a manual review (score 65-80). The measure is reversible and keeps the person online, but it is off by default: the call on punishment stays with the administrator

🔍 Violation detection pipeline ​

SettingKeyDefaultWhat it does
🔕 Notification cooldown (min)violation_notification_cooldown_minutes30Minimum interval between repeated notifications for the same user. Spam protection.
Record deduplication window (hours)violation_dedup_window_hours24While a user has an unresolved violation newer than this window, repeated detections do not create a new record unless the score is higher. 0 disables deduplication
Auto-block on hard_blockviolation_auto_hard_blocktrueDisable the user through the Panel API when the detector recommends a hard block. When off, only a notification and a record are produced

🔒 Security ​

Protection of the panel itself plus node attack detection: login methods, brute-force limits, user blacklist.

🔑 Auth methods ​

SettingKeyDefaultWhat it does
✈️ Telegram Authenticationauth_telegram_enabledtrueAllow login via Telegram Login Widget
🔒 Password Authenticationauth_password_enabledtrueAllow login with username and password
🔐 Mandatory 2FA (TOTP)auth_totp_requiredfalseRequire TOTP setup for all accounts
🔑 Passkey domain (RP ID)webauthn_rp_idemptyDomain passkeys are bound to, e.g. panel.example.com. Empty — the domain the panel is opened on. After a change, passkeys added under the previous domain stop working
🔑 Passkey originwebauthn_originemptyPanel address with the scheme, e.g. https://panel.example.com. Empty — built from the request headers (Host and X-Forwarded-Proto). Set it if the proxy in front of the panel does not pass X-Forwarded-Proto
✈️ Telegram Mini App auto-loginauth_telegram_webapp_enabledtrueSign in automatically when the panel is opened inside Telegram (Mini App). Requires Telegram authentication to be enabled

🛡️ Brute-force protection ​

SettingKeyDefaultWhat it does
🚫 Max attempts before lockoutauth_max_attempts5Number of failed login attempts before IP is blocked
⏳ Lockout duration (min)auth_lockout_minutes15How long an IP is blocked after exceeding the attempt limit
📋 Fail2ban loggingauth_fail2ban_loggingtrueLog failed login attempts to auth_failures.log
🔔 Notify on IP blockauth_notify_on_blocktrueSend Telegram notification when an IP is blocked
⚠️ Notify on failed loginauth_notify_on_failuretrueSend Telegram notification on every failed login attempt

🚫 User blacklist ​

SettingKeyDefaultWhat it does
🚫 User blacklistuser_blacklist_enabledfalseEnable Telegram ID blacklist lookup. Matching users are auto-blocked.
🔗 Blacklist URLs (one per line)user_blacklist_urlsemptyExternal blacklist file URLs. Format: Telegram ID at the start of each line.
🔄 Sync interval (hours)user_blacklist_sync_hours6How often to refresh blacklists from external URLs.
⚡ Auto-blockuser_blacklist_auto_blockfalseAutomatically block blacklisted users via Panel API. When disabled — notification only.
🛡️ HWID blacklist guardhwid_blacklist_guard_enabledtruePeriodically check whether a subscription came back to life for anyone seen on a blacklisted device, and disable it again. Blacklist blocking happens once, while a subscription can be revived afterwards — linking a telegram_id to an email-created one already did it. Entries set to «alert» are only reported, never disabled
🛡️ HWID guard interval (min)hwid_blacklist_guard_interval_minutes5How often the guard walks the HWID blacklist. A shorter interval means a shorter window for a revived subscription to stay usable
🌐 IP guard: repeated trialsviolations_ip_trial_guard_enabledtrueSpot addresses used for several trial subscriptions by different accounts. HWID is announced by the client itself and forged with a header, while an address comes from the provider and is harder to change. Service and carrier ranges are excluded
🌐 Trial subscriptions per addressviolations_ip_trial_accounts2How many distinct trial subscriptions may share one address without an alert. Only trials count: a home provider address covers a whole flat
📱 Same for mobile addressesviolations_ip_trial_accounts_mobile4A separate threshold for mobile carrier addresses. CGNAT puts a whole district behind one address, so several people with trials there is ordinary
🌐 Address lookup window (days)violations_ip_trial_window_days30How far back connections are counted. Too wide a window picks up dynamic addresses that changed hands between subscribers
🌐 Silence per address (hours)violations_ip_trial_repeat_hours24How long to stay quiet about an address after reporting it
🌐 Address guard interval (min)violations_ip_trial_interval_minutes60How often addresses are re-checked. Heavier than the HWID guard: it groups connection history over the whole window

node_attacks ​

SettingKeyDefaultWhat it does
Node attack detectionattack_detect_enabledtrueWatch node network metrics and warn when a node is under attack. Requires agent 1.3.0 or newer
Packet threshold (x normal)attack_pps_ratio4How many times the inbound packet rate must exceed the usual level for this node. Below 3 you will get false alarms on evening peaks
Traffic threshold (x normal)attack_bps_ratio4The same for inbound traffic volume — catches attacks made of large packets
Minimum packets/s to alertattack_min_pps5000Below this a spike is ignored: on an idle night-time node a tenfold rise is just noise
Minimum bytes/s to alertattack_min_bps12500000The same for volume. The default 12,500,000 is 100 Mbit/s
Samples for the baselineattack_min_samples20How many samples to collect before trusting the usual level of a node. Until then the detector stays quiet
Small packet, bytesattack_small_packet_bytes300An average packet size below this is treated as a sign of flooding: useful traffic is made of bigger packets

📧 Mail Server ​

The built-in mail server: TLS, inbound mail, spam scoring, retention. Setup is described in Mail server.

SettingKeyDefaultWhat it does
📧 Mail server enabledmailserver_enabledfalseEnable the built-in mail server (inbound/outbound) (MAIL_SERVER_ENABLED)
🖥️ SMTP hostnamemailserver_hostname0.0.0.0IP address for the inbound SMTP server (0.0.0.0 = all interfaces) (MAIL_SERVER_HOSTNAME)
📥 Inbound SMTP portmailserver_inbound_port2525Port for inbound mail (default 2525, 25 in production) (MAIL_INBOUND_PORT)
🚦 Send limit per hourmailserver_max_send_per_hour100Global per-domain hourly send limit. Applies to domains without their own limit (domain value 0). 0 = unlimited
⏱️ Queue poll intervalmailserver_queue_poll_interval10How often to poll the outbound queue (seconds)
🔁 Max delivery retriesmailserver_max_retries5Maximum number of delivery attempts per message
📤 SMTP Submission enabledmailserver_submission_enabledfalseEnable SMTP Submission (port 587) for sending mail via login/password (MAIL_SUBMISSION_ENABLED)
🔌 SMTP Submission portmailserver_submission_port587Port for the SMTP Submission server (standard — 587) (MAIL_SUBMISSION_PORT)
TLS certificate pathmailserver_tls_cert_pathemptyCertificate for STARTTLS on the mail ports. Empty means a self-signed one is issued: enough for receiving mail, but mail clients on port 587 will complain (MAIL_TLS_CERT_PATH)
TLS key pathmailserver_tls_key_pathemptyPrivate key for the certificate above (MAIL_TLS_KEY_PATH)
Mail server hostnamemailserver_tls_hostnameemptyHow the server introduces itself over SMTP and what the certificate is issued for. Should match the PTR record of the IP. Empty means mail.<first domain>
Require TLS on port 587mailserver_submission_require_tlstrueRefuse logins over an unencrypted connection. Clients from private networks (10.x, 192.168.x, 100.64.x such as Netbird) are exempt: that traffic is already inside a tunnel. Only effective once a certificate exists
Spam thresholdmailserver_spam_threshold5Score at which a message is marked suspicious. 5 points means the domain published a DMARC policy and the message failed it
Reject suspicious messagesmailserver_reject_spamfalseRefuse messages that reach the threshold at reception. When off, the message is accepted but flagged in the list
Keep inbound mail, daysmailserver_inbox_retention_days0After how many days received messages are deleted. 0 = keep forever
Keep sending history, daysmailserver_queue_retention_days90After how many days sent and rejected messages leave the queue. Messages still waiting to be sent are untouched. 0 = keep forever
Notify about new mailmailserver_notify_new_mailfalseSend a notification when a message arrives, excluding service mail: bounces, unsubscribes and DMARC reports
📮 Outbound deliverymailserver_delivery_modedirectdirect — straight to the recipient MX (needs outbound port 25); brevo — via the Brevo HTTP API, no outbound SMTP ports needed (MAIL_DELIVERY_MODE)
🔑 Brevo: API keymailserver_brevo_api_keyemptyv3 key from Brevo → SMTP & API → API Keys. The sender domain must be authenticated in Brevo (BREVO_API_KEY)

💾 Backups ​

Schedule, retention and the dead-man switch that warns when backups have stopped happening. See Backups.

SettingKeyDefaultWhat it does
Scheduled backupbackup_auto_enabledfalseCreate a database backup automatically on a schedule
Backup timebackup_auto_time03:00Time of the daily backup (HH:MM, panel time zone)
Send to Telegrambackup_auto_telegramfalseSend the created backup to Telegram (chat_id from the notification settings)
Keep backups (count)backup_auto_keep_count10How many recent automatic backups to keep
Keep backups (days)backup_auto_keep_days30Maximum age of automatic backups in days
Backup interval (hours)backup_auto_interval_hours00 — once a day at the configured time; N>0 — every N hours starting from that time
Back up the configbackup_auto_configfalseStore panel settings alongside the database backup
Alert if no backup for N hoursbackup_deadman_hours0Send an alert when there has been no successful backup for longer than N hours (0 = off)
S3: endpointbackup_s3_endpoint—For example https://s3.timeweb.cloud or https://s3.storage.selcloud.ru
S3: bucketbackup_s3_bucket—Bucket that receives the backup files
S3: regionbackup_s3_regionus-east-1Region used to sign requests: us-east-1, ru-1, ru-central1, etc.
S3: folderbackup_s3_prefix—Key prefix inside the bucket; empty means the bucket root
S3: path-style addressingbackup_s3_path_styletrueUses endpoint/bucket/key — required by MinIO and most regional providers
S3: upload automaticallybackup_s3_auto_uploadfalseSend every scheduled backup to the storage
S3: files to keepbackup_s3_keep_count0How many recent files to keep in the bucket after an automatic upload (0 = keep everything)
S3: access keysbackup_s3_creds—Access Key and Secret Key, encrypted; editable only on the Storage tab
Support: media cachesupport_media_cache_enabledtrueKeep downloaded attachments on disk instead of fetching them from the bot every time
Support: media retentionsupport_media_cache_days14Days without access before a file is dropped; an old ticket downloads it again
Support: media cache limit (MB)support_media_cache_max_mb2048Above this the least recently used files are removed (0 — no limit)
Support: response deadlinesupport_sla_enabledtrueOverdue queue, wait-time highlighting and breach alerts
Support: first reply targetsupport_sla_minutes30Minutes of waiting after which a ticket counts as overdue
Support: alertssupport_alerts_enabledtrueNotify about new tickets and missed first replies
Support: new ticket alertsupport_alert_new_tickettrueNotify as soon as a customer opens a ticket

📊 Reports ​

Periodic summaries: what to send, when and to whom.

SettingKeyDefaultWhat it does
📊 Reports enabledreports_enabledtrueGlobal toggle for automatic reports
📅 Daily reportsreports_daily_enabledtrueEnable daily violation reports
🕐 Daily report timereports_daily_time09:00Daily report send time (HH:MM, panel time zone)
📆 Weekly reportsreports_weekly_enabledtrueEnable weekly violation reports
📅 Weekly report dayreports_weekly_day0Day of week for weekly report (0=Mon, 6=Sun)
🕐 Weekly report timereports_weekly_time10:00Weekly report send time (HH:MM, panel time zone)
🗓️ Monthly reportsreports_monthly_enabledtrueEnable monthly violation reports
📅 Monthly report dayreports_monthly_day1Day of month for monthly report (1-28)
🕐 Monthly report timereports_monthly_time10:00Monthly report send time (HH:MM, panel time zone)
📐 Minimum scorereports_min_score30.0Minimum violation score to include in report
🏆 Top violatorsreports_top_violators_count10Number of users in top violators list
📭 Send empty reportsreports_send_emptyfalseSend report when there are no violations for the period
💬 Reports topicreports_topic_idemptyTopic ID for sending reports (0 = main chat) (NOTIFICATIONS_TOPIC_REPORTS)

💰 Finance ​

Infrastructure spending and income: reporting currency, exchange rates, payment reminders, sync with provider APIs.

SettingKeyDefaultWhat it does
Reporting currencyfinance_base_currencyRUBCurrency that aggregates are converted into (RUB, USD, EUR...)
Auto-update exchange ratesfinance_rates_auto_updatetrueRefresh rates once a day (CBR, falling back to open.er-api.com). Manually edited rates are left alone
Payment remindersfinance_reminders_enabledtrueSend notifications about upcoming and overdue payments to Telegram and the panel
Remind this many days aheadfinance_reminder_days7,3,1Comma-separated list of days before the charge (for example 7,3,1). Overdue payments are always reminded about
Reminder hourfinance_reminder_hour10Hour of the day (0–23) from which the daily reminders are sent. Both the hour and the day itself follow the panel time zone, not UTC
Auto-sync hosting provider APIsfinance_autosync_enabledtruePeriodically pull balance and services from connected hosting provider APIs
Auto-sync interval (hours)finance_autosync_interval_hours6How often to poll provider APIs for balance, services and charge dates
Pull charge datesfinance_autosync_update_due_datestrueUpdate next_due_at from provider data, matching services by name within a provider
Record Bedolaga top-upsfinance_bedolaga_deposits_enabledtrueAdd balance top-ups from Bedolaga to income daily (P&L chart, monthly revenue). Do not combine with manual subscription revenue import — it would be counted twice

⚡ Performance ​

Connection pools, cache and background task intervals. Worth touching when you hit a ceiling, not before.

🗄️ Database ​

SettingKeyDefaultWhat it does
🗄️ DB Pool: min connectionsdb_pool_min_size5Minimum number of connections in the PostgreSQL pool. Requires restart. (DB_POOL_MIN_SIZE)
🗄️ DB Pool: max connectionsdb_pool_max_size50Maximum number of connections in the PostgreSQL pool. Increase under heavy load. Requires restart. (DB_POOL_MAX_SIZE)
⏱️ DB: statement timeout (sec)db_statement_timeout60Maximum SQL statement execution time in seconds. 0 = unlimited. Requires restart.
💤 DB: idle connection lifetime (sec)db_idle_connection_lifetime300How long idle connections stay in the pool before being closed. Requires restart.

⏱️ Intervals ​

SettingKeyDefaultWhat it does
🔔 Alert check interval (sec)alert_check_interval60How often to evaluate alert rules. Lower = faster reaction, higher DB load.
🔄 Config auto-reload (sec)config_auto_reload_interval30How often to reload configuration from the DB. Affects how quickly setting changes take effect.

🚦 Rate limits ​

SettingKeyDefaultWhat it does
🚦 API: requests/min (global)api_rate_limit_per_minute120Maximum API requests per minute per IP. 0 = unlimited.
📡 Collector: rate limitcollector_rate_limit1/secondRate limit for the node-agent metrics endpoint (format: '1/second').

💾 Cache ​

SettingKeyDefaultWhat it does
💾 Cache: max entriescache_max_entries5000Maximum entries in the in-memory cache. LRU eviction kicks in when exceeded.
⏱️ Cache: default TTL (sec)cache_default_ttl300Default entry TTL. Lower = fresher data, more DB queries.

🔍 Violation detection pipeline ​

SettingKeyDefaultWhat it does
⏱️ Violation queue: drain interval (sec)violation_drain_interval3.0How often the worker pulls a chunk of users from the queue. Lower = faster reaction, higher load.
📦 Violation queue: chunk sizeviolation_chunk_size200Users processed per cycle. Higher = queue drains faster, but peak load rises.
🔀 Max background tasksviolation_max_background_tasks20Maximum concurrent background tasks (torrents, etc.). New tasks are dropped when exceeded.

🔄 Sync ​

Synchronisation with the Remnawave panel.

SettingKeyDefaultWhat it does
🔄 Sync intervalsync_interval_seconds300Data sync interval with API (seconds, requires restart) (SYNC_INTERVAL_SECONDS)

Agent settings ​

Agent variables are set on the node itself and are not part of this list — see Node Agent.

AGPL-3.0 with a plugin exception