本文概述
如今, 大多数基于UNIX的系统都带有几个基本的备份软件选项, 包括dd, cpio, tar和dump。如果服务器的基本备份软件无法满足你的需求, 那么你可以考虑签出Internet上许多备份软件选项。但是, 你仍然可以是老式的程序员(可能会更加谨慎), 并通过从Web服务器下载整个文件夹并将其存储在家庭或办公室的硬盘中, 来使用Node.js创建自制备份。
要求
在本文中, 我们将不处理目录中每个文件夹的下载, 主要是因为这会增加传输的处理时间, 而且棘手且痛苦, 因此比较麻烦。为了使备份尽可能简单, 我们将直接远程压缩文件夹。为此, 我们将需要:
- 命令行实用程序tar, 用于将许多文件收集到一个归档文件中(默认情况下, 在任何基于UNIX的服务器上都可用)。
注意
该脚本可以在Windows Server上运行, 但是tar实用程序应该可用, 而不是将输出重定向到2> / dev / null, 而应该是NUL。
显然, 你需要安装Node.js并耐心等待。让我们开始吧 !
1.在你的Node.js项目中安装tar-fs和ssh2
在计算机中打开一个新终端, 然后切换到项目目录。然后使用以下命令继续安装SSH2模块:
npm install ssh2
如果你需要有关SSH2模块的更多信息, 请在此处访问Github中的官方存储库。
一旦安装了SSH2模块, 你现在将需要tar-fs模块, tar-fs允许你将目录打包到tarball中并将tarball提取到目录中。使用以下命令安装模块:
npm install tar-fs
如果你需要有关tar-fs模块的更多信息, 请访问Github上的官方存储库。
安装模块后, 你可以编写一些代码, 这些代码将从本地服务器上下载整个目录作为备份。
2.创建传递函数
为了测试脚本, 请创建一个演示文件, 即backup.js, 并将以下脚本保存在其中。以下功能的工作方式如下:使用SSH2库中的连接对象, 命令将在远程终端中执行(类似于tar cf-/ folder / to / download 2> / dev / null, 如果使用压缩tar cf -/ folder / to / download 2> / dev / null | gzip 6 -c 2> / dev / null), 此命令会将所有压缩文件和文件夹流式传输到我们的连接(将标准输出(stdout)重定向到/ dev / null(将其丢弃)(在Linux / Unix中被视为黑洞), 并借助tar-fs模块, 你将能够将流式数据提取到某个本地目录中。
请注意, 你之前需要使用tar-fs和zlib模块:
var tar = require('tar-fs');
var zlib = require('zlib');
/**
* Transfers an entire directory locally by compressing, downloading and extracting it locally.
*
* @param {SSH} conn A ssh connection of the ssh2 library
* @param {String} remotePath
* @param {String} localPath
* @param {Integer|Boolean} compression
* @param {Function} cb Callback executed once the transfer finishes (success or error)
* @see http://stackoverflow.com/questions/23935283/transfer-entire-directory-using-ssh2-in-nodejs
*/
function transferDirectory(conn, remotePath, localPath, compression, cb) {
var cmd = 'tar cf - "' + remotePath + '" 2>/dev/null';
if (typeof compression === 'function'){
cb = compression;
}else if (compression === true){
compression = 6;
}
// Apply compression if desired
if (typeof compression === 'number' && compression >= 1 && compression <= 9){
cmd += ' | gzip -' + compression + 'c 2>/dev/null';
}else{
compression = undefined;
}
conn.exec(cmd, function (err, stream) {
if (err){
return cb(err);
}
var exitErr;
var tarStream = tar.extract(localPath);
tarStream.on('finish', function () {
cb(exitErr);
});
stream.on('exit', function (code, signal) {
if (typeof code === 'number' && code !== 0){
exitErr = new Error('Remote process exited with code ' + code);
}else if (signal){
exitErr = new Error('Remote process killed with signal ' + signal);
}
}).stderr.resume();
if (compression){
stream = stream.pipe(zlib.createGunzip());
}
stream.pipe(tarStream);
});
}
使用此单个代码段, 你就可以下载目录了。
3.下载目录
要从服务器开始备份整个目录, 你将需要使用ssh2模块创建一个新的SSH连接。要求模块并创建它的新实例, 然后配置设置对象(凭证, 服务器的URL等)并添加就绪的侦听器。在回调内部, 你需要执行上一步中创建的传递函数。根据需要设置参数并验证脚本:
var SSH = require('ssh2');
var conn = new SSH();
var connectionSettings = {
// The host URL
host: 'your.server.url.com', // The port, usually 22
port: 22, // Credentials
username: 'root', password: '*******'
};
conn.on('ready', function () {
// Use the transfer directory
transferDirectory(
// The SSH2 connection
conn, // The remote folder of your unix server that you want to back up
'/var/www/vhosts/yourproject.com/some-folder-to-backup', // Local path where the files should be saved
__dirname + '/backup', // Define a compression value (true for default 6) with a numerical value
true, // A callback executed once the transference finishes
function (err) {
if (err){
throw err;
};
console.log('Remote directory succesfully downloaded!');
// Finish the connection
conn.end();
}
);
}).connect(connectionSettings);
然后将更改保存到文件中, 并使用以下命令执行脚本:
node backup.js
脚本完成后, 你应该在脚本所在的同一文件夹中获得一个新文件夹(备份)。如果要从项目中创建备份, 特别是用户在WordPress或其他类型的CMS等项目中上传的文件, 则此脚本非常有用。
编码愉快!
评论前必须登录!
注册