Версия пакета: barman (python3-module-barman) 3.20.1-alt1 Окружение: # apt-get update && apt-get install -y barman postgresql16-server minio python3-module-boto3 # useradd -r -s /sbin/nologin -d /var/lib/minio minio # mkdir -p /var/lib/minio/data && chown -R minio:minio /var/lib/minio # cat > /etc/systemd/system/minio.service << 'EOF' [Unit] Description=MinIO Object Storage After=network.target [Service] Type=simple User=minio Environment=MINIO_ROOT_USER=testuser Environment=MINIO_ROOT_PASSWORD=testpass123 ExecStart=/usr/bin/minio server /var/lib/minio/data --address :9000 --console-address :9001 Restart=always [Install] WantedBy=multi-user.target EOF # systemctl daemon-reload && systemctl enable --now minio # useradd -r -s /sbin/nologin -d /var/lib/minio minio mkdir -p /var/lib/minio/data chown -R minio:minio /var/lib/minio cat > /etc/systemd/system/minio.service << 'EOF' [Unit] Description=MinIO Object Storage After=network.target [Service] Type=simple User=minio Environment=MINIO_ROOT_USER=testuser Environment=MINIO_ROOT_PASSWORD=testpass123 ExecStart=/usr/bin/minio server /var/lib/minio/data --address :9000 --console-address :9001 Restart=always [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable --now minio # runuser -u postgres -- /usr/bin/initdb -D /var/lib/pgsql/data -E UTF8 # cat >> /var/lib/pgsql/data/postgresql.conf << 'EOF' wal_level = replica archive_mode = on max_wal_senders = 10 max_replication_slots = 10 listen_addresses = '127.0.0.1' port = 5432 EOF # cat >> /var/lib/pgsql/data/pg_hba.conf << 'EOF' host all all 127.0.0.1/32 trust host replication all 127.0.0.1/32 trust EOF # chown postgres:postgres /var/lib/pgsql/data/postgresql.conf /var/lib/pgsql/data/pg_hba.conf # runuser -u postgres -- /usr/bin/pg_ctl -D /var/lib/pgsql/data -l /var/lib/pgsql/pg.log -w start # psql -U postgres -h 127.0.0.1 -c "CREATE ROLE barman WITH LOGIN SUPERUSER;" # mkdir -p /var/lock/barman /var/log/barman chown barman:barman /var/lock/barman /var/log/barman # cat > /etc/barman/barman.conf << 'BARMANCONF' [barman] log_file = /var/log/barman/barman.log barman_home = /var/lib/barman barman_lock_directory = /var/lock/barman retention_policy = REDUNDANCY 2 [master] description = "ALT POSTGRESQL BARMAN S3 TEST" conninfo = host=127.0.0.1 user=barman dbname=postgres backup_method = local-to-cloud wals_directory = s3://barman-backup/master/wals basebackups_directory = s3://barman-backup/master/basebackups slot_name = barman_slot_master streaming_archiver = on BARMANCONF # chown barman:barman /etc/barman/barman.conf # mkdir -p /var/lib/barman/.aws # cat > /var/lib/barman/.aws/credentials << 'CRED' [default] aws_access_key_id = testuser aws_secret_access_key = testpass123 CRED # cat > /var/lib/barman/.aws/config << 'CFG' [default] region = us-east-1 endpoint_url = http://127.0.0.1:9000 CFG # chown -R barman:barman /var/lib/barman/.aws # chmod 600 /var/lib/barman/.aws/credentials # systemctl enable --now crond Шаги воспроизведения: # psql -U postgres -h 127.0.0.1 -tAc "SELECT pg_switch_wal();" && sleep 5 # runuser -u barman -- env AWS_DEFAULT_REGION=us-east-1 barman cron Либо просто дождаться следующего срабатывания barman cron (каждую минуту). Проверить количество файлов: # python3 -c " import boto3 cl = boto3.client('s3', endpoint_url='http://127.0.0.1:9000', aws_access_key_id='testuser', aws_secret_access_key='testpass123', region_name='us-east-1') r = cl.list_objects_v2(Bucket='barman-backup', Prefix='master/wals/') print('WAL in S3:', len(r.get('Contents', []))) " Ожидаемый результат: в бакете есть файлы Реальный резульатт: WAL in S3: 0 <-- ОШИБКА: ожидалось >= 1 Дополнительно: В логе barman — PermissionError grep -n 'Permission denied.*xlog.db' /var/log/barman/barman.log Локально WAL накопился (streaming-архивер его получил), но в S3 не улетел: ls -la /var/lib/barman/master/streaming/ # 000000010000000000000001 (и далее) - файлы есть, но не архивированы в S3 Фактический traceback (из /var/log/barman/barman.log) File "/usr/lib/python3/site-packages/barman/cli.py", line 2070, in archive_wal server.archive_wal() File "/usr/lib/python3/site-packages/barman/server.py", line 3737, in archive_wal self.backup_manager.archive_wal(verbose) File "/usr/lib/python3/site-packages/barman/backup.py", line 1331, in archive_wal archiver.archive(verbose) File "/usr/lib/python3/site-packages/barman/wal_archiver.py", line 815, in archive with self.server.xlogdb("a") as fxlogdb: File "/usr/lib64/python3.12/contextlib.py", line 137, in __enter__ return next(self.gen) File "/usr/lib/python3/site-packages/barman/server.py", line 4020, in xlogdb self.rebuild_xlogdb(silent=True) File "/usr/lib/python3/site-packages/barman/server.py", line 4063, in rebuild_xlogdb os.unlink(os.path.join(self.config.wals_directory, "xlog.db")) PermissionError: [Errno 13] Permission denied: 's3://barman-backup/master/wals/xlog.db' Цепочка логики ошибки получается такая: 1) archive()для каждого WAL-сегмента открывает xlogdb: with self.server.xlogdb("a") as fxlogdb 2) xlogdb(mode="a") проверяет существование файла xlogdb, os.path.exists() на S3-URL возвращает False (это не локальный путь), поэтому срабатывает ветка «файл не найден». 3) rebuild_xlogdb(silent=True) создаёт xlogdb и пытается зачистить «старый» файл xlog.db 4) os.unlink('s3://.../xlog.db') - системный вызов unlink(2) получает строку, начинающуюся с s3://. А потом понимаут её как относительный путь к файлу и возвращает EACCES (нет прав на запись в «каталог» s3:), а не ENOENT. 5) Получает PermissionError, а не FileNotFoundError, поэтому блок except FileNotFoundError: pass его не перехватывает. PermissionError пробрасывается наружу через rebuild_xlogdb → xlogdb() → archive() → archive_wal() и рвёт весь запуск barman cron. Документация по barman cron: https://docs.pgbarman.org/release/3.20.1/user_guide/wal_archiving.html В апстриме подобных багрепортов не найдено.