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

TLS / HTTPS

NORA работает по протоколу HTTP. Терминация TLS выполняется обратным прокси-сервером.

Это осознанное архитектурное решение:

  • Разделение ответственности — NORA управляет артефактами, а не сертификатами. Встраивание TLS означает включение клиентов Let’s Encrypt, логики обновления сертификатов, протокола ACME и поддержки удостоверяющих центров — всё это уже реализовано в проверенных инструментах.
  • Простота эксплуатации — сертификаты настраиваются в одном месте (обратный прокси), а не в каждом сервисе отдельно. При истечении сертификата достаточно обновить одну конфигурацию.
  • Отраслевой стандарт — Docker Hub, GitHub Container Registry, AWS ECR, Harbor, Nexus — ни один из них не терминирует TLS внутри процесса реестра. Обратный прокси перед реестром — общепринятая практика.
  • Простой запуск во внутренней сети — в доверенных сетях (лаборатория, сборочный конвейер) NORA работает сразу без управления сертификатами.
Клиент (docker push) → Обратный прокси (HTTPS :443) → NORA (HTTP :4000)

Caddy (рекомендуется — автоматический Let’s Encrypt)

Заголовок раздела «Caddy (рекомендуется — автоматический Let’s Encrypt)»
registry.example.com {
reverse_proxy localhost:4000
}

Caddy автоматически получает и обновляет сертификаты.

server {
listen 443 ssl;
server_name registry.example.com;
ssl_certificate /etc/letsencrypt/live/registry.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/registry.example.com/privkey.pem;
# Необходимо для загрузки больших образов
client_max_body_size 0;
location / {
proxy_pass http://127.0.0.1:4000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
services:
traefik:
image: traefik:v3
command:
- --entrypoints.websecure.address=:443
- --certificatesresolvers.le.acme.tlschallenge=true
- --certificatesresolvers.le.acme.email=admin@example.com
ports:
- 443:443
nora:
image: ghcr.io/getnora-io/nora:latest
labels:
- traefik.http.routers.nora.rule=Host(\`registry.example.com\`)
- traefik.http.routers.nora.tls.certresolver=le
- traefik.http.services.nora.loadbalancer.server.port=4000

При работе NORA без TLS во внутренней сети необходимо настроить клиенты Docker для доверия реестру.

Отредактируйте /etc/docker/daemon.json на каждом клиенте, которому нужен доступ:

{
insecure-registries: [192.168.1.100:4000]
}

Перезапустите Docker:

Окно терминала
sudo systemctl restart docker

При использовании DNS-имени (например, nora.internal:4000) укажите его:

{
insecure-registries: [nora.internal:4000]
}

Внимание: параметр insecure-registries отключает проверку TLS-сертификата для указанного узла. Используйте только в доверенных сетях.

Для узлов Kubernetes с containerd отредактируйте /etc/containerd/config.toml:

[plugins.io.containerd.grpc.v1.cri.registry.configs.nora.internal:4000.tls]
insecure_skip_verify = true

Перезапустите containerd:

Окно терминала
sudo systemctl restart containerd

Собственные сертификаты удостоверяющего центра

Заголовок раздела «Собственные сертификаты удостоверяющего центра»

При использовании внутреннего УЦ (например, FreeIPA, корпоративный PKI):

Окно терминала
sudo mkdir -p /etc/docker/certs.d/registry.example.com:4000/
sudo cp ca.crt /etc/docker/certs.d/registry.example.com:4000/ca.crt
# Перезапуск Docker не требуется
Окно терминала
sudo cp ca.crt /usr/local/share/ca-certificates/my-ca.crt
sudo update-ca-certificates
Окно терминала
sudo cp ca.crt /etc/pki/ca-trust/source/anchors/my-ca.crt
sudo update-ca-trust