My-Cloud

My-Cloud

Docker app from evilgenius' Repository

Overview

My Cloud is a lightweight file sharing platform in the spirit of Nextcloud/ownCloud, but with zero database setup. Multi-user accounts, a fast web file browser with previews, drag-and-drop uploads, public share links with passwords and expiry, a trash bin, and quotas - all stored as simple JSON files. Perfect for home users who don't have a ton of files and don't want to babysit a database.

☁️ My Cloud

A lightweight, self-hosted file sharing platform in the spirit of Nextcloud / ownCloud β€” but with zero database setup. Built for Unraid and other home servers, aimed at people who don't have a ton of files and don't want to babysit MySQL or Postgres.

Everything is stored as plain files:

  • Your files stay as ordinary files on disk (/data/users/<username>/files) β€” browse them with any other tool, back them up with rsync, nothing is locked inside a database blob.
  • App state (users, share links, settings) is a handful of small JSON files in /config.

Features

  • πŸ” Multi-user accounts β€” admin-managed users with bcrypt-hashed passwords, per-user storage quotas, and isolated home folders
  • πŸ“ Fast web file browser β€” grid & list views, breadcrumbs, multi-select (Ctrl/Shift-click), rename, move, copy, new folders
  • ⬆️ Drag & drop uploads β€” multiple files and whole folders, with a live progress bar; large files upload in resumable chunks that survive a dropped connection; quota enforced server-side
  • πŸ” Optional two-factor (TOTP) β€” authenticator-app codes with recovery codes, plus revocable app passwords for WebDAV
  • πŸ”— Multi-item share links β€” share a whole selection of files/folders behind one link
  • πŸ‘ Previews β€” images, video and audio (with seeking), PDFs, and text/code files
  • ✏️ Built-in text editor β€” edit notes, configs, and markdown right in the browser
  • πŸ”— Public share links β€” share any file or folder with a link; optional password, optional expiry, and optional "drop box" mode letting visitors upload into a shared folder
  • πŸ—‘ Trash bin β€” deletes go to trash first, with restore and configurable auto-purge
  • πŸ” Search β€” instant filename search across your whole home folder
  • πŸ“¦ Zip downloads β€” download any folder or multi-selection as a zip, streamed on the fly
  • πŸ–ΌοΈ Thumbnails β€” fast server-generated, disk-cached image thumbnails so photo folders load instantly
  • πŸ”Œ WebDAV β€” mount your files as a network drive in Finder, Windows Explorer, mobile apps, or rclone (/dav/, sign in with your account)
  • πŸ“± Responsive UI + installable PWA β€” works nicely on phones with automatic light/dark theme, and installs as an app ("Add to Home Screen")
  • 🧳 First-run setup β€” open the web UI once and create your admin account; that's it

Quick start (Unraid)

  1. Copy templates/my-cloud.xml into /boot/config/plugins/dockerMan/templates-user/ β€” save it as my-My-Cloud.xml (Unraid strips the my- filename prefix to label user templates in the Add Container dropdown). Or install from Community Applications once published.

    wget -O /boot/config/plugins/dockerMan/templates-user/my-My-Cloud.xml \
      https://raw.githubusercontent.com/evilgenius79/My-Cloud/main/templates/my-cloud.xml
    
  2. Map:

    • /config β†’ /mnt/user/appdata/my-cloud (settings, users, shares)
    • /data β†’ /mnt/user/my-cloud (where user files live)
    • Port 8686 β†’ any free host port
  3. Start the container, open http://your-server:8686, and create the first admin account.

Quick start (Docker / docker-compose)

git clone https://github.com/evilgenius79/My-Cloud.git
cd My-Cloud
docker compose up -d --build
# open http://localhost:8686

Quick start (bare Node.js)

Requires Node 18+.

npm install
npm run dev        # stores state in ./dev-config and ./dev-data
# open http://localhost:8686

Configuration

| Environment variable | Default | Purpose |

Environment variable Default Purpose
MYCLOUD_CONFIG_DIR /config Settings, users, shares, session secret
MYCLOUD_DATA_DIR /data User files (users/<name>/files)
MYCLOUD_PORT 8686 HTTP port
PUID / PGID 99/100 User/group that owns created files (Unraid nobody:users)
UMASK 022 Permission mask for created files
MYCLOUD_TRUST_PROXY private Which proxies to trust for client IP. Defaults to loopback/private ranges; set to a hop count (e.g. 1) only if you know your proxy chain. Never set to true on an internet-exposed install β€” it lets clients spoof their IP and defeat the login rate-limiter.
MYCLOUD_FORCE_SECURE_COOKIE off Set to 1 to force the Secure cookie flag when TLS is terminated at a proxy that doesn't send X-Forwarded-Proto.

The container runs as a non-root user (PUID:PGID) and fixes ownership of /config and /data on first start. Runtime settings (site name, default quota, trash retention) are editable from the Admin page in the UI.

How data is laid out

/config
  settings.json       # site settings
  users.json          # accounts (passwords bcrypt-hashed)
  shares.json         # public share links
  secret.key          # session-signing secret (keep private)

/data
  users/
    alice/
      files/          # alice's files β€” plain files, nothing special
      trash/          # deleted items + small .meta.json sidecars

Backing up My Cloud = backing up those two folders. Restoring = putting them back. There is no database to dump, migrate, or repair.

Security notes

  • Passwords are stored bcrypt-hashed; sessions are HMAC-signed HttpOnly cookies, revoked on password change.
  • Login attempts are rate-limited per IP and per username (so an IP-rotating spray against one account is still throttled); the whole public share surface is rate-limited too.
  • All file paths are validated server-side against directory traversal, and download paths reject symlinks that resolve outside your area.
  • Storage quotas are enforced on uploads (including anonymous drop-box shares), copies, and restores; trash counts toward quota.
  • Uploaded HTML/SVG is served sandboxed (Content-Security-Policy: sandbox, X-Content-Type-Options: nosniff) so it can't script against the app.
  • The container runs as a non-root user; images are published with build provenance and an SBOM.
  • Use HTTPS if you expose this to the internet β€” put it behind a reverse proxy (Nginx Proxy Manager, SWAG, Traefik, Caddy) with a TLS certificate, and make sure it forwards X-Forwarded-Proto (or set MYCLOUD_FORCE_SECURE_COOKIE=1). Cookies are SameSite=Lax/HttpOnly but only as safe as the transport.

Roadmap ideas

  • WebDAV endpoint for desktop sync clients
  • Server-generated thumbnails for large photo folders
  • Share links for multiple selections
  • Activity log

PRs welcome.

License

MIT

Install My-Cloud on Unraid in a few clicks.

Find My-Cloud in Community Apps on your Unraid server, review the template, and click Install. Unraid handles the Docker app or plugin setup from the published template.

Open the Apps tab on your Unraid server Search Community Apps for My-Cloud Review the template variables and paths Click Install

Related apps

Details

Repository
ghcr.io/evilgenius79/my-cloud:latest
Last Updated2026-08-03
First Seen2026-08-03

Runtime arguments

Web UI
http://[IP]:[PORT:8686]/
Network
bridge
Shell
sh
Privileged
false

Template configuration

WebUI PortPorttcp

Port for the web interface

Target
8686
Default
8686
Value
8686
ConfigPathrw

App settings, users and share links (small JSON files)

Target
/config
Default
/mnt/user/appdata/my-cloud
Value
/mnt/user/appdata/my-cloud
DataPathrw

Where user files are stored (users/username/files)

Target
/data
Default
/mnt/user/my-cloud
Value
/mnt/user/my-cloud
PUIDVariable

User ID that owns created files (Unraid default: 99 = nobody)

Default
99
Value
99
PGIDVariable

Group ID that owns created files (Unraid default: 100 = users)

Default
100
Value
100
UMASKVariable

Permission umask for created files

Default
022
Value
022