refactor: убрать Traefik, добавить метрики и ingress аддонам, provisioning DB/MinIO

Traefik:
- k3s-server-config.yaml.j2: traefik всегда в disable list (убрана переменная)
- group_vars/all/main.yml: убрана k3s_disable_traefik
- ingress-nginx/tasks: убраны задачи отключения Traefik (дублирование)

Prometheus метрики (по умолчанию включены):
- postgresql, mysql: metrics.enabled + serviceMonitor (при addon_prometheus_stack)
- minio: metrics.serviceMonitor (при addon_prometheus_stack)
- velero: metrics.enabled + serviceMonitor (при addon_prometheus_stack)
- crowdsec: ServiceMonitor для /metrics:6060 (при addon_prometheus_stack)
- ingress-nginx: ingress_nginx_metrics_enabled: true (было false)

Ingress:
- velero: velero_ingress_enabled (API port 8085)
- crowdsec: crowdsec_ingress_enabled (LAPI port 8080)

Databasus — provisioning shared ресурсов вместо деплоя своих:
- addon_postgresql: Job создаёт user 'databasus' + database 'databasus' в shared PG
- addon_minio: Job создаёт bucket 'databasus-backups' в shared MinIO
- vault_databasus_db_password добавлен в vault.yml.example
This commit is contained in:
Sergey Antropoff
2026-04-25 11:19:42 +03:00
parent 80dbf686b0
commit 71a5e14ebb
17 changed files with 326 additions and 88 deletions

View File

@@ -1,6 +1,6 @@
---
databasus_chart_ref: "oci://ghcr.io/databasus/charts/databasus"
databasus_version: "" # "" = latest; укажи конкретную: "1.0.0"
databasus_version: ""
databasus_namespace: "databasus"
# ── Ingress ────────────────────────────────────────────────────────────────────
@@ -11,17 +11,20 @@ databasus_ingress_tls: false
databasus_ingress_cert_issuer: "{{ cert_manager_default_issuer_name | default('letsencrypt-prod') }}"
# ── Интеграция с addon_postgresql ─────────────────────────────────────────────
# Автоматически используется когда addon_postgresql: true.
# Переопредели явно для кастомного PostgreSQL.
# Когда addon_postgresql: true — создаётся отдельный пользователь и база данных.
# Задай в vault.yml:
# vault_databasus_db_password: "..."
databasus_postgresql_enabled: "{{ addon_postgresql | default(false) | bool }}"
databasus_db_name: "databasus"
databasus_db_username: "databasus"
databasus_db_password: "{{ vault_databasus_db_password | default('changeme-databasus') }}"
# Подключение к уже запущенному addon_postgresql
databasus_postgresql_host: "{{ postgresql_external_host | default('postgresql.postgresql.svc.cluster.local') }}"
databasus_postgresql_port: "{{ postgresql_external_port | default(5432) }}"
databasus_postgresql_username: "{{ postgresql_auth_username | default('appuser') }}"
databasus_postgresql_password: "{{ postgresql_auth_password | default('') }}"
databasus_postgresql_database: "{{ postgresql_auth_database | default('appdb') }}"
databasus_postgresql_admin_password: "{{ postgresql_auth_postgres_password | default('changeme-postgres') }}"
# ── Интеграция с addon_mysql ───────────────────────────────────────────────────
# Автоматически используется когда addon_mysql: true.
# Когда addon_mysql: true — передаются connection details для резервного копирования.
databasus_mysql_enabled: "{{ addon_mysql | default(false) | bool }}"
databasus_mysql_host: "{{ mysql_external_host | default('mysql.mysql.svc.cluster.local') }}"
databasus_mysql_port: "{{ mysql_external_port | default(3306) }}"
@@ -29,6 +32,14 @@ databasus_mysql_username: "{{ mysql_auth_username | default('appuser') }}"
databasus_mysql_password: "{{ mysql_auth_password | default('') }}"
databasus_mysql_database: "{{ mysql_auth_database | default('appdb') }}"
# ── Интеграция с addon_minio ──────────────────────────────────────────────────
# Когда addon_minio: true — создаётся отдельный бакет для хранения бэкапов.
databasus_minio_enabled: "{{ addon_minio | default(false) | bool }}"
databasus_minio_bucket: "databasus-backups"
databasus_minio_host: "minio.minio.svc.cluster.local:9000"
databasus_minio_access_key: "{{ vault_minio_root_user | default('minioadmin') }}"
databasus_minio_secret_key: "{{ vault_minio_root_password | default('changeme-minio') }}"
# ── Ресурсы ────────────────────────────────────────────────────────────────────
databasus_resources:
requests:

View File

@@ -1,4 +1,114 @@
---
# ── Provisioning PostgreSQL: отдельный пользователь + база данных ──────────────
- name: Create dedicated PostgreSQL user and database for Databasus
kubernetes.core.k8s:
state: present
definition:
apiVersion: batch/v1
kind: Job
metadata:
name: databasus-pg-provision
namespace: "{{ postgresql_namespace | default('postgresql') }}"
spec:
ttlSecondsAfterFinished: 300
template:
spec:
restartPolicy: OnFailure
containers:
- name: psql
image: postgres:16-alpine
command:
- /bin/sh
- -c
- |
PGPASSWORD="$ADMIN_PASS" psql -h "$HOST" -U postgres -c "
DO \$\$
BEGIN
IF NOT EXISTS (SELECT FROM pg_roles WHERE rolname = '${DB_USER}') THEN
CREATE USER ${DB_USER} WITH PASSWORD '${DB_PASS}';
END IF;
END \$\$;
" &&
PGPASSWORD="$ADMIN_PASS" psql -h "$HOST" -U postgres -tc \
"SELECT 1 FROM pg_database WHERE datname = '${DB_NAME}'" \
| grep -q 1 || \
PGPASSWORD="$ADMIN_PASS" psql -h "$HOST" -U postgres -c \
"CREATE DATABASE ${DB_NAME} OWNER ${DB_USER};"
env:
- name: HOST
value: "{{ databasus_postgresql_host }}"
- name: ADMIN_PASS
value: "{{ databasus_postgresql_admin_password }}"
- name: DB_USER
value: "{{ databasus_db_username }}"
- name: DB_PASS
value: "{{ databasus_db_password }}"
- name: DB_NAME
value: "{{ databasus_db_name }}"
environment:
KUBECONFIG: "{{ k3s_kubeconfig_path }}"
when: databasus_postgresql_enabled | bool
- name: Wait for PostgreSQL provisioning job
ansible.builtin.command: >
k3s kubectl wait --for=condition=complete
-n {{ postgresql_namespace | default('postgresql') }}
job/databasus-pg-provision --timeout=120s
become: true
register: _pg_provision
changed_when: false
retries: 3
delay: 5
until: _pg_provision.rc == 0
when: databasus_postgresql_enabled | bool
# ── Provisioning MinIO: отдельный бакет ────────────────────────────────────────
- name: Create dedicated MinIO bucket for Databasus
kubernetes.core.k8s:
state: present
definition:
apiVersion: batch/v1
kind: Job
metadata:
name: databasus-minio-provision
namespace: "{{ minio_namespace | default('minio') }}"
spec:
ttlSecondsAfterFinished: 300
template:
spec:
restartPolicy: OnFailure
containers:
- name: mc
image: minio/mc:latest
command:
- /bin/sh
- -c
- |
mc alias set minio "http://minio:9000" "$KEY" "$SECRET" &&
mc mb --ignore-existing "minio/{{ databasus_minio_bucket }}"
env:
- name: KEY
value: "{{ databasus_minio_access_key }}"
- name: SECRET
value: "{{ databasus_minio_secret_key }}"
environment:
KUBECONFIG: "{{ k3s_kubeconfig_path }}"
when: databasus_minio_enabled | bool
- name: Wait for MinIO provisioning job
ansible.builtin.command: >
k3s kubectl wait --for=condition=complete
-n {{ minio_namespace | default('minio') }}
job/databasus-minio-provision --timeout=120s
become: true
register: _minio_provision
changed_when: false
retries: 3
delay: 5
until: _minio_provision.rc == 0
when: databasus_minio_enabled | bool
# ── Build database connections list ────────────────────────────────────────────
- name: Build Databasus database connections
ansible.builtin.set_fact:
_databasus_databases: >-
@@ -7,9 +117,9 @@
[{'type': 'postgresql',
'host': databasus_postgresql_host,
'port': databasus_postgresql_port | int,
'username': databasus_postgresql_username,
'password': databasus_postgresql_password,
'database': databasus_postgresql_database}],
'username': databasus_db_username,
'password': databasus_db_password,
'database': databasus_db_name}],
[]
)
+
@@ -24,6 +134,7 @@
)
}}
# ── Deploy Databasus ────────────────────────────────────────────────────────────
- name: Deploy Databasus via Helm (OCI chart)
kubernetes.core.helm:
name: databasus
@@ -43,13 +154,21 @@
- path: /
pathType: Prefix
tls: >-
{{ [{'hosts': [databasus_ingress_host],
'secretName': 'databasus-tls'}]
{{ [{'hosts': [databasus_ingress_host], 'secretName': 'databasus-tls'}]
if databasus_ingress_tls | bool else [] }}
annotations: >-
{{ {'cert-manager.io/cluster-issuer': databasus_ingress_cert_issuer}
if databasus_ingress_tls | bool else {} }}
databases: "{{ _databasus_databases }}"
storage: >-
{{
{'type': 's3',
'endpoint': 'http://' ~ databasus_minio_host,
'bucket': databasus_minio_bucket,
'accessKey': databasus_minio_access_key,
'secretKey': databasus_minio_secret_key}
if databasus_minio_enabled | bool else {}
}}
resources: "{{ databasus_resources }}"
environment:
KUBECONFIG: "{{ k3s_kubeconfig_path }}"
@@ -73,10 +192,11 @@
- " Databasus установлен"
- "══════════════════════════════════════════════"
- " Namespace: {{ databasus_namespace }}"
- "{% if databasus_ingress_enabled %} UI: http{{ 's' if databasus_ingress_tls | bool else '' }}://{{ databasus_ingress_host }}{% endif %}"
- "{% if databasus_ingress_enabled %} UI: http{{ 's' if databasus_ingress_tls | bool else '' }}://{{ databasus_ingress_host }}{% endif %}"
- " Port-forward: kubectl port-forward -n {{ databasus_namespace }} svc/databasus 8080:80"
- "──────────────────────────────────────────────"
- " Подключённые базы данных:"
- "{% for db in _databasus_databases %} - {{ db.type }}: {{ db.host }}:{{ db.port }} / {{ db.database }}{% endfor %}"
- " Базы данных:"
- "{% for db in _databasus_databases %} - {{ db.type }}: {{ db.host }}:{{ db.port }} / {{ db.database }} (user: {{ db.username }}){% endfor %}"
- "{% if _databasus_databases | length == 0 %} (нет — включи addon_postgresql или addon_mysql){% endif %}"
- " S3 хранилище: {{ 'minio/' ~ databasus_minio_bucket if databasus_minio_enabled | bool else 'не настроено' }}"
- "══════════════════════════════════════════════"