Skip to content

Commit 2f3cab0

Browse files
committed
feat: add layer deploy feature
1 parent 3c60ed6 commit 2f3cab0

File tree

8 files changed

+129
-19
lines changed

8 files changed

+129
-19
lines changed

.env.example

+12-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,17 @@
1+
# 腾讯云授权密钥
12
TENCENT_SECRET_ID=xxx
23
TENCENT_SECRET_KEY=xxx
34

5+
# 部署地区
6+
REGION=ap-guangzhou
47

8+
# 静态资源上传 COS 桶名称
59
BUCKET=serverless-cnode
6-
REGION=ap-guangzhou
10+
11+
# API 网关自定义域名 和 证书 ID
12+
APIGW_CUSTOM_DOMAIN=cnode.yuga.chat
13+
APIGW_CUSTOM_DOMAIN_CERTID=xxx
14+
15+
# CDN 域名,证书 ID
16+
CDN_DOMAIN=static.cnode.yuga.chat
17+
CDN_DOMAIN_CERTID=xxx

README.md

+44-2
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@
1515
- [x] Express 自定义服务
1616
- [x] LRU 渲染缓存
1717
- [x] 基于 Next.js 的 Serverless 组件部署
18-
- [x] 静态资源分离,自动部署到 COS
19-
- [x] 自动为静态 COS 配置 CDN
18+
- [x] **静态资源分离,自动部署到 COS**
19+
- [x] **自动为静态 COS 配置 CDN**
20+
- [x] **node_modules 基于层部署,大大提高部署效率**
2021

2122
## 本地开发
2223

@@ -32,8 +33,49 @@ $ npm run dev
3233
$ npm run build
3334
```
3435

36+
## 配置
37+
38+
在部署到 Serverless 前,将 `.env.example` 重命名为 `.env`,并请完成如下配置:
39+
40+
```dotenv
41+
# 腾讯云授权密钥
42+
TENCENT_SECRET_ID=xxx
43+
TENCENT_SECRET_KEY=xxx
44+
45+
# 部署地区
46+
REGION=ap-guangzhou
47+
48+
# 静态资源上传 COS 桶名称
49+
BUCKET=serverless-cnode
50+
51+
# API 网关自定义域名 和 证书 ID
52+
APIGW_CUSTOM_DOMAIN=cnode.yuga.chat
53+
APIGW_CUSTOM_DOMAIN_CERTID=xxx
54+
55+
# CDN 域名,证书 ID
56+
CDN_DOMAIN=static.cnode.yuga.chat
57+
CDN_DOMAIN_CERTID=xxx
58+
```
59+
60+
> 注意:如果不需要使用 CDN,直接使用 COS 自动生成的域名,也是可以的,只需要删除
61+
> `serverless.yml` 中的 `cdnConf` 即可。
62+
3563
## 部署
3664

65+
此项目会先将 `node_modules` 部署到 [](),然后在部署项目代码,这样下次部署项目
66+
时,如果 `node_modules` 没有修改,我们就不需要部署庞大的 `node_modules` 文件夹了
67+
68+
69+
1. 部署层:
70+
71+
```bash
72+
$ npm run deploy:layer
73+
```
74+
75+
> 注意:如果项目 `node_modules` 没有变更,就不需要执行此命令。
76+
77+
2. 部署业务代码:
78+
3779
```bash
3880
$ npm run deploy
3981
```

layer/serverless.yml

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
org: serverless-cnode
2+
app: serverless-cnode
3+
stage: dev
4+
component: layer
5+
name: serverless-cnode-layer
6+
7+
inputs:
8+
region: ${env:REGION}
9+
name: ${name}
10+
src: ../node_modules
11+
runtimes:
12+
- Nodejs10.15
13+
- Nodejs12.16

package.json

+5-2
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33
"version": "0.0.1",
44
"scripts": {
55
"dev": "nodemon",
6-
"build": "cross-env NODE_ENV=production next build && tsc --project tsconfig.server.json",
6+
"build": "rimraf .next && cross-env NODE_ENV=production next build && tsc --project tsconfig.server.json",
7+
"build:sls": "rimraf .next && cross-env NODE_ENV=production SERVERLESS=true next build && tsc --project tsconfig.server.json",
78
"start": "cross-env NODE_ENV=production node ./dist/index.js",
8-
"deploy": "sls deploy"
9+
"deploy": "sls deploy",
10+
"deploy:layer": "sls deploy --target=./layer"
911
},
1012
"keywords": [
1113
"next.js",
@@ -63,6 +65,7 @@
6365
"nodemon": "^2.0.4",
6466
"postcss-loader": "^3.0.0",
6567
"postcss-pxtransform": "^2.2.9",
68+
"rimraf": "^3.0.2",
6669
"sass-loader": "^8.0.2",
6770
"ts-node": "^8.10.2",
6871
"tslint": "^6.1.2",

server/index.ts

+25-7
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ async function cacheRender(req, res) {
3838
}
3939
}
4040

41+
// not report route for custom monitor
42+
const noReportRoutes = ['/_next', '/static'];
43+
4144
async function startServer() {
4245
await app.prepare();
4346

@@ -73,18 +76,33 @@ async function startServer() {
7376
});
7477

7578
server.get('*', (req, res) => {
79+
noReportRoutes.forEach((route) => {
80+
if (req.path.indexOf(route) === 0) {
81+
req['__SLS_NO_REPORT__'] = true;
82+
}
83+
});
7684
return handle(req, res);
7785
});
7886

79-
server.listen(port, () => {
80-
console.log(`> Ready on http://localhost:${port}`);
81-
});
87+
// define binary type for response
88+
// if includes, will return base64 encoded, very useful for images
89+
server['binaryTypes'] = ['*/*'];
90+
91+
return server;
8292
}
8393

84-
try {
85-
startServer();
86-
} catch (e) {
87-
throw e;
94+
if (process.env.SERVERLESS) {
95+
module.exports = startServer;
96+
} else {
97+
try {
98+
startServer().then((server) => {
99+
server.listen(port, () => {
100+
console.log(`> Ready on http://localhost:${port}`);
101+
});
102+
});
103+
} catch (e) {
104+
throw e;
105+
}
88106
}
89107

90108
process.on('unhandledRejection', (e) => {

serverless.yml

+17-7
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,34 @@ name: serverless-cnode
77
inputs:
88
src:
99
dist: ./
10-
hook: npm run build
10+
hook: npm run build:sls
1111
exclude:
1212
- .env
13+
- '.git/**'
14+
- 'docs/**'
1315
- '.next/cache/**'
14-
region: ap-guangzhou
16+
- 'node_modules/**'
17+
region: ${env:REGION}
1518
runtime: Nodejs10.15
1619
functionName: serverless-cnode
20+
layers:
21+
- name: ${output:${stage}:${app}:${name}-layer.name}
22+
version: ${output:${stage}:${app}:${name}-layer.version}
1723
functionConf:
1824
timeout: 10
25+
environment:
26+
variables:
27+
NODE_ENV: production
28+
SERVERLESS: true
1929
apigatewayConf:
2030
protocols:
2131
- http
2232
- https
2333
environment: release
2434
enableCORS: true
2535
customDomains:
26-
- domain: cnode.yuga.chat
27-
certificateId: eGesL28k
36+
- domain: ${env.APIGW_CUSTOM_DOMAIN}
37+
certificateId: ${env.APIGW_CUSTOM_DOMAIN_CERTID}
2838
pathMappingSet:
2939
- path: /
3040
environment: release
@@ -33,10 +43,10 @@ inputs:
3343
- https
3444
staticCdn:
3545
cosConf:
36-
bucket: serverless-cnode
46+
bucket: ${env:BUCKET}
3747
cdnConf:
3848
# after you deploy CDN once, just set onlyRefresh to true for refresh CDN cache
3949
onlyRefresh: true
40-
domain: static.cnode.yuga.chat
50+
domain: ${env.CDN_DOMAIN}
4151
https:
42-
certId: eGkM75xv
52+
certId: ${env.CDN_DOMAIN_CERTID}

sls.js

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
process.env.NODE_ENV = 'production';
2+
process.env.SERVERLESS = true;
3+
4+
const createServer = require('./dist')
5+
6+
module.exports = createServer

yarn.lock

+7
Original file line numberDiff line numberDiff line change
@@ -7154,6 +7154,13 @@ rimraf@2, rimraf@^2.5.4, rimraf@^2.6.3, rimraf@^2.7.1:
71547154
dependencies:
71557155
glob "^7.1.3"
71567156

7157+
rimraf@^3.0.2:
7158+
version "3.0.2"
7159+
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
7160+
integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
7161+
dependencies:
7162+
glob "^7.1.3"
7163+
71577164
ripemd160@^2.0.0, ripemd160@^2.0.1:
71587165
version "2.0.2"
71597166
resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"

0 commit comments

Comments
 (0)