[refactored] update method of production environment

This commit is contained in:
Zhanpeng Yang 2024-09-25 20:15:42 +08:00
parent 6d3b3435fe
commit 6f9dd0224c
9 changed files with 91 additions and 26 deletions

View File

@ -1,4 +1,10 @@
# 更新日志
## v0.0.1.20240925_alpha
### 🚀Refactored
- 修改next.config.mjs内的output为standalone模式便于后面生产部署
- 优化编译部署命令
- 使用run.ps1辅助执行编译部署等命令
## v0.0.1.20240912_base

View File

@ -9,8 +9,10 @@ RUN npm config set registry https://registry.npmmirror.com &&\
WORKDIR /app
# 指定容器创建时的默认命令。(可以被覆盖)
CMD ln -snf /env/node_modules /app &&\
npm run dev
CMD ln -snf /env/node_modules /app &&\
npm run start
# 声明容器运行时监听的特定网络端口。但不会真的映射到外面
EXPOSE 3000

View File

@ -1,12 +1,13 @@
## Getting Started
## 开发命令
注意此命令依赖PowerShell 7
- `./run.ps1 build_docker` 构建运行环境的容器
- `./run.ps1 dev` 启动开发环境
- `./run.ps1 prod` 启动生产环境
First, run the development server:
- `./run.ps1 remove_docker` 删除相关容器
- `./run.ps1 release`:打包生产环境所需的文件
```bash
docker compose up
```
发布:
1. 在docker环境内编译npm run build
2. 打包Compress-Archive -Path .next/standalone/*,.next/static -DestinationPath ./release/tmp.zip
3. 运行 docker run -p 4000:3000 -v C:\SEMS-development\SEMS-on-device-server\release:/app sems-on-device-server-server:latest sh -c 'ln -snf /env/node_modules /app && npm run start'
## 使用方法
1. 当更新docker运行环境后运行`./run.ps1 build_docker`重新编译镜像
2. 当开发时运行`./run.ps1 dev`即可,当文件修改后能够自动重新编译
2. 当需要发布时,运行`./run.ps1 release`即可得到相关文件,然后运行 `./run.ps1 prod`可直接尝试生成的文件是否好用

View File

@ -1,8 +0,0 @@
services:
server:
build: ./
container_name: sems_on_device_server
ports:
- 3000:3000
volumes:
- ./:/app

View File

@ -1,4 +1,4 @@
/** @type {import('next').NextConfig} */
const nextConfig = {};
const nextConfig = {output: 'standalone'};
export default nextConfig;

View File

@ -10,8 +10,7 @@
"./"
],
"env": {
"NODE_ENV": "development",
"RAW_DATA_DIR": "C:/tmp/"
"NODE_ENV": "development"
},
"ext": "js,json"
}

65
run.ps1 Normal file
View File

@ -0,0 +1,65 @@
Param( [string]$cmd, [string]$version)
If($cmd -eq "build_docker"){
docker build -t sems-on-device-server:latest .
}
If($cmd -eq "dev"){
docker run --rm -p "22110:22110" -v "C:\SEMS-development\SEMS-on-device-server:/app" -v "C:\tmp:/data" --name sems-on-device-server sems-on-device-server:latest sh -c "ln -snf /env/node_modules /app && npm run dev"
}
If($cmd -eq "prod"){
docker run --rm -p "22110:22110" -v "C:\SEMS-development\SEMS-on-device-server\build\latest:/app" -v "C:\tmp:/data" --name sems-on-device-server sems-on-device-server:latest
}
If($cmd -eq "remove_docker"){
docker stop sems-on-device-server
}
If($cmd -eq "release"){
# 提前删除.next文件夹根据实测应该会影响后面的编编译原因未知
# 现象单独在powershell命令行执行docker run没问题但是在脚本中执行完全一样的命令就会报错
# 然后分别从命令行/脚本进入容器内docker run --rm -it -v "C:\SEMS-development\SEMS-on-device-server:/app" --name sems-on-device-server sems-on-device-server:latest sh
# 手动执行npm run build发现仍然时命令行可以编译但是脚本会报错找不到库
# 然后发现在脚本环境下npm run build执行前node_model文件夹正常但执行后发现为空白了node_model文件夹下什么都没了
# 猜测是因为脚本执行有安全限制,限制了资源使用?不是特别确定原因。
# 但发现删除了.next后就正常了
If(Test-Path "./.next"){
Remove-Item -Path "./.next" -Recurse
Write-Host "./.next is Removed"
}
#在docker容器内编译
docker run --rm -v "C:\SEMS-development\SEMS-on-device-server:/app" --name sems-on-device-server sems-on-device-server:latest sh -c "ln -snf /env/node_modules /app && npm run build"
#.next/static文件夹存在则证明编译完了
If (Test-Path ".next/static"){
#复制static文件夹
Copy-Item -Path .next/static -Destination .next/standalone/.next -Recurse -Force
#把.next/standalone文件夹下的所有文件与.next打包。之所以不用通配符.next/standalone/*是因为这个目录下还有node_modules是软连接会报错。
Compress-Archive -Path .next/standalone/*.*,.next/standalone/.next -DestinationPath "./build/SEMS-on-device-server-$version.zip" -Force
Write-Host "Released /build/SEMS-on-device-server-$version.zip"
#直接解压一份,便于后面模拟生产环境测试
If(Test-Path "./build/latest"){ #如果当前目录下build文件夹存在
Remove-Item -Path "./build/latest" -Recurse #递归删除build文件夹
}
Expand-Archive -Path "./build/SEMS-on-device-server-$version.zip" -DestinationPath "./build/latest" -Force
Write-Host "Expanded SEMS-on-device-server-$version.zip to ./build/latest"
}else{
Write-Host "Build Error, Please retry"
}
}

View File

@ -19,7 +19,7 @@ function get_latest_file_path(raw_spectral_data_dir){
async function main(){
try {
// process.send("child process started");
const raw_spectral_data_dir="C:/tmp/"
const raw_spectral_data_dir="/data"
let last_data_file=null
let latest_data_file=null
@ -58,7 +58,7 @@ async function main(){
let upload_data={"spectral_data_bin":spectral_buffer }
let upload_data_compressed = pako.gzip(pack(upload_data))
let response=await fetch("http://127.0.0.1:5000/post", {
let response=await fetch("http://inference_server:8000/post", {
method: "post",
body: upload_data_compressed
})

View File

@ -5,7 +5,7 @@ import {fork} from "node:child_process"
const dev = process.env.NODE_ENV !== "production";
const hostname = "0.0.0.0";
const port = 3000;
const port = 22110;
// when using middleware `hostname` and `port` must be provided below
const app = next({ dev, hostname, port });
const handler = app.getRequestHandler();