Node-web05-07-03服务器端构建

克隆代码

1
2
3
4
5
6
7
8
9
10
11
12
# blog用户登录
ssh blog@dev1

# 进入服务器home目录
cd ~/
# 再次 clone代码
git clone git@github.com:slTrust/next-demo-2.git
# 进入项目根目录
cd next-demo-2

# 切换到我那个时候的代码,以保证同步
git checkout bbc97ab4fc6adf3b93b136bcfeb0ad409c9711e4

项目开始运行

  • 切换用户su - blog 到你的项目目录 cd ~/app/next-demo-2
  • 运行 yarn install
  • 然后 yarn build 结果报错了, 说缺少一个 password ,记得我们忽略的 .env.local
  • 顺带把 数据库连接信息改了
1
2
3
4
5
6
7
8
9
10
11
12
13
# 项目根目录 
touch .env.local
# 内容如下,注意密钥要用你的
SECRET=c2a85490-cc60-4f21-94e8-8dc5dd3220da

# 然后修改 pg数据库的配置 vi ormconfig.json
把host 改成你机器的 pg数据库信息

"host": "172.17.48.128", // 你机器的ip ifconfig查看
"port": 5432, // docker 启动pg设置的端口
"username": "blog", // pg用户名
"password": "", // pg密码
"database": "blog_production"

这也是为啥配置别用json的原因,没法改
这也是为啥配置别用json的原因,没法改
这也是为啥配置别用json的原因,没法改

  • 运行yarn dev 然后 curl -L localhost:3000
  • 提示你 QueryFailedError: relation "posts" does not exist

创建数据库表

  • yarn typeorm:build
  • yarn m:run 报错 Error: Cannot find module '../../lib/getDatabaseConnection'
  • 因为 src/entity/User.ts 里用了 getDatabaseConnection 要把对应的语句注释
1
2
3
4
5
6
7
8
9
// 13行的
// import {getDatabaseConnection} from '../../lib/getDatabaseConnection';

// 55~59
//const found = await (await getDatabaseConnection()).manager.find(
User, {username: this.username});
// if (found.length > 0) {
// this.errors.username.push('已存在,不能重复注册');
// }
  • 继续 yarn typeorm:build然后yarn m:run
  • 此时:数据库表结构创建好了,把 src/entity/User.ts还原
  • 运行 yarn build
    • 然后 yarn start
    • curl -L localhost:3000 此时页面有了但是没有数据

不能在docker里 yarn build 里面会有很多文件,很大

docker 你的应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 进入你的项目目录
cd ~/app/next-demo-2/

# 构建应用
docker build -t my-node-app/node-web-app .

docker run -p 3000:3000 -d my-node-app/node-web-app

# 访问我们的应用,里面报错,但是可以先不管
curl -L localhost:3000

# 查看占用端口
lsof -i :3000
# 杀掉进程
kill pid

查看历史命令小技巧

1
history | grep 'docker run'

解决报错

1
2
3
4
5
6
7
8
9
10
# 查看我们应用的id
docker ps -a
# 看log
docker logs id

# log内容
ready - started server on 0.0.0.0:3000, url: http://localhost:3000
error: database "blog_production" does not exist

# 数据库不存在,因为我们没有初始化数据库

设置环境变量,服务器是 production

1
2
3
4
5
6
7
8
9
10
11
# root用户 登服务器
ssh root@dev1
# 设置环境变量
vi ~/.bashrc
export NODE_ENV=production

# 刷新这个文件
source ~/.bashrc

# 测试是否生效
echo $NODE_ENV

NODE_ENV=production 后,yarn install 不会install dev的东西

  • 你要这样 yarn install --production=false

docker的--network=host选项

  • 让容器共享你 阿里云机器的IP,这样就可以不做端口映射
  • 数据库连接不上问题
    • 容器的localhost 不是你本机的 localhost
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      # 把之前的容器都停了,然后删了  
      docker kill id
      docker rm -f id

      # docker重新启动 pg
      docker run --network=host -v /home/blog/blog-data:/var/lib/postgresql/data -p 5432:5432 -e POSTGRES_USER=blog -e POSTGRES_HOST_AUTH_METHOD=trust -d postgres:12.2

      # 重新构建next.js应用
      docker build -t my-node-app/node-web-app .

      docker run --network=host -p 3000:3000 -d my-node-app/node-web-app