在 Oracle ARM VPS 上部署远程浏览器(linuxserver/chromium + noVNC)

在 Oracle Ampere ARM64(4C24G)Ubuntu 上用 linuxserver/chromium 容器跑 noVNC 远程浏览器,烤入中文、设 VNC 密码、仅绑 Tailscale 接口,再用 Tailscale Serve 提供 HTTPS 入口。含 Dockerfile/compose 片段与验证步骤。

#type / howto #status / growing #tech / ops / vps #resource / docker #resource / tailscale #platform / linux #platform / server #interface / web

[!info] related notes

在 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.x IP(见 接入指南);
  • ⚠️ 确认 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:3010http://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 收口)可根治。

创建于 2026/7/31 更新于 2026/7/31