构建

源码地址:https://github.com/YMFE/yapi

使用:https://www.freesion.com/article/7738391556/

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#使用 Docker 构建 Yapi
#1、启动 MongoDB
docker run -d --name mongo-yapi mongo
#2、获取 Yapi 镜像,版本信息可在 阿里云镜像仓库 查看
docker pull registry.cn-hangzhou.aliyuncs.com/anoy/yapi
#3、初始化 Yapi 数据库索引及管理员账号
docker run -it --rm \
--link mongo-yapi:mongo \
--entrypoint npm \
--workdir /api/vendors \
registry.cn-hangzhou.aliyuncs.com/anoy/yapi \
run install-server
#自定义配置文件挂载到目录 /api/config.json
#官方自定义配置文件 https://github.com/YMFE/yapi/blob/master/config_example.json

#4、启动 Yapi 服务
docker run -d \
--name yapi \
--link mongo-yapi:mongo \
--workdir /api/vendors \
-p 8880:3000 \
registry.cn-hangzhou.aliyuncs.com/anoy/yapi \
server/app.js

#访问 http://localhost:8880 登录账号 admin@admin.com,密码 ymfe.org
#关闭 Yapi
docker stop yapi
#启动 Yapi
docker start yapi
#升级 Yapi
#1、停止并删除旧版容器
docker rm -f yapi
#2、获取最新镜像
docker pull registry.cn-hangzhou.aliyuncs.com/anoy/yapi
#3、启动新容器
docker run -d \
--name yapi \
--link mongo-yapi:mongo \
--workdir /api/vendors \
-p 8880:3000 \
registry.cn-hangzhou.aliyuncs.com/anoy/yapi \
server/app.js
#手动构建 yapi 镜像
#1、下载 YAPI 到本地
wget -o yapi.tar.gz https://github.com/YMFE/yapi/archive/v1.8.0.tar.gz
下载地址:https://github.com/YMFE/yapi/releases
#2、编辑 Dockerfile
FROM node:12-alpine as builder
RUN apk add --no-cache git python make openssl tar gcc
COPY yapi.tar.gz /home
RUN cd /home && tar zxvf yapi.tar.gz && mkdir /api && mv /home/yapi-1.8.0 /api/vendors
RUN cd /api/vendors && \
npm install --production --registry https://registry.npm.taobao.org
FROM node:12-alpine
MAINTAINER 545544032@qq.com
ENV TZ="Asia/Shanghai" HOME="/"
WORKDIR ${HOME}
COPY --from=builder /api/vendors /api/vendors
COPY config.json /api/
EXPOSE 3000
ENTRYPOINT ["node"]
#3、构建镜像
docker build -t yapi .

数据迁移

yapi的数据库是MongoDB,所以yapi的数据备份和恢复实际上就是MongoDB的数据备份与恢复,使用复制数据库文件夹,然后进行覆盖,是不可以将数据成功迁移的!
MongoDB的数据恢复一般是覆盖原有数据,如果想保留原有的数据,可以写脚本,以插入的形式添加。但若新数据与原有数据有重复,会添加错误,只能编写脚本判断

在yapi页面进行数据导出及导入

数据库数据迁移

这里主要使用两个命令:mongodump、mongorestore

数据导出
  • -h:
    MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017
  • -d:
    需要备份的数据库实例,例如:yapi
  • -o:
    备份的数据存放位置,例如:/home/apps,当然该目录需要提前建立,在备份完成后,系统自动在dump目录下建立一个yapi目录,这个目录里面存放该数据库实例的备份数据。
1
2
3
4
5
6
7
8
9
10
# mongo 
# show dbs
local 0.000GB
yapi 0.010GB
# exit
导出:
# mongodump -h dbhost -d dbname -o dbdirectory 用法
# mongodump -d yapi -o /home/apps/
# 如果yapi搭建在容器内,希望在宿主机上执行该命令,则可以调整成:
# docker exec $容器名 mongodump -d yapi -o /my-yapi/
数据导入
  • –h:
    MongoDB所在服务器地址,默认为: localhost:27017
  • -d :
    需要恢复的数据库实例,例如:yapi,当然这个名称也可以和备份时候的不一样,比如test
  • –drop:
    恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用哦!
  • backupdirectory:
    mongorestore 最后的一个参数,设置备份数据所在位置,例如:/home/apps/yapi。
  • –dir:
    指定备份的目录

如果在其他主机部署了一个新的yapi,那么最好先把现有的记录删除。最好备份恢复时让mongodb以及yapi版本保持一致,不然容易出错。同时最好加上–drop选项,保证恢复的完整性。

1
2
3
4
5
mongorestore -h dbhost -d dbname --dir backupdirectory
mongorestore -d yapi --drop --dir /home/apps/yapi
# docker
docker cp /home/jenkins/yapi 3b16a957f479:/home/apps
docker exec 3b16a957f479 mongorestore -d yapi --drop --dir /home/apps/yapi

项目合并统一文档

updateAllDoc.js

1
2
3
4
5
6
7
8
9
10
11
12
db.interface.deleteMany({"project_id":20});

db.interface.find({"project_id":{$ne:20}},{_id:0})
.sort({title:1})
.forEach((it)=>{
var oldCat= db.interface_cat.findOne({"project_id":it.project_id ,"_id":it.catid });
var newCat= db.interface_cat.findOne({"project_id":20 ,"name":oldCat.name });
it.project_id= 20;
it.catid = newCat._id;
db.interface.insert(it);
print(it.title + "done");
});
1
2
3
4
5
6
7
8
#!/bin/bash

#获取mongoDB容器ID
CONTAINER_ID=`docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Ports}}\t{{.Status}}" |grep mongo-yapi|awk '{print $1}'`

#执行脚本, 将各中心的接口文档合并成一个
docker cp /home/jenkins/updateAllDoc.js $CONTAINER_ID:/
docker exec -it $CONTAINER_ID /bin/bash -c 'mongo 127.0.0.1:27017/yapi updateAllDoc.js'

问题

文档导出长参数时结构变形

解决:

./vendors/exts/yapi-plugin-export-data/defaultTheme.css

1
2
3
4
5
6
td,
th{
border:1px solid #ddd;
padding:3px 10px;
while-space:nowrap
}