feat: 添加服务管理脚本和Dockerfile

This commit is contained in:
Your Name
2026-05-06 18:23:23 +08:00
parent 98e00c1f32
commit 0f9663045c
4 changed files with 581 additions and 13 deletions
+305
View File
@@ -0,0 +1,305 @@
#!/bin/bash
# FTP Server 服务管理脚本
# 用法: ./service-linux.sh {install|uninstall|start|stop|restart|status|enable|disable|logs}
# 配置区域 - 请根据实际路径修改
INSTALL_DIR="/opt/ftp-server"
FTP_EXE="$INSTALL_DIR/ftp-server"
CONFIG_FILE="$INSTALL_DIR/config.json"
SERVICE_NAME="ftp-server"
SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service"
LOG_FILE="$INSTALL_DIR/server.log"
PID_FILE="$INSTALL_DIR/ftp-server.pid"
# 颜色
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m'
info() { echo -e "${GREEN}[信息]${NC} $1"; }
warn() { echo -e "${YELLOW}[警告]${NC} $1"; }
error() { echo -e "${RED}[错误]${NC} $1"; }
# 检查 root 权限
check_root() {
if [ "$EUID" -ne 0 ]; then
error "请使用 root 权限运行此脚本 (sudo ./service-linux.sh ...)"
exit 1
fi
}
# 检查可执行文件
check_exe() {
if [ ! -f "$FTP_EXE" ]; then
error "找不到 $FTP_EXE"
error "请先编译: go build -o $FTP_EXE ."
exit 1
fi
if [ ! -x "$FTP_EXE" ]; then
chmod +x "$FTP_EXE"
fi
}
# 安装服务
do_install() {
check_root
check_exe
# 创建工作目录
mkdir -p "$INSTALL_DIR/data"
info "正在创建 systemd 服务文件..."
cat > "$SERVICE_FILE" << EOF
[Unit]
Description=FTP Server with Web Management
After=network.target
Wants=network-online.target
[Service]
Type=simple
User=root
Group=root
WorkingDirectory=$INSTALL_DIR
ExecStart=$FTP_EXE -config $CONFIG_FILE
ExecReload=/bin/kill -HUP \$MAINPID
Restart=on-failure
RestartSec=5
LimitNOFILE=65535
# 日志输出到 journalctl
StandardOutput=journal
StandardError=journal
SyslogIdentifier=$SERVICE_NAME
[Install]
WantedBy=multi-user.target
EOF
# 重载 systemd
systemctl daemon-reload
info "服务已安装: $SERVICE_FILE"
info "使用 '$0 start' 启动服务"
info "使用 '$0 enable' 设置开机自启"
}
# 卸载服务
do_uninstall() {
check_root
info "正在停止服务..."
systemctl stop "$SERVICE_NAME" 2>/dev/null
systemctl disable "$SERVICE_NAME" 2>/dev/null
if [ -f "$SERVICE_FILE" ]; then
rm -f "$SERVICE_FILE"
systemctl daemon-reload
info "服务已卸载"
else
warn "服务文件不存在,可能未安装"
fi
}
# 启动服务
do_start() {
if [ -f "$SERVICE_FILE" ]; then
check_root
systemctl start "$SERVICE_NAME"
if [ $? -eq 0 ]; then
info "服务已启动"
info " FTP端口: 2121"
info " Web管理: http://localhost:8080"
else
error "服务启动失败,查看日志: $0 logs"
exit 1
fi
else
# 前台/后台直接运行
check_exe
info "以后台模式启动..."
cd "$INSTALL_DIR"
nohup "$FTP_EXE" -config "$CONFIG_FILE" >> "$LOG_FILE" 2>&1 &
echo $! > "$PID_FILE"
sleep 1
if kill -0 $(cat "$PID_FILE" 2>/dev/null) 2>/dev/null; then
info "服务已启动 (PID: $(cat $PID_FILE))"
info " FTP端口: 2121"
info " Web管理: http://localhost:8080"
info " 日志文件: $LOG_FILE"
else
error "服务启动失败,查看日志: $LOG_FILE"
rm -f "$PID_FILE"
exit 1
fi
fi
}
# 停止服务
do_stop() {
if [ -f "$SERVICE_FILE" ]; then
check_root
systemctl stop "$SERVICE_NAME"
if [ $? -eq 0 ]; then
info "服务已停止"
else
error "服务停止失败"
exit 1
fi
elif [ -f "$PID_FILE" ]; then
PID=$(cat "$PID_FILE")
if kill -0 "$PID" 2>/dev/null; then
kill "$PID"
sleep 2
if kill -0 "$PID" 2>/dev/null; then
kill -9 "$PID"
fi
rm -f "$PID_FILE"
info "服务已停止 (PID: $PID)"
else
warn "进程 $PID 已不存在"
rm -f "$PID_FILE"
fi
else
# 尝试查找进程
PID=$(pgrep -f "$FTP_EXE")
if [ -n "$PID" ]; then
kill "$PID"
info "服务已停止 (PID: $PID)"
else
warn "服务未在运行"
fi
fi
}
# 重启服务
do_restart() {
do_stop
sleep 2
do_start
}
# 查看状态
do_status() {
if [ -f "$SERVICE_FILE" ]; then
systemctl status "$SERVICE_NAME" --no-pager
elif [ -f "$PID_FILE" ]; then
PID=$(cat "$PID_FILE")
if kill -0 "$PID" 2>/dev/null; then
info "服务运行中 (PID: $PID)"
else
warn "服务未在运行 (PID文件过期)"
rm -f "$PID_FILE"
fi
else
PID=$(pgrep -f "$FTP_EXE")
if [ -n "$PID" ]; then
info "服务运行中 (PID: $PID)"
else
warn "服务未在运行"
fi
fi
}
# 开机自启
do_enable() {
check_root
if [ -f "$SERVICE_FILE" ]; then
systemctl enable "$SERVICE_NAME"
info "已设置开机自启"
else
error "请先运行 '$0 install' 安装服务"
exit 1
fi
}
# 关闭自启
do_disable() {
check_root
if [ -f "$SERVICE_FILE" ]; then
systemctl disable "$SERVICE_NAME"
info "已关闭开机自启"
else
error "服务未安装"
exit 1
fi
}
# 查看日志
do_logs() {
if [ -f "$SERVICE_FILE" ]; then
journalctl -u "$SERVICE_NAME" -f --no-pager -n 50
elif [ -f "$LOG_FILE" ]; then
tail -f "$LOG_FILE"
else
warn "没有可用的日志文件"
fi
}
# 菜单模式
do_menu() {
while true; do
echo ""
echo "========================================"
echo " FTP Server 服务管理工具 (Linux)"
echo "========================================"
echo ""
echo " 1. 安装服务 (systemd)"
echo " 2. 卸载服务"
echo " 3. 启动服务"
echo " 4. 停止服务"
echo " 5. 重启服务"
echo " 6. 查看服务状态"
echo " 7. 开机自启 - 开启"
echo " 8. 开机自启 - 关闭"
echo " 9. 查看运行日志"
echo " 0. 退出"
echo ""
read -p "请输入选项: " choice
case $choice in
1) do_install ;;
2) do_uninstall ;;
3) do_start ;;
4) do_stop ;;
5) do_restart ;;
6) do_status ;;
7) do_enable ;;
8) do_disable ;;
9) do_logs ;;
0) exit 0 ;;
*) warn "无效选项" ;;
esac
read -p "按 Enter 继续..."
done
}
# 主入口
case "${1:-}" in
install) do_install ;;
uninstall) do_uninstall ;;
start) do_start ;;
stop) do_stop ;;
restart) do_restart ;;
status) do_status ;;
enable) do_enable ;;
disable) do_disable ;;
logs) do_logs ;;
menu|"") do_menu ;;
*)
echo "用法: $0 {install|uninstall|start|stop|restart|status|enable|disable|logs|menu}"
echo ""
echo "命令说明:"
echo " install - 安装为 systemd 服务"
echo " uninstall - 卸载服务"
echo " start - 启动服务"
echo " stop - 停止服务"
echo " restart - 重启服务"
echo " status - 查看服务状态"
echo " enable - 设置开机自启"
echo " disable - 关闭开机自启"
echo " logs - 查看运行日志 (实时)"
echo " menu - 交互式菜单 (默认)"
exit 1
;;
esac
+166
View File
@@ -0,0 +1,166 @@
@echo off
chcp 65001 >nul
title FTP Server 服务管理
:: 配置区域 - 请根据实际路径修改
set FTP_HOME=%~dp0
set FTP_EXE=%FTP_HOME%ftp-server.exe
set SERVICE_NAME=FTP-Server
set CONFIG_FILE=%FTP_HOME%config.json
:: 检查管理员权限
net session >nul 2>&1
if %errorlevel% neq 0 (
echo [错误] 请以管理员身份运行此脚本!
echo 右键点击脚本 -^> "以管理员身份运行"
pause
exit /b 1
)
:: 检查可执行文件
if not exist "%FTP_EXE%" (
echo [错误] 找不到 %FTP_EXE%
echo 请确保 ftp-server.exe 在脚本同目录下
pause
exit /b 1
)
:menu
cls
echo ========================================
echo FTP Server 服务管理工具
echo ========================================
echo.
echo 1. 安装服务 (注册为 Windows 服务)
echo 2. 卸载服务
echo 3. 启动服务
echo 4. 停止服务
echo 5. 重启服务
echo 6. 查看服务状态
echo 7. 开机自启 - 开启
echo 8. 开机自启 - 关闭
echo 9. 查看运行日志
echo 0. 退出
echo.
set /p choice=请输入选项:
if "%choice%"=="1" goto install
if "%choice%"=="2" goto uninstall
if "%choice%"=="3" goto start
if "%choice%"=="4" goto stop
if "%choice%"=="5" goto restart
if "%choice%"=="6" goto status
if "%choice%"=="7" goto enable
if "%choice%"=="8" goto disable
if "%choice%"=="9" goto logs
if "%choice%"=="0" exit /b 0
echo 无效选项
pause
goto menu
:install
echo [信息] 正在安装服务...
sc create %SERVICE_NAME% binPath= "%FTP_EXE% -config %CONFIG_FILE%" start= demand DisplayName= "FTP Server with Web Management"
if %errorlevel% equ 0 (
echo [成功] 服务安装成功!
echo [信息] 使用选项 3 启动服务,或选项 7 设置开机自启
) else (
echo [失败] 服务安装失败
)
pause
goto menu
:uninstall
echo [信息] 正在停止服务...
net stop %SERVICE_NAME% >nul 2>&1
echo [信息] 正在卸载服务...
sc delete %SERVICE_NAME%
if %errorlevel% equ 0 (
echo [成功] 服务已卸载
) else (
echo [失败] 服务卸载失败,可能服务不存在
)
pause
goto menu
:start
echo [信息] 正在启动服务...
net start %SERVICE_NAME%
if %errorlevel% equ 0 (
echo [成功] 服务已启动
echo FTP端口: 2121
echo Web管理: http://localhost:8080
) else (
echo [失败] 服务启动失败
)
pause
goto menu
:stop
echo [信息] 正在停止服务...
net stop %SERVICE_NAME%
if %errorlevel% equ 0 (
echo [成功] 服务已停止
) else (
echo [失败] 服务停止失败,可能服务未运行
)
pause
goto menu
:restart
echo [信息] 正在重启服务...
net stop %SERVICE_NAME% >nul 2>&1
timeout /t 2 /nobreak >nul
net start %SERVICE_NAME%
if %errorlevel% equ 0 (
echo [成功] 服务已重启
) else (
echo [失败] 服务重启失败
)
pause
goto menu
:status
echo [信息] 服务状态:
sc query %SERVICE_NAME%
echo.
echo [信息] 服务配置:
sc qc %SERVICE_NAME%
pause
goto menu
:enable
echo [信息] 正在设置开机自启...
sc config %SERVICE_NAME% start= auto
if %errorlevel% equ 0 (
echo [成功] 已设置开机自启
) else (
echo [失败] 设置失败
)
pause
goto menu
:disable
echo [信息] 正在关闭开机自启...
sc config %SERVICE_NAME% start= demand
if %errorlevel% equ 0 (
echo [成功] 已关闭开机自启
) else (
echo [失败] 设置失败
)
pause
goto menu
:logs
echo [信息] 最近的应用程序日志 (FTP Server):
echo ========================================
wevtutil qe Application /q:"*[System[Provider[@Name='%SERVICE_NAME%']]]" /c:20 /f:text /rd:true
if %errorlevel% neq 0 (
echo 暂无事件日志
echo.
echo 提示: 可以直接查看控制台输出或重定向日志到文件:
echo %FTP_EXE% ^> server.log 2^>^&1
)
echo ========================================
pause
goto menu