在 Ubuntu 20.04 上的 Dokku 中运行 Postgres 时使用 SSL 加密

介绍

独库 是一种流行的容器管理器,可在单个实例中运行多个 Heroku 构建包或 Docker 容器。 这种架构有很多好处,比如在同一主机下运行的不同服务之间的隔离。 在 Dokku 下运行 PostgreSQL 可以轻松升级 PostgreSQL 并与同一实例中的其他容器共享。

本指南解释了怎样使用免费的 Let’s Encrypt SSL 证书来保护在 Ubuntu 20.04 上的 Dokku 下运行的 PostgreSQL 服务器。

先决条件

使用 Vultr DNS 托管您的域。 创建一个指向您服务器 IP 地址的“A”记录。 使用 Lego 创建通配符证书。 以非 root sudo 用户身份连接到您的服务器。

1.安装Dokku

安装 最新版本的独库 在您的服务器上。

$ wget https://raw.githubusercontent.com/dokku/dokku/v0.25.4/bootstrap.sh
$ sudo DOKKU_TAG=v0.25.4 bash bootstrap.sh

为 Dokku 实例设置全局域。 代替 example.com 用你的域名。

$ dokku domains:set-global example.com

2.安装Dokku PostgreSQL扩展

安装 Dokku PostgreSQL 扩展.

$ sudo dokku plugin:install https://github.com/dokku/dokku-postgres.git postgres

创建一个 数据库 使用您首选的 PostgreSQL 版本在您的实例上提供服务。 例如,PostgreSQL 13.4。

$ dokku postgres:create pgdb --image postgres --image-version 13.4

改变 邮局 用户密码。

$ dokku postgres:connect pgdb

pgdb=# ALTER USER postgres PASSWORD 'your-new-password';
pgdb=# q

公开 PostgreSQL 端口以允许容器外的连接。

$ dokku postgres:expose pgdb 5432

3.复制SSL证书到PostgreSQL

创建计划任务,将 Let’s Encrypt SSL 证书复制到 PostgreSQL 数据目录。

找到 PostgreSQL 数据目录。

$ dokku postgres:info pgdb | grep "Data dir:"

默认数据目录是 /var/lib/dokku/services/postgres/pgdb/data.

4. 创建一个更新钩子

切换到root用户。

$ sudo su

创建续订挂钩脚本。

# nano /usr/local/sbin/renew-cert-hook.sh

粘贴以下脚本。 改变 example.com 到您的域。

#!/bin/bash

umask 0177
DOMAIN=example.com
SERVICE=pgdb
CERT_DIR=/etc/letsencrypt/$DOMAIN/certificates
DATA_DIR=/var/lib/dokku/services/postgres/$SERVICE/data
cp $CERT_DIR/_.$DOMAIN.crt $DATA_DIR/server.crt
cp $CERT_DIR/_.$DOMAIN.key $DATA_DIR/server.key
chmod 600 $DATA_DIR/server.crt $DATA_DIR/server.key

编辑文件 /usr/local/sbin/renew-cert.sh 您在遵循先决条件中的“使用 Lego 安装通配符 SSL”说明时创建的,并添加 --run-hook 标志,指向您在上面创建的文件。

编辑后,您的文件将如下所示:

#!/bin/sh

export VULTR_API_KEY=xxxx_EXAMPLE_API_KEY_xxxx

export VULTR_HTTP_TIMEOUT=60
export VULTR_POLLING_INTERVAL=60
export VULTR_PROPAGATION_TIMEOUT=300
export VULTR_TTL=300

lego --dns vultr 
    --domains *.example.com 
    --domains example.com 
    --email [email protected] 
    --path="/etc/letsencrypt/example.com" 
    --run-hook="/usr/local/sbin/renew-cert-hook.sh" 
    --accept-tos renew

测试脚本。

# bash /usr/local/sbin/renew-cert.sh

重启 PostgreSQL 实例。

# postgres:restart pgdb

退出 root 用户帐户。

# exit

5. 测试连接

从安装了 PostgreSQL 客户端的另一台计算机连接到数据库。 代替 example.com 使用您服务器的域名。

$ psql -d "dbname=postgres sslmode=require" -h example.com -U postgres

您应该会看到 PostgreSQL 提示。

Password for user postgres:
psql (12.8 (Ubuntu 12.8-0ubuntu0.20.04.1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
postgres=#

类型 Q 退出 PostgreSQL 客户端。

postgres=# q

注:本教程在Vultr VPS上测试通过,如需部署请前往Vultr.com

相关阅读:

Posted in: LinuxTags: