版本号:
- 1.5.11 越界(规则 3 规定 patch ≤ 10)→ 修正为 1.6.0(进位到 minor、patch 归 0)
- versionCode 43 不变:43 从未对外发布,本次修正只是把命名拉回约定
合并支线(原在工作区根目录、App 仓库之外,DESIGN.md 自称"支线"):
- selfhost-source/server/ 自建歌曲源服务器(纯 Python 标准库、零 pip 依赖)
- selfhost-source/deploy/、DESIGN.md、LIBRARY.md、build_inventory.py
- selfhost-source/inventory/ 小清单(playlists.csv、song-stats.md 等)
- ⚠️ inventory 生成物(songs-*.csv / singers-top.csv,共 84MB)不入库,
已写入 .gitignore;需要时用 build_inventory.py 依据 muse.db 重新生成
同时入库的 App 侧支线改动(此前为工作树未提交状态):
- Whoami.kt(whoami 设备心跳)、DeviceIdentity.kt(设备身份伪装)
- PushDownload.kt / PushDownloadClient.kt(点歌推送)
- AdVideoFilter 带 query/fragment 的地址闸门;KTV_BRIDGE_API 11 → 13
- 修 ktv_api.js 的 global.KtvBridgeApiVersion(12 → 13,与注释及 Kotlin 两处校验一致)
- 对应单测:WhoamiTest / DeviceIdentityTest / PushDownloadTest / AdVideoFilterTest(共 39 例)
文档:
- DESIGN.md 的"在 App 仓库之外"约定改为"已并入仓库统一版本化"
- AGENTS.md 版本号行更新为 1.6.0/43,并新增支线并入说明
验证:assembleRelease + testReleaseUnitTest 全过(39 例)
99 lines
4.3 KiB
Bash
99 lines
4.3 KiB
Bash
#!/bin/bash
|
||
# 目标机(Debian 13)上一键部署:ktv 用户/目录 → 安装代码 → 写配置 → 装 systemd 单元 → 启动自检
|
||
# 以 root 运行:bash deploy-root.sh
|
||
set -euo pipefail
|
||
# ⚠️ su -c 继承的 PATH 不含 /usr/sbin(useradd/ss 等都在那儿)
|
||
export PATH="$PATH:/usr/sbin:/sbin"
|
||
|
||
SRC="${SRC:-/home/zijun/ktv-src}" # 已由 zijun 用户上传的代码目录
|
||
DST=/opt/ktv-source
|
||
LIB=/var/lib/ktv-source
|
||
ETC=/etc/ktv-source
|
||
CFG="$ETC/server-config.json"
|
||
# ⚠️ 服务运行身份可配:数据落在 FUSE/云盘挂载(如 /home/<user>/…)时必须用该目录属主
|
||
# (FUSE 挂载只认挂载参数里的 uid),否则会出现"只读数据库 / 打不开数据库"。
|
||
SVC_USER="${SVC_USER:-ktv}"
|
||
|
||
echo "── 1/6 用户与目录(身份=$SVC_USER;已存在的目录不改归属,避免夺权)"
|
||
if [ "$SVC_USER" = "ktv" ]; then
|
||
id ktv >/dev/null 2>&1 || useradd --system --home "$LIB" --shell /usr/sbin/nologin ktv
|
||
fi
|
||
# install -d 会顺带 chown 已存在的目录 → 这里只在缺失时创建,绝不动现场目录的归属
|
||
[ -d "$DST" ] || install -d -o "$SVC_USER" -g "$SVC_USER" -m 0755 "$DST"
|
||
[ -d "$LIB" ] || install -d -o "$SVC_USER" -g "$SVC_USER" -m 0755 "$LIB" "$LIB/media" "$LIB/media/tmp"
|
||
[ -d "$LIB/media" ] || install -d -o "$SVC_USER" -g "$SVC_USER" -m 0755 "$LIB/media" "$LIB/media/tmp"
|
||
[ -d "$ETC" ] || install -d -o "$SVC_USER" -g "$SVC_USER" -m 0750 "$ETC"
|
||
|
||
echo "── 2/6 安装代码(从 $SRC → $DST)"
|
||
[ -f "$SRC/run.py" ] || { echo "缺少 $SRC/run.py,请先上传代码"; exit 1; }
|
||
find "$DST" -mindepth 1 -maxdepth 1 -exec rm -rf {} + 2>/dev/null || true
|
||
cp -a "$SRC/." "$DST/"
|
||
find "$DST" -name '__pycache__' -type d -prune -exec rm -rf {} + 2>/dev/null || true
|
||
chown -R "$SVC_USER":"$SVC_USER" "$DST"
|
||
chmod -R a+rX "$DST"
|
||
|
||
echo "── 3/6 配置(已存在则不覆盖,保留界面里改过的设置)"
|
||
if [ ! -f "$CFG" ]; then
|
||
cat > "$CFG" <<'JSON'
|
||
{
|
||
"service_host": "0.0.0.0",
|
||
"service_port": 6677,
|
||
"admin_host": "0.0.0.0",
|
||
"admin_port": 6678,
|
||
"admin_token": "",
|
||
"data_dir": "/var/lib/ktv-source",
|
||
"media_dir": "/var/lib/ktv-source/media",
|
||
"db_path": "/var/lib/ktv-source/server.db",
|
||
"log_path": "/var/lib/ktv-source/server.log",
|
||
"public_media_base": "http://192.168.100.232:6677/media",
|
||
"public_host": "192.168.100.232:6677",
|
||
"upstream_hosts": ["http://zk.ktv1.top:6677"],
|
||
"upstream_resolution": "720",
|
||
"upstream_mac": "800b510bf4fd",
|
||
"upstream_sn": "2d7bb4a7d7f7",
|
||
"upstream_request_interval_ms": 300,
|
||
"muse_login_url": "https://mconn.cherryonline.cn/mls-api/v1/login",
|
||
"muse_sync_url": "https://mconn.cherryonline.cn/mls-api/v1/sqlite/sync",
|
||
"muse_device_id": "s00e04b021b2d",
|
||
"muse_music_file_type": 214,
|
||
"muse_auto_sync_hours": 24,
|
||
"concurrency": 10,
|
||
"download_batch": 200,
|
||
"download_order": "hot",
|
||
"download_order_desc": true,
|
||
"verify_md5": false,
|
||
"min_file_bytes": 6291456,
|
||
"max_attempts": 3,
|
||
"retry_backoff_sec": 20,
|
||
"timeout_sec": 60,
|
||
"user_agent": "MaidongKTV/1.2"
|
||
}
|
||
JSON
|
||
chown "$SVC_USER":"$SVC_USER" "$CFG"
|
||
chmod 640 "$CFG"
|
||
fi
|
||
|
||
echo "── 4/6 systemd 单元"
|
||
# ⚠️ 已存在的单元不覆盖:现场可能改过 User/ProtectHome/ReadWritePaths(例如数据目录在 FUSE 挂载上)
|
||
if [ ! -f /etc/systemd/system/ktv-source.service ]; then
|
||
install -m 644 "$DST/deploy/ktv-source.service" /etc/systemd/system/ktv-source.service
|
||
echo " 已安装默认单元"
|
||
else
|
||
echo " 单元已存在,保留现场配置(如需重置请手动删除后重跑)"
|
||
fi
|
||
systemctl daemon-reload
|
||
systemctl enable ktv-source >/dev/null 2>&1 || true
|
||
systemctl restart ktv-source
|
||
sleep 2
|
||
|
||
echo "── 5/6 服务状态"
|
||
systemctl is-active ktv-source || { journalctl -u ktv-source -n 30 --no-pager; exit 1; }
|
||
ss -lntp 2>/dev/null | grep -E ':(6677|6678)' || echo " ⚠️ 没看到监听端口"
|
||
|
||
echo "── 6/6 本机自检"
|
||
curl -s -m 5 http://127.0.0.1:6677/healthz || true; echo
|
||
curl -s -m 5 -X POST -d 'action=get_config&device_id=deploy-test' http://127.0.0.1:6677/api.php || true; echo
|
||
curl -s -m 5 'http://127.0.0.1:6677/i.php?appid=x&mac=800b510bf4fd_2d7bb4a7d7f7&sn=2d7bb4a7d7f7&time=1&ver=2.0&vn=4.1.3.03281430&sign=x' || true; echo
|
||
curl -s -m 5 http://127.0.0.1:6678/api/stats | head -c 300 || true; echo
|
||
echo "── 完成。管理界面: http://192.168.100.232:6678/ 服务接口: http://192.168.100.232:6677/"
|