Update deployment scripts, add leaderboard feature, and bump version to 2.0.0
This commit is contained in:
130
update.sh
130
update.sh
@@ -8,33 +8,119 @@ DEST_DIR=/srv/taiko-web
|
||||
SONGS_DIR="$DEST_DIR/public/songs"
|
||||
BACKUP_DIR="$DEST_DIR/.backup_songs_$(date +%Y%m%d_%H%M%S)"
|
||||
|
||||
systemctl stop taiko-web || true
|
||||
echo "正在检测部署模式..."
|
||||
|
||||
if [ -d "$SONGS_DIR" ]; then
|
||||
mkdir -p "$BACKUP_DIR"
|
||||
rsync -a "$SONGS_DIR/" "$BACKUP_DIR/" || cp -a "$SONGS_DIR/." "$BACKUP_DIR/"
|
||||
MODE="unknown"
|
||||
if [ -f "$DEST_DIR/docker-compose.yml" ]; then
|
||||
MODE="docker"
|
||||
elif systemctl list-unit-files | grep -q '^taiko-web\.service'; then
|
||||
MODE="direct"
|
||||
fi
|
||||
|
||||
mkdir -p "$DEST_DIR"
|
||||
rsync -a --delete \
|
||||
--exclude '.git' \
|
||||
--exclude '.venv' \
|
||||
--exclude 'public/songs' \
|
||||
"$SRC_DIR/" "$DEST_DIR/"
|
||||
echo "部署模式: $MODE"
|
||||
|
||||
if [ -x "$DEST_DIR/.venv/bin/pip" ]; then
|
||||
"$DEST_DIR/.venv/bin/pip" install -U pip
|
||||
"$DEST_DIR/.venv/bin/pip" install -r "$DEST_DIR/requirements.txt"
|
||||
fi
|
||||
# Function: Common Backup
|
||||
backup_songs() {
|
||||
if [ -d "$SONGS_DIR" ]; then
|
||||
echo "备份歌曲目录..."
|
||||
mkdir -p "$BACKUP_DIR"
|
||||
rsync -a "$SONGS_DIR/" "$BACKUP_DIR/" || cp -a "$SONGS_DIR/." "$BACKUP_DIR/"
|
||||
fi
|
||||
}
|
||||
|
||||
chown -R www-data:www-data "$DEST_DIR"
|
||||
restore_songs() {
|
||||
if [ -d "$BACKUP_DIR" ]; then
|
||||
echo "恢复歌曲目录..."
|
||||
mkdir -p "$SONGS_DIR"
|
||||
rsync -a "$BACKUP_DIR/" "$SONGS_DIR/" || cp -a "$BACKUP_DIR/." "$SONGS_DIR/"
|
||||
fi
|
||||
}
|
||||
|
||||
if [ -d "$BACKUP_DIR" ]; then
|
||||
mkdir -p "$SONGS_DIR"
|
||||
rsync -a "$BACKUP_DIR/" "$SONGS_DIR/" || cp -a "$BACKUP_DIR/." "$SONGS_DIR/"
|
||||
fi
|
||||
sync_files() {
|
||||
echo "同步文件到 $DEST_DIR..."
|
||||
mkdir -p "$DEST_DIR"
|
||||
# Sync but exclude data directories and config
|
||||
rsync -a --delete \
|
||||
--exclude '.git' \
|
||||
--exclude '.venv' \
|
||||
--exclude 'public/songs' \
|
||||
--exclude 'mongo-data' \
|
||||
--exclude 'redis-data' \
|
||||
--exclude 'config.py' \
|
||||
--exclude 'docker-compose.yml' \
|
||||
"$SRC_DIR/" "$DEST_DIR/"
|
||||
|
||||
# If config.py missing in dest, copy example (only for first time, but update shouldn't overwrite)
|
||||
if [ ! -f "$DEST_DIR/config.py" ] && [ -f "$SRC_DIR/config.example.py" ]; then
|
||||
cp "$SRC_DIR/config.example.py" "$DEST_DIR/config.py"
|
||||
fi
|
||||
|
||||
# If docker mode, explicit check for docker-compose.yml?
|
||||
# Usually setup.sh generates it only.
|
||||
# If we updated setup.sh (like I just did), we might want to update docker-compose.yml?
|
||||
# No, user config might be there. Better leave it unless missing.
|
||||
# However, if setup.sh changed docker-compose template, existing one might be stale.
|
||||
# But usually docker-compose.yml is static enough.
|
||||
}
|
||||
|
||||
systemctl daemon-reload || true
|
||||
systemctl restart taiko-web || systemctl start taiko-web || true
|
||||
if [ "$MODE" == "docker" ]; then
|
||||
echo "=== 更新 Docker 部署 ==="
|
||||
|
||||
# Backup
|
||||
backup_songs
|
||||
|
||||
systemctl is-active --quiet taiko-web
|
||||
# Stop containers
|
||||
cd "$DEST_DIR"
|
||||
if command -v docker-compose >/dev/null 2>&1; then
|
||||
docker-compose down
|
||||
else
|
||||
docker compose down
|
||||
fi
|
||||
|
||||
# Sync
|
||||
sync_files
|
||||
|
||||
# Restore (if needed, though rsync exclude should handle it, double safety)
|
||||
restore_songs
|
||||
|
||||
# Rebuild and Start
|
||||
echo "重建并启动容器..."
|
||||
if command -v docker-compose >/dev/null 2>&1; then
|
||||
docker-compose up -d --build --remove-orphans
|
||||
else
|
||||
docker compose up -d --build --remove-orphans
|
||||
fi
|
||||
|
||||
echo "清理旧镜像..."
|
||||
docker image prune -f || true
|
||||
|
||||
echo "=== Docker 更新完成 ==="
|
||||
|
||||
elif [ "$MODE" == "direct" ]; then
|
||||
echo "=== 更新直接部署 ==="
|
||||
|
||||
systemctl stop taiko-web || true
|
||||
|
||||
backup_songs
|
||||
sync_files
|
||||
|
||||
# Update venv
|
||||
if [ -x "$DEST_DIR/.venv/bin/pip" ]; then
|
||||
echo "更新依赖..."
|
||||
"$DEST_DIR/.venv/bin/pip" install -U pip
|
||||
"$DEST_DIR/.venv/bin/pip" install -r "$DEST_DIR/requirements.txt"
|
||||
fi
|
||||
|
||||
chown -R www-data:www-data "$DEST_DIR"
|
||||
restore_songs
|
||||
|
||||
systemctl daemon-reload || true
|
||||
systemctl restart taiko-web || systemctl start taiko-web || true
|
||||
|
||||
systemctl is-active --quiet taiko-web
|
||||
echo "=== 直接部署更新完成 ==="
|
||||
|
||||
else
|
||||
echo "未检测到已知部署 (Docker 或 Systemd)。请先运行 setup.sh 进行安装。"
|
||||
exit 1
|
||||
fi
|
||||
Reference in New Issue
Block a user