谷歌免费虚拟机零成本搭建 Vaultwarden 密码库 (Docker + Caddy)

之前在 claw cloud run 上利用免费的 5 刀额度搭建了一个 vaultwarden 自用,不过还是不太放心怕跑路,看了看 claw cloud run 的配置仅 0.2vcpu,128m 内存,还比不上谷歌大善人的免费 e2-micro 小鸡,于是花了 1 个小时搭了一个,自用的话基本是永久免费了。然后自己写了个简单的教程,用ai整理润色了下,方法大家参考。有问题的可以交流

GCP 永久免费 VPS 零成本搭建 Vaultwarden 密码库 (Docker + Caddy)

本指南面向有一定 Linux 和 Docker 基础的用户,旨在利用 Google Cloud Platform (GCP) 的永久免费资源,快速、低成本地搭建一个私有、安全的 Vaultwarden (Bitwarden 兼容) 密码库。

核心优势

  • :money_bag: 零成本运行: 充分利用 GCP 永久免费配额,服务器、磁盘、基础流量均免费。
  • :locked: 数据自控: 密码数据存储在自己的服务器上,隐私和安全完全掌握。
  • :rocket: 功能完善: 兼容 Bitwarden 客户端,支持全平台同步、自动填充、TOTP 等。
  • :gear: 自动化 HTTPS: 使用 Caddy 自动申请和续签 Let’s Encrypt 证书。

GCP 永久免费层关键资源

  1. 实例 (VM): e2-micro (0.25 vCPU, 1GB RAM),仅限美国部分区域 (us-west1, us-central1, us-east1 等)。选择正确区域是免费的关键。
  2. 磁盘: 30GB 标准永久性磁盘。必须选择“标准”类型。
  3. 流量: 每月 1GB 网络出站流量 (目的地非中国大陆/澳大利亚)。对于 Vaultwarden 个人使用通常足够。
  4. IP 地址: 可附加一个免费的静态外部 IP (只要实例运行)。
  5. 费用估算提示: 创建实例时显示的“每月估算费用”未计入免费层折扣。只要严格遵守免费配额限制,最终账单相关费用会被抵扣。

准备工作

  • Google 账号 + 绑定信用卡 (用于验证,不会因免费资源扣费)。
  • 一个域名 (强烈建议,用于 Caddy 自动 HTTPS)。
  • SSH 客户端。
  • 已在 GCP 控制台按免费层要求创建好一台 Debian 12 (或更新稳定版) 的 e2-micro 实例,并获取其外部 IP 地址。

搭建步骤

1. 系统初始化与 Docker 安装

通过 SSH 连接到你的 GCP 实例。

# 更新系统并安装基础工具
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl wget nano git

# 安装 Docker & Docker Compose (使用官方脚本)
curl -fsSL [https://get.docker.com](https://get.docker.com) -o get-docker.sh
sudo sh get-docker.sh
# 安装 Docker Compose Plugin (推荐)
sudo apt install -y docker-compose-plugin
# 或者安装旧版 Docker Compose v1 (如果需要)
# sudo apt install docker-compose

# (可选) 允许当前用户免 sudo 执行 docker 命令 (需重新登录或 newgrp docker 生效)
# sudo usermod -aG docker $USER
# newgrp docker

2. 创建项目目录与配置文件

# 创建并进入工作目录
mkdir ~/vaultwarden && cd ~/vaultwarden

# 创建 docker-compose.yml 文件
nano docker-compose.yml

粘贴以下内容到 docker-compose.yml

version: '3.8' # 建议指定较新版本

services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: always
    environment:
      # !!! 关键: 设置复杂的管理员后台令牌 (使用 openssl rand -base64 48 生成) !!!
      ADMIN_TOKEN: '在此粘贴你生成的复杂令牌'
      # 初始设置为 true 以便注册,注册后务必改为 false 并重启
      SIGNUPS_ALLOWED: 'true'
      WEBSOCKET_ENABLED: 'true' # 启用 WebSocket 实现实时同步
    volumes:
      - ./vw-data:/data

  caddy:
    image: caddy:latest
    container_name: caddy
    restart: always
    ports:
      - "80:80"          # HTTP
      - "443:443"        # HTTPS
      - "443:443/udp"    # HTTP/3
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile # 映射 Caddy 配置文件
      - ./caddy-data:/data             # 持久化证书等数据
      - ./caddy-config:/config         # 持久化配置状态
    depends_on:
      - vaultwarden

重要:

  • 使用 openssl rand -base64 48 命令生成一个强随机字符串,替换 ADMIN_TOKEN 的值。务必保管好此令牌。
  • SIGNUPS_ALLOWED 初始保持 true,完成个人账号注册后,必须修改为 false 并重启服务

保存并退出编辑器 (Ctrl+X, Y, Enter)。

3. 创建 Caddyfile

nano Caddyfile

粘贴以下内容,并将 your.domain.com 替换为你的域名,[email protected] 替换为你的邮箱:

# 将 your.domain.com 替换为你的真实域名
your.domain.com {
    # 反向代理到 Vaultwarden
    reverse_proxy vaultwarden:80 {
        header_up X-Real-IP {remote_ip}
    }

    # 为 WebSocket 配置反向代理
    reverse_proxy /notifications/hub vaultwarden:3012

    # 自动 HTTPS (使用 Let's Encrypt)
    # 将 [email protected] 替换为你的邮箱
    tls [email protected] {
        # (可选) 可以指定 ACME CA,默认是 Let's Encrypt
        # ca [https://acme-staging-v02.api.letsencrypt.org/directory](https://acme-staging-v02.api.letsencrypt.org/directory) # 测试用
    }

    # 推荐的安全 Headers
    header {
        # 启用 HSTS (Strict-Transport-Security),强制 HTTPS
        Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
        X-Content-Type-Options "nosniff"
        X-Frame-Options "SAMEORIGIN" # 或 DENY
        # Referrer-Policy "strict-origin-when-cross-origin"
        # Permissions-Policy "interest-cohort=()" # 示例
        # 移除 Server 头减少信息泄露
        -Server
    }

    # 启用压缩
    encode gzip zstd
}

保存并退出。

4. 配置 GCP 防火墙

  • 在 GCP 控制台 → VPC 网络 → 防火墙,创建一条新的防火墙规则。
  • 目标: 应用到你的 Vaultwarden VM 实例 (建议使用目标标记 Target tag)。
  • 方向: 入站 (Ingress)。
  • 操作: 允许 (Allow)。
  • 来源 IP: 0.0.0.0/0
  • 协议和端口: 允许 TCP 端口 80443
  • 确保该规则已应用到你的 VM 实例上。

5. 配置 DNS

  • 在你的域名注册商或 DNS 服务商处,为你的域名 (e.g., vaultwarden.your.domain.com) 添加一条 A 记录。
  • 将记录值指向你的 GCP VM 实例的 外部 IP 地址
  • 等待 DNS 记录生效 (几分钟到几小时不等,可通过 ping 或在线 DNS checker 验证)。

6. 启动服务

~/vaultwarden 目录下执行:

# 首次启动会下载镜像,并由 Caddy 自动申请证书
sudo docker compose up -d

# 检查容器运行状态 (应均为 Up/Running/Healthy)
sudo docker compose ps

# 查看 Caddy 日志确认证书申请成功 (特别重要)
sudo docker compose logs -f caddy
# (按 Ctrl+C 退出日志查看)

7. 访问与安全设置

  • 通过浏览器访问 https://your.domain.com
  • 点击 “创建账户”,注册你的管理员账号,设置强主密码。
  • 关键安全步骤:禁用后续注册
# 停止服务
sudo docker compose down
# 编辑配置文件
nano docker-compose.yml
# 将 SIGNUPS_ALLOWED 的值从 'true' 修改为 'false'
# 保存退出 (Ctrl+X, Y, Enter)
# 重新启动服务
sudo docker compose up -d
  • (可选) 访问 https://your.domain.com/admin,使用之前设置的 ADMIN_TOKEN 登录后台管理界面。

8. 数据备份 (重要!) :floppy_disk:

  • 定期备份 ~/vaultwarden 目录,尤其是 ./vw-data 子目录。
  • 必须将备份存储在 异地 (如 GCP Cloud Storage, 其他云存储, NAS, 本地电脑)。
  • 推荐使用 cron 定时任务配合脚本 (如使用 tar 压缩 + gsutilrclone 上传) 自动化备份。
  • 根据密码更新频率,建议每日或每周备份。

9. 客户端配置

  • 下载 Bitwarden 官方客户端 (浏览器扩展、桌面、移动 App)。
  • 在客户端登录界面的设置 (通常是齿轮图标 :gear: 或登录选项) 中,找到 自托管环境 (Self-hosted Environment)服务器 URL (Server URL) 选项。
  • 填入你的 Vaultwarden 完整 URL: https://your.domain.com
  • 保存
81 个赞

佬友NB!
顺便,佬友好多md格式没了(

2 个赞

md格式为啥会失效啊?咋调整呢

1 个赞

GCP不知道我开了没有

1 个赞

站内有个佬友公开了自己的web给佬友用

1 个赞

佬,这样就会失效:
** 完成!** ** 完成!**
这样就有效
**完成!** 完成!
L站好像不能渲染**后面的带空格的

1 个赞

我选择nas

1 个赞

我立刻前来学习

1 个赞

好的,我来调整下,感谢

1 个赞

我原来也是在nas上搭了,在v2ex上看到个帖子有人被运营商扫到了端口开web服务,宽带被封了,才想着在vps上搭一个。其实也是杞人忧天了,我ddns自用了好几年其实也没屁事

2 个赞

这玩意我觉得宁愿买台服务器,或者家用服务器,也不能用免费的,一但出问题哭都没地方,还有得可以利用各种免费的存储桶备份

1 个赞

大佬有空了研究一下1Panel搭建,搞了两天了一直无法登录。

2 个赞

每月200GB吧

2 个赞

直接用CF tunnel

1 个赞

备份做好没啥问题,bitwarden客户端里面也能直接导出密码库,谷歌大善人还是相对靠的住,不过这免费小鸡的性能和流量也就够干这个了。

1 个赞

你是在哪里搭1panel啊

1 个赞

大佬经常刷 L 站啊

1 个赞

流量吗?没那么多,就1GB,对于vaultwarden自用来说足够了

1 个赞

每月 1GB 网络出站流量 (目的地非中国大陆/澳大利亚)。
从国内访问是不是不在免费流量额度内会触发账单费用。

1 个赞

流量标准层级有200GB了,1GB 应该是高速的

1 个赞