对话笔记直发:4.27 Bitwarden + Vaultwarden+ Tailscale。分类:网络基建。

Bitwarden+ Vaultwarden ( Tailscale )从零部署手册

下面是一份面向 0 基础用户的完整手册,目标是从零开始在你的本地 Armbian/Debian ARM64 服务器上手动部署:

  1. SSH 远程管理
  2. Tailscale 远程访问
  3. Vaultwarden 密码管理服务
  4. Tailscale Serve 内网 HTTPS 访问
  5. 首次注册与关闭开放注册
  6. 常用维护命令

这份手册基于你这次实际部署过程整理,尽量保留了当时用到的命令和思路,并补充了更适合手动操作的说明。


一、你的环境假设

本手册适用于以下环境:

  1. 服务器系统:Armbian 23.11 / Debian 12 bookworm / ARM64
  2. 服务器局域网地址:局域网IP(已脱敏)
  3. 本地电脑:Windows 11
  4. 手机:Android
  5. 家庭网络:只有公网 IPv6,没有公网 IPv4
  6. 你的目标:
    • 用 Bitwarden 客户端管理密码
    • 服务端自建 Vaultwarden
    • 优先通过 Tailscale 安全访问
    • 暂时不折腾公网暴露

二、这次部署的最终结构

部署完成后,整体结构如下:

  1. 服务器上安装 Tailscale
  2. 电脑和安卓手机也安装 Tailscale
  3. 三台设备登录同一个 Tailscale 账号
  4. 服务器上运行 Vaultwarden Docker 容器
  5. Vaultwarden 只监听本机 127.0.0.1:8080
  6. 用 Tailscale Serve 把它发布成 Tailnet 内 HTTPS 服务
  7. 在 Bitwarden 客户端中填写自托管地址:https://你的服务器名.你的tailnet.ts.net

这次你的实际地址是:

https://jp-tvbox-3566.taile8eadf.ts.net

三、部署前准备

你需要准备:

  1. 一台可 SSH 登录的服务器
  2. 服务器 root 权限
  3. Windows 电脑可连接局域网
  4. 一个 Tailscale 账号
  5. 服务器可以联网下载软件
  6. 服务器已安装 Docker 和 docker-compose
    • 如果还没安装,后面我也会给出安装思路

四、第一步:确认服务器可 SSH 连接

在 Windows PowerShell 中测试:

ssh root@`局域网IP(已脱敏)`

如果想先快速确认系统信息,可以执行:

ssh root@`局域网IP(已脱敏)` "uname -m && cat /etc/os-release"

你这次实际返回的是:

  • 架构:aarch64
  • 系统:Armbian 23.11.0-trunk bookworm
  • 基础发行版:Debian 12

Warning

如果这一步失败,先不要继续部署 Tailscale 和 Vaultwarden,应先把 SSH 打通。


五、第二步:在服务器安装 Tailscale

在 Windows PowerShell 中执行:

ssh root@`局域网IP(已脱敏)` "curl -fsSL https://tailscale.com/install.sh | sh"

这个命令会:

  1. 自动识别你的系统是 Debian bookworm
  2. 添加 Tailscale 官方软件源
  3. 安装 tailscale 包
  4. 启用 tailscaled 服务

安装完成后,终端通常会提示你下一步运行:

tailscale up

六、第三步:让服务器加入 Tailscale 网络

Warning

这里不要加 tag。

你这次第一次失败,就是因为用了:

tailscale up --accept-routes=false --accept-dns=true --advertise-tags=tag:server

结果报错:

  • requested tags [tag:server] are invalid or not permitted

对于个人用户,正确做法是不用 tag,直接执行:

ssh root@`局域网IP(已脱敏)` "tailscale up --accept-routes=false --accept-dns=true --reset"

执行后会返回一个授权链接,格式类似:

https://login.tailscale.com/a/xxxxxxxxxxxx

你需要:

  1. 在 Windows 浏览器中打开这个链接
  2. 授权这台服务器加入你的 Tailnet

Note

这一步授权的是服务器,不是你的电脑或手机。


七、第四步:在 Windows 和安卓安装 Tailscale

这一步是手工操作。

Windows 11

  1. 安装 Tailscale 客户端
  2. 登录同一个账号
  3. 确认状态为已连接

Android

  1. 安装 Tailscale App
  2. 登录同一个账号
  3. 确认状态为已连接

完成后,你的三台设备应该都在同一个 Tailnet 里。


八、第五步:确认服务器已经加入 Tailnet

在 Windows PowerShell 中执行:

查看 Tailscale 状态:

ssh root@`局域网IP(已脱敏)` "tailscale status"

查看服务器的 Tailscale 地址:

ssh root@`局域网IP(已脱敏)` "tailscale ip -4 && tailscale ip -6 && hostname"

检查服务是否开机自启:

ssh root@`局域网IP(已脱敏)` "systemctl is-enabled tailscaled && systemctl is-active tailscaled"

你这次实际拿到的是:

  1. Tailscale IPv4:tailnet内网IP(已脱敏)
  2. Tailscale IPv6:fd7a:115c:a1e0::6234:7e56
  3. 主机名:jp-tvbox-3566

九、第六步:测试通过 Tailscale SSH 登录

现在你就可以不用局域网 IP,而改用 Tailscale 地址登录:

ssh root@`tailnet内网IP(已脱敏)`

如果 Tailnet 开了 MagicDNS,还可以直接:

ssh root@jp-tvbox-3566

这一步成功,说明远程访问链路已经打通。


十、第七步:检查 Docker 和端口环境

在部署 Vaultwarden 前先确认:

  1. Docker 是否存在
  2. Compose 是否存在
  3. 80/443 是否被占用
  4. 服务器上适合放数据的目录

你这次实际检查过这些命令:

ssh root@`局域网IP(已脱敏)` "docker --version || podman --version"
ssh root@`局域网IP(已脱敏)` "docker compose version || docker-compose --version || podman-compose --version"
ssh root@`局域网IP(已脱敏)` "ss -lntp | grep -E ':(80|443|8080) ' || true"
ssh root@`局域网IP(已脱敏)` "ls /opt && ls /srv || true"

你这次发现:

  1. 有 Docker
  2. 有 docker-compose
  3. 80/443 已经被现有 caddy 占用

所以采用了最稳妥的方案:

  1. 不动现有 caddy
  2. Vaultwarden 只监听本机 127.0.0.1:8080
  3. 用 Tailscale Serve 做 HTTPS 入口

十一、第八步:创建 Vaultwarden 数据目录

先在服务器上创建目录:

ssh root@`局域网IP(已脱敏)` "mkdir -p /opt/vaultwarden/data"

你也可以先确认目录是否存在:

ssh root@`局域网IP(已脱敏)` "ls /opt/vaultwarden || true"

十二、第九步:编写 docker-compose.yml

这次实际部署的核心配置如下。

文件路径:

/opt/vaultwarden/docker-compose.yml

内容如下:

version: '3.8'
services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: unless-stopped
    environment:
      WEBSOCKET_ENABLED: 'true'
      SIGNUPS_ALLOWED: 'false'
      DOMAIN: 'https://jp-tvbox-3566.taile8eadf.ts.net'
      ROCKET_PORT: '80'
    ports:
      - '127.0.0.1:8080:80'
    volumes:
      - /opt/vaultwarden/data:/data

各项含义如下:

  1. image:使用最新 Vaultwarden 镜像
  2. container_name:容器名为 vaultwarden
  3. restart:开机或异常后自动重启
  4. WEBSOCKET_ENABLED:开启 websocket 支持
  5. SIGNUPS_ALLOWED:是否允许用户注册
  6. DOMAIN:你的对外访问地址
  7. ROCKET_PORT:容器内部监听 80
  8. ports:把宿主机 127.0.0.1:8080 映射到容器 80
  9. volumes:把数据持久化到 /opt/vaultwarden/data

十三、第十步:启动 Vaultwarden

启动命令:

ssh root@`局域网IP(已脱敏)` "docker-compose -f /opt/vaultwarden/docker-compose.yml up -d"

查看容器状态:

ssh root@`局域网IP(已脱敏)` "docker ps --filter name=vaultwarden --format '{{.Names}} {{.Status}} {{.Ports}}'"

查看日志:

ssh root@`局域网IP(已脱敏)` "docker logs --tail 50 vaultwarden"

检查本机 HTTP 是否正常:

ssh root@`局域网IP(已脱敏)` "curl -I http://127.0.0.1:8080"

你这次实际看到的是:

  • 容器已运行
  • 本机 127.0.0.1:8080 返回 HTTP/1.1 200 OK
  • 日志里出现:
    • Starting Vaultwarden
    • Rocket has launched from http://0.0.0.0:80

这说明服务已启动成功。


十四、第十一步:启用 Tailscale Serve

由于你不想动现有 caddy,而且 80/443 已被占用,所以用 Tailscale 内置代理来发布 HTTPS。

先尝试执行:

ssh root@`局域网IP(已脱敏)` "tailscale serve --bg 8080"

第一次执行时,你这次遇到的提示是:

Serve is not enabled on your tailnet.
To enable, visit:
https://login.tailscale.com/f/serve?node=xxxxxxxx

这说明:

  1. 服务器没有问题
  2. Tailnet 还没允许这个节点使用 Serve
  3. 你需要打开这个链接,在浏览器里点击启用

启用后再次执行:

ssh root@`局域网IP(已脱敏)` "tailscale serve --bg 8080"
``
 
---
 
---
**相关**: [[00-索引-网络基建索引]] [[4.30 Cloudflare Tunnel 0基础手动安装教程]]