Files
ros-dpi/install.sh
T

110 lines
4.5 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# ROS-DPI Linux 一键部署(debug18):下载二进制 → 安装 systemd 服务 → 自动启动
# 用法:curl -fsSL https://raw.githubusercontent.com/suyijun8182/ros-dpi/main/install.sh | bash
# 可用环境变量:ROS_DPI_PORT(默认 8080)、ROS_DPI_DIR(默认 /opt/ros-dpi)
# 自定义配置(DATABASE_URL、ADMIN_PASSWORD 等)写在 /etc/ros-dpi.env,重装 / 升级都不会覆盖
set -euo pipefail
REPO="suyijun8182/ros-dpi"
PORT="${ROS_DPI_PORT:-8080}"
DIR="${ROS_DPI_DIR:-/opt/ros-dpi}"
BIN="/usr/local/bin/ros-dpi"
ENV_FILE="/etc/ros-dpi.env"
[ "$(id -u)" = 0 ] || { echo "请用 root 运行(sudo curl ... | sudo bash)"; exit 1; }
ARCH="$(uname -m)"
case "$ARCH" in
x86_64) ASSET="ros-dpi-linux-amd64.tar.gz" ;;
aarch64 | arm64) ASSET="ros-dpi-linux-arm64.tar.gz" ;;
*) echo "不支持的架构:$ARCH"; exit 1 ;;
esac
echo "==> 获取最新版本号"
URL="https://api.github.com/repos/${REPO}/releases/latest"
# 不用 grep -P(BusyBox / 部分发行版的 grep 不支持),sed 取 "tag_name": "vX.Y.Z"
TAG=$(curl -fsSL "$URL" | sed -n 's/.*"tag_name"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' | head -n 1 || true)
[ -n "$TAG" ] || { echo "取不到最新版本(网络问题?)"; exit 1; }
echo " 最新版本 $TAG"
echo "==> 下载 $ASSET ($TAG)"
TMP=$(mktemp -d)
trap 'rm -rf "$TMP"' EXIT
BASE="https://github.com/${REPO}/releases/download/${TAG}"
curl -fsSL "$BASE/${ASSET}" -o "$TMP/${ASSET}"
echo "==> 校验 SHA256"
curl -fsSL "$BASE/SHA256SUMS" -o "$TMP/SHA256SUMS" || { echo "该版本没有 SHA256SUMS 校验文件,为安全起见停止安装"; exit 1; }
grep -q " [*]\{0,1\}${ASSET}\$" "$TMP/SHA256SUMS" || { echo "SHA256SUMS 里没有 ${ASSET},停止安装"; exit 1; }
(cd "$TMP" && grep " [*]\{0,1\}${ASSET}\$" SHA256SUMS | sha256sum -c -) || { echo "校验失败:下载的文件已损坏或被篡改"; exit 1; }
tar -xzf "$TMP/${ASSET}" -C "$TMP"
echo "==> 安装"
REINSTALL=0
[ -f /etc/systemd/system/ros-dpi.service ] && REINSTALL=1
install -m 755 "$TMP/ros-dpi" "$BIN"
mkdir -p "$DIR/data"
# 数据目录里的 SQLite 库存着 JWT 签名密钥和各类密码:只允许 root 读写
chmod 700 "$DIR/data"
chmod -R go-rwx "$DIR/data" # 旧版本装出来的库文件是 644,一并收紧
# 用户配置单独放在 EnvironmentFile:只在不存在时创建(全是注释示例),重装 / 升级都不覆盖
if [ ! -f "$ENV_FILE" ]; then
cat > "$ENV_FILE" <<'ENVF'
# ROS-DPI 自定义配置:取消注释并修改后执行 systemctl restart ros-dpi
# 本文件不会被 install.sh 覆盖;端口和数据目录由服务文件给出,这里设置会覆盖它们
#
# 用 MySQL 代替默认 SQLite:
# DATABASE_URL=mysql+pymysql://rosdpi:密码@127.0.0.1:3306/rosdpi?charset=utf8mb4
# 管理员 admin 的初始密码(强烈建议设置;留空则首次打开网页时设置):
# ADMIN_PASSWORD=
# 内网网段(之后也可在 系统设置 → 网络 里改):
# LAN_CIDRS=192.168.88.0/24
# RouterOS 只读 API(可选):
# ROS_URL=https://192.168.88.1
# ROS_USER=
# ROS_PASSWORD=
ENVF
fi
chmod 600 "$ENV_FILE"
# 以 root 运行:一键自更新(前端按钮)需要写 /usr/local/bin 与 systemctl restart 权限,
# 所以只加不影响自更新的加固项(不能用 ProtectSystem=strict / ReadOnlyPaths 等)
cat > /etc/systemd/system/ros-dpi.service <<UNIT
[Unit]
Description=ROS-DPI 终端流量与应用统计
After=network-online.target
Wants=network-online.target
[Service]
WorkingDirectory=$DIR
Environment=HTTP_PORT=$PORT
Environment=DATA_DIR=$DIR/data
EnvironmentFile=-$ENV_FILE
ExecStart=$BIN
Restart=always
RestartSec=3
UMask=0077
NoNewPrivileges=yes
PrivateTmp=yes
ProtectHome=yes
[Install]
WantedBy=multi-user.target
UNIT
systemctl daemon-reload
systemctl enable ros-dpi >/dev/null 2>&1
# 重装 / 升级:restart 让新二进制和新服务文件立即生效(enable --now 对已运行的服务不会重启)
if [ "$REINSTALL" = 1 ]; then systemctl restart ros-dpi; else systemctl start ros-dpi; fi
sleep 2
systemctl is-active ros-dpi >/dev/null && STATE="运行中" || STATE="启动失败(journalctl -u ros-dpi 查看)"
IP=$(hostname -I 2>/dev/null | awk '{print $1}')
echo
echo "==> 完成:$STATE"
echo " 浏览器打开 http://${IP:-本机IP}:$PORT"
echo " 数据目录 $DIR/data(默认 SQLite,想用 MySQL 在 $ENV_FILE 里设 DATABASE_URL 后 systemctl restart ros-dpi)"
echo " 建议在 $ENV_FILE 里设置 ADMIN_PASSWORD,或立即打开网页设置管理员密码"
echo " 流量采集:RouterOS 的 Traffic-Flow(udp/2055) 与 TZSP(udp/37008) 指到本机地址"