【工具】在云服务器上部署项目

目录

直接部署

使用docker和Nginx部署

直接部署

1
2
3
4
5
6
7
前期准备
1.git网站上建库
2.在本地库上初始化git init
3.在本地库上添加所有文件git add .
4.在本地库上初次提交git commit -m "first commit"
5.关联远程库git remote add origin https://gitee.com/kenway20/seckill.git
6.推送到远程库master分支git push -u origin "master"

1.服务器初次部署需要安装go环境

1
apt install golang-go

2.设置云服务器安全组开放入方向的对应端口

3.拉取项目

  • 云服务器执行以下命令切换到工作目录
    1
    cd /home/gowork/gopath
  • clone项目
    1
    2
    3
    git clone xx

    # 默认拉master,若想拉取名为dev的分支用 git clone -b dev xx
  • 进入到项目地址
    1
    cd alumni_platform
  • 安装项目依赖
    1
    2
    3
    4
    go mod tidy

    # 若出现 Get https://proxy.golang.org/github.com/%21puerkito%21bio/goquery/@v/v1.8.0.mod: dial tcp 172.217.163.49:443: i/o timeou这种错误,则说明代理超时
    # 使用go env -w GOPROXY=https://goproxy.cn切换代理后再重新执行
  • 运行项目
    1
    go run cmd/user_web_api/main.go

4.此时就可以通过“主机ip:端口号/xx”来使用接口了

5.后续直接在项目里使用git pull更新,若不想每次都输入账号密码则使用以下命令开启全局git设置

1
2
3
4
git config --global credential.helper store

# 开启这个全局设置后,会在.gitconfig文件中多加[credential]-helper = store,这样只需第一次输入账号和密码就行
# 此时每个项目都有一个.git-credentials文件来记录账号信息

使用Docker和Nginx部署

Docker相关

1.安装docker步骤见本站文章“【工具】Docker的使用”

2.编写Dockerfile并放到项目根目录中(一定要放到根目录下才能执行),以下是一个Dockerfile的demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 从官方仓库中获取 1.17 的 Go 基础镜像
FROM golang:1.17-alpine AS builder

# 设置工作目录
WORKDIR /app

# 设置Go使用module、使用代理和Gin采用上线发布模式(还有debug和test模式)
ENV GO111MODULE=on GOPROXY=https://goproxy.cn,direct GIN_MODE=release

# 切换路径
RUN cd

# 编译镜像时把./app的文件复制到镜像里面
COPY . /app

# 下载go依赖的库
# 1.17版本以下的话要用 go mod download
RUN go mod tidy

# 切换到main文件所在目录,并且用ms_user这个父目录名字作为docker的目标
RUN cd /app/cmd/user_web \
&& CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -o ms_user

# 获取镜像
FROM alpine

# 把上一轮go build编译获得的二进制文件复制到本阶段中,第一行是main文件的路径
COPY --from=builder /app/cmd/user_web/ .
COPY --from=builder /app/internal/configs/config.json ./internal/configs/config.json

# 设置监听的端口号,这个要与你的Gin项目使用的端口号一致
EXPOSE 8080

# 配置启动命令
ENTRYPOINT ["./ms_user"]

3.在服务器上,cd目录到Dockerfile的路径下执行

1
2
3
docker build -t user_web:v1.1 .

# 表示生成一个名为user_web并且tag为v1.1的镜像

4.清理无用镜像

1
2
3
4
5
6
7
8
# 停止容器
docker stop $(docker ps -a | grep "Exited" | awk '{print $1 }')

# 删除容器
docker rm $(docker ps -a | grep "Exited" | awk '{print $1 }')

# 删除镜像
docker rmi $(docker images | grep "none" | awk '{print $3}')

5.启动镜像

1
2
3
docker run -p 8080:8080 -d --name user_web  user_web:v1.1

# 表示用本服务器的8080端口映射容器的8080端口,将运行镜像名为user_web运行的版本为v1.1,运行的容器命名为user_web

6.查看镜像和容器运行状态

1
2
3
4
5
docker images

docker ps

# 若status出现up xx则表示运行正常,已运行xx时间

7.记得在安全组规则添加开放云服务器的8080端口

8.此时就可以用云服务器公网ip地址:8080/xx来使用接口了

9.删除镜像

1
2
3
4
5
6
7
8
# 停止容器
docker stop $(docker ps -a | grep "Exited" | awk '{print $1 }')

# 删除已经停止的容器
docker rm $(docker ps -a | grep "Exited" | awk '{print $1 }')

# 删除镜像
docker rmi [imageId]

10.一键部署Docker的shell脚本

  • build_user_web.sh
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    #! /bin/bash

    echo "first sh statrt"

    # 停止正在运行的容器
    docker stop $(docker ps -a | grep "Up" | awk '{print $1 }')

    # 删除停止的容器
    docker rm $(docker ps -a | grep "Exited" | awk '{print $1 }')

    # 删除名为"user_web"的镜像
    docker rmi $(docker images | grep "user_web" | awk '{print $3}')

    # 切换到my_sense项目路径
    cd /home/gowork/gopath/my_sense

    # 用该目录的Dockerfile打包成镜像user_web,版本号设为v1.1
    docker build -t user_web:v1.1 .

    # 运行user_web:v1.1镜像,生成实例容器user_web
    docker run -p 8080:8080 -d --name user_web user_web:v1.1

    # 删除打包过程中产生的中间镜像<none>
    docker rmi $(docker images | grep "none" | awk '{print $3}')

    echo "first sh end"

定时运行脚本

1.编辑crontab文件,用来存放你要执行的命令(如果是第一次使用该命令还需选打开方式,建议选vim.basic)

1
sudo crontab -e

2.在# m h dom mon dow command这一行下添加要执行的命令,例如

1
2
3
4
5
6
7
8
9
10
11
12
13
0 9 * * * /home/katyusha/code/sendemail.py

# 表示每天的早上9.00执行sendemail.py
# * * * * * command
# 分 时 天 月 周 命令
# 分钟 0 - 59
# 小时 0 - 23
# 天 1 - 31
# 月 1 - 12
# 星期 0 - 6,0表示星期天
# * (星号) 表示任意值,比如在小时部分填写 * 代表任意小时(每小时)
# ,(逗号) 可以允许在一个部分中填写多个值,比如在分钟部分填写 1,3 表示一分钟或三分钟
# /(斜线) 一般配合 * 使用,代表每隔多长时间,比如在小时部分填写 /2 代表每隔两分钟。所以 /1 和 * 没有区别

3.重启cron来应用这个计划任务

1
sudo service cron restart

4.一些命令实例

  • 30 20 * * * date >> /home/date.log //每天的20:30将日期信息追加home目录下的date.log中
  • 5 20 13,14 * * date >> /home/date.log //每月的13日,14日20:5分将日期信息最追加home目录下的date.log中
  • 0,10 10,12 * * * date >> /home/date.log 每天10点至12点之间,隔10分钟将日期信息最追加home目录下的date.log中
  • /5 * * * date >> /home/date.log //每5分钟将日期信息最追加home目录下的date.log中

5.查看cron是否在运行

1
ps -ef | grep cron

6.操作cron服务

1
2
3
4
crontab -l              //查看设置的所有定时任务,其实就是只读方式打开
service crond start //启动服务
service crond stop //关闭服务
service crond restart //重启服务