Перейти к содержанию

Установка Helm-чарта

Общий порядок

  1. Получите архив Helm-чарта appsec-registry (каталог с Chart.yaml, values.yaml, templates/).
  2. Подготовьте файл values под свой профиль (см. сценарии ниже).
  3. Установите зависимости и release:

    cd <chart-directory>
    helm dependency build .
    helm install <release> . \
      -n <namespace> \
      --create-namespace \
      -f my-values.yaml
    
  4. Проверьте состояние:

    kubectl get pods,svc,ingress,pvc -n <namespace>
    helm list -n <namespace>
    
  5. После install Helm выводит NOTES с URL core и UI; при включённом SeaweedFS — S3 endpoint и статус blob store Job.

Обновление:

helm upgrade <release> . -n <namespace> -f my-values.yaml

Имя release

Сохраняйте одно имя release при upgrade — от него зависят имена PVC ({fullname}-data, {fullname}-nexus-data).

Лицензия

Передайте лицензию Nexus одним из способов:

credentials:
  nexus:
    license:
      contentBase64: "<base64 содержимого .lic>"

или при установке:

helm install ... --set-file credentials.nexus.license.contentBase64=/path/to/license.b64

где license.b64 получен командой base64 -w0 nexus-repo-license.lic.


Сценарий A — Standalone embedded (dev/test)

Встроенная OrientDB в PVC, без PostgreSQL.

registryCore:
  clustered: false
  storage:
    enabled: true
    size: 8Gi

database:
  mode: embedded

credentials:
  provider: helm
  nexus:
    license:
      contentBase64: ""   # заполнить

registryUi:
  replicaCount: 1

Сценарий B — Standalone с CNPG PostgreSQL

Рекомендуемый профиль для production без HA core.

database:
  mode: cnpg

cnpg:
  enabled: true
  crds:
    create: false          # true, если CRD ещё нет в кластере
  cluster:
    enabled: true
    instances: 1
    storage:
      size: 20Gi

registryCore:
  clustered: false
  storage:
    enabled: true

credentials:
  provider: helm
  database:
    password: "<secure-password>"
  nexus:
    adminPassword: "<admin-password>"
    license:
      contentBase64: "<license-b64>"

registryUi:
  replicaCount: 1

ingress:
  enabled: true
  host: registry.example.com
  defaultRule: true
  ingressClassName: nginx
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: "0"

Пароль admin используется при первом входе и post-install Jobs (blobStore, trustStore).


Сценарий C — Dev/test с in-cluster S3 (SeaweedFS)

Хранение артефактов в S3 внутри кластера. Только для dev/test (SeaweedFS allInOne — single point of failure).

credentials:
  nexus:
    adminPassword: admin123

seaweedfs:
  enabled: true
  allInOne:
    enabled: true
    data:
      size: 10Gi
  s3:
    enableAuth: true
    existingConfigSecret: seaweedfs-s3-config
    credentials:
      admin:
        accessKey: "<generated>"
        secretKey: "<generated>"
    createBuckets:
      - name: dev-bucket

blobStore:
  enabled: true
  name: dev-s3-blobstore
  bucket: dev-bucket
  prefix: nexus/

Синхронизация credentials S3

Если заданы seaweedfs.s3.credentials.admin.*, обязательно укажите seaweedfs.s3.existingConfigSecret (чарт создаст Secret seaweedfs-s3-config). Иначе SeaweedFS сгенерирует другие ключи, и Nexus blob store Job получит HTTP 403.

Post-install Job создаёт blob store через POST /service/rest/v1/blobstores/s3. Репозитории настраиваются отдельно; default repos остаются на file blob store default.


Сценарий D — HA clustered

StatefulSet с несколькими репликами core и PostgreSQL (CNPG или external).

database:
  mode: cnpg

cnpg:
  enabled: true
  cluster:
    enabled: true
    instances: 3

registryCore:
  clustered: true
  replicaCount: 3
  storage:
    perPod: true
    size: 20Gi

credentials:
  provider: helm
  database:
    password: "<secure-password>"
  nexus:
    adminPassword: "<admin-password>"
    license:
      contentBase64: "<license-b64>"

registryUi:
  replicaCount: 2

В HA blob store Job обращается к каждому pod core через headless Service ({pod}.{release}-hl:8081), т.к. конфиг blob store локален на ноде. Trust store Job достаточно вызвать один раз через Service (данные в общей PostgreSQL).


Ingress controller в namespace (dev)

Если в кластере нет общего ingress:

ingressNginx:
  enabled: true

ingress:
  enabled: true
  host: registry.example.com
  ingressClassName: nginx
  defaultRule: true
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: "0"

ingress.ingressClassName должен совпадать с ingressNginx.controller.ingressClassResource.name (по умолчанию nginx).


Trust store (опционально)

trustStore:
  enabled: true
  certificates:
    - alias: internal-ca
      contentBase64: "<base64 -w0 ca.pem>"

Включение Use the Nexus Repository Truststore на proxy-репозиториях — в UI или API после установки.


Проверка после установки

kubectl get pods -n <namespace> -w
kubectl logs -n <namespace> -l app.kubernetes.io/name=appsec-registry --tail=50

Откройте UI по Ingress host или port-forward:

kubectl port-forward -n <namespace> svc/<release>-ui 8080:8080

Подробный справочник параметров — configuration.md.