#!/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