Files
SeeyonFileSystem/server/deploy.sh
2026-07-10 17:33:33 +08:00

189 lines
5.4 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# ============================================
# 文件管理系统 - 本地构建脚本
# 作用:只构建部署产物,不依赖服务器环境
# ============================================
set -e
DEPLOY_DIR="./deploy"
echo "============================================"
echo " 本地构建部署产物"
echo "============================================"
# 清理旧包
[ -d "$DEPLOY_DIR" ] && rm -rf "$DEPLOY_DIR"
# 创建目录结构
echo "[1/4] 创建目录结构..."
mkdir -p "$DEPLOY_DIR/data/storage/{hot,cold,public,slave}"
# 编译(本地编译,去掉调试信息)
echo "[2/4] 编译后端..."
export GOPROXY=https://goproxy.cn,direct
go build -ldflags="-s -w" -o "$DEPLOY_DIR/server" main.go
# 复制配置与SQL
echo "[3/4] 复制配置文件..."
cp config.yaml "$DEPLOY_DIR/config.yaml.example"
cp -r sql "$DEPLOY_DIR/"
# 生成启动脚本、数据库初始化脚本、systemd服务
echo "[4/4] 生成启动/服务脚本..."
# 启动脚本里面会自动安装Go
cat > "$DEPLOY_DIR/start.sh" <<'STARTEOF'
#!/bin/bash
set -e
cd "$(dirname "$0")"
RUN_DIR=$(pwd)
echo "============================================"
echo " 服务启动脚本自动安装Go环境"
echo "============================================"
# ========== Go 版本配置 ==========
GO_VERSION="1.23.6"
INSTALL_DIR="/usr/local"
GO_TAR_DIR="${INSTALL_DIR}/go"
GO_BIN="${GO_TAR_DIR}/bin/go"
# ========== 安装/加载 Go ==========
install_go() {
echo "[1/3] 准备 Go ${GO_VERSION} 环境..."
ARCH=$(uname -m)
case $ARCH in
x86_64) GO_ARCH="amd64" ;;
aarch64) GO_ARCH="arm64" ;;
*) echo "不支持的架构: $ARCH"; exit 1 ;;
esac
GO_TAR="go${GO_VERSION}.linux-${GO_ARCH}.tar.gz"
GO_URL_MIRROR="https://golang.google.cn/dl/${GO_TAR}"
GO_URL_OFFICIAL="https://go.dev/dl/${GO_TAR}"
echo "下载 Go ${GO_VERSION}..."
DOWNLOAD_OK=0
for URL in "$GO_URL_MIRROR" "$GO_URL_OFFICIAL"; do
echo "尝试: $URL"
if command -v curl &>/dev/null; then
curl -L --connect-timeout 15 --retry 2 -o "/tmp/${GO_TAR}" "$URL" && DOWNLOAD_OK=1 && break
else
wget --timeout=15 -O "/tmp/${GO_TAR}" "$URL" && DOWNLOAD_OK=1 && break
fi
done
if [ "$DOWNLOAD_OK" -eq 0 ] || [ ! -s "/tmp/${GO_TAR}" ]; then
echo "下载失败,请手动安装 Go"
exit 1
fi
echo "解压..."
rm -rf "$GO_TAR_DIR"
tar -C "$INSTALL_DIR" -xzf "/tmp/${GO_TAR}"
rm -f "/tmp/${GO_TAR}"
}
# 检查是否已有Go
if ! command -v go &>/dev/null; then
if [ -f "$GO_BIN" ]; then
export PATH=$PATH:$GO_TAR_DIR/bin
else
install_go
export PATH=$PATH:$GO_TAR_DIR/bin
fi
fi
echo "[2/3] Go 版本: $(go version)"
# 检查配置文件
echo "[3/3] 检查配置..."
if [ ! -f "config.yaml" ]; then
echo "未找到 config.yaml从模板复制..."
cp config.yaml.example config.yaml
echo "请编辑 config.yaml 后重新启动"
exit 1
fi
echo "启动服务..."
echo "工作目录: $RUN_DIR"
./server
STARTEOF
chmod +x "$DEPLOY_DIR/start.sh"
# 数据库初始化脚本
cat > "$DEPLOY_DIR/init-db.sh" <<'DBEOF'
#!/bin/bash
cd "$(dirname "$0")"
echo "============================================"
echo " 数据库初始化"
echo "============================================"
echo "1) MySQL"
echo "2) PostgreSQL"
echo "3) SQL Server"
read -p "请选择数据库类型 [1/2/3]: " DB_TYPE
case $DB_TYPE in
1)
read -sp "MySQL root 密码: " DB_PWD; echo
read -p "数据库名 [seeyon_fs]: " DB_NAME; DB_NAME=${DB_NAME:-seeyon_fs}
mysql -u root -p"$DB_PWD" -e "CREATE DATABASE IF NOT EXISTS ${DB_NAME} DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
mysql -u root -p"$DB_PWD" "$DB_NAME" < sql/mysql/init.sql
echo "MySQL 初始化完成: $DB_NAME"
;;
2)
read -sp "PostgreSQL 密码: " DB_PWD; echo
read -p "数据库名 [seeyon_fs]: " DB_NAME; DB_NAME=${DB_NAME:-seeyon_fs}
export PGPASSWORD="$DB_PWD"
psql -U postgres -c "CREATE DATABASE $DB_NAME;" 2>/dev/null || true
psql -U postgres -d "$DB_NAME" -f sql/postgres/init.sql
unset PGPASSWORD
echo "PostgreSQL 初始化完成: $DB_NAME"
;;
3)
read -sp "SQL Server 密码: " DB_PWD; echo
read -p "数据库名 [seeyon_fs]: " DB_NAME; DB_NAME=${DB_NAME:-seeyon_fs}
sqlcmd -S localhost -U sa -P "$DB_PWD" -Q "CREATE DATABASE [$DB_NAME]" 2>/dev/null || true
sqlcmd -S localhost -U sa -P "$DB_PWD" -d "$DB_NAME" -i sql/sqlserver/init.sql
echo "SQL Server 初始化完成: $DB_NAME"
;;
*)
echo "无效选择"
exit 1
;;
esac
DBEOF
chmod +x "$DEPLOY_DIR/init-db.sh"
# systemd服务
cat > "$DEPLOY_DIR/filesystem.service" <<SVCEOF
[Unit]
Description=Seeyon File Management System
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=%d
ExecStart=%d/start.sh
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
SVCEOF
echo ""
echo "============================================"
echo " 构建完成!产物目录:$DEPLOY_DIR"
echo "============================================"
echo "只需上传 deploy 目录到 Linux 服务器即可"
echo ""
echo "服务器上操作:"
echo " cd deploy"
echo " chmod +x start.sh init-db.sh"
echo " ./init-db.sh # 初始化数据库"
echo " ./start.sh # 自动装Go并启动"
echo ""