0%

解决postgres容器中的'FATAL role "postgres" does not exist'

起因

在truenas的nextcloud升级后,可能是由于容器拉取混乱,k3s里的nextcloud空间也乱了。陆续出现了几个问题:

  1. 原本只有3个pod,结果多了nextcloud-postgres-ncnextcloud-nc两个deployment,而且都是比我设置版本低的,读的同一个映射路径(直接删掉多余的deploy)
  2. 在nextcloud-postgres容器中出现了2025-01-01T00:10:27.747127138+08:00 2024-12-31 16:10:27.747 UTC [169] FATAL: role "postgres" does not exist报错。虽然没找到这个错误的起因,但还是尝试解决了一下。
  3. app_api插件更新卡住不动(在将/html/apps/app_api目录先移出目录在移进后就莫名其妙好了)

网上说解决第2个问题的方法都语焉不详。postgres应该是默认的超级管理员用户,现在超级管理员直接没了,所以很多操作实际上是执行不了的。一下说一下我的解决办法

创建临时pg容器

在原有容器中,postgres进程是不能关的,关了后容器会重建,尝试设置了一下pod的restartPolicy为Never也没用。因此创建了一个临时容器来处理,新容器删掉了探针,加了一个tail -f /dev/null保持容器不关闭。

配置postgres.yml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
apiVersion: v1
kind: Pod
metadata:
name: postgres-13.1
labels:
app: postgres
namespace: default
spec:
restartPolicy: Never
containers:
- name: postgres
image: postgres:13.1
command: ["tail", "-f", "/dev/null"]
ports:
- containerPort: 5432
name: postgres
volumeMounts:
- name: postgres-data
mountPath: /var/lib/postgresql/data
volumes:
- name: postgres-data
hostPath:
path: /xxxx # 宿主机挂载到容器的pg根目录
type: DirectoryOrCreate
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-pvc
namespace: default
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: standard

接着启动容器

1
2
k3s kubectl apply -f postgres2.yaml
k3s kubectl delete pod postgres-13.1 -n default

进入single模式,增加postgres用户

1
2
3
4
5
6
7
8
pg_ctl stop -D /var/lib/postgresql/data/

postgres --single -D /var/lib/postgresql/data/
>CREATE ROLE postgres SUPERUSER LOGIN CREATEDB CREATEROLE INHERIT REPLICATION BYPASSRLS;

pg_ctl start -D /var/lib/postgresql/data/

k3s kubectl delete pod postgres-13.1 -n default