# egg-server **Repository Path**: feengqi/egg-server ## Basic Information - **Project Name**: egg-server - **Description**: 自己完善egg框架 - **Primary Language**: JavaScript - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2020-03-23 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # egg-server nodejs egg修改版框架 ## 环境配置 ### 服务器或本地安装mysql - [CSDN](https://blog.csdn.net/wushichao0325/article/details/95167218) ### 相应的sequelize详细操作 - [egg-sequelize](https://eggjs.org/zh-cn/tutorials/sequelize.html) ## 启动 ```bash $ npm i $ npm run dev $ open http://localhost:8080/ ``` ## npm scripts - Use `npm run dev` to run local. - Use `npm test`to run unit test. ## graphql 目录结构 ```bash . ├── app │ ├── graphql │ │ ├── common │ │ │ └── directive.js // 自定义directive │ │ ├── project │ │ │ └── schema.graphql │ │ ├── schemaDirectives │ │ │ └── schemaDirective.js // 自定义 SchemaDirective │ │ │ │ │ ├── user // 一个graphql模型 │ │ │ ├── connector.js │ │ │ ├── resolver.js │ │ │ └── schema.graphql │ │ ├── group //自定义模型组目录 │ │ │ ├── framework // 一个graphql模型 │ │ │ │ ├── connector.js │ │ │ │ ├── resolver.js │ │ │ │ └── schema.graphql │ │ │ └── workspace // 一个graphql模型 │ │ │ ├── connector.js │ │ │ ├── resolver.js │ │ │ └── schema.graphql │ ├── model │ │ └── user.js │ ├── public │ └── router.js ``` ## sequelize 目录 ```bash . ├── app │ ├── database // 初始化数据库的时候 │——— .sequelizerc // sequelize初始化配置 ``` ## 包启动命令 ```javascript ./egg-server start /snapshot/JSYOEMP --port 8081 ``` ## docker部署 ### 安装docker环境 https://blog.csdn.net/wushichao0325/article/details/84873867 ### egg.js项目部署启动 1. docker下项目: "start": "egg-scripts start --title=egg-server-egg-server --sticky" 注:--daemon去掉,是因为在docker里egg.js应用要在前台运行 2. 在本地应用的根目录下(package.json所在目录)新建一个名为Dockerfile的文件(无后缀),将以下内容复制到文件里,并将/usr/src/node-app/koa-server全部替换为你想设置的路径(该路径为docker容器里的路径,可自行设置): ```javascript # 设置基础镜像,如果本地没有该镜像,会从Docker.io服务器pull镜像 FROM node:8.6.0-alpine # 设置时区 RUN apk --update add tzdata \ && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && echo "Asia/Shanghai" > /etc/timezone \ && apk del tzdata # 创建app目录 RUN mkdir -p /usr/src/node-app/koa-server # 设置工作目录 WORKDIR /usr/src/node-app/koa-server # 拷贝package.json文件到工作目录 # !!重要:package.json需要单独添加。 # Docker在构建镜像的时候,是一层一层构建的,仅当这一层有变化时,重新构建对应的层。 # 如果package.json和源代码一起添加到镜像,则每次修改源码都需要重新安装npm模块,这样木有必要。 # 所以,正确的顺序是: 添加package.json;安装npm模块;添加源代码。 COPY package.json /usr/src/node-app/koa-server/package.json # 安装npm依赖(使用淘宝的镜像源) # 如果使用的境外服务器,无需使用淘宝的镜像源,即改为`RUN npm i`。 RUN npm i --registry=https://registry.npm.taobao.org # 拷贝所有源代码到工作目录 COPY . /usr/src/node-app/koa-server # 暴露容器端口 EXPOSE 9002 # 启动node应用 CMD npm start ``` 注: 整个过程简单描述就是:1.拉取docker镜像(并设置时区等);2.创建docker工作目录,并将package.json拷贝到docker里;3.安装npm依赖;4.将服务器上的应用拷贝到docker里;5.暴露docker容器的端口,然后启动node应用。 3. 使用ftp工具或git工具将整个应用上传到生产环境服务器,并使用终端连接到服务器,进入到服务器应用的目录下. 4. 执行以下命令,安装docker镜像 ```javascript docker build -t node/koa-server . ``` 注: -t是对该镜像进行tag标识,标识的名字为node/koa-server,可以自定义这个名字。镜像的构建过程依赖于网速,整体还比较快。npm依赖可能会久一些,因为egg.js的依赖比较多。如果所有步骤执行完,会有success的提示,安装成功了。 5. 执行以下命令,使用刚创建好的镜像来启动一个容器 普通node.js应用 ```javascript docker run -d --name koa-server -p 9002:9002 node/koa-server ``` 注: -d为后台运行容器。如果普通node.js应用使用以上命令,容器使用9002端口,与Dockerfile里面的一致。 egg.js应用 ```javascript docker run -d --net=host --name koa-server -p 9002:8080 node/koa-server ``` 注: eggjs应用需要执行以上命令,即增加了```--net=host```,该参数表示使用host网络模式与主机共享网络来连接mysql数据库;(暂时使用这种模式成功了,后续研究其他更好方案)。 6. 执行以下命令查看容器是否启动成功 ```javascript docker ps ``` 以上命令是查看运行中的容器。如果刚才启动成功,则会显示出来 ```javascript curl -i localhost:9002 ``` 也可以通过curl命令或者到浏览器里输入应用的访问地址,来查看能否访问应用,如果可以则安装成功。 ```javascript docker logs containerId ``` 如果刚才执行docker ps没有看到刚刚启动的容器,说明启动失败,使用该命令来查看启动的具体情况。 7. docker容器里eggjs连接mysql ``` 只需要根据情况修改数据库相关信息即可,在host网络模式下,容器里eggjs的mysql配置文件里的host仍可设置为localhost。 ``` 8. 更新docker里的node.js应用 (1) 通过查看容器列表,找到需要停止的容器ID ```javascript docker ps ``` (2) 停止容器 ```javascript docker stop containerId ``` (3) 删除容器 ```javascript docker rm containerId ``` (4) 删除镜像 ```javascript # 正常情况可以删除 docker rmi imageId # 提示无法删除情况下,强制删除 docker rmi -f imageId ``` (5) 将本地应用代码更新到服务器目录下 (6) 按照上面的步骤重新构建镜像和启动容器 8. 重点总结 (1) 使用Centos 7.x版本安装docker。 (2) --daemon要去掉,让eggjs应用直接前台运行。 (3) Dockerfile里先拷贝package.json,安装npm依赖后,再拷贝应用的代码。 (4) 使用境外服务器则不需要使用淘宝的npm镜像源。 9. 可能出现的问题 (1) npm安装失败:可能是镜像源的问题,需要删除镜像重新构建镜像。 (2) 镜像无法删除:需要先停止和删除容器 10. 其他常用命令 镜像相关: 查看镜像构建工程 ```javascript docker history node/koa-server ``` 比如上面我们构建node/koa-server这个镜像后,可以通过这个命令来查看该镜像的构建过程,来发现问题。 查看所有镜像列表 ```javascript docker images ``` 删除镜像 ```javascript docker rmi imageId docker rmi -f imageId ``` 先查看镜像列表,找到要删除的镜像ID,然后使用该命令删除。-f为强制删除。 容器相关: 查看所有容器列表 ```javascript docker ps ``` 查看某个容器的信息 ```javascript docker logs containerId ``` 先查看容器列表,找到要查看容器的ID,然后使用该命令查看。 拷贝主机的文件到容器的目录下 ```javascript docker cp src/. mycontainer:/target ``` ```src```为要拷贝的目录名,```mycontainer```为容器的id,```target```为目标目录名。 进入某个容器的环境 ```javascript docker exec -it containerId /bin/bash 或 docker exec -it containerId /bin/sh ``` 先查看容器列表,找到要查看容器的ID,然后使用该命令查看。/bin/sh可在执行docker ps后看到。退出容器可以执行exit; ## 本地构建镜像推送到dockerhub中 0. 登录docker ```docker login``` 1. docker ps 查看本地镜像名称:repository ``` REPOSITORY TAG IMAGE ID CREATED SIZE node-app/egg-server latest cbdf2061a6b9 8 minutes ago 389MB node 8.6.0-alpine b7e15c83cdaf 23 months ago 67.2MB ``` 2. 如果本地构建的镜像仓库名不是dockerhub账号(docker Id/仓库名)的格式,需要修改tag ``` docker tag 镜像ID 用户名称/镜像源名(repository name):新的标签名(tag)来更改 ``` 例如:docker tag cbdf2061a6b9 vincentwsc/egg-server:egg-server 3. docekr ps 查看本地镜像名称:repository ``` REPOSITORY TAG IMAGE ID CREATED SIZE node-app/egg-server latest cbdf2061a6b9 12 minutes ago 389MB vincentwsc/egg-server egg-server cbdf2061a6b9 12 minutes ago 389MB node 8.6.0-alpine b7e15c83cdaf 23 months ago 67.2MB ``` 4. 上传镜像到dockerhub ``` docker push/: ``` 例如: docker push vincentwsc/egg-server:egg-server