Repository navigation
OpenCloud: new service - #384
Merged
Merged
Conversation
crypt0rr
approved these changes
Oct 23, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Adds OpenCloud, a self-hosted file sync and sharing platform (a fork of ownCloud Infinite Scale), as a new stack with a Tailscale sidecar. It runs the single
opencloudeu/opencloud-rolling:8.1.0container with the built-in identity provider and user directory, behind Tailscale Serve on port9200. The root README row is added in alphabetical order.The stack leaves out the add-ons of the upstream compose project that the issue lists (Collabora, Tika search, ClamAV, Radicale) and the mounted
csp.yaml,apps.yaml, and banned password list. Those are optional upstream and can follow in later PRs.Related Issues
Verification
docker compose config --quietfromservices/opencloud, with dummy values for the two required variables: exit 0, no warnings.curl --resolveto the node's Tailscale IP:/returned 200, and/.well-known/openid-configurationreturned the issuerhttps://<SERVICE>.<tailnet>.ts.net. From inside the app container, the public URL resolved and answered, which OpenCloud needs for its own login.wget --spider http://127.0.0.1:9205/healthzrun withdocker execreturns 0, and the container reportshealthy.adminwithINITIAL_ADMIN_PASSWORD, and landed on the empty Personal space of OpenCloud 8.1.0. Because the node had no Tailscale certificate (see below), this run put a throwaway self-signed TLS proxy on loopback in front of port9200and setOC_INSECURE=truein the test copy only. Tailscale Serve and its certificate were not part of this check.INITIAL_ADMIN_PASSWORDauthenticated (/graph/v1.0/mereturned 200, a wrong password 401), and a file was created and read back over WebDAV. Data survivesdocker compose downandup -d, and the second start reportsconfig file already exists, as the README says.rumdl check --config .markdownlint.yml .(0.2.78) on the whole repository, andgit diff --check origin/main.Not run:
429 too many new registrations), so the last run of the committed files used loopback inside the namespace. Earlier runs of the same stack passed over HTTPS through Serve.docker compose restart. It failed to restart the app container, because the Tailscale container is restarted at the same time and its network namespace changes.downfollowed byup -dworks.Impact on existing users
Checklist
Additional Context
TS_ACCEPT_DNS=trueis set (added after review). OpenCloud fetches its own Tailnet address from inside the container to check sign-ins, and Docker's DNS cannot resolve MagicDNS names. The earlier test host resolved it only because the host itself uses MagicDNS (100.100.100.100). The stack has no other container that needs Docker's DNS. Retested live with the pushed files: withTS_ACCEPT_DNS=falseand Docker's DNS pointed at9.9.9.9(a host without MagicDNS), the node could not resolve its own name (bad address). With the committedTS_ACCEPT_DNS=true, the namespace uses the sidecar's resolver100.100.100.100, the own name and outside names resolve, the app container fetched/.well-known/openid-configurationfrom its Tailnet address with a valid certificate, and a headless Chromium inside the namespace signed in asadminand landed on the Personal space of OpenCloud 8.1.0.1000before the first start, otherwise Docker creates them as root. The README describes this under "Before you start".TAILNET_NAMEandINITIAL_ADMIN_PASSWORDare required and empty in.env; Compose stops until they are set.