在 Oracle ARM VPS 上部署远程浏览器(linuxserver/chromium + noVNC)
在 Oracle Ampere ARM64(4C24G)Ubuntu 上用 linuxserver/chromium 容器跑 noVNC 远程浏览器,烤入中文、设 VNC 密码、仅绑 Tailscale 接口,再用 Tailscale Serve 提供 HTTPS 入口。含 Dockerfile/compose 片段与验证步骤。
[!info] related notes
- 方案对比:VPS 远程浏览器方案对比
- 容器方案:Docker 浏览器桌面
- 收口原理:Tailscale Serve 原理
- 安全总论:远程浏览器的安全访问
- 接入 tailnet:在 OCI VPS 上接入 Tailscale
在 Oracle ARM VPS 上部署远程浏览器(linuxserver/chromium + noVNC)
目标
在 Oracle 免费 Ampere A1(ARM64,4C24G)Ubuntu 上,部署一个真 Chromium 远程浏览器:
- 浏览器跑在 VPS 上,目标网站看到的是 Oracle 公网 IP(可绕开本地网络对特定站点的 TLS 拦截);
- 通过网页 noVNC 操作,无需装桌面环境;
- 访问通道收口到 Tailscale(不裸暴露公网);
- 自带中文显示、VNC 密码保护。
为什么选 linuxserver/chromium
- 真 Chromium + 全保真:登录、验证码、JS、WebSocket、视频都能正常(网页代理做不到);
- 自带 noVNC Web 前端,浏览器开
http://<host>:3010即操控; - 有官方 ARM64 镜像,Oracle Ampere 直接可用;
- 一条
docker run/ 一份 compose 即可,比桌面方案轻得多。
[!note] 场景来源 本实战用于访问一个”本地浏览器报
ERR_SSL_VERSION_OR_CIPHER_MISMATCH、但 Oracle/DO 出口能正常打开”的站点——根因是 DNS 把本地解析到了一个 Cloudflare 坏边缘,而 VPS 解析到源站。详见 TLS 握手失败排查。
前置条件
- Oracle Ubuntu 实例(本文实测 24.04,aarch64);
- Docker + Compose 已装(本文实测 Docker 29.6 / Compose v5);
- 已接入 Tailscale 并获得
100.xIP(见 接入指南); - ⚠️ 确认 443 未被占用:若被其它容器占用,Serve 要改端口(见 Tailscale Serve 原理 的坑 1)。
步骤 1:准备目录与 Dockerfile
mkdir -p /opt/remote-browser && cd /opt/remote-browser
Dockerfile(基于 ARM64 镜像,烤入中文字体,避免重启丢字体):
FROM lscr.io/linuxserver/chromium:arm64
# 安装中文黑体(文泉驿)+ Noto CJK,保证容器内网页中文不乱码
RUN apt-get update && apt-get install -y --no-install-recommends \
fonts-wqy-zenhei fonts-noto-cjk \
&& rm -rf /var/lib/apt/lists/*
[!tip] 为什么烤进镜像而不是挂卷 字体不常变,烤进镜像最省事,重建也不丢;若想更小可改用多阶段,但单浏览器容器无需过度优化。
步骤 2:docker-compose.yml
两种绑定策略,推荐策略 B(更稳,IP 漂移不影响):
services:
browser:
build: .
image: oracle2-chromium:local
container_name: oracle2-remote-browser
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Shanghai
- KEY=VAULTWARDEN_REF_REQUIRED # noVNC/VNC 连接密码,请换成自己的
# 策略 A:绑 Tailscale IP(IP 变更需改这里)
# ports:
# - "100.68.x.x:3010:3000"
# 策略 B(推荐):只绑回环,由 Tailscale Serve 收口
expose:
- "3000"
ports:
- "127.0.x.x:3010:3000"
shm_size: "1gb" # Chromium 共享内存,防崩溃
restart: unless-stopped
[!warning] 端口说明 linuxserver/chromium 容器内默认端口是 3000,映射到主机的 3010。
KEY是 VNC 密码(非容器 root 密码),上线务必改成强随机串。
步骤 3:构建并启动
docker compose up -d --build
docker compose ps # 确认状态 Up
步骤 4:验证容器内可访问目标站
进容器用 curl 验证出口是否正常(以本文场景为例):
docker exec oracle2-remote-browser curl -sI https://anyrouter.top | head -1
# 期望:HTTP/2 200
返回 200 即代表浏览器跑在 Oracle IP 上能开目标站。
步骤 5:收口访问(Tailscale Serve)
主机上执行(详见 Tailscale Serve 原理):
sudo tailscale serve --bg --https=8443 http://127.0.x.x:3010
若 443 被占用,用
--https=8443;443 空闲则可省略端口,访问地址更整洁。
本地如何访问
在你已装 Tailscale 并登录同一 tailnet 的 PC 上:
- HTTPS(推荐):
https://<host>.ts.net:8443 - HTTP 备用:
http://<host>.ts.net:3010或http://100.x.x.x:3010 - 进 noVNC 后输入 VNC 密码,里面就是 Chromium。
[!note] 不用 Tailscale 的备选:SSH 本地转发
ssh -L 3010:127.0.x.x:3010 oracle2然后本机开
http://localhost:3010。国内有时比 Tailscale 更稳。
固化 Serve(开机自启)
--bg 进程重启会丢,建议写成 systemd(见 Tailscale Serve 原理 的”固化”段)。
日常管理
cd /opt/remote-browser
docker compose ps
docker compose restart
docker compose down
docker compose up -d --build # 改了 Dockerfile 后重建
常见问题
[!question] 进 noVNC 黑屏 / 连不上? 多半是
KEY密码没设或端口绑错。确认docker compose ps状态为Up,且 Serve/SSH 转发的目标端口是 3010。
[!question] 中文显示方块? 镜像没装中文字体。按步骤 1 烤入
fonts-wqy-zenhei后重建。
[!question] 443 被占导致 Serve 报 TLS internal error? 改用
--https=8443,或释放 443 后改回默认。详见 Tailscale Serve 原理 坑 1。
[!question] 重启后容器起不来? 若用了”策略 A”绑死 Tailscale IP,而 IP 已变,容器会因绑不到旧 IP 失败。改用”策略 B”(绑 127.0.x.x + Serve 收口)可根治。
Related notes
- 方案对比:VPS 远程浏览器方案对比
- 容器方案:Docker 浏览器桌面
- 收口原理:Tailscale Serve 原理
- 安全总论:远程浏览器的安全访问
- 接入 tailnet:在 OCI VPS 上接入 Tailscale
- TLS 排错:TLS 握手失败排查