在服务器上创建git服务器实现自动部署

166 阅读6分钟

最近一直想搭建一个个人博客,最终选择了vuepress,折腾了几天终于在本地把博客搭建起来了,于是,打算把博客部署到服务器上去,这样在哪都可以访问了。

前提

购买服务器

购买服务器,像阿里云、腾讯云、天翼云等,最好是在做活动时购买(便宜),我买的是天翼云的(更便宜)。然后配置你的服务器,安全组要打开,系统推荐选CentOS 和 Ubuntu的。这里也是以Ubuntu系统开始的。

登录服务器

Ubuntu系统不像Windows系统那样可以直接登录看见桌面,全都是使用命令行来进行操作,所以基本的linux命名你要看一下。

使用命令远程连接服务器:

打开本地终端使用ssh命令登录远程服务器,后面跟你的服务器地址。root是当前用户名。

$ ssh root@180.100.xxx.xxx

使用工具登录:

推荐使用 Xshell 和 Xftp两个工具进行连接,Xshell是通过shell脚本命令来进行连接和操作云服务器,Xftp桌面化连接和操作,两个是一家的,搭配使用很清晰。

注意:登录时要看清楚你的用户名是root还是ubuntu或是其他的。

安装常用工具

1、安装node:

sudo apt-get install nodejs 
sudo apt install nodejs-legacy 
sudo apt install npm 

更新npm的包镜像源,方便快速下载

sudo npm config set registry https://registry.npm.taobao.org
sudo npm config list

全局安装n管理器(用于管理nodejs版本)

sudo npm install n -g

安装最新的nodejs(stable版本)

sudo n stable
# 检查是否安装成功
node -v
npm -v

node安装完后在服务器上也可以像在自己电脑上安装各种依赖了

2、安装webpack

sudo npm install webpack-cli -g
sudo npm install webpack -g

3、安装git与ssh

sudo apt-get install git
sudo apt-get install ssh

4、安装nginx

sudo apt-get install nginx
# 检查是否安装成功
nginx -v

安装好的文件位置:

/usr/sbin/nginx:主程序
/etc/nginx:存放配置文件
/usr/share/nginx:存放静态文件
/var/log/nginx:存放日志

默认的html文件位置:

/var/www/html

如果这时使用 sudo nginx 启动nginx大概就可以访问你的地址了。

nginx配置:

nginx安装完成后,文件/etc/nginx/nginx.conf 是基本配置,我们可以对其进行修改,在里面添加server开启服务。也可以通过修改/etc/nginx/conf.d/default.conf 配置来开启服务的,它会默认替换其他配置文件里的配置。有时候会发现 /etc/nginx/conf.d 下什么也没有,这时我们可以自己创建一个 default.conf 文件。

自定义default.conf 配置

#这是最基本的开始服务配置,其他可以自行添加,像本地配置一样
server {
    #服务启动时监听的端口
    listen 3000 default_server;
    #服务启动时文件加载的路径
    root /home/gitname/www/blog; #后面git自动部署项目文件所放地址
    #默认加载的第一个文件
    index index.html index.htm index.nginx-debian.html;
    #页面访问域名,如果没有域名也可以填写_
    server_name localhost;

    location / {
        #页面加载失败后所跳转的页面
        try_files $uri $uri/ =404;
    }
    
}

nginx基本命令(全局)

启动nginx 服务

sudo nginx

重启nginx 服务

# 每次更改好执行一次
sudo nginx -s reload

快速停止nginx 服务

sudo nginx -s stop

正常停止nginx 服务

sudo nginx -s quit

查看nginx是否在运行

sudo -aux | grep nginx

服务器git使用

服务器拉取github代码

安装好git后,如果要在服务器拉取github仓库的代码,我们可以像在自己本机电脑一样配置git

配置个人信息:

git config --global user.name "Your Name"
git config --global user.email "your_email@example.com"

检查是否有ssh:

$ cd ~/ .ssh
$ ls
> authorized_keys  id_rsa  id_rsa.pub  known_hosts

我们需要寻找一对以 id_dsaid_rsa 命名的文件,其中一个带有 .pub 扩展名。 .pub 文件是公钥,另一个则是与之对应的私钥。 如果找不到这样的文件(或者根本没有 .ssh 目录)就需要自己自己创建ssh。

 创建SSH秘钥:

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

输入这个命令后里面需要输入的都不用输入,直接回车。完成后注意里面的路径地址就是秘钥文件所在的地址 一般 /root/.ssh 下。

查看公钥:

$ cat ~/.ssh/id_rsa.pub
> ssh-rsa XXXXXXXXXXXX... == Your Email Address

添加公钥:

公钥创建好后就可以把这个公钥添加到github上去,登录自己的GitHub,进入点击 Settings点击 SSH and GPG keys  然后 点击 New SSH key 随便起一个名字,把复制的公钥添加上去,保存OK。

一个GitHub账号可以添加多个公钥。我们可以把我们使用的多台电脑都可以添加上去,添加好后在服务器上就可以大胆的拉取我们github仓库的代码了。

在服务器搭建自己的git服务器

在自己的电脑配置git服务器,就可以像GitHub一样在服务器创建自己的仓库,把代码直接提交到服务器上,这样涉及到一些公司隐私的项目就可以放进来了,并且还能通过这实现自动部署。

1、创建git用户:

sudo adduser gitname   # gitname名字

Adding user `gitname' ...Adding new group `gitname' (1006) ...Adding new user `gitname' (1006) with group `gitname' ...Creating home directory `/home/gitname' ...Copying files from `/etc/skel' ...
New password: xxxxxx
Retype new password: xxxxxx
passwd: password updated successfully
Changing the user information for gitname   # 后面直接回车
Enter the new value, or press ENTER for the default
	Full Name []: 
	Room Number []: 
	Work Phone []: 
	Home Phone []: 
	Other []: 
Is the information correct? [Y/n] y

可以看到我们的创建的git用户直接保存到 /home 下了。

git用户创建好了,我们需要像上面那样,为我们本机和git服务器做一个连接,把本机的公钥添加到git服务器上,这样每次提交就不需要输入密码了。(如果没有把公钥添加上去,就算在本机连接到了git服务,输入密码时也可能会报错。)

2、为git服务器创建.ssh

$ cd /home/gitname #进入git用户根目录
$ sudo mkdir .ssh  #创建.ssh文件
$ sudo touch .ssh/authorized_keys #在.ssh 下创建authorized_keys文件

authorized_keys文件创建好后,就可以把本机的 .pub 公钥复制到 authorized_keys 中了,这其中也可以添加多台机子的公钥。

3、创建仓库

在创建仓库前一定要先切换到当前的git用户,否则后续上传代码时会一直报错无法连接。

$ sudo su gitname #切换git用户
$ cd /home/gitname  #进入你的gitname文件
$ mkdir bare # 创建一个文件夹(名字随便)
$ cd bare # 进入
$ git init --bare bare.git #初始化该新的空仓库
> Initialized empty Git repository in /home/gitname/bare/bare.git/

对 git init 命令添加 --bare 参数表示初始化 Git 仓库的时不要创建本地工作目录,相当于以前 .git 文件夹下的所有内容直接创建到当前目录下,而不是被放到 .git 目录下。

现在远程仓库创建好了,git仓库的地址就是 gitname@180.100.xxx.xxx:/home/gitname/bare.git 

我们只需要在本机关联git仓库进行操作就行了

git init
git remote add server gitname@180.100.xxx.xxx:/home/gitname/bare/bare.git
git add .
git commit -am "server init"
git push server master

4、实现自动部署

git仓库已经搭建好了,如何实现自动部署呢,使用 Git 钩子,Git 钩子(hooks)是在 Git 仓库中特定事件(certain points)触发后被调用的脚本。通过钩子可以自定义 Git 内部的相关(如 git push)行为,在开发周期中的关键点触发自定义的行为。Git 含有两种类型的钩子:客户端的和服务器端的。客户端钩子由诸如提交和合并这样的操作所调用,而服务器端钩子作用于诸如接收被推送的提交这样的联网操作。

配置git hook

第一种方法:

$ cd /home/gitname/bare/bare.git/hooks  #进入bare仓库的hooks文件
$ cp post-update.sample post-update  #复制并重命名post-update.sample文件
$ vim post-update   #编辑post-update文件,添加执行脚本

post-update内容配置:

下面大概意思是,指定一个目录 /home/gitname/www/blog/,连接gitname/bare.git远程仓库,拉取代码,然后再进行其他一些操作。

#!/bin/sh
unset GIT_DIR 
DIR_ONE=/home/gitname/www/blog/  #此目录是自动更新的项目目录,放在gitname下
cd $DIR_ONE

git init
git remote add origin /home/gitname/bare/bare.git  #添加远程gitname的仓库
git clean -df
git pull origin master

#拉取代码后进行一些build或者部署操作
# npm i
# npm run build
# pm2 restart xxx  #pm2重启项目即可
# sudo nginx -s reload # nginx重启

如果提交代码时提示git仓库已经初始化过了,我们可以再次修改把 git init 和 git remote add origin /home/gitname/bare/bare.git  命令去掉。或者每次提交使用 rm -rf .git 把git仓库清空再重新拉取。

配置好之后修改一下 post-update的权限

$ chmod +x post-update

第二种方法:

直接修改hook文件下的 post-receive 文件,直接拉取代码。

$ cd /home/gitname/bare/bare.git/hooks  #进入bare仓库的hooks文件
$ vi post-receive  # 编辑post-receive 执行拉取代码

post-receive写入如下内容:

#!/bin/sh
git --work-tree=/home/gitname/www/blog --git-dir=/home/gitname/bare/bare.git checkout -f

配置好之后修改一下 post-update的权限

$ chmod +x post-receive

上面两种方法任意选择一种后,然后再执行最后一步操作

$ exit  # 退出当前git用户,切换到root
$ chown -R gitname:gitname /home/gitname/bare/bare.git # 添加权限

git hooks添加好了,在本地仓库添加远程仓库源之后,一旦本地仓库变更提交就会触发 Git 钩子,驱动自动部署。

可能会出现的错误

在本地客户端连接远程git仓库后,push提示报错 

kex_exchange_identification: Connection closed by remote host
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.

 很多说法是通过ssh登录服务器没有使用 exit 命令进行正确退出,导致连接进程增多,ssh登录进行了限制,无法正确登录,最简单的办法就是重启服务器,要么找出进程一个一个 kill 掉。要么就是增大服务器的连接次数,但几种办法都尝试了,似乎 git 的这个错误和这无关。后来知道可能是没有重启 sshd 或者根本就没有开启。

修改: 

vi /etc/hosts.allow

修改为 sshd:ALL  但一般不用修改。

然后重启 sshd

sshd
service sshd restart

解决密码过期问题:

# 查看过期
chage -l root
# 修改过期时间
chage -m 0 root
chage -M 99999 root  # 修改后密码永不过期

linux常用命令

sudo 命令是以管理者身份进行操作,有时候没有权限进行操作就需要加上sudo命令来操作。

创建文件夹:

sudo mkdir file

创建文件:

sudo touch test.txt
sudo touch default.conf

列出目录所以文件:

ls -al

删除文件:

rm -rf file  # 注意使用

查看当前工作目录路径:

pwd

vim编辑文件:

vi 进入编辑页面,按 i 编辑,编辑好后按 esc 退出编辑,输入 :wq退出,加上 ! 强制退出

链接:45个常用Linux命令

参考链接:

在个人服务器上搭建git服务,创建属于自己的私人仓库

阿里云 搭建Git服务器

搭建 Hexo 博客并使用 Git Hook 自动部署到阿里云

阿里云服务器(1、nginx配置实战)

设置私有 Git 服务器

用 Git 钩子进行简单自动部署