惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Jina AI
Jina AI
Recent Announcements
Recent Announcements
Attack and Defense Labs
Attack and Defense Labs
P
Proofpoint News Feed
WordPress大学
WordPress大学
雷峰网
雷峰网
Apple Machine Learning Research
Apple Machine Learning Research
博客园 - 叶小钗
I
Intezer
Hugging Face - Blog
Hugging Face - Blog
博客园 - 司徒正美
月光博客
月光博客
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
T
Threat Research - Cisco Blogs
有赞技术团队
有赞技术团队
T
Tailwind CSS Blog
S
Securelist
Cyberwarzone
Cyberwarzone
云风的 BLOG
云风的 BLOG
V
Visual Studio Blog
Stack Overflow Blog
Stack Overflow Blog
T
Tor Project blog
Project Zero
Project Zero
腾讯CDC
Recorded Future
Recorded Future
Help Net Security
Help Net Security
Spread Privacy
Spread Privacy
T
The Blog of Author Tim Ferriss
阮一峰的网络日志
阮一峰的网络日志
The Register - Security
The Register - Security
Google DeepMind News
Google DeepMind News
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
L
Lohrmann on Cybersecurity
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Security Latest
Security Latest
Cisco Talos Blog
Cisco Talos Blog
A
Arctic Wolf
N
News and Events Feed by Topic
D
DataBreaches.Net
V
Vulnerabilities – Threatpost
L
LangChain Blog
博客园 - 【当耐特】
V2EX - 技术
V2EX - 技术
Simon Willison's Weblog
Simon Willison's Weblog
Engineering at Meta
Engineering at Meta
The Last Watchdog
The Last Watchdog
Security Archives - TechRepublic
Security Archives - TechRepublic
D
Docker
C
CXSECURITY Database RSS Feed - CXSecurity.com
人人都是产品经理
人人都是产品经理

See you soon

哟,好久不见,无线打印 | See you soon 试试将文章版本化管理吧 | See you soon 大他者,那个无时无刻都在盯着你的东西 | See you soon Laws of Software Engineering,软件工程定律 | See you soon 浅记多因素身份认证 | See you soon Linux 内核中的度量单位 | See you soon 重置 GPG 智能密钥 | See you soon 向 NAS 引入 samba | See you soon 无法重复键入的 Fcitx5 | See you soon ZFS 降级事故 | See you soon 记被 XanMod Kernel 和 AppArmor 联合坑的一次踩坑 | See you soon agent 的 skill 与 toolcall | See you soon 记一次服务器被挂恶意挖矿二进制 | See you soon 活着的 Arc | See you soon 令 acme.sh 使用 Cloudflare 的 DNS API 签发与续签证书 | See you soon 于 Tokio 中卸载 CPU Bound 任务 | See you soon 如我所见,梦破碎的时候 | See you soon 74LS 家族手册 | See you soon JDK Projects 备忘录 | See you soon 关于历史 | See you soon 用 curl 下载 OnePlus 的 ROM | See you soon 实用命令切片 | See you soon 再见,Oh My Zsh。 | See you soon 你不应该复用 strings.Builder | See you soon 博客的明日 | See you soon 被 AppArmor 击杀的 Dockge | See you soon AI 时代的自我 | See you soon 支持删除的布隆过滤器 | See you soon 基于栈的虚拟机与基于寄存器的虚拟机 | See you soon RVA23 包含了什么 | See you soon Rust 的边界检查是否已经有很大的进步 | See you soon 使用 Rust 编写操作系统:Barebones | See you soon 使用 Rust 编写操作系统:引言 | See you soon 编译器笔记:rope | See you soon 编译器笔记:CST | See you soon Paradoxical 札记 | See you soon 简单的相似去重算法(基于向量) | See you soon 更加现代的 PaperMC Minecraft 插件设计指南 | See you soon 简单的 CFG 语法分析方法 | See you soon 简单地使用 Caddy 实现 CORS 配置 | See you soon 让 OpenCV 可以被静态链接 | See you soon 图片搜索笔笺 | See you soon 电路板设计笔记-保护 | See you soon 使用 Rust 实现 SnowflakeId | See you soon 农夫乐事 FaQ 启示 | See you soon 使用 Rust 实现拓展系统札记 | See you soon 遗传学定律的代码实现 | See you soon EN:The Journey of Rust and Procps | See you soon ZH:Rust 与 Procps 之旅 | See you soon 使用 debootstrap 与 schroot 构建一个纯净环境 | See you soon GPG添加新的用户信息 | See you soon GSoC2024 笔记:使用 Rust 重新实现 procps | See you soon JWT 小册 | See you soon 使用密钥登录 SSH | See you soon Guava:Cache | See you soon 编译器笔记:增量编译 | See you soon Gradle秘境:添加一个类似modCompileOnly的依赖块 | See you soon Minecraft:原始经济系统设计简述 | See you soon TinyRemapper笔记 | See you soon MicroOS:进阶 | See you soon MicroOS:起步 | See you soon Swapfile 指北 | See you soon GPG 物理密钥的安装与密钥的迁移 | See you soon 用GPG签名告诉大家这就是我的提交 | See you soon DFS:深度优先搜索 | See you soon 文章翻译:从init.vim到init.lua | See you soon 目录遍历攻击 | See you soon 如何挂载.img文件,以及如何使用QEMU模拟arm64环境 | See you soon 在树莓派上编译 OpenCV | See you soon 关于卸载BlueStacks后遇到的问题 | See you soon
使用 Quadlet 将 Podman 中的 Postgres 当作 systemd 服务运行 | See you soon
Krysztal Huang · 2026-06-05 · via See you soon

这段时间在准备部署项目的数据库,但考虑到项目中包含多个服务,如果每个服务都使用其对应的 Postgres 数据库,那么会导致备份非常麻烦。

考量

在最开始我打算基于 Debian 官方的 Postgres Packaging Flavor 对我需要的拓展进行打包,但是发现 Debian Trixie 的 Postgres 是 Postgres17,而项目里的服务均使用 Postgres18 并且利用了相当一部分 UUIDv7 的特性。

于是在如下考量下决定使用容器化的方式来运行,Podman 支持使用 Quadlet 的方式将容器服务化,这样我们就可以不用维护我们自己的拓展打包了,并且可以直接使用 Postgres18:

  • 需要 pgvector 拓展实现向量搜索
  • 需要 pgmq 拓展实现消息队列
  • 需要 partman 拓展实现自动分区

其中 pgmq 并不存在于 Debian 的 Postgres Packaging 中,因此还是决定随着容器化比较好

Quadlet? Quadlet!

在不久前我在使用 Docker 容器有遇到容器被入侵的事件,对此心有余悸,因此还是打算使用 Podman 这样的 rootless 容器化工具。

根据 Podman Quadlet 的文档,Quadlet 取代了先前的 podman generate systemd 命令,因此我们直接看 Quadlet 的用法即可

Quadlet 搜索目录

我们主要使用 rootless 用法,其搜索路径为

  • $XDG_RUNTIME_DIR/containers/systemd/
  • $XDG_CONFIG_HOME/containers/systemd/~/.config/containers/systemd/
  • /etc/containers/systemd/users/${UID}
  • /etc/containers/systemd/users/
  • /usr/share/containers/systemd/users/${UID}
  • /usr/share/containers/systemd/users/

根据我的癖好,我选择在 ~/.config/containers/systemd/ 中编写

Quadlet 写法

Quadlet 的工作原理是将 .container 文件翻译为 .service 文件,使用的文法倒是和 .service 文件非常相似。我来举个简单的例子:

[Unit]

Description=PostgreSQL RDBMS

After=network-online.target

[Container]

Image=docker.io/postgres:18-trixie

ContainerName=postgres

Volume=/data/postgresql:/var/lib/postgresql/18/docker:Z

PublishPort=5432:5432

Network=host

Environment=POSTGRES_PASSWORD=XnNxBlaowPTOJD4PWvY9qHG5CoXwqjMp

[Service]

Restart=always

RestartSec=5

[Install]

WantedBy=multi-user.target

这样就创建好了最简单的 Postgres Quadlet 了

Postgres 加固

小提醒,你在 Quadlet 中明文写密码是有可能被系统里的其他用户读取到的,因此我们需要使用更安全的方式来隐藏起密码。

以及我们需要对 Postgres 的网络进行一些配置。

Quadlet 加固

最简单的方式是利用 Podman 提供的 secret 功能进行加固,Postgres 恰好又支持通过 secret 来配置自身,那么我们可以替换我们 Quadlet 中的 POSTGRES_PASSWORD 环境变量为 POSTGRES_PASSWORD_FILE 环境变量。

首先我们需要创建一个 Secret:

# 可以从 stdin 创建

echo -n 'XnNxBlaowPTOJD4PWvY9qHG5CoXwqjMp' | podman secret create postgres_password -

# 也可以从文件中创建

echo -n 'XnNxBlaowPTOJD4PWvY9qHG5CoXwqjMp' > /tmp/postgres_password.txt && podman secret create postgres_password /tmp/postgres_password.txt && rm /tmp/postgres_password.txt

NOTE

请注意,命令的开头我引入了一个空格,这样做的目的是为了避免被写入到 shell 的历史记录中。

为了做到这一点,你还需要单独配置你的 shell 使得其可以支持:

# 对于 .bashrc

HISTCONTROL=ignorespace

# 对于 .zshrc

setopt hist_ignore_space

就这样我们得到了一个叫做 postgres_password 的 secret。

随后我们进行如下字段替换:

# 把这个换掉

Environment=POSTGRES_PASSWORD=XnNxBlaowPTOJD4PWvY9qHG5CoXwqjMp

# 换成

Environment=POSTGRES_PASSWORD_FILE=/run/secrets/postgres_password

Secret=postgres_password

这样我们就成功的把可能被其他用户读到的 .service 安全化了

联网访问权限加固

联网访问权限主要对于 “谁可以链接到 Postgres” 这个命题。

考虑到我们有两个使用条件

  • 外部网络链接
  • 内部服务使用

TODO