Docker Compose 是一个允许定义和配置多容器应用程序的工具。在我们的例子中,我们希望 Vaultwarden 服务器和代理将 WebSocket 请求重定向到正确的位置。

Caddy 与 HTTP 挑战

此示例假设您已安装 Docker Compose,您有一个用于 vaultwarden 实例的域名(例如,vaultwarden.example.com),并且它将是公开的。

首先创建一个新目录并更改为该目录。接下来,在下面创建 docker-compose.yml,确保为 DOMAINEMAIL 变量替换适当的值。

  1. version: '3'
  2. services:
  3. vaultwarden:
  4. image: vaultwarden/server:latest
  5. container_name: vaultwarden
  6. restart: always
  7. environment:
  8. - WEBSOCKET_ENABLED=true # 启用 WebSocket 通知。
  9. volumes:
  10. - ./vw-data:/data
  11. caddy:
  12. image: caddy:2
  13. container_name: caddy
  14. restart: always
  15. ports:
  16. - 80:80 # ACME HTTP-01 挑战需要
  17. - 443:443
  18. volumes:
  19. - ./Caddyfile:/etc/caddy/Caddyfile:ro
  20. - ./caddy-config:/config
  21. - ./caddy-data:/data
  22. environment:
  23. - DOMAIN=https://vaultwarden.example.com # 你的域名。
  24. - EMAIL=admin@example.com # 用于 ACME 注册的电子邮件地址。
  25. - LOG_FILE=/data/access.log

在同一目录中,创建下面的Caddyfile。 (这个文件不需要修改。)

  1. {$DOMAIN}:443 {
  2. log {
  3. level INFO
  4. output file {$LOG_FILE} {
  5. roll_size 10MB
  6. roll_keep 10
  7. }
  8. }
  9. # 使用 ACME HTTP-01 质询获取已配置域的证书。
  10. tls {$EMAIL}
  11. # 此设置可能与某些浏览器存在兼容性问题
  12. #(例如,在 Firefox 上下载附件)。尝试禁用此功能
  13. #如果你遇到问题。
  14. encode gzip
  15. # 通知重定向到 WebSocket 服务器
  16. reverse_proxy /notifications/hub vaultwarden:3012
  17. # 将其他所有内容代理给 Rocket
  18. reverse_proxy vaultwarden:80 {
  19. # Send the true remote IP to Rocket, so that vaultwarden can put this in the
  20. # log, so that fail2ban can ban the correct IP.
  21. header_up X-Real-IP {remote_host}
  22. }
  23. }

运行以下命令以创建和启动容器。这个 docker-compose.yml 文件中的服务的专用网络将自动创建,只有 Caddy 是公开的。

  1. docker-compose up -d

停止并销毁容器:

  1. docker-compose down

此处 提供了一个类似的基于 Caddy 的 Synology 示例。

球童与 DNS 挑战

此示例与上一个示例相同,但适用于您不希望您的实例可公开访问的情况(即,您只能从本地网络访问它)。此示例使用 Duck DNS 作为 DNS 提供程序。有关更多背景信息以及如何设置 Duck DNS 的详细信息,请参阅使用 Let’s Encrypt 证书运行私有 Vaultwarden 实例

首先创建一个新目录并更改为该目录。接下来,在下面创建 docker-compose.yml,确保为 DOMAINEMAIL 变量替换适当的值。

  1. version: '3'
  2. services:
  3. vaultwarden:
  4. image: vaultwarden/server:latest
  5. container_name: vaultwarden
  6. restart: always
  7. environment:
  8. - WEBSOCKET_ENABLED=true # Enable WebSocket notifications.
  9. volumes:
  10. - ./vw-data:/data
  11. caddy:
  12. image: caddy:2
  13. container_name: caddy
  14. restart: always
  15. ports:
  16. - 80:80
  17. - 443:443
  18. volumes:
  19. - ./caddy:/usr/bin/caddy # Your custom build of Caddy.
  20. - ./Caddyfile:/etc/caddy/Caddyfile:ro
  21. - ./caddy-config:/config
  22. - ./caddy-data:/data
  23. environment:
  24. - DOMAIN=https://vaultwarden.example.com # Your domain.
  25. - EMAIL=admin@example.com # The email address to use for ACME registration.
  26. - DUCKDNS_TOKEN=<token> # Your Duck DNS token.
  27. - LOG_FILE=/data/access.log

库存的 Caddy 构建(包括 Docker 镜像中的构建)不包含 DNS 挑战模块,因此接下来您需要获取自定义 Caddy 构建。将自定义构建重命名为 caddy 并将其移动到与 docker-compose.yml 相同的目录下。确保 caddy 文件是可执行的(例如,chmod a+x caddy)。上面的docker-compose.yml 文件将自定义构建绑定安装到caddy:2 容器中,替换了库存构建。

在同一目录中,创建下面的Caddyfile。 (这个文件不需要修改。)

  1. {$DOMAIN}:443 {
  2. log {
  3. level INFO
  4. output file {$LOG_FILE} {
  5. roll_size 10MB
  6. roll_keep 10
  7. }
  8. }
  9. # 使用 ACME DNS-01 质询获取已配置域的证书。
  10. tls {
  11. dns duckdns {$DUCKDNS_TOKEN}
  12. }
  13. # 此设置可能与某些浏览器存在兼容性问题
  14. #(例如,在 Firefox 上下载附件)。尝试禁用此功能
  15. #如果你遇到问题。
  16. encode gzip
  17. # 通知重定向到 WebSocket 服务器
  18. reverse_proxy /notifications/hub vaultwarden:3012
  19. # 将其他所有内容代理给 Rocket
  20. reverse_proxy vaultwarden:80
  21. }

与 HTTP 质询示例一样,运行

  1. docker-compose up -d

去创建和启动容器。