# MiniShip **Repository Path**: onefly/MiniShip ## Basic Information - **Project Name**: MiniShip - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2026-09-21 - **Last Updated**: 2026-10-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 桌面部署工具(DeskDeploy) 本地桌面 GUI:把 **本地构建 → 产物传输 → 服务器命令** 编排成一条流水线,一键发布到 Linux 服务器。同一套服务器配置还可开交互式 SSH 终端,并在终端里用 SFTP 传文件。 技术栈:Wails v2 + Go 后端 + Vue 3 前端(终端用 xterm.js)。配置只保存在本机用户目录,不会上传到远端。 ## 能做什么 - 多台服务器、多个项目分开管理,服务器可被项目复用 - 三层编排每层可启用 / 禁用,也可单独测试 - 同一时间只跑一条流水线;实时日志推到前端 - 产物传输只负责上传并校验大小;远端备份、重启等动作写在远程命令里 - 完整部署写入历史,可回看日志 - 项目可导出 / 导入 JSON,方便拷到另一台机器 - 远程终端:选已保存的服务器连上交互式 Shell,可停靠在右侧或铺满窗口 - 文件传输:终端连上后浏览远端目录,拖入上传、双击下载,也可新建目录、删除 - 命令助手:把常用 shell 命令做成可填参数的模板。生成后可以复制、写入右侧终端、追加为远程步骤,或填入本地构建命令。内置模板只读;自定义模板只存在本机 ## 运行(开发) 依赖:Go 1.25+、Node.js 18+、[Wails CLI v2.15](https://wails.io) ```bash go install github.com/wailsapp/wails/v2/cmd/wails@v2.15.0 cd frontend && npm install && cd .. wails dev ``` Windows 上直接弹出桌面窗口。Linux / 无桌面环境可用浏览器预览(同一套后端 API,不依赖 WebView): ```bash cd frontend && npm run build && cd .. go run -tags web . --port 45281 ``` 浏览器打开 `http://127.0.0.1:45281`。浏览器预览里没有系统文件对话框,路径和导入文件需手动选择;终端粘贴走浏览器剪贴板。 ## 打包成 Windows 程序 在 **Windows** 开发机上(已装 WebView2、GCC / MinGW): ```bash wails build -platform windows/amd64 ``` 产物在 `build/bin/desk-deploy.exe`。需要安装包时再加 `-nsis`。 ## 配置存放位置 | 系统 | 目录 | | --- | --- | | Windows | `%AppData%\desk-deploy\` | | macOS | `~/Library/Application Support/desk-deploy/` | | Linux | `~/.config/desk-deploy/` | 文件:`servers.json`、`projects.json`、`history.json`、`command-templates.json`。可用环境变量 `DESK_DEPLOY_HOME` 覆盖目录(测试或便携模式)。 私钥路径按本机文件读取,MVP 不做加密。密码认证已预留并可用,密码同样明文写在本地 JSON,只适合内网。 ## 流水线规则 1. **本地构建**:关闭则直接使用已有产物;开启则在 `workDir` 依次执行 pre / build / post,并检查产物文件。失败只停本地,不动服务器。Windows 上 `cmd.exe` 的 GBK / GB18030 输出会转成 UTF-8 再写入日志。 2. **产物传输**:SSH + SFTP 上传并校验远端文件大小。目标若是已存在目录(或路径以 `/` 结尾),则写入该目录下的同名文件。不备份远端旧文件。 3. **远程命令**:逐步执行;`IgnoreError=false` 且退出码非 0 → 终止流水线。远端备份、重启等请写在本阶段步骤中。 4. SSH 使用 `InsecureIgnoreHostKey`,仅限内网工具。 ## 命令助手 选一条模板、填写参数,再生成命令。助手只拼出字符串,不会自己到远端执行。 取值顺序是手填、参数默认值、当前项目或服务器的上下文。有默认值时不再使用上下文。服务名可以从远端目标路径的文件名带出(`/opt/app/api` → `api`)。参数默认按 POSIX 单引号包裹。 - **复制**:写入剪贴板 - **发送到终端**:把命令和换行写入已经连上的 SSH 会话,远端 shell 会收到这一行 - **插入远程步骤**:追加到当前项目的远程命令,并打开该阶段。要等部署,或你在终端里自己执行 - **填入构建命令**:写入当前项目的 `buildCmd`。作用域是远程的模板不能用 标成危险的模板,除复制以外会先确认。自定义模板可以在界面里新建或另存为;也可以直接改 `command-templates.json`,重新打开或刷新后生效。界面保存会整文件覆盖。不要使用 `builtin-` 前缀。 ## 远程终端与文件传输 终端和部署流水线互不占用:流水线跑着时仍可开终端。同一时间只保持一条终端会话,换服务器会先断开当前连接。 文件面板挂在这条会话上(SFTP)。先连上终端,再打开「文件」: - 拖文件到面板,上传到当前远端目录 - 双击文件下载;桌面版弹出保存对话框,浏览器预览由浏览器下载 - 双击目录进入;可新建目录、删除选中项 ## 项目导入 / 导出 项目页可导出当前项目或全部项目,也可导入。文件是带 `kind` / `version` 的 JSON,也接受单个项目对象或项目数组。导入总是新建记录(不覆盖同 ID),名称冲突时自动加上「(导入)」。导出不含服务器配置和私钥。 ## 前端调用的后端方法 服务器:`GetServerList` / `SaveServer` / `DeleteServer` / `TestServerConn` / `PickPrivateKey` 项目:`GetProjectList` / `SaveProject` / `DeleteProject` / `TestBuild` / `PickDirectory` 导入导出:`ExportProjectJSON` / `ExportAllProjectsJSON` / `ImportProjectsJSON` / `ExportProjectToFile` / `ExportAllProjectsToFile` / `ImportProjectsFromFile` 部署:`RunDeploy` / `StopDeploy` / `TestTransfer` / `TestRemoteCmd` / `IsDeployRunning` 历史:`GetHistoryList` / `GetHistoryLog` / `DeleteHistory` 终端:`TermOpen` / `TermWrite` / `TermResize` / `TermClose` / `TermStatus` 文件:`FtpListRemote` / `FtpUpload` / `FtpDownload` / `FtpDownloadTo` / `FtpPickDownload` / `FtpMkdirRemote` / `FtpDeleteRemote` 命令:`ListCommandTemplates` / `SaveCommandTemplate` / `DeleteCommandTemplate` / `RenderCommand` / `CommandContext` 其它:`ConfigDir` 事件:`pipeline-log`(单行日志)、`pipeline-done`(结束状态)、`term-data`(终端输出,Base64)、`term-exit`(会话结束)。 ## 测试 ```bash go test ./... ```