diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..266b146 --- /dev/null +++ b/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"] diff --git a/README.md b/README.md index 3018605..6d6b311 100644 --- a/README.md +++ b/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 +``` + +### 手动设置开机自启 + +
+Windows - 任务计划程序(点击展开) ```powershell -# 创建开机自启任务 schtasks /create /tn "FTP Server" /tr "C:\path\to\ftp-server.exe" /sc onstart /ru SYSTEM ``` -### Linux - systemd +
-创建服务文件 `/etc/systemd/system/ftp-server.service`: +
+Linux - 手动创建 systemd 服务(点击展开) + +创建 `/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 ``` +
+ ## 项目结构 ``` @@ -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 # 依赖校验 ``` diff --git a/scripts/service-linux.sh b/scripts/service-linux.sh new file mode 100644 index 0000000..11e94a8 --- /dev/null +++ b/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 diff --git a/scripts/service-windows.bat b/scripts/service-windows.bat new file mode 100644 index 0000000..0d467ea --- /dev/null +++ b/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