一直以来,我都希望在服务器上运行安卓和浏览器,以便执行一些自动化任务,比如115自动签到。使用自己的安卓手机来运行这些任务很容易中断,而在服务器上运行可以随时随地打开网页进行操作。至于为什么要运行Firefox浏览器,则是为了实现一套放在云上的指纹浏览器。注册国外的一些账号时,需要确保IP、语言、时区等保持一致,并且支持不同地区。我这套方案支持一键启动多实例,即同时运行多个安卓和Firefox。

操作环境

  • 甲骨文服务器
  • ws-scrcpy(web版本的scrcpy,用于实现远程控制,我适配了arm)
  • firefox(docker版本的Firefox,我添加了中文字体)
  • redroid(docker版本的安卓,可以自行定制镜像)
  • nginx-proxy-manager(web管理nginx,可以自动申请证书,添加basic认证)
  • cloudflare zerotrust(可选,用于安全拦截)
  • docker-gateway(我编写的docker网关,用于给容器做代理策略,避免使用Firefox浏览器代理被检测)
  • socks5住宅IP代理(可选,根据需求购买,这里不做推荐)

部署

我使用docker compose进行部署,以下是配置文件。我添加了gateway作为容器内部的代理网关,如果不需要使用代理,请去掉gateway网关服务和虚拟网卡的配置。

加载内核模块

sudo apt install linux-modules-extra-`uname -r`
sudo modprobe binder_linux devices="binder,hwbinder,vndbinder"
sudo modprobe ashmem_linux
sudo modprobe xt_mark
sudo modprobe iptable_filter
sudo modprobe iptable_nat
sudo modprobe xt_TPROXY
sudo modprobe xt_socket

docker compose 配置

services:
  nginx-proxy-manager:
    image: jc21/nginx-proxy-manager:2.11.3
    container_name: nginx
    volumes:
      - nginx_data:/data
      - nginx_cert:/etc/letsencrypt
    ports:
      - 80:80
      # 管理端口,建议后面去掉
      - 81:81
      - 443:443
    restart: unless-stopped
    networks:
      - default
    
  # 5800
  firefox-1:
    image: monlor/firefox
    volumes:
      - firefox-1:/config
    restart: unless-stopped
    environment:
      - TZ=Australia/Sydney
      - LANG=en_AU.UTF-8
      # 这个配置和docker-gateway搭配使用,将当前容器的默认网关指向docker-gateway服务,不添加这个变量则不走代理
      - GATEWAY_IP=172.100.0.2
    networks:
      gateway:
        ipv4_address: 172.100.0.11
      default:
      
  scrcpy:
    image: monlor/ws-scrcpy
    container_name: scrcpy
    environment:
      # 这里添加你的redroid adb地址,用逗号分隔,如:redroid-1:5555,redroid-2:5555
      - ADB_ADDRESS=redroid-1:5555
    restart: unless-stopped
    networks:
      default:
      gateway:
        ipv4_address: 172.100.0.50
      
  redroid-1:
    image: redroid/redroid:13.0.0-latest
    container_name: redroid-1
    privileged: true
    volumes:
      - redroid-1:/data
    command:
      - androidboot.hardware=mt6891
      - ro.secure=0
      - ro.boot.hwc=GLOBAL
      # 这里的imei需要修改,每个机器都不一样
      - ro.ril.oem.imei=861503068112233
      - ro.ril.oem.imei1=861503068112234
      - ro.ril.oem.imei2=861503068112235
      - ro.ril.miui.imei0=861503068112236
      - ro.product.manufacturer=Xiaomi
      - ro.product.model=droid-1
      - ro.build.product=chopin
      - redroid.width=720
      - redroid.height=1280
      - redroid.gpu.mode=guest
    healthcheck: &healthcheck
      test: ["CMD", "sh", "-c", "test \"1\" = \"`/system/bin/getprop sys.boot_completed`\""]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 30s
    restart: unless-stopped
    networks:
      gateway:
        ipv4_address: 172.100.0.51
        
  gateway:
    image: ghcr.io/monlor/docker-gateway:main
    container_name: gateway
    environment:
      # 指定哪些容器ip需要走PH的代理,ip为容器ip,这里为firefox-1
      - RULE_TAG_PH=172.100.0.11/32
      # 添加名为PH的socks代理,ip 端口 用户 密码
      - OUTBOUND_SERVER_PH=socks,2.2.2.2:58688:user:pass
      # 再指定哪些容器ip走UK的代理,我这里随便写的gateway网络下的ip
      - RULE_TAG_UK=172.100.0.13/32
      # 再添加名为UK的socks代理,ip 端口 用户 密码
      - OUTBOUND_SERVER_UK=socks,3.3.3.3:58688:user:pass
    privileged: true
    pid: host
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      gateway:
        ipv4_address: 172.100.0.2
    restart: unless-stopped
  
volumes:
  nginx_data:
  nginx_cert:
  redroid-1:
  firefox-1:

networks:
  default:
    driver: bridge
    ipam:
      config:
        - subnet: "172.18.0.0/16"
          gateway: "172.18.0.1"
  gateway:
    name: gateway
    driver: bridge
    ipam:
      config:
        - subnet: 172.100.0.0/24

如果你没有安装docker,可以执行以下命令进行安装:

curl -sSL https://get.docker.com/ | sh

将配置文件保存到你喜欢的文件夹,比如/opt/server,然后部署服务:

cd /opt/server
docker compose up -d

查看容器日志:

docker compose logs

查看服务状态:

docker compose ps

原理解释

Cloudflare Zero Trust 安全拦截

非必需

拦截scrcpy和firefox的域名,使用github oauth登陆,保证服务安全性

nginx proxy manager

使用81端口访问,用于反向代理,ssl证书申请,如果你不使用zero trust,可以在这一层做basic认证,可以参考以下配置

我还在这一层配置了cf的ip白名单,保证cf => nginx的安全性

Docker Host

  • ws-scrcpy用于远程控制多个安卓设备(如redroid-1redroid-2)。
  • redroid-1redroid-2运行安卓系统实例。
  • firefox-1运行Firefox浏览器实例。

ws-scrcpy

需要添加环境变量,指定你要管理的redroid实例,有多少个redroid就添加多少个,会自动帮你连接。同时,当你重启redroid之后,也需要重启scrcpy

ADB_ADDRESS=redroid-1:5555,redoird-2:5555

Docker Gateway

非必需,这里以firefox-1举例

固定firefox-1容器的ip,方便做分流,例如

...
networks:
      gateway:
        ipv4_address: 172.100.0.11
...

在容器中添加环境变量,修改默认网关,执行我们的docker-gateway网关

- GATEWAY_IP=172.100.0.2

docker-gateway容器中添加环境变量代理,指定firefox-1走哪个代理,以下指定ip为172.100.0.11firefox-1容器走PH这个代理。

...
# 指定哪些容器ip需要走PH的代理,ip为容器ip,这里为firefox-1
- RULE_TAG_PH=172.100.0.11/32
# 添加名为PH的socks代理,ip 端口 用户 密码
- OUTBOUND_SERVER_PH=socks,2.2.2.2:58688:user:pass
- ...

看到这里你应该明白docker-gateway的工作原理了,要是不明白就实操。

效果图

安卓在手机上打开支持触摸,体验不错,在电脑上打开支持键盘输入。都可以很方便的共享给其他人使用。

SCR-20240730-klpz
SCR-20240730-klqr
SCR-20240730-kloa

最后修改:2024 年 09 月 10 日
如果觉得我的文章对你有用,请我喝杯咖啡吧☕️~