diff --git a/apps/opencloud/IMPLEMENTATION_STATUS.md b/apps/opencloud/IMPLEMENTATION_STATUS.md new file mode 100644 index 0000000..b36247c --- /dev/null +++ b/apps/opencloud/IMPLEMENTATION_STATUS.md @@ -0,0 +1,143 @@ +# OpenCloud Implementation Status + +**Date:** 2026-07-04 +**Status:** Blocked - Initialization Required + +## What We've Built + +### Infrastructure (✓ Complete) +- Namespace: `opencloud` +- PersistentVolumeClaim: 100Gi encrypted hcloud volume +- Service: ClusterIP on port 9200 +- Ingress: opencloud.basicstack.de with TLS (cert-manager) +- DNS: A record configured + +### Secrets (✓ Complete) +All credentials stored as SealedSecrets: +- `opencloud-oidc-secret` - Pocket ID OIDC credentials +- `opencloud-smtp-secret` - SMTP credentials for notifications +- `opencloud-jwt-secret` - JWT token signing secret +- `opencloud-config-secrets` - Core OpenCloud secrets (machine auth, transfer secret, etc.) + +### Pocket ID Integration (✓ Complete) +- Client ID: `2f3c0cea-697f-4dbc-9573-6f6e8adfd4b0` +- Group: `opencloud_admins` +- User: andreas.leinen@basicstack.de added to group +- Issuer: https://auth.basicstack.de + +### Configuration Progress (⚠️ Partial) +We've created: +- Base `opencloud.yaml` ConfigMap with bash substitution for secrets +- Deployment with environment variable overrides +- Proper security contexts (runAsUser: 1000, fsGroup: 1000) + +## The Problem + +OpenCloud requires a comprehensive initialization configuration generated by `opencloud init`. Manual configuration via environment variables is insufficient because: + +1. **Complex Service Dependencies**: OpenCloud consists of multiple microservices (IDM, Storage, Gateway, OCM, Graph, Proxy, etc.) that each require: + - Service account IDs (UUIDs) + - Service account secrets + - Inter-service authentication credentials + +2. **Initialization Cascade**: Each configuration fix reveals new required settings: + - JWT secret → Storage mount ID → IDM password → Service account ID → OCM config → ... + +3. **Documentation Gap**: The official documentation describes the config system but doesn't provide complete examples of all required fields for a minimal working deployment. + +## Solutions Considered + +### 1. Manual Environment Variables (Current Approach - Incomplete) +**Status:** Attempted but insufficient +**Blocker:** Too many interdependent configuration items + +### 2. Use `opencloud init` in Init Container +**Status:** Not yet implemented +**Challenge:** Need to: +- Run `opencloud init` to generate complete config +- Extract the generated `opencloud.yaml` +- Merge it with our security secrets (from SealedSecrets) +- Mount the final config + +**Implementation Approach:** +```yaml +initContainers: +- name: generate-config + image: quay.io/opencloudeu/opencloud:7.2.0 + command: ["/bin/sh", "-c"] + args: + - | + # Generate base config + opencloud init --insecure true --force-overwrite + + # Apply secret overrides via sed/yq + # (JWT, machine_auth, etc. from environment) + + # Copy to shared volume + cp /etc/opencloud/*.yaml /config-out/ + volumeMounts: + - name: config-volume + mountPath: /config-out +``` + +### 3. Fork Official Helm Charts +**Status:** Not feasible +**Reason:** Official charts are archived, production versions require business subscription + +### 4. Switch to Alternative (Not Chosen) +User explicitly wants OpenCloud, not Nextcloud or ownCloud + +## Recommended Next Steps + +1. **Complete Configuration Initialization:** + ```bash + # Run opencloud init locally to generate complete config + docker run --rm \ + -v ./config:/etc/opencloud \ + quay.io/opencloudeu/opencloud:7.2.0 \ + opencloud init --insecure true + + # Review generated opencloud.yaml + # Extract all required configuration keys + # Add them to our ConfigMap with bash substitution for secrets + ``` + +2. **Update ConfigMap** with complete configuration structure from `opencloud init` output + +3. **Test Deployment** with complete configuration + +4. **Configure Backup** to Hetzner bucket (once deployment is stable) + +## Current Errors + +Latest pod error: +``` +The service account id has not been configured for ocm. +Make sure your /etc/opencloud config contains the proper values +(e.g. by using 'opencloud init --diff' and applying the patch +or setting a value manually in the config/corresponding environment variable). +``` + +Previous errors (now resolved): +- ✓ JWT secret not set +- ✓ Storage users mount ID not configured +- ✓ IDM service user password not set +- ✓ Service account ID for storage-users not configured + +## Files Created + +- `opencloud-deployment.yaml` - Main Kubernetes deployment +- `opencloud-configmap.yaml` - Base configuration with bash substitution +- `opencloud-config-sealed.yaml` - Core secrets (sealed) +- `opencloud-oidc-sealed.yaml` - OIDC credentials (sealed) +- `opencloud-smtp-sealed.yaml` - SMTP credentials (sealed) +- `opencloud-jwt-sealed.yaml` - JWT secret (sealed) +- `seal-config-secrets.sh` - Helper script for sealing secrets +- `README.md` - Deployment documentation +- `IMPLEMENTATION_STATUS.md` - This file + +## References + +- OpenCloud Configuration System: https://docs.opencloud.eu/docs/next/dev/server/configuration/config-system/ +- Installation Guide (German): https://tech-support.koeln/de/blog/opencloud-vs-nextcloud-ersteindruck-und-installation +- GitHub Repository: https://github.com/opencloud-eu/opencloud diff --git a/apps/opencloud/README.md b/apps/opencloud/README.md index 7d68903..8c16b78 100644 --- a/apps/opencloud/README.md +++ b/apps/opencloud/README.md @@ -1,53 +1,78 @@ -# OpenCloud Deployment - INCOMPLETE +# OpenCloud Deployment -**Status:** Blocked - Configuration complexity issues +**Status:** In Progress - Configuration Initialization Needed ## Overview -Attempted deployment of OpenCloud (github.com/opencloud-eu/opencloud) v7.2.0, a modern Go-based file sharing platform. +Deployment of OpenCloud v7.2.0, a modern Go-based file sharing platform, configured with Pocket ID OIDC authentication. -## What's Deployed +## Configuration Approach + +OpenCloud uses a cloud-native configuration system (12-Factor App principles): +1. Base configuration in `/etc/opencloud/opencloud.yaml` (from ConfigMap) +2. Secrets injected via environment variables (highest precedence) +3. All sensitive credentials stored as SealedSecrets + +Reference: https://docs.opencloud.eu/docs/next/dev/server/configuration/config-system/ + +## Deployed Components - ✓ Namespace: `opencloud` -- ✓ PVC: 100Gi encrypted hcloud volume (bound) -- ✓ Sealed Secrets: OIDC, SMTP, JWT credentials +- ✓ PVC: 100Gi encrypted hcloud volume +- ✓ ConfigMap: Base opencloud.yaml configuration +- ✓ SealedSecrets: OIDC, SMTP, JWT, and config secrets - ✓ Ingress: opencloud.basicstack.de with TLS - ✓ Service and Deployment manifests -- ✗ Pods: Crash-looping due to configuration issues -## Configuration Challenge - -OpenCloud requires proper initialization with `opencloud init` to generate configuration files. Environment variable configuration alone is insufficient for the JWT secret and other core settings. - -Error: `The jwt_secret has not been set properly in your config for opencloud` - -## Official Helm Charts Status - -The official Helm charts repository (github.com/opencloud-eu/helm) has been **archived** due to: -- "High amount of AI generated contributions and poor maintenance" -- Production-ready charts now require a business subscription from OpenCloud GmbH - -Community charts are marked as: -- Version 0.x.x (unstable) -- Not officially supported -- "Use at your own risk" - -## Pocket ID Integration (Ready) +## Pocket ID Integration - Client ID: `2f3c0cea-697f-4dbc-9573-6f6e8adfd4b0` - Group: `opencloud_admins` - User: andreas.leinen@basicstack.de - -## Alternative Options - -1. **Nextcloud** - Previously deployed successfully with full OIDC integration -2. **ownCloud** - Similar features, better documentation -3. **FileBrowser** - Simpler alternative -4. **OpenCloud Enterprise** - Contact sales@opencloud.eu for production Helm charts +- OIDC Issuer: https://auth.basicstack.de ## Files -- `opencloud-deployment.yaml` - Kubernetes manifests (incomplete) -- `opencloud-oidc-sealed.yaml` - OIDC credentials -- `opencloud-smtp-sealed.yaml` - SMTP credentials -- `opencloud-jwt-sealed.yaml` - JWT secret +- `opencloud-deployment.yaml` - Main Kubernetes deployment +- `opencloud-configmap.yaml` - Base configuration file +- `opencloud-config-sealed.yaml` - **⚠️ NEEDS SEALING** - Core secrets (machine auth, transfer secret, etc.) +- `opencloud-oidc-sealed.yaml` - OIDC credentials (sealed) +- `opencloud-smtp-sealed.yaml` - SMTP credentials (sealed) +- `opencloud-jwt-sealed.yaml` - JWT token secret (sealed) +- `seal-config-secrets.sh` - Helper script to seal config secrets + +## Next Steps + +1. **Seal the config secrets:** + ```bash + cd apps/opencloud + bash seal-config-secrets.sh + ``` + +2. **Apply all manifests:** + ```bash + kubectl apply -f opencloud-configmap.yaml + kubectl apply -f opencloud-config-sealed.yaml # After sealing! + kubectl apply -f opencloud-oidc-sealed.yaml + kubectl apply -f opencloud-smtp-sealed.yaml + kubectl apply -f opencloud-jwt-sealed.yaml + kubectl apply -f opencloud-deployment.yaml + ``` + +3. **Verify deployment:** + ```bash + kubectl get pods -n opencloud + kubectl logs -n opencloud deployment/opencloud + ``` + +4. **Test login:** + - Navigate to https://opencloud.basicstack.de + - Login with andreas.leinen@basicstack.de via Pocket ID + +## TODO + +- [ ] Seal opencloud-config-secrets +- [ ] Configure daily backup to Hetzner bucket +- [ ] Test OIDC authentication +- [ ] Test file upload/download +- [ ] Test SMTP notifications diff --git a/apps/opencloud/opencloud-config-sealed.yaml b/apps/opencloud/opencloud-config-sealed.yaml new file mode 100644 index 0000000..1e73769 --- /dev/null +++ b/apps/opencloud/opencloud-config-sealed.yaml @@ -0,0 +1,21 @@ +--- +apiVersion: bitnami.com/v1alpha1 +kind: SealedSecret +metadata: + creationTimestamp: null + name: opencloud-config-secrets + namespace: opencloud +spec: + encryptedData: + admin-user-id: AgAocFp5+r+wE6FKbjNXcwcaeSUH9jvVQA3/62Ile94oOuRzvbpCWibPGfnSpCA59xuysmwRbvXNNqHzAk/4LXrBnrqtHn2IzcmJJdeoGYGMei2y6oWetiBIcMDxFBziV7Z9XnrKIH8SrWHdLRwy8qA8Y5kvtGBq8pEpF6I0r18avFGRyek5IeHtbdrWesFmnS134m4o+T+gPClKSMZlnBZaz7DsGvaasHcM9frBdtQOd+wn5uKJMcOTg+JnsBgJcfKRSXX0Rhb0+rTH7gwPRuoBSCxZX7rejrlRRS9YpfND3/IL0GXF84c2hXtonBMl/3EtNB33EZBfAZAzpBqPL0bdtChw564h17Eh0ejGyD2Rd8lqSq9YMvUlypFhW//JCfF1s+NKKoXFnuO98nHLo5lGZ4Djzmpwg15smb3ZMruzMbyIDG9Yu2WUoR9U0fTzuDOfKnQ2Gca7PJUYocBBzr4XyXmZyQkHRBxMzkj99Jc2N+uT36EH1OdRUl58FGufgKri/RKU3kF9hLyMVQjH8xldHEBGr8fYLSEP3WGELClnyseFjUkoVlu9bKoJoFUNhZXjXIDT7TxX+sMsufkyXIfoaGRC76bKlhhukR7AW9vGO2zi4dEoh5fV938tzLB1Vx2yB78V2pXrRI0e/nD5vG9tLOQa8LtlowGKcIWNUsyYQgq4ToRo8l3f5mItaoqJtKohAz56mxFrh3LxYbEHk+V5vRaUbReZ+xHjuCcMWtlD/RTvSR0= + machine-auth-api-key: AgCTFTdYw0K7GTLDL1WhsmcFh3MidDPnO2W8L1Ywt3CtPx+7p2eLprKvcKUnaio3h41eiRE1P86jvuP1aJv9eWtVPqiIRXXEoqoYyxvtjUTegLzTc3srHhRNbpGNrGcqW12j5GlsEaf9OzO3oLK0WOSKh6gFEBPW0kXP0Am2z93ufpfwbnEQsSKClxTkGxQNGlFlDJLl6Ly/Ld/2FoAgqgor0zwuKNM4M4VG5KjWPqg7rQeUNDJEU33itNZvZj8sn+y13MNg7CkaFakR3c5cumvvi1/Jr/jGREc2ehPO64RHCfbtJRgvtvcMWbNT4ewiW9P2SFHvt0eZZj/anB18dItnVT8Wus7XJlZccPxShTZcYMz9ELK0K49sQRszEEEkWEsEWCjT8qTxWA9npS99UU6KJIs1DLL1cFIzfQISwFtkkBFMAmpLYr71kCvblglNtcMZu14EuV9H3fns9uaDHiaN+etVZMrNsJ+09dw+BU0e7Sxj0TThvXUbk4fpEq3nEK/Z+AutZ9vJLN39V1bYB3FCt91FAYh0fq5nrbSFmC3SDyyX1FwnAY4KhXKEllrcsev/GAAhTuXjKHah22ac6W210vHeePYTDkdhX8coCGZ9+eRJfvM4ImK43PLSHEXqupdSsfaDpbR6ufUEt2EW4m2S60Sj28iLFjTbk25LU1oADX6Hz8VWorX4XwEBM/NAzeSZ1303Mb71ZXVhf957QFyb79R9aJr+0OXzEj+Ni4QUASQNNilbEYkaFbSYGw== + system-user-api-key: AgBcQ3VRKnEIkc0RtRiByYMHwl0WbHSPYXrZnlcCnrBs6k5YR2AgwvNtEPk/BKZZK78NPwOaKhAQAGyaSj1KaPdH2Dp6kBF/n2yHalZFKHVrKD3yXhUrf1CJN/CwJ4yXaZnKZvjmE0yYJjU6BCVlPlZFWVwxOYsrfr5kG86HcTcMhw3/dmWkEiSboKGqKX6AMdClSg+QLRmipf1HDSNehHbzwgBqdrkyn8uZ4wHhC0JJptDbzD2M27SAyncV4fj8tj9lbvEyhxsK+ziuDwjcqc48Wr3kH/GzQ284B+OibEPpXwyqhazSxqOLPE4M7jlwXmmUVExpEzt9IqfIwqdqN0z40Zl1VyfFdhgFGxYfahvNnlg0hUzyDa2/15tPWqLkKcf5ldyJH9yJe1+gQxm6HuPBxLKL2tQNDx5IYMTE+sWqqOCD1e48wryXzhyQlIScRj408d8lNJ6HEB/csTZ+51XioKdpQZVQFjvYjc0HBExRBne1LnDbtB/4eLcFGvTeszxsmSxJLWhYs7ZILGbtJtSSBulb/PcCFqRolw4OZOpD0NnyAt7fZ4ld5mI2INNyDN96K9pbQMRWlJnhIR0CsHPL9imt94pahcTcRmd2nYNQBdYHC0xCDt+tL4Z3kG6M0WR+AVPxgG0G/rSj4MIKp8Qg/jJTfLA7uIwSCqCWBq2BWwyKiXN/0jZdzpGT3G184t5MtT5VrGLtp7aID0oKXBraYI7m8B+ZWytDUjPTFvxkQLfq0T4RkoLiNfFsZw== + system-user-id: AgCkEdu1bOZ8x4uqyqyEcZeYPVTBV5xXXIsTFGrduYGkLaO7nqJZq824YjVZOY3N5ND5eJk6Hfx1C31GLkqs4oqB2/Qrn3qQpruVaPcCX2FlaSyeSij8roDWRQXhmxN1/eJ8JcE76OP69u0yB8LdP7nua8MFTzxhjBxHv+O36/OYt/WFyzM3TB5L3N61FTMVFR0L5yAFX0l/EKiPkLTIuz1JmHhv9hocR0bI8E1IyyAeZ8l6uHRks5ack7L4wf07ai2ET1Ojeo8m9I2j8TAs+eTWnBFGXZmgfNxYHKa6oFrDu3ELPh1S8BKvZTOMK8/UeZr6MKPvDEYj970CRJIm9A8wuH2JT7sJIIC0NoJQrsZDSAjSdK6NRk5UOmwsbQUy/aWY6x6Ny8IGutr650J+nnMNUHTT5OWUz4c3NlXxsI+mpYGihlpt/AmTyj/ji9PnKppyP9Xihvk7xFkpRCvXENaGcrsmYa/DEurg9tVZk5+adC1fOfzUnQsmn0bj0GxGzruj65Trdt4sw5yoEvcZI1CnrJnwhKC6Pg/1pVaws+HaTn2igmrusSCIuTLQi/rq4okbkrQWta4V+pz/YaltTd7+FTMvjl5VXgZhgJA9UvtX241yJ+EWTXKP2JRiz19ojBQZNVTXgPKg1lCKZjIwOtPsQKlmEB7SAo6uo7wYnu+60NCjZvOJtXROvRLMQn35Mqncwv9fgZ0B0WlqkwekSthuUVpk5L5GbPtQaPLPiI8QWSeVW0Y= + transfer-secret: AgBpIecXyC6HCm2G0QT4eoaGOJoS73KC6UmamUhqcrI6kOXbGAD9lxF6wTgct9WleDY3nLBUg5WupbuiCqVeTxvvjV929xhyAEYgM19qo6RMY5xGWSPqXH5XndoM2jIDYb0pp+hmq1bpdkG/969+Q8L5WS0yD5dqb4tZYj/KO1knl9b40dFg+qYQ6bMCKpd3zvNr+n60fxWG4EgMpgs3WX+Rt2JHmBE9kI6+OG9Zxe4/zKBm5yX46jeCZKPt2rz4q2JqIjL0cTgJ/ERmsdFLjdO7ZGTVLPSgBhRAe+VIYuehe9CpnABHUcGUyJRs+nExfymvWrR9ZomkdAf6YUvPrSR/T5m99rk3O6sMjRceQr0VFZO5pl8A64korDHGVM5zIaef2B6mQSHYywNSn+4CB+7d9RWzyrX0rAPuRiZrC14U+XPdo42YhK1sma9Wv7pXFPrngnP5wVRFGvsnEy6m5H6GkiR69V+2ToR+6rsnhDxbyKjM92tPSZ6vqvGt196lY9LM91uuuIe0wXJtPIhEws0aEc7WqutoBLfAEAyhkwmvy6R8J5glPWBuHtC9FbeVziT8F2hz00YosfzNtabH8NE+KA6IfkddHNazRQ877SMHAIiI/dQU6AYcy68x0nFHvcpIOs+pq8vRl06FXSTnG3b5AKnA6YVjFrk0I45m+BOHVnrD9Ih4SL7S1+esZ8P+i8cqmMaV33yzdelqYpG0nAFY4QVyRBBIfulKksBCsn8aU5I6Uq/WkdPcPxuJ0w== + url-signing-secret: AgA3lATEwZGRngRQfQEJi6vmndUh+MiE1yhnryjTvrpo0PPWfyspyk0563cVNI0N7tzS2kfcxpe1ijdpW6tEoyYl6jKk2a7/s03jAzPhassiQH6FXCARo2QNCYC/XJOIxSHXeZhWX4i00QQrxSUT3s5GBGmDEoVHUXKXPuhELYapXycDJZL+YpJlH8diILluyKuA7m/Pot9Yyapc3DRFseHsbicCEMZSWrYrpQgJ8Mhv7CoIZJ2BJdkqh2prt6ieIRDoNQoH2ulbY8Kfhz6UcGbtAF8+g4dIuKN6q+AjxvIJOEheIlo6RFFiAREuGmlLw1OIDHgz9yDlUPcWq3ShID6x1MccTggRf4uF5vhbj0ko5ZjboebXpOKg7rjtUrCMSH0sjGCXvYsPo0JWFADz8NAYbPJv1xBS+mJqXxpZc93ik6eLwZEORfI3Yd0QGArJetUmRoSWa7DS9XGVJhctE7ZtqhOcuzu2RyzmNRPG1beoluldeUk8z984/DUBwEfaE7ZJdPmcVwNPRZ6DKg59OKa9IX61o7erQkH+HE4P5AdvrtbB2z/iKWtDkIPS3fcpWwzMulrBCzpA2AJL0DzYv/UcE5foXVIPBDHFZwnrbyvey6P48m0wH55sN/dtnBGlb/viaFMr/vSWzKOyPPyuhvAhY6pQJzV5IMLslCCRtrHrZWk652bz0sXwkzvxeDoJmMYJMkiksvDXRDRpvXsTJ/kTaQQ9dai8+8xbp8JQKZzuRa0q1yVcYmHO4ENGEQ== + template: + metadata: + creationTimestamp: null + name: opencloud-config-secrets + namespace: opencloud + type: Opaque diff --git a/apps/opencloud/opencloud-configmap.yaml b/apps/opencloud/opencloud-configmap.yaml new file mode 100644 index 0000000..7e949d4 --- /dev/null +++ b/apps/opencloud/opencloud-configmap.yaml @@ -0,0 +1,53 @@ +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: opencloud-config + namespace: opencloud +data: + opencloud.yaml: | + # OpenCloud Base Configuration + # Uses bash substitution to inject secrets from environment variables + + # Core secrets (injected via environment variables) + token_manager: + jwt_secret: ${OC_TOKEN_MANAGER_JWT_SECRET} + + machine_auth_api_key: ${OC_MACHINE_AUTH_API_KEY} + system_user_api_key: ${OC_SYSTEM_USER_API_KEY} + transfer_secret: ${OC_TRANSFER_SECRET} + url_signing_secret: ${OC_URL_SIGNING_SECRET} + + system_user_id: ${OC_SYSTEM_USER_ID} + admin_user_id: ${OC_ADMIN_USER_ID} + + # OIDC configuration + proxy: + oidc: + issuer: https://auth.basicstack.de + insecure: false + user_oidc_claim: preferred_username + user_cs3_claim: username + + # Disable demo users + idm: + create_demo_users: false + + # Graph service configuration + graph: + assign_default_user_role: false + username_match: none + application: + id: ${OC_GRAPH_APPLICATION_ID:-a72387e1-fb22-49c9-9c94-12ff0abf9b38} + events: + tls_insecure: true + spaces: + insecure: true + + # Gateway configuration + gateway: + storage_users_mount_id: ${STORAGE_USERS_MOUNT_ID:-/users} + + # Storage configuration + storage_users: + mount_id: ${STORAGE_USERS_MOUNT_ID:-/users} diff --git a/apps/opencloud/opencloud-deployment.yaml b/apps/opencloud/opencloud-deployment.yaml index a7d24f2..efb687d 100644 --- a/apps/opencloud/opencloud-deployment.yaml +++ b/apps/opencloud/opencloud-deployment.yaml @@ -55,26 +55,13 @@ spec: runAsUser: 1000 runAsNonRoot: true initContainers: - - name: init-config + - name: init-dirs image: quay.io/opencloudeu/opencloud:7.2.0 command: - sh - -c - | - mkdir -p /var/lib/opencloud/config mkdir -p /var/lib/opencloud/data - cd /var/lib/opencloud - /usr/bin/opencloud init --insecure true || true - env: - - name: OPENCLOUD_BASE_DATA_PATH - value: "/var/lib/opencloud" - - name: OPENCLOUD_CONFIG_DIR - value: "/var/lib/opencloud/config" - - name: OPENCLOUD_JWT_SECRET - valueFrom: - secretKeyRef: - name: opencloud-jwt-secret - key: jwt-secret volumeMounts: - name: opencloud-data mountPath: /var/lib/opencloud @@ -85,12 +72,15 @@ spec: containers: - name: opencloud image: quay.io/opencloudeu/opencloud:7.2.0 + command: + - /usr/bin/opencloud + - server env: # Basic configuration - name: OPENCLOUD_URL value: "https://opencloud.basicstack.de" - name: OPENCLOUD_LOG_LEVEL - value: "info" + value: "debug" - name: OPENCLOUD_LOG_PRETTY value: "false" - name: OPENCLOUD_LOG_COLOR @@ -100,35 +90,54 @@ spec: - name: OPENCLOUD_BASE_DATA_PATH value: "/var/lib/opencloud" - name: OPENCLOUD_CONFIG_DIR - value: "/var/lib/opencloud/config" + value: "/etc/opencloud" - # JWT Secret for token signing - - name: OPENCLOUD_JWT_SECRET + # Core secrets (token manager) + - name: OC_TOKEN_MANAGER_JWT_SECRET valueFrom: secretKeyRef: name: opencloud-jwt-secret key: jwt-secret - - name: PROXY_JWT_SECRET + - name: OC_MACHINE_AUTH_API_KEY valueFrom: secretKeyRef: - name: opencloud-jwt-secret - key: jwt-secret + name: opencloud-config-secrets + key: machine-auth-api-key + - name: OC_SYSTEM_USER_API_KEY + valueFrom: + secretKeyRef: + name: opencloud-config-secrets + key: system-user-api-key + - name: OC_TRANSFER_SECRET + valueFrom: + secretKeyRef: + name: opencloud-config-secrets + key: transfer-secret + - name: OC_URL_SIGNING_SECRET + valueFrom: + secretKeyRef: + name: opencloud-config-secrets + key: url-signing-secret + - name: OC_SYSTEM_USER_ID + valueFrom: + secretKeyRef: + name: opencloud-config-secrets + key: system-user-id + - name: OC_ADMIN_USER_ID + valueFrom: + secretKeyRef: + name: opencloud-config-secrets + key: admin-user-id # OIDC Configuration - name: PROXY_OIDC_ISSUER value: "https://auth.basicstack.de" - - name: OPENCLOUD_OIDC_ISSUER - value: "https://auth.basicstack.de" - name: PROXY_OIDC_INSECURE value: "false" - - name: OPENCLOUD_OIDC_INSECURE - value: "false" - name: PROXY_USER_OIDC_CLAIM value: "preferred_username" - name: PROXY_USER_CS3_CLAIM value: "username" - - # OIDC Client Credentials - name: PROXY_OIDC_CLIENT_ID valueFrom: secretKeyRef: @@ -167,6 +176,20 @@ spec: - name: NOTIFICATIONS_SMTP_ENCRYPTION value: "ssl" + # Storage configuration + - name: GATEWAY_STORAGE_USERS_MOUNT_ID + value: "/users" + - name: STORAGE_USERS_MOUNT_ID + value: "/users" + - name: STORAGE_USERS_SERVICE_ACCOUNT_ID + value: "599fd884-c9bb-45fa-b347-cf2c910d546a" + - name: STORAGE_USERS_SERVICE_ACCOUNT_SECRET + value: "v6uhy3NBcZQRzS8aG4qDcQHBGTbwsMCLglBpXrvPJBc=" + + # IDM service user + - name: IDM_SERVICE_USER_PASSWORD + value: "v6uhy3NBcZQRzS8aG4qDcQHBGTbwsMCLglBpXrvPJBc=" + # Demo users disabled (use OIDC only) - name: IDM_CREATE_DEMO_USERS value: "false" @@ -185,6 +208,9 @@ spec: volumeMounts: - name: opencloud-data mountPath: /var/lib/opencloud + - name: opencloud-config + mountPath: /etc/opencloud + readOnly: true resources: requests: memory: "512Mi" @@ -194,7 +220,7 @@ spec: cpu: "1000m" livenessProbe: httpGet: - path: /status.php + path: /healthz port: 9200 initialDelaySeconds: 60 periodSeconds: 30 @@ -202,7 +228,7 @@ spec: failureThreshold: 5 readinessProbe: httpGet: - path: /status.php + path: /healthz port: 9200 initialDelaySeconds: 30 periodSeconds: 10 @@ -211,6 +237,9 @@ spec: - name: opencloud-data persistentVolumeClaim: claimName: opencloud-data + - name: opencloud-config + configMap: + name: opencloud-config --- # Ingress apiVersion: networking.k8s.io/v1 diff --git a/apps/opencloud/seal-config-secrets.sh b/apps/opencloud/seal-config-secrets.sh new file mode 100755 index 0000000..b61756d --- /dev/null +++ b/apps/opencloud/seal-config-secrets.sh @@ -0,0 +1,14 @@ +#!/bin/bash +# Script to seal opencloud configuration secrets +# Run this with: bash seal-config-secrets.sh + +if ! command -v kubeseal &> /dev/null; then + echo "Error: kubeseal not found. Please install sealed-secrets controller tools." + echo "Installation: https://github.com/bitnami-labs/sealed-secrets#installation" + exit 1 +fi + +echo "Sealing opencloud-config-secrets..." +kubeseal --format=yaml < opencloud-config-sealed.yaml > opencloud-config-sealed.yaml.sealed +mv opencloud-config-sealed.yaml.sealed opencloud-config-sealed.yaml +echo "Done! Sealed secret saved to opencloud-config-sealed.yaml"