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.
influxd
bin must be installed in your system. Check it by runningwhich influxd
command- 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 ❤️