Сделал тебе полный набор GitOps-файлов и упаковал в один архив: **👉 [Скачать архив k3s-gitops-apps-bundle.zip](sandbox:/mnt/data/k3s-gitops-apps-bundle.zip)** Внутри структура такая (относительно `k3s-gitops/apps/`): * `jenkins/` * `semaphore/` * `harbor/` (упрощённый registry на базе `registry:2`) * `vault/` * `portainer/` * `elk/` (Elasticsearch single-node + Kibana) Каждая папка содержит: * `application.yaml` — ArgoCD Application, указывающий на: * `repoURL: http://gitea-http.gitea.svc.cluster.local:3000/admin/k3s-gitops` * `path: apps/` * `namespace.yaml` — отдельный namespace для сервиса * `pvc-*.yaml` — PVC под Longhorn (StorageClass `longhorn`) * workload (`deployment.yaml` или `statefulset-*.yaml`) * `service.yaml` * `ingress*.yaml` — с `traefik` + `cert-manager.io/cluster-issuer: letsencrypt-http` Домены (можешь поменять под себя): * Jenkins: `jenkins.thedevops.dev` * Semaphore: `semaphore.thedevops.dev` * Harbor (registry): `harbor.thedevops.dev` * Vault: `vault.thedevops.dev` * Portainer: `portainer.thedevops.dev` * Kibana (ELK): `elk.thedevops.dev` --- ## Как развернуть пошагово 1. **Распаковать архив локально:** ```bash unzip k3s-gitops-apps-bundle.zip ``` 2. **Положить всё в твой GitOps-репозиторий Gitea:** Структура репо должна быть: ```text k3s-gitops/ apps/ jenkins/ semaphore/ harbor/ vault/ portainer/ elk/ ``` 3. **Закоммитить и запушить в Gitea:** ```bash cd k3s-gitops git add apps/ git commit -m "Add Jenkins, Semaphore, Harbor, Vault, Portainer, ELK GitOps manifests" git push ``` 4. **Создать ArgoCD Applications:** Вариант A — через `kubectl`: ```bash kubectl apply -f apps/jenkins/application.yaml kubectl apply -f apps/semaphore/application.yaml kubectl apply -f apps/harbor/application.yaml kubectl apply -f apps/vault/application.yaml kubectl apply -f apps/portainer/application.yaml kubectl apply -f apps/elk/application.yaml ``` Вариант B — через UI ArgoCD: можно просто импортировать эти YAML. 5. **Проверить:** ```bash kubectl get ns kubectl get pods -n jenkins kubectl get pods -n semaphore kubectl get pods -n harbor kubectl get pods -n vault kubectl get pods -n portainer kubectl get pods -n elk ``` И Ingress: ```bash kubectl get ingress -A ``` --- ## Краткий комментарий по каждому сервису ### 1. Jenkins * PVC: `jenkins-home` (20Gi, Longhorn) * Монтируется в `/var/jenkins_home` * Ingress: `jenkins.thedevops.dev` → Service `jenkins:8080` * После старта: первый админ-пароль в логе контейнера или в `/var/jenkins_home/secrets/initialAdminPassword` (на PVC). --- ### 2. Semaphore * Использую `bolt` (встроенная db) → файл `semaphore.db` на PVC `/var/lib/semaphore`. * Это упрощённый вариант без PostgreSQL, удобно для домашней лаборатории. * Ingress: `semaphore.thedevops.dev` → 3000/tcp. --- ### 3. Harbor (упрощённо) Полноценный Harbor — огромный чарт. Для домашней лаборатории я положил **минимальный docker-registry**: * Deployment `harbor-registry` с `registry:2` * PVC `harbor-registry` (50Gi) → `/var/lib/registry` * Ingress: `harbor.thedevops.dev` → 5000 (HTTP Registry) Можно использовать как приватный Docker registry: ```bash docker login harbor.thedevops.dev docker push harbor.thedevops.dev/myimage:tag ``` (для TLS/авторизации потом можно навесить auth / basic auth через Traefik или перейти на официальный Harbor chart — можем отдельно сделать GitOps под настоящий Harbor.) --- ### 4. Vault * Одиночный Vault без HA, backend `file` на PVC `/vault/file` (10Gi). * UI включен: `ui: true`, `tls_disable: 1` (HTTP, для lab). * Ingress: `vault.thedevops.dev` → 8200. * После запуска нужно будет **init + unseal** вручную (через CLI или UI). --- ### 5. Portainer * `portainer/portainer-ce:latest` * PVC `portainer-data` (5Gi) → `/data` * HTTP включён, Ingress на 9443: * Host: `portainer.thedevops.dev` * Первый запуск → создаёшь admin-пользователя через UI. --- ### 6. ELK (минимальный стек) * **Elasticsearch**: * StatefulSet, single node, `discovery.type=single-node` * PVC через `volumeClaimTemplates` → Longhorn, 30Gi * **Kibana**: * Deployment `kibana` в namespace `elk` * Подключается к `http://elasticsearch.elk.svc.cluster.local:9200` * Ingress: * Host: `elk.thedevops.dev` → Service `kibana:5601` --- Если хочешь, можем дальше: * добавить Prometheus/Grafana в таком же стиле, * переписать Harbor на официальный Helm-чарт, но всё равно через ArgoCD, * добавить ExternalDNS и разрулить DNS-записи для всех этих доменов. Пока можешь закинуть архив в Gitea и включить по одному приложению через ArgoCD – если что-то не поднимется, пришлёшь `kubectl get pods -n -o wide` и `kubectl logs`, и будем доводить до идеала.