【山竹记账后端】4.网站部署上线


大纲链接 §

[toc]


部署上线的时机

  • 项目搭建早期就应该部署一个初始可启动的项目服务上线
    • 大致跑通整个流程,逐步完善流程
    • 方便渐进式地 排查问题 -> 修改代码 -> 实现功能代码
    • 每次只需处理少数的 bug,及时揭露风险

1. 购买便宜的云服务器

怎么把代码弄上线

  • 弄出一个生产环境,用来运行最终代码

买服务器

机型

  • 新手选最便宜的,一年到三年即可
  • 如果还是觉得贵,可以按使用量付费,用完即毁(切记)

购买阿里云 按量付费 部署流程测试

付费类型、可用区

按量付费,按量付费实例不支持备案服务,仅作为部署流程测试,用完即停机,并且释放实例;之后重新购买稳定服务提供项目展示

  • 付费类型-按量付费;暂时选择最便宜的
  • 可用区:上海 可用区O 仅支持 ECS
    • 同可用区内网免费:在同一个可用区内,云服务器、数据库(RDS)和对象存储(OSS)之间的内网通信是完全免费的
    • 跨可用区流量收费:如果您将应用部署在可用区A,而数据库部署在可用区B(跨可用区高可用架构)
    • 虽然能防灾,但云厂商会对这两个可用区之间传输的内网数据收取同地域跨可用区流量费

按量付费 可用区


实例和镜像

  • 实例价格点击升序排列,选择最便宜的
  • 镜像选 Ubantu 最新版;不要免费加固,测完即毁

实例和镜像_价格升序 选择Ubantu镜像

存储云盘

  • 调整为最低-20G
  • 仅勾选-随实例释放

存储云盘


网络和安全组

  • 选择 按使用流量
    • 峰值调整为最低 1M
  • 其他选默认,之后可调整

带宽峰值_1M

管理设置

  • 登录凭证
    • 登录名
    • 密钥对

创建密钥对,导入公钥

  • ssh-keygen -t rsa -b 4096 -C "
  • 终端bash命令 cat ~/.ssh/id_rsa.pub 粘贴内容

root_密钥对 导入密钥对 选择已有密钥对


其他实例选项

  • 实例名称
  • 主机名

购买成功跳转到控制台-实例界面

实例名称_主机名


阿里云实例

配置概要

使用 ssh 登录实例

  • 在实例界面复制公网 ip

     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
    
    ssh root@xxx.xxx.xxx.xx
    
    The authenticity of host 'xxx.xxx.xxx.xx (xxx.xxx.xxx.xx)' can't be established.
    ED25519 key fingerprint is SHA256:nb3c1Xzh5c6PTaCB1I5H6DN4U86JA3i1vJ8aIoXs30xsdW8+67CQ.
    This key is not known by any other names.
    Are you sure you want to continue connecting (yes/no/[fingerprint])? y
    Please type 'yes', 'no' or the fingerprint: yes
    Warning: Permanently added 'xxx.xxx.xxx.xx' (ED25519) to the list of known hosts.
    Welcome to Ubuntu 26.04.1 LTS (GNU/Linux 7.0.0-30-generic x86_64)
    
    * Documentation:  https://docs.ubuntu.com
    * Management:     https://landscape.canonical.com
    * Support:        https://ubuntu.com/pro
    
    System information as of Mon Sep 14 05:24:27 PM CST 2026
    
    System load:  0.15               Processes:             114
    Usage of /:   33.4% of 19.32GB   Users logged in:       0
    Memory usage: 15%                IPv4 address for eth0: xxx.xx.xxx.xxx
    Swap usage:   0%
    
    
    Expanded Security Maintenance for Applications is not enabled.
    
    0 updates can be applied immediately.
    
    1 additional security update can be applied with ESM Apps.
    Learn more about enabling ESM Apps service at https://ubuntu.com/esm
    
    
    The list of available updates is more than a week old.
    To check for new updates run: sudo apt update
    
    
    Welcome to Alibaba Cloud Elastic Compute Service !
  • 看到提示 Welcome to Alibaba Cloud Elastic Compute Service !

控制台-实例

使用完确认是否已停机,并且释放实例

  • 按量计费的实例停机后,云盘也会扣费,释放实例后才不会计费

购买腾讯云


2. 服务器详细配置

配置服务器

  • 登录
    • 不推荐使用 【用户名 + 密码】 登录,容易忘,不安全
    • 推荐使用 ssh-copy-id 上传公钥,使用 ssh 登录
  • 防火墙
    • 推荐开启 测试端口,如 3000、3001、5000、8000、8080
    • 自行选择是否开启重要端口,因为需要备案,如 80、443

登录

  • ssh root@xxx.xxx.xxx.xx
    • 保存密码登录可使用 ssh-copy-id root@xxx.xxx.xxx.xx
  • 已登录,命令行无输入字符,按 Ctrl + D 或者输入 exit 退出登录

防火墙(安全组配置)

创建安全组

  • 添加安全组配置
    • 添加入栈端口 30003001500080008080

创建规则_添加端口 更换安全组


用户权限

  • 用户权限
    • 推荐只在 root 用户里安装 Docker 即可
    • 每个应用创建一个 独立用户,并加入 docker 用户组,方便管理
    • 切记用 root 用户管理所有应用,容易被攻击
  • 发行版
    • 新手推荐使用 Ubuntu 次新版,因为教程多
    • 高手自行选择发行版,推荐 CentOS次新版,因为稳定,适合生产环境

实操:ssh 用户登录保活

root@server1: client_loop:send disconnect:Connection reset by peer

  • ssh 默认有超时时间,一段时间后会进入假死状态,终端卡住不能操作
  • 需要配置连接断开超时设置
  • 运行命令 vim /etc/ssh/sshd_config,在文件末尾添加如下内容:

    1
    2
    3
    
    # 添加
    ClientAliveInterval 300
    ClientAliveCountMax 5
  • 或者普通模式下 打 /Interval

    • bb 进入编辑该行,按 x 删除注释;
    • s 进入编辑该行,按 i 进入插入模式,输入 300
    • Esc 退出编辑模式,输入 :wq 保存退出

重启 sshd 服务

1
2
3
service sshd restart
service sshd stop
service sshd start

参考


root 用户安装 docker

如果时腾讯云的服务器,默认已经安装好 docker,可以直接使用,这里演示阿里云服务器安装 docker

  • 默认去阿里云的镜像源安装

    1
    2
    3
    4
    5
    6
    
    # 1. 更新 apt 包索引,并安装依赖包以允许 apt 通过 HTTPS 使用仓库:
    apt update
    apt install ca-certificates curl
    install -m 0755 -d /etc/apt/keyrings
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
    chmod a+r /etc/apt/keyrings/docker.asc

设置 docker 的 apt 仓库

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# Add the repository to Apt sources:
tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

apt update

安装 docker 引擎、containerddocker-compose-plugin

1
apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

验证docker镜像是否安装成功

1
2
docker --version
docker run hello-world

参考


添加 mangosteen 用户,并加入 docker 用户组,authorized_keys 权限操作

1
2
3
4
5
# @root 用户下
# 添加 mangosteen 用户
adduser mangosteen

# 会要求输入密码,输入用户信息,按回车即可

加入 docker 用户组

1
usermod -aG docker mangosteen
  • Ctrl + D 退出root 用户,使用 mangosteen 用户登录

    1
    2
    3
    4
    
    ssh mangosteen@your_server_ip
    
    # 此时登录会报错
    # mangosteen@your_server_ip: Permission denied (publickey).

先再次进入 root 用户,修改 mangosteen 用户的 authorized_keys 权限

1
chmod 600 /home/mangosteen/.ssh/authorized_keys

也可以直接复制 root 用户的 authorized_keysmangosteen 用户的 .ssh 目录下

1
2
3
4
5
6
7
cd ~/.ssh
ls
# authorized_keys
# 查看内容
cat authorized_keys

cp ./authorized_keys /home/mangosteen/.ssh/authorized_keys
  • ls 按住 Alt + . 可以切换到上一个目录,按住 Alt + , 可以切换到下一个目录;查看
  • authorized_keys 这个文件是从 root 用户的 ~/.ssh/authorized_keys 复制过来的,里面是公钥内容

    • 目前 mangosteen 用户时无法访问 authorized_keys
    • 需要转交文件的控制权

      1
      2
      3
      
      # chown mangosteen:mangosteen /home/mangosteen/.ssh/authorized_keys
      cd ..
      chown -R mangosteen:mangosteen .ssh
  • chown 命令是改变文件或目录的所有者和所属组

    • -R 递归修改目录下的所有文件和子目录
    • mangosteen:mangosteen 表示将所有权转交给 mangosteen 用户和 mangosteen 用户组
    • .ssh 是当前目录下的 .ssh 目录
  • 此时 运行 ls -a 可以看到 .ssh 目录的所有者和所属组已经变为 mangosteen

``bash

``

此时重新退出再使用 mangosteen 用户登录,应该就可以成功登录了

  • 验证 mangosteen 用户是否可以使用 docker 命令

    1
    2
    
    docker ps
    docker run hello-world

参考


注意把不用的服务器停机或释放实例

3. 部署思路

配置后端生产环境:步骤

  • 准备一个新用户
  • 准备好 docker
  • 上传 Dockerfile
  • 上传源代码
  • Dockerfile 构建运行环境
  • 在运行环境里运行源代码
  • 使用 Nginx 做转发
    • 源码会监听端口,假设 3000 不直接访问
    • Nginx 监听 80,把 80 的请求转发到 3000
    • 好处是 Nginx 可以做 负载均衡、零宕机时间

配置后端生产环境:版本更新

  • 上传新 Dockerfile
  • 上传新源代码
  • 用新 Dockerfile 构建运行环境
  • 在新运行环境里运行新源代码
  • 使用 Nginx 做转发

配置前端生产环境

前端哪有生产环境

  1. 将代码中的路径替换成 CDN 路径
  2. 上传打包好的 CSS JS 文件到 CDN,如 阿里云OSS腾讯云COS
  3. html 文件上传到后端服务器
  4. 使用 Nginx 处理 html 文件请求,转发到 CDN 上的 CSS JS 文件

写代码啦CDN

  • CDN 只处理静态文件,好处是可以加速访问,减少服务器压力,降低成本
  • CDN 节点也离用户更近,会针对用户的地理位置,分配最近的服务器

    1
    2
    3
    
    /assets/1-xxxx.js 
    # 修改资源前缀
    https://cdn.com/jirengu/assets/1-xxx.js

写代码啦CDN静态资源

具体实践过程之后处理,目前只处理后端


重点

  • 如何做到自动化?
  • 有哪些细节之前没有考虑过的?
  • 有哪些问题还没有提到?

4. 在 wsl 宿主机里部署(Windows/macOS/Linux都适用)

检查端口是否被占用

或者启动服务更换端口;或者重启 docker desktop


使用 window 作为生产环境

添加后端路由根目录

添加后端根目录对应的 Controller


生产环境打包脚本 pack_for_host.sh

使用 tar 命令打包源代码,上传到宿主机


host.Dockerfile 宿主机运行镜像


docker 构建部署启动脚本 setup_host.sh


流程

  • linux 宿主机里运行 pack_for_host.sh 脚本
  • window 中运行 setup_host.sh 脚本

添加可执行权限

1
2
3
4
5
# chmod +x bin/pack_for_host.sh
# chmod +x bin/setup_host.sh
chmod +x bin/*.sh

bin/pack_for_host.sh

运行 setup_host.sh 脚本

1
bin/setup_host.sh

不会用 vim 怎么办?

  • 不会用就千万别尝试,建议使用 nano 代替 vim 命令。

代码使用 Windows,是否适合 macOS / Linux 吗?

  • docker 容器中 都是 Linux

5. $3


6. $3


7. $3


8. $3


·未完待续·

参考文章

相关文章


  • 作者: Joel
  • 文章链接:
  • 版权声明
  • 非自由转载-非商用-非衍生-保持署名