feat: 添加版本更新功能
- 新增 .version 文件(JSON 格式:version/release_date/changelog) - 新增 lib/update.ts 更新逻辑(版本检查、git clone、docker compose) - 新增 /api/update/check 版本检查 API - 新增 /api/update/execute 执行更新 API(SSE 流式日志) - 新增设置页「版本更新」界面(含 changelog 展示) - Dockerfile 添加 git、docker CLI;compose 挂载 docker socket - .env.docker 添加 ONEDEV_ACCESS_TOKEN 配置
This commit is contained in:
@@ -0,0 +1,18 @@
|
||||
import { NextResponse } from "next/server";
|
||||
import { checkForUpdate } from "@/lib/update";
|
||||
|
||||
// GET /api/update/check - 检查是否有可用更新
|
||||
export async function GET() {
|
||||
try {
|
||||
const versionInfo = await checkForUpdate();
|
||||
return NextResponse.json({
|
||||
success: true,
|
||||
data: versionInfo,
|
||||
});
|
||||
} catch (error) {
|
||||
return NextResponse.json(
|
||||
{ success: false, error: "检查更新失败" },
|
||||
{ status: 500 }
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
import { executeUpdate } from "@/lib/update";
|
||||
|
||||
// POST /api/update/execute - 执行容器更新(SSE 流式输出日志)
|
||||
export async function POST() {
|
||||
const encoder = new TextEncoder();
|
||||
|
||||
const stream = new ReadableStream({
|
||||
async start(controller) {
|
||||
// 发送日志的辅助函数
|
||||
const sendLog = (message: string) => {
|
||||
const data = JSON.stringify({ log: message });
|
||||
controller.enqueue(encoder.encode(`data: ${data}\n\n`));
|
||||
};
|
||||
|
||||
try {
|
||||
const result = await executeUpdate(sendLog);
|
||||
|
||||
// 发送最终结果
|
||||
const finalData = JSON.stringify({
|
||||
done: true,
|
||||
success: result.success,
|
||||
message: result.message,
|
||||
});
|
||||
controller.enqueue(encoder.encode(`data: ${finalData}\n\n`));
|
||||
} catch (error) {
|
||||
const errMsg =
|
||||
error instanceof Error ? error.message : "未知错误";
|
||||
controller.enqueue(
|
||||
encoder.encode(
|
||||
`data: ${JSON.stringify({ done: true, success: false, message: errMsg })}\n\n`
|
||||
)
|
||||
);
|
||||
} finally {
|
||||
controller.close();
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
return new Response(stream, {
|
||||
headers: {
|
||||
"Content-Type": "text/event-stream",
|
||||
"Cache-Control": "no-cache",
|
||||
Connection: "keep-alive",
|
||||
},
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user