ããã¯ãã·ã¹ãã 管çè
ã®äž»ãªåœä»€ãå®è¡ããããšããèªäœã®èªè»¢è»ã«é¢ãã話ã§ãããã¹ãŠãæ©èœããŸããããäœãããŸããã§ããã ïŒ
ããã€ãã®çŽ¹ä»
éèŠ -ããã®æ å ±ã¯ããæ代é ãã§ãäžè¬çãªèª¬æã¯å€æŽãããŠããŸããããæ§æã®äžéšãå€æŽãããŠãããããããã«githubã確èªããããšããå§ãããŸãã
ç§ãã¡ã¯æ°å¹ŽéïŒæ£ç¢ºã«ã¯2幎ïŒäŒç€Ÿã«åšç±ããŠãããLinuxãŸãã¯ã³ã³ããã«å šé¢çã«ç§»è¡ããŠããŸãã å瀟ã§éçºäžã®ããã°ã©ã èªäœãLinuxã§åäœãããããç¹å¥ãªåé¡ã¯ãªãããã¹ã¯äºåã«æ±ºå®ãããŠããŸãã
ååãšããŠãADãFileServerãããã³ãã¹ãçšã®ä»ã®ãµãŒããŒã®ã¿ããããŸããã
æåã«æ»ã£ãŠãã³ã³ããã衚瀺ããããšãã«ãããããä¿åããæ¹æ³ã«ã€ããŠã®è³ªåãçºçããããã€ãã®ã¹ã¯ãªããããããŸããããæã§å€ãã®ããšãããªããã°ãªãããã³ã³ããã®æ°ãå¢ããŠè¿·æã«ãªããŸããã ãã®ãããã³ã³ãããŒïŒãµãŒããŒïŒWindowsããã³LinuxïŒããã®ããŒã¿ïŒãä¿åã§ããããã«ããã°ã©ã ãäœæããŸããã ããã¯ãnode.jsã§äœæããæåã®ããã°ã©ã ã§ãããããã«å¿ããŠé©åã§ããããæ©èœããŸããã æ°ãæåŸããšã©ãŒãèŠã€ããŸããããä¿®æ£ã§ããŸããã§ãããnode.jsã«ã€ããŠå°ãåŠãã ã®ã§ãasync / awaitã§ãã¹ãŠãæžãçŽãããšã«ããŸããããã®ãããæžããã2çªç®ã®ããŒãžã§ã³ãç»å ŽããŸããã
å®è£
äžã§æžããããã«ãnodebackupã¯ããŒã¿ã®ã¿ãä¿åã§ããŸãã å éšã§ã¯ã éè€ãæ©èœããŸã ã Nodebackupã¯ãããŒã¿ãè€è£œããã ãã§æºåã§ããããã«ããŒã¿ãæºåããŸãã
ä»çµã¿
äžã®åçã¯ãã¹ãŠãããŸã説æããŠããŸãïŒç§ã¯èªåã§ãã£ãããšãé¡ã£ãŠããŸãïŒïŒïŒããèšèã§ç¹°ãè¿ããŸãã
4ã€ã®ã³ã³ããŒãã³ãïŒã¹ã¿ãŒã¿ãŒãexecãã¯ã©ã€ã¢ã³ãããµãŒããŒïŒãããããããã¯ãã¹ãŠåããµãŒããŒäžã«ãã£ãŠãç°ãªããµãŒããŒäžã«ãã£ãŠããããå€ãã®ã¯ã©ã€ã¢ã³ãããã£ãŠãããŸããŸããã
Starterã¯å®éã«ã¯nodebackupã§ãããnode.jsãããã°ã©ãã«ã§ãã€ã³ã¹ããŒã«ã§ããŸãã ã³ã³ããå
ã§åäœããŸãïŒåŸã§èª¬æããŸãïŒ
Exec-ã¹ã¿ãŒã¿ãŒã¯ãã®ãµãŒããŒã«æ¥ç¶ãããã§ã«ãããããã¹ãŠã®ã³ãã³ããå®è¡ããŸãã ããšãã°ãã€ã³ã¿ãŒããããããããã¯ãŒã¯ã«ä¿åããå¿
èŠãããå Žåã«åããŠããã®éšåãDMZã«é
眮ããŠãããã¯ã¢ãããµãŒããŒã«å転ãããŸãã
ã¯ã©ã€ã¢ã³ã -ããã¯å®éã«ã¯ä¿åãåé€ããããµãŒããŒã§ãããLinuxãWindowsããŸãã¯ããã«ãŒãã¹ãã«ããããšãã§ããŸãã
ãµãŒããŒã¯ãããŒã¿ãä¿åããããµãŒããŒã§ãã
Starterã«ã¯ããã®ãããªãµãŒããŒããããã®ã¯ã©ã€ã¢ã³ãã®ããã«ä¿åããã¯ã©ã€ã¢ã³ãã®æ§æããããã©ãåŠçããããæ¢ã«èšè¿°ããŠãããšèšãæ§æããããŸãã ã¯ã©ã€ã¢ã³ããããã«ãŒãã¹ãã®å Žåãã©ãã«ã¯åã³ã³ããããèªã¿åããããã®ã³ã³ããã§äœããããã瀺ãããŸãã
æ§æ
ãããã£ãŠãnodebackupãã€ã³ã¹ããŒã«ãããŠãããµãŒããŒïŒããã¯ã¹ã¿ãŒã¿ãŒã§ãïŒã®ããã«ãnode.js> v6.5ãã€ã³ã¹ããŒã«ããã ãã§ãããšãã°3ã€ã®ãµãŒããŒïŒwindows fileserverïŒwinserverïŒãlinuxïŒfreepbxïŒãdocker hostïŒdockerhost1ïŒãªã©ïŒãã€ã³ã¹ããŒã«ããã ãã§ãããã¯backup2ã«ä¿åãããŸãã
backup2 -Exec / Serverã®åœ¹å²ãæããããã®äžã§æ©èœããã«ã¯ãcifsãduplicyãsshfsãã€ã³ã¹ããŒã«ããå¿ èŠããããŸãã smbãsshfsãããŠã³ãããŠfreepbxãµãŒããŒããããŒã¿ãããŠã³ãããã«ã¯Cifsãå¿ èŠã§ããããä¿åããã«ã¯éè€ãå¿ èŠã§ãã
ãŸããLinuxãŸãã¯ãã¹ãDockerã®å Žåãã¯ã©ã€ã¢ã³ãã¯sshããŒãã°ã€ã³ãå¿ èŠã§ãã
å®éãããã¯ãµãŒããŒäžã®ã»ããã¢ããå šäœã§ãã次ã«ãnodebackupã®æ§æãäœæããŠã圌ãäœããã¹ãããç¥ãå¿ èŠããããŸãã
ãã®ãããconfig.yamlãã¡ã€ã«ãäœæããŸãããã®ãã¡ã€ã«ã¯nodebackupãã©ã«ããŒã«ããå¿ èŠããããŸãã
nodebackupã®æåã®éšå
starter: sshkey: id_rsa log: path: log
id_rsaã¯sshããŒã§ãããã®å Žåãåããã©ã«ããŒã«ãããŸãã
次ã®éšåã¯ããã¯ã¢ãããµãŒããŒçšã§ãïŒãã®å Žåãbackup2ïŒ
backupserver: backup2: passphrase: PASSPHRASE-FOR-DUPLICITY HOST: backup2.example.com USER: admin2 PORT: '22' prerun: '["echo prerun1", "echo prerun2", "echo prerun3"]' #postrun: '["echo postrun1","echo postrun2","echo postrun3"]' backuppath: /backup duplicityarchiv: /backup/duplicityarchiv backuppartsize: 2048 tmpdir: /backup/backuptemp backupfor: '["winserver", "freepbx", "dockerhost1"]'
ãã¹ãã¬ãŒãº-ä¿åãããã¹ã¯ãŒãããµãŒããŒã«ä¿åãããŠãããã¹ãŠã®ã¯ã©ã€ã¢ã³ãã«äœ¿çšãããŸã
prerunãpostrun-ããã¯ã¢ããã®ååŸã«ããããå®è¡ãããã³ãã³ã
backuppath-ããã¯ã¢ãããä¿åãããå Žæã
duplicityarchiv-ãªãã·ã§ã³ãéè€ã¯ããèªäœã®ããŒã¿ãä¿åããŸããå€ãã®ãªãã·ã§ã³ããããŸãããªãã·ã§ã³ãèšå®ããªãå Žåããã¹ãŠã¯/home/user/.config/duplicityã«ä¿åãããŸãã
backuppartsize-ããã¯ã¢ããã¯2048 MBã®æçã«åå²ãããŸããããã§ã¯ãç¬èªã®äœããæžã蟌ãããšãã§ããŸãã
backupfor-ããã«ã¯ã©ã€ã¢ã³ãã®ååãæžã蟌ãŸããŸãããããã®æ§æã«ã€ããŠã¯ä»¥äžã§èª¬æããŸãã
顧客ã®äžéšãšãªããæåã®winserver
clientserver: backup2: HOST: backup2.example.com USER: admin2 PORT: '22' sftpServer: sudo: true path: /usr/lib/sftp-server winserver: HOST: "windows.example.com" SMB: SET: "true" PATH: "d$" PASS: "userpass" DOMAIN: "example.com" USER: "backupservice" PORT: 22 backup: /cygdrive/d include: '["usershare", "publicshare", "GeschÀftsleitung"]' exclude: '["publicshare/Softwarepool", "**"]' confprefixes: '["asynchronous-upload", "allow-source-mismatch"]'
ãã®ããã°ã©ã ã¯äž»ã«Linuxåãã«äœæãããŠãããããããã§ãšã©ãŒãçºçããŸããèšå®ããåé€ã§ããªãã¢ãŒãã£ãã¡ã¯ããããã€ããããŸãããããã¯PORTãããã¯ã¢ããã§ãã
SMB-ããã¯å®éã«ã¯sambaã®èšå®ã§ããããã¡ã€ã³ã«ãªãå Žåã«ãµãŒããŒã§ã©ã®ããã«åäœããããããããŸãã
includeãexclude-ãã¹ã¯SMB / PATHããååŸãããincludeãããã«æ·»ä»ãããexcludeã¯ããã«å¿ããŠåé€ãããŸã
confprefixes-ããã§ãéè€ãããªãã·ã§ã³ãè¿œå ã§ããŸããããã¯ãã¹ãŠããã¥ã¡ã³ãã«ãããŸãã
Linuxã§ãµãŒããŒãè¿œå ããŸãããã®å Žåããã©ã«ããŒã®ã¿ãä¿åããå¿ èŠããããŸãã
freepbx: HOST: "freepbx.example.com" USER: root PORT: '22' nextfullbackup: 1M noffullbackup: 2 backup: /var/spool/asterisk/backup/taeglich prerun: '["mv /var/spool/asterisk/backup/taeglich/*.tgz /var/spool/asterisk/backup/taeglich/backup.tgz"]' postrun: '["rm -Rf /var/spool/asterisk/backup/taeglich/backup.tgz"]' confprefixes: '["asynchronous-upload"]'
nextfullbackup-æ°ããå®å
šããã¯ã¢ãããäœæãããåã«å¢åããã¯ã¢ãããå®è¡ã§ããéã瀺ããŸãã
noffullbackup-ããã¯ã¢ããã®æ°ïŒfullbackupsã®æ°ïŒ
prerunãpostrun-ããã¯ã¢ããã®ååŸã«å®è¡ãããã³ãã³ã
ä»æãéèŠãªéšåã¯ã³ã³ããã®ããã¯ã¢ããã§ã
ãŸããconfig.yamlããã®æ§æ
dockerhost1: HOST: dockerHostN010912m.example.local USER: docker PORT: 22 docker: 'true' sftpServer: sudo: true path: /usr/lib/sftp-server
docker-trueã¯ããããdockerãã¹ãã§ããããšã瀺ããŸã
sftpServer-rootãæããªãããsudoïŒãã¹ã¯ãŒããªãïŒã®ãŠãŒã¶ãŒãããå Žåããã®èå¥ãå¿
èŠãªã®ã§ãubuntuã®ããã«ãªããŸã
ããã°ã©ã ã¯ããããdockerãã¹ãã§ããããšã確èªããåŸãdocker.sockïŒ/var/run/docker.sockïŒããã³ã³ãããŒã«é¢ããæ
å ±ãèªã¿åããé©åãªã©ãã«ãèŠã€ããå Žåã¯åLabelsã調ã¹ãããã¯ã¢ãããè¡ãããŸãã
ããã¯ãã©ãã«ãç»é²ãããŠããdocker-compose.yamlã®äžéšã§ãããã¯ã©ã€ã¢ã³ãã«é¢ããäžéšã®æ§æã®ããã«èŠããŸã
labels: prerun: '["echoc prerun1", "echo prerun2"]' postrun: '["echo postrun1","echo postrun2"]' nextfullbackup: "1M" noffullbackup: "2" backup: "/a/data/backup-new-test" strategy: "off" confprefixes: '["allow-source-mismatch"]' name: "backup-new-test" processes: '["httpd"]' failovercustom: "echo 'failover ####################'" passphrase: "+++++containerPASS#######"
prerunãpostrun-ã³ã³ããã§ã¯ãªããDockerãã¹ãã§å®è¡ãããŸãã
æŠç¥-ãã®ãªãã·ã§ã³ã¯ãããã¯ã¢ããã®ããã«ã³ã³ããããªãã«ããå¿
èŠããããã©ããã瀺ããŸãã éèŠïŒããã«ãããåããªã³ã¯ã³ã³ããããªãã«ãªããŸãã
name-ãªãã·ã§ã³ãããã¯ã¢ãããµãŒããŒäžã®ãã©ã«ããŒã®ååã«ãªããŸããããã«äœããªãå Žåã¯ãã³ã³ãããŒåããã®ãŸãŸäœ¿çšãããŸãã
ããã»ã¹-ããã¯ç£èŠãããã¯ããã®ãã®ã§ãããå¶ç¶ããã«å°éããŸããã
failovercustom-ãªãã·ã§ã³ã§ãããã¯ã¢ããäžã«ãšã©ãŒãçºçããå Žåããã®ã³ãã³ããå®è¡ããããã®ãªãã·ã§ã³ãååšããªãå Žåã¯ãåã«ãdocker start CONTAINER + LINKSã
ãã¹ãã¬ãŒãº-åã³ã³ããã«åå¥ã«ç»é²ããããšããããã«ãŒãã¹ãå
šäœã«ã°ããŒãã«ã«ç»é²ããããšãã§ããŸãã åªå
床ã¯ã³ã³ããã次ã«dockerãã¹ãã§ãã
starter: sshkey: id_rsa log: path: log backupserver: backup2: passphrase: PASSPHRASE-FOR-DUPLICITY HOST: backup2.example.com USER: admin2 PORT: '22' prerun: '["echo prerun1", "echo prerun2", "echo prerun3"]' #postrun: '["echo postrun1","echo postrun2","echo postrun3"]' backuppath: /backup duplicityarchiv: /backup/duplicityarchiv backuppartsize: 2048 tmpdir: /backup/backuptemp backupfor: '["winserver", "freepbx", "dockerhost1"]' clientserver: backup2: HOST: backup2.example.com USER: admin2 PORT: '22' sftpServer: sudo: true path: /usr/lib/sftp-server server2: HOST: "windows.example.com" SMB: SET: "true" PATH: "d$" PASS: "userpass" DOMAIN: "example.com" USER: "backupservice" PORT: 22 backup: /cygdrive/d include: '["usershare", "publicshare", "GeschÀftsleitung"]' exclude: '["publicshare/Softwarepool", "**"]' confprefixes: '["asynchronous-upload", "allow-source-mismatch"]' freepbx: HOST: "freepbx.example.com" USER: root PORT: '22' nextfullbackup: 1M noffullbackup: 2 backup: /var/spool/asterisk/backup/taeglich prerun: '["mv /var/spool/asterisk/backup/taeglich/*.tgz /var/spool/asterisk/backup/taeglich/backup.tgz"]' postrun: '["rm -Rf /var/spool/asterisk/backup/taeglich/backup.tgz"]' confprefixes: '["asynchronous-upload"]' dockerhost1: HOST: dockerHostN010912m.example.local USER: docker PORT: 22 docker: 'true' sftpServer: sudo: true path: /usr/lib/sftp-server
ååãšããŠãèšå®ãæ£ããèšå®ãããšãããŸããŸãªããšãã§ããŸã
ã³ã³ããã®å¥ã®äŸã 倧ããªããŒã¿ããŒã¹ãæã€ã³ã³ããã1ã€ãããããŒã¿ããŒã¹ãã³ããŒããããŸã§åŸ
æ©ããããªãã®ã§ãã³ã³ããããªãã«ããã¹ãããã·ã§ãããäœæããã³ã³ããããªã³ã«ããã¹ãããã·ã§ãããããã£ããããã¯ã¢ããããåŸã§æ¶å»ããŸããã³ã³ããã®æ§æã¯æ¬¡ã®ãšããã§ãã
labels: nextfullbackup: "1M" noffullbackup: "2" backup: "/cephrbd/mariadb-intern-prod/snapshot" prerun: '["sudo docker stop adito4internproddb_mariadb-dev_1 adito4internproddb_mariadb_1","sudo btrfs subvolume snapshot -r /cephrbd/mariadb-intern-prod /cephrbd/mariadb-intern-prod/snapshot","sudo docker start adito4internproddb_mariadb-dev_1 adito4internproddb_mariadb_1"]' postrun: '["sudo btrfs subvolume delete /cephrbd/mariadb-intern-prod/snapshot"]' strategy: "on"
ãŸãããã¡ããããµãŒããŒãããã©ã«ããŒãä¿åããå¿ èŠããããåããµãŒããŒãdockerãã¹ãã§ããå ŽåããããŸãããããæ©èœããŸãã
1ã€ã®config.yamlã«ã¯ãå€æ°ã®ããã¯ã¢ãããµãŒããŒãšå€æ°ã®ã¯ã©ã€ã¢ã³ããå«ããããšãã§ããŸãã ããšãã°ãHetznerããããã€ãã®ãµãŒããŒãããããããããã¹ãŠconfig.yamlã«ç»é²ãããŠããŸã
éå§ãã
config.yamlãã§ããã®ã§ãããã¯ã¢ãããäœæã§ããŸãã
ããŒã ãªã¹ã
/nodebackup # node BackupExecV3.js -h Usage: BackupExecV3 [options] Options: -h, --help output usage information -V, --version output the version number -b, --backup start backup -e, --exec [exec] server, which start backup job -t, --target [target] single server for backup -s, --server [server] backup server -d, --debug debug to console -f, --debugfile debug to file -r, --restore starte restore -c, --pathcustom [pathcustom] path to restore data (custom path) -o, --overwrite overwrite existing folder by recovery -p, --pathdefault [pathdefault] default path from config.yml -m, --time [time] backup from [time] -i, --verify verify all backups on a backup server Info: Read README.md for more info Backup: Backup: sudo ./BackupExecV3 -b -e backup2 -s backup2 Single backup: sudo ./BackupExecV3 -b -e backup2 -s backup2 -t freepbx Recovery: Backup to original path: sudo ./BackupExecV3.js -r -t backup-new-test -s backup2 -p freepbx -o Backup to custom path: sudo ./BackupExecV3.js -r -t backup-new-test -s backup2 -c freepbx:/tmp/newFolder Backup to custom path: sudo ./BackupExecV3.js -r -t backup-new-test -s backup2 -c freepbx:/tmp/newFolder -o -m (2D|1W|10s|50m)
äŸ1
ããã¯ã¢ãããäœæããŸãã
node BackupExecV3.js -b -e backup2 -s backup2 -d/f
ããã°ã©ã ã¯config.yamlãèŠãŠãä¿åãããµãŒããŒã決å®ããŸãã ãã®åŸãããã¯ã¢ãããè¡ãããŸãã
äŸ2
åã ã®ãµãŒããŒãŸãã¯ã³ã³ããã®ããã¯ã¢ãããäœæããŸã
node BackupExecV3.js -b -e backup -s bacup2 -t CONTAINERNAME -d/f
ããå°ãç°¡çŽ åãã
nodebackupãæåã§ã€ã³ã¹ããŒã«ããªãããã«ãDockerã®ã€ã¡ãŒãžãäœæããŸããïŒ ãã¡ã ïŒ
ãã®ã³ã³ããã¯ãconfig.yamlãcrontab.tmpãsshããŒã®3ã€ã®ãã¡ã€ã«ããã£ãŒãããå¿
èŠããããŸã
docker-compose.yaml
nodebackup: image: adito/nodebackup hostname: nodebackup environment: - SSMTP_SENDER_ADDRESS=no-reply@example.com - SSMTP_MAIL_SERVER=mail.example.com - SSMTP_HOST=nodebackup.example.com volumes: - ./config/config.yml:/nodebackup/config.yml:ro - ./config/id_rsa:/nodebackup/id_rsa:ro - ./config/crontab.tmp:/crontab.tmp:ro - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro - /a/data/nodebackup/log:/a/data/log restart: always
crontab.tmp
MAILTO=admin@example.com NODE_PATH=/usr/lib/nodejs:/usr/lib/node_modules:/usr/share/javascript # mh dom mon dow command 0 22 * * * node /nodebackup/BackupExecV3.js -b -s backup2 -e backup2 -f 0 22 * * * node /nodebackup/BackupExecV3.js -b -s hetznerdocker -e hetznerdocker -f 0 22 * * * node /nodebackup/BackupExecV3.js -b -s hetznerdocker2 -e hetznerdocker2 -f 0 22 * * * node /nodebackup/BackupExecV3.js -b -s hetznerdocker3 -e hetznerdocker3 -f 0 22 * * * node /nodebackup/BackupExecV3.js -b -s hetznerdocker4 -e hetznerdocker4 -f 0 22 * * * node /nodebackup/BackupExecV3.js -b -s hetznerdocker5 -e hetznerdocker5 -f
ãããã«
ä»ã®ã¿ããªããããã©ããã£ãŠãããããããªãã®ã§ãå°ãã°ãŒã°ã«ã§æ€çŽ¢ããŸãããããã®ãããã¯ã§è¯ãããšãèŠã€ããããŸããã§ãããå€åããã¯ããŸãæ£ç¢ºã§ã¯ãªããããããŸãããããšãŠãç°¡åã«ãªããŸããã
githubã®readmeã«ã¯ã埩å ãšæ€èšŒã®ããã«ä»ã®äŸãæžãããŠããŸããããã¹ãŠãããã«ããããã«æããã®ã§ãããã§ã¯èª¬æããŸããã§ãããäž»ãªããšã¯ãæ£ããæ§æconfig.yamlãäœæããããšã§ãã
ãããæžããçç±ã¯2ã€ãããŸãã
- ç§ãã¡ã¯ãã£ãããškubernetesã«åãæ¿ããããšãèããŠããŸãããç§ã®æèŠã§ã¯ãããã¯ééã£ã決å®ã«ãªãã§ãããã 誰ããã³ã¡ã³ãã§æ£ãã解決çãæããŠããããããããŸããã
- ç§ã¯ããªãé·ãéããããã¹ãŠè¡ã£ãŠæžããŸããããä»ã®äººã«ã䜿ã£ãŠã»ããã§ãã