psou / start.sh
huanbao's picture
Create start.sh
5459210 verified
#!/bin/sh
set -e
# 防止重复执行(增强锁机制)
LOCK_FILE=/tmp/pansou_start.lock
if [ -f "$LOCK_FILE" ]; then
LOCK_PID=$(cat "$LOCK_FILE")
if ps | grep -q "[${LOCK_PID}]"; then
echo "错误: start.sh已在运行(锁文件 $LOCK_FILE,PID $LOCK_PID)"
exit 1
else
echo "警告: 发现旧锁文件 $LOCK_FILE,已移除"
rm -f "$LOCK_FILE"
fi
fi
echo $$ > "$LOCK_FILE"
trap 'rm -f $LOCK_FILE' EXIT
# 默认值
export PANSOU_PORT=${PANSOU_PORT:-8888}
export PANSOU_HOST=${PANSOU_HOST:-127.0.0.1}
export DOMAIN=${DOMAIN:-localhost}
echo "正在启动PanSou服务,配置信息如下:"
echo "- 后端地址: ${PANSOU_HOST}:${PANSOU_PORT}"
echo "- 域名: ${DOMAIN}"
echo "- 前端目录: /app/frontend/dist"
# 创建必要目录
mkdir -p /data/pansou_data /data/pansou_logs /tmp/nginx_logs /tmp/nginx-config /tmp/nginx-run \
/tmp/nginx-tmp/client_temp /tmp/nginx-tmp/proxy_temp /tmp/nginx-tmp/fastcgi_temp \
/tmp/nginx-tmp/uwsgi_temp /tmp/nginx-tmp/scgi_temp || {
echo "错误: 无法创建必要目录"
exit 1
}
# 日志轮转
LOG_FILE=/data/pansou_logs/pansou.log
MAX_SIZE=$((10 * 1024 * 1024)) # 10MB
if [ -f "$LOG_FILE" ]; then
SIZE=$(stat -f %z "$LOG_FILE" 2>/dev/null || stat -c %s "$LOG_FILE")
if [ "$SIZE" -gt "$MAX_SIZE" ]; then
echo "日志文件大小 ($SIZE bytes) 超过限制 ($MAX_SIZE bytes),执行轮转"
mv "$LOG_FILE" "${LOG_FILE}.$(date +%F-%H%M%S)"
find /data/pansou_logs -name "pansou.log.*" -mtime +7 -delete
fi
fi
# 生成Nginx配置
cat > /tmp/nginx-config/nginx.conf << EOF
worker_processes auto;
error_log /dev/stderr error;
pid /tmp/nginx-run/nginx.pid;
events { worker_connections 1024; }
http {
client_body_temp_path /tmp/nginx-tmp/client_temp;
proxy_temp_path /tmp/nginx-tmp/proxy_temp;
fastcgi_temp_path /tmp/nginx-tmp/fastcgi_temp;
uwsgi_temp_path /tmp/nginx-tmp/uwsgi_temp;
scgi_temp_path /tmp/nginx-tmp/scgi_temp;
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /dev/stdout main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
client_max_body_size 20M;
server {
listen 7860;
server_name ${DOMAIN};
location = /api/health {
proxy_pass http://${PANSOU_HOST}:${PANSOU_PORT}/api/health;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme;
proxy_connect_timeout 5s;
proxy_read_timeout 10s;
proxy_send_timeout 5s;
proxy_buffering off;
}
location = /api/search {
proxy_pass http://${PANSOU_HOST}:${PANSOU_PORT}/api/search;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme;
proxy_set_header Referer \$http_referer;
proxy_connect_timeout 15s;
proxy_read_timeout 60s;
proxy_send_timeout 15s;
proxy_buffering off;
}
location /api/ {
proxy_pass http://${PANSOU_HOST}:${PANSOU_PORT}/api/;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme;
proxy_set_header Referer \$http_referer;
proxy_buffering off;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
root /app/frontend/dist;
expires 30d;
add_header Cache-Control "public, max-age=2592000";
add_header X-Content-Type-Options nosniff;
}
location / {
root /app/frontend/dist;
index index.html;
try_files \$uri \$uri/ /index.html;
location ~* \.html$ {
add_header Cache-Control "no-cache, no-store, must-revalidate";
add_header Pragma "no-cache";
add_header Expires "0";
}
}
}
}
EOF
echo "Nginx配置已生成"
# 启动pansou并过滤空日志
cd /app
echo "启动pansou..."
/app/pansou 2>&1 | grep -v '\[\] "" *"" *"" *""' > "$LOG_FILE" &
PANSOU_PID=$!
echo "pansou进程ID: $PANSOU_PID"
if ps | grep -q "[${PANSOU_PID}]"; then
echo "pansou进程正在运行"
else
echo "错误: pansou进程未能启动"
sleep 2
if [ -f "$LOG_FILE" ]; then
echo "pansou日志内容(前9行):"
head -n 9 "$LOG_FILE"
else
echo "错误: 日志文件未生成"
fi
exit 1
fi
# 等待pansou日志初始化
sleep 5
if [ -f "$LOG_FILE" ]; then
echo "日志文件已生成,内容如下(前9行):"
head -n 9 "$LOG_FILE"
fi
# 等待pansou服务启动
echo "等待后端服务启动..."
for i in $(seq 1 30); do
if curl -f http://${PANSOU_HOST}:${PANSOU_PORT}/api/health >/dev/null 2>&1; then
echo "后端服务启动成功"
break
fi
echo "等待后端服务... ($i/30)"
sleep 1
done
# 检查后端服务
if ! curl -f http://${PANSOU_HOST}:${PANSOU_PORT}/api/health >/dev/null 2>&1; then
echo "错误: 后端服务启动失败"
if [ -f "$LOG_FILE" ]; then
echo "pansou日志内容(前20行):"
head -n 20 "$LOG_FILE"
fi
exit 1
fi
# 启动Nginx
echo "启动Nginx服务..."
nginx -t -c /tmp/nginx-config/nginx.conf || {
echo "错误: Nginx配置测试失败"
exit 1
}
nginx -c /tmp/nginx-config/nginx.conf -g "daemon off;" &
# 显示日志(过滤/health)
echo "所有服务已启动,开始实时显示日志..."
tail -f "$LOG_FILE" | grep -v '[GIN].*/api/health' &
# 等待后台进程
wait