169 lines
4.4 KiB
Bash
169 lines
4.4 KiB
Bash
#!/bin/bash
|
||
|
||
# ========================================
|
||
# 安装 systemd 服务脚本
|
||
# 用途:配置 Go API 为 systemd 服务
|
||
# ========================================
|
||
|
||
set -e
|
||
|
||
# 颜色定义
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# 配置
|
||
SERVICE_NAME="go-api"
|
||
SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service"
|
||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
SERVICE_TEMPLATE="${SCRIPT_DIR}/${SERVICE_NAME}.service"
|
||
WORK_DIR="/www/wwwroot/api.yunzer.cn"
|
||
MAIN_FILE="${WORK_DIR}/main.go"
|
||
|
||
echo -e "${BLUE}========================================${NC}"
|
||
echo -e "${BLUE}安装 Go API systemd 服务${NC}"
|
||
echo -e "${BLUE}========================================${NC}"
|
||
echo ""
|
||
|
||
# 检查是否为 root
|
||
if [ "$EUID" -ne 0 ]; then
|
||
echo -e "${RED}错误:请使用 root 用户运行此脚本${NC}"
|
||
echo "使用方法: sudo bash $0"
|
||
exit 1
|
||
fi
|
||
|
||
# 检查工作目录
|
||
if [ ! -d "$WORK_DIR" ]; then
|
||
echo -e "${RED}错误:工作目录不存在: $WORK_DIR${NC}"
|
||
exit 1
|
||
fi
|
||
|
||
# 检查 main.go
|
||
if [ ! -f "$MAIN_FILE" ]; then
|
||
echo -e "${RED}错误:找不到 main.go: $MAIN_FILE${NC}"
|
||
exit 1
|
||
fi
|
||
|
||
# 检查 Go 是否安装
|
||
if ! command -v go &> /dev/null; then
|
||
echo -e "${RED}错误:Go 未安装或不在 PATH 中${NC}"
|
||
exit 1
|
||
fi
|
||
|
||
GO_PATH=$(which go)
|
||
echo -e "${GREEN}✓ Go 路径: $GO_PATH${NC}"
|
||
|
||
# 停止现有服务
|
||
echo -e "${YELLOW}1. 停止现有服务...${NC}"
|
||
if systemctl is-active --quiet "$SERVICE_NAME"; then
|
||
systemctl stop "$SERVICE_NAME"
|
||
echo -e "${GREEN} ✓ 已停止现有服务${NC}"
|
||
else
|
||
echo -e "${YELLOW} - 服务未运行${NC}"
|
||
fi
|
||
|
||
# 停止可能的手动启动进程
|
||
echo -e "${YELLOW}2. 清理手动启动的进程...${NC}"
|
||
if pgrep -f "go run main.go" > /dev/null; then
|
||
pkill -f "go run main.go"
|
||
echo -e "${GREEN} ✓ 已清理手动启动的进程${NC}"
|
||
else
|
||
echo -e "${YELLOW} - 无手动启动的进程${NC}"
|
||
fi
|
||
|
||
# 创建服务文件
|
||
echo -e "${YELLOW}3. 创建 systemd 服务文件...${NC}"
|
||
|
||
cat > "$SERVICE_FILE" << EOF
|
||
[Unit]
|
||
Description=Go API Server
|
||
After=network.target mysql.service
|
||
Wants=mysql.service
|
||
|
||
[Service]
|
||
Type=simple
|
||
User=root
|
||
Group=root
|
||
WorkingDirectory=$WORK_DIR
|
||
ExecStart=$GO_PATH run main.go
|
||
Restart=always
|
||
RestartSec=5
|
||
StandardOutput=append:$WORK_DIR/go.log
|
||
StandardError=append:$WORK_DIR/go.log
|
||
|
||
# 环境变量
|
||
Environment="PATH=$GO_PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
|
||
|
||
# 资源限制
|
||
LimitNOFILE=65535
|
||
LimitNPROC=65535
|
||
|
||
# 安全设置
|
||
PrivateTmp=true
|
||
NoNewPrivileges=false
|
||
|
||
[Install]
|
||
WantedBy=multi-user.target
|
||
EOF
|
||
|
||
echo -e "${GREEN} ✓ 服务文件已创建: $SERVICE_FILE${NC}"
|
||
|
||
# 重载 systemd
|
||
echo -e "${YELLOW}4. 重载 systemd 配置...${NC}"
|
||
systemctl daemon-reload
|
||
echo -e "${GREEN} ✓ systemd 配置已重载${NC}"
|
||
|
||
# 启动服务
|
||
echo -e "${YELLOW}5. 启动服务...${NC}"
|
||
systemctl start "$SERVICE_NAME"
|
||
sleep 2
|
||
|
||
# 检查服务状态
|
||
if systemctl is-active --quiet "$SERVICE_NAME"; then
|
||
echo -e "${GREEN} ✓ 服务启动成功${NC}"
|
||
else
|
||
echo -e "${RED} ✗ 服务启动失败${NC}"
|
||
echo ""
|
||
echo -e "${YELLOW}查看错误日志:${NC}"
|
||
journalctl -u "$SERVICE_NAME" -n 20 --no-pager
|
||
exit 1
|
||
fi
|
||
|
||
# 启用开机自启
|
||
echo -e "${YELLOW}6. 启用开机自启...${NC}"
|
||
systemctl enable "$SERVICE_NAME"
|
||
echo -e "${GREEN} ✓ 已启用开机自启${NC}"
|
||
|
||
# 显示服务状态
|
||
echo ""
|
||
echo -e "${BLUE}========================================${NC}"
|
||
echo -e "${BLUE}安装完成!${NC}"
|
||
echo -e "${BLUE}========================================${NC}"
|
||
echo ""
|
||
echo -e "${GREEN}服务信息:${NC}"
|
||
echo -e " 服务名称: $SERVICE_NAME"
|
||
echo -e " 工作目录: $WORK_DIR"
|
||
echo -e " 日志文件: $WORK_DIR/go.log"
|
||
echo -e " 配置文件: $SERVICE_FILE"
|
||
echo ""
|
||
echo -e "${GREEN}常用命令:${NC}"
|
||
echo -e " 启动服务: systemctl start $SERVICE_NAME"
|
||
echo -e " 停止服务: systemctl stop $SERVICE_NAME"
|
||
echo -e " 重启服务: systemctl restart $SERVICE_NAME"
|
||
echo -e " 查看状态: systemctl status $SERVICE_NAME"
|
||
echo -e " 查看日志: journalctl -u $SERVICE_NAME -f"
|
||
echo -e " 查看文件日志: tail -f $WORK_DIR/go.log"
|
||
echo ""
|
||
echo -e "${YELLOW}当前服务状态:${NC}"
|
||
systemctl status "$SERVICE_NAME" --no-pager -l
|
||
echo ""
|
||
echo -e "${YELLOW}最近日志(最后 10 行):${NC}"
|
||
if [ -f "$WORK_DIR/go.log" ]; then
|
||
tail -n 10 "$WORK_DIR/go.log"
|
||
else
|
||
echo " 日志文件尚未创建"
|
||
fi
|
||
echo ""
|