diff --git a/templates/opencloud/assets/logo.svg b/templates/opencloud/assets/logo.svg new file mode 100644 index 000000000..08f2fecc5 --- /dev/null +++ b/templates/opencloud/assets/logo.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/templates/opencloud/assets/screenshot.png b/templates/opencloud/assets/screenshot.png new file mode 100644 index 000000000..b283124a5 Binary files /dev/null and b/templates/opencloud/assets/screenshot.png differ diff --git a/templates/opencloud/index.ts b/templates/opencloud/index.ts new file mode 100644 index 000000000..e6267f256 --- /dev/null +++ b/templates/opencloud/index.ts @@ -0,0 +1,70 @@ +import { Output, randomPassword, Services } from "~templates-utils"; +import { Input } from "./meta"; + +export function generate(input: Input): Output { + const services: Services = []; + const adminPassword = input.adminPassword || randomPassword(); + + const startupScript = `#!/bin/sh +opencloud init || true +opencloud server +`; + + services.push({ + type: "app", + data: { + serviceName: input.appServiceName, + source: { + type: "image", + image: input.appServiceImage, + }, + env: [ + `OC_URL=https://$(PRIMARY_DOMAIN)`, + `IDM_ADMIN_PASSWORD=${adminPassword}`, + `OC_LOG_LEVEL=info`, + `OC_LOG_COLOR=false`, + `OC_LOG_PRETTY=false`, + `PROXY_TLS=false`, + `OC_INSECURE=false`, + `PROXY_ENABLE_BASIC_AUTH=false`, + `IDM_CREATE_DEMO_USERS=false`, + `OC_SHARING_PUBLIC_SHARE_MUST_HAVE_PASSWORD=true`, + `OC_SHARING_PUBLIC_WRITEABLE_SHARE_MUST_HAVE_PASSWORD=false`, + `OC_PASSWORD_POLICY_DISABLED=false`, + `OC_PASSWORD_POLICY_MIN_CHARACTERS=8`, + `OC_PASSWORD_POLICY_MIN_LOWERCASE_CHARACTERS=1`, + `OC_PASSWORD_POLICY_MIN_UPPERCASE_CHARACTERS=1`, + `OC_PASSWORD_POLICY_MIN_DIGITS=1`, + `OC_PASSWORD_POLICY_MIN_SPECIAL_CHARACTERS=1`, + ].join("\n"), + deploy: { + command: "/bin/sh /start.sh", + }, + mounts: [ + { + type: "file", + content: startupScript, + mountPath: "/start.sh", + }, + { + type: "volume", + name: "config", + mountPath: "/etc/opencloud", + }, + { + type: "volume", + name: "data", + mountPath: "/var/lib/opencloud", + }, + ], + domains: [ + { + host: "$(EASYPANEL_DOMAIN)", + port: 9200, + }, + ], + }, + }); + + return { services }; +} diff --git a/templates/opencloud/meta.yaml b/templates/opencloud/meta.yaml new file mode 100644 index 000000000..b450b0da9 --- /dev/null +++ b/templates/opencloud/meta.yaml @@ -0,0 +1,87 @@ +name: OpenCloud +description: + OpenCloud is an open-source, GDPR-compliant platform for self-hosted file + management, sharing, and collaboration. Built with a Go backend, it provides a + full cloud-storage experience with WebDAV access, Spaces (team folders), + fine-grained sharing controls, file versioning, and activity tracking. An + embedded LibreGraph Connect OIDC identity provider handles authentication with + no external database required — all user accounts and data are stored on the + filesystem. Optional integrations include Collabora Online for real-time + document editing and a bundled Radicale server for CalDAV/CardDAV. +instructions: + After deployment open the app URL. Log in with username "admin" and the + password you set in IDM_ADMIN_PASSWORD. Change the admin password immediately + from Settings after first login — the IDM_ADMIN_PASSWORD variable is only read + on the very first start. +changeLog: + - date: 2026-07-02 + description: first release +links: + - label: Website + url: https://opencloud.eu + - label: Documentation + url: https://docs.opencloud.eu + - label: GitHub + url: https://github.com/opencloud-eu/opencloud +contributors: + - name: Ahson Shaikh + url: https://github.com/Ahson-Shaikh +schema: + type: object + required: + - appServiceName + - appServiceImage + properties: + appServiceName: + type: string + title: App Service Name + default: opencloud + appServiceImage: + type: string + title: App Service Image + default: opencloudeu/opencloud:7.2.0 + adminPassword: + type: string + title: Admin Password + default: "" + description: Autogenerated if not provided. +benefits: + - title: No External Database + description: + Stores all configuration, user accounts, and files in the filesystem via a + built-in identity manager — nothing to provision or maintain externally. + - title: GDPR-Compliant by Design + description: + Designed for European data sovereignty requirements. All data stays on + your infrastructure with no telemetry or third-party data transfers. + - title: WebDAV and Spaces + description: + Mount your OpenCloud storage as a network drive via WebDAV, and use Spaces + to create shared team folders with fine-grained access control. +features: + - title: File Management and Sharing + description: + Upload, organize, preview, and share files and folders with per-link + passwords and expiry dates. Public and internal share links are supported. + - title: Versioning and Activity Tracking + description: + Automatically keeps file version history and shows per-file activity logs + so you can track who changed what and when. + - title: Embedded OIDC Identity Provider + description: + LibreGraph Connect ships inside the container and manages user accounts + without requiring a separate Keycloak or other IdP deployment. + - title: Favorites and Trash + description: + Mark frequently accessed files as favorites and recover deleted files from + the trash before they are permanently removed. + - title: Collabora Online Support + description: + Optionally connect a self-hosted Collabora Online instance for in-browser + editing of Writer, Calc, and Impress documents. +tags: + - Storage + - File Sharing + - Collaboration + - WebDAV + - Self-Hosted