·
ZabbixGrafanaELKJenkinsBitbucketNexusDropApp (K8s)OpenShiftSecManJiraConfluence
SRE / DEVOPS ENGINEER
manifests/
├── 00-namespace-secret/
│ ├── namespace.yaml
│ └── secrets.yaml
├── 10-databases/
│ ├── postgres-outline.yaml
│ ├── redis-outline.yaml
│ ├── mariadb.yaml
│ └── postgres-mattermost.yaml
├── 20-apps/
│ ├── outline.yaml # база знаний
│ ├── bookstack.yaml # вики
│ ├── freescout.yaml # helpdesk
│ ├── mattermost.yaml # чат команды
│ └── nextcloud.yaml # файлы
├── 30-info-page/
│ ├── configmap.yaml # HTML прямо здесь
│ ├── deployment.yaml
│ └── service.yaml
├── 40-ingress/
│ └── ingress.yaml
└── 50-storage/
├── mariadb-pvc.yaml
├── bookstack-pvc.yaml
├── freescout-pvc.yaml
├── nextcloud-pvc.yaml
├── nextcloud-data.yaml
├── postgres-mattermost-pvc.yaml
└── pvc-postgres-outline.yaml
# 1. сначала сохраняем ответ модели state["pending"] = {"answer": answer,"answer_hash": sha256(answer), } save_state(state) # атомарно: .tmp → replace # 2. только потом отправляем в чат send_to_deepseek(page, answer) # 3. помечаем как свой, чтобы не # отвечать самому себе в цикле state["ignored_hashes"].add(answer_hash) state["pending"] = None save_state(state)