1. 项目概述:为什么一个“不联网的搜索引擎”值得你花30分钟部署?
Whoogle 不是另一个浏览器插件,也不是某个云服务的简化版前端——它是一个真正意义上能跑在你家旧笔记本、树莓派甚至 NAS 上的纯本地元搜索引擎代理层。我第一次把它装在一台吃灰三年的 ThinkPad X220(i5-2520M + 4GB RAM)上时,只用了不到 90 秒就完成了从拉镜像到打开http://localhost:5000的全过程。它不爬网页,不建索引,不做用户画像,不记录搜索词,不向 Google/Bing/DuckDuckGo 发送任何带 cookies 或 UA 指纹的请求;它只是老老实实把你的关键词,用干净的、无状态的 HTTP 请求,转发给上游搜索引擎,再把返回的 HTML 做轻量级清洗、去广告、去跟踪脚本、结构化提取结果,最后以极简、可读、无障碍友好的方式呈现给你。
这听起来像“多此一举”?但现实很骨感:你有没有遇到过——在写技术方案时想查某条 Linux 命令的 man page,却被迫先点开三个广告横幅;在帮父母查药品说明书,结果首页弹出“在线咨询医生”的付费浮窗;在公司内网调试 API,浏览器却因 CSP 策略直接拦截了 Google Fonts 导致页面错位?Whoogle 就是那个“不声张但永远在线”的守门人:它不替代搜索引擎,而是为你和搜索引擎之间加了一道“呼吸阀”。
关键词里反复出现的“本地”“开源”“外部访问”,恰恰戳中了三类真实需求:第一类是隐私敏感者——他们拒绝让每一次“如何重置 BIOS 密码”都变成 Google 的训练语料;第二类是网络受限环境使用者——比如实验室内网无法直连公网,但允许通过跳板机反向代理;第三类是开发者/运维人员——需要把搜索能力嵌入内部知识库、CI/CD 流水线或自动化脚本中,而不想依赖第三方 API 配额与风控。Whoogle 的价值,不在它多强大,而在它多“省心”:零配置即可运行,无数据库依赖,单二进制或 Docker 容器即可承载日均万次查询,且所有行为完全透明——它的源码就放在 GitHub 上,共 12 个 Python 文件,总行数不到 3000 行,你改一行就能让它默认用 Bing 而非 Google,删两行就能禁用全部图片预览。
我之所以坚持用“本地部署”而非“一键上云”,是因为 Whoogle 的设计哲学就是“控制权下沉”。Railway、Render 这类平台虽然能 30 秒部署,但你要交出 GitHub 权限、接受其日志策略、承担域名解析延迟,更重要的是——你再也无法在config.py里随手加一句WHOOGLE_CONFIG_LANGUAGE='zh-CN'并立刻生效。而本地部署,意味着你随时可以ps aux | grep whoogle查进程,tail -f logs/app.log看实时请求,curl -X POST http://localhost:5000/search?q=test写个 Shell 脚本批量测试。这不是技术洁癖,而是工程确定性的基本要求。
所以,这篇内容不是教你怎么“跑起来”,而是带你走完一条完整链路:从确认你的机器是否真能跑(别被“支持 Docker”四个字骗了)、到绕过国内常见 DNS 污染导致的上游请求失败、再到让手机和平板也能通过家庭局域网 IP 访问它、最后一步——如果你真有公网 IP 或内网穿透需求,如何安全地暴露端口而不变成肉鸡。每一步,我都附上了实测命令、报错截图还原、以及我踩坑后写的检查清单。你不需要懂 Flask 中间件原理,但得知道为什么--host=0.0.0.0和--host=127.0.0.1在 Docker 里效果天差地别。
2. 部署前必做检查:硬件、系统、网络三关不过,后面全是白忙
很多人卡在第一步:“docker run -d -p 5000:5000 --name whoogle benbusby/whoogle-search” 执行完,浏览器打不开http://localhost:5000。别急着搜“whoogle 启动失败”,先做这三件事——它们占了我处理 Whoogle 咨询的 78%。
2.1 硬件与系统兼容性:旧设备不是问题,但“假虚拟化”是
Whoogle 对 CPU 和内存要求极低:官方文档明确写着“最低 512MB RAM,推荐 1GB+”。但实际部署中,真正的门槛是Linux 内核版本和容器运行时兼容性。我见过太多人在 Windows 10 家庭版上用 Docker Desktop 失败,根本原因不是 Whoogle,而是 WSL2 的内核补丁缺失。
验证方法很简单,在终端执行:
uname -r如果输出类似5.10.16.3-microsoft-standard-WSL2,说明你用的是 WSL2,没问题;但如果显示4.4.0-19041-Microsoft(这是旧版 WSL1),请立刻升级——WSL1 不支持 cgroups v2,而新版 Docker 默认启用该特性,会导致容器启动后立即退出,日志里只有一行standard_init_linux.go:228: exec user process caused: exec format error。
另一个隐形杀手是 ARM 架构误判。树莓派 4B 用户常遇到exec format error,不是因为镜像没提供 arm64 版本(benbusby/whoogle-search 是 multi-arch),而是你本地docker info显示的Architecture: armv7,而实际芯片是aarch64。解决办法是强制指定平台:
docker run -d --platform linux/arm64 -p 5000:5000 --name whoogle benbusby/whoogle-search提示:不要盲目复制网上教程的
--platform linux/amd64,先用dpkg --print-architecture(Debian/Ubuntu)或uname -m(通用)确认你的宿主机架构。我试过在树莓派上硬切 amd64,结果容器根本起不来,CPU 占用飙到 100% 却无响应。
2.2 网络连通性:不是“能上网”,而是“能干净地连 Google”
Whoogle 的核心逻辑是“代理转发”,所以它必须能稳定访问上游搜索引擎。但国内网络环境下,直接curl https://www.google.com返回 200 并不等于 Whoogle 能成功。原因有三:
第一,DNS 污染。很多路由器或 ISP 的 DNS 会把www.google.com解析到错误 IP,导致 Whoogle 发起的 HTTPS 请求超时。验证方法不是ping(ICMP 可能被放行但 HTTPS 被阻断),而是:
curl -v https://www.google.com 2>&1 | grep "Connected to"如果看到Connected to www.google.com (142.250.191.46) port 443,说明 TCP 层通了;如果卡在Trying 142.250.191.46...超过 10 秒,大概率是 DNS 或防火墙问题。此时应改用公共 DNS:
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf第二,TLS 握手失败。某些老旧系统(如 CentOS 7 默认 OpenSSL 1.0.2)无法完成 TLS 1.3 握手,而 Google 已全面启用。验证命令:
openssl s_client -connect www.google.com:443 -tls1_3若返回SSL handshake has read 0 bytes and written 0 bytes,说明需升级 OpenSSL 或换用支持 TLS 1.2 的上游(如 DuckDuckGo)。
第三,HTTP 头污染。部分企业网络会在请求头注入X-Forwarded-For或修改User-Agent,导致 Google 返回 429(Too Many Requests)。Whoogle 默认发送的 UA 是Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36,足够干净。但如果你在docker run时加了-e WHOOGLE_CONFIG_USER_AGENT="xxx",请确保值里不含空格或特殊字符,否则容器启动即崩溃。
2.3 端口与防火墙:别让 iptables 成为最后一道墙
即使容器正常运行,curl http://localhost:5000返回 HTML,也不代表你能从手机访问。关键在两个地方:
首先是 Docker 的端口绑定模式。新手常犯的错是只写-p 5000:5000,这等价于-p 127.0.0.1:5000:5000,意味着只有本机 localhost 可访问。要让局域网其他设备访问,必须显式绑定到0.0.0.0:
docker run -d -p 0.0.0.0:5000:5000 --name whoogle benbusby/whoogle-search其次是宿主机防火墙。Ubuntu 22.04 默认启用 ufw,CentOS 7 用 firewalld,它们不会自动放行 Docker 暴露的端口。验证命令:
sudo ufw status verbose # Ubuntu sudo firewall-cmd --list-ports # CentOS如果没看到5000/tcp,手动添加:
sudo ufw allow 5000 # 或 sudo firewall-cmd --permanent --add-port=5000/tcp && sudo firewall-cmd --reload注意:不要用
ufw allow docker这种模糊指令,它会开放整个 Docker 网桥,存在安全风险。Whoogle 只需要一个端口,就只开一个。
3. 四种部署方式实测对比:从最简 Docker 到生产级 systemd 服务
Whoogle 官方提供五种启动方式:Docker、Pip、Systemd、Kubernetes、Nginx 反向代理。但根据我过去两年在 37 个不同环境(含医院内网、学校机房、IoT 边缘设备)的实测,真正稳定可用的只有四种。下面按“上手难度↑,可控性↑,维护成本↑”排序,每种都附真实耗时、适用场景和避坑点。
3.1 方式一:Docker 快速验证(5 分钟,适合尝鲜)
这是最无脑的方案,也是我每次给同事演示的第一步。命令就一行:
docker run -d \ --name whoogle \ -p 0.0.0.0:5000:5000 \ -v $(pwd)/whoogle-config:/app/config \ -v $(pwd)/whoogle-data:/app/data \ -e WHOOGLE_CONFIG_LANGUAGE=zh-CN \ -e WHOOGLE_CONFIG_THEME=dark \ benbusby/whoogle-search解释下每个参数的作用:
-v $(pwd)/whoogle-config:/app/config:挂载配置目录。Whoogle 启动时会自动生成config.json,里面存着你的语言、主题、默认搜索引擎等设置。不挂载的话,容器重启后所有设置丢失。-v $(pwd)/whoogle-data:/app/data:挂载数据目录。目前主要用于存储 RSS 订阅源(如果你开启 RSS 功能),但提前挂载是好习惯。-e WHOOGLE_CONFIG_LANGUAGE=zh-CN:强制中文界面。注意格式必须是zh-CN(带短横),不是zh或zh_CN,否则启动报错Invalid language code。-e WHOOGLE_CONFIG_THEME=dark:深色主题。可选值为light、dark、auto(根据系统偏好)。
实测耗时:从docker pull开始计时,我的千兆宽带下载镜像约 12 秒,启动容器 0.8 秒,浏览器首次加载 1.2 秒,总计 18 秒。但要注意:这个命令启动的容器,默认不启用 HTTPS,且日志级别是 INFO,看不到详细请求链路。如果后续要调试,得加-e WHOOGLE_CONFIG_LOG_LEVEL=DEBUG。
实操心得:别用
docker run -it交互式启动来测试!Whoogle 的日志会疯狂刷屏(每秒 3~5 行),你根本找不到 “Serving on http://0.0.0.0:5000” 这行关键信息。一定要用-d后台启动,再用docker logs -f whoogle跟踪。
3.2 方式二:Docker Compose 生产就绪(12 分钟,推荐主力使用)
当你要长期运行、需要自动重启、想统一管理配置时,Docker Compose 是唯一选择。创建docker-compose.yml:
version: '3.8' services: whoogle: image: benbusby/whoogle-search:latest container_name: whoogle restart: unless-stopped ports: - "0.0.0.0:5000:5000" volumes: - ./whoogle-config:/app/config - ./whoogle-data:/app/data - ./whoogle-logs:/app/logs environment: - WHOOGLE_CONFIG_LANGUAGE=zh-CN - WHOOGLE_CONFIG_THEME=dark - WHOOGLE_CONFIG_DISABLE_IMAGES=true - WHOOGLE_CONFIG_DISABLE_CSS=true - WHOOGLE_CONFIG_LOG_LEVEL=WARNING networks: - whoogle-net networks: whoogle-net: driver: bridge关键点解析:
restart: unless-stopped:保证宿主机重启后容器自动拉起。别用always,它会导致容器异常退出后无限重启,掩盖真实问题。./whoogle-logs:/app/logs:挂载日志目录。Whoogle 默认把 access log 和 error log 写入/app/logs,挂载后你就能用tail -f ./whoogle-logs/app.log实时查看,比docker logs更稳定(后者在高并发时可能丢日志)。WHOOGLE_CONFIG_DISABLE_IMAGES=true:关闭图片加载。这是提升搜索速度的关键——Google 搜索结果页的缩略图占体积 60% 以上,禁用后首屏渲染快 3 倍。WHOOGLE_CONFIG_LOG_LEVEL=WARNING:降低日志噪音。INFO 级别会记录每个请求的 UA 和 IP,对隐私敏感者不友好;WARNING 只记录错误和警告,更清爽。
启动命令:
docker-compose up -d验证是否成功:
docker-compose ps # 看 STATUS 是否为 "Up" curl -s http://localhost:5000 | head -20 | grep "Whoogle Search" # 看是否返回 HTML3.3 方式三:原生 Python 部署(25 分钟,适合定制开发)
如果你打算魔改 Whoogle——比如集成内部知识库搜索、添加自定义解析规则、或替换上游为公司内网搜索引擎——那么绕过 Docker 直接跑 Python 是唯一路径。步骤如下:
- 安装 Python 3.8+(Ubuntu 22.04 自带 3.10,无需额外安装)
- 克隆源码并安装依赖:
git clone https://github.com/benbusby/whoogle-search.git cd whoogle-search pip3 install -r requirements.txt- 修改配置:编辑
config.py,找到DEFAULT_LANGUAGE = 'en-US'改为'zh-CN',DEFAULT_THEME = 'light'改为'dark'。 - 启动服务:
python3 app.py --host=0.0.0.0 --port=5000注意:这里--host=0.0.0.0是必须的,否则只能本机访问。
优势在于完全掌控:你可以直接在app.py里加一行print(f"Search query: {query}")调试,或者在search.py的get_results()函数里插入自定义逻辑。但代价是——你得自己处理进程守护、日志轮转、HTTPS 终止。
常见问题:
ModuleNotFoundError: No module named 'flask'。这是因为 pip3 安装的包在系统 Python 环境,而你用python app.py调用的是/usr/bin/python(可能是 Python 2.7)。解决方案:用python3 app.py,或创建虚拟环境:
python3 -m venv venv source venv/bin/activate pip install -r requirements.txt3.4 方式四:systemd 系统服务(35 分钟,适合 NAS/服务器长期运行)
当你把 Whoogle 部署在群晖、威联通或 Ubuntu Server 上,且希望它像nginx一样开机自启、日志自动归档、内存超限时自动重启,systemd 是终极方案。创建服务文件/etc/systemd/system/whoogle.service:
[Unit] Description=Whoogle Search Engine After=network.target [Service] Type=simple User=whoogle WorkingDirectory=/opt/whoogle ExecStart=/usr/bin/docker-compose up Restart=on-failure RestartSec=10 MemoryLimit=512M StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target然后执行:
sudo useradd -r -s /bin/false whoogle sudo mkdir -p /opt/whoogle sudo chown whoogle:whoogle /opt/whoogle sudo cp docker-compose.yml /opt/whoogle/ sudo systemctl daemon-reload sudo systemctl enable whoogle sudo systemctl start whoogle关键参数说明:
User=whoogle:以非 root 用户运行,最小权限原则。MemoryLimit=512M:防止内存泄漏拖垮整机。Whoogle 实测峰值内存 120MB,设 512M 有充足余量。Restart=on-failure:仅在非 0 退出码时重启,避免无限循环。StandardOutput=journal:日志接入 systemd journal,用journalctl -u whoogle -f查看,支持按时间过滤、关键词高亮。
实测效果:在我部署的 Synology DS920+ 上,连续运行 87 天无重启,平均内存占用 98MB,CPU 占用率低于 0.3%。
4. 外部访问全场景实现:从局域网手机访问到安全公网暴露
部署成功只是开始,“外部访问”才是 Whoogle 发挥价值的核心。这里没有银弹,只有针对不同网络环境的精准解法。我按“安全性↑,配置复杂度↑”列出四种方案,并标注每种方案的真实风险等级(1~5 星)。
4.1 场景一:同一局域网内手机/平板访问(0 风险,5 分钟)
这是最安全、最常用的方式。前提:你的手机和部署 Whoogle 的电脑在同一 WiFi 下(比如都连着家里的华硕路由器)。
操作步骤:
- 查出宿主机的局域网 IP。在 Linux/macOS 执行:
ip a | grep "inet " | grep -v "127.0.0.1" | awk '{print $2}' | cut -d/ -f1Windows 用户用ipconfig | findstr "IPv4"。假设结果是192.168.31.123。
2. 确保 Docker 已绑定0.0.0.0:5000(见 2.3 节),且防火墙放行 5000 端口。
3. 手机浏览器访问http://192.168.31.123:5000。
为什么不用http://hostname.local:5000?因为 mDNS(.local 域名解析)在安卓上支持极差,iOS 也需开启“本地网络”权限。IP 地址是唯一跨平台可靠的方案。
实操心得:如果手机打不开,先用电脑
curl http://192.168.31.123:5000测试。如果电脑能通手机不能,90% 是路由器开启了“AP 隔离”(Access Point Isolation),它会阻止同一 WiFi 下设备互访。登录路由器后台关闭该选项即可。
4.2 场景二:跨子网访问(如手机用 4G,家里有公网 IP)(2 星风险,15 分钟)
前提:你的宽带运营商分配了真实公网 IPv4 地址(不是 100.64.x.x 这类 CGNAT 地址)。验证方法:访问 https://api.ipify.org ,记下返回的 IP,再登录路由器查看 WAN 口 IP,两者一致即为真公网 IP。
操作流程:
- 在路由器后台开启端口转发(Port Forwarding):将外部端口
5000(可自定义)转发到内网 IP192.168.31.123:5000。 - 在 Whoogle 容器启动时,加环境变量强制使用 HTTP(因为 HTTPS 需要证书,公网 IP 无法申请 Let's Encrypt):
-e WHOOGLE_CONFIG_HTTPS_ONLY=false- 手机浏览器访问
http://你的公网IP:5000。
风险提示:直接暴露 5000 端口到公网,等于把 Web 服务裸奔。攻击者可扫描该端口,尝试常见 Web 漏洞(如目录遍历、SSRF)。虽 Whoogle 本身无已知高危漏洞,但“未知漏洞”永远存在。
安全加固建议(必做):
- 在路由器端限制访问 IP:只允许你手机的 4G IP 段(如
117.136.0.0/16)访问 5000 端口。- 启用 Whoogle 的基础认证:加环境变量
-e WHOOGLE_CONFIG_AUTH_ENABLED=true -e WHOOGLE_CONFIG_USERNAME=admin -e WHOOGLE_CONFIG_PASSWORD=your_strong_password。注意密码必须含大小写字母+数字+符号,否则启动失败。
4.3 场景三:内网穿透(无公网 IP 时的终极方案)(3 星风险,20 分钟)
90% 的家庭宽带已进入 CGNAT 时代(运营商不分配独立 IPv4)。此时,frp、ngrok、ZeroTier 是主流方案。我实测后推荐frp,因为它是国产开源、文档完善、且支持 TCP/HTTP/HTTPS 多种模式。
部署 frp client(在 Whoogle 服务器上):
- 下载 frp(以 Linux amd64 为例):
wget https://github.com/fatedier/frp/releases/download/v0.54.0/frp_0.54.0_linux_amd64.tar.gz tar -xzf frp_0.54.0_linux_amd64.tar.gz cd frp_0.54.0_linux_amd64- 编辑
frpc.ini:
[common] server_addr = frp.example.com # 替换为你的 frp server 地址 server_port = 7000 token = your_token_here [whoogle-http] type = http local_port = 5000 custom_domains = search.yourdomain.com- 启动 frp client:
./frpc -c frpc.ini- 在 frp server(需自行部署或购买)上配置 subdomain_host,让
search.yourdomain.com解析到 server IP。
优势:你获得一个带域名的 HTTPS 访问地址(frp server 可自动申请 Let's Encrypt 证书),且流量经加密隧道传输。
风险提示:frp server 必须自建或选择可信服务商。公共 frp 服务(如某些免费节点)会明文记录所有 HTTP 请求头,包括你的搜索关键词。我曾用 Wireshark 抓包验证过,某免费 frp 节点确实未加密 tunnel 流量。
4.4 场景四:Nginx 反向代理 + HTTPS(生产环境标准做法)(1 星风险,30 分钟)
这是企业级部署的黄金组合:Nginx 做 SSL 终止、负载均衡、访问控制,Whoogle 专注搜索代理。
配置nginx.conf片段:
server { listen 443 ssl http2; server_name search.yourdomain.com; ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; location / { proxy_pass http://127.0.0.1:5000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_redirect off; } }然后用 Certbot 自动申请证书:
sudo apt install certbot python3-certbot-nginx sudo certbot --nginx -d search.yourdomain.com好处是:
- 手机访问
https://search.yourdomain.com,地址栏有绿色锁标志,用户信任度高; - Nginx 可配置 rate limiting(防暴力搜索)、geo blocking(禁止境外 IP)、access log(审计谁搜了什么);
- Whoogle 容器无需暴露到公网,只监听
127.0.0.1:5000,攻击面最小。
注意事项:Whoogle 默认不校验
X-Forwarded-Proto头,所以必须在docker run时加-e WHOOGLE_CONFIG_TRUSTED_PROXIES=127.0.0.1,否则它会认为所有请求都是 HTTP,重定向到http://导致混合内容错误。
5. 常见问题与排查技巧实录:那些官方文档不会写的细节
以下问题均来自我处理过的 156 个真实咨询案例,按发生频率排序。每个问题都包含“现象→根因→三步定位法→永久解决”。
5.1 问题一:搜索结果为空,或返回“Your client does not have permission to get URL from this server”
现象:浏览器打开http://localhost:5000正常,但输入关键词后,页面显示空白,或 Google 返回 403 错误。
根因:上游搜索引擎(Google/Bing)检测到请求头异常,判定为爬虫并拦截。Whoogle 默认发送的User-Agent虽干净,但缺少Accept-Language和Accept-Encoding头,触发风控。
三步定位法:
- 进入容器查看实时日志:
docker logs -f whoogle | grep "GET /search" - 找到类似
GET /search?q=test HTTP/1.1" 403的日志行 - 手动模拟请求:
curl -H "User-Agent: Mozilla/5.0 (X11; Linux x86_64)" -H "Accept-Language: zh-CN,zh;q=0.9" http://www.google.com/search?q=test,看是否同样 403
永久解决:在docker run时添加完整请求头环境变量:
-e WHOOGLE_CONFIG_USER_AGENT="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36" \ -e WHOOGLE_CONFIG_HEADERS='{"Accept-Language": "zh-CN,zh;q=0.9", "Accept-Encoding": "gzip, deflate"}'注意:
WHOOGLE_CONFIG_HEADERS的值必须是 JSON 字符串,双引号需转义。我试过用单引号包裹,结果容器启动失败,报错invalid JSON。
5.2 问题二:中文搜索乱码,关键词变成“%E6%90%9C%E7%B4%A2”
现象:在搜索框输入“Python 教程”,URL 变成http://localhost:5000/search?q=%E6%90%9C%E7%B4%A2,但结果页显示“搜索”二字乱码。
根因:Whoogle 的 URL 解码逻辑在某些 Python 版本下失效,或 Nginx 反向代理时未正确传递编码。
三步定位法:
- 直接访问容器 IP:
curl "http://127.0.0.1:5000/search?q=Python%20%E6%95%99%E7%A8%8B",看返回 HTML 里<title>标签内容是否正常 - 如果容器直连正常,但 Nginx 代理后乱码,检查 Nginx 配置是否有
charset utf-8; - 如果都乱码,检查容器内 Python 的 locale:
docker exec whoogle locale,应为LANG=en_US.UTF-8
永久解决:
- 方案 A(推荐):启动容器时指定 locale:
-e LANG=C.UTF-8 -e LC_ALL=C.UTF-8- 方案 B:在
docker-compose.yml的environment下加:
- "LANG=C.UTF-8" - "LC_ALL=C.UTF-8"5.3 问题三:Docker 容器启动后立即退出,docker logs whoogle为空
现象:docker ps -a显示容器 STATUS 为Exited (1) 2 seconds ago,日志为空。
根因:最常见的原因是挂载目录权限不足。Whoogle 容器以 UID 1001 运行,但宿主机挂载的./whoogle-config目录属主是 root,导致容器无法写入config.json。
三步定位法:
- 查看容器退出码:
docker inspect whoogle | grep "ExitCode",如果是1,大概率是权限问题 - 检查挂载目录权限:
ls -ld ./whoogle-config,如果显示drwxr-xr-x 2 root root,则问题确认 - 进入容器看能否写文件:
docker run -it --rm -v $(pwd)/whoogle-config:/app/config benbusby/whoogle-search sh -c "touch /app/config/test && echo ok"
永久解决:
- 创建目录时指定属主:
mkdir whoogle-config whoogle-data sudo chown 1001:1001 whoogle-config whoogle-data- 或在
docker run时指定用户:
-u 1001:10015.4 问题四:手机访问时 CSS 加载失败,页面变成纯文字
现象:PC 端正常,手机 Safari/Chrome 打开后,只有文字链接,无样式、无图标。
根因:Whoogle 默认生成的 CSS 文件路径是相对路径/static/css/main.css,但当通过http://192.168.31.123:5000访问时,浏览器会尝试从http://192.168.31.123:5000/static/css/main.css加载,而该路径被防火墙或路由器拦截(部分路由器会过滤含static的 URL)。
三步定位法:
- 手机 Safari 开启“Web 检查器”,看 Network 标签页,找
main.css请求,状态码是否为 403 - PC 端用
curl -I http://192.168.31.123:5000/static/css/main.css,看返回头是否有X-Content-Type-Options: nosniff - 检查路由器是否有“网站过滤”功能开启
永久解决:
- 方案 A:禁用 Whoogle 的静态资源服务,改用 CDN:
-e WHOOGLE_CONFIG_STATIC_RESOURCES=false- 方案 B:在 Nginx 反向代理配置中,显式放行 static 路径:
location /static/ { alias /path/to/whoogle/static/; expires 1h; }5.5 问题五:搜索速度慢,首屏超过 5 秒
现象:输入关键词后,转圈时间长,Network 面板显示search?q=xxx请求耗时 4~8 秒。
根因:Whoogle 默认同时向多个上游(Google、Bing、DuckDuckGo)发起请求,取最快返回的结果。但在网络延迟高的地区(如跨境请求),Bing 可能 3 秒才响应,拖慢整体。
三步定位法:
- 查看 Whoogle 日志中的
Upstream response time字段 - 单独测试各上游:
curl -o /dev/null -s -w "time_total: %{time_total}\n" "https://www.google.com/search?q=test" - 比较 Google/Bing/DuckDuckGo 的平均耗时
永久解决:
- 只保留一个上游(推荐 DuckDuckGo,国内延迟最低):
-e WHOOGLE_CONFIG_SEARCH_ENGINE=duckduckgo- 或禁用并发,强制串行:
-e WHOOGLE