diff --git a/Dockerfile b/Dockerfile index 86046e97..1c52e4fe 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,7 +13,6 @@ FROM node:18-alpine as prod ENV TZ=Asia/Shanghai COPY --from=builder /app/docker/* /app/docker/ COPY --from=builder /app/output/ /app/ - WORKDIR /app RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories RUN npm config set registry https://registry.npmmirror.com diff --git a/docker-compose.yml b/docker-compose.yml index 0e4ea897..488956b8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,6 +10,8 @@ services: - ./runtime/static:/app/packages/server/static environment: - TZ=Asia/Shanghai + expose: + - '5001-5003' ports: - '5001-5003:5001-5003' depends_on: diff --git a/how-to-use-docker.md b/how-to-use-docker.md new file mode 100644 index 00000000..97e82b87 --- /dev/null +++ b/how-to-use-docker.md @@ -0,0 +1,178 @@ +# 使用 docker-compose 进行项目部署 + +> 目标:使用 http://dev.think.codingit.cn 访问客户端;使用 http://dev.api.codingit.cn 访问服务端。 + +## 1. 新建 config/prod.yaml + +```yaml +# 开发环境配置 +client: + port: 5001 + assetPrefix: '/' + apiUrl: 'http://dev.api.codingit.cn/api' + collaborationUrl: 'ws://dev.api.codingit.cn/think/wss' + # 以下为页面 meta 配置 + seoAppName: '云策文档' + seoDescription: '云策文档是一款开源知识管理工具。通过独立的知识库空间,结构化地组织在线协作文档,实现知识的积累与沉淀,促进知识的复用与流通。' + seoKeywords: '云策文档,协作,文档,fantasticit,https://github.com/fantasticit/think' + # 预先连接的来源,空格分割(比如图片存储服务器) + dnsPrefetch: '//wipi.oss-cn-shanghai.aliyuncs.com' + # 站点地址(如:http://think.codingit.cn/),一定要设置,否则会出现 cookie、跨域等问题 + siteUrl: 'http://dev.think.codingit.cn' + siteDomain: '' + +server: + prefix: '/api' + port: 5002 + collaborationPort: 5003 + maxDocumentVersion: 20 # 最大版本记录数 + logRetainDays: 3 # 日志保留天数,比如只保留近三天日志 + enableRateLimit: true # 是否限流 + rateLimitWindowMs: 60000 # 限流时间 + rateLimitMax: 1000 # 单位限流时间内单个 ip 最大访问数量 + email: # 邮箱服务,参考 http://help.163.com/09/1223/14/5R7P6CJ600753VB8.html?servCode=6010376 获取 SMTP 配置 + host: '' + port: 465 + user: '' + password: '' + admin: + name: 'admin' # 注意修改 + password: 'admin' # 注意修改 + email: 'admin@think.com' # 注意修改为真实邮箱地址 + +# 数据库配置 +db: + mysql: + host: 'mysql-for-think' + username: 'think' + password: 'think' + database: 'think' + port: 3306 + charset: 'utf8mb4' + timezone: '+08:00' + synchronize: true + redis: + host: 'redis-for-think' + port: '6379' + password: 'root' + +# oss 文件存储服务 +oss: + local: + enable: true + # 线上更改为服务端地址(如:https://api.codingit.cn) + server: 'http://dev.api.codingit.cn' + # 以下为各厂商 sdk 配置,不要修改字段,填入值即可 + tencent: + enable: false + config: + SecretId: '' + SecretKey: '' + Bucket: '' + Region: '' + aliyun: + enable: false + config: + accessKeyId: '' + accessKeySecret: '' + bucket: '' + https: true + region: '' + +# jwt 配置 +jwt: + secretkey: 'zA_Think+KNOWLEDGE+WIKI+DOCUMENTS@2022' + expiresIn: '6h' +``` + +## 2. 新建 nginx.conf + +```shell +upstream think_client { + server 127.0.0.1:5001; + keepalive 64; +} + +upstream think_server { + server 127.0.0.1:5002; + keepalive 64; +} + +upstream think_wss { + server 127.0.0.1:5003; + keepalive 64; +} + +server { + listen 80; + server_name dev.api.codingit.cn; + + client_max_body_size 100m; + + location /api { + proxy_pass http://think_server; + proxy_read_timeout 300s; + proxy_send_timeout 300s; + + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + } + + location /think/wss { + proxy_pass http://think_wss; + proxy_read_timeout 300s; + proxy_send_timeout 300s; + + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + } + + location /static/ { + proxy_pass http://think_server; + } +} + +server { + listen 80; + server_name dev.think.codingit.cn; + + location / { + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $host; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header X-Nginx-Proxy true; + proxy_cache_bypass $http_upgrade; + proxy_pass http://think_client; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } +} +``` + +3. 构建项目 + +```shell +cd think +docker-compose up -d +``` + +4. 可选:配置 hosts + +```shell +127.0.0.1 dev.api.codingit.cn +127.0.0.1 dev.think.codingit.cn +``` + +5. 访问 + +浏览器访问:http://dev.think.codingit.cn。 diff --git a/let-us-start.md b/let-us-start.md index 1fbfbea3..6d86f708 100644 --- a/let-us-start.md +++ b/let-us-start.md @@ -80,9 +80,8 @@ pm2 save ```bash # 首次安装 -git clone https://github.com/fantasticit/think.git +git clone https://github.com/fantasticit/think.git cd think -vim docker-compose.yml docker-compose up -d # 二次更新升级 @@ -98,6 +97,8 @@ docker image rm think # 删掉构建的镜像 docker-compose up -d ``` +更多细节可以查看 [how-to-use-docker.md](./how-to-use-docker.md)。 + ### nginx 配置参考 无论以何种方式进行项目部署,项目运行成功后会在 3 个端口启动服务(默认 5001、5002、5003,具体由配置文件决定)。`nginx` 配置参考 <[think/nginx.conf.sample](https://github.com/fantasticit/think/blob/main/nginx.conf.sample)>。 diff --git a/nginx.conf.sample b/nginx.conf.sample index f2b36de7..4a9ba25f 100644 --- a/nginx.conf.sample +++ b/nginx.conf.sample @@ -14,18 +14,8 @@ upstream think_wss { } server { - listen 80; - server_name api.codingit.cn; - rewrite ^(.*)$ https://$host$1 permanent; -} - -server { - listen 443 ssl http2; - server_name api.codingit.cn; - - ssl_certificate /apps/ssl/api.codingit.cn/api.codingit.cn.pem; - ssl_certificate_key /apps/ssl/api.codingit.cn/api.codingit.cn.key; - ssl_session_timeout 5m; + listen 80; + server_name dev.api.codingit.cn; client_max_body_size 100m; @@ -56,26 +46,13 @@ server { } location /static/ { - gzip_static on; - expires max; - add_header Cache-Control public; - alias /apps/think/packages/server/static/; + proxy_pass http://think_server; } } server { - listen 80; - server_name think.codingit.cn; - rewrite ^(.*)$ https://$host$1 permanent; -} - -server { - listen 443 ssl http2; - server_name think.codingit.cn; - - ssl_certificate /apps/ssl/think.codingit.cn/think.codingit.cn.pem; - ssl_certificate_key /apps/ssl/think.codingit.cn/think.codingit.cn.key; - ssl_session_timeout 5m; + listen 80; + server_name dev.think.codingit.cn; location / { proxy_http_version 1.1; @@ -89,21 +66,4 @@ server { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } - - # 静态文件 - location ^~ /_next { - alias /apps/think/packages/client/.next; - autoindex on; - } - - # next-pwa 生成的静态文件(service-worker.js, workbox-*.js) - location ~ /*\.js$ { - add_header Content-Type "application/javascript; charset=UTF-8"; - root /apps/think/packages/client/.next; - } - - # 自定义流程图编辑器的文件 - location ~ /*\.(gif|png|jpg|jpeg|xml|txt)$ { - root /apps/think/packages/client/.next; - } } diff --git a/packages/client/.gitignore b/packages/client/.gitignore index 88b6f0d9..a6e11c6d 100644 --- a/packages/client/.gitignore +++ b/packages/client/.gitignore @@ -35,3 +35,8 @@ yarn-error.log* # typescript *.tsbuildinfo + +# service-worker.js +/public/manifest.json +/public/service-worker.js +/public/workbox-*.js diff --git a/packages/client/copy-diagram-resources.js b/packages/client/copy-diagram-resources.js index dc8ca406..581ab16e 100755 --- a/packages/client/copy-diagram-resources.js +++ b/packages/client/copy-diagram-resources.js @@ -80,4 +80,6 @@ fs.copySync('./public', './.next', { return !/diagram.js$/.test(src); }, }); + fs.outputFileSync('./.next/manifest.json', buildManifestJson()); +fs.outputFileSync('./public/manifest.json', buildManifestJson()); diff --git a/packages/client/next.config.js b/packages/client/next.config.js index 7785cd63..2f0b92cc 100644 --- a/packages/client/next.config.js +++ b/packages/client/next.config.js @@ -33,12 +33,9 @@ const nextConfig = semi({ typescript: { ignoreBuildErrors: true, }, - compiler: { - // removeConsole: process.env.NODE_ENV === 'production', - }, pwa: { disable: process.env.NODE_ENV !== 'production', - dest: '.next', + dest: 'public', sw: 'service-worker.js', runtimeCaching: pwaRuntimeCaching, }, diff --git a/packages/client/public/manifest.json b/packages/client/public/manifest.json new file mode 100644 index 00000000..876aeb2b --- /dev/null +++ b/packages/client/public/manifest.json @@ -0,0 +1 @@ +{"name":"云策文档","short_name":"云策文档","display":"standalone","start_url":"/","theme_color":"#ffffff","background_color":"#ffffff","icons":[{"src":"/icon72.png","sizes":"72x72","type":"image/png"},{"src":"/icon96.png","sizes":"96x96","type":"image/png"},{"src":"/icon120.png","sizes":"120x120","type":"image/png"},{"src":"/icon128.png","sizes":"128x128","type":"image/png"},{"src":"/icon144.png","sizes":"144x144","type":"image/png"},{"src":"/icon152.png","sizes":"152x152","type":"image/png"},{"src":"/icon180.png","sizes":"180x180","type":"image/png"},{"src":"/icon192.png","sizes":"192x192","type":"image/png"},{"src":"/icon384.png","sizes":"384x384","type":"image/png"},{"src":"/icon512.png","sizes":"512x512","type":"image/png"},{"src":"/maskable.png","sizes":"192x192","type":"image/png","purpose":"maskable"}]} \ No newline at end of file