在线预览地址 https://nav.carolin-violet.cn/

一. 前期准备

  1. 腾讯云服务器 -宝塔Linux面板 8.1.0 腾讯云专享版

  2. 域名,并且备案

  3. 宝塔,并且安装nginx和docker

二. 服务部署

  1. mysql部署

在宝塔面板先拉取mysql镜像,然后运行容器,将3306端口暴露到外部的3307端口(注意腾讯云服务器上防火墙开放3307端口)并选用bridge网络模式,之后在服务器上创建持久化相关的挂载目录,挂载目录如下:

挂载目录

权限

容器目录

/www/docker/mysql/data

读写

/var/lib/mysql

/www/docker/mysql/logs

读写

/var/log/mysql

/www/docker/mysql/conf

读写

/etc/mysql

然后添加环境变量

MYSQL_ROOT_PASSWORD=数据库root密码

容器成功运行后使用本地的navicat直接连接测试,注意使用暴露的3307端口

  1. 后端部署

先在项目根目录添加dockerfile如下:

# 使用 Node.js 官方镜像作为基础镜像
FROM node:14

# 设置工作目录
WORKDIR /usr/src/app

# 复制 package.json 和 package-lock.json 到工作目录
COPY package*.json ./

# 安装项目依赖
RUN npm install

# 复制应用程序文件到工作目录
COPY . .

# 暴露容器端口
EXPOSE 8080

# 服务端口
ENV PORT=8080
# 服务ip
ENV IP=0.0.0.0
# mysql连接地址
ENV MYSQL_HOST=locahost
# 后端路由前缀
ENV API_PREFIX=/violet-nav-api/

# 指定启动命令
CMD [ "node", "app.js" ]

之后在宝塔面板用docker构建镜像并运行容器,将8080端口映射到外部的30002端口并开放腾讯云服务器的30002端口,并将MYSQL_HOST环境变量设置为mysql容器的ip,由于用的bridge模式,所以先查看mysql容器的端口如下:

在启动后端docker容器时将ip设置为172.17.0.4,之后可以用post先测试下接口是否正常、与mysql交互是否正常

  1. 前端部署

思路:前端准备一份dockerfile,并且在服务器上创建个nginx.conf作为docker容器里nginx的挂载目录,使用docker构建了前端镜像后配置nginx代理。

在前端项目根目录创建dockerfile如下:

FROM nginx

WORKDIR /usr/share/nginx/html/
USER root

COPY ./dist/  /usr/share/nginx/html/

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

在服务器的/www/docker/navigation_portal目录下创建nginx.conf文件

使用docker构建镜像并创建容器运行,进行端口映射将80端口映射到外部的30001端口并在腾讯云防火墙放开相应端口,之后进行存储挂载,配置如下

然后到服务器挂载目录的nginx.conf进行配置,主要配置反向代理到后端接口,配置如下,

server {
    listen 80;

    # gzip config
    gzip on;
    gzip_min_length 1k;
    gzip_comp_level 9;
    gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
    gzip_vary on;
    gzip_disable "MSIE [1-6]\.";

    root /usr/share/nginx/html;
    include /etc/nginx/mime.types;

    location / {
        try_files $uri /index.html;
    }
    
    location /violet-nav-api/ {
		# 此ip为后端docker容器的桥接网络ip
        proxy_pass http://172.17.0.5:8080/violet-nav-api/;
    }

}
  1. 二级域名配置

先在腾讯云域名解析配置二级域名解析如下,配置nav的二级域名

然后在宝塔面板配置服务器的本机nginx转发,作用是将nav.carolin-violet.cn转发到docker容器部署的前端

server
    {
        listen 80;
        listen 443 ssl;
        server_name nav.carolin-violet.cn;
        index index.html index.htm index.php;
        root  /www/server/phpmyadmin;
        ssl_certificate /www/cert/carolin-violet.cloud_bundle.pem;
        ssl_certificate_key /www/cert/carolin-violet.cloud.key;
        # 强制http转https
        if ($server_port !~ 443){
            rewrite ^(/.*)$ https://$host$1 permanent;
        }
        location / {
            proxy_pass http://127.0.0.1:30001/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }