feat: 添加服务管理脚本和Dockerfile
This commit is contained in:
+25
@@ -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"]
|
||||
@@ -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>
|
||||
|
||||
创建服务文件 `/etc/systemd/system/ftp-server.service`:
|
||||
<details>
|
||||
<summary>Linux - 手动创建 systemd 服务(点击展开)</summary>
|
||||
|
||||
创建 `/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 # 依赖校验
|
||||
```
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user