Node-web05-09-02博客系统部署最新版流程

前置条件

  • 充值110元 购买阿里云按量付费机器
  • 安装好 docker
  • 安装好 node
  • 配置好阿里云服务器的 root以及非root用户的 ssh 登陆
  • 配置好 非root用户 如 blog 用户的 docker执行权限
  • 配置好 git ssh key 用来clone / pull代码

登录服务器

1
ssh blog@dev1

设置环境变量

1
2
3
4
5
6
7
8
vi ~/.bashrc
# 插入一句,后保存
export NODE_ENV=production

# 让这个变动生效
source ~/.bashrc
# 验证
echo $NODE_ENV

PG的一些设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 创建数据库持久化目录
mkdir ~/blog-data

# 这里注意这个 --name my-pg-app 后面会用到,非常重要
docker run --name my-pg-app -v ~/blog-data:/var/lib/postgresql/data --network=host -e POSTGRES_USER=blog -e POSTGRES_HOST_AUTH_METHOD=trust -d postgres:12.2

# 通过id or appname(--name 指定的名字)进入
# docker exec -it <id|appname> bash
# 创建数据库,这里通过这个 [my-pg-app] 进入数据库内部 ,你也可通过 容器id
# 通过应用名进入
docker exec -it my-pg-app bash

# 登录数据库
psql -U blog

# 如果是服务器 生产环境你就这样
CREATE DATABASE blog_production ENCODING 'UTF8' LC_COLLATE 'en_US.utf8' LC_CTYPE 'en_US.utf8';

# 如果是本地你就这样
CREATE DATABASE blog_development ENCODING 'UTF8' LC_COLLATE 'en_US.utf8' LC_CTYPE 'en_US.utf8';

拉代码

1
2
3
4
5
6
cd ~/
mkdir app
cd app

# 拉代码,前提你配置好 github的ssh key
git clone git@github.com:slTrust/next-demo-2.git .

数据库配置

  • 参考 ~/app/ormconfig.sample.json 建立 production 环境的 config

  • 在服务器 ~/shared/ormconfig.json这样建立文件

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
cd ~/
mkdir shared
vi ormconfig.json

# 内容如下,根据你的 pg设置自行设置
{
"type": "postgres",
"host": "localhost",
"port": 5432,
"username": "blog",
"password": "",
"database": "blog_production",
"synchronize": false,
"logging": false,
"entities": [
"dist/entity/**/*.js"
],
"migrations": [
"dist/migration/**/*.js"
],
"subscribers": [
"dist/subscriber/**/*.js"
],
"cli": {
"entitiesDir": "src/entity",
"migrationsDir": "src/migration",
"subscribersDir": "src/subscriber"
}
}
  • 建立软链接(非常重要)
1
2
3
# 注意要在项目根目录
cd ~/app
ln -s ~/shared/ormconfig.json

加密密钥配置

1
2
3
4
5
cd ~/app
touch .env.local

# 内容如下
SECRET=c2a85490-cc60-4f21-94e8-8dc5dd3220da

deploy.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
echo '前置准备完成了,启动pg';
docker restart my-pg-app &&
# 推荐这样,因为用户名不一定都叫 blog
cd ~/app/ &&
git pull &&
yarn install --production=false &&
yarn build &&
# 修改补丁, src/entity/User.ts 的补丁
git apply migrate.patch;
# 编译src/migration ,让typeorm 的ts变成 js
yarn compile &&
# 数据库迁移,创建表
yarn m:run &&
# 撤销 patch内容
git reset --hard HEAD &&
# 防止同名应用存在
docker kill my-next-app;
docker rm -f my-next-app;
docker rmi -f hjx/node-web-app;
# docker构建应用
docker build -t hjx/node-web-app . &&
docker run --name my-next-app --network=host -d hjx/node-web-app &&
echo 'OK!'

docker -p 参数端口映射一个重要知识点

  • docker 容器内的localhost 不是你机器的localhost

docker --network=host

  • 意思是 你服务器的 localhost:端口 对应你的容器开放的端口
1
2
3
4
5
# 当访问你机器的 3000 时映射到对应容器的 3000端口
docker run --name my-next-app -p 3000:3000 -d hjx/node-web-app

# 不再指定 -p 参数
docker run --name my-next-app --network=host -d hjx/node-web-app

一键部署

1
2
3
4
5
6
7
8
# 前置准备工作
ssh blog@dev1
# clone 我的最新代码
# 分配执行权限
chmod +x ~/app/bin/deploy.sh

# 以后每次改了代码 push之后你就可以这样
ssh blog@dev1 'sh ~/app/bin/deploy.sh'