对话笔记直发:4.27 Bitwarden + Vaultwarden+ Tailscale。分类:网络基建。
Bitwarden+ Vaultwarden ( Tailscale )从零部署手册
下面是一份面向 0 基础用户的完整手册,目标是从零开始在你的本地 Armbian/Debian ARM64 服务器上手动部署:
SSH远程管理Tailscale远程访问Vaultwarden密码管理服务Tailscale Serve内网 HTTPS 访问- 首次注册与关闭开放注册
- 常用维护命令
这份手册基于你这次实际部署过程整理,尽量保留了当时用到的命令和思路,并补充了更适合手动操作的说明。
一、你的环境假设
本手册适用于以下环境:
- 服务器系统:
Armbian 23.11 / Debian 12 bookworm / ARM64 - 服务器局域网地址:
局域网IP(已脱敏) - 本地电脑:
Windows 11 - 手机:
Android - 家庭网络:只有公网
IPv6,没有公网IPv4 - 你的目标:
- 用
Bitwarden客户端管理密码 - 服务端自建
Vaultwarden - 优先通过
Tailscale安全访问 - 暂时不折腾公网暴露
- 用
二、这次部署的最终结构
部署完成后,整体结构如下:
- 服务器上安装
Tailscale - 电脑和安卓手机也安装
Tailscale - 三台设备登录同一个 Tailscale 账号
- 服务器上运行
VaultwardenDocker 容器 Vaultwarden只监听本机127.0.0.1:8080- 用
Tailscale Serve把它发布成 Tailnet 内 HTTPS 服务 - 在 Bitwarden 客户端中填写自托管地址:
https://你的服务器名.你的tailnet.ts.net
这次你的实际地址是:
https://jp-tvbox-3566.taile8eadf.ts.net三、部署前准备
你需要准备:
- 一台可 SSH 登录的服务器
- 服务器
root权限 - Windows 电脑可连接局域网
- 一个 Tailscale 账号
- 服务器可以联网下载软件
- 服务器已安装 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"这个命令会:
- 自动识别你的系统是 Debian bookworm
- 添加 Tailscale 官方软件源
- 安装
tailscale包 - 启用
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你需要:
- 在 Windows 浏览器中打开这个链接
- 授权这台服务器加入你的 Tailnet
Note
这一步授权的是服务器,不是你的电脑或手机。
七、第四步:在 Windows 和安卓安装 Tailscale
这一步是手工操作。
Windows 11
- 安装 Tailscale 客户端
- 登录同一个账号
- 确认状态为已连接
Android
- 安装 Tailscale App
- 登录同一个账号
- 确认状态为已连接
完成后,你的三台设备应该都在同一个 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"你这次实际拿到的是:
- Tailscale IPv4:
tailnet内网IP(已脱敏) - Tailscale IPv6:
fd7a:115c:a1e0::6234:7e56 - 主机名:
jp-tvbox-3566
九、第六步:测试通过 Tailscale SSH 登录
现在你就可以不用局域网 IP,而改用 Tailscale 地址登录:
ssh root@`tailnet内网IP(已脱敏)`如果 Tailnet 开了 MagicDNS,还可以直接:
ssh root@jp-tvbox-3566这一步成功,说明远程访问链路已经打通。
十、第七步:检查 Docker 和端口环境
在部署 Vaultwarden 前先确认:
- Docker 是否存在
- Compose 是否存在
80/443是否被占用- 服务器上适合放数据的目录
你这次实际检查过这些命令:
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"你这次发现:
- 有
Docker - 有
docker-compose 80/443已经被现有caddy占用
所以采用了最稳妥的方案:
- 不动现有
caddy Vaultwarden只监听本机127.0.0.1:8080- 用
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各项含义如下:
image:使用最新 Vaultwarden 镜像container_name:容器名为vaultwardenrestart:开机或异常后自动重启WEBSOCKET_ENABLED:开启 websocket 支持SIGNUPS_ALLOWED:是否允许用户注册DOMAIN:你的对外访问地址ROCKET_PORT:容器内部监听80ports:把宿主机127.0.0.1:8080映射到容器80volumes:把数据持久化到/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 VaultwardenRocket 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这说明:
- 服务器没有问题
- Tailnet 还没允许这个节点使用
Serve - 你需要打开这个链接,在浏览器里点击启用
启用后再次执行:
ssh root@`局域网IP(已脱敏)` "tailscale serve --bg 8080"
``
---
---
**相关**: [[00-索引-网络基建索引]] [[4.30 Cloudflare Tunnel 0基础手动安装教程]]