一直以来,我都希望在服务器上运行安卓和浏览器,以便执行一些自动化任务,比如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-1
和redroid-2
)。redroid-1
和redroid-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.11
的firefox-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
的工作原理了,要是不明白就实操。
效果图
安卓在手机上打开支持触摸,体验不错,在电脑上打开支持键盘输入。都可以很方便的共享给其他人使用。
2 条评论
牛呀!