PostgreSQL 新创建的用户居然没有 database 权限

在宝塔面板创建了新数据库和对应的新用户,但这个用户居然没有权限。看来是创建语句没有给 owner,得手动加。

/www/server/pgsql/bin/psql -U postgres
ALTER DATABASE umami OWNER TO umami;

为宝塔面板的 PostgreSQL 添加 pgcrypto 扩展

昨天 umami 更新 v2.20 后数据丢失 更新了 Umami,看到新出了 3.0 版本想试试。但它抛弃了 MySQL 支持得换成 PostgresSQL,今天迁移过程中发现宝塔面板安装的 PostgreSQL 版本没有包含它依赖的 pgcrypto 扩展,那就得自己来。

这里就记录下最终的命令。

wget https://ftp.postgresql.org/pub/source/v18.0/postgresql-18.0.tar.gz
tar -zxvf postgresql-18.0.tar.gz
 
cd postgresql-18.0
./configure --with-openssl  
cd contrib/pgcrypto  
make
 
cp pgcrypto.so /www/server/pgsql/lib/
cp pgcrypto.control /www/server/pgsql/share/extension/
cp pgcrypto--*.sql /www/server/pgsql/share/extension/
 
/www/server/pgsql/bin/psql -U postgres
CREATE EXTENSION pgcrypto;

在 PostgreSQL 18 中没有 --with-pgconfig 选项。

在 commit 中贴的 GitHub 链接引用不要产生反向链接

这是 2025 年 03 月左右探索 unfurl 和 dependabot 时的知识,现在补缺记录

如果在 commit message 中贴 GitHub Issue 的链接并 push 到 GitHub 上了,就能在那个 Issue 中产生一条 mentioned this 连结。非常好用,但有时也不希望自己垃圾项目记录个 bug 原因去污染对方仓库的 Issue 历史,毕竟这个连结还是不可删除的。

升级 umami v3-postgresql

主要是把 MySQL 换成 PostgresSQL。升级一方面是看到之前的 React CVE,另一方面是看到发了新版本,以及在新版本修复了 Umami IP 定位到南非 Pretoria 的问题。

按照官方指南 Migrate MySQL to PostgreSQL 做,很明显只改引号是不够的

# mysqldump --no-create-info --default-character-set=utf8mb4 --quick --skip-add-locks \-u username -p mydb > mydbdump.sql
# sed -i 's/`/"/g' mydbdump.sql
# psql -U username -d mydb < mydbdump.sql
# /www/server/pgsql/bin/psql -U umami < mydbdump.sql
ERROR:  duplicate key value violates unique constraint "_prisma_migrations_pkey"
DETAIL:  Key (id)=(188d7f08-626d-49df-bb42-0e5cba6f49fb) already exists.
invalid command \'s-Encrypt-CRL-地址被墙','',NULL,NULL,NULL,'从
ERROR:  syntax error at or near "an"
LINE 1: ...','desktop','2048x1152','zh-CN','CN','CN-SN','Xi\'an','2025-...

走 CSV 方案还得每个表单独导入,太烦了没弄

据说有 pgloader 工具专门做 MySQL to Postgres — pgloader 3.6.9 documentation,然而我是 MySQL 9,pgloader 有 QMYND:MYSQL-UNSUPPORTED-AUTHENTICATION attempting to load data from mysql 8.0.4-rc. · Issue #782 · dimitri/pgloader 问题没法直接用

调研一圈还有用 ProxySQL 起代理的,我决定起个低版本容器再尝试用 pgloader 来完成 MySQL to PostgreSQL 的过程。

# PostgreSQL umami 中的表已由 umami-v2 创建好
 
# 启动旧版本的 MySQL
docker run -d -p 33306:3306 --name mysql_old -e MYSQL_ROOT_PASSWORD=my-secret-pw --ulimit nofile=1048576:1048576 -d mysql:5.7
 
# 导出 MySQL 中的数据
mysqldump --default-character-set=utf8mb4 --skip-add-locks -u root -p umami > umami.sql
# 导入到旧版本 MySQL 中
docker exec    mysql_old mysql -pmy-secret-pw -e 'create database umami'
docker exec -i mysql_old mysql -pmy-secret-pw umami < umami.sql
 
# 清空表中的记录,后面会从 mysql 导入
/www/server/pgsql/bin/psql -U umami -c 'truncate table "_prisma_migrations"; truncate table "user";'
 
# MySQL to PostgreSQL
cat > umami.load << EOF
LOAD DATABASE
   FROM mysql://root:my-secret-pw@localhost:33306/umami
   INTO pgsql://umami:password@localhost/umami
   WITH create no tables
   ALTER SCHEMA 'umami' RENAME TO 'public';
EOF
docker run --rm -v ./umami.load:/tmp/umami.load --network=host ghcr.io/dimitri/pgloader:latest pgloader /tmp/umami.load

我这么做是先导出再导入,有停机时间。注意操作顺序很重要,先启动 umami-v2 初始化 PostgreSQL 数据库

过程中的参考信息

下一步把镜像换成 docker.umami.is/umami-software/umami:postgresql-latest 就成啦