added:增加Linux-server
This commit is contained in:
1 parent
6fe4e9d23f
commit
d78f3f811b
90 files changed
+16784
-1
No files matched your search
@@ -0,0 +1,105 @@
|
||||
#!/bin/bash
|
||||
# Write Server 备份脚本
|
||||
# 备份博客数据和配置
|
||||
|
||||
set -e
|
||||
|
||||
echo "==================================="
|
||||
echo " Write Server 备份脚本"
|
||||
echo "==================================="
|
||||
|
||||
# 配置
|
||||
BACKUP_DIR="./backups"
|
||||
DATE=$(date +%Y%m%d_%H%M%S)
|
||||
BACKUP_NAME="write-server-${DATE}"
|
||||
BACKUP_FILE="${BACKUP_DIR}/${BACKUP_NAME}.tar.gz"
|
||||
|
||||
# 加载环境变量
|
||||
if [ -f .env ]; then
|
||||
source .env
|
||||
fi
|
||||
|
||||
# 检查 BLOG_ROOT
|
||||
if [ -z "$BLOG_ROOT" ]; then
|
||||
echo "警告: BLOG_ROOT 未配置,将仅备份配置文件"
|
||||
BLOG_ROOT=""
|
||||
fi
|
||||
|
||||
# 创建备份目录
|
||||
mkdir -p "$BACKUP_DIR"
|
||||
|
||||
echo "开始备份..."
|
||||
echo "备份时间: $(date)"
|
||||
echo ""
|
||||
|
||||
# 创建临时目录
|
||||
TEMP_DIR=$(mktemp -d)
|
||||
trap "rm -rf $TEMP_DIR" EXIT
|
||||
|
||||
# 备份配置文件
|
||||
echo "1. 备份配置文件..."
|
||||
cp .env "$TEMP_DIR/" 2>/dev/null || true
|
||||
cp package.json "$TEMP_DIR/"
|
||||
cp -r nginx "$TEMP_DIR/" 2>/dev/null || true
|
||||
|
||||
# 备份回收站
|
||||
echo "2. 备份回收站..."
|
||||
if [ -d "recycle" ]; then
|
||||
cp -r recycle "$TEMP_DIR/"
|
||||
fi
|
||||
|
||||
# 备份日志(最近 7 天)
|
||||
echo "3. 备份日志..."
|
||||
if [ -d "logs" ]; then
|
||||
mkdir -p "$TEMP_DIR/logs"
|
||||
find logs -name "*.log" -mtime -7 -exec cp {} "$TEMP_DIR/logs/" \; 2>/dev/null || true
|
||||
fi
|
||||
|
||||
# 备份博客内容(如果配置了 BLOG_ROOT)
|
||||
if [ -n "$BLOG_ROOT" ] && [ -d "$BLOG_ROOT" ]; then
|
||||
echo "4. 备份博客内容..."
|
||||
mkdir -p "$TEMP_DIR/blog"
|
||||
|
||||
# 备份 content 目录
|
||||
if [ -d "$BLOG_ROOT/content" ]; then
|
||||
cp -r "$BLOG_ROOT/content" "$TEMP_DIR/blog/"
|
||||
fi
|
||||
|
||||
# 备份配置文件
|
||||
if [ -f "$BLOG_ROOT/hugo.toml" ]; then
|
||||
cp "$BLOG_ROOT/hugo.toml" "$TEMP_DIR/blog/"
|
||||
fi
|
||||
|
||||
# 备份主题配置
|
||||
if [ -d "$BLOG_ROOT/themes" ]; then
|
||||
cp -r "$BLOG_ROOT/themes" "$TEMP_DIR/blog/" 2>/dev/null || true
|
||||
fi
|
||||
else
|
||||
echo "4. 跳过博客内容备份(BLOG_ROOT 未配置)"
|
||||
fi
|
||||
|
||||
# 创建压缩包
|
||||
echo "5. 创建压缩包..."
|
||||
tar -czf "$BACKUP_FILE" -C "$TEMP_DIR" .
|
||||
|
||||
# 计算备份大小
|
||||
BACKUP_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
|
||||
|
||||
echo ""
|
||||
echo "==================================="
|
||||
echo " 备份完成!"
|
||||
echo "==================================="
|
||||
echo ""
|
||||
echo "备份文件: $BACKUP_FILE"
|
||||
echo "备份大小: $BACKUP_SIZE"
|
||||
echo ""
|
||||
|
||||
# 清理旧备份(保留最近 30 天)
|
||||
echo "清理旧备份..."
|
||||
find "$BACKUP_DIR" -name "write-server-*.tar.gz" -mtime +30 -delete 2>/dev/null || true
|
||||
|
||||
# 显示最近的备份
|
||||
echo ""
|
||||
echo "最近的备份文件:"
|
||||
ls -lh "$BACKUP_DIR"/write-server-*.tar.gz 2>/dev/null | tail -5 || echo " 无"
|
||||
echo ""
|
||||
@@ -0,0 +1,275 @@
|
||||
#!/bin/bash
|
||||
# Write Server 配置检查脚本
|
||||
# 检查所有必要的依赖和配置
|
||||
|
||||
set -e
|
||||
|
||||
echo "==================================="
|
||||
echo " Write Server 配置检查"
|
||||
echo "==================================="
|
||||
echo ""
|
||||
|
||||
# 颜色定义
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# 检查结果
|
||||
ERRORS=0
|
||||
WARNINGS=0
|
||||
|
||||
# 检查函数
|
||||
check_pass() {
|
||||
echo -e "${GREEN}✓${NC} $1"
|
||||
}
|
||||
|
||||
check_fail() {
|
||||
echo -e "${RED}✗${NC} $1"
|
||||
((ERRORS++))
|
||||
}
|
||||
|
||||
check_warn() {
|
||||
echo -e "${YELLOW}⚠${NC} $1"
|
||||
((WARNINGS++))
|
||||
}
|
||||
|
||||
# 1. 检查 .env 文件
|
||||
echo "1. 检查环境配置"
|
||||
if [ -f .env ]; then
|
||||
check_pass ".env 文件存在"
|
||||
|
||||
# 加载环境变量
|
||||
source .env
|
||||
|
||||
# 检查 BLOG_ROOT
|
||||
if [ -n "$BLOG_ROOT" ]; then
|
||||
if [ -d "$BLOG_ROOT" ]; then
|
||||
check_pass "BLOG_ROOT 目录存在: $BLOG_ROOT"
|
||||
|
||||
# 检查 content/posts 目录
|
||||
if [ -d "$BLOG_ROOT/content/posts" ]; then
|
||||
check_pass "content/posts 目录存在"
|
||||
|
||||
# 统计文章数量
|
||||
POST_COUNT=$(find "$BLOG_ROOT/content/posts" -name "index.md" -type f | wc -l)
|
||||
echo " 📝 文章数量: $POST_COUNT"
|
||||
else
|
||||
check_warn "content/posts 目录不存在(将自动创建)"
|
||||
fi
|
||||
|
||||
# 检查 Hugo 配置
|
||||
if [ -f "$BLOG_ROOT/hugo.toml" ]; then
|
||||
check_pass "hugo.toml 配置文件存在"
|
||||
else
|
||||
check_warn "hugo.toml 配置文件不存在"
|
||||
fi
|
||||
else
|
||||
check_fail "BLOG_ROOT 目录不存在: $BLOG_ROOT"
|
||||
fi
|
||||
else
|
||||
check_fail "BLOG_ROOT 未配置"
|
||||
fi
|
||||
|
||||
# 检查其他配置
|
||||
if [ -n "$ARTALK_SERVER" ]; then
|
||||
check_pass "Artalk 服务器已配置: $ARTALK_SERVER"
|
||||
else
|
||||
check_warn "Artalk 服务器未配置(评论功能可能不可用)"
|
||||
fi
|
||||
|
||||
if [ -n "$TG_BOT_TOKEN" ]; then
|
||||
check_pass "Telegram Bot Token 已配置"
|
||||
|
||||
if [ -n "$TG_ALLOWED_CHAT_IDS" ]; then
|
||||
check_pass "Telegram 访问控制已配置"
|
||||
else
|
||||
check_warn "Telegram 访问控制未配置(所有用户都可访问)"
|
||||
fi
|
||||
else
|
||||
check_warn "Telegram Bot Token 未配置(Bot 功能不可用)"
|
||||
fi
|
||||
|
||||
else
|
||||
check_fail ".env 文件不存在"
|
||||
echo " 请运行: cp .env.example .env"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
# 2. 检查 Node.js
|
||||
echo "2. 检查 Node.js 环境"
|
||||
if command -v node &> /dev/null; then
|
||||
NODE_VERSION=$(node --version)
|
||||
check_pass "Node.js 已安装: $NODE_VERSION"
|
||||
|
||||
# 检查版本
|
||||
NODE_MAJOR=$(echo "$NODE_VERSION" | sed 's/v//' | cut -d. -f1)
|
||||
if [ "$NODE_MAJOR" -ge 18 ]; then
|
||||
check_pass "Node.js 版本符合要求 (>= 18)"
|
||||
else
|
||||
check_warn "Node.js 版本较低,建议升级到 18+"
|
||||
fi
|
||||
else
|
||||
check_fail "Node.js 未安装"
|
||||
fi
|
||||
|
||||
if command -v npm &> /dev/null; then
|
||||
NPM_VERSION=$(npm --version)
|
||||
check_pass "npm 已安装: $NPM_VERSION"
|
||||
else
|
||||
check_fail "npm 未安装"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
# 3. 检查 Hugo
|
||||
echo "3. 检查 Hugo 环境"
|
||||
if command -v hugo &> /dev/null; then
|
||||
HUGO_VERSION=$(hugo version 2>/dev/null | head -n 1 || echo "unknown")
|
||||
check_pass "Hugo 已安装: $HUGO_VERSION"
|
||||
|
||||
# 检查是否是 extended 版本
|
||||
if hugo version 2>/dev/null | grep -q "extended"; then
|
||||
check_pass "Hugo Extended 版本(支持 SCSS/SASS)"
|
||||
else
|
||||
check_warn "Hugo 非 Extended 版本(某些主题功能可能不可用)"
|
||||
fi
|
||||
else
|
||||
check_warn "Hugo 未安装(预览功能不可用)"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
# 4. 检查项目依赖
|
||||
echo "4. 检查项目依赖"
|
||||
if [ -d "node_modules" ]; then
|
||||
check_pass "node_modules 目录存在"
|
||||
|
||||
# 检查关键依赖
|
||||
if [ -d "node_modules/next" ]; then
|
||||
check_pass "Next.js 已安装"
|
||||
else
|
||||
check_fail "Next.js 未安装"
|
||||
fi
|
||||
|
||||
if [ -d "node_modules/gray-matter" ]; then
|
||||
check_pass "gray-matter 已安装(Markdown 解析)"
|
||||
else
|
||||
check_fail "gray-matter 未安装"
|
||||
fi
|
||||
else
|
||||
check_warn "node_modules 目录不存在(需要运行 npm install)"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
# 5. 检查构建状态
|
||||
echo "5. 检查构建状态"
|
||||
if [ -d ".next" ]; then
|
||||
check_pass ".next 目录存在(已构建)"
|
||||
|
||||
if [ -d ".next/standalone" ]; then
|
||||
check_pass "standalone 构建完成(Docker 部署可用)"
|
||||
else
|
||||
check_warn "standalone 构建不完整"
|
||||
fi
|
||||
else
|
||||
check_warn ".next 目录不存在(需要运行 npm run build)"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
# 6. 检查必要目录
|
||||
echo "6. 检查目录结构"
|
||||
for dir in logs backups recycle public src; do
|
||||
if [ -d "$dir" ]; then
|
||||
check_pass "$dir/ 目录存在"
|
||||
else
|
||||
check_warn "$dir/ 目录不存在(将自动创建)"
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
|
||||
# 7. 检查端口
|
||||
echo "7. 检查端口占用"
|
||||
PORT=${PORT:-8016}
|
||||
if command -v lsof &> /dev/null; then
|
||||
if lsof -i :"$PORT" &> /dev/null; then
|
||||
check_warn "端口 $PORT 已被占用"
|
||||
echo " 占用进程:"
|
||||
lsof -i :"$PORT" | head -n 3
|
||||
else
|
||||
check_pass "端口 $PORT 可用"
|
||||
fi
|
||||
elif command -v netstat &> /dev/null; then
|
||||
if netstat -tulpn 2>/dev/null | grep -q ":$PORT "; then
|
||||
check_warn "端口 $PORT 已被占用"
|
||||
else
|
||||
check_pass "端口 $PORT 可用"
|
||||
fi
|
||||
else
|
||||
check_warn "无法检查端口(lsof/netstat 未安装)"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
# 8. 检查 PM2(可选)
|
||||
echo "8. 检查进程管理器"
|
||||
if command -v pm2 &> /dev/null; then
|
||||
PM2_VERSION=$(pm2 --version)
|
||||
check_pass "PM2 已安装: $PM2_VERSION"
|
||||
|
||||
# 检查是否有运行中的进程
|
||||
if pm2 list 2>/dev/null | grep -q "write-server"; then
|
||||
check_pass "write-server 进程已运行"
|
||||
else
|
||||
check_warn "write-server 进程未运行"
|
||||
fi
|
||||
else
|
||||
check_warn "PM2 未安装(可选,用于进程管理)"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
# 9. 检查系统资源
|
||||
echo "9. 检查系统资源"
|
||||
|
||||
# 内存
|
||||
TOTAL_MEM=$(free -m 2>/dev/null | awk '/^Mem:/{print $2}' || echo "0")
|
||||
AVAIL_MEM=$(free -m 2>/dev/null | awk '/^Mem:/{print $7}' || echo "0")
|
||||
if [ "$TOTAL_MEM" -gt 0 ]; then
|
||||
echo " 💾 内存: ${AVAIL_MEM}MB 可用 / ${TOTAL_MEM}MB 总计"
|
||||
if [ "$AVAIL_MEM" -lt 256 ]; then
|
||||
check_warn "可用内存较低(< 256MB)"
|
||||
else
|
||||
check_pass "内存充足"
|
||||
fi
|
||||
fi
|
||||
|
||||
# 磁盘
|
||||
DISK_AVAIL=$(df -h . 2>/dev/null | awk 'NR==2{print $4}' || echo "unknown")
|
||||
echo " 💿 磁盘: $DISK_AVAIL 可用"
|
||||
|
||||
echo ""
|
||||
|
||||
# 总结
|
||||
echo "==================================="
|
||||
echo " 检查完成"
|
||||
echo "==================================="
|
||||
echo ""
|
||||
|
||||
if [ $ERRORS -gt 0 ]; then
|
||||
echo -e "${RED}发现 $ERRORS 个错误${NC}"
|
||||
echo "请修复上述错误后再启动服务"
|
||||
exit 1
|
||||
elif [ $WARNINGS -gt 0 ]; then
|
||||
echo -e "${YELLOW}发现 $WARNINGS 个警告${NC}"
|
||||
echo "服务可以启动,但某些功能可能不可用"
|
||||
exit 0
|
||||
else
|
||||
echo -e "${GREEN}所有检查通过!${NC}"
|
||||
echo "可以启动服务:./scripts/start.sh"
|
||||
exit 0
|
||||
fi
|
||||
@@ -0,0 +1,78 @@
|
||||
#!/bin/bash
|
||||
# Write Server 快速启动脚本
|
||||
# 适用于开发和测试环境
|
||||
|
||||
set -e
|
||||
|
||||
echo "==================================="
|
||||
echo " Write Server 快速启动"
|
||||
echo "==================================="
|
||||
|
||||
# 检查 Node.js
|
||||
if ! command -v node &> /dev/null; then
|
||||
echo "错误: Node.js 未安装"
|
||||
echo "请先运行: ./scripts/install.sh"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 检查 .env 文件
|
||||
if [ ! -f .env ]; then
|
||||
echo "创建 .env 文件..."
|
||||
cp .env.example .env
|
||||
echo ""
|
||||
echo "请编辑 .env 文件配置 BLOG_ROOT:"
|
||||
echo " BLOG_ROOT=/path/to/your/hugo/blog"
|
||||
echo ""
|
||||
read -p "按 Enter 继续..."
|
||||
fi
|
||||
|
||||
# 加载环境变量
|
||||
source .env
|
||||
|
||||
# 检查 BLOG_ROOT
|
||||
if [ -z "$BLOG_ROOT" ]; then
|
||||
echo "错误: BLOG_ROOT 未配置"
|
||||
echo "请编辑 .env 文件设置 BLOG_ROOT"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 检查博客目录
|
||||
if [ ! -d "$BLOG_ROOT" ]; then
|
||||
echo "错误: 博客目录不存在: $BLOG_ROOT"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 检查 content/posts 目录
|
||||
if [ ! -d "$BLOG_ROOT/content/posts" ]; then
|
||||
echo "警告: content/posts 目录不存在"
|
||||
echo "创建目录..."
|
||||
mkdir -p "$BLOG_ROOT/content/posts"
|
||||
fi
|
||||
|
||||
# 检查依赖
|
||||
echo "检查依赖..."
|
||||
if [ ! -d "node_modules" ]; then
|
||||
echo "安装依赖..."
|
||||
npm install
|
||||
fi
|
||||
|
||||
# 检查是否已构建
|
||||
if [ ! -d ".next" ]; then
|
||||
echo "构建项目..."
|
||||
npm run build
|
||||
fi
|
||||
|
||||
# 创建必要的目录
|
||||
mkdir -p logs backups recycle
|
||||
|
||||
# 启动开发服务器
|
||||
echo ""
|
||||
echo "启动开发服务器..."
|
||||
echo ""
|
||||
echo "服务地址: http://localhost:${PORT:-8016}"
|
||||
echo "博客目录: $BLOG_ROOT"
|
||||
echo ""
|
||||
echo "按 Ctrl+C 停止服务"
|
||||
echo ""
|
||||
|
||||
npm run dev
|
||||
@@ -0,0 +1,39 @@
|
||||
#!/bin/bash
|
||||
# Write Server 健康检查脚本
|
||||
# 用于 Docker 健康检查或监控系统
|
||||
|
||||
set -e
|
||||
|
||||
# 配置
|
||||
PORT=${PORT:-8016}
|
||||
HOST=${HOST:-localhost}
|
||||
TIMEOUT=${HEALTH_CHECK_TIMEOUT:-5}
|
||||
|
||||
# 检查服务是否响应
|
||||
check_health() {
|
||||
local url="http://${HOST}:${PORT}/api/stats"
|
||||
local response
|
||||
|
||||
# 发送请求
|
||||
response=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout "$TIMEOUT" --max-time "$TIMEOUT" "$url" 2>/dev/null || echo "000")
|
||||
|
||||
# 检查响应状态码
|
||||
if [ "$response" = "200" ]; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# 主检查逻辑
|
||||
main() {
|
||||
if check_health; then
|
||||
echo "Health check passed"
|
||||
exit 0
|
||||
else
|
||||
echo "Health check failed"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
main
|
||||
@@ -0,0 +1,125 @@
|
||||
#!/bin/bash
|
||||
# Write Server 安装脚本
|
||||
# 用于在 Linux 服务器上安装所有依赖
|
||||
|
||||
set -e
|
||||
|
||||
echo "==================================="
|
||||
echo " Write Server 安装脚本"
|
||||
echo "==================================="
|
||||
|
||||
# 检测操作系统
|
||||
if [ -f /etc/os-release ]; then
|
||||
. /etc/os-release
|
||||
OS=$ID
|
||||
VER=$VERSION_ID
|
||||
else
|
||||
echo "无法检测操作系统类型"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "检测到操作系统: $OS $VER"
|
||||
|
||||
# 更新系统包
|
||||
echo ""
|
||||
echo "1. 更新系统包..."
|
||||
if [ "$OS" = "ubuntu" ] || [ "$OS" = "debian" ]; then
|
||||
sudo apt-get update
|
||||
sudo apt-get upgrade -y
|
||||
elif [ "$OS" = "centos" ] || [ "$OS" = "rhel" ] || [ "$OS" = "fedora" ]; then
|
||||
sudo yum update -y
|
||||
fi
|
||||
|
||||
# 安装基础依赖
|
||||
echo ""
|
||||
echo "2. 安装基础依赖..."
|
||||
if [ "$OS" = "ubuntu" ] || [ "$OS" = "debian" ]; then
|
||||
sudo apt-get install -y curl wget git build-essential
|
||||
elif [ "$OS" = "centos" ] || [ "$OS" = "rhel" ] || [ "$OS" = "fedora" ]; then
|
||||
sudo yum install -y curl wget git gcc-c++ make
|
||||
fi
|
||||
|
||||
# 安装 Node.js 20
|
||||
echo ""
|
||||
echo "3. 安装 Node.js 20..."
|
||||
if ! command -v node &> /dev/null; then
|
||||
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
|
||||
if [ "$OS" = "ubuntu" ] || [ "$OS" = "debian" ]; then
|
||||
sudo apt-get install -y nodejs
|
||||
elif [ "$OS" = "centos" ] || [ "$OS" = "rhel" ] || [ "$OS" = "fedora" ]; then
|
||||
sudo yum install -y nodejs
|
||||
fi
|
||||
else
|
||||
echo "Node.js 已安装: $(node --version)"
|
||||
fi
|
||||
|
||||
# 验证 Node.js 安装
|
||||
echo "Node.js 版本: $(node --version)"
|
||||
echo "npm 版本: $(npm --version)"
|
||||
|
||||
# 安装 Hugo
|
||||
echo ""
|
||||
echo "4. 安装 Hugo..."
|
||||
if ! command -v hugo &> /dev/null; then
|
||||
HUGO_VERSION="0.128.2"
|
||||
HUGO_URL="https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz"
|
||||
|
||||
wget -O /tmp/hugo.tar.gz "$HUGO_URL"
|
||||
tar -xzf /tmp/hugo.tar.gz -C /tmp
|
||||
sudo mv /tmp/hugo /usr/local/bin/
|
||||
rm /tmp/hugo.tar.gz
|
||||
else
|
||||
echo "Hugo 已安装: $(hugo version)"
|
||||
fi
|
||||
|
||||
# 验证 Hugo 安装
|
||||
echo "Hugo 版本: $(hugo version | head -n 1)"
|
||||
|
||||
# 安装 PM2(进程管理器)
|
||||
echo ""
|
||||
echo "5. 安装 PM2..."
|
||||
if ! command -v pm2 &> /dev/null; then
|
||||
sudo npm install -g pm2
|
||||
else
|
||||
echo "PM2 已安装: $(pm2 --version)"
|
||||
fi
|
||||
|
||||
# 创建必要的目录
|
||||
echo ""
|
||||
echo "6. 创建必要的目录..."
|
||||
mkdir -p logs backups recycle
|
||||
|
||||
# 安装项目依赖
|
||||
echo ""
|
||||
echo "7. 安装项目依赖..."
|
||||
npm install
|
||||
|
||||
# 构建项目
|
||||
echo ""
|
||||
echo "8. 构建项目..."
|
||||
npm run build
|
||||
|
||||
# 创建日志目录
|
||||
echo ""
|
||||
echo "9. 配置日志..."
|
||||
mkdir -p logs
|
||||
|
||||
echo ""
|
||||
echo "==================================="
|
||||
echo " 安装完成!"
|
||||
echo "==================================="
|
||||
echo ""
|
||||
echo "下一步操作:"
|
||||
echo "1. 配置环境变量:"
|
||||
echo " cp .env.example .env"
|
||||
echo " nano .env"
|
||||
echo ""
|
||||
echo "2. 启动服务:"
|
||||
echo " ./scripts/start.sh"
|
||||
echo ""
|
||||
echo "3. 设置开机自启(可选):"
|
||||
echo " sudo ./scripts/setup-service.sh"
|
||||
echo ""
|
||||
echo "4. 配置 Nginx 反向代理(可选):"
|
||||
echo " 参考 nginx/nginx.conf"
|
||||
echo ""
|
||||
@@ -0,0 +1,138 @@
|
||||
#!/bin/bash
|
||||
# Write Server 恢复脚本
|
||||
# 从备份恢复数据
|
||||
|
||||
set -e
|
||||
|
||||
echo "==================================="
|
||||
echo " Write Server 恢复脚本"
|
||||
echo "==================================="
|
||||
|
||||
# 检查参数
|
||||
if [ -z "$1" ]; then
|
||||
echo "用法: $0 <备份文件>"
|
||||
echo ""
|
||||
echo "示例: $0 backups/write-server-20260101_120000.tar.gz"
|
||||
echo ""
|
||||
echo "可用的备份文件:"
|
||||
ls -lh backups/write-server-*.tar.gz 2>/dev/null || echo " 无备份文件"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
BACKUP_FILE="$1"
|
||||
|
||||
# 检查备份文件是否存在
|
||||
if [ ! -f "$BACKUP_FILE" ]; then
|
||||
echo "错误: 备份文件不存在: $BACKUP_FILE"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "备份文件: $BACKUP_FILE"
|
||||
echo "备份大小: $(du -h "$BACKUP_FILE" | cut -f1)"
|
||||
echo ""
|
||||
|
||||
# 确认恢复
|
||||
read -p "确定要恢复此备份吗?这将覆盖当前数据 (y/N): " -n 1 -r
|
||||
echo ""
|
||||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||
echo "已取消恢复"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# 停止服务
|
||||
echo "1. 停止服务..."
|
||||
if command -v pm2 &> /dev/null; then
|
||||
pm2 stop write-server 2>/dev/null || true
|
||||
fi
|
||||
|
||||
if command -v systemctl &> /dev/null; then
|
||||
sudo systemctl stop write-server 2>/dev/null || true
|
||||
fi
|
||||
|
||||
# 创建临时目录
|
||||
TEMP_DIR=$(mktemp -d)
|
||||
trap "rm -rf $TEMP_DIR" EXIT
|
||||
|
||||
# 解压备份
|
||||
echo "2. 解压备份..."
|
||||
tar -xzf "$BACKUP_FILE" -C "$TEMP_DIR"
|
||||
|
||||
# 恢复配置文件
|
||||
echo "3. 恢复配置文件..."
|
||||
if [ -f "$TEMP_DIR/.env" ]; then
|
||||
cp "$TEMP_DIR/.env" .env
|
||||
echo " 已恢复 .env"
|
||||
fi
|
||||
|
||||
if [ -f "$TEMP_DIR/package.json" ]; then
|
||||
# 不覆盖 package.json,只显示差异
|
||||
echo " package.json 已存在,跳过"
|
||||
fi
|
||||
|
||||
# 恢复回收站
|
||||
echo "4. 恢复回收站..."
|
||||
if [ -d "$TEMP_DIR/recycle" ]; then
|
||||
rm -rf recycle
|
||||
cp -r "$TEMP_DIR/recycle" recycle
|
||||
echo " 已恢复回收站"
|
||||
fi
|
||||
|
||||
# 恢复博客内容
|
||||
if [ -d "$TEMP_DIR/blog" ]; then
|
||||
echo "5. 恢复博客内容..."
|
||||
|
||||
# 加载环境变量
|
||||
if [ -f .env ]; then
|
||||
source .env
|
||||
fi
|
||||
|
||||
if [ -n "$BLOG_ROOT" ] && [ -d "$BLOG_ROOT" ]; then
|
||||
# 恢复 content 目录
|
||||
if [ -d "$TEMP_DIR/blog/content" ]; then
|
||||
echo " 恢复 content 目录..."
|
||||
cp -r "$TEMP_DIR/blog/content/"* "$BLOG_ROOT/content/" 2>/dev/null || true
|
||||
fi
|
||||
|
||||
# 恢复配置文件
|
||||
if [ -f "$TEMP_DIR/blog/hugo.toml" ]; then
|
||||
echo " 恢复 hugo.toml..."
|
||||
cp "$TEMP_DIR/blog/hugo.toml" "$BLOG_ROOT/"
|
||||
fi
|
||||
|
||||
echo " 博客内容已恢复到: $BLOG_ROOT"
|
||||
else
|
||||
echo " 警告: BLOG_ROOT 未配置或不存在,跳过博客内容恢复"
|
||||
fi
|
||||
else
|
||||
echo "5. 跳过博客内容恢复(备份中不包含)"
|
||||
fi
|
||||
|
||||
# 恢复 Nginx 配置
|
||||
echo "6. 恢复 Nginx 配置..."
|
||||
if [ -d "$TEMP_DIR/nginx" ]; then
|
||||
mkdir -p nginx
|
||||
cp -r "$TEMP_DIR/nginx/"* nginx/ 2>/dev/null || true
|
||||
echo " 已恢复 Nginx 配置"
|
||||
fi
|
||||
|
||||
# 重新安装依赖
|
||||
echo "7. 重新安装依赖..."
|
||||
npm install
|
||||
|
||||
# 重新构建
|
||||
echo "8. 重新构建..."
|
||||
npm run build
|
||||
|
||||
# 启动服务
|
||||
echo "9. 启动服务..."
|
||||
if command -v pm2 &> /dev/null; then
|
||||
pm2 start npm --name "write-server" -- run start
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "==================================="
|
||||
echo " 恢复完成!"
|
||||
echo "==================================="
|
||||
echo ""
|
||||
echo "服务已启动,请检查是否正常运行"
|
||||
echo ""
|
||||
@@ -0,0 +1,108 @@
|
||||
#!/bin/bash
|
||||
# Write Server systemd 服务配置脚本
|
||||
# 将 Write Server 设置为系统服务,支持开机自启
|
||||
|
||||
set -e
|
||||
|
||||
echo "==================================="
|
||||
echo " Write Server 服务配置脚本"
|
||||
echo "==================================="
|
||||
|
||||
# 检查是否为 root 用户
|
||||
if [ "$EUID" -ne 0 ]; then
|
||||
echo "错误: 请使用 sudo 运行此脚本"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 获取当前用户和目录
|
||||
CURRENT_USER=$(whoami)
|
||||
CURRENT_DIR=$(pwd)
|
||||
SERVICE_FILE="/etc/systemd/system/write-server.service"
|
||||
|
||||
echo "当前用户: $CURRENT_USER"
|
||||
echo "项目目录: $CURRENT_DIR"
|
||||
|
||||
# 检查 .env 文件
|
||||
if [ ! -f .env ]; then
|
||||
echo "错误: 未找到 .env 文件"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 创建 systemd 服务文件
|
||||
echo "创建 systemd 服务文件..."
|
||||
cat > "$SERVICE_FILE" << EOF
|
||||
[Unit]
|
||||
Description=Write Server - Hugo Blog Admin
|
||||
Documentation=https://github.com/your-repo/write-server
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=$CURRENT_USER
|
||||
Group=$CURRENT_USER
|
||||
WorkingDirectory=$CURRENT_DIR
|
||||
Environment=NODE_ENV=production
|
||||
Environment=PORT=8016
|
||||
EnvironmentFile=$CURRENT_DIR/.env
|
||||
ExecStart=/usr/bin/node $CURRENT_DIR/.next/standalone/server.js
|
||||
ExecReload=/bin/kill -HUP \$MAINPID
|
||||
Restart=always
|
||||
RestartSec=10
|
||||
StandardOutput=append:$CURRENT_DIR/logs/app.log
|
||||
StandardError=append:$CURRENT_DIR/logs/app.log
|
||||
|
||||
# 安全限制
|
||||
NoNewPrivileges=true
|
||||
ProtectSystem=strict
|
||||
ProtectHome=true
|
||||
ReadWritePaths=$CURRENT_DIR
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
|
||||
# 设置权限
|
||||
chmod 644 "$SERVICE_FILE"
|
||||
|
||||
# 重新加载 systemd 配置
|
||||
echo "重新加载 systemd 配置..."
|
||||
systemctl daemon-reload
|
||||
|
||||
# 启用服务
|
||||
echo "启用服务..."
|
||||
systemctl enable write-server
|
||||
|
||||
# 启动服务
|
||||
echo "启动服务..."
|
||||
systemctl start write-server
|
||||
|
||||
# 等待服务启动
|
||||
sleep 3
|
||||
|
||||
# 检查服务状态
|
||||
if systemctl is-active --quiet write-server; then
|
||||
echo ""
|
||||
echo "==================================="
|
||||
echo " 服务配置成功!"
|
||||
echo "==================================="
|
||||
echo ""
|
||||
echo "服务已启动并设置为开机自启"
|
||||
echo ""
|
||||
echo "管理命令:"
|
||||
echo " 查看状态: sudo systemctl status write-server"
|
||||
echo " 查看日志: sudo journalctl -u write-server -f"
|
||||
echo " 重启服务: sudo systemctl restart write-server"
|
||||
echo " 停止服务: sudo systemctl stop write-server"
|
||||
echo " 禁用自启: sudo systemctl disable write-server"
|
||||
echo ""
|
||||
else
|
||||
echo ""
|
||||
echo "==================================="
|
||||
echo " 服务启动失败!"
|
||||
echo "==================================="
|
||||
echo ""
|
||||
echo "请查看日志:"
|
||||
echo " sudo journalctl -u write-server -n 50"
|
||||
echo ""
|
||||
exit 1
|
||||
fi
|
||||
@@ -0,0 +1,88 @@
|
||||
#!/bin/bash
|
||||
# Write Server 启动脚本
|
||||
# 使用 PM2 管理进程
|
||||
|
||||
set -e
|
||||
|
||||
echo "==================================="
|
||||
echo " Write Server 启动脚本"
|
||||
echo "==================================="
|
||||
|
||||
# 检查 .env 文件
|
||||
if [ ! -f .env ]; then
|
||||
echo "错误: 未找到 .env 文件"
|
||||
echo "请先复制 .env.example 为 .env 并填写配置"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 加载环境变量
|
||||
source .env
|
||||
|
||||
# 检查 BLOG_ROOT
|
||||
if [ -z "$BLOG_ROOT" ]; then
|
||||
echo "错误: BLOG_ROOT 未配置"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -d "$BLOG_ROOT" ]; then
|
||||
echo "错误: BLOG_ROOT 目录不存在: $BLOG_ROOT"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 检查 Node.js
|
||||
if ! command -v node &> /dev/null; then
|
||||
echo "错误: Node.js 未安装"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 检查 PM2
|
||||
if ! command -v pm2 &> /dev/null; then
|
||||
echo "错误: PM2 未安装"
|
||||
echo "请运行: sudo npm install -g pm2"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 检查是否已构建
|
||||
if [ ! -d ".next" ]; then
|
||||
echo "项目未构建,开始构建..."
|
||||
npm run build
|
||||
fi
|
||||
|
||||
# 停止现有进程(如果存在)
|
||||
echo "停止现有进程..."
|
||||
pm2 delete write-server 2>/dev/null || true
|
||||
|
||||
# 启动应用
|
||||
echo "启动 Write Server..."
|
||||
pm2 start npm --name "write-server" -- run start
|
||||
|
||||
# 等待应用启动
|
||||
echo "等待应用启动..."
|
||||
sleep 3
|
||||
|
||||
# 检查应用状态
|
||||
if pm2 list | grep -q "write-server.*online"; then
|
||||
echo ""
|
||||
echo "==================================="
|
||||
echo " 启动成功!"
|
||||
echo "==================================="
|
||||
echo ""
|
||||
echo "服务地址: http://localhost:${PORT:-8016}"
|
||||
echo ""
|
||||
echo "管理命令:"
|
||||
echo " 查看状态: pm2 status"
|
||||
echo " 查看日志: pm2 logs write-server"
|
||||
echo " 重启服务: pm2 restart write-server"
|
||||
echo " 停止服务: pm2 stop write-server"
|
||||
echo ""
|
||||
else
|
||||
echo ""
|
||||
echo "==================================="
|
||||
echo " 启动失败!"
|
||||
echo "==================================="
|
||||
echo ""
|
||||
echo "请查看日志:"
|
||||
echo " pm2 logs write-server"
|
||||
echo ""
|
||||
exit 1
|
||||
fi
|
||||
@@ -0,0 +1,26 @@
|
||||
#!/bin/bash
|
||||
# Write Server 停止脚本
|
||||
|
||||
echo "==================================="
|
||||
echo " Write Server 停止脚本"
|
||||
echo "==================================="
|
||||
|
||||
# 检查 PM2
|
||||
if ! command -v pm2 &> /dev/null; then
|
||||
echo "错误: PM2 未安装"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 停止进程
|
||||
echo "停止 Write Server..."
|
||||
pm2 stop write-server 2>/dev/null || true
|
||||
|
||||
# 删除进程
|
||||
echo "删除进程..."
|
||||
pm2 delete write-server 2>/dev/null || true
|
||||
|
||||
echo ""
|
||||
echo "==================================="
|
||||
echo " 已停止"
|
||||
echo "==================================="
|
||||
echo ""
|
||||
@@ -0,0 +1,276 @@
|
||||
#!/bin/bash
|
||||
# Write Server 功能测试脚本
|
||||
# 测试在线写作和 Telegram Bot 功能
|
||||
|
||||
set -e
|
||||
|
||||
echo "==================================="
|
||||
echo " Write Server 功能测试"
|
||||
echo "==================================="
|
||||
echo ""
|
||||
|
||||
# 加载环境变量
|
||||
if [ -f .env ]; then
|
||||
source .env
|
||||
fi
|
||||
|
||||
PORT=${PORT:-8016}
|
||||
BASE_URL="http://localhost:$PORT"
|
||||
|
||||
# 颜色定义
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m'
|
||||
|
||||
# 测试结果
|
||||
TESTS_PASSED=0
|
||||
TESTS_FAILED=0
|
||||
|
||||
# 测试函数
|
||||
test_pass() {
|
||||
echo -e "${GREEN}✓${NC} $1"
|
||||
((TESTS_PASSED++))
|
||||
}
|
||||
|
||||
test_fail() {
|
||||
echo -e "${RED}✗${NC} $1"
|
||||
((TESTS_FAILED++))
|
||||
}
|
||||
|
||||
# 检查服务是否运行
|
||||
echo "1. 检查服务状态"
|
||||
if curl -s "$BASE_URL/api/stats" > /dev/null 2>&1; then
|
||||
test_pass "服务正在运行"
|
||||
else
|
||||
test_fail "服务未运行"
|
||||
echo " 请先启动服务: ./scripts/start.sh"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
# 测试文章列表 API
|
||||
echo "2. 测试文章管理功能"
|
||||
RESPONSE=$(curl -s "$BASE_URL/api/posts?page=1&perPage=5")
|
||||
if echo "$RESPONSE" | grep -q '"posts"'; then
|
||||
test_pass "文章列表 API 正常"
|
||||
|
||||
# 解析文章数量
|
||||
TOTAL=$(echo "$RESPONSE" | grep -o '"total":[0-9]*' | cut -d: -f2)
|
||||
echo " 📝 共 $TOTAL 篇文章"
|
||||
else
|
||||
test_fail "文章列表 API 异常"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
# 测试单篇文章 API
|
||||
echo "3. 测试文章详情功能"
|
||||
# 获取第一篇文章的 slug
|
||||
FIRST_SLUG=$(curl -s "$BASE_URL/api/posts?page=1&perPage=1" | grep -o '"slug":"[^"]*"' | head -n 1 | cut -d'"' -f4)
|
||||
|
||||
if [ -n "$FIRST_SLUG" ]; then
|
||||
POST_RESPONSE=$(curl -s "$BASE_URL/api/posts/$FIRST_SLUG")
|
||||
if echo "$POST_RESPONSE" | grep -q '"title"'; then
|
||||
test_pass "文章详情 API 正常"
|
||||
TITLE=$(echo "$POST_RESPONSE" | grep -o '"title":"[^"]*"' | head -n 1 | cut -d'"' -f4)
|
||||
echo " 📄 测试文章: $TITLE"
|
||||
else
|
||||
test_fail "文章详情 API 异常"
|
||||
fi
|
||||
else
|
||||
test_fail "无法获取文章列表"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
# 测试统计 API
|
||||
echo "4. 测试统计功能"
|
||||
STATS_RESPONSE=$(curl -s "$BASE_URL/api/stats")
|
||||
if echo "$STATS_RESPONSE" | grep -q '"total"'; then
|
||||
test_pass "统计 API 正常"
|
||||
else
|
||||
test_fail "统计 API 异常"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
# 测试 Hugo 集成
|
||||
echo "5. 测试 Hugo 集成"
|
||||
HUGO_RESPONSE=$(curl -s "$BASE_URL/api/hugo")
|
||||
if echo "$HUGO_RESPONSE" | grep -q '"running"'; then
|
||||
test_pass "Hugo API 正常"
|
||||
|
||||
# 检查 Hugo 是否运行
|
||||
if echo "$HUGO_RESPONSE" | grep -q '"running":true'; then
|
||||
echo " 🚀 Hugo 预览服务正在运行"
|
||||
else
|
||||
echo " ⚠️ Hugo 预览服务未运行(将按需启动)"
|
||||
fi
|
||||
else
|
||||
test_fail "Hugo API 异常"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
# 测试评论系统(如果配置了)
|
||||
echo "6. 测试评论系统"
|
||||
if [ -n "$ARTALK_SERVER" ]; then
|
||||
COMMENTS_RESPONSE=$(curl -s "$BASE_URL/api/comments/login" -X POST -H "Content-Type: application/json" -d '{}")
|
||||
if [ $? -eq 0 ]; then
|
||||
test_pass "评论 API 可访问"
|
||||
else
|
||||
test_fail "评论 API 无法访问"
|
||||
fi
|
||||
else
|
||||
echo -e "${YELLOW}⚠${NC} Artalk 未配置,跳过评论测试"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
# 测试 Telegram Bot(如果配置了)
|
||||
echo "7. 测试 Telegram Bot"
|
||||
if [ -n "$TG_BOT_TOKEN" ]; then
|
||||
BOT_RESPONSE=$(curl -s "$BASE_URL/api/bot/status")
|
||||
if echo "$BOT_RESPONSE" | grep -q '"running"'; then
|
||||
test_pass "Bot API 正常"
|
||||
|
||||
# 检查 Bot 状态
|
||||
if echo "$BOT_RESPONSE" | grep -q '"running":true'; then
|
||||
echo " 🤖 Telegram Bot 正在运行"
|
||||
else
|
||||
echo " ⚠️ Telegram Bot 未运行"
|
||||
fi
|
||||
else
|
||||
test_fail "Bot API 异常"
|
||||
fi
|
||||
else
|
||||
echo -e "${YELLOW}⚠${NC} Telegram Bot Token 未配置,跳过 Bot 测试"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
# 测试在线写作功能(模拟)
|
||||
echo "8. 测试在线写作功能"
|
||||
|
||||
# 测试创建文章 API
|
||||
TEST_SLUG="test-$(date +%s)"
|
||||
TEST_POST_DATA='{
|
||||
"frontMatter": {
|
||||
"title": "测试文章",
|
||||
"slug": "'$TEST_SLUG'",
|
||||
"date": "'$(date -Iseconds)'",
|
||||
"draft": true,
|
||||
"categories": ["测试"],
|
||||
"tags": ["test"],
|
||||
"author": "测试"
|
||||
},
|
||||
"content": "这是一篇测试文章的内容。"
|
||||
}'
|
||||
|
||||
CREATE_RESPONSE=$(curl -s "$BASE_URL/api/posts" -X POST -H "Content-Type: application/json" -d "$TEST_POST_DATA")
|
||||
if echo "$CREATE_RESPONSE" | grep -q '"success":true'; then
|
||||
test_pass "创建文章 API 正常"
|
||||
echo " 📝 测试文章已创建: $TEST_SLUG"
|
||||
|
||||
# 测试更新文章
|
||||
UPDATE_DATA='{
|
||||
"frontMatter": {
|
||||
"title": "测试文章(已更新)"
|
||||
},
|
||||
"content": "这是更新后的内容。"
|
||||
}'
|
||||
|
||||
UPDATE_RESPONSE=$(curl -s "$BASE_URL/api/posts/$TEST_SLUG" -X PUT -H "Content-Type: application/json" -d "$UPDATE_DATA")
|
||||
if echo "$UPDATE_RESPONSE" | grep -q '"success":true'; then
|
||||
test_pass "更新文章 API 正常"
|
||||
else
|
||||
test_fail "更新文章 API 异常"
|
||||
fi
|
||||
|
||||
# 测试删除文章(移到回收站)
|
||||
DELETE_RESPONSE=$(curl -s "$BASE_URL/api/posts/$TEST_SLUG" -X DELETE)
|
||||
if echo "$DELETE_RESPONSE" | grep -q '"success":true'; then
|
||||
test_pass "删除文章 API 正常"
|
||||
echo " 🗑️ 测试文章已移到回收站"
|
||||
else
|
||||
test_fail "删除文章 API 异常"
|
||||
fi
|
||||
else
|
||||
test_fail "创建文章 API 异常"
|
||||
echo " 响应: $CREATE_RESPONSE"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
# 测试回收站功能
|
||||
echo "9. 测试回收站功能"
|
||||
RECYCLE_RESPONSE=$(curl -s "$BASE_URL/api/recycle")
|
||||
if echo "$RECYCLE_RESPONSE" | grep -q '"posts"'; then
|
||||
test_pass "回收站 API 正常"
|
||||
else
|
||||
test_fail "回收站 API 异常"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
# 测试图片上传(模拟)
|
||||
echo "10. 测试图片上传功能"
|
||||
# 创建一个测试图片
|
||||
TEST_IMAGE="/tmp/test-image.png"
|
||||
convert -size 100x100 xc:white "$TEST_IMAGE" 2>/dev/null || {
|
||||
# 如果没有 imagemagick,创建一个空文件
|
||||
echo -n "" > "$TEST_IMAGE"
|
||||
}
|
||||
|
||||
if [ -f "$TEST_IMAGE" ]; then
|
||||
UPLOAD_RESPONSE=$(curl -s "$BASE_URL/api/upload" -X POST -F "file=@$TEST_IMAGE" 2>/dev/null || echo '{"error":"upload failed"}')
|
||||
if echo "$UPLOAD_RESPONSE" | grep -q '"success"'; then
|
||||
test_pass "图片上传 API 正常"
|
||||
else
|
||||
test_fail "图片上传 API 异常"
|
||||
fi
|
||||
rm -f "$TEST_IMAGE"
|
||||
else
|
||||
echo -e "${YELLOW}⚠${NC} 无法创建测试图片,跳过上传测试"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
# 测试前端页面
|
||||
echo "11. 测试前端页面"
|
||||
PAGES=("/" "/edit" "/comments" "/feeds" "/links" "/images" "/recycle")
|
||||
|
||||
for page in "${PAGES[@]}"; do
|
||||
RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" "$BASE_URL$page")
|
||||
if [ "$RESPONSE" = "200" ]; then
|
||||
test_pass "页面 $page 正常"
|
||||
else
|
||||
test_fail "页面 $page 异常 (HTTP $RESPONSE)"
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
|
||||
# 总结
|
||||
echo "==================================="
|
||||
echo " 测试完成"
|
||||
echo "==================================="
|
||||
echo ""
|
||||
echo "通过: $TESTS_PASSED"
|
||||
echo "失败: $TESTS_FAILED"
|
||||
echo ""
|
||||
|
||||
if [ $TESTS_FAILED -gt 0 ]; then
|
||||
echo -e "${RED}部分测试失败${NC}"
|
||||
exit 1
|
||||
else
|
||||
echo -e "${GREEN}所有测试通过!${NC}"
|
||||
echo ""
|
||||
echo "在线写作功能:✓ 正常"
|
||||
echo "Telegram Bot:$([ -n "$TG_BOT_TOKEN" ] && echo "✓ 已配置" || echo "⚠ 未配置")"
|
||||
echo ""
|
||||
echo "访问地址: $BASE_URL"
|
||||
exit 0
|
||||
fi
|
||||
@@ -0,0 +1,74 @@
|
||||
#!/bin/bash
|
||||
# Write Server 更新脚本
|
||||
# 用于更新应用版本
|
||||
|
||||
set -e
|
||||
|
||||
echo "==================================="
|
||||
echo " Write Server 更新脚本"
|
||||
echo "==================================="
|
||||
|
||||
# 备份当前版本
|
||||
echo "1. 备份当前版本..."
|
||||
./scripts/backup.sh
|
||||
|
||||
# 拉取最新代码
|
||||
echo ""
|
||||
echo "2. 拉取最新代码..."
|
||||
git pull origin main
|
||||
|
||||
# 检查是否有更新
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "代码已更新"
|
||||
else
|
||||
echo "代码已是最新版本"
|
||||
fi
|
||||
|
||||
# 安装依赖
|
||||
echo ""
|
||||
echo "3. 安装依赖..."
|
||||
npm install
|
||||
|
||||
# 构建项目
|
||||
echo ""
|
||||
echo "4. 构建项目..."
|
||||
npm run build
|
||||
|
||||
# 重启服务
|
||||
echo ""
|
||||
echo "5. 重启服务..."
|
||||
if command -v pm2 &> /dev/null; then
|
||||
pm2 restart write-server
|
||||
elif command -v systemctl &> /dev/null; then
|
||||
sudo systemctl restart write-server
|
||||
else
|
||||
echo "警告: 无法自动重启服务,请手动重启"
|
||||
fi
|
||||
|
||||
# 等待服务启动
|
||||
echo ""
|
||||
echo "6. 等待服务启动..."
|
||||
sleep 5
|
||||
|
||||
# 健康检查
|
||||
echo ""
|
||||
echo "7. 健康检查..."
|
||||
if ./scripts/healthcheck.sh; then
|
||||
echo ""
|
||||
echo "==================================="
|
||||
echo " 更新成功!"
|
||||
echo "==================================="
|
||||
echo ""
|
||||
else
|
||||
echo ""
|
||||
echo "==================================="
|
||||
echo " 更新完成,但健康检查失败"
|
||||
echo "==================================="
|
||||
echo ""
|
||||
echo "请检查日志:"
|
||||
echo " pm2 logs write-server"
|
||||
echo " 或"
|
||||
echo " sudo journalctl -u write-server -n 50"
|
||||
echo ""
|
||||
exit 1
|
||||
fi
|
||||
Reference in new issue
Block a user