From eb8f263479f0648f8fe766af61557e87efbe9d2d Mon Sep 17 00:00:00 2001 From: "artem.drozdov" Date: Sun, 25 Aug 2024 03:35:32 +0300 Subject: [PATCH] latest_update --- README.md | 40 +++- yonote-chart-service/Chart.lock | 9 +- yonote-chart-service/Chart.yaml | 14 +- yonote-chart-service/secret-values.yaml | 47 ++-- yonote-chart-service/templates/mcJob.yaml | 39 +++ .../templates/realm-configmap.yaml | 169 +++++++++++++ yonote-chart-service/values.yaml | 226 ++++++++++++------ 7 files changed, 441 insertions(+), 103 deletions(-) create mode 100644 yonote-chart-service/templates/mcJob.yaml create mode 100644 yonote-chart-service/templates/realm-configmap.yaml diff --git a/README.md b/README.md index 53bf975..b930b99 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,40 @@ -# onprem-deploy -helm dependency update +# Yonote Helm Chart +## Overview + +Этот Helm chart позволяет развернуть **Yonote** в Kubernetes. Она предоставляет быстрый и простой способ установки, настройки и управления приложением с помощью Helm. + +## Требования + +- Kubernetes cluster (version 1.16 or later) +- Helm (version 3.0 or later) +- Ingress Controller (nginx/traefik) + +## Installation + +### 1. Выполните сборку зависимостей Helm chart + +```bash +helm dependency build +``` + +### 2. Настройка значений + +Перед развертыванием приложения через Helm необходимо внести валидные значения в файлы values.yaml и secret-values.yaml. Эти файлы содержат параметры конфигурации, которые будут использованы при установке приложения. + +Настройте необходимые параметры. В файлах values.yaml и secret-values.yaml вы найдете различные секции, каждая из которых соответствует определенной части конфигурации приложения. Внимательно изучите комментарии в этих файлах; они указывают на места, где необходимо внести изменения. Обратите особое внимание на секцию ingress, так как её настройка важна для правильной работы приложения. Вам потребуется заменить или настроить значения в этой секции в соответствии с вашими требованиями. + +Более подробно ознакомиться с переменными вы можете по следующей ссылке: https://yo.yonote.ru/doc/peremennye-okruzheniya-mOI8Jl6B05 + +### 3. Запуск приложения + +После настройки значений выполните команду: + +```bash helm install app -f values.yaml -f secret-values.yaml -n yonote-onprem . +``` +После выполнения команды начнётся установка приложения и всех дополнительных сервисов к нему. Остаётся только подождать, пока все сервисы запустятся. + +### 4. Обратная связь + +Если у вас есть вопросы или вам нужна помощь, пишите на email: hello@yonote.ru \ No newline at end of file diff --git a/yonote-chart-service/Chart.lock b/yonote-chart-service/Chart.lock index 18f3791..a59078e 100644 --- a/yonote-chart-service/Chart.lock +++ b/yonote-chart-service/Chart.lock @@ -22,6 +22,9 @@ dependencies: version: 16.12.1 - name: minio repository: https://charts.bitnami.com/bitnami - version: 14.6.20 -digest: sha256:ac298eab717f006b97255703008f8d675b5e0603afa5b755673455012d6d3693 -generated: "2024-07-16T12:06:23.7878103+03:00" \ No newline at end of file + version: 12.7.0 +- name: keycloak + repository: https://charts.bitnami.com/bitnami + version: 14.0.0 +digest: sha256:928723e189de54fafe19316743b8f9d08d7c74f9728b0c4afb1f5cd3ee1e83dc +generated: "2024-08-25T00:46:01.648512702+03:00" diff --git a/yonote-chart-service/Chart.yaml b/yonote-chart-service/Chart.yaml index 25064f6..a70fa48 100644 --- a/yonote-chart-service/Chart.yaml +++ b/yonote-chart-service/Chart.yaml @@ -38,8 +38,8 @@ dependencies: - name: postgresql version: "11.6.6" repository: https://charts.bitnami.com/bitnami - condition: yonote-database.enabled - alias: yonote-database + condition: yonoteDatabase.enabled + alias: yonoteDatabase - name: redis version: "16.12.1" @@ -48,7 +48,13 @@ dependencies: alias: yonote-redis - name: minio - version: "14.6.20" + version: "12.7.0" repository: https://charts.bitnami.com/bitnami condition: minio.enabled - alias: minio \ No newline at end of file + alias: minio + + - name: keycloak + version: "14.0.0" + repository: https://charts.bitnami.com/bitnami + condition: keycloak.enabled + alias: keycloak \ No newline at end of file diff --git a/yonote-chart-service/secret-values.yaml b/yonote-chart-service/secret-values.yaml index 2eddb7f..2c6663b 100644 --- a/yonote-chart-service/secret-values.yaml +++ b/yonote-chart-service/secret-values.yaml @@ -1,28 +1,45 @@ -global: +global: yonote: config: secret: stringData: - DATABASE_URL: 'postgres://{{ .Values.global.postgresql.auth.username }}:{{ .Values.global.postgresql.auth.password }}@yonote-db:5432/{{ .Values.global.postgresql.auth.database }}' - POSTGRES_PASSWORD: wsGZ6kXhr5 - AWS_ACCESS_KEY_ID: "minioadmin" # Ваш идентификатор ключа доступа к AWS. Поведение в SelfHosted: устанавливает логин сервис аккаунта для доступа приложения к Minio S3 хранилищу - AWS_SECRET_ACCESS_KEY: "minioadminsecret" # Ваш секретный ключ доступа AWS. Поведение в SelfHosted: устанавливает пароль сервис аккаунта для доступа приложения к Minio S3 хранилищу - OIDC_CLIENT_SECRET: "12345667789" # Создается в OIDС + DATABASE_URL: 'postgres://{{ .Values.yonoteDatabase.global.postgresql.auth.username }}:{{ .Values.yonoteDatabase.global.postgresql.auth.password }}@yonote-database:5432/{{ .Values.yonoteDatabase.global.postgresql.auth.database }}' + POSTGRES_PASSWORD: "{{ .Values.yonoteDatabase.global.postgresql.auth.password }}" + AWS_ACCESS_KEY_ID: "{{ .Values.minio.auth.rootUser }}" # Ваш идентификатор ключа доступа к AWS. Поведение в SelfHosted: устанавливает логин сервис аккаунта для доступа приложения к Minio S3 хранилищу + AWS_SECRET_ACCESS_KEY: "{{ .Values.minio.auth.rootPassword }}" # Ваш секретный ключ доступа AWS. Поведение в SelfHosted: устанавливает пароль сервис аккаунта для доступа приложения к Minio S3 хранилищу + OIDC_CLIENT_SECRET: "Kdq8rk5Pv5RW1c5kHXpnyfrmMRzI9xSD" # Секретный ключ клиента для аутентификации по OpenID Connect (OIDC). SECRET_KEY: "659a8881b186198c3146e316f6dab67df25496534d1fa156d624b037260df688" # Сгенерируйте 32-байтовый случайный ключ в шестнадцатеричном коде. Вам следует использовать `openssl rand -hex 32` в вашем терминале для генерации случайного значения. SMTP_PASSWORD: "1234" UTILS_SECRET: "7bd5e9ac4415dd0dbf6b7721e2a21e9427b268cd0140c7516d13dece5024d479" # Сгенерируйте уникальный случайный ключ. Формат не важен, но вы все равно можете использовать`openssl rand -hex 32` в вашем терминале, чтобы создать это. TELEGRAM_BOT_TOKEN: "1234" UNSPLASH_API_ACCESS_KEY: "a-yGo6HpRP6jNfravx4Bz-oiPrRnH_5-24Xa9ZPlePE" - LICENSE_KEY: "1234566-qwetty-12345" # Обратитесь в отдел продаж для получения + LICENSE_KEY: "qwerty-123456-zxcvb" # Обратитесь в отдел продаж для получения SERVICE_WORKER_PUBLIC_KEY: "1234" SERVICE_WORKER_PRIVATE_KEY: "1234" - # Генерация ключей (web-push) Service Worker - # 1) Установить Node.js и npm - # 2) Выполнить команду для генерации ключей - # npx web-push generate-vapid-keys - # 3) Полученные значения ввести в .env файл (SERVICE_WORKER_PUBLIC_KEY, SERVICE_WORKER_PRIVATE_KEY) + # Генерация ключей (web-push) Service Worker + # 1) Установить Node.js и npm + # 2) Выполнить команду для генерации ключей + # npx web-push generate-vapid-keys + # 3) Полученные значения ввести в .env файл (SERVICE_WORKER_PUBLIC_KEY, SERVICE_WORKER_PRIVATE_KEY) +yonoteDatabase: + global: + postgresql: + auth: + password: "wsGZ6kXhr5" + postgresPassword: "QQYw4UjOU" + +# yonote-redis: # Если используете пароль для redis +# auth: +# password: "12345678" + +minio: + auth: + rootPassword: "12345678" + +keycloak: + auth: + adminPassword: "root" postgresql: - auth: - password: "wsGZ6kXhr5" - postgresPassword: "QQYw4UjOU" \ No newline at end of file + auth: + password: "tT9BqYdNyd" \ No newline at end of file diff --git a/yonote-chart-service/templates/mcJob.yaml b/yonote-chart-service/templates/mcJob.yaml new file mode 100644 index 0000000..7835bd2 --- /dev/null +++ b/yonote-chart-service/templates/mcJob.yaml @@ -0,0 +1,39 @@ +{{- if .Values.mcJob.enabled }} +apiVersion: batch/v1 +kind: Job +metadata: + name: yonote-minio-mc-job + labels: + app: yonote-minio +spec: + template: + metadata: + labels: + app: yonote-minio + spec: + containers: + - name: mc-client + image: "docker.io/bitnami/minio-client:2024.8.13-debian-12-r0" + command: ["/bin/sh", "-c"] + args: + - | + until mc alias set myminio http://yonote-minio:9000 {{ .Values.minio.auth.rootUser }} {{ .Values.minio.auth.rootPassword }}; do + echo "Waiting for MinIO to be ready..." + sleep 5 + done + if ! mc ls myminio/yonote-bucket; then + mc mb myminio/yonote-bucket + else + echo "Bucket yonote-bucket already exists." + fi + resources: + requests: + memory: "128Mi" + cpu: "100m" + limits: + memory: "256Mi" + cpu: "200m" + restartPolicy: OnFailure + backoffLimit: 5 + ttlSecondsAfterFinished: 100 +{{- end }} \ No newline at end of file diff --git a/yonote-chart-service/templates/realm-configmap.yaml b/yonote-chart-service/templates/realm-configmap.yaml new file mode 100644 index 0000000..11d7483 --- /dev/null +++ b/yonote-chart-service/templates/realm-configmap.yaml @@ -0,0 +1,169 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: realm-export +data: + realm-export.json: | + { + "realm": "yonote", + "enabled": true, + "notBefore": 1647809856, + "defaultSignatureAlgorithm": "RS256", + "revokeRefreshToken": false, + "refreshTokenMaxReuse": 0, + "accessTokenLifespan": 300, + "accessTokenLifespanForImplicitFlow": 900, + "ssoSessionIdleTimeout": 1800, + "ssoSessionMaxLifespan": 36000, + "ssoSessionIdleTimeoutRememberMe": 0, + "ssoSessionMaxLifespanRememberMe": 0, + "offlineSessionIdleTimeout": 2592000, + "offlineSessionMaxLifespanEnabled": false, + "offlineSessionMaxLifespan": 5184000, + "clientSessionIdleTimeout": 0, + "clientSessionMaxLifespan": 0, + "clientOfflineSessionIdleTimeout": 0, + "clientOfflineSessionMaxLifespan": 0, + "accessCodeLifespan": 60, + "accessCodeLifespanUserAction": 300, + "accessCodeLifespanLogin": 1800, + "actionTokenGeneratedByAdminLifespan": 43200, + "actionTokenGeneratedByUserLifespan": 300, + "oauth2DeviceCodeLifespan": 600, + "oauth2DevicePollingInterval": 5, + "sslRequired": "external", + "registrationAllowed": true, + "registrationEmailAsUsername": true, + "rememberMe": true, + "verifyEmail": false, + "loginWithEmailAllowed": true, + "duplicateEmailsAllowed": false, + "resetPasswordAllowed": true, + "editUsernameAllowed": false, + "bruteForceProtected": false, + "permanentLockout": false, + "maxFailureWaitSeconds": 900, + "minimumQuickLoginWaitSeconds": 60, + "waitIncrementSeconds": 60, + "quickLoginCheckMilliSeconds": 1000, + "maxDeltaTimeSeconds": 43200, + "failureFactor": 30, + "clients": [ + { + "clientId": "{{ .Values.global.yonote.config.plain.data.OIDC_CLIENT_ID }}", + "secret": "{{ .Values.global.yonote.config.secret.stringData.OIDC_CLIENT_SECRET }}", + "redirectUris": [ + "https://*.{{ .Values.global.yonote.baseListenAddress }}/*", + "http://*.{{ .Values.global.yonote.baseListenAddress }}/*", + "http://app.{{ .Values.global.yonote.baseListenAddress }}/*", + "https://app.{{ .Values.global.yonote.baseListenAddress }}/*", + "https://app.{{ .Values.global.yonote.baseListenAddress }}/auth/oidc.callback/*" + ], + "baseUrl": "https://app.{{ .Values.global.yonote.baseListenAddress }}", + "enabled": true, + "publicClient": false, + "protocol": "openid-connect", + "attributes": { + "client.secret": "{{ .Values.global.yonote.config.secret.stringData.OIDC_CLIENT_SECRET }}", + "display.on.consent.screen": "true" + }, + "authenticationFlowBindingOverrides": {}, + "fullScopeAllowed": false, + "protocolMappers": [ + { + "name": "oidc-display-name", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "{{ .Values.global.yonote.config.plain.data.OIDC_DISPLAY_NAME }}", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "{{ .Values.global.yonote.config.plain.data.OIDC_DISPLAY_NAME }}", + "jsonType.label": "String" + } + } + ], + "defaultClientScopes": ["openid", "email"] + } + ], + "identityProviders": [], + "internationalizationEnabled": true, + "clientScopes": [ + { + "name": "openid", + "protocol": "openid-connect", + "attributes": { + "include.in.token.scope": "true", + "display.on.consent.screen": "true", + "consent.screen.text": "{{ .Values.global.yonote.config.plain.data.OIDC_DISPLAY_NAME }}" + }, + "protocolMappers": [] + }, + { + "name": "email", + "protocol": "openid-connect", + "attributes": { + "include.in.token.scope": "true", + "display.on.consent.screen": "true" + }, + "protocolMappers": [ + { + "id": "56fe6d23-690a-465c-bc36-99bff8fef6eb", + "name": "email verified", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-property-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "emailVerified", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "email_verified", + "jsonType.label": "boolean" + } + }, + { + "id": "2c6acd0e-b776-48f5-9c3b-7bfdbbe712dc", + "name": "email", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-property-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "email", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "email", + "jsonType.label": "String" + } + } + ] + } + ], + "browserSecurityHeaders": { + "contentSecurityPolicy": "frame-src 'self'; frame-ancestors 'self'; object-src 'none';" + }, + "webAuthnPolicyRpEntityName": "keycloak", + "webAuthnPolicySignatureAlgorithms": ["ES256"], + "webAuthnPolicyRpId": "", + "webAuthnPolicyAttestationConveyancePreference": "not specified", + "webAuthnPolicyAuthenticatorAttachment": "not specified", + "webAuthnPolicyRequireResidentKey": "not specified", + "webAuthnPolicyUserVerificationRequirement": "not specified", + "webAuthnPolicyCreateTimeout": 0, + "webAuthnPolicyAvoidSameAuthenticatorRegister": false, + "webAuthnPolicyAcceptableAaguids": [], + "webAuthnPolicyPasswordlessRpEntityName": "keycloak", + "webAuthnPolicyPasswordlessSignatureAlgorithms": ["ES256"], + "webAuthnPolicyPasswordlessRpId": "", + "webAuthnPolicyPasswordlessAttestationConveyancePreference": "not specified", + "webAuthnPolicyPasswordlessAuthenticatorAttachment": "not specified", + "webAuthnPolicyPasswordlessRequireResidentKey": "not specified", + "webAuthnPolicyPasswordlessUserVerificationRequirement": "not specified", + "webAuthnPolicyPasswordlessCreateTimeout": 0, + "webAuthnPolicyPasswordlessAvoidSameAuthenticatorRegister": false, + "webAuthnPolicyPasswordlessAcceptableAaguids": [], + "smtpServer": {} + } \ No newline at end of file diff --git a/yonote-chart-service/values.yaml b/yonote-chart-service/values.yaml index 9b129a5..abdeda4 100644 --- a/yonote-chart-service/values.yaml +++ b/yonote-chart-service/values.yaml @@ -1,13 +1,8 @@ global: name: yonote-app - postgresql: - auth: - database: yonote - username: yonote - yonote: dbMigrationEnv: production-ssl-disabled # Режим подключения к базе данных при выполнении миграций. При использовании SSL подключения, установите значение `production` - baseListenAddress: example.com + baseListenAddress: example.com # Доменный адрес для yonote config: plain: @@ -34,16 +29,24 @@ global: OIDC_DISPLAY_NAME: email OIDC_SCOPES: openid email - OIDC_CLIENT_ID: example + OIDC_CLIENT_ID: yonote OIDC_AUTH_URI: 'https://auth.example.com/realms/yonote/protocol/openid-connect/auth' + # OIDC_AUTH_URI: URL для авторизации пользователей через OpenID Connect (OIDC). + # Пользователь перенаправляется на этот адрес для входа в систему. OIDC_LOGOUT_URI: 'https://auth.example.com/realms/yonote/protocol/openid-connect/logout' + # OIDC_LOGOUT_URI: URL для выхода из системы через OIDC. + # Пользователь перенаправляется на этот адрес для завершения сессии и выхода. OIDC_TOKEN_URI: 'https://auth.example.com/realms/yonote/protocol/openid-connect/token' + # OIDC_TOKEN_URI: URL для получения токенов доступа и обновления. + # Этот адрес используется для обмена авторизационным кодом на токены OIDC_USERINFO_URI: 'https://auth.example.com/realms/yonote/protocol/openid-connect/userinfo' - + # OIDC_USERINFO_URI: URL для получения информации о пользователе. + # Используется для получения данных профиля пользователя на основе его токена. + AWS_S3_ACL: private AWS_S3_UPLOAD_BUCKET_URL: yonote-minio:9000 # Адрес S3 хранилища AWS_S3_UPLOAD_BUCKET_NAME: yonote-bucket # Имя хранилища - AWS_REGION: "" + AWS_REGION: "RU" AWS_S3_UPLOAD_MAX_SIZE: "226214400" # Максимальный размер хранилища AWS_S3_FORCE_PATH_STYLE: "false" # Следует ли принудительно использовать URL-адреса стиля пути для объектов S3 S3_PROXY_ENABLED: "false" # Включает или выключает проксирование загрузки/выгрузки файлов на S3 через бэкенд, принимает boolean @@ -81,13 +84,34 @@ ingress: namespace: yonote-onprem ingressClassName: traefik tls: - secretName: "wildcard.example.com" + secretName: "you_tls_secret" hosts: - - "*.example.com" # Если не используете wildcard, то для каждой новой команды добаляете отдельный хост и добавлеете пути, как в примере ниже - # - "test1.example.com" - # - "test2.example.com" + - "app.example.com" + - "team.example.com" rules: - - host: "*.example.com" + - host: "app.example.com" + paths: + - path: / + pathType: Prefix + service: + name: yonote-web + port: 80 + - path: /realtime + pathType: Prefix + service: + name: yonote-websockets + port: 80 + - path: /whiteboard + pathType: Prefix + service: + name: yonote-whiteboard + port: 80 + - path: /collaboration + pathType: Prefix + service: + name: yonote-collaboration + port: 80 + - host: "team.example.com" paths: - path: / pathType: Prefix @@ -109,53 +133,9 @@ ingress: service: name: yonote-collaboration port: 80 - # - host: "tesr2.example.com" - # paths: - # - path: / - # pathType: Prefix - # service: - # name: yonote-web - # port: 80 - # - path: /realtime - # pathType: Prefix - # service: - # name: yonote-websockets - # port: 80 - # - path: /whiteboard - # pathType: Prefix - # service: - # name: yonote-whiteboard - # port: 80 - # - path: /collaboration - # pathType: Prefix - # service: - # name: yonote-collaboration - # port: 80 - # - host: "test2.example.com" - # paths: - # - path: / - # pathType: Prefix - # service: - # name: yonote-web - # port: 80 - # - path: /realtime - # pathType: Prefix - # service: - # name: yonote-websockets - # port: 80 - # - path: /whiteboard - # pathType: Prefix - # service: - # name: yonote-whiteboard - # port: 80 - # - path: /collaboration - # pathType: Prefix - # service: - # name: yonote-collaboration - # port: 80 annotations: - cert-manager.io/cluster-issuer: letsencrypt.example.com + # cert-manager.io/cluster-issuer: letsencrypt.example.com # Если используете yonote-web: fullnameOverride: yonote-web @@ -509,10 +489,16 @@ yonote-collaboration: path: /_health port: app -yonote-database: +yonoteDatabase: enabled: true - fullnameOverride: yonote-db - nameOverride: db + global: + postgresql: + auth: + database: "yonote" + username: "yonote" + name: yonote-database + fullnameOverride: yonote-database + nameOverride: yonote-database primary: persistence: @@ -549,10 +535,11 @@ minio: enabled: true name: minio fullnameOverride: yonote-minio - nameOverride: minio - accessKey: "minioadmin" - secretKey: "minioadminsecret" - + nameOverride: yonote-minio + auth: + rootUser: admin + rootPassword: "12345678" + persistence: enabled: true size: 500Mi @@ -565,20 +552,101 @@ minio: pathType: ImplementationSpecific annotations: kubernetes.io/ingress.class: traefik - cert-manager.io/cluster-issuer: letsencrypt.example.com + # cert-manager.io/cluster-issuer: letsencrypt.example.com # Если используете extraTls: - hosts: - "s3.example.com" - secretName: "s3.example.com" + secretName: "you_tls_secret" - resources: - requests: - memory: 512Mi - cpu: 250m - limits: - memory: 1Gi - cpu: 500m - - buckets: - - name: yonote-bucket - policy: none \ No newline at end of file + resources: + requests: + memory: 512Mi + cpu: 250m + limits: + memory: 1Gi + cpu: 500m + +mcJob: + enabled: true + +keycloak: + auth: + adminUser: root + + fullnameOverride: yonote-keycloak + nameOverride: yonote-keycloak + + command: + - /bin/bash + - -c + - | + /opt/bitnami/keycloak/bin/kc.sh import --file=/opt/bitnami/keycloak/data/import/realm-export.json && \ + /opt/bitnami/keycloak/bin/kc.sh start-dev + + extraEnvVars: + - name: KC_DB_PASSWORD + value: "tT9BqYdNyd" + - name: KEYCLOAK_PRODUCTION + value: "true" + - name: KC_HOSTNAME_URL + value: "https://auth.example.com" + - name: KC_HOSTNAME_ADMIN_URL + value: "https://auth.example.com" + + extraVolumes: + - name: realm-export + configMap: + name: realm-export + + extraVolumeMounts: + - name: realm-export + mountPath: /opt/bitnami/keycloak/data/import/realm-export.json + subPath: realm-export.json + + ingress: + enabled: true + hostname: auth.example.com + ingressClassName: traefik + tls: true + annotations: + kubernetes.io/ingress.class: traefik + # cert-manager.io/cluster-issuer: letsencrypt.example.com # Если используете + extraTls: + - hosts: + - "auth.example.com" + secretName: "you_tls_secret" + rules: + - host: "auth.example.com" + paths: + - path: / + pathType: Prefix + service: + name: yonote-keycloak + port: http + - path: /admin + pathType: Prefix + service: + name: yonote-keycloak + port: http + + proxy: "edge" + + resources: + limits: + cpu: 500m + memory: 512Mi + requests: + cpu: 150m + memory: 128Mi + + postgresql: + enabled: true + auth: + database: keycloak + username: keycloak + name: keycloak-database + fullnameOverride: keycloak-database + nameOverride: keycloak-database + primary: + persistence: + size: 512Mi \ No newline at end of file