13 Commits

Author SHA1 Message Date
sova-ci 774cbba3f8 chore(docs): bump test to docs-v1.0.15-test 2026-06-10 08:03:52 +00:00
sova-ci a73da87049 chore(docs): bump test to docs-v1.0.14-test 2026-06-10 00:28:16 +00:00
Valeriy Petrov b0e527e970 Enable ingress basic auth for remote test contour.
Protect all public URLs via nginx basic auth; exempt Gitea API/registry/git paths for CI.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-10 03:25:26 +03:00
Valeriy Petrov 7967df9b42 Fix adminpanel API URL for remote test contour.
Use runtimeEnv instead of env so Helm template picks up api.dev.sovamed.ru.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-09 17:59:41 +03:00
Valeriy Petrov afebdb54d1 Escape percent signs in Symfony DSN env vars.
Symfony treats single % as parameter placeholders; double %% for URL-encoded passwords in REDIS_URL and DATABASE_URL.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-09 17:44:14 +03:00
Valeriy Petrov 9452c65bf4 Rotate test contour secrets and database passwords.
Update PostgreSQL, MySQL, Redis, app secrets, and connection URLs for the remote test environment.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-09 17:31:28 +03:00
sova-ci c8a6d8f433 fix(ingress): restore TLS for app ingresses on test contour 2026-06-09 16:37:44 +03:00
sova-ci 63e6446422 chore(docs): bump test to docs-v1.0.12-test 2026-06-09 13:31:33 +00:00
sova-ci 140bd582ef chore(cabinet): bump test to cabinet-v1.0.12-test 2026-06-09 13:30:57 +00:00
sova-ci e6f9dcd5ba chore(adminpanel): bump test to adminpanel-v1.0.12-test 2026-06-09 13:28:12 +00:00
sova-ci e26931850f chore(docs): bump test to docs-v1.0.11-test 2026-06-09 13:27:48 +00:00
sova-ci edcd138d0f chore(backend): bump test to backend-v1.0.12-test 2026-06-09 13:27:16 +00:00
sova-ci 3c30b86826 chore: remove redmine-test from ArgoCD (SKIP_REDMINE=1) 2026-06-09 16:13:32 +03:00
21 changed files with 239 additions and 25 deletions
+19
View File
@@ -77,8 +77,27 @@ kind: Ingress
metadata: metadata:
name: adminpanel name: adminpanel
namespace: {{ .Values.namespace }} namespace: {{ .Values.namespace }}
{{- if or .Values.ingress.tls.enabled .Values.ingress.basicAuth.enabled }}
annotations:
{{- if .Values.ingress.tls.enabled }}
cert-manager.io/cluster-issuer: {{ .Values.ingress.tls.clusterIssuer | quote }}
nginx.ingress.kubernetes.io/ssl-redirect: "true"
{{- end }}
{{- if .Values.ingress.basicAuth.enabled }}
nginx.ingress.kubernetes.io/auth-type: basic
nginx.ingress.kubernetes.io/auth-secret: {{ .Values.ingress.basicAuth.secretName | quote }}
nginx.ingress.kubernetes.io/auth-realm: {{ .Values.ingress.basicAuth.realm | quote }}
nginx.ingress.kubernetes.io/auth-skip-locations: {{ .Values.ingress.basicAuth.skipLocations | quote }}
{{- end }}
{{- end }}
spec: spec:
ingressClassName: {{ .Values.ingress.className }} ingressClassName: {{ .Values.ingress.className }}
{{- if .Values.ingress.tls.enabled }}
tls:
- hosts:
- {{ .Values.ingress.host }}
secretName: {{ .Values.ingress.tls.secretName }}
{{- end }}
rules: rules:
- host: {{ .Values.ingress.host }} - host: {{ .Values.ingress.host }}
http: http:
+8 -2
View File
@@ -1,9 +1,15 @@
ingress: ingress:
host: adm.dev.sovamed.ru host: adm.dev.sovamed.ru
env: tls:
enabled: true
clusterIssuer: letsencrypt-prod
secretName: adminpanel-tls
basicAuth:
enabled: true
runtimeEnv:
API_BASE_URL: https://api.dev.sovamed.ru API_BASE_URL: https://api.dev.sovamed.ru
image: image:
tag: adminpanel-v1.0.10-test tag: adminpanel-v1.0.12-test
pullPolicy: IfNotPresent pullPolicy: IfNotPresent
repository: git.sova.local/sova/adminpanel repository: git.sova.local/sova/adminpanel
imagePullSecrets: imagePullSecrets:
+5
View File
@@ -13,6 +13,11 @@ ingress:
enabled: true enabled: true
className: nginx className: nginx
host: admin.test.sova.local host: admin.test.sova.local
basicAuth:
enabled: false
secretName: contour-basic-auth
realm: "Sova Test Contour"
skipLocations: "/.well-known/acme-challenge"
runtimeEnv: runtimeEnv:
API_BASE_URL: http://api.test.sova.local API_BASE_URL: http://api.test.sova.local
+19
View File
@@ -193,8 +193,27 @@ kind: Ingress
metadata: metadata:
name: backend name: backend
namespace: {{ .Values.namespace }} namespace: {{ .Values.namespace }}
{{- if or .Values.ingress.tls.enabled .Values.ingress.basicAuth.enabled }}
annotations:
{{- if .Values.ingress.tls.enabled }}
cert-manager.io/cluster-issuer: {{ .Values.ingress.tls.clusterIssuer | quote }}
nginx.ingress.kubernetes.io/ssl-redirect: "true"
{{- end }}
{{- if .Values.ingress.basicAuth.enabled }}
nginx.ingress.kubernetes.io/auth-type: basic
nginx.ingress.kubernetes.io/auth-secret: {{ .Values.ingress.basicAuth.secretName | quote }}
nginx.ingress.kubernetes.io/auth-realm: {{ .Values.ingress.basicAuth.realm | quote }}
nginx.ingress.kubernetes.io/auth-skip-locations: {{ .Values.ingress.basicAuth.skipLocations | quote }}
{{- end }}
{{- end }}
spec: spec:
ingressClassName: {{ .Values.ingress.className }} ingressClassName: {{ .Values.ingress.className }}
{{- if .Values.ingress.tls.enabled }}
tls:
- hosts:
- {{ .Values.ingress.host }}
secretName: {{ .Values.ingress.tls.secretName }}
{{- end }}
rules: rules:
- host: {{ .Values.ingress.host }} - host: {{ .Values.ingress.host }}
http: http:
+7 -1
View File
@@ -1,7 +1,13 @@
ingress: ingress:
host: api.dev.sovamed.ru host: api.dev.sovamed.ru
tls:
enabled: true
clusterIssuer: letsencrypt-prod
secretName: backend-tls
basicAuth:
enabled: true
image: image:
tag: backend-v1.0.10-test tag: backend-v1.0.12-test
pullPolicy: IfNotPresent pullPolicy: IfNotPresent
repository: git.sova.local/sova/backend repository: git.sova.local/sova/backend
imagePullSecrets: imagePullSecrets:
+11 -6
View File
@@ -17,6 +17,11 @@ ingress:
className: nginx className: nginx
host: api.test.sova.local host: api.test.sova.local
tls: false tls: false
basicAuth:
enabled: false
secretName: contour-basic-auth
realm: "Sova Test Contour"
skipLocations: "/.well-known/acme-challenge"
resources: resources:
php: php:
@@ -50,13 +55,13 @@ env:
CORS_ALLOW_ORIGIN: "['http://admin.test.sova.local','https://admin.test.sova.local']" CORS_ALLOW_ORIGIN: "['http://admin.test.sova.local','https://admin.test.sova.local']"
secrets: secrets:
APP_SECRET: change-me-test-secret APP_SECRET: In-brrZjIpzgCNAMq_CqBv-1VxOiS7h_1gDAUd7OkpI
DATABASE_URL: postgresql://sova_test:sova_test_pass@postgresql-test.sova-data-test.svc.cluster.local:5432/sova_backend_test?serverVersion=16&charset=utf8 DATABASE_URL: postgresql://sova_test:c%%25EDQxAr91khfvhle3CV4Mxg@postgresql-test.sova-data-test.svc.cluster.local:5432/sova_backend_test?serverVersion=16&charset=utf8
DATABASE_CABINET_URL: postgresql://sova_test:sova_test_pass@postgresql-test.sova-data-test.svc.cluster.local:5432/sova_cabinet_test?serverVersion=16&charset=utf8 DATABASE_CABINET_URL: postgresql://sova_test:c%%25EDQxAr91khfvhle3CV4Mxg@postgresql-test.sova-data-test.svc.cluster.local:5432/sova_cabinet_test?serverVersion=16&charset=utf8
DATABASE_BITRIX_URL: mysql://bitrix_test:bitrix_test_pass@mysql-bitrix-test.sova-data-test.svc.cluster.local:3306/sova_bitrix_test?serverVersion=8.0 DATABASE_BITRIX_URL: mysql://bitrix_test:xEpMvDAaCb%%21U1U%%2AwBOg8GAk%%2B@mysql-bitrix-test.sova-data-test.svc.cluster.local:3306/sova_bitrix_test?serverVersion=8.0
REDIS_URL: redis://:redis_test_pass@redis-test-master.sova-data-test.svc.cluster.local:6379/0 REDIS_URL: redis://:u96%%3Dbi6a%%21weD6xW3n%%23GGZQTZ@redis-test-master.sova-data-test.svc.cluster.local:6379/0
JWT_PASSPHRASE: "" JWT_PASSPHRASE: ""
AES_SECRET_KEY: test-aes-secret-key-32bytes-min!! AES_SECRET_KEY: o*HTus#3tw^%#sT*z_ZvY#!Uf46AFXRg
MAILER_ACCESS_TOKEN: test-mailer-token MAILER_ACCESS_TOKEN: test-mailer-token
SMSRU_URL: http://noop.invalid SMSRU_URL: http://noop.invalid
SMSRU_TOKEN: noop SMSRU_TOKEN: noop
+19
View File
@@ -177,8 +177,27 @@ kind: Ingress
metadata: metadata:
name: cabinet name: cabinet
namespace: {{ .Values.namespace }} namespace: {{ .Values.namespace }}
{{- if or .Values.ingress.tls.enabled .Values.ingress.basicAuth.enabled }}
annotations:
{{- if .Values.ingress.tls.enabled }}
cert-manager.io/cluster-issuer: {{ .Values.ingress.tls.clusterIssuer | quote }}
nginx.ingress.kubernetes.io/ssl-redirect: "true"
{{- end }}
{{- if .Values.ingress.basicAuth.enabled }}
nginx.ingress.kubernetes.io/auth-type: basic
nginx.ingress.kubernetes.io/auth-secret: {{ .Values.ingress.basicAuth.secretName | quote }}
nginx.ingress.kubernetes.io/auth-realm: {{ .Values.ingress.basicAuth.realm | quote }}
nginx.ingress.kubernetes.io/auth-skip-locations: {{ .Values.ingress.basicAuth.skipLocations | quote }}
{{- end }}
{{- end }}
spec: spec:
ingressClassName: {{ .Values.ingress.className }} ingressClassName: {{ .Values.ingress.className }}
{{- if .Values.ingress.tls.enabled }}
tls:
- hosts:
- {{ .Values.ingress.host }}
secretName: {{ .Values.ingress.tls.secretName }}
{{- end }}
rules: rules:
- host: {{ .Values.ingress.host }} - host: {{ .Values.ingress.host }}
http: http:
+7 -1
View File
@@ -1,7 +1,13 @@
ingress: ingress:
host: cabinet.dev.sovamed.ru host: cabinet.dev.sovamed.ru
tls:
enabled: true
clusterIssuer: letsencrypt-prod
secretName: cabinet-tls
basicAuth:
enabled: true
image: image:
tag: cabinet-v1.0.10-test tag: cabinet-v1.0.12-test
pullPolicy: IfNotPresent pullPolicy: IfNotPresent
repository: git.sova.local/sova/cabinet repository: git.sova.local/sova/cabinet
imagePullSecrets: imagePullSecrets:
+9 -5
View File
@@ -16,7 +16,11 @@ ingress:
enabled: true enabled: true
className: nginx className: nginx
host: cabinet.test.sova.local host: cabinet.test.sova.local
basicAuth:
enabled: false
secretName: contour-basic-auth
realm: "Sova Test Contour"
skipLocations: "/.well-known/acme-challenge"
resources: resources:
php: php:
requests: requests:
@@ -44,10 +48,10 @@ env:
CORS_ALLOW_ORIGIN: "^https?://(cabinet\\.test\\.sova\\.local|localhost)(:[0-9]+)?$" CORS_ALLOW_ORIGIN: "^https?://(cabinet\\.test\\.sova\\.local|localhost)(:[0-9]+)?$"
secrets: secrets:
APP_SECRET: change-me-cabinet-test-secret APP_SECRET: sUkQq2K4-57_woq1NgLTuApbRZNGayc41QY3j5CI1Y4
DATABASE_URL: postgresql://sova_test:sova_test_pass@postgresql-test.sova-data-test.svc.cluster.local:5432/sova_cabinet_test?serverVersion=16&charset=utf8 DATABASE_URL: postgresql://sova_test:c%%25EDQxAr91khfvhle3CV4Mxg@postgresql-test.sova-data-test.svc.cluster.local:5432/sova_cabinet_test?serverVersion=16&charset=utf8
DATABASE_BITRIX_URL: mysql://bitrix_test:bitrix_test_pass@mysql-bitrix-test.sova-data-test.svc.cluster.local:3306/sova_bitrix_test?serverVersion=8.0 DATABASE_BITRIX_URL: mysql://bitrix_test:xEpMvDAaCb%%21U1U%%2AwBOg8GAk%%2B@mysql-bitrix-test.sova-data-test.svc.cluster.local:3306/sova_bitrix_test?serverVersion=8.0
REDIS_URL: redis://:redis_test_pass@redis-test-master.sova-data-test.svc.cluster.local:6379/1 REDIS_URL: redis://:u96%%3Dbi6a%%21weD6xW3n%%23GGZQTZ@redis-test-master.sova-data-test.svc.cluster.local:6379/1
MAILER_DSN: smtp://mailpit.sova-mocks.svc.cluster.local:1025 MAILER_DSN: smtp://mailpit.sova-mocks.svc.cluster.local:1025
SMSRU_KEY_API: noop SMSRU_KEY_API: noop
SMSRU_FROM_SOVAMED: noop SMSRU_FROM_SOVAMED: noop
+19
View File
@@ -47,8 +47,27 @@ kind: Ingress
metadata: metadata:
name: docs name: docs
namespace: {{ .Values.namespace }} namespace: {{ .Values.namespace }}
{{- if or .Values.ingress.tls.enabled .Values.ingress.basicAuth.enabled }}
annotations:
{{- if .Values.ingress.tls.enabled }}
cert-manager.io/cluster-issuer: {{ .Values.ingress.tls.clusterIssuer | quote }}
nginx.ingress.kubernetes.io/ssl-redirect: "true"
{{- end }}
{{- if .Values.ingress.basicAuth.enabled }}
nginx.ingress.kubernetes.io/auth-type: basic
nginx.ingress.kubernetes.io/auth-secret: {{ .Values.ingress.basicAuth.secretName | quote }}
nginx.ingress.kubernetes.io/auth-realm: {{ .Values.ingress.basicAuth.realm | quote }}
nginx.ingress.kubernetes.io/auth-skip-locations: {{ .Values.ingress.basicAuth.skipLocations | quote }}
{{- end }}
{{- end }}
spec: spec:
ingressClassName: {{ .Values.ingress.className }} ingressClassName: {{ .Values.ingress.className }}
{{- if .Values.ingress.tls.enabled }}
tls:
- hosts:
- {{ .Values.ingress.host }}
secretName: {{ .Values.ingress.tls.secretName }}
{{- end }}
rules: rules:
- host: {{ .Values.ingress.host }} - host: {{ .Values.ingress.host }}
http: http:
+7 -1
View File
@@ -1,7 +1,13 @@
ingress: ingress:
host: docs.dev.sovamed.ru host: docs.dev.sovamed.ru
tls:
enabled: true
clusterIssuer: letsencrypt-prod
secretName: docs-tls
basicAuth:
enabled: true
image: image:
tag: docs-v1.0.10-test tag: docs-v1.0.15-test
pullPolicy: IfNotPresent pullPolicy: IfNotPresent
repository: git.sova.local/sova/docs repository: git.sova.local/sova/docs
imagePullSecrets: imagePullSecrets:
+5 -1
View File
@@ -13,7 +13,11 @@ ingress:
enabled: true enabled: true
className: nginx className: nginx
host: docs.sova.local host: docs.sova.local
basicAuth:
enabled: false
secretName: contour-basic-auth
realm: "Sova Test Contour"
skipLocations: "/.well-known/acme-challenge"
resources: resources:
requests: requests:
cpu: 25m cpu: 25m
@@ -1,3 +1,4 @@
# Только для локальной фермы (Multipass). На удалённом test — не применять.
apiVersion: argoproj.io/v1alpha1 apiVersion: argoproj.io/v1alpha1
kind: Application kind: Application
metadata: metadata:
+2 -2
View File
@@ -3,10 +3,10 @@ namespace: sova-data-test
postgres: postgres:
host: postgresql-test.sova-data-test.svc.cluster.local host: postgresql-test.sova-data-test.svc.cluster.local
user: sova_test user: sova_test
password: sova_test_pass password: c%EDQxAr91khfvhle3CV4Mxg
mysql: mysql:
host: mysql-bitrix-test.sova-data-test.svc.cluster.local host: mysql-bitrix-test.sova-data-test.svc.cluster.local
user: bitrix_test user: bitrix_test
password: bitrix_test_pass password: xEpMvDAaCb!U1U*wBOg8GAk+
database: sova_bitrix_test database: sova_bitrix_test
@@ -1,4 +1,2 @@
SELECT 'CREATE DATABASE sova_cabinet_test OWNER sova_test' SELECT 'CREATE DATABASE sova_cabinet_test OWNER sova_test'
WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'sova_cabinet_test')\gexec WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'sova_cabinet_test')\gexec
SELECT 'CREATE DATABASE redmine_test OWNER sova_test'
WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'redmine_test')\gexec
+4 -4
View File
@@ -5,7 +5,7 @@ postgresql:
fullnameOverride: postgresql-test fullnameOverride: postgresql-test
auth: auth:
username: sova_test username: sova_test
password: sova_test_pass password: c%EDQxAr91khfvhle3CV4Mxg
database: sova_backend_test database: sova_backend_test
primary: primary:
persistence: persistence:
@@ -28,9 +28,9 @@ mysql:
enabled: true enabled: true
fullnameOverride: mysql-bitrix-test fullnameOverride: mysql-bitrix-test
auth: auth:
rootPassword: bitrix_root_test rootPassword: NTv$fys*Y$m1sKcH+@F^^77F
username: bitrix_test username: bitrix_test
password: bitrix_test_pass password: xEpMvDAaCb!U1U*wBOg8GAk+
database: sova_bitrix_test database: sova_bitrix_test
primary: primary:
persistence: persistence:
@@ -46,7 +46,7 @@ redis:
enabled: true enabled: true
fullnameOverride: redis-test fullnameOverride: redis-test
auth: auth:
password: redis_test_pass password: u96=bi6a!weD6xW3n#GGZQTZ
master: master:
persistence: persistence:
enabled: false enabled: false
@@ -0,0 +1,14 @@
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: devops@sovamed.ru
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: nginx
@@ -0,0 +1,14 @@
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-staging
spec:
acme:
server: https://acme-staging-v02.api.letsencrypt.org/directory
email: devops@sovamed.ru
privateKeySecretRef:
name: letsencrypt-staging
solvers:
- http01:
ingress:
class: nginx
+20
View File
@@ -0,0 +1,20 @@
# Single-node test (812 GB): SQLite, без PostgreSQL HA
postgresql:
enabled: false
postgresql-ha:
enabled: false
gitea:
config:
database:
DB_TYPE: sqlite3
actions:
ENABLED: true
packages:
ENABLED: true
resources:
requests:
memory: 128Mi
limits:
memory: 512Mi
+25
View File
@@ -0,0 +1,25 @@
# Remote test server — 12 GB RAM (kube-prometheus-stack)
grafana:
enabled: true
resources:
requests:
memory: 128Mi
limits:
memory: 256Mi
prometheus:
prometheusSpec:
retention: 3d
scrapeInterval: 60s
evaluationInterval: 60s
resources:
requests:
memory: 512Mi
limits:
memory: 1Gi
# Раскомментировать при нехватке RAM:
# kubeStateMetrics:
# enabled: false
# nodeExporter:
# enabled: false
+24
View File
@@ -0,0 +1,24 @@
---
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: sova-critical
value: 1000000
globalDefault: false
description: "API, PostgreSQL, MySQL — не убивать при OOM"
---
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: sova-normal
value: 100000
globalDefault: true
description: "Gitea, ArgoCD, ingress"
---
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: sova-low
value: 10000
globalDefault: false
description: "Runner, Grafana, Loki — жертвы OOM"