Linux VPS采用Rsync实现网站文件/服务器数据同步增量备份

无论我们选择虚拟主机,还是选择VPS、服务器,最为关键的就是服务器中的数据。相对而言,选择优质服务商和服务器的意外几率会小一些,但也不是没有。因为服务器的意外不是商家和我们用户控制的,包括服务器中程序的问题,也可能是我们人为的操作问题。

如果网站数据量不大,我们可以采用定期人工备份或者利用定时备份脚本。一键包环境或者是WEB面板都带有自动备份到本地和远程服务器的功能。如果数据量较大,我们其实可以采用Rsync实现同步增量备份。下面的记录是通过Rsync实现文件同步增量备份的。
设置过程却是比较繁琐,如果我们普通项目用户可以使用商家自带的快照定时或者脚本环境带的自动备份功能,以及我们自己的定期备份。(本文来自:https://www.laobuluo.com/1070.html)

第一、准备工作

1、数据备份

如果我们没有把握一次性搞定,我们可以准备两台测试环境服务器实现Rsync同步备份功能之后再用到生产环境。如果用到生产环境,我们可以将服务器快照备份,或者将网站、项目数据备份。

2、服务器准备

这里我们采用的是Rsync同步增量备份,所以我们需要准备主服务器、以及一台备份服务器。鉴于数据备份后的功能,我们可以直接备份到备份服务器某一个目录,或者将备份服务器安装主服务器环境,将需要备份的网站项目备份到对应的同目录中。

3、端口开放

如果我们服务器没有设定iptables防火墙规则,那就不要设置端口。如果我们有设置iptables防火墙,那就需要将873端口添加放行。

vi /etc/sysconfig/iptables

打开iptables规则文档,添加:

-A INPUT -p tcp -m state --state NEW -m tcp --dport 873 -j ACCEPT

未分类

编辑保存之后,然后/etc/init.d/iptables restart重启才能生效。同样的方法,我们需要在主服务器和备份服务器同时设置。

第二、配置备份服务器

1、安装rsync

未分类

2、配置文件

vi /etc/xinetd.d/rsync

将配置文件disable参数从”yes”换成”no”。

3、创建配置文件

vi /etc/rsyncd.conf

创建文件,然后将下面脚本添加:

log file = /var/log/rsyncd.log
pidfile = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
secrets file = /etc/rsync.pass
motd file = /etc/rsyncd.Motd
#创建一个模块名称,后面需要一致
[www.laobuluo.com]
#备份服务器目录地址
path = /home/wwwroot/www.laobuluo.com
#对应上面模块名称
comment = www.laobuluo.com
uid = root
gid = root
port = 873
use chroot = no
read only = no
list = no
max connections = 200
timeout = 600
#创建一个同步用户名,随便取,反正后面出现的时候要一致
auth users = www.laobuluo.com_user
#主服务器IP地址
hosts allow = xxx.xxx.xxx.xxx

根据我们网站项目以及服务器实际信息创建文件贴到配置文件中保存退出。

4、创建密码配对文件

vi /etc/rsync.pass

创建密码配对文件:

www.laobuluo.com_user:1234567890passwd

红色字段需要对应上面的auth users,蓝色部分是我们创建配对的密码。后面主服务器配置的时候也需要用到密码,所以必须一致。

5、开放权限和启动

chmod 600 /etc/rsyncd.conf
chmod 600 /etc/rsync.pass
service xinetd restart

未分类

第三、配置主服务器

1、安装rsync

yum install rsync xinetd -y

未分类

2、配置文件

vi /etc/xinetd.d/rsync

未分类

将配置文件disable参数从”yes”换成”no”。

3、创建密码配对文件

未分类

将我们上面在备份服务器中蓝色的密码丢进来,必须一致。

4、授权和启动

未分类

第四、配置主服务器

这一步我们继续配置主服务器,需要安装和配置inotify-tools来实现同步增量备份。

1、安装环境包

yum install make gcc gcc-c++ -y

未分类

2、下载和安装inotify-tools

cd /usr/local/src
wget https://download.laobuluo.com/tools/inotify-tools-3.14.tar.gz
tar -zxvf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14
./configure --prefix=/usr/local/inotify
make
make install

未分类

3、配置环境变量

echo "PATH=/usr/local/inotify/bin:$PATH" >>/etc/profile.d/inotify.sh
source /etc/profile.d/inotify.sh
echo "/usr/local/inotify/lib" >/etc/ld.so.conf.d/inotify.conf
ln -s /usr/local/inotify/include /usr/include/inotify

4、配置参数

未分类

参考就脚本 – http://soft.laozuo.org/scripts/rsync.sh

修改自行的文件和目录,然后保存退出。

5、创建排除目录列表

vi /usr/local/inotify/exclude.list

创建一个排除目录,这里可以添加不同步的目录,一行一个目录。如果暂时没有可以留空,以后需要用到在添加。

6、授权和设置开机启动

chmod +x /usr/local/inotify/rsync.sh

这里我们授权。

vi /etc/rc.d/rc.local

最后一行添加:

sh /usr/local/inotify/rsync.sh &

未分类

第五、检测以及生效小结

1、检查生效

设置完毕之后,我们可以通过手工检查

sh /usr/local/inotify/rsync.sh &

在主服务器执行脚本,如果看到有目录在进度,说明完美,然后去备份服务器中可以看到已经备份到的文件目录。

未分类

2、自动生效

重启主服务器,然后就会自动生效。如果不放心我们可以在主服务器对应目录丢一个文件看看备份服务器是否有增加。

总结,这篇文章较为详细的将Linux VPS、服务器使用Rsync进行同步增量备份文件。

通过rsync+inotify实现服务器之间数据的实时备份

前言

背景:有A、B两台服务器,A为生产服务器,B为备份服务器
需求:A服务器上的目录/home/chancel一有修改,实时同步到备份服务器B上的/home/chancel_backup/目录

rsync+inotify介绍

rsync介绍

rsync是类unix系统下的数据镜像备份工具——remote sync。一款快速增量备份工具 Remote Sync,远程同步 支持本地复制,或者与其他SSH、rsync主机同步。(来自百度百科)

inotify介绍

Inotify 是一个 Linux特性,它监控文件系统操作,比如读取、写入和创建。Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多。学习如何将 inotify 集成到您的应用程序中,并发现一组可用来进一步自动化系统治理的命令行工具。(来自百度百科)

示例图

未分类

实现

B服务器部署

  • 安装rsync
yum -y install rsync
  • 编辑/etc/rsyncd.conf文件,下面为参考示例
# /etc/rsyncd: configuration file for rsync daemon mode
# See rsyncd.conf man page for more options.
# configuration example:
 uid = nobody
 gid = nobody
 use chroot = no
 max connections = 10
 strict modes = no
 # pid文件,如无法再次启动可删除
 pid file = /var/run/rsyncd.pid
 lock file = /var/run/rsyncd.lock
 log file = /var/run/rsyncd.log
# exclude = lost+found/
# transfer logging = yes
# timeout = 900
# ignore nonreadable = yes
# dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
# [ftp]
#        path = /home/ftp
#        comment = ftp export area
[betterlife]
# 本地存放的目录
path = /home/chancel
comment = betterlife file
ignore errors
read only = no
write only = no
hosts allow = *
list = false
# 可自定义
uid = root
gid = root
auth users = backup
# 密码文件,内容为“账户:密码”
secrets file = /etc/server.pass
  • 增加/etc/server.pass文件,内容如下
backup:密码
  • 修改/etc/server.pass权限
chmod 600 /etc/server.pass
  • 启动rsync守护进程,并将其写入开机项中
rsync --daemonecho "rsync --daemon" >>/etc/rc.local

备份服务器设置到此完毕

A服务器部署

  • 安装rsync和inotify-tools
yum -y install rsyncyum install inotify-tools
  • 如果inotify-tools无法通过yum安装(已安装跳过此步骤),可从github下载自行编译安装,下面给出参考
wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz 
tar -zxf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14
# 配置inotify,并指定安装路径为/usr/local/inotify-3.14
./configure --prefix=/usr/local/inotify-tools-3.14 
make && make install
# 将inotify加入系统环境
vim /etc/profile
# 添加入如下语句
export PATH=$PATH:/usr/local/inotify-tools-3.14/bin
# 保存并退出,使环境生效
source /etc/profile
  • 创建/etc/server.pass文件,内容如下
密码
  • 修改脚本文件权限
chmod 755 /var/www/inotifyrsync.sh
  • 测试是否能够通过rsync同步文件(注意防火墙、模块名称一致、账户密码一致、密码文件读取权限设置)
rsync -vzrtopg --delete --progress --password-file=/etc/server.pass /home/chancel   [email protected]::betterlife
  • 如测试不通过,通过返回错误信息排错,注意模块名称,账户密码,权限问题,防火墙问题,测试如通过,则创建backup脚本
# 创建backup脚本并命名为backup.shvim /home/backup.sh# 写入脚本#!/bin/bashinotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,delete,create,attrib 监测目录 | while read files        do        rsync -vzrtopg --delete --progress --password-file=/etc/server.pass 同步文件目录   backup@服务器地址::模块名                echo "${files} was rsynced" >>/tmp/rsync.log 2>&1        done
  • 后台运行该脚本,并加入启动项
./backup.sh >>/var/www/backup.log &echo "./backup.sh >>/var/www/backup.log &" >>/etc/rc.local

rsync服务器的配置

安装

  • Linux

参考 rsync的基本概念、命令、和使用(http://jiangyuesong.me/2018/01/09/rsync) 安装rsync

apt-get install xinetd 安装xinetd

  • Windows参考

配置

一下配置文件,若不存在则新增即可.

  • 修改/etc/default/rsync
RSYNC_ENABLE=inted   #false改true或者inted
  • 修改/etc/xinetd.d/rsync

将disable=yes改成disable=no

service rsync
{
    disable = no 
    socket_type = stream
    wait = no
    user = root
    server = /usr/bin/rsync
    server_args = --daemon
    log_on_failure += USERID
}
  • 修改/etc/rsyncd.conf

修改/etc/rsyncd.conf,主要包括账号密码文件路径、同步路径等内容,分为全局配置和模块配置,每个需要同步的文件夹可以配置为一个模块。可以使用rsync –daemon的方式运行守护进程,这里使用xinetd

#全局配置
#  = 后面的值可根据自己的实际情况更改
#  pid file 守护进程pid文件
#  port 守护进程监听端口,可更改,由xinetd允许rsyncd时忽略此参数
#  address 守护进程监听ip,由xinetd允许rsyncd时忽略此参数
#  我们使用xinetd 运行守护进程
pid file = /usr/local/var/run/rsyncd.pid
# port = 873
# address = 192.168.1.2
#rsyncd 守护进程运行系统用户全局配置,也可在具体的块中独立配置,
uid = root
gid = root
#允许 chroot,提升安全性,客户端连接模块,首先chroot到模块path参数指定的目录下
#chroot为yes时必须使用root权限,且不能备份path路径外的链接文件
use chroot = no
#只读
read only = no
#只写
write only = no
#允许访问rsyncd服务的ip,ip端或者单独ip之间使用空格隔开
hosts allow = *
#不允许访问rsyncd服务的ip,*是全部(不涵盖在hosts allow中声明的ip,注意和hosts allow的先后顺序)
#hosts deny = *
#客户端最大连接数
max connections = 5
#欢迎文件路径,可选的,在客户端链接成功后会显示欢迎信息
#motd file = /etc/rsyncd/rsyncd.motd
#日志相关
#  log file 指定rsync发送消息日志文件,而不是发送给syslog,如果不填这个参数默认发送给syslog
#  transfer logging 是否记录传输文件日志
#  log format 日志文件格式,格式参数请google
#  syslog facility rsync发送消息给syslog时的消息级别,
#  timeout连接超时时间
log file = /usr/local/logs/rsyncd.log
transfer logging = yes
log format = %t %a %m %f %b
syslog facility = local3
timeout = 300

#模块 模块名称必须使用[]环绕,客户端要访问data1,则地址应该是data1user@address::data1
[data1]
#模块根目录,必须指定
path=/home/test
#是否允许列出模块里的内容
list=yes
#忽略错误
#ignore errors
#模块验证用户名称,可使用空格或者逗号隔开多个用户名
auth users = data1user
#模块验证密码文件 可放在全局配置里
secrets file=/etc/rsyncd.secrets
#注释
comment = some description about this moudle
#排除目录,多个之间使用空格隔开
#exclude = test1/ test2/
  • 配置密码文件

新建密码文件/etc/rsyncd.secrets(与上述文件的secret file一致)

data1user:password
  • 配置文件授权

密码文件必须赋予600的权限

chmod 600 /etc/rsyncd.*
  • 启动服务
#重启守护进程
service xinted restart
#检查是否启动成功
netstat -an | grep 873
#显示 tcp6       0      0 :::873                  :::*                    LISTEN

使用

根据上述配置,可以本地建立密码文件pwd.secrets(随便命名),内容为

password
  • 获取远程文件
rsync -avz --password-file=pwd.secrets [email protected]::data1 /home/data

上述代码将远程的/home/test/中的内容拷贝至/home/data中,注意:服务器配置文件中path无论是否以/结尾,都不会复制目录本身,只会复制文件夹内的内容

模块名可以加子目录,data1/subdir 可以复制整个subdir目录,subdir必须是位于配置文件的path指定的目录中

  • 传输本地文件到远程机器
rsync -avz --password-file=pwd.secrets /home/data/ [email protected]::data1

本地的data内的文件被传输到/home/test/中。若本地路径写为/home/data没有/,则整个data目录上传至/home/test/

  • 列出远程文件
rsync -v --password-file=pwd.secrets rsync://[email protected]/data1/

or

rsync -v --password-file=pwd.secrets [email protected]::data1/

rsync设置只同步某些目录或文件

rsync的配置方法请参考(请先阅读这篇文章)https://blog.whsir.com/post-1501.html

现在想只同步某些目录或文件,这里就用到了–include和–exclude参数,–include是只同步某些目录或文件,但是必须和–exclude配合使用。

只需要在原来客户端的参数上做一些更改,原来客户端命令如下:

rsync --size-only -azvP --password-file=/opt/mima [email protected]::www /home/wwwroot

例如:现在我只想同步服务端/data/www/js/目录下所有文件,其他的目录或者文件我都不想同步,更改后的参数如下

rsync --size-only -azvP --include=js/ --exclude=/* --password-file=/opt/mima [email protected]::www /home/wwwroot

好了,上面的参数已经实现了我的目的,只同步js目录,那么又有一个新问题出现了,如果我想要只同步多个目录怎么办?我要写多个–include吗?当然如果不嫌麻烦也是可以的,不过我这里再介绍一个参数–include-frome,我可以把要同步的目录全部写到一个文件中,然后通过–include-frome来读取这个文件,参数如下:

rsync --size-only -azvP --include-from="/etc/include" --exclude=/* --password-file=/opt/mima [email protected]::www /home/wwwroot
cat /etc/include
js/
css/

这样就实现了只同步js和css两个目录

rsync概念、命令与配置

Rsync是Linux下的一款增量备份工具,使用特殊的算法和压缩传输,可以进行大量文件的高效率备份。本文主要介绍了rsync的基本概念,常用命令,和客户端的配置

安装

在使用rsync备份时,要求备份的源和目标机器都需要安装rsync。目前大部分Linux发行版中都安装了rsync,若未安装,Ubuntu可以运行

sudo apt-get install rsync

其它系统请自行查询安装命令。

Windows系统的安装请参考 rsync专题(http://jiangyuesong.me/tags/rsync) 中rsync在Windows中的使用

命令

rsync有六种工作模式:

  1. rsync [OPTION]… SRC DEST
  2. rsync [OPTION]… SRC [USER@]HOST:DEST
  3. rsync [OPTION]… [USER@]HOST:SRC DEST
  4. rsync [OPTION]… [USER@]HOST::SRC DEST
  5. rsync [OPTION]… SRC [USER@]HOST::DEST
  6. rsync [OPTION]… rsync://[USER@]HOST[:PORT]/SRC [DEST]

option为可选的参数(见后文) 从SRC 拷贝到DESC,USER用户名,HOST目标机器Ip地址,PORT目标机器端口

1中SRC/DEST均为本地目录
2-3中SRC/DEST为本地和远程目录,USER为ssh用户名
4-6中使用rsync服务器,::后紧跟的是服务器模块名,非目录名,但是模块名可以加子目录,USER为服务器配置文件中的用户名

1、拷贝本地文件

rsync -avz /data /backup

注意:/data会把整个data目录copy到backup目录下,形成/backup/data的结构,如果只需copy data内的内容而不复制data目录本身,应当使用rsync -avz /data/ /backup

2、通过ssh实现本地拷贝到远程机器

rsync -avz /data [email protected]:/backup

将通过root用户登陆远程机器,登陆方式是使用密钥的方式,所以在本地机器上,运行ssh-keygen -t rsa,一路回车(不要使用密码)会在你的用户目录 ~/.ssh/生成id_rsa和id_rsa.pub文件(若已经存在不需要再次生成),复制.pub文件到远程机器~/.ssh/ 目录,运行

cat id_rsa.pub >> authorized_keys
chmod 700 authorized_keys

3、通过ssh将远程内容copy到本地机器

rsync -avz [email protected]:/backup/data/ /data

同样是ssh登陆,需要完成模式2的配置才可以

4、通过rsync服务将远程内容拷贝到本地

rsync -avz [email protected]::modulename /data

rsync和ssh方式的区别在于使用了双冒号,使用这种方式需要先在远程机器上配置rsync服务器,请参考rsync专题中rsync服务器的配置

可以通过–password-file=xx 指定密码文件,客户端密码文件仅需写入对应的密码即可

这种模式中,用户名datauser和模块modulename是在服务端配置文件中配置的

5、通过rsync服务将本地文件拷贝到远程机器

rsync -avz /data/ [email protected]::modulename

同上,需要配置rsync服务器

6、列出远程主机的文件列表

rsync -v rsync://[email protected]/modulename

or

rsync -v [email protected]::modulename

可选参数

-v, –verbose 详细模式输出
-q, –quiet 精简输出模式
-c, –checksum 打开校验开关,强制对文件传输进行校验
-a, –archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
-r, –recursive 对子目录以递归模式处理
-R, –relative 使用相对路径信息
-b, –backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用–suffix选项来指定不同的备份文件前缀。
–backup-dir 将备份文件(如~filename)存放在在目录下。
-suffix=SUFFIX 定义备份文件前缀
-u, –update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件。(不覆盖更新的文件)
-l, –links 保留软链结
-L, –copy-links 想对待常规文件一样处理软链结
–copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结
–safe-links 忽略指向SRC路径目录树以外的链结
-H, –hard-links 保留硬链结
-p, –perms 保持文件权限
-o, –owner 保持文件属主信息
-g, –group 保持文件属组信息
-D, –devices 保持设备文件信息
-t, –times 保持文件时间信息
-S, –sparse 对稀疏文件进行特殊处理以节省DST的空间
-n, –dry-run现实哪些文件将被传输
-W, –whole-file 拷贝文件,不进行增量检测
-x, –one-file-system 不要跨越文件系统边界
-B, –block-size=SIZE 检验算法使用的块尺寸,默认是700字节
-e, –rsh=COMMAND 指定使用rsh、ssh方式进行数据同步
–rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息
-C, –cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件
–existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件
–delete 删除那些DST中SRC没有的文件
–delete-excluded 同样删除接收端那些被该选项指定排除的文件
–delete-after 传输结束以后再删除
–ignore-errors 即使出现IO错误也进行删除
–max-delete=NUM 最多删除NUM个文件
–partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输
–force 强制删除目录,即使不为空
–numeric-ids 不将数字的用户和组ID匹配为用户名和组名
–timeout=TIME IP超时时间,单位为秒
-I, –ignore-times 不跳过那些有同样的时间和长度的文件
–size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间
–modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为0
-T –temp-dir=DIR 在DIR中创建临时文件
–compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份
-P 等同于 –partial
–progress 显示备份过程
-z, –compress 对备份的文件在传输时进行压缩处理
–exclude=PATTERN 指定排除不需要传输的文件模式
–include=PATTERN 指定不排除而需要传输的文件模式
–exclude-from=FILE 排除FILE中指定模式的文件
–include-from=FILE 不排除FILE指定模式匹配的文件
–version 打印版本信息
–address 绑定到特定的地址
–config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件
–port=PORT 指定其他的rsync服务端口
–blocking-io 对远程shell使用阻塞IO
-stats 给出某些文件的传输状态
–progress 在传输时现实传输过程
–log-format=formAT 指定日志文件格式
–password-file=FILE 从FILE中得到密码
–bwlimit=KBPS 限制I/O带宽,KBytes per second
-h, –help 显示帮助信息

一般都使用azv选项

总结

阅读完本文,应当可以使用rsync在本地机器进行备份,和通过ssh方式与远程机器进行文件传输。其简要步骤如下:

  1. 本地和远程机器 安装rsync
  2. 本地生成ssh密钥,复制公钥到远程机器并配置
  3. 参考命令中的1~3进行备份

提示

  • 注意命令中的空格
  • 通过–exclude-from=/data/ignore.list 指定忽略列表文件,文件中,通过文件夹名,或者通配符指定忽略不传输的文件,一个典型的list可以为:
*.jar
*.bak
*.sw?
.#*
*#
*~
node_modules
Data
.git
target
temp
tmp
.idea
log

GitLab+Jenkins+Rsync+PM2实现Node项目的持续集成与自动部署

前言

最原始的软件开发流程是,在本地搭建好环境,进行开发测试,然后去服务器上搭建环境,手动上传代码,运行测试,然后启动服务。实际上,近些年来出现了很多的工具,使得这些步骤可以自动化,大大降低人工出错的概率,提高生产效率。下面,我就把GitLab+Jenkins+Rsync+PM2实现的Node项目的持续集成以及自动部署的实验过程记录下来。

搭建环境

需要两台服务器作为演示,A主要进行代码管理、构建和分发,B主要运行实际应用。我这边系统使用的是Debian系的。

服务器A

GitLab

准备工作:

apt-get update
apt-get install curl openssh-server ca-certificates postfix

安装postfix的时候,选internet site,之后的 system mail name 填写你的服务器的IP地址。

准备好后开始安装:

curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh | sudo bash
apt-get install gitlab-ee

如果 apt 下载很慢可以手动下载 https://packages.gitlab.com/gitlab/gitlab-ee/packages/ubuntu/trusty/gitlab-ee_10.2.2-ee.0_amd64.deb 然后用 dpkg -i 的方式安装。装了这个过后 NGINX, Postgres, Redis 就都装好了。

配置:

GitLab默认会占用80、8080和9090端口,Jenkins默认也会使用8080端口,所以将GitLab的默认端口为60200、60201、60202(你可以随意定制)

vim /etc/gitlab/gitlab.rb 修改

external_url 'http://<你的服务器ip>:60200'
unicorn['port'] = 60201
prometheus['listen_address'] = 'localhost:60202'

注意不能有多余空格。gitlab-ctl reconfigure生效配置,gitlab-ctl start启动。
如果要想发邮件的话还要配置第三方邮件 vim /etc/gitlab/gitlab.rb

gitlab_rails['smtp_enable'] = true 
gitlab_rails['smtp_address'] = "smtp.exmail.qq.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "***#**"
gitlab_rails['smtp_password'] = "**************"
gitlab_rails['smtp_domain'] = "qq.com"
gitlab_rails['smtp_authentication'] = :login 
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
gitlab_rails['gitlab_email_from'] = "***#**"
user["git_user_email"] = "***#**"

然后生效重启,打开http://<你的服务器IP>:60200访问,

Jenkins

准备工作:

wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u151-b12/e758a0de34e24606bca991d704f6dcbf/jdk-8u151-linux-x64.tar.gz"
tar xzvf jdk-8u151-linux-x64.tar.gz -C /usr/local/  
vim /etc/profile #(加入环境变量)
    export JAVA_HOME=/usr/local/jdk1.8.0_151
    export PATH=$JAVA_HOME/bin:$PATH

退出,source /etc/profile 生效,用 java -version 验证是否装好java。

开始安装:

curl -O http://mirrors.jenkins.io/war-stable/latest/jenkins.war 下载Jenkins,
nohup java -jar jenkins.war –httpPort=60203 & 后台启动并指定端口。
至此,Jenkins安装成功,可以用浏览器打开 http://<你的服务器ip>:60203
然后安装必要的插件(会提示你),依次点击 “系统管理” “管理插件”。
切换到“可选插件”,分别搜索“GitLab Plugin”和“Git Plugin”,然后点击“直接安装”。如果在“可选插件”里没有搜到,可能自带安装了

Node

apt-get update
apt-get install -y build-essential curl
curl -sL https://deb.nodesource.com/setup_8.x | bash 
apt-get install -y nodejs
node -v
v8.9.2
npm -v
5.5.1

Rsync

这个服务器主要使用Rsync来发布文件,所以不需要特殊配置,一般Linux都默认安装了,如果没有,则使用 apt-get install rsync。然后配置Rsync密码

echo "123" >> /etc/rsync.password
chmod -R 600 /etc/rsync.password

服务器B

Node

如A

PM2

npm install -g pm2
pm2 -v
2.8.0

Rsync

为了安全性不要直接使用ssh账号密码或者公钥私钥,而是构建Rsync服务。vim /etc/rsyncd.conf,修改配置,下面的配置只是一个示例,生产环境还要更安全的策略。

##rsyncd.conf start##
uid = root
gid = root
use chroot = yes
max connections = 200
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
hosts allow = * 
hosts deny =10.0.8.9
auth users = backuser
secrets file = /etc/rsync.password
[webapp]
path = /var/webapp/

上面的的路径path不存在则需要创建 mkdir /var/webapp
echo “backuser:123” >> /etc/rsync.password 添加账号和密码,密码要与客户端(A)一直
chmod -R 600 /etc/rsync.password 修改权限
rsync –daemon 以守护进程方式来启动rsync服务
chkconfig rsync on将此服务设置成为开机自启动

应用开发

用express开发一个 hello world 作为演示,在本地工程目录

npm init #(按照提示输入参数)
npm install express --save  #(安装express)

然后创建app.js

var express = require('express');
var app = express();

app.get('/', function (req, res) {
  res.send('Hello World!');
});

var server = app.listen(3000, function () {
  var host = server.address().address;
  var port = server.address().port;

  console.log('Example app listening at http://%s:%s', host, port);
});

node app.js 运行,然后http://localhost:3000/ 会得到 hello world

新建app.json

{
    "apps" : [
        {
            "name"        : "app",
            "script"      : "app.js",
            "log_date_format"  : "YYYY-MM-DD HH:mm:SS",
            "env": {
                "NODE_ENV": "production"
            },
            "watch" : [
                "app.js",
                "router",
                "util"
            ],
            "ignore_watch" : [
                "logs",
                "node_modules",
                "test"
            ]
        }
    ]
}

将代码上传至服务器B,然后 pm2 start app.json 运行 即可在浏览器访问 http://B-ip:3000 得到 hello world

持续集成和自动部署

配置 Gitlab

首次登陆的密码是会提示你去服务器找,用户是root,然后修改你的用户账号信息,添加你自己常用的电脑上的git公钥。
创建一个新项目 webapp ,创建好过后项目会显示该项目对应的用户信息(会提示你修改)

Git global setup

git config --global user.name "MageekChiu"
git config --global user.email "mageekchiu@mail.**.cn"

在本地项目目录下,新建 .gitignore 文件(window 要用 命令行 rename才可以)

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr

node_modules/

然后执行

git init
git remote add origin git@A-ip:root/webapp.git
git add .
git commit -m "Initial commit"
git push -u origin master

即可提交服务器仓库,以后每次修改都要

git add .
git commit -m "修改备注"

配置 jenkins

首先配置GitLab插件:

打开GitLab,点击“setting”——“Account”,复制“Private token”,或者应该首先生成personal access token。
打开Jenkins,点击“系统管理”——“系统设置”,点击“配置”下拉框,点击“Gitlab”选项配置GitLab
Connection Name 随便,如 gitlab,“Git Host URL”填GitLab的访问地址,
然后Credentials点“Add”——“jenkins”,在弹出框里,“kind”选择“GitLab API Token”,将先前复制的“Private token”粘贴到“API token”输入框中,然后点击“Add”,添加后,Credentials选择刚刚新建的gitlab,
最后点击“test connection”,看到“Success”就成功了。然后点击页面底下的“apply”,再点击“save”

然后配置Git插件:

需要注意的是装Jenkins的机器上一定要装git: apt-get install git 这样Jenkins才能去 gitlab 拉取文件。
打开Jenkins,点击“系统管理”——“系统设置”,点击“配置”下拉框,选择“Git plugin”选项,设置Git插件的全局配置,填入上面的 global setting 如 global user.name等,然后点击“apply”——“save”

成访问Gitlab的ssh秘钥:

打开GitLab,点击右上角的“setting”—— SSH Keys,就可以进入到添加界面。
在jenkins所在服务器上生成密钥
ssh-keygen -t rsa -C “root@<你服务器的ip地址>” -b 4096
ssh-keygen -t rsa -C “root@” -b 4096
全部按 Enter 使用默认值,这会生成一对公钥和私钥。打开公钥复制到gitlab的添加界面,然后点击“add key”,并记住私钥的存放路径。

创建一个Jenkins Job:

直接点新建,“item name”可以随便起,然后点击“构建一个自由风格的软件项目”,点击“OK”,至此,创建一个Job成功了。然后配置这个job,选择“源码管理”,选择“Git”,然后去GitLab中复制项目地址,粘贴到“Repository URL”,然后点击“credentials”后面的“Add”按钮

在弹出页面里面:
● Kind 选择 SSH Username with private key
● Username 填 root
● PrivateKey 选择 From a file on jenkins master ,然后将服务器的 私钥的存放路径(/root/.ssh/id_rsa ) 粘贴进去
然后点击“Add”,在“credentials”里选择我们刚刚创建的认证方式。如果没报错,说明成功了,点击页面底部的“apply”。如果出错了,会在“Repository URL”和“Credentials”之间显示红色的错误信息。

选择 构建触发器:
选择 Build when a change is pushed to GitLab. 记住这个 GitLab CI Service URL ,点击高级
Secret token 那一行下面 点击 generate。记住这个token
选择 构建:
选择 execute shell

npm install 
WEB_SERVER_IP=B的ip
PROJECT=webapp/
rsync -arqz --delete-before $WORKSPACE/ $WEB_SERVER_IP::$PROJECT --exclude ".git" --password-file=/etc/rsync.password 

这一段代码的主要目的是构建,并分发代码,如果有多个应用服务器就要分发到多个服务器上。

配置gitab的webhook:

点击webapp 项目下面的setting的integrations 输入刚才的 GitLab CI Service URL 和 Secret Token
然后点击add webhook ,再测试一下选择 push events 如果显示Hook executed successfully: HTTP 200 即成功,然后在jenkins里面查看是有一次构建记录的。

这样jenkins就会在代码发生变化时自动拉取代码到本地,构建,然后用rsync分发给各个应用服务器,结合PM2的watch功能实现自动发现代码更新并重启的功能,达到自动部署的目的

最终效果测试

修改代码,把hello world改为hello gitlab+enkins然后 add、commit、push 。在A上面gitlab有提交记录,jenkins有构建记录,在B上面用 pm2 ls 发现项目是restart了,浏览器查看也变成hello gitlab+enkins 了。
尝试成功!
虽然这个配置比较麻烦,但是持续集成和自动部署的带来的好处是更大的:代码有版本管理,可以快速迭代、快速回滚,同时保持高质量、自动多机部署防止人工错误,每次构建都有记录,构建幂等……

后记

这个过程已经比较自动化了,但是还是有太多的环境搭建过程,比如webapp一般都会用到mysql、redis、MongoDB等等,一个更自动化的过程应该引入docker,这方面以后有机会再尝试。

使用rsync完成内网数据备份

最近在搞公司内网数据备份,在此记录下。拓扑如下:

未分类

环境描述:web服务器为lnmp环境,其中attachment目录是用户数据,大约有300G,很重要。mysql服务器每天零时备份数据库,备份的数据也需要推到异地。备份软件选用rsync,原因如下:

能更新整个目录和树和文件系统;
有选择性的保持符号链链、硬链接、文件属于、权限、设备以及时间等;
对于安装来说,无任何特殊权限要求;
对于多个文件来说,内部流水线减少文件等待的延时;

只同步增加的数据,效率更高;

搭建过程:

1,rsync服务端安装:

[root@backup ~]# rpm -qa rsync 
rsync-3.0.9-18.el7.x86_64

这里已经安装rsync,如果没有安装,则使用下面的命令安装:

[root@backup ~]# yum install rsync -y

2,编辑rsync配置文件:

由于我是使用daemon模式去启动rsync,因此需要一个配置文件,位置为/etc/rsyncd.conf,以下是配置文件的内容:

# Rsync configuration file
uid = root
gid = root
port = 873
address = 192.168.1.222
max connections = 200
use chroot = yes
timeout = 200
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log format = %t %a %m %f %b
auth users = bkuser
secrets file = /etc/rsyncd.secrets

[attachment]
path = /backup/1/attachment/
comment = "Poplar web data"
list = yes
read only = no
ignore errors = yes
hosts allow = 192.168.1.126/24
hosts deny = *


[dbm]
path = /backup/1/mysql/db.pop.cn/
comment = "database backup"
list = yes
read only = no
ignore errors = yes
hosts allow = 192.168.1.137/24
hosts deny = *

3,创建相应的模块挂载点:

由于数据量比较大,所以我加了一块2T的磁盘单独做备份,挂载点为/disk/1,同时为了防止数据误删,我又在/下创建了backup目录,通过这个入口去链接真正的备份数据。结构如下:

[root@backup ~]# mkdir /backup
[root@backup ~]# mount /dev/sdb /disk/1/        #把2T的磁盘挂载到/disk/1/下
[root@backup ~]# ln -sv /disk/1/ /backup/1        #将/backup/1链接到/disk/1/
  ‘/backup/1’ -> ‘/disk/1/’

4,设置服务器端权限:

[root@backup ~]# echo ‘bkuser:123456’ > /etc/rsyncd.secrets
[root@backup ~]# chmod 600 /etc/rsyncd.secrets

这里一定要将密码权限设置为600,否则后面推送文件时会报错。

5,启动rsync服务:

[root@backup ~]# rsync --daemon --config=/etc/rsyncd.conf
#检查rsync启动情况
[root@backup ~]# netstat -tnlp | grep rsync 
tcp        0      0 192.168.1.222:873       0.0.0.0:*               LISTEN      1073/rsync 
[root@backup ~]# ps -ef | grep -v grep | grep rsync 
root      1073     1  0 03:51 ?        00:00:00 rsync --daemon --config=/etc/rsyncd.conf

可以看到rsync服务已经启动成功。

6,设置rsync开机自启动:

[root@backup ~]# echo '/usr/bin/rsync --daemon --config=/etc/rsyncd.conf' >> /etc/rc.d/rc.local
#这里要注意,/etc/rc.d/rc.local这个文件一定要有可执行权限 chmod +x /etc/rc.d/rc.local
#尽量使用命令的绝对路径。

7,客户端配置权限:

#web主机
[root@web ~]# echo '123456' > /etc/rsync.passwd
[root@web ~]# chmod 600 /etc/rsync.passwd

#mysql主机
[root@mysql ~]# echo '123456' > /etc/rsync.passwd
[root@mysql ~]# chmod 600 /etc/rsync.passwd

8,客户端推送命令:

[root@web ~]# rsync -avz /mnt/wwwroot/poplar/public/attachment/ [email protected]::attachment --password-file=/etc/rsync.passwd 
rsync: failed to connect to 192.168.1.222 (192.168.1.222): No route to host (113)
rsync error: error in socket IO (code 10) at clientserver.c(122) [sender=3.0.9]

报错,No route to host,首先想到的就是防火墙,查看rsync服务端:

[root@backup ~]# iptables -L 
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere            
INPUT_direct  all  --  anywhere             anywhere            
INPUT_ZONES_SOURCE  all  --  anywhere             anywhere            
INPUT_ZONES  all  --  anywhere             anywhere            
DROP       all  --  anywhere             anywhere             ctstate INVALID
REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited
#果然有策略
[root@backup ~]# iptables -F
[root@backup ~]# service iptables save
The service command supports only basic LSB actions (start, stop, restart, try-restart, reload, force-reload, status). For other actions, please try to use systemctl.
#又报错,这里需要安装iptables-services服务
[root@backup ~]# yum install iptables-services
[root@web ~]# systemctl enable iptables 
Created symlink from /etc/systemd/system/basic.target.wants/iptables.service to /usr/lib/systemd/system/iptables.service.
[root@web ~]# systemctl start iptables 
[root@web ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]

#再次推送:
[root@web ~]# rsync -avz /mnt/wwwroot/poplar/public/attachment/ [email protected]::attachment --password-file=/etc/rsync.passwd 
...
sent 1044543 bytes  received 9553 bytes  2108192.00 bytes/sec
total size is 4351974  speedup is 4.13
#推送成功

查看服务器端备份情况:

[root@backup ~]# ll /backup/1/attachment/
#发现有一个软链接文件的源文件没有同步过来(不停的闪红色)

查看rsync的帮助信息:

-L, --copy-links            transform symlink into referent file/dir

使用-L 选项可以备份软链接文件的源文件,于是我们的推送命令变成了这样:

[root@web ~]# rsync -avzLP /mnt/wwwroot/poplar/public/attachment/ [email protected]::attachment --password-file=/etc/rsync.passwd

数据库端的推送命令和web端类似,只是不需要-L参数,这里就不演示了。

文件同步利器:rsync

在Linux上操作时,可能会有误删的情况,或者是我们在折腾了一顿(增删查改)之后有点小后悔,想对一个小时或者一天前的文件进行“回滚”恢复,那该怎么去做呢?rsync便是不二之选。

大家都知道,对文件的移动、复制常用的操作命令有mv、cp及scp。其中,mv是移动文件命令,将一个文件或文件夹从一个父目录移动到另一个父目录下,如果不改变父目录则起到的效果相当于重新名。cp是本地复制命令,scp则可以实现远程复制。相比之下,rsync实现的效果要比它们复杂的多,而且更有效率。在终端输入rsync命令可以看到它的简单介绍,rsync是一个文件同步工具,使用了高效的“rsync算法”,可以用于类unix系统下的数据镜像备份。

未分类

rsync命令介绍

rsync命令遵循如下格式:

rsync [option] source destination

其中,source和destination各自都可以分为local和remote形式,因此可以实现从本地到本地、从本地到远程(push模式)、从远程到本地(pull模式)。

从本地到本地:
rsync -a /src /dest
从本地到远程:
rsync -a /src user@remote:/dest
从远程到本地:
rsync -a user@remote:/src /dest

未分类

参数option有多种选择,常用的有以下几种,其他详见命令帮助:

-r:递归(recursive)备份所有子目录下的文件
-a:归档(archive)模式,相当于-rlptgoD,递归备份所有子目录下的文件,保留链接、档案的拥有者、群組、权限以及时间戳
-v:verbose模式,输出比较详细的信息
-z:启用压缩

rsync使用介绍

在使用rsync时,服务端和客户端都必须安装rsync服务。有两种模式:

  • rsync-daemon认证模式,使用TCP直接连接,需要服务端启动rsync,同时配置rsync配置文件。客户端不需要启动rsync。
  • ssh认证模式,使用远程shell程序(如ssh或rsh)进行连接,不需要双方配置rsync配置文件,并且也不需要双方启动rsync。

ssh认证模式操作较简单。

首先,需要配置ssh实现本地端免密码登录远程端,这样以后省去输入ssh登录远程端密码的步骤:

使用”ssh-keygen -t rsa”命令生成本地端公钥id_rsa.pub,将其上传到远程端并修改为authorized_keys。
然后,将你要备份的文件推送到远程机上:

rsync -avz /dir/ user@remote:/home/user/backup

举个例子:

未分类

【命令使用】rsync跳过大目录

rsync命令的介绍和使用方法不在此介绍,本处仅记录在使用时如何跳过不想要的大目录。背景如下:

1、ubuntu服务器新增了1T硬盘;

2、需要同步原有home目录下的用户目录到新硬盘挂载的硬盘目录(/home2);

3、同步时跳过某一个用户(test)目录下的大文件目录(T3),需要跳过的目录全路径为”/home/test/T3″;
此时可以使用rsync的–exclude命令实现。直接上命令:

[html] view plain copy print?
sudo rsync -aux --exclude "test/T3" /home/ /home2/  

需要注意的是–exclude之后的目录需要写相对路径(如例中的相对于/home目录的相对路径),而不能是全路径,否则无法跳过。

rsync命令快速删大文件

问题

很多情况下我们会遇到服务器日志目录几十个G,或者附件目录过大的情况,如果我们使用常规的rm命令来进行删除的话,会非常慢。

但是rsync命令提供了这样一个功能,可以秒删。通过同步指令的–delete-before来删除目录

原理

将空目录同步至非空目录

解决方案

首先新建立一个空目录empty_dir,然后将空目录的内容同步到非空目录。

rsync --delete-before -a -H -v --progress --stats /www/webdev/newhouse/house/empty_dir /www/webdev/xxx.com/house/log

相关命令如下

--delete-before         receiver deletes before transfer (default)
--delete-during         receiver deletes during xfer, not before
--delete-delay          find deletions during, delete after
--delete-after          receiver deletes after transfer, not before