尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Vaultwarden + TaoToken:自托管密码管理器的 Docker 配置与 API 通道接入

Vaultwarden + TaoToken:自托管密码管理器的 Docker 配置与 API 通道接入 1. 为什么我把密码库从 1Password 搬回了自家 NAS密码这件事越用越觉得别扭。1Password 体验确实好但每年续费的时候总会想这些数据真的只能放在别人服务器上吗LastPass 那几次事故之后我对「把全部身家密码托管给第三方」这件事越来越没安全感。后来我试过 Bitwarden 官方自托管功能是全但一台 2C2G 的小机器跑起来内存直接飙到 500MB 以上对我这种把服务塞在 NAS 和迷你主机上的人来说有点重。直到用上 Vaultwarden情况才变得舒服。它是一个用 Rust 写的 Bitwarden 服务端替代实现兼容官方 Bitwarden 全平台客户端内存占用实测稳定在 50MB 上下Docker 一条命令就能拉起来。你可以把它理解成「Bitwarden 的发动机换成了更省油的 Rust 版本但方向盘、仪表盘还是原来那套」——桌面端、浏览器扩展、手机 App 全都照常连。这篇要交付的东西很具体一份可直接复制的 Docker Compose 配置、反向代理的 HTTPS 骨架、以及把 TaoToken 的统一 Key/API 通道接进 settings.json 的写法最后是服务启动和客户端连接的验证动作。适合有 NAS 或一台常开小主机、想自己掌控密码数据、又不想折腾太重服务的人。整个过程不需要你懂 Rust会复制粘贴、会改域名就行。2. 前置准备TaoToken 通道与目录规划在动手之前先把两件事理清楚一是服务器和域名二是 API 通道的接入方式。服务器方面Vaultwarden 对资源要求极低1 核 512MB 的机器就能跑得很稳。我自己的环境是一台装了 Docker 的迷你主机系统盘之外挂了一块数据盘专门放密码库。域名建议单独准备一个子域比如vw.yourdomain.com因为 Vaultwarden 的 Web Vault 和客户端同步都强依赖 HTTPS用 IP 直连会在浏览器扩展登录时出各种奇怪问题。API 通道这块我用 TaoToken 做统一入口。它的作用是把你分散的模型调用、编码 Agent 请求收敛到一个 Key 和一套 API 地址上省得每个工具单独配一遍。官网在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 基址是 https://taotoken.net/api 。注意 API 地址不要带 UTM 参数直接写干净路径就行。你需要提前拿到的东西一个 TaoToken 的 API Key在控制台里创建地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite一个解析到服务器的域名以及对应的 TLS 证书Lets Encrypt 或你自己的都行服务器上装好 Docker 和 Docker Compose 插件目录我习惯这样规划/opt/vaultwarden放 compose 文件/opt/vaultwarden/vw-data挂载数据卷。数据卷是命根子后面备份就靠它。另外单独建一个/opt/vaultwarden/taotoken目录放通道配置跟密码库数据物理隔开避免误删。提示Vaultwarden 的DOMAIN环境变量必须填你最终对外访问的 HTTPS 地址填错会导致客户端同步失败、附件上传 404。这个坑我踩过排查了半天。3. 可复制配置Docker Compose 与 TaoToken 通道骨架先上主菜docker-compose.yml。这份配置我实测跑通包含数据卷、环境变量、端口绑定和日志设置。services: vaultwarden: image: vaultwarden/server:latest container_name: vaultwarden restart: unless-stopped environment: DOMAIN: https://vw.yourdomain.com SIGNUPS_ALLOWED: true INVITATIONS_ALLOWED: false WEB_VAULT_ENABLED: true ADMIN_TOKEN: 换成你自己的长随机串 LOG_FILE: /data/vaultwarden.log LOG_LEVEL: info EXTENDED_LOGGING: true volumes: - ./vw-data:/data ports: - 127.0.0.1:8080:80几个参数说明一下。SIGNUPS_ALLOWED第一次启动时设成true方便你注册主账号注册完立刻改回false并重启防止陌生人注册。ADMIN_TOKEN是管理面板的访问令牌用openssl rand -base64 48生成一串别用简单密码。端口只绑127.0.0.1对外一律走反向代理不要直接把 8080 暴露到公网。启动命令cd /opt/vaultwarden docker compose up -d docker compose logs -f vaultwarden看到日志里出现Rocket has launched之类的字样说明服务起来了。此时本机curl http://127.0.0.1:8080应该能返回 Web Vault 的 HTML。接下来是 TaoToken 通道的settings.json骨架。这个文件用于把编码 Agent 或模型调用统一指向 TaoToken 的 API 通道放在/opt/vaultwarden/taotoken/settings.json{ api_base: https://taotoken.net/api, api_key: sk-你的TaoToken密钥, default_model: claude-sonnet-4-5, timeout_seconds: 60, retry: { max_attempts: 3, backoff_seconds: 2 }, headers: { Content-Type: application/json } }api_base固定写https://taotoken.net/api不要加任何查询参数。api_key从控制台复制权限最小化别用主账号全权限 Key。default_model按你实际订阅的模型填长期跑编码任务的话建议配合 Coding Plan 使用地址是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 能省不少调用成本。反向代理我用 Nginx配置如下重点是 WebSocket 升级头和client_max_body_size附件上传大文件时后者不给够会直接 413server { listen 80; server_name vw.yourdomain.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; server_name vw.yourdomain.com; ssl_certificate /etc/letsencrypt/live/vw.yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/vw.yourdomain.com/privkey.pem; client_max_body_size 128M; location / { proxy_pass http://127.0.0.1:8080; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; 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_set_header X-Forwarded-Host $host; } }改完nginx -t测试语法再systemctl reload nginx。如果你用 Traefik思路一样给容器打上traefik.enabletrue和路由规则标签即可核心还是把 80 端口交给它、TLS 由它终结。4. 验证请求从服务启动到客户端连接配置写完不算完得一步步验证。我按顺序走一遍。第一步确认容器健康docker compose ps curl -I https://vw.yourdomain.com返回HTTP/2 200说明反代和证书都通了。如果返回 502多半是 Nginx 到 8080 的链路断了检查容器是否在跑、端口是否绑对。第二步验证 TaoToken 通道连通性。用 curl 直接打 API 基址确认 Key 有效curl -s https://taotoken.net/api/v1/models \ -H Authorization: Bearer sk-你的TaoToken密钥 \ -H Content-Type: application/json | head -c 500能返回模型列表 JSON 就说明通道正常。如果返回 401检查 Key 有没有复制全、有没有多余空格返回 404 则确认路径是不是/api/v1/...别漏了/api前缀。第三步客户端连接。桌面端和浏览器扩展的配置路径一样安装官方 Bitwarden 客户端进入设置找到「Self-hosted」或「自托管环境」把服务器地址填成https://vw.yourdomain.com保存后登录。手机端在登录页点齿轮图标选「自托管」同样填这个地址。登录成功后建一条测试登录项然后在另一台设备上同步看能不能秒级出现。这一步能验证 WebSocket 推送是否正常——如果同步要手动刷新才出来说明反代的 Upgrade 头没配对。第四步验证 TOTP。随便找一条登录项编辑时填入 Authenticator Key那串otpauth://或纯 Base32保存后条目上会显示 6 位动态码跟手机上的验证器对一下一致就说明内置 TOTP 工作正常。第五步跑一次备份确认数据卷可读tar -czvf /opt/backup/vw-$(date %Y%m%d).tar.gz -C /opt/vaultwarden vw-data备份文件能正常生成、大小不为 0就说明数据落盘没问题。建议把这条命令丢进 crontab每天凌晨跑一次。5. 本篇常见错排查报错一客户端提示「无法连接到服务器」或「证书无效」。九成是DOMAIN环境变量和实际访问地址不一致或者证书链不完整。检查 compose 里的DOMAIN是否带https://、域名是否和浏览器地址栏完全一致。证书用fullchain.pem而不是单独的cert.pem。报错二附件上传失败返回 413。Nginx 的client_max_body_size默认只有 1M改成 128M 或更大reload 后重试。Traefik 用户检查是否有中间件限制请求体大小。报错三TaoToken 调用返回 401/403。先确认 Key 没写错、没过期再确认请求头是Authorization: Bearer sk-xxx格式。如果 Key 权限被限制到特定模型调用其他模型也会 403去控制台核对权限范围。报错四容器启动后立刻退出。看docker compose logs vaultwarden常见原因是数据目录权限不对。vw-data目录需要容器内用户可写执行chown -R 1000:1000 /opt/vaultwarden/vw-data再重启。报错五WebSocket 连接失败实时同步不工作。反代配置里proxy_set_header Upgrade $http_upgrade;和Connection upgrade两行必须都有缺一个都会导致长连接建立不起来。报错六忘记管理员令牌进不去面板。直接改 compose 里的ADMIN_TOKENdocker compose up -d重建容器即可数据不受影响。注意生产环境务必把SIGNUPS_ALLOWED设为false。开放注册的 Vaultwarden 实例会被扫描器盯上虽然密码是加密的但没必要给别人留门。6. 后续怎么用把通道和密码库串起来密码库跑起来只是第一步。我现在的用法是Vaultwarden 管所有账号密码和 TOTPTaoToken 通道管编码 Agent 和模型调用的统一入口两者各司其职。日常写代码时Agent 通过settings.json里的api_base走 TaoToken需要换模型或查用量就去模型对话页面对比效果地址是 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 。如果你要接 Claude Code 这类工具接入文档里有完整的端点说明地址是 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 照着填ANTHROPIC_BASE_URL之类的环境变量就行。Key 的管理和轮换在 API Keys 页面地址是 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 建议给不同工具分配不同 Key方便出问题时单独吊销。最后说个我自己的习惯Vaultwarden 的备份和 TaoToken 的 Key 轮换我都放在每月一号做。备份验证过一次恢复流程Key 轮换后同步更新settings.json并重启相关服务。密码管理这件事配置一次能安稳用很久但备份和轮换这两个动作别偷懒。
返回列表