go项目部署
都说项目部署难倒一大片英雄好汉 今天我一节课把这些知识点都给你讲清楚 这也是我最喜欢go的一大原因 因为相比其他语言的部署,go的部署是最简单的 后端部分 后端开发完成之后,只需要编译为li
go项目部署
发布时间:2024-04-16 (2024-04-16)

都说项目部署难倒一大片英雄好汉

今天我一节课把这些知识点都给你讲清楚

这也是我最喜欢go的一大原因

因为相比其他语言的部署,go的部署是最简单的

后端部分

后端开发完成之后,只需要编译为linux环境下的可执行文件即可

如果是windows下开发,执行以下命令即可

SET CGO_ENABLED=0
set GOARCH=amd64
set GOOS=linux
go build -o main
set GOOS=windows

然后将这个打包好的文件,和settings.yaml一起放入服务器

这是我的服务器对应的目录

opt
  gin-vue-docs
    server
      main // 后端打包之后的文件,放上服务器上记得执行 chmod +x main
      settings.yaml
      uploads  // 后端的一些用户上传文件目录
      gvd_db_20230826.sql
      gvd_server_full_text_index_20230826.json
    web
      dist // 前端打包之后的目录
    gvd_server.ini
    nginx.conf

先cd到/opt/gin-vue-docs/server

cd /opt/gin-vue-docs/server

mysql环境搭建

docker pull mysql:5.7

mkdir -p ./mysql/conf ./mysql/datadir

docker run -itd --name mysql --restart=always -p 3306:3306 -v /opt/gin-vue-docs/server/mysql/conf:/etc/mysql/conf.d -v /opt/gin-vue-docs/server/mysql/datadir:/var/lib/mysql -e  MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=gvd_db mysql:5.7

创建一个gvd_db 的数据库,root密码是root,端口映射为本机的3306映射到容器的3306

如果你已经有mysql服务了,那你换一个端口就行了,在对应的settings.yaml配置文件修改就ok了

redis环境搭建

docker pull redis:5.0.5

docker run -itd --name redis --restart=always -p 6379:6379 redis:5.0.5 --requirepass "redis"

redis的密码是redis

es环境搭建

mkdir -p es/config & mkdir -p es/data & mkdir -p es/plugins
chmod 777 es/data
echo "http.host: 0.0.0.0" > es/config/elasticsearch.yml

docker run --name docs_es -p 9200:9200   -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms84m -Xmx512m" -v /opt/gin-vue-docs/server/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /opt/gin-vue-docs/server/es/data:/usr/share/elasticsearch/data -v /opt/gin-vue-docs/server/es/plugins:/usr/share/elasticsearch/plugins -d elasticsearch:7.12.0

settings文件

因为上面搭建环境,相关的配置已经写死了

所以难得改配置文件的,直接复制这个内容到settings.yaml就行了

system:
    ip: 127.0.0.1
    port: 8082
    env: dev
mysql:
    host: 127.0.0.1
    port: 3306
    config: charset=utf8mb4&parseTime=True&loc=Local
    db: gvd_db
    username: root
    password: root
    logLevel: error
redis:
    ip: 127.0.0.1
    port: 6379
    password: "redis"
    poolSize: 100
es:
    addr: http://127.0.0.1:9200
    user: 
    password: 
jwt:
    expires: 8
    issuer: fengfeng
    secret: uis&*jb123
site:
    title: fengfeng docs
    icon: https://docs.fengfengzhidao.com/static/avatar/zzf-1.png
    abstract: |-
        枫枫知道官方文档,致力于帮助更多的人学好知识
        哔哩哔哩视频总播放量突破10w
        文档浏览量突破3w
        越来越多的人,开始了解枫枫知道
    iconHref: <img src="https://img.shields.io/badge/fengfengdoc-3.0.1-red"><img src="https://img.shields.io/badge/%E6%9E%AB%E6%9E%AB%E7%9F%A5%E9%81%93-6.0.2-brightgreen"><img src="https://img.shields.io/badge/python-3.8.6-yellowgreen"><img src="https://img.shields.io/badge/golang-1.19-orange">
    href: ""
    footer: ""
    content: "# Fengfeng-docs 枫枫知道官方文档\n\n\U0001F30D\n[简体中文](README.md)\n\n一份很全面的全栈知识文档\n包含`前端`、`python`和`golang`,适合零基础入门的同学。\n\n![image](https://img.shields.io/badge/fengfengdoc-2.0.1-red) [![image](https://img.shields.io/badge/%E6%9E%AB%E6%9E%AB%E7%9F%A5%E9%81%93-6.0.2-brightgreen)](http://www.fengfengzhidao.com/) ![image](https://img.shields.io/badge/python-3.8.6-yellowgreen) ![image](https://img.shields.io/badge/golang-1.19-orange)\n\n## 文档包含:\n\n- python基础文档\n- vue基础文档\n- django基础文档\n- django博客开发文档\n- golang基础文档\n- gin框架文档\n- gorm基础文档\n\n\n\n## 问题相关\n\n有任何问题请添加我的联系方式 2974771769(qq).我会尽快解答.\n\n\n## 打赏\n\n如果您觉得本文档对您有所帮助,欢迎您请我喝杯咖啡,您的支持是我最大的动力,您可以扫描下方二维码为我进行打赏,谢谢。"

导入数据

这个时候,执行 ./main 就能看到东西了

主意这个时候,mysql里面没有表,es里面没有索引,我们需要导入数据

./main -load gvd_db_20230826.sql
./main -esload gvd_server_full_text_index_20230826.json

supervisor

如果你的后端服务,本身是没有操作docker的话,那么可以直接将你的后端程序直接构建为镜像,然后直接在容器里面运行

不过我比较需要在外面运行,我们需要一个程序将我们的服务稳定运行下去,如果出现程序错误,服务器重启,它能够帮助我们重启项目

它就是supervisor

安装

# 安装第三方源,CentOS本身的yum源中没有supervisor,需要更换第三方源:
yum install epel-release -y
# 安装supervisor:
yum install -y supervisor

# 启动supervisor 服务、查看supervisor 服务状态
systemctl start supervisord
# 开机启动
systemctl enable supervisord
[program:gvd_server]
command= /opt/gin-vue-docs/server/main
directory=/opt/gin-vue-docs/server
autorestart=true
autostart=true
stderr_logfile=/opt/gin-vue-docs/server/err.log
stdout_logfile=/opt/gin-vue-docs/server/out.log
environment=ASPNETCORE_ENVIRONMENT=Production
user=root
stopsignal=INT
startsecs=1
stopasgroup=true
killasgroup=true

将这个文件复制到 /etc/supervisord.d/ 目录

# 加载新的服务,ini文件有变化都要执行这个
supervisorctl reload
# 查看服务状态
supervisorctl status
# 重启服务
supervisorctl restart

然后后端部分就可以不用管了

前端部分

直接npm run build

将打包后的 dist目录扔到服务器上即可

nginx配置

如果没有安装nginx,可以推荐先安装nginx

特别不推荐小白一开始就用nginx容器部署项目

因为涉及到两个新的知识,一个nginx,一个docker

搜索nginx安装,网上有一堆教程是教怎么进行源码安装的,搞得那么复杂,其实像nginx这种很广为人知的软件,直接使用yum就可以安装了

yum install -y nginx

配置文件 /etc/nginx/nginx.conf

这个是nginx的主配置文件,我们要在它里面引入其他的配置文件

如果有默认的,要把它删掉

注意,其他地方我省略了

user root;  

http {
    include /etc/nginx/conf.d/*.conf;
    include /opt/*/*.conf;
}

项目的nginx.conf

有域名的话,那个server_name 就写你的域名,子域名也可以

没有就写ip,或者不写,顺便写一个也可以

server {
    listen       80;
    server_name  doc.fengfengzhidao.com;

    location / {
      try_files $uri $uri/ /index.html;  # 解决刷新404问题
      root   /opt/gin-vue-docs/web/dist;
      index  index.html index.htm;
    }

    location /api/ {
      # rewrite ^/(api/.*) /$1 break;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header REMOTE-HOST $remote_addr;
      proxy_pass http://127.0.0.1:8082/api/;
    }
    location /uploads/ {
      alias /opt/gin-vue-docs/server/uploads/;
    }

    access_log  /opt/gin-vue-docs/access.log;
    error_log   /opt/gin-vue-docs/error.log;
}

nginx -s reload

执行完成之后,在浏览器中输入服务器ip即可成功看到页面

如果以上这些操作,还是觉得很麻烦,可以使用docker-compose

直接一个命令,部署以上全部环境

编写shell脚本,甚至可以做到一条命令就可以在一套全选的服务器上完成部署

这些知识后续将会讲解到,请持续关注我