WechatOnCloud/docker/autostart
Kris e35f1d64cf feat: 初始化项目,添加完整的微信云部署方案与面板实现
包含以下核心内容:
1.  完整的Docker容器化部署方案,支持多架构amd64/arm64
2.  自研Web管理面板,包含登录认证、实例管理、权限控制
3.  微信实例容器镜像,内置中文字体与输入法修复
4.  飞牛OS应用打包适配
5.  完整的文档与运维指南
2026-07-05 03:50:30 +08:00

183 lines
7.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
# 由 KasmVNC base 的 openbox 会话在桌面就绪后执行(以 app 用户身份)。
# v1.2.0 多应用:实例承载的应用(微信/Telegram/Chromium/自定义)由面板写入容器环境 WOC_APP_TYPE
# 再由 02-woc-app 钩子落到数据卷 /config/.woc-app。本脚本据此等待对应应用就绪并常驻拉起
# (关窗自动重开;更新后从新版本路径重启)。读不到类型 → 回退微信,老实例零改动。
set -u
# 容器内无 GPU强制软件渲染
export LIBGL_ALWAYS_SOFTWARE=1
# 解析本实例应用类型与启动信息APP_BIN / APP_LAUNCH / APP_NAME
APP_TYPE=wechat
# shellcheck source=/dev/null
[ -f /config/.woc-app ] && . /config/.woc-app 2>/dev/null || true
APP_TYPE="${WOC_APP_TYPE:-wechat}"
# shellcheck source=/dev/null
. /woc/app-defs.sh
woc_app_def "$APP_TYPE"
# 深色模式(实例环境 WOC_DARK=1 时;由面板顶栏主题开关持久化、经容器环境下发,改后需重启实例生效)。
# 仅浏览器(Chromium):加 --force-dark-mode 让其 UI + 网页走深色——这是极简容器里实测唯一稳的办法。
# 微信:内核虽是 Chromium 但不吃命令行参数,也不订阅桌面 portal 的 color-scheme 信号(实测 portal 方案在
# 极简容器里 session 总线不稳、微信也不跟随),故本开关对微信无效;微信深色请在微信「设置→通用→深色模式」
# 里手动选(设置随数据卷持久化)。
if { [ "${WOC_DARK:-}" = "1" ] || [ "${WOC_DARK:-}" = "true" ]; } && [ "$APP_TYPE" = "chromium" ]; then
APP_LAUNCH="${APP_LAUNCH} --force-dark-mode --enable-features=WebContentsForceDark"
echo "[autostart] 浏览器深色已启用(--force-dark-mode"
fi
# 防“最小化后丢失”本桌面openbox无任务栏窗口被最小化就无处恢复 → 黑屏。
# 看守进程:每 2s 把“被最小化(不可见)”的顶层窗口重新激活,相当于禁用最小化。对任意应用通用。
(
export DISPLAY="${DISPLAY:-:1}"
while sleep 2; do
all=$(xdotool search --name '.+' 2>/dev/null) || continue
vis=$(xdotool search --onlyvisible --name '.+' 2>/dev/null)
for w in ${all}; do
printf '%s\n' "${vis}" | grep -qx "${w}" || xdotool windowactivate "${w}" 2>/dev/null || true
done
done
) &
# 自定义应用若未配置启动命令,给出提示并退出(避免空等)
if [ "$APP_TYPE" = "custom" ] && [ -z "${APP_LAUNCH:-}" ]; then
echo "[autostart] 自定义应用尚未配置启动命令,请在面板「数据卷」上传安装包并设定后重启实例"
exit 0
fi
# 1) 应用壁纸(若用户设置了自定义背景图)。
# 关键Xvnc 启动时是默认分辨率,浏览器连上后 KasmVNC 会 resize-remote 到浏览器尺寸。若只在启动时设一次,
# 屏幕一变大X 会把当时设的小尺寸 root pixmap【平铺】填满新屏表现为壁纸被 2×2 平铺,见 issue 反馈)。
# 故用看守:每 2s 检查分辨率,一变就用 --zoom填充裁切、保持比例重设壁纸。也顺带跟随面板对壁纸文件的改动。
WALLPAPER_FILE="/config/.wallpaper"
WALLPAPER_DIR="/config/backgrounds"
(
export DISPLAY="${DISPLAY:-:1}"
last=""
while sleep 2; do
[ -f "$WALLPAPER_FILE" ] || { last=""; continue; }
wp=$(cat "$WALLPAPER_FILE" 2>/dev/null) || continue
[ -n "$wp" ] && [ -f "$WALLPAPER_DIR/$wp" ] || { last=""; continue; }
# 用「分辨率 + 壁纸名」做签名:分辨率变(resize)或换了壁纸都会重设
sig="${wp}@$(xrandr 2>/dev/null | grep -o '[0-9]\+x[0-9]\+' | head -1)"
if [ "$sig" != "$last" ]; then
last="$sig"
xwallpaper --zoom "$WALLPAPER_DIR/$wp" 2>/dev/null && echo "[autostart] 壁纸已应用/重设: $sig"
fi
done
) &
# 2) 应用自定义字体(若用户设置了)
# 从持久卷恢复系统级 fontconfig 配置(跨越容器重建)
if [ -f /config/.woc-fc-local.conf ]; then
cp /config/.woc-fc-local.conf /etc/fonts/local.conf
echo "[autostart] 系统字体配置已恢复"
fi
# 确保 ~/.local/share/fonts → /config/.fonts symlink 存在(旧容器升级兼容)
mkdir -p /config/.fonts 2>/dev/null || true
if [ ! -L /config/.local/share/fonts ] && [ ! -d /config/.local/share/fonts ]; then
mkdir -p /config/.local/share 2>/dev/null || true
ln -sfn /config/.fonts /config/.local/share/fonts 2>/dev/null || true
fi
FONT_CONF="/config/.config/fontconfig/fonts.conf"
FONT_FAMILY_FILE="/config/.woc-font-family"
if [ -f "$FONT_FAMILY_FILE" ]; then
family=$(cat "$FONT_FAMILY_FILE")
if [ -n "$family" ]; then
mkdir -p "$(dirname "$FONT_CONF")" 2>/dev/null || true
cat > "$FONT_CONF" << EOF
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<!-- generic families -->
<alias>
<family>sans-serif</family>
<prefer><family>${family}</family></prefer>
</alias>
<alias>
<family>serif</family>
<prefer><family>${family}</family></prefer>
</alias>
<alias>
<family>monospace</family>
<prefer><family>${family}</family></prefer>
</alias>
<!-- system CJK fonts that WeChat/CEF may request -->
<alias>
<family>WenQuanYi Micro Hei</family>
<prefer><family>${family}</family></prefer>
</alias>
<alias>
<family>WenQuanYi Zen Hei</family>
<prefer><family>${family}</family></prefer>
</alias>
<alias>
<family>Noto Sans CJK SC</family>
<prefer><family>${family}</family></prefer>
</alias>
<alias>
<family>Noto Sans CJK</family>
<prefer><family>${family}</family></prefer>
</alias>
<!-- force user font for any zh text regardless of requested family -->
<match target="pattern">
<test name="lang" compare="contains"><string>zh</string></test>
<edit name="family" mode="prepend" binding="strong"><string>${family}</string></edit>
</match>
</fontconfig>
EOF
echo "[autostart] 自定义字体已恢复: ${family}"
fc-cache -f 2>/dev/null || true
fi
elif [ -f "$FONT_CONF" ]; then
echo "[autostart] 自定义字体配置已就绪"
fc-cache -f 2>/dev/null || true
fi
# 3) 启动 xsettingsd让 GTK/Qt 应用实时响应字体/DPI 等 XSETTINGS 变更,无需重启)
XSETTINGS_CONF="/config/.xsettingsd"
if command -v xsettingsd >/dev/null 2>&1; then
XSETTINGS_FONT="WenQuanYi Micro Hei"
# 若用户保存了字体偏好,优先使用
if [ -f "$FONT_FAMILY_FILE" ]; then
family=$(cat "$FONT_FAMILY_FILE")
[ -n "$family" ] && XSETTINGS_FONT="$family"
fi
cat > "${XSETTINGS_CONF}" << EOF
Xft/Antialias 1
Xft/Hinting 1
Xft/HintStyle "hintslight"
Xft/RGBA "rgb"
Xft/DPI 96
Gtk/FontName "${XSETTINGS_FONT} 10"
EOF
xsettingsd --config="${XSETTINGS_CONF}" 2>/dev/null &
echo "[autostart] xsettingsd 已启动"
fi
# 4) 等待应用安装就绪(首次需在面板点「下载并安装」)
notified=0
while [ -n "${APP_BIN:-}" ] && [ ! -x "${APP_BIN}" ]; do
if [ "${notified}" -eq 0 ]; then
echo "[autostart] ${APP_NAME} 尚未安装,等待面板触发下载…(首次使用请在面板点「下载并安装」)"
notified=1
fi
sleep 2
done
# 3) 常驻拉起应用
while true; do
if [ -n "${APP_BIN:-}" ] && [ ! -x "${APP_BIN}" ]; then
# 更新过程中本体被临时挪走,等就位再继续
sleep 2
continue
fi
echo "[autostart] 启动 ${APP_NAME}: ${APP_LAUNCH}"
# APP_LAUNCH 可带参数,按 word-split 执行(各应用参数均不含空格,见 app-defs.sh
${APP_LAUNCH}
echo "[autostart] ${APP_NAME} 已退出2 秒后重启"
sleep 2
done