前言
密码管理这类工具和普通自建应用不太一样:一旦真正用起来,里面放的不是影视库、照片或测试数据,而是账号、登录凭据和个人服务入口。也正因为如此,很多人更愿意把密码库放在自己的NAS里,先把存储位置和访问方式掌握在自己手中,再决定是否需要异地访问。
这次我在飞牛OS上部署Password-XL,从创建Docker目录开始,准备前后端服务目录和用户配置文件,再通过Docker Compose启动Web端和后端服务,分别使用8080和8081两个端口。
本地访问跑通以后,再实际登录私有服务、设置主密码并新增一条密码记录,确认这套密码库已经能够正常使用。
最后才处理外部访问:在飞牛NAS上安装cpolar,把8080 Web页面提供给外部设备,并继续配置固定二级子域名。整篇重点放在“NAS部署—本地验证—密码库使用—远程入口”这条链上,同时把密码、主密码、Webhook式公网入口这类高敏感信息的使用边界说清楚。
这类应用真正值得花时间的地方,不是“容器能不能启动”,而是整条使用链是否顺畅:Web端能不能打开、后端服务能不能连接、主密码能不能正常工作、密码记录能不能保存,以及离开局域网以后是否还要保留一个长期可用的访问入口。把这些环节依次跑通,比单独强调“自托管更安全”更有实际意义。
1 Password-XL适合什么场景
Password-XL是一套可以自己部署的Web密码管理工具。
这类方案最直接的价值是:
- 服务运行在自己的NAS或服务器上;
- 密码库不需要依赖单独购买一台新设备;
- 可以通过浏览器访问;
- 可以自己决定是否开放远程入口;
- 适合个人或小范围家庭使用。
它和普通自建应用最大的区别在于:
保存的是高敏感凭据。
所以部署时不能只看“页面能不能打开”,还要同时关注:
- 用户配置;
- 主密码;
- 服务地址;
- NAS本身;
- 外部访问入口。
2 这篇实际要跑通的完整链路
整个过程分成四段:
第一段:
飞牛OS → Docker目录
第二段:
Password-XL Web + Service → 8080 / 8081
第三段:
登录 → 主密码 → 新增密码
第四段:
外部浏览器 → 固定公网地址 → Password-XL Web
先本地跑通,再考虑远程,比一开始就把密码库暴露出去更稳妥。
3 在飞牛OS创建Docker目录
先打开文件管理,创建一个用于保存Docker应用的目录:
进入详细信息:
复制目录的原始路径:
后面的终端命令需要使用这个实际路径。
4 开启飞牛OS的SSH
进入:
系统设置 → SSH → SSH功能
启用:
然后通过终端SSH连接NAS,并切换到root环境。
进入刚才复制的目录:
# 将 /vol1/1000/docker 换成你实际的文件夹路径cd/vol1/1000/docker这里:
/vol1/1000/docker
只是这次环境里的实际路径。
使用时按自己的飞牛目录替换。
5 创建Password-XL项目目录
执行:
mkdirpassword-xl&&cdpassword-xl然后创建后端数据目录:
mkdir-ppassword-xl-service/password-xl-data继续进入后端服务目录:
cdpassword-xl-service完成以后,整个项目会有比较清晰的目录结构。
6 创建用户列表配置
编辑:
vipassword-xl.toml按照需要写入用户:
[[user]]username="u1"password="123456"[[user]]username="u2"password="123455"这里的:
u1 / u2
以及示例密码,都是这次配置内容。
真正长期使用时,账号和密码应该按自己的实际用户规划,不要把示例凭据直接当成长期密码。
7 返回项目根目录
执行:
cd..下一步开始创建Docker Compose文件。
8 编写docker-compose.yml
创建文件:
vidocker-compose.yml写入:
services: password-xl-web: image: huangypeng/password-xl-web container_name: password-xl-web restart: unless-stopped ports: -"8080:80"# 左侧的8080前端端口可自由修改password-xl-service: image: huangypeng/password-xl-service container_name: password-xl-service restart: unless-stopped ports: -"8081:8080"# 左侧的8081后端端口可自由修改volumes: - ./password-xl-service:/password-xl-service这套Compose里有两个服务。
前端:
password-xl-web
端口:
8080:80
后端:
password-xl-service
端口:
8081:8080
同时把:
./password-xl-service
挂载到容器里的:
/password-xl-service
9 启动Password-XL容器
执行:
dockercompose up-d然后查看实时日志:
dockercompose logs-f如果两个容器都正常运行,就可以进入浏览器验证。
10 先验证本地8080页面
浏览器访问:
http://飞牛IP:8080
这次示例:
http://192.168.42.147:8080
页面:
能够正常打开以后,可以确认:
浏览器 → 飞牛8080 → Password-XL Web
已经跑通。
11 Web页面和后端服务是两层
这里不要把8080和8081混在一起。
8080:
Web前端
8081:
Password-XL后端服务
进入Password-XL以后,还需要把前端连接到自己的后端服务。
12 登录私有服务
点击私有服务并登录。
服务地址示例:
http://192.168.88.130:8081
用户名和密码使用前面:
password-xl.toml
里配置的内容。
这一步完成以后,Web前端才真正接到自己的Password-XL后端。
13 保存初始化提示信息
登录以后,页面会出现相应提示:
这类信息建议妥善保存。
密码管理工具一旦涉及恢复、迁移或重新登录,初始化阶段给出的信息往往比普通Web应用更重要。
14 再设置主密码
继续设置主密码:
这里可以选择:
- 标准密码;
- 手势密码。
主密码和前面的服务用户密码不是一回事。
前面的用户凭据负责连接私有服务。
主密码则用于进入密码库。
15 登录密码库
设置完成以后进入:
现在Password-XL已经不只是“页面打开”,而是:
- 后端连接完成;
- 用户认证完成;
- 主密码完成;
- 密码库可以进入。
16 离开页面后会再次要求主密码
页面切换后重新回来:
会再次要求输入主密码。
对密码管理工具来说,这类重新验证机制比普通后台更有意义。
因为即使浏览器页面一度处于登录状态,也不能默认任何拿到设备的人都应该直接看到密码库。
17 查看设置项
进入设置:
可以继续按自己的使用习惯调整相关选项。
这类设置建议在真正录入大量账号前先看一遍。
18 新增一条密码记录
点击添加密码:
保存以后:
能够看到新记录,说明这次最核心的功能已经验证:
密码数据可以录入并在自己的Password-XL实例里查看。
到这里,本地阶段已经完成。
19 先明确一个边界:本地部署和远程访问是两件事
如果只在家庭局域网或公司内网里使用Password-XL,到这里已经够了。
此时服务只需要在内网访问。
如果确实有:
- 出门查密码;
- 其他设备访问;
- 异地使用;
才需要继续给8080增加外部入口。
所以“自托管”不等于一定要公网开放。
20 密码库一旦远程访问,入口要比普通Web应用更谨慎
Password-XL保存的是账号凭据。
因此外部访问前至少要明确:
- 不共享主密码;
- 不共享服务账号;
- 不使用过于简单的用户密码;
- 不把固定访问地址公开;
- NAS系统本身也要保持账号隔离;
- 只给真正需要的设备和用户使用。
cpolar负责网络入口。
Password-XL仍然负责实际的密码库和登录逻辑。
21 在飞牛NAS上安装cpolar
先确认SSH已经开启:
通过SSH进入飞牛NAS:
执行安装命令:
sudocurlhttps://get.cpolar.sh|sh安装完成后查看服务:
sudosystemctl status cpolar22 进入cpolar管理页面
通过飞牛主机IP加9200端口进入管理界面:
后面的随机地址和固定地址都从这里配置。
23 给Password-XL的8080创建HTTP隧道
创建隧道时填写:
- 隧道名称:
password - 协议:HTTP
- 本地地址:
8080 - 域名类型:随机域名
- 地区:
China Top
这里映射的是:
Password-XL Web前端8080。
24 先用随机公网地址测试
创建以后进入在线隧道列表:
然后从外部浏览器访问:
页面能够正常打开以后,可以确认:
外部浏览器 → 公网地址 → 飞牛8080 → Password-XL
已经打通。
25 公网页面能打开只是网络验证
对密码管理工具来说,这一步不能只理解成:
“远程访问成功。”
更准确的是:
外部网络已经能够到达登录页面。
真正能不能进入密码库,仍然需要:
- 私有服务用户;
- 对应密码;
- 主密码。
网络入口和密码库认证是两层。
26 随机地址适合先验证
如果只是测试,随机地址已经足够。
但长期使用Password-XL时,每次重新找地址会比较麻烦。
所以后面继续配置固定二级子域名。
27 保留固定二级子域名
进入预留页面:
这次示例使用:
password
实际名称按自己的账号和可用域名设置。
28 把原来的password隧道改成固定地址
进入隧道列表:
编辑对应隧道。
修改:
- 域名类型:二级子域名;
- Sub Domain:填写已保留名称;
- 地区:
China Top。
更新:
29 查看固定地址是否生效
回到在线隧道列表:
可以看到原来的随机地址已经切换成固定二级子域名。
30 最后再从外部设备访问一次
使用固定地址:
页面能够正常打开以后,固定入口也已经跑通。
到这里,整套链路变成:
外部设备 → 固定地址 → Password-XL Web → 私有服务 → 主密码 → 密码库。
31 这套方案真正重要的是“自己掌握运行位置”
自托管最大的实际变化是:
Password-XL运行在自己的飞牛NAS上。
服务、Docker目录、配置文件和数据都由自己维护。
但这不代表只要“放在自己NAS”就自动等于绝对安全。
真正长期使用时,仍然取决于:
- NAS账号;
- Docker配置;
- Password-XL用户;
- 主密码;
- 外部访问入口;
- 自己的维护习惯。
所以更准确的理解是:
运行和存储位置自己可控,但安全仍然需要自己维护。
32 这篇最终跑通的完整链路
部署:
飞牛OS → Docker Compose → Password-XL
端口:
8080 Web + 8081 Service
使用:
服务登录 → 主密码 → 新增密码
远程:
外部浏览器 → 公网地址 → 8080 → Password-XL
固定入口:
固定二级子域名 → Password-XL Web
实际完成:
- Docker目录;
- Password-XL项目目录;
- 用户配置;
- Compose;
- 前后端容器;
- 本地访问;
- 私有服务登录;
- 主密码;
- 新增密码;
- cpolar;
- 随机公网地址;
- 固定二级子域名。
这样整套自托管密码库就从“部署起来”继续走到了“本地可用、外部可访问”。
总结
这次真正跑通的是一套完整的Password-XL自托管链路:飞牛OS负责承载Docker,8080提供Web页面,8081提供后端私有服务,再通过用户配置和主密码进入自己的密码库。
从登录私有服务到设置主密码,再到新增一条密码记录,说明这套环境已经不仅是容器启动成功,而是完成了最基本的实际使用验证。
远程部分则应该放在本地功能之后。只有确实需要异地使用时,再给8080配置外部入口;而固定地址解决的是访问稳定,不会替代Password-XL本身的用户认证和主密码保护。
密码管理工具和普通自建页面最大的不同,就是数据价值更高。服务放在自己的NAS上以后,运行位置更可控,但账号、主密码、NAS权限和远程入口仍然需要长期维护,这几层缺一不可。