Руководство по развёртыванию в рабочей среде
Данное руководство описывает развёртывание NORA в рабочей среде с поддержкой HTTPS/TLS через обратные прокси.
Настройка обратного прокси
Заголовок раздела «Настройка обратного прокси»Вариант 1: Caddy (рекомендуется)
Заголовок раздела «Вариант 1: Caddy (рекомендуется)»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Вариант 2: Nginx
Заголовок раздела «Вариант 2: Nginx»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 на HTTPSserver { listen 80; server_name nora.example.com; return 301 https://$host$request_uri;}Вариант 3: Traefik
Заголовок раздела «Вариант 3: Traefik»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:Управление сертификатами
Заголовок раздела «Управление сертификатами»Let’s Encrypt (автоматически)
Заголовок раздела «Let’s Encrypt (автоматически)»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-trust3. Настройка обратного прокси с собственным сертификатом (см. примеры выше)
Настройка клиентов
Заголовок раздела «Настройка клиентов»На клиентских машинах добавьте сертификат удостоверяющего центра:
# Linux (Ubuntu/Debian/Astra Linux)sudo cp ca.crt /usr/local/share/ca-certificates/sudo update-ca-certificatessudo 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
# macOSsudo security add-trusted-cert -d -r trustRoot \ -k /Library/Keychains/System.keychain ca.crtПроверка доступа:
docker login nora.example.comdocker pull nora.example.com/myapp:latestKubernetes
Заголовок раздела «Kubernetes»Добавление сертификата УЦ на все узлы:
# На каждом узле (Ubuntu/Debian/Astra Linux)sudo cp ca.crt /usr/local/share/ca-certificates/nora-ca.crtsudo update-ca-certificatessudo 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Служба systemd
Заголовок раздела «Служба systemd»Создайте /etc/systemd/system/nora.service:
[Unit]Description=NORA Container RegistryAfter=network-online.targetWants=network-online.target
[Service]Type=simpleUser=noraGroup=noraWorkingDirectory=/opt/noraExecStart=/usr/local/bin/nora serve \ --storage-path /var/lib/nora \ --rate-limit-upload-rps 2000 \ --rate-limit-upload-burst 5000Restart=on-failureRestartSec=10
# Усиление безопасностиNoNewPrivileges=truePrivateTmp=trueProtectSystem=strictProtectHome=trueReadWritePaths=/var/lib/nora
[Install]WantedBy=multi-user.targetВключение и запуск:
sudo systemctl daemon-reloadsudo systemctl enable norasudo systemctl start norasudo 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 # По умолчанию: 200NORA_RATE_LIMIT_UPLOAD_BURST=5000 # По умолчанию: 500NORA_RATE_LIMIT_GENERAL_RPS=1000 # По умолчанию: 500NORA_RATE_LIMIT_GENERAL_BURST=2000 # По умолчанию: 1000Отслеживайте метрику nora_rate_limit_hits_total через /metrics для точной настройки.
Хранилище
Заголовок раздела «Хранилище»Локальное хранилище:
- Используйте быстрый SSD для
/data - Регулярно очищайте устаревшие теги
- Контролируйте использование дискового пространства
S3-совместимое хранилище:
NORA_STORAGE_TYPE=s3NORA_S3_BUCKET=nora-registryNORA_S3_REGION=us-east-1NORA_S3_ENDPOINT=https://s3.amazonaws.comРекомендации по безопасности
Заголовок раздела «Рекомендации по безопасности»- Всегда используйте HTTPS в рабочей среде — Docker и containerd требуют защищённого соединения с реестром
- Ограничьте доступ к конечной точке метрик — используйте правила межсетевого экрана или обратного прокси
- Включите аутентификацию — см. Настройка аутентификации
- Поддерживайте актуальность сертификатов УЦ на всех клиентских машинах
- Отслеживайте несанкционированный доступ через журналы и метрики
- Выполняйте регулярное резервное копирование каталога
/data
Устранение неполадок
Заголовок раздела «Устранение неполадок»Проблема: «x509: certificate signed by unknown authority»
Решение: установите сертификат удостоверяющего центра на клиентских машинах (см. раздел «Настройка клиентов» выше)
Проблема: ошибки ограничения частоты запросов
Решение: увеличьте ограничения частоты запросов через переменные окружения и перезапустите NORA
Проблема: медленная загрузка
Решение: проверьте таймауты обратного прокси и увеличьте их при необходимости