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

Руководство по развёртыванию в рабочей среде

Данное руководство описывает развёртывание NORA в рабочей среде с поддержкой HTTPS/TLS через обратные прокси.

Caddy обеспечивает автоматическое получение сертификатов HTTPS через Let’s Encrypt и отличается простой конфигурацией.

Caddyfile:

nora.example.com {
reverse_proxy localhost:4000 {
header_up Host {host}
header_up X-Real-IP {remote}
header_up X-Forwarded-For {remote}
header_up X-Forwarded-Proto {scheme}
}
}

С собственным сертификатом:

{
auto_https disable_redirects
}
nora.example.com:443 {
tls /etc/ssl/certs/nora.crt /etc/ssl/private/nora.key
reverse_proxy localhost:4000 {
header_up Host {host}
header_up X-Real-IP {remote}
}
log {
output file /var/log/caddy/nora-access.log
}
}

Запуск Caddy:

Окно терминала
caddy run --config /etc/caddy/Caddyfile

nginx.conf:

upstream nora_backend {
server localhost:4000;
}
server {
listen 443 ssl http2;
server_name nora.example.com;
ssl_certificate /etc/ssl/certs/nora.crt;
ssl_certificate_key /etc/ssl/private/nora.key;
# Усиление SSL
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# Настройки проксирования
location / {
proxy_pass http://nora_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Таймауты для загрузки больших образов
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
}
# Конечная точка API
location /api/ {
proxy_pass http://localhost:4000/;
}
# Конечная точка метрик
location /metrics {
proxy_pass http://localhost:4000/metrics;
allow 10.0.0.0/8; # Ограничить доступ внутренней сетью
deny all;
}
}
# Перенаправление HTTP на HTTPS
server {
listen 80;
server_name nora.example.com;
return 301 https://$host$request_uri;
}

docker-compose.yml с Traefik:

version: '3.8'
services:
nora:
image: ghcr.io/getnora-io/nora:latest
restart: unless-stopped
volumes:
- nora-data:/data
environment:
NORA_STORAGE_PATH: /data
labels:
- "traefik.enable=true"
- "traefik.http.routers.nora.rule=Host(`nora.example.com`)"
- "traefik.http.routers.nora.entrypoints=websecure"
- "traefik.http.routers.nora.tls.certresolver=letsencrypt"
- "traefik.http.services.nora.loadbalancer.server.port=4000"
traefik:
image: traefik:v2.10
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- traefik-certs:/letsencrypt
command:
- "--providers.docker=true"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.letsencrypt.acme.email=admin@example.com"
- "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
- "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
volumes:
nora-data:
traefik-certs:

Развёртывание через Docker Compose в рабочей среде

Заголовок раздела «Развёртывание через Docker Compose в рабочей среде»

Полный стек для рабочей среды с Caddy:

version: '3.8'
services:
nora:
image: ghcr.io/getnora-io/nora:latest
container_name: nora
restart: unless-stopped
ports:
- "127.0.0.1:4000:4000" # NORA (реестр + API + веб-интерфейс)
volumes:
- nora-data:/data
environment:
# Хранилище
NORA_STORAGE_PATH: /data
# Ограничения частоты запросов (настроены для рабочей среды)
NORA_RATE_LIMIT_UPLOAD_RPS: 2000
NORA_RATE_LIMIT_UPLOAD_BURST: 5000
NORA_RATE_LIMIT_GENERAL_RPS: 1000
NORA_RATE_LIMIT_GENERAL_BURST: 2000
# Журналирование
NORA_LOG_LEVEL: info
NORA_LOG_FORMAT: json
# Метрики
NORA_METRICS_ENABLED: "true"
healthcheck:
test: ["CMD", "wget", "-q", "--spider", "http://localhost:4000/health"]
interval: 30s
timeout: 10s
retries: 3
caddy:
image: caddy:2-alpine
container_name: caddy
restart: unless-stopped
ports:
- "443:443"
- "80:80"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- ./certs:/etc/ssl/certs:ro
- ./private:/etc/ssl/private:ro
- caddy-data:/data
- caddy-config:/config
depends_on:
- nora
volumes:
nora-data:
driver: local
caddy-data:
caddy-config:

Caddy обрабатывает это автоматически. Достаточно указать имя хоста в Caddyfile:

nora.example.com {
reverse_proxy localhost:4000
}

Собственный удостоверяющий центр (FreeIPA, внутренняя PKI)

Заголовок раздела «Собственный удостоверяющий центр (FreeIPA, внутренняя PKI)»

1. Создание запроса на сертификат:

Окно терминала
openssl req -new -newkey rsa:2048 -nodes \
-keyout nora.key \
-out nora.csr \
-subj "/CN=nora.example.com/O=MyOrg/C=US"

2. Подписание удостоверяющим центром и установка:

Окно терминала
# Скопировать подписанный сертификат и ключ
cp nora.crt /etc/ssl/certs/
cp nora.key /etc/ssl/private/
chmod 600 /etc/ssl/private/nora.key
# Добавить сертификат УЦ в системное хранилище доверия
# Ubuntu/Debian/Astra Linux:
cp ca.crt /usr/local/share/ca-certificates/
update-ca-certificates
# RHEL/CentOS/Astra/РЕД ОС:
# cp ca.crt /etc/pki/ca-trust/source/anchors/
# update-ca-trust

3. Настройка обратного прокси с собственным сертификатом (см. примеры выше)


На клиентских машинах добавьте сертификат удостоверяющего центра:

Окно терминала
# Linux (Ubuntu/Debian/Astra Linux)
sudo cp ca.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
sudo systemctl restart docker
# Linux (RHEL/CentOS/Astra/РЕД ОС)
# sudo cp ca.crt /etc/pki/ca-trust/source/anchors/
# sudo update-ca-trust
# sudo systemctl restart docker
# macOS
sudo security add-trusted-cert -d -r trustRoot \
-k /Library/Keychains/System.keychain ca.crt

Проверка доступа:

Окно терминала
docker login nora.example.com
docker pull nora.example.com/myapp:latest

Добавление сертификата УЦ на все узлы:

Окно терминала
# На каждом узле (Ubuntu/Debian/Astra Linux)
sudo cp ca.crt /usr/local/share/ca-certificates/nora-ca.crt
sudo update-ca-certificates
sudo systemctl restart containerd
# На каждом узле (RHEL/CentOS/Astra/РЕД ОС)
# sudo cp ca.crt /etc/pki/ca-trust/source/anchors/nora-ca.crt
# sudo update-ca-trust
# sudo systemctl restart containerd

Обновление ссылок на образы в манифестах:

containers:
- name: myapp
image: nora.example.com/myapp:latest

Создайте /etc/systemd/system/nora.service:

[Unit]
Description=NORA Container Registry
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=nora
Group=nora
WorkingDirectory=/opt/nora
ExecStart=/usr/local/bin/nora serve \
--storage-path /var/lib/nora \
--rate-limit-upload-rps 2000 \
--rate-limit-upload-burst 5000
Restart=on-failure
RestartSec=10
# Усиление безопасности
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/var/lib/nora
[Install]
WantedBy=multi-user.target

Включение и запуск:

Окно терминала
sudo systemctl daemon-reload
sudo systemctl enable nora
sudo systemctl start nora
sudo systemctl status nora

Конечная точка проверки работоспособности:

Окно терминала
curl https://nora.example.com/health
# Ожидаемый ответ: {"status":"ok"}

Конечная точка метрик (Prometheus):

Окно терминала
curl http://localhost:4000/metrics

Подробнее о настройке Prometheus и Grafana см. Руководство по мониторингу.


Для сред с интенсивным CI/CD увеличьте ограничения частоты запросов:

Окно терминала
NORA_RATE_LIMIT_UPLOAD_RPS=2000 # По умолчанию: 200
NORA_RATE_LIMIT_UPLOAD_BURST=5000 # По умолчанию: 500
NORA_RATE_LIMIT_GENERAL_RPS=1000 # По умолчанию: 500
NORA_RATE_LIMIT_GENERAL_BURST=2000 # По умолчанию: 1000

Отслеживайте метрику nora_rate_limit_hits_total через /metrics для точной настройки.

Локальное хранилище:

  • Используйте быстрый SSD для /data
  • Регулярно очищайте устаревшие теги
  • Контролируйте использование дискового пространства

S3-совместимое хранилище:

Окно терминала
NORA_STORAGE_TYPE=s3
NORA_S3_BUCKET=nora-registry
NORA_S3_REGION=us-east-1
NORA_S3_ENDPOINT=https://s3.amazonaws.com

  1. Всегда используйте HTTPS в рабочей среде — Docker и containerd требуют защищённого соединения с реестром
  2. Ограничьте доступ к конечной точке метрик — используйте правила межсетевого экрана или обратного прокси
  3. Включите аутентификацию — см. Настройка аутентификации
  4. Поддерживайте актуальность сертификатов УЦ на всех клиентских машинах
  5. Отслеживайте несанкционированный доступ через журналы и метрики
  6. Выполняйте регулярное резервное копирование каталога /data

Проблема: «x509: certificate signed by unknown authority»

Решение: установите сертификат удостоверяющего центра на клиентских машинах (см. раздел «Настройка клиентов» выше)

Проблема: ошибки ограничения частоты запросов

Решение: увеличьте ограничения частоты запросов через переменные окружения и перезапустите NORA

Проблема: медленная загрузка

Решение: проверьте таймауты обратного прокси и увеличьте их при необходимости