> For the complete documentation index, see [llms.txt](https://utm-1.gitbook.io/utm-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://utm-1.gitbook.io/utm-docs/dokumentaciya/utm-it/resheniya/dokumentirovanie/wiki.js/razvertyvanie-v-kubernetes-gpt-5-mini-v1.md).

# Развертывание в Kubernetes (GPT-5-Mini) v1

## Краткая схема решения

```mermaid
flowchart LR
  A[Пользователь -> DNS: wikijs.utmsoft.ru] --> B[77.51.201.4 (внешний nginx TLS)]
  B --> C[HTTP -> 192.168.1.100:31080 (k8s NodePort / Ingress controller)]
  C --> D[nginx-ingress в кластере -> Ingress rule wikijs.utmsoft.ru]
  D --> E[Service wikijs -> Pod wiki.js]
  E --> F[(Postgres) 192.168.4.9]
```

Ниже — подробная пошаговая инструкция: как подготовить PostgreSQL, какие файлы положить в репозиторий, как настроить ArgoCD Application, что менять в стандартном values.yaml и как проверить работу.

***

### 1. Подготовка PostgreSQL (сервер 192.168.4.9)

1. Подключитесь к серверу PostgreSQL (например, от пользователя postgres):
   * sudo -u postgres psql
2. Создайте пользователя и базу (замените `СЛОЖНЫЙ_ПАРОЛЬ` на безопасный):

   ```
   CREATE USER wikijs WITH PASSWORD 'СЛОЖНЫЙ_ПАРОЛЬ';
   CREATE DATABASE wikijs OWNER wikijs ENCODING 'UTF8';
   GRANT ALL PRIVILEGES ON DATABASE wikijs TO wikijs;
   ```

   Или из командной строки (пример):

   ```
   psql -h 192.168.4.9 -U postgres -c "CREATE USER wikijs WITH PASSWORD 'СЛОЖНЫЙ_ПАРОЛЬ';"
   psql -h 192.168.4.9 -U postgres -c "CREATE DATABASE wikijs OWNER wikijs ENCODING 'UTF8';"
   ```
3. Разрешите удалённые подключения (если PostgreSQL слушает только localhost):
   * В postgresql.conf: установить

     ```
     listen_addresses = '*'
     ```
   * В pg\_hba.conf добавить строку (подкорректируйте подсеть):

     ```
     host    all    all    192.168.0.0/16    md5
     ```
   * Перезапустите сервис:
     * sudo systemctl restart postgresql
4. Убедитесь, что firewall/сетевые правила разрешают доступ на порт 5432 с Kubernetes (кластера IP).

***

### 2. Структура репозитория и файлы

В вашем приватном репозитории (<https://github.com/utenkov-maxim/argocd>) создайте каталог:

* env-prod/apps/wikijs/
  * app.yaml
  * values.yaml
  * manifests/
    * secret-db.yaml

Ниже — рекомендованные содержимое файлов. Поместите их именно в эти пути и закоммитьте.

#### env-prod/apps/wikijs/app.yaml

Пример ArgoCD Application, который использует Helm chart из репозитория charts.requarks.io и values.yaml из вашего Git-репо:

```yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: wikijs
  namespace: argocd
spec:
  project: default
  source:
    repoURL: "https://github.com/utenkov-maxim/argocd"
    path: env-prod/apps/wikijs
    targetRevision: HEAD
    helm:
      repoURL: "https://charts.requarks.io"
      chart: wikijs
      valueFiles:
        - values.yaml
  destination:
    server: "https://kubernetes.default.svc"
    namespace: wikijs
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
```

Пояснения:

* `repoURL` — ваш Git-репозиторий, где хранится этот Application и файл values.yaml.
* Внутри `helm` указан `repoURL` на публичный Helm-репозиторий `https://charts.requarks.io` и `chart: wikijs`, а `valueFiles` ссылается на `values.yaml`, который лежит рядом в repo.

#### env-prod/apps/wikijs/values.yaml

Скачайте стандартный values.yaml и отредактируйте под себя:

Как получить стандартный values:

```
helm repo add requarks https://charts.requarks.io
helm repo update
helm show values requarks/wikijs > values.standard.yaml
```

Затем используйте скачанный файл как основу и внесите изменения. Пример ключевых изменений для вашей инфраструктуры:

```yaml
replicaCount: 1

image:
  repository: requarks/wiki
  tag: "latest"

service:
  type: ClusterIP
  port: 3000

persistence:
  enabled: true
  storageClass: "smb-csi-utm-server4"
  accessMode: ReadWriteMany
  size: 10Gi

ingress:
  enabled: true
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
    nginx.ingress.kubernetes.io/proxy-body-size: "50m"
  hosts:
    - host: wikijs.utmsoft.ru
      paths:
        - path: /
          pathType: Prefix
  tls: [] # TLS НЕ настраиваем в k8s — TLS у вас терминируется на внешнем nginx

extraEnv:
  - name: DB_TYPE
    value: postgres
  - name: DB_HOST
    value: "192.168.4.9"
  - name: DB_PORT
    value: "5432"
  - name: DB_NAME
    value: wikijs
  - name: DB_USER
    value: wikijs
  - name: DB_PASS
    valueFrom:
      secretKeyRef:
        name: wikijs-db-secret
        key: DB_PASSWORD

resources: {}
```

Важные замечания к values.yaml:

* Проверьте реальные ключи в стандартном values.standard.yaml: chart может использовать секцию `database.*` или `extraEnv`. Если chart использует другие имена, синхронизируйте настройки с `helm show values`.
* `persistence.storageClass` — укажите ваш `smb-csi-utm-server4`. Убедитесь, что provisioner этой storageClass поддерживает нужный accessMode (ReadWriteMany). Если нет — согласуйте с администратором хранилища.
* TLS: поскольку внешняя машина 77.51.201.4 терминует TLS и проксирует HTTP в кластер, в k8s не требуется настраивать TLS (ingress.tls оставляем пустым). Если позже захотите TLS в кластере — настройте соответствующие секреты.

#### env-prod/apps/wikijs/manifests/secret-db.yaml

Создаём секрет с паролем к БД:

```yaml
apiVersion: v1
kind: Secret
metadata:
  name: wikijs-db-secret
  namespace: wikijs
type: Opaque
stringData:
  DB_PASSWORD: "СЛОЖНЫЙ_ПАРОЛЬ"
```

Варианты:

* Вы можете дать ArgoCD синхронизировать этот файл (он лежит в репо) или создать секрет вручную локально, если не хотите хранить пароль в Git (рекомендуется использовать внешний secrets-менеджер, sealed-secrets, SOPS и т.п.).

***

### 3. Применение: шаги (команды)

1. Создать namespace (если не хотите, чтобы ArgoCD создавал его автоматически):

   ```
   kubectl create namespace wikijs
   ```
2. Если вы не храните секрет в Git — создайте секрет вручную:

   ```
   kubectl apply -n wikijs -f env-prod/apps/wikijs/manifests/secret-db.yaml
   ```
3. Закоммитьте файлы в репозиторий:

   ```
   git add env-prod/apps/wikijs
   git commit -m "Add wikijs ArgoCD application and values"
   git push origin main
   ```
4. В UI ArgoCD:
   * Найдите приложение `wikijs` (ArgoCD автоматически увидит Application-CR в репозитории) и выполните Sync, либо дождитесь автоматического sync (в app.yaml включена автоматическая синхронизация).
5. Проверка статуса:

   ```
   kubectl -n wikijs get all
   kubectl -n wikijs get pvc
   kubectl -n wikijs logs deploy/wikijs -l app=wikijs   # или конкретный pod
   kubectl -n wikijs describe ingress
   ```

***

### 4. Настройка внешнего nginx (на 77.51.201.4)

Пример конфигурации nginx на 77.51.201.4, который терминует TLS и проксирует в кластер (на NodeIP 192.168.1.100:31080):

```nginx
server {
    listen 443 ssl;
    server_name wikijs.utmsoft.ru;

    ssl_certificate /path/to/fullchain.pem;
    ssl_certificate_key /path/to/privkey.pem;

    location / {
        proxy_pass http://192.168.1.100:31080;
        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_buffering off;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
    }
}
```

Обратите внимание:

* Важно передавать заголовок Host ($host) — Ingress в кластере маршрутизирует по host `wikijs.utmsoft.ru`.
* Если ваш внешний nginx делает дополнительную маршрутизацию (например, в режиме reverse proxy + SNI), убедитесь что запросы идут именно на адрес 192.168.1.100:31080.
* Если NodePort другой — используйте корректный порт. Если у вас LoadBalancer/Ingress NodePort — подставьте соответствующий IP:порт.

***

### 5. Тестирование

1. Проверки из браузера / curl:
   * curl через внешний nginx (если сертификат валиден):

     ```
     curl -v https://wikijs.utmsoft.ru/
     ```
   * Если сертификат самоподписан — можно указать `--insecure` для теста.
2. Проверка маршрутизации внутри кластера:

   ```
   kubectl -n wikijs get ingress
   kubectl -n wikijs describe ingress <имя>
   ```
3. Проверка подключения к БД:
   * В pod-е wiki.js можно выполнить проверку (exec в контейнер) или смотреть логи: при старте приложение должно успешно подключиться и выполнить миграции.
   * Для ошибок: `kubectl -n wikijs logs <pod>` и `kubectl -n wikijs describe pod <pod>`.

***

### 6. Частые проблемы и рекомендации

* PVC не создаётся / не привязывается: проверьте storageClass `smb-csi-utm-server4` — поддерживает ли он dynamic provisioning, правильный accessMode. Если smb-csi не поддерживает динамическое provision — согласуйте создание PV вручную.
* Неправильные ключи в values.yaml: всегда загружайте `helm show values requarks/wikijs` и сверяйте имена полей (chart может ожидать `database.*`, `postgresql.*` и т.п.). Скорректируйте ваш values.yaml под реальные поля.
* TLS: если позже захотите TLS в кластер — добавьте `ingress.tls` с секретом. Сейчас TLS — на внешнем nginx, поэтому в ingress.tls можно оставить пустым.
* Безопасность: не храните plain пароли в Git. Используйте SealedSecrets, SOPS, External Secrets или ArgoCD Vault Plugin.
* Если ArgoCD не видит Application в репозитории: проверьте path и формат manifest. Application CR должен лежать в Git репо и быть видимым ArgoCD (у ArgoCD должен быть доступ к ветке и репо).

***

### 7. Резюме / что вы получите

* Wiki.js развернут в namespace `wikijs` через ArgoCD, использует PersistentVolume с `smb-csi-utm-server4`.
* База находится на отдельном сервере 192.168.4.9, создан пользователь и база wikijs.
* Внешний nginx (77.51.201.4) терминует TLS и проксирует HTTP на ingress-контроллер в кластере, Ingress маршрутизирует запросы по hostname wikijs.utmsoft.ru к сервису wiki.js.

***

Если хотите — я могу:

* Сгенерировать готовые файлы (app.yaml, values.yaml, secret-db.yaml) в формате, который вы сможете прямо положить в репозиторий.
* Помочь скорректировать values.yaml под фактическую структуру чарта (пришлите вывод `helm show values requarks/wikijs` или файл values.standard.yaml).

Как вам удобнее продолжить? Я подготовлю файлы для прямого коммита или помогу адаптировать под ваш chart.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://utm-1.gitbook.io/utm-docs/dokumentaciya/utm-it/resheniya/dokumentirovanie/wiki.js/razvertyvanie-v-kubernetes-gpt-5-mini-v1.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
