Node-web05-07-01博客系统部署

博客部署阿里云

代码

我们先build代码

  • yarn build 结果报错了,说找不到 Post
  • 原因是 next-env.d.ts ,一旦有 import 这个声明就不是全局的了

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    /// <reference types="next" />
    /// <reference types="next/types/global" />
    import * as next from 'next';

    declare module "*.png" {
    const value: string;
    export default value;
    }


    declare module 'next' {
    import {Session} from 'next-iron-session';

    interface NextApiRequest {
    session: Session
    }
    }
  • 新建 custom.d.ts 在项目根目录,里面放置全局的类型声明

1
2
3
4
5
6
7
type Post = {
id: string;
date: string;
title: string;
content: string;
htmlContent: string;
}
  • 此时再次 yarn build 构建成功
  • 去看 .next/BUILD_ID 这个是每次 build产生的id
  • 然后 yarn start 运行,部署代码也是这样运行

docker化应用

  • google docker nodejs 得到 Dockerizing a Node.js web app
  • 所有的英文都不看,直接看例子
  • 创建 Dockerfile touch Dockerfile
  • 内容如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
FROM node:12
# 在 linux 的 /usr/src/app 目录工作
WORKDIR /usr/src/app
COPY package.json ./
# 因为我们用的是 yarn 不是 npm
COPY yarn.lock ./
# run 开头 代表运行 命令
RUN yarn install
# 这个意思是 把你项目根目录的内容 拷贝到 工作目录
COPY . .
# 暴露端口
EXPOSE 3000
# 最后一步你要运行的代码
CMD [ "yarn", "start" ]
  • 再次创建一个忽略文件 .dockerignore

    • .gitignore
      1
      2
      node_modules
      *.log
  • 继续看文档

    1
    2
    3
    4
    5
    6
    7
    # 看文档
    # 构建你的 docker应用
    # 构建成功会生成一个镜像
    docker build -t <your username>/node-web-app .

    # 如何运行镜像呢?
    docker run -p 3000:3000 -d <your username>/node-web-app
  • 我的构建命令如下

1
2
3
docker build -t my-node-app/node-web-app . 

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

构建过程出错了

1
2
3
4
5
6
7
8
9
10
11
12
13
# 第一个问题 yarn install 一直卡在 "Fetch packages..."
yarn cache clean & yarn install

# 第二个问题 yarn install --verbose 显示它的进度,发现卡在这里
Browserslist: caniuse-lite is outdated. Please run: npx browserslist@latest --update-db

- 解决办法
- 删除 node_modules 文件夹及 package-lock.json 文件

结果不管事
再次添加参数

RUN yarn cache clean & yarn install --verbose --network-timeout 60000
  • 历经千辛万苦,终于build成功了
  • 运行docker run -p 3000:3000 -d my-node-app/node-web-app 打开浏览器 http://localhost:3000/
  • 发现报错, 通过log看运行日志
  • docker logs 你的应用id
  • 应该是 数据库连接问题,数据库需要一个 pg 容器,并配置好localhost
  • 修改 ormconfig.json 里的host为你的本机ip
    • 因为 容器内的 localhost 不是你本机的 localhost