本系列本站链接:
本系列知乎链接:
其他
- 家里云网盘:就是 群晖/飞牛 自身,不做赘述
- CloudDrive2:融合多网盘用过的就知道了。
- Home Assistant: 不如米家。
家里云笔记 Obsidian
安装上 obsidian 之后,采用self-hosted livesync 进行同设备同步, 这个是教程
家里云密码本的横向对比及其安装
黑灰产领域,每天都有人在入侵计算机系统,盗取有价值信息 盗取账号 转卖。一个密码走天下的话,其密码早已经存在于 黑客的密码本中,用来进行暴力破解,之所以 很多人都保留着我简单密码也没人盗号的错觉,原因在于 有二步验证(手机验证码)等额外手段的保护和概率随机性的原因。
提高了密码复杂度,又实在不好管理如此多的账号。在金融方面,安全和方便快捷 永远是一对矛盾。在互联网安全方面也类似,只能在两者之间寻找平衡。而无论是玩 PT 、VPS,都需要特别注意个人隐私和安全。所以我觉得密码管理器是必不可少的。
主流密码管理器有:Bitwarden(免费/自托管/付费)、KeePass(免费) 和 1Password(付费),以下是横向对比。
核心定位与模式
| 特性 | Bitwarden | KeePass (及衍生品) | 1Password |
|---|---|---|---|
| 核心模式 | 云端同步 + 开源 | 本地存储 + 开源 | 云端同步 + 闭源商业 |
| 商业模式 | 免费版功能强大,付费版(或者自托管)进阶功能 | 完全免费(开源免费) | 订阅制,无永久授权 |
| 数据存储 | 加密后同步至官方云/自建云 | 加密数据库文件(.kdbx)完全本地,需手动同步 | 加密后同步至1Password官方云 |
1. 安全性与信任
- Bitwarden:
- 优势:完全开源,代码经过多次独立安全审计。采用零知识加密,服务器端无法解密你的数据。提供自托管选项(使用Vaultwarden),对技术控和注重隐私的用户是巨大加分项。
- 顾虑:信任其云端服务(尽管是加密的)。
- KeePass:
- 优势:极致安全与隐私。数据100%本地,不开源的安全软件更受隐私极客信赖。你可以完全控制数据库文件,甚至可以在气隙计算机上使用。
- 顾虑:安全性高度依赖用户习惯。如果数据库文件丢失、损坏或未加密备份,且没有同步,可能导致数据永久丢失。
- 1Password:
- 优势:闭源但拥有顶尖的安全团队和卓越的安全记录。设计上非常注重用户体验和安全的最佳平衡。提供独特的 “秘密密钥” 机制,与主密码共同解密,即使云端被攻破且主密码较弱,也极难破解。
- 顾虑:代码不公开,依赖对公司的信任。必须使用其云端服务。
2. 成本
- Bitwarden:个人免费版完全够用。付费版($10/年或者自托管)增加TOTP验证码生成器、紧急访问、健康报告等。
- KeePass:完全免费。所有平台客户端均由社区免费开发。
- 1Password:纯订阅制(个人约$2.99/月起,家庭约$4.99/月起)。提供14-30天免费试用。
3. 易用性与体验 - Bitwarden:界面简洁,功能直观。浏览器插件和移动端App体验良好,设置稍显技术化但不难。跨设备同步自动。
- KeePass:学习曲线最陡峭。官方客户端(Windows)界面老旧。需要自行解决同步问题(如通过Dropbox、Nextcloud、Syncthing等同步数据库文件)。需要自行选择并配置各平台的客户端(如KeePassXC, KeeWeb, Strongbox, KeePassDX等)。
- 1Password:公认用户体验最佳。界面精美,引导清晰,功能设计人性化(如“旅行模式”隐藏密码、详细的物品类型)。设置简单,开箱即用,同步无缝。
4. 平台与扩展支持 - Bitwarden:全平台覆盖(Win, Mac, Linux, iOS, Android)。浏览器插件支持所有主流浏览器。命令行工具强大。
- KeePass:核心在Windows。通过第三方客户端支持其他平台,但体验不一。浏览器集成通常需要配合插件(如KeePassXC-Browser)。
- 1Password:全平台原生应用,体验一致且优秀。浏览器插件集成度极高。对Apple生态(Watch, Safari)支持尤其好。
5. 高级功能 - Bitwarden:自托管、安全分享、TOTP(付费 或者自托管)、数据泄露监控(付费)、API访问。
- KeePass:插件生态丰富(可扩展密码生成、自动输入规则、连接WebDAV等),高度可定制。
- 1Password:家庭共享(最多5人,带权限管理)、旅行模式、物品回收站、家庭数字遗产规划(紧急工具箱)、与隐私服务(如Fastmail)的深度集成。
总结与选择建议
| 适合人群 | 推荐工具 | 关键理由 |
|---|---|---|
| 隐私极客/技术爱好者/预算有限者 | KeePass | 要完全控制、100%本地、免费。不嫌麻烦,享受DIY过程。 |
| 大多数普通用户/平衡派 | Bitwarden | 追求高性价比,既要强大免费或低价,又要开源可信和便捷的云端同步。 |
| 家庭用户/追求最佳体验/苹果生态用户 | 1Password | 愿意为顶级用户体验、无缝同步、出色的设计和家庭功能付费,信任其商业安全公司模式。 |
| 企业团队 | Bitwarden 或 1Password | 两者都有优秀的企业版。Bitwarden成本更低、可自托管;1Password体验更佳、服务更全面。 |
一句话概括:
- KeePass 是工具箱——完全自由,但所有事(尤其是同步)要自己动手。
- Bitwarden 是瑞士军刀——开源、灵活、性价比高,兼顾了安全与便利。
- 1Password 是精致家电——设计优美、体验流畅、开箱即用,但需要持续付费。
由于本文玩的是 自托管,那肯定就是 在 bitwarden 和 keepass 之间选择,bitwarden 体验比 keepass 要好。
密码管理器 vaultwarden 的两个版本
vaultwarden 是 bitwarden 的轻量实现版本,能够完全兼容官方的 app,并且所需资源更小,适合部署在 1c1g 的小 vps 上。vaultwarden 存储存储用户数据所使用的数据库 可以是 基于文件的 sqlite 或者 mysql .
简而言之,SQLite适合轻量级、低负载的使用场景,而MySQL/MariaDB适合需要扩展、高并发和高可用性的环境。
两者对比如下。
Vaultwarden使用SQLite和MySQL/MariaDB作为后端数据库时,主要区别体现在以下几个方面:
- 性能和可扩展性:
- SQLite:轻量级、适合小规模部署,性能瓶颈在高并发和大数据量下。
- MySQL/MariaDB:高性能,适合大规模部署,支持高并发和水平扩展。
- 维护与配置:
- SQLite:无需单独的数据库服务器,简单易用,但功能受限。
- MySQL/MariaDB:需要配置数据库服务器,支持复杂的管理和调优,适合团队或大型部署。
- 冗余与容错:
- SQLite:无内建冗余,单一数据库文件,易受损。
- MySQL/MariaDB:支持主从复制、集群等冗余配置,高可用性和故障恢复能力强。
- 事务处理:
- SQLite:适合低并发写入,高并发时性能受限。
- MySQL/MariaDB:强大的事务支持,能处理复杂事务和高并发写入。
- 使用场景:
- SQLite:个人用户、小规模应用,低并发、低数据量。
- MySQL/MariaDB:中大型团队或企业,需支持高负载和高可用性。
Vaultwarden sqlite 版本
在部署 docker 容器前,为了方便管理,一般都将 docker 容器的配置和产生的数据集中放置到同一个 目录。假设 我在群晖 部署,也就是首先在 /volume1/docker 创建一个 vaultwarden 目录,然后再 新建一个 docker-compose.yml 的文本文件,将如下内容粘贴进去,并修改一些注意事项提到的东西,改成自己的内容, 最后 在命令行执行 docker compose up -d。
部分解释说明:
environment中 的DOMAIN填写自己的域名volumes卷映射处,首先在 vaultwarden 目录下先创建一个 data 目录ports暴露端口选择包括到 本地或者 某个端口,再通过 Nginx 反向代理 加上 SSL 再暴露出来, http 直接访问是无法使用的。
第三点为什么要这么做?因为 本服务是一个密码管理器的服务,安全尤为重要。 程序启动以后,用户访问 vaultwarden 的http 协议的网络通讯是明文,会造成安全隐患,因此通过 http://ip:ports 的方式是无法访问的,一定得加上 ssl 反向代理加密通讯内容 才行。
整个网络通讯过程如下图:用户 其实是间接和 vaultwarden 通讯的,Nginx中间人充当一个加密和解密的角色,用户 和 Nginx 协商好一个加密方式和密钥,两者间所有的通讯内容都采用该方式加密。例如用户说 “查询一下 gmail 的账户密码是多少”, 浏览器加密一下 这句话,发到 Nginx, Nginx 再将其解密后发到 vaultwarden, vaultwarden于是就查询,接着对 Nginx 说 “你的 gmail 账户是 [email protected], 密码是 12345678”, Nginx 以协商好的方式和密钥 加密这段话,回复给用户,用户再解密得到 账户密码。
用户 和 Nginx 间的通讯是发生在公网的,受加密保护,而Nginx 和 vaultwarden 间的通讯发生在局域网内部,没有加密。
用户 --> Nginx() -> vaultwarden
|
|
\/
用户 <-- Nginx <-- vaultwarden
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
environment:
- DOMAIN=${VAULTWARDEN_DOMAIN:-https://vault.your.domain}
volumes:
- ./data/:/data/
ports:
- "127.0.0.1:8002:80"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:80/alive"]
interval: 30s
timeout: 10s
retries: 3
start_period: 30s
logging:
driver: "json-file"
options:
max-file: "3"
max-size: "10m"
VaultWarden mysql 版本
具体的部署过程同 sqlite 版本大同小异。
解释说明:
- mysql 版本的 vaultwarden 需要启动两个容器:mariadb 和 vaultwarden.
- 卷映射:首先在集中管理容器的根目录创建一个 vaultwarden 的目录,例如
vaultwarden-mysql, 接着在该目录下创建mariadb-data. environment环境变量:为了避免在 compose.yml 泄露密码,首先创建一个.env文本文件,如下所示,上面记录一些密码环境变量. 将ADMIN_TOKEN对应的值lQTQseoHLlwWfIiIvpzj930jMoosVLTD改成另外一个即可, 将MYSQL_PASSWORD对应的值password19700101另外一个密码,或者保持默认即可。ports端口映射: 端口映射 可以采用127.0.0.1:9000:9000或者"REVERSE_PROXY_SERVER_IP:9000:9000",只将端口开放给 特定 IP,例如 本地 或者 https 反向代理的服务器。
ADMIN_TOKEN=lQTQseoHLlwWfIiIvpzj930jMoosVLTD
MYSQL_ROOT_PASSWORD=password19700101
MYSQL_PASSWORD=password19700101
MYSQL_DATABASE=vaultwarden
MYSQL_USER=vaultwarden
DATABASE_URL=mysql://vaultwarden:password19700101@vaultwarden-db/vaultwarden
services:
vaultwarden-db:
image: mariadb
container_name: "vaultwarden-db"
restart: always
env_file:
- ".env"
volumes:
#- "vaultwarden-db_vol:/var/lib/mysql"
- "./mariadb-data:/var/lib/mysql:rw"
- "/etc/localtime:/etc/localtime:ro"
environment:
- "MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}"
- "MYSQL_PASSWORD=${MYSQL_PASSWORD}"
- "MYSQL_DATABASE=vaultwarden"
- "MYSQL_USER=vaultwarden"
healthcheck:
test: mariadb-admin ping -h 127.0.0.1 -u vaultwarden --password=${MYSQL_PASSWORD}
start_period: 5s
interval: 5s
timeout: 5s
retries: 55
vaultwarden:
image: "vaultwarden/server:latest"
container_name: "vaultwarden-mysql"
hostname: "vaultwarden-mysql"
depends_on:
vaultwarden-db:
condition: service_healthy
restart: always
env_file:
- ".env"
volumes:
#- "vaultwarden_vol:/data"
- "./vw-data:/data"
environment:
- WEBSOCKET_ENABLED=true
- DATABASE_URL=mysql://vaultwarden:${MYSQL_PASSWORD}@vaultwarden-db/vaultwarden
- ADMIN_TOKEN=${ADMIN_TOKEN}
- RUST_BACKTRACE=1
ports:
- "127.0.0.1:9000:9000"
#volumes:
# vaultwarden_vol:
# vaultwarden-db_vol:
反向代理服务Nginx的 部署
此处参考《将私服暴露到公网, 安全便利地回家及无缝网络服务》
由于 Nginx 配置更加复杂,本文采用更简单的 nginx proxy manager, 部署和配置都非常简单。
说明:
- 目录管理:同理为了便于集中管理, 在 容器统一管理根目录下创建 npm 目录,并建立
docker-compose.yml文件,粘贴如下内容 - 卷存储映射:在目录下面创建
letsencrypt和data, 用于存储 letsencrypt 证书和 npm 及nginx 等等的配置数据,例如npm/data/database.sqlite存储每个 nginx 反代的host的配置,npm 会根据这个数据中的内容自动生成在npm/data/nginx/proxy_host中给nginx真正读取到 host 配置。
services:
nginx-proxy-manager:
network_mode: "host"
container_name: npm
image: 'docker.io/jc21/nginx-proxy-manager:latest'
restart: unless-stopped
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
dns:
- 127.0.0.1
在部署好服务后,需要简单配置一下。
- 证书配置。证书配置可以采用自签名证书, 或者 证书机构颁发的证书。
- Proxy host 配置.
证书配置:选择 custon 则自己上传准备好的证书文件,如 certicate key 和 certificate file. 选择 letsencrypt 则需要填写 对应域名的托管服务器的 api key token 之类的信息来自动获取 3个月一次更新的免费证书。如下图展示的是使用 腾讯的 DNSpod 域名托管商时,填写对应的域名、邮箱、托管平台上账户的 id 等信息,当然事先需要将自己的域名托管到该平台上。
Proxy host 一般来讲,代理项目的添加比较简单,在如下图中 Details 和SSL 两栏中,填写好域名、http/https 协议、转发请求的目标机器的 IP 和对应端口,最够勾选一下 缓存静态资源 “cache assets”, 支持 websockets 协议 即可。接着填写 SSL 证书内容。选择自己的证书后,勾选 强制 SSL 即可。如无以外能正常通过域名访问了,但是有些情况 因为 跨域请求 等问题还不行,需要手动更多 nginx 的配置。本文的 vaultwarden 目前不需要继续配置。




