Перейти к содержимому

S3-хранилище

По умолчанию NORA хранит артефакты на локальной файловой системе. Для рабочих развёртываний можно переключиться на любое S3-совместимое хранилище — AWS S3, MinIO, RustFS, Ceph RGW и другие.

ПеременнаяПо умолчаниюОписание
NORA_STORAGE_MODElocalУстановите s3 для объектного хранилища
NORA_STORAGE_S3_URLURL S3-совместимого endpoint (например http://minio:9000)
NORA_STORAGE_BUCKETregistryИмя бакета. Должен существовать до запуска NORA
NORA_STORAGE_S3_ACCESS_KEYКлюч доступа. Если не указан, используется анонимный доступ
NORA_STORAGE_S3_SECRET_KEYСекретный ключ
NORA_STORAGE_S3_REGIONus-east-1Регион. Требуется некоторыми реализациями S3

MinIO — наиболее популярное self-hosted S3-совместимое хранилище. Этот пример включает init-контейнер, который создаёт бакет автоматически.

services:
minio:
image: minio/minio:latest
command: server /data --console-address ":9001"
environment:
MINIO_ROOT_USER: noraadmin
MINIO_ROOT_PASSWORD: changeme-minio-secret
ports:
- 9000:9000 # S3 API
- 9001:9001 # Консоль MinIO
volumes:
- minio-data:/data
healthcheck:
test: ["CMD", "mc", "ready", "local"]
interval: 5s
timeout: 5s
retries: 5
createbucket:
image: minio/mc:latest
depends_on:
minio:
condition: service_healthy
entrypoint: >
/bin/sh -c "
mc alias set myminio http://minio:9000 noraadmin changeme-minio-secret;
mc mb --ignore-existing myminio/nora-storage;
exit 0;
"
nora:
image: ghcr.io/getnora-io/nora:latest
depends_on:
createbucket:
condition: service_completed_successfully
environment:
NORA_HOST: "0.0.0.0"
NORA_STORAGE_MODE: s3
NORA_STORAGE_S3_URL: http://minio:9000
NORA_STORAGE_BUCKET: nora-storage
NORA_STORAGE_S3_ACCESS_KEY: noraadmin
NORA_STORAGE_S3_SECRET_KEY: changeme-minio-secret
NORA_STORAGE_S3_REGION: us-east-1
ports:
- 4000:4000
restart: unless-stopped
volumes:
minio-data:
Окно терминала
# Push Docker-образ
docker tag alpine:latest localhost:4000/test/alpine:latest
docker push localhost:4000/test/alpine:latest
# Pull обратно
docker rmi localhost:4000/test/alpine:latest
docker pull localhost:4000/test/alpine:latest
# Загрузка raw-файла
curl -X PUT -d "hello s3" http://localhost:4000/raw/test/hello.txt
curl http://localhost:4000/raw/test/hello.txt

Проверьте консоль MinIO на http://localhost:9001 — объекты должны появиться в бакете nora-storage.

RustFS — легковесное S3-совместимое хранилище на Rust. Конфигурация идентична MinIO с одним отличием: endpoint проверки здоровья /health вместо /minio/health/live.

services:
rustfs:
image: rustfs/rustfs:latest
command: server /data --console-address ":9001"
environment:
RUSTFS_ROOT_USER: noraadmin
RUSTFS_ROOT_PASSWORD: changeme-rustfs-secret
ports:
- 9000:9000 # S3 API
- 9001:9001 # Консоль
volumes:
- rustfs-data:/data
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/health"]
interval: 5s
timeout: 5s
retries: 5
createbucket:
image: minio/mc:latest
depends_on:
rustfs:
condition: service_healthy
entrypoint: >
/bin/sh -c "
mc alias set myrustfs http://rustfs:9000 noraadmin changeme-rustfs-secret;
mc mb --ignore-existing myrustfs/nora-storage;
exit 0;
"
nora:
image: ghcr.io/getnora-io/nora:latest
depends_on:
createbucket:
condition: service_completed_successfully
environment:
NORA_HOST: "0.0.0.0"
NORA_STORAGE_MODE: s3
NORA_STORAGE_S3_URL: http://rustfs:9000
NORA_STORAGE_BUCKET: nora-storage
NORA_STORAGE_S3_ACCESS_KEY: noraadmin
NORA_STORAGE_S3_SECRET_KEY: changeme-rustfs-secret
NORA_STORAGE_S3_REGION: us-east-1
ports:
- 4000:4000
restart: unless-stopped
volumes:
rustfs-data:

Для AWS S3 укажите NORA_STORAGE_S3_URL на региональный endpoint:

environment:
NORA_STORAGE_MODE: s3
NORA_STORAGE_S3_URL: https://s3.eu-central-1.amazonaws.com
NORA_STORAGE_BUCKET: my-nora-registry
NORA_STORAGE_S3_ACCESS_KEY: AKIA...
NORA_STORAGE_S3_SECRET_KEY: wJal...
NORA_STORAGE_S3_REGION: eu-central-1
[storage]
mode = "s3"
s3_url = "http://minio:9000"
bucket = "nora-storage"
s3_access_key = "noraadmin"
s3_secret_key = "changeme"
s3_region = "us-east-1"

NORA запускается, но артефакты попадают в локальное хранилище

Заголовок раздела «NORA запускается, но артефакты попадают в локальное хранилище»

Проверьте, что NORA_STORAGE_MODE установлен в точности s3 (в нижнем регистре). Любая ошибка в написании приводит к тихому откату на локальный режим:

Окно терминала
docker exec nora env | grep NORA_STORAGE

Ожидаемый вывод:

NORA_STORAGE_MODE=s3
NORA_STORAGE_S3_URL=http://minio:9000
NORA_STORAGE_BUCKET=nora-storage
...

Убедитесь, что S3-сервис работает до запуска NORA. В Docker Compose используйте depends_on с condition: service_healthy.

NORA не создаёт бакеты. Создайте заранее через mc mb или init-контейнер (см. примеры выше).