mirror of
https://github.com/Awuqing/BackupX.git
synced 2026-09-08 17:08:14 +08:00
fix(Install): 修复发布包安装脚本路径
This commit is contained in:
@@ -116,12 +116,15 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
cp deploy/nginx.conf "${ARCHIVE_NAME}/nginx.conf" 2>/dev/null || true
|
cp deploy/nginx.conf "${ARCHIVE_NAME}/nginx.conf" 2>/dev/null || true
|
||||||
tar czf "${ARCHIVE_NAME}.tar.gz" "${ARCHIVE_NAME}"
|
tar czf "${ARCHIVE_NAME}.tar.gz" "${ARCHIVE_NAME}"
|
||||||
|
cp "${ARCHIVE_NAME}.tar.gz" "backupx-${{ matrix.goos }}-${{ matrix.goarch }}.tar.gz"
|
||||||
|
|
||||||
- name: Upload to GitHub Release
|
- name: Upload to GitHub Release
|
||||||
uses: softprops/action-gh-release@v2
|
uses: softprops/action-gh-release@v2
|
||||||
with:
|
with:
|
||||||
tag_name: ${{ env.VERSION }}
|
tag_name: ${{ env.VERSION }}
|
||||||
files: backupx-${{ env.VERSION }}-${{ matrix.goos }}-${{ matrix.goarch }}.tar.gz
|
files: |
|
||||||
|
backupx-${{ env.VERSION }}-${{ matrix.goos }}-${{ matrix.goarch }}.tar.gz
|
||||||
|
backupx-${{ matrix.goos }}-${{ matrix.goarch }}.tar.gz
|
||||||
generate_release_notes: true
|
generate_release_notes: true
|
||||||
|
|
||||||
# ─── Job 3: Docker 多架构 → Docker Hub ───
|
# ─── Job 3: Docker 多架构 → Docker Hub ───
|
||||||
|
|||||||
@@ -62,6 +62,8 @@ curl -LO https://github.com/Awuqing/BackupX/releases/latest/download/backupx-lin
|
|||||||
tar xzf backupx-*.tar.gz && cd backupx-* && sudo ./install.sh
|
tar xzf backupx-*.tar.gz && cd backupx-* && sudo ./install.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
|
For ARM64 hosts, use `backupx-linux-arm64.tar.gz`. The archive contains `backupx`, `web/`, `config.example.yaml`, and `install.sh`; run `install.sh` from the extracted directory.
|
||||||
|
|
||||||
Open `http://your-server:8340`, create the admin account, then follow the [5-minute Quick Start](https://awuqing.github.io/BackupX/docs/getting-started/quick-start).
|
Open `http://your-server:8340`, create the admin account, then follow the [5-minute Quick Start](https://awuqing.github.io/BackupX/docs/getting-started/quick-start).
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|||||||
@@ -62,6 +62,8 @@ curl -LO https://github.com/Awuqing/BackupX/releases/latest/download/backupx-lin
|
|||||||
tar xzf backupx-*.tar.gz && cd backupx-* && sudo ./install.sh
|
tar xzf backupx-*.tar.gz && cd backupx-* && sudo ./install.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
|
ARM64 主机请下载 `backupx-linux-arm64.tar.gz`。预编译包内包含 `backupx`、`web/`、`config.example.yaml` 和 `install.sh`,请在解压后的目录内执行 `install.sh`。
|
||||||
|
|
||||||
打开 `http://your-server:8340`,创建管理员账户,按 [5 分钟快速开始](https://awuqing.github.io/BackupX/zh-Hans/docs/getting-started/quick-start) 完成首次备份。
|
打开 `http://your-server:8340`,创建管理员账户,按 [5 分钟快速开始](https://awuqing.github.io/BackupX/zh-Hans/docs/getting-started/quick-start) 完成首次备份。
|
||||||
|
|
||||||
## 文档
|
## 文档
|
||||||
|
|||||||
+47
-9
@@ -1,17 +1,25 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
set -eu
|
set -eu
|
||||||
|
|
||||||
PROJECT_ROOT=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)
|
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
|
||||||
|
PROJECT_ROOT=$(CDPATH= cd -- "$SCRIPT_DIR/.." && pwd)
|
||||||
PREFIX="${PREFIX:-/opt/backupx}"
|
PREFIX="${PREFIX:-/opt/backupx}"
|
||||||
ETC_DIR="${ETC_DIR:-/etc/backupx}"
|
ETC_DIR="${ETC_DIR:-/etc/backupx}"
|
||||||
SERVICE_NAME="backupx"
|
SERVICE_NAME="backupx"
|
||||||
APP_USER="backupx"
|
APP_USER="backupx"
|
||||||
APP_GROUP="backupx"
|
APP_GROUP="backupx"
|
||||||
BIN_SOURCE="${BIN_SOURCE:-$PROJECT_ROOT/server/backupx}"
|
if [ -f "$SCRIPT_DIR/backupx" ] && [ -d "$SCRIPT_DIR/web" ]; then
|
||||||
WEB_SOURCE="${WEB_SOURCE:-$PROJECT_ROOT/web/dist}"
|
BIN_SOURCE="${BIN_SOURCE:-$SCRIPT_DIR/backupx}"
|
||||||
CONFIG_TEMPLATE="${CONFIG_TEMPLATE:-$PROJECT_ROOT/server/config.example.yaml}"
|
WEB_SOURCE="${WEB_SOURCE:-$SCRIPT_DIR/web}"
|
||||||
|
CONFIG_TEMPLATE="${CONFIG_TEMPLATE:-$SCRIPT_DIR/config.example.yaml}"
|
||||||
|
NGINX_SOURCE="${NGINX_SOURCE:-$SCRIPT_DIR/nginx.conf}"
|
||||||
|
else
|
||||||
|
BIN_SOURCE="${BIN_SOURCE:-$PROJECT_ROOT/server/backupx}"
|
||||||
|
WEB_SOURCE="${WEB_SOURCE:-$PROJECT_ROOT/web/dist}"
|
||||||
|
CONFIG_TEMPLATE="${CONFIG_TEMPLATE:-$PROJECT_ROOT/server/config.example.yaml}"
|
||||||
|
NGINX_SOURCE="${NGINX_SOURCE:-$PROJECT_ROOT/deploy/nginx.conf}"
|
||||||
|
fi
|
||||||
SERVICE_SOURCE="${SERVICE_SOURCE:-$PROJECT_ROOT/deploy/backupx.service}"
|
SERVICE_SOURCE="${SERVICE_SOURCE:-$PROJECT_ROOT/deploy/backupx.service}"
|
||||||
NGINX_SOURCE="${NGINX_SOURCE:-$PROJECT_ROOT/deploy/nginx.conf}"
|
|
||||||
|
|
||||||
if [ "$(id -u)" -ne 0 ]; then
|
if [ "$(id -u)" -ne 0 ]; then
|
||||||
echo "请使用 root 或 sudo 执行安装脚本。" >&2
|
echo "请使用 root 或 sudo 执行安装脚本。" >&2
|
||||||
@@ -20,13 +28,20 @@ fi
|
|||||||
|
|
||||||
if [ ! -f "$BIN_SOURCE" ]; then
|
if [ ! -f "$BIN_SOURCE" ]; then
|
||||||
echo "未找到后端二进制:$BIN_SOURCE" >&2
|
echo "未找到后端二进制:$BIN_SOURCE" >&2
|
||||||
echo "请先执行:cd \"$PROJECT_ROOT/server\" && go build -o backupx ./cmd/backupx" >&2
|
echo "源码树安装请先执行:cd \"$PROJECT_ROOT/server\" && go build -o backupx ./cmd/backupx" >&2
|
||||||
|
echo "发布包安装请确认当前目录包含 ./backupx、./web 和 ./install.sh。" >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ ! -d "$WEB_SOURCE" ]; then
|
if [ ! -d "$WEB_SOURCE" ]; then
|
||||||
echo "未找到前端构建产物:$WEB_SOURCE" >&2
|
echo "未找到前端构建产物:$WEB_SOURCE" >&2
|
||||||
echo "请先执行:cd \"$PROJECT_ROOT/web\" && npm run build" >&2
|
echo "源码树安装请先执行:cd \"$PROJECT_ROOT/web\" && npm run build" >&2
|
||||||
|
echo "发布包安装请确认当前目录包含 ./web。" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f "$CONFIG_TEMPLATE" ]; then
|
||||||
|
echo "未找到配置模板:$CONFIG_TEMPLATE" >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -47,11 +62,34 @@ if [ ! -f "$ETC_DIR/config.yaml" ]; then
|
|||||||
install -m 0640 "$CONFIG_TEMPLATE" "$ETC_DIR/config.yaml"
|
install -m 0640 "$CONFIG_TEMPLATE" "$ETC_DIR/config.yaml"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
install -m 0644 "$SERVICE_SOURCE" "/etc/systemd/system/$SERVICE_NAME.service"
|
if [ -f "$SERVICE_SOURCE" ]; then
|
||||||
|
install -m 0644 "$SERVICE_SOURCE" "/etc/systemd/system/$SERVICE_NAME.service"
|
||||||
|
else
|
||||||
|
cat > "/etc/systemd/system/$SERVICE_NAME.service" <<UNIT
|
||||||
|
[Unit]
|
||||||
|
Description=BackupX API Service
|
||||||
|
After=network-online.target
|
||||||
|
Wants=network-online.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=$APP_USER
|
||||||
|
Group=$APP_GROUP
|
||||||
|
WorkingDirectory=$PREFIX
|
||||||
|
ExecStart=$PREFIX/bin/backupx -config $ETC_DIR/config.yaml
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5
|
||||||
|
NoNewPrivileges=true
|
||||||
|
LimitNOFILE=65535
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
UNIT
|
||||||
|
fi
|
||||||
systemctl daemon-reload
|
systemctl daemon-reload
|
||||||
systemctl enable --now "$SERVICE_NAME"
|
systemctl enable --now "$SERVICE_NAME"
|
||||||
|
|
||||||
if [ -d "/etc/nginx/conf.d" ]; then
|
if [ -d "/etc/nginx/conf.d" ] && [ -f "$NGINX_SOURCE" ]; then
|
||||||
install -m 0644 "$NGINX_SOURCE" "/etc/nginx/conf.d/$SERVICE_NAME.conf"
|
install -m 0644 "$NGINX_SOURCE" "/etc/nginx/conf.d/$SERVICE_NAME.conf"
|
||||||
if command -v nginx >/dev/null 2>&1; then
|
if command -v nginx >/dev/null 2>&1; then
|
||||||
nginx -t
|
nginx -t
|
||||||
|
|||||||
@@ -0,0 +1,41 @@
|
|||||||
|
package installscript
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestDeployInstallScriptSyntax(t *testing.T) {
|
||||||
|
scriptPath := filepath.Join("..", "..", "..", "deploy", "install.sh")
|
||||||
|
cmd := exec.Command("sh", "-n", scriptPath)
|
||||||
|
output, err := cmd.CombinedOutput()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("install.sh syntax invalid: %v\n%s", err, output)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDeployInstallScriptSupportsReleasePackageLayout(t *testing.T) {
|
||||||
|
scriptPath := filepath.Join("..", "..", "..", "deploy", "install.sh")
|
||||||
|
data, err := os.ReadFile(scriptPath)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
script := string(data)
|
||||||
|
for _, want := range []string{
|
||||||
|
`SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)`,
|
||||||
|
`if [ -f "$SCRIPT_DIR/backupx" ] && [ -d "$SCRIPT_DIR/web" ]; then`,
|
||||||
|
`BIN_SOURCE="${BIN_SOURCE:-$SCRIPT_DIR/backupx}"`,
|
||||||
|
`WEB_SOURCE="${WEB_SOURCE:-$SCRIPT_DIR/web}"`,
|
||||||
|
`CONFIG_TEMPLATE="${CONFIG_TEMPLATE:-$SCRIPT_DIR/config.example.yaml}"`,
|
||||||
|
`发布包安装请确认当前目录包含 ./backupx、./web 和 ./install.sh。`,
|
||||||
|
`cat > "/etc/systemd/system/$SERVICE_NAME.service" <<UNIT`,
|
||||||
|
`if [ -d "/etc/nginx/conf.d" ] && [ -f "$NGINX_SOURCE" ]; then`,
|
||||||
|
} {
|
||||||
|
if !strings.Contains(script, want) {
|
||||||
|
t.Fatalf("install.sh missing %q", want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user