Ver Fonte

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

Your Name há 2 semanas atrás
pai
commit
0f9663045c
4 ficheiros alterados com 581 adições e 13 exclusões
  1. 25 0
      Dockerfile
  2. 85 13
      README.md
  3. 305 0
      scripts/service-linux.sh
  4. 166 0
      scripts/service-windows.bat

+ 25 - 0
Dockerfile

@@ -0,0 +1,25 @@
+FROM golang:1.22-alpine AS builder
+
+WORKDIR /build
+COPY go.mod go.sum ./
+RUN go mod download
+COPY . .
+RUN go build -o ftp-server .
+
+FROM alpine:3.19
+
+RUN apk add --no-cache ca-certificates tzdata
+ENV TZ=Asia/Shanghai
+
+WORKDIR /app
+COPY --from=builder /build/ftp-server .
+COPY static/ ./static/
+
+RUN mkdir -p /app/data /app/ftp_root
+
+EXPOSE 2121 8080 50000-50100
+
+VOLUME ["/app/data", "/app/ftp_root", "/app/config.json"]
+
+ENTRYPOINT ["./ftp-server"]
+CMD ["-config", "/app/config.json"]

+ 85 - 13
README.md

@@ -260,18 +260,92 @@ sudo iptables -A INPUT -p tcp --dport 50000:50100 -j ACCEPT
 sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
 ```
 
-## 开机自启(可选)
+## 服务管理脚本
 
-### Windows - 任务计划程序
+项目提供了 Windows 和 Linux 的服务管理脚本,支持安装、卸载、启动、停止、重启、开机自启等操作。
+
+### Windows - service-windows.bat
+
+以**管理员身份**运行 `scripts/service-windows.bat`,进入交互式菜单:
+
+```
+========================================
+  FTP Server 服务管理工具
+========================================
+
+  1. 安装服务 (注册为 Windows 服务)
+  2. 卸载服务
+  3. 启动服务
+  4. 停止服务
+  5. 重启服务
+  6. 查看服务状态
+  7. 开机自启 - 开启
+  8. 开机自启 - 关闭
+  9. 查看运行日志
+  0. 退出
+```
+
+使用前将 `scripts/service-windows.bat` 复制到 `ftp-server.exe` 同目录下,然后右键"以管理员身份运行"。
+
+### Linux - service-linux.sh
+
+```bash
+# 添加执行权限
+chmod +x scripts/service-linux.sh
+
+# 交互式菜单
+sudo ./scripts/service-linux.sh menu
+
+# 或直接使用命令
+sudo ./scripts/service-linux.sh install    # 安装为 systemd 服务
+sudo ./scripts/service-linux.sh start      # 启动
+sudo ./scripts/service-linux.sh stop       # 停止
+sudo ./scripts/service-linux.sh restart    # 重启
+sudo ./scripts/service-linux.sh status     # 查看状态
+sudo ./scripts/service-linux.sh enable     # 设置开机自启
+sudo ./scripts/service-linux.sh disable    # 关闭开机自启
+sudo ./scripts/service-linux.sh logs       # 查看实时日志
+sudo ./scripts/service-linux.sh uninstall  # 卸载服务
+```
+
+脚本会自动在 `/etc/systemd/system/ftp-server.service` 创建 systemd 服务文件。
+
+### Docker 运行
+
+```bash
+# 构建镜像
+docker build -t ftp-server .
+
+# 运行容器
+docker run -d \
+  --name ftp-server \
+  -p 2121:2121 \
+  -p 50000-50100:50000-50100 \
+  -p 8080:8080 \
+  -v ./data:/app/data \
+  -v ./ftp_root:/app/ftp_root \
+  -v ./config.json:/app/config.json \
+  ftp-server
+
+# 查看日志
+docker logs -f ftp-server
+```
+
+### 手动设置开机自启
+
+<details>
+<summary>Windows - 任务计划程序(点击展开)</summary>
 
 ```powershell
-# 创建开机自启任务
 schtasks /create /tn "FTP Server" /tr "C:\path\to\ftp-server.exe" /sc onstart /ru SYSTEM
 ```
 
-### Linux - systemd
+</details>
+
+<details>
+<summary>Linux - 手动创建 systemd 服务(点击展开)</summary>
 
-创建服务文件 `/etc/systemd/system/ftp-server.service`:
+创建 `/etc/systemd/system/ftp-server.service`:
 
 ```ini
 [Unit]
@@ -290,20 +364,14 @@ RestartSec=5
 WantedBy=multi-user.target
 ```
 
-启动并设置开机自启:
-
 ```bash
 sudo systemctl daemon-reload
 sudo systemctl start ftp-server
 sudo systemctl enable ftp-server
-
-# 查看状态
-sudo systemctl status ftp-server
-
-# 查看日志
-sudo journalctl -u ftp-server -f
 ```
 
+</details>
+
 ## 项目结构
 
 ```
@@ -317,6 +385,10 @@ ftp-server/
 │   ├── index.html       # 管理界面
 │   ├── css/style.css    # 样式
 │   └── js/app.js        # 前端逻辑
+├── scripts/
+│   ├── service-windows.bat  # Windows 服务管理脚本
+│   └── service-linux.sh     # Linux 服务管理脚本
+├── Dockerfile           # Docker 构建文件
 ├── go.mod               # Go 模块定义
 └── go.sum               # 依赖校验
 ```

+ 305 - 0
scripts/service-linux.sh

@@ -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 - 0
scripts/service-windows.bat

@@ -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