NodeJS module for InfluxDB backup/restore.
This module uses the influxd command to backup and restore the backup, the backup consists in a zip file with all the data generated by the influxd command.
Uses InfluxDB portable backups introduced in InfluxDb v1.5, check docs for more info.
influxdbin must be installed in your system. Check it by runningwhich influxdcommand- InfluxDB version > v1.5
Run the following command in the root directory of your project
npm install influx-backup --save Check JSDocs and the Express example.
Here are some lines from examples/app.js
const BackupManager = require('influx-backup'); const TEST_DB = "testDB"; const manager = new BackupManager({db: TEST_DB}); // Restore DB api app.post('/restore', (req, res) => { var restore_path = ""; // create a temp directory to use for the backup manager.createDir() .then((dir) => { restore_path = dir; // Use multer to get the file from the req // and store it in the temp dir created var Storage = multer.diskStorage({ destination: restore_path, filename: function(req, file, callback) { callback(null, file.originalname); } }); // "restore" is the name attr of input file in html var upload = multer({storage: Storage}).single("restore"); return multerPromise(upload, req, res) }) .then((file) => { //now the file is stored correctly, I can start the restore command if(file){ return manager.restore(restore_path, file.originalname) }else{ throw Error("No file provided"); } }) //the backup has been restored in a backup database, load the backup in the main database .then(() => manager.loadBackup()) .then(() => res.json({success:true, message: "Backup restored successfully"})) .catch(err => { console.log(err); res.json({success:false, message: err.message}) }); }); // Backup DB api app.get('/backup', (req, res) => { manager.backup() .then((file) => { //zip file is ready, send it to the client var stream = fs.createReadStream(file); res.setHeader('Content-disposition', 'attachment; filename=' + file.split('/').pop()); stream.once("close", function () { stream.destroy(); // makesure stream closed, not close if download aborted. //IMPORTANT: remove backup files and zip manager.deleteDir(path.dirname(file)); }); stream.pipe(res); }) .catch(err => { res.json({success: false, message: err}); }); }); // Check testDB exists, if not create one and start app listening on port 8000 influx.getDatabaseNames() .then(names => { if (!names.includes(TEST_DB)) { return influx.createDatabase(TEST_DB) } }) .then(() => manager.init()) .then(() => { app.listen(8000, function () { console.log('Listening on port 8000') }) }) .catch(err => { console.error(`Error creating Influx database!`) })Q: Why I can't restore directly to the main database?
A: Actually InfluxDB doesn't allows to restore data in an existing database, the only way to do this is to load the backup in a temporary database and than use a query to load the data from the temporary database to the existing one. More details here
Support me on Patreon β€οΈ

