Backup and Restore
The Backup and Restore entry of the main menu wires in the remnawave-backup-restore tool by distillium. It takes a full copy of the Remnawave panel: the PostgreSQL database and the entire installation directory with all of its configuration. The copy can be restored on the same server or deployed on a new one, created manually or on a schedule, and delivered to Telegram, Google Drive or an S3-compatible storage. Old copies clean themselves up according to the retention policy.
What goes into a copy
Section titled “What goes into a copy”- The database. In Docker mode the dump is taken with
pg_dumpallright inside theremnawave-dbcontainer, so roles and global settings land in the copy along with the data. For an external PostgreSQL the tool spins up a throwawaypostgrescontainer and dumps over the network, with a configurable SSL mode. - The panel directory. Archived in full, minus temporary files:
*.log,*.tmpand.gitare excluded. - A Telegram shop bot (optional). When bot backup is enabled, its database and directory are added to the same archive.
Everything is packed into a single file like remnawave_backup_full_2026-10-04_12_00_00.tar.gz. The word in the name (full, panel, bot) tells you the scope at a glance. Inside the archive sit the database dump, the directory archive and a backup_meta.info file with the panel version, the script version and the dump type: on restore the tool matches this data against the current mode and warns about a mismatch.
Launching
Section titled “Launching”Run on the panel server:
remnawave_reverse-
In the main menu pick entry
8:REMNAWAVE REVERSE-PROXY by eGames Wiki: https://wiki.egam.es/ 5.Xray Checker — subscription monitoring 6.Custom extensions by legiz 7.WARP Native 8.Backup and Restore 0.Exit Select an action (0-13):
-
On first launch the module downloads
backup-restore.shfrom two independent mirrors and compares checksums: the file only runs when both sources served identical bytes. If the checks disagree, the launch is aborted with «Скрипт не подтверждён двумя независимыми источниками, возможна подмена. Запуск отменён». -
The tool then moves itself to a permanent directory and restarts from there:
[INFO] Configuration not found. Script launched from temporary location. [INFO] Moving script to main install directory: /opt/rw-backup-restore/backup-restore.sh... [SUCCESS] Script successfully moved to /opt/rw-backup-restore/backup-restore.sh. [ACTION] Restarting script from new location to complete setup.
Every later run of entry 8 opens the installed copy straight away through the rw-backup command, with no downloading.
First run
Section titled “First run”-
Pick the interface language:
Select language / Выберите язык: 1.Русский 2.English [?]: 2
-
Choose the operation mode.
Fullbacks up the panel (a bot can be added later), whileBot Onlyfits when the panel lives on another server:[ACTION] Select script operation mode: 1.Full (Remnawave Panel + Bot optionally) 2.Bot Only (if panel is on another server) [?] Your choice: 1
-
Telegram setup. The token of a bot created via @BotFather and your ID can be left empty: notifications are easy to enable later in the settings, but without them you will not hear about scheduled backup results:
[INFO] Telegram notification setup: [INFO] Create a Telegram bot via @BotFather and get API Token [INFO] Leave empty to skip, you can set it up later in the settings menu. [WARN] Without Telegram you won't receive backup and update notifications. Enter API Token: 1234567890:AA… [INFO] Enter Chat ID (for group) or your Telegram ID (for direct messages) Chat ID/Telegram ID can be found via @username_to_id_bot Enter ID: 112233445 [INFO] Optional: to send to a specific group topic, enter Message Thread ID Leave empty for general thread or direct bot messages Enter Message Thread ID:
-
The panel database username (the default usually fits):
[INFO] Enter DB username (default postgres): Input: postgres
-
Tell the tool where the panel is installed:
[ACTION] Where is your Remnawave panel installed? 1./opt/remnawave 2./root/remnawave 3./opt/stacks/remnawave 4.Enter custom path [?] Select option: 1
-
Done. The configuration lands in
/opt/rw-backup-restore/config.env, and arw-backupcommand appears for quick launches:[SUCCESS] New configuration saved in /opt/rw-backup-restore/config.env [INFO] Creating or updating symlink /usr/local/bin/rw-backup... [SUCCESS] Symlink successfully configured.
The main menu
Section titled “The main menu”REMNAWAVE BACKUP & RESTORE by distillium Version: 4.0.0 DB: Docker container 1.Create backup manually 2.Restore from backup 3.Telegram bot backup configuration 4.Auto-send and notifications setup 5.Upload method configuration 6.Script configuration 7.Update script 8.Remove script 0.Exit — Quick launch: rw-backup available from anywhere in the system [?] Select option:
The DB: line under the version shows the current connection: the remnawave-db container or an external PostgreSQL with its address. The rw-backup command starts the tool from anywhere in the system without opening the script’s main menu, and rw-backup backup creates a copy immediately with no menu at all: that is how the schedule works.
Creating a backup
Section titled “Creating a backup”-
Pick entry
1. The tool takes a database dump, archives the panel directory and assembles the final archive:[INFO] Starting backup creation process... [INFO] DB connection mode: Docker container (remnawave-db) [INFO] Creating PostgreSQL dump and compressing... [SUCCESS] PostgreSQL dump successfully created. [INFO] Archiving Remnawave directory... [INFO] Archiving directory /opt/remnawave... [SUCCESS] Remnawave directory successfully archived. [SUCCESS] Final backup archive successfully created: /opt/rw-backup-restore/backup/remnawave_backup_full_2026-10-04_12_00_00.tar.gz [INFO] Cleaning intermediate backup files... [SUCCESS] Intermediate files removed. [INFO] Sending backup (telegram)... [SUCCESS] Backup successfully sent to Telegram. [INFO] Applying backup retention policy (keeping last 7 days)... [SUCCESS] Retention policy applied. Old backups removed.
A few details about the behavior:
- The file always stays on the server in
/opt/rw-backup-restore/backup, delivery to Telegram or cloud storage happens on top of that. - Telegram refuses files over 50 MB: such a backup remains local only, and a notice about the exceeded limit arrives in the chat.
- By default the retention policy keeps local copies for 7 days, while S3 keeps its own configurable 30 days.
- After delivery the tool checks for updates to itself and sends a Telegram notification when a newer version is out.
What arrives in Telegram
Section titled “What arrives in Telegram”The copy comes with a message describing the scope, size and panel version:
💾 #backup_success ➖➖➖➖➖➖➖➖➖ ✅ Backup successfully created 🌊 Remnawave: 3.7.0 🖥️ Panel only 🐳 DB: Docker 📁 DB + directory 📏 Size: 24M 📅 Date: 2026-10-04 12:00:00
Restoring
Section titled “Restoring”-
Pick entry
2and the source of the copy: local files or a download from S3:Restore from Backup [INFO] DB connection mode: Docker container (remnawave-db) Select backup source: 1.Local files 2.Download from S3 Storage 0.Return to main menu [?] Select option: 1
-
Local copies are looked up in
/opt/rw-backup-restore/backup: copying a foreign archive there over SFTP is enough. Pick the file you need from the list:[INFO] Place backup file in folder: /opt/rw-backup-restore/backup Select file to restore: 1)remnawave_backup_full_2026-10-04_12_00_00.tar.gz 2)remnawave_backup_full_2026-10-03_12_00_00.tar.gz 0)Return to main menu [?] Enter file number (0 to exit): 1
-
The archive is unpacked and the tool shows the metadata: the dump type, the script version and the panel version at copy time:
[INFO] Unpacking backup archive... [SUCCESS] Archive unpacked [INFO] Backup metadata: dump type = dumpall [INFO] Backup script version = 4.0.0 [INFO] Panel version = 3.7.0
-
When the archive holds both the database and the files, the tool asks how much to restore:
[WARN] Panel backup found. Restore will overwrite current DB. 1.All (DB + files) 2.Database only 3.Files only 0.Back [?] Select option: 1 [?] Restore panel? (Y/N): y [INFO] Enter DB name (default postgres): Input: postgres
-
The restore itself: the panel stops, the database is replayed from the dump, the containers come back up:
[INFO] Waiting for DB to be ready... [INFO] Restoring database... [SUCCESS] Database successfully restored. [INFO] Starting remaining containers... [SUCCESS] Panel successfully started. [SUCCESS] Panel ready. Press Enter to continue... [SUCCESS] Restore process completed.
If the archive contains a shop backup, the tool offers to restore it next, with a warning first: a bot running on another server must be stopped, or the two instances will conflict.
Telegram bot backup
Section titled “Telegram bot backup”Entry 3 adds a Telegram shop bot to the copy. remnawave-telegram-shop, the private rwp-shop, remnawave-tg-shop, remnashop and remnawave-minishop are supported:
Telegram Bot Backup Configuration Bot: Minishop Bot Path: /opt/remnawave-minishop Mode: PANEL + BOT 1.Configure / Change bot parameters 2.Completely disable bot backup 3.Exclude panel backup (Bot Only mode) 0.Return to main menu [?] Select option:
During setup you pick the bot from the list, the path to its directory and the database user. Bot Only mode fits when the panel and the shop live on different servers: the copy will contain the shop alone, and the file name gets a bot tag.
Schedule
Section titled “Schedule”Entry 4 installs a cron job that creates and delivers copies on its own. Times are entered in UTC+0 as a list of hours:
Auto-send Configuration [INFO] Auto-send is disabled. 1.Enable/overwrite automatic backup sending 2.Disable automatic backup sending 0.Return to main menu [?] Select option: 1 Select auto-send variant: 1)Enter time (e.g.: 08:00 12:00 18:00) 2)Hourly 3)Daily Your choice: 1 Enter desired send time in UTC+0 (e.g., 08:00 12:00): Time separated by spaces: 08:00 [INFO] Setting up cron job for auto-send... [INFO] SHELL=/bin/bash added to crontab. [INFO] PATH variable already exists in crontab. [SUCCESS] CRON job for auto-send successfully installed. [SUCCESS] Auto-send set for: 08:00 UTC+0.
The entered times are recalculated into the server’s timezone, so the copy arrives at the hour you expect in your local time. The job output goes to /var/log/rw_backup_cron.log.
Upload method
Section titled “Upload method”Entry 5 chooses where copies go:
Backup Upload Method Configuration [INFO] Current method: TELEGRAM 1.Set upload method: Telegram 2.Set upload method: Google Drive 3.S3 Storage (S3-compatible storage) 0.Return to main menu [?] Select option:
- Telegram delivers the copy as a file to a chat or group topic. The limit is 50 MB, so larger panels are better off with cloud delivery.
- Google Drive requires creating a Google API app and obtaining a Client ID, Client Secret and Refresh Token: the tool walks you through, shows the authorization link and asks for the code from the browser. Copies land in the chosen Drive folder, while notifications still arrive in Telegram.
- S3 Storage works with any S3-compatible storage. You need an Endpoint URL, Region, bucket name, Access Key and Secret Key, plus an optional prefix (folder) and a retention period in days. AWS CLI is installed automatically, and the connection can be checked with a test in the settings.
When Google Drive or S3 setup is left unfinished, the tool does not stay silent: it falls back to Telegram and tells you about it.
Settings
Section titled “Settings”Entry 6 opens the tool’s configuration:
Script Configuration 1.Telegram Settings 2.Google Drive Settings 3.S3 Storage Settings 4.Panel DB Connection 5.Remnawave Path 6.Backup Retention Policy 7.Language / Язык 8.Script auto-update 0.Return to main menu [?] Select option:
The most useful parts inside:
- Telegram Settings hold the token, chat ID and topic, plus a proxy for the Telegram API with a test: three attempts showing response times and the reasons behind errors.
- Panel DB Connection switches between the
remnawave-dbcontainer and an external PostgreSQL, stores the host, port, database name, SSL mode and client version, and checks the connection with a test button. - Backup Retention Policy sets how many days (or hours) local copies and S3 copies live.
- Script auto-update lets the tool update itself on every backup, with a notification and a changelog link.
Update and removal
Section titled “Update and removal”Entry 7 compares the version against GitHub and offers an update when a newer one exists: before the replacement the current file is saved as a backup, and after installation the script restarts.
[INFO] Starting update check... [INFO] Fetching latest version info from GitHub... [INFO] Current version: 4.0.0 [INFO] Available version: 4.1.0 [ACTION] Update available to version 4.1.0. Do you want to update? Enter Y/N: y [INFO] Downloading update... [INFO] Removing old script backups... [INFO] Creating backup of current script... [SUCCESS] Script successfully updated to version 4.1.0. [INFO] Script will restart to apply changes...
Entry 8 removes the tool, but first offers to keep the local copies in a separate /opt/rw-backup-restore-saved directory:
[WARN] WARNING! The following will be removed: - Script - Install directory (backups can be preserved) - Symlink (if exists) - Cron jobs Are you sure you want to continue? Enter Y/N: y Keep local backups before removal? Y/N: y [SUCCESS] Backups saved to /opt/rw-backup-restore-saved [INFO] Removing cron jobs... [SUCCESS] Automatic backup cron jobs removed. [INFO] Removing symlink... [SUCCESS] Symlink removed. [INFO] Removing install directory and all data... [SUCCESS] /opt/rw-backup-restore (including script, config, backups) removed.
Saved copies are easy to bring back: after a fresh install, copy the .tar.gz files you need into /opt/rw-backup-restore/backup and pick “Restore from backup”.
Moving to a new server
Section titled “Moving to a new server”The copy carries the panel in full, so a migration boils down to restoring it on the new server and adjusting the pieces around it:
- In Cloudflare change the IP of the panel subdomain (and of other services moving along with it).
- Restore the directory and the database from the copy as described above.
- The access link and the panel password stay the ones from the old server: no need to touch them.
- If the panel was given a dedicated service port, the nodes must allow traffic from the new address. Replace the rule on every node:
ufw delete allow from OLD_IP to any port 2222 && ufw allow from NEW_IP to any port 2222When moving a panel and a node that share one server, also update the address of the root node in the panel’s node management: it activates on its own. Domain certificates are restored separately, for example via Certwarden or the “Manage certificates domain” entry of the main menu.
Files and paths
Section titled “Files and paths”/opt/rw-backup-restore: the install directory holding the script, theconfig.envsettings and the translations./opt/rw-backup-restore/backup: the storage for finished copies and the place restore reads from./opt/rw-backup-restore-saved: copies are preserved here when the tool is removed.
