I discovered Opencloud a few days ago and have started exploring the application — it looks great so far, well done!
I'm planning to set up a high-availability (HA) Opencloud deployment on Kubernetes and found this Helm chart — which looks very solid overall, great work! However, I’m a bit confused by the description of the opencloud.replicas value. It states that persistence can be disabled when deploying more than one replica.
In my tests, if I disable persistence, I can indeed run multiple replicas — but when I delete a pod, the files are no longer visible in the Opencloud UI, even though they are still present in S3. So at the moment, the only reliable way would be to use RWS volumes for the data and config directory. I tested that and were able to have two replicas, but after that I can´t login to opencloud anymore and get the message Access denied.
It seems that opencloud can´t handle the sessions for already logged in users with keycloak. Do I something wrong or is this still a bug?
kubectl logs opencloud-opencloud-55c4cd5bd9-qm7t9 -f ─╯
Defaulted container "opencloud" out of: opencloud, init-config (init), init-drawio (init), init-externalsites (init), init-importer (init), init-jsonviewer (init), init-progressbars (init), init-unzip (init), init-web-extensions (init)
2025/05/28 18:58:31 Could not create config: config file already exists, use --force-overwrite to overwrite or --diff to show diff
{"level":"warn","service":"nats","time":"2025-05-28T18:58:31Z","message":"Filestore [KV_eventhistory] Stream state outdated, last block has additional entries, will rebuild"}
{"level":"warn","service":"nats","time":"2025-05-28T18:58:31Z","message":"Filestore [KV_eventhistory] Recovering stream state from index errored: prior state file"}
{"level":"warn","service":"nats","time":"2025-05-28T18:58:31Z","message":"Filestore [main-queue] Stream state outdated, last block has additional entries, will rebuild"}
{"level":"warn","service":"nats","time":"2025-05-28T18:58:31Z","message":"Filestore [main-queue] Recovering stream state from index errored: prior state file"}
{"level":"warn","service":"proxy","time":"2025-05-28T18:58:33Z","message":"basic auth enabled, use only for testing or development"}
{"level":"warn","service":"storage-system","pkg":"rhttp","time":"2025-05-28T18:58:33Z","message":"missing or incomplete nats configuration. Events will not be published."}
{"level":"warn","service":"ocm","pkg":"rhttp","time":"2025-05-28T18:58:33Z","message":"missing or incomplete nats configuration. Events will not be published."}
{"level":"warn","service":"ocm","pkg":"rhttp","traceid":"d444aed34a96e64732666d570f72aa61","time":"2025-05-28T18:58:33Z","message":"core access token not set"}
{"level":"warn","service":"ocm","pkg":"rhttp","traceid":"d444aed34a96e64732666d570f72aa61","host":"127.0.0.1","method":"GET","uri":"/","url":"/","proto":"HTTP/1.1","status":404,"size":19,"start":"28/May/2025:18:58:33 +0000","end":"28/May/2025:18:58:33 +0000","time_ns":113649,"time":"2025-05-28T18:58:33Z","message":"http"}
{"level":"warn","service":"ocm","pkg":"rhttp","traceid":"5cc2efee8d7d11f6f352755ec535fc54","time":"2025-05-28T18:58:33Z","message":"core access token not set"}
{"level":"warn","service":"ocm","pkg":"rhttp","traceid":"5cc2efee8d7d11f6f352755ec535fc54","host":"127.0.0.1","method":"GET","uri":"/","url":"/","proto":"HTTP/1.1","status":404,"size":19,"start":"28/May/2025:18:58:33 +0000","end":"28/May/2025:18:58:33 +0000","time_ns":198562,"time":"2025-05-28T18:58:33Z","message":"http"}
{"level":"warn","service":"frontend","pkg":"rhttp","traceid":"c5a63c2ab2d1e217a5521ef7ff64d9dd","time":"2025-05-28T18:58:34Z","message":"core access token not set"}
{"level":"warn","service":"frontend","pkg":"rhttp","traceid":"c5a63c2ab2d1e217a5521ef7ff64d9dd","host":"127.0.0.1","method":"GET","uri":"/","url":"/","proto":"HTTP/1.1","status":401,"size":0,"start":"28/May/2025:18:58:34 +0000","end":"28/May/2025:18:58:34 +0000","time_ns":609080,"time":"2025-05-28T18:58:34Z","message":"http"}
{"level":"warn","service":"frontend","pkg":"rhttp","traceid":"7f083b1d82e226405dd3706fb1c146ab","time":"2025-05-28T18:58:37Z","message":"core access token not set"}
{"level":"error","service":"graph","error":"LDAP Result Code 200 \"Network Error\": dial tcp [::1]:9235: connect: connection refused","time":"2025-05-28T18:58:49Z","message":"could not get ldap Connection"}
{"level":"error","service":"graph","request-id":"opencloud-opencloud-55c4cd5bd9-qm7t9/Uu2RydGzJC-000035","error":"LDAP Result Code 200 \"Network Error\": dial tcp [::1]:9235: connect: connection refused","time":"2025-05-28T18:58:49Z","message":"failed to add user"}
{"level":"error","service":"graph","request-id":"opencloud-opencloud-55c4cd5bd9-qm7t9/Uu2RydGzJC-000035","error":"generalException: failed to add user","time":"2025-05-28T18:58:49Z","message":"could not create user: backend error"}
{"level":"warn","service":"proxy","OData Error":"failed to add user","time":"2025-05-28T18:58:49Z","message":"Error Response"}
{"level":"error","service":"proxy","error":"500 Internal Server Error","time":"2025-05-28T18:58:49Z","message":"Error creating user"}
{"level":"error","service":"proxy","error":"500 Internal Server Error","time":"2025-05-28T18:58:49Z","message":"Autoprovisioning user failed"}
{"level":"error","service":"graph","error":"LDAP Result Code 200 \"Network Error\": dial tcp [::1]:9235: connect: connection refused","time":"2025-05-28T18:59:38Z","message":"could not get ldap Connection"}
{"level":"error","service":"graph","request-id":"opencloud-opencloud-55c4cd5bd9-qm7t9/Uu2RydGzJC-000066","error":"LDAP Result Code 200 \"Network Error\": dial tcp [::1]:9235: connect: connection refused","time":"2025-05-28T18:59:38Z","message":"failed to add user"}
{"level":"error","service":"graph","request-id":"opencloud-opencloud-55c4cd5bd9-qm7t9/Uu2RydGzJC-000066","error":"generalException: failed to add user","time":"2025-05-28T18:59:38Z","message":"could not create user: backend error"}
{"level":"warn","service":"proxy","OData Error":"failed to add user","time":"2025-05-28T18:59:38Z","message":"Error Response"}
{"level":"error","service":"proxy","error":"500 Internal Server Error","time":"2025-05-28T18:59:38Z","message":"Error creating user"}
{"level":"error","service":"proxy","error":"500 Internal Server Error","time":"2025-05-28T18:59:38Z","message":"Autoprovisioning user failed"}
P.S. I would change the description for the value opencloud.replicas, because it´s misleading IMHO:
Hello,
I discovered Opencloud a few days ago and have started exploring the application — it looks great so far, well done!
I'm planning to set up a high-availability (HA) Opencloud deployment on Kubernetes and found this Helm chart — which looks very solid overall, great work! However, I’m a bit confused by the description of the
opencloud.replicasvalue. It states that persistence can be disabled when deploying more than one replica.In my tests, if I disable persistence, I can indeed run multiple replicas — but when I delete a pod, the files are no longer visible in the Opencloud UI, even though they are still present in S3. So at the moment, the only reliable way would be to use RWS volumes for the data and config directory. I tested that and were able to have two replicas, but after that I can´t login to opencloud anymore and get the message
Access denied.It seems that opencloud can´t handle the sessions for already logged in users with keycloak. Do I something wrong or is this still a bug?
HA Opencloud Setup with Keycloak
Here are some pod logs:
And the error from the GUI:
Doc
P.S. I would change the description for the value
opencloud.replicas, because it´s misleading IMHO:Current:
New: