selfhost.directory

The index of self-hostable projects — ranked, categorized and served with live updates.
Own your data and stop giving it to big tech.

JmalCloud logo

Self-host JmalCloud

v2.16.9

Private cloud drive with WebDAV, previews and online editing

ReleaseOpen SourceMIT
docker run -d --name jmalcloud -p 8088:8088 -v /opt/jmalcloud:/jmalcloud/files --restart always jmal/jmalcloud-sql:latest
Updated2 months ago
LanguageJavaScript
Setup difficultyEasy
Stars
881
Ports
8088 (JmalCloud web app (docker run mapping 8088:8088)), 7070 (Web UI address used by the README's docker compose deployment)
Docker
jmal/jmalcloud-sql
JmalCloud web UI file listing screenCloud drive interface showing files and foldersDrive UI view of stored media contentDocument management screen in the web appFile preview inside the driveSettings and administration screenAdditional screen of the JmalCloud drive UIOnlyOffice integration settings form inside JmalCloud

What is JmalCloud?

JmalCloud is a private cloud storage drive you run on your own server, aimed at people who want full control of their files. It previews images, audio, video, PDF and Office documents, opens DWG drawings, and lets you edit Word, Excel, PPT, flowchart and mind-map files in the browser alongside a built-in plain-text editor. Uploads cover very large files and can resume after an interruption, and WebDAV support lets client apps map the drive into their own filesystems. Searching covers text, PDF and Office content; an optional N-Gram mode indexes exact phrases inside files, and OCR of image text is available when a tessdata path is configured. Storage backends include MinIO plus the OSS and COS object services from Alibaba Cloud and Tencent Cloud, while application data can live in SQLite, MongoDB, MySQL or PostgreSQL (a migration switch moves Mongo data to SQL). Operators usually run the jmal/jmalcloud-sql container with Docker Compose on port 8088; OnlyOffice and Syncthing are documented companion containers, and LDAP, two-step verification and direct share links exist in the app settings. The jmal-cloud-view repository is the Vue web frontend that pairs with the Java server, releases are in the 2.16.x line under MIT, and iOS, Android and desktop clients are still on the to-do list.

Should you self-host JmalCloud?

JmalCloud scores 48/100 on selfhost.directory (how scoring works) and ranks #10 of 11 in Cloud Storage. It has 881 GitHub stars.

It shipped 9 stable releases in the past year. The latest, v2.16.9, came out on 4 August 2026. New versions land roughly every 2 weeks.

Setup is easy: most people get it running in one sitting. An official Docker image is available. It is MIT-licensed and written mostly in JavaScript.

Its closest alternative on selfhost.directory is SeaweedFS (81/100, 35 791 stars). It scores higher overall, so compare the two before you pick. See JmalCloud vs SeaweedFS side by side.

Features

  • DWG file preview
  • Exact content search (N-Gram index)Disabled by default (EXACT_SEARCH=false)
  • File Preview
  • Full-Text Search
  • Iframe preview
  • Local directory mount
  • Multiple Database Backends
  • Object storage backends
  • OCR image text recognition
  • Online document editing
  • Resumable large file upload
  • Text Editor
  • WebDAV

JmalCloud README

How to install JmalCloud

Install JmalCloud with Docker

Environment variables
PUID, PGID, TZ, JVM_OPTS, MONGODB_URI, TESS4J_DATA_PATH, EXACT_SEARCH, NGRAM_MAX_CONTENT_LENGTH_MB, NGRAM_MIN_SIZE, NGRAM_MAX_SIZE, FILE_ROOT_DIR, MONITOR_IGNORE_FILE_PREFIX, LOG_LEVEL, ENCRYPTION_SECRET_KEY, ENCRYPTION_SALT, RESET_ADMIN_PASSWORD, DATA_BASE_TYPE, MIGRATION
docker run -d \
  --name jmalcloud \
  -p 8088:8088 \
  -v /opt/jmalcloud:/jmalcloud/files \
  --restart always \
  jmal/jmalcloud-sql:latest

访问 http://your-domain-or-ip:8088 即可使用。

How to configure JmalCloud

  • DATABASE_HOSTHost of the MySQL/PostgreSQL database (with DATABASE_PORT, DATABASE_NAME, DATABASE_USER, DATABASE_PASSWORD).

    Host of the MySQL/PostgreSQL database (with DATABASE_PORT, DATABASE_NAME, DATABASE_USER, DATABASE_PASSWORD).

  • DATA_BASE_TYPEsqliteDatabase type used for application data.

    Database type used for application data.

    values: sqlite, mongodb, mysql, postgresql

  • ENCRYPTION_SALTSalt used in encryption; generated automatically when empty, unique salt per instance recommended.

    Salt used in encryption; generated automatically when empty, unique salt per instance recommended.

    values: Random string (openssl rand -hex 16)

  • ENCRYPTION_SECRET_KEYKey for encrypting/decrypting data; generated automatically into /jmalcloud/files/.env when empty. Changing it invalidates direct links, MFA, OSS, LDAP and OnlyOffice settings.

    Key for encrypting/decrypting data; generated automatically into /jmalcloud/files/.env when empty. Changing it invalidates direct links, MFA, OSS, LDAP and OnlyOffice settings.

    values: Random string (openssl rand -hex 32)

  • EXACT_SEARCHfalseEnable exact in-file content search using an N-Gram index (more memory, CPU and disk).

    Enable exact in-file content search using an N-Gram index (more memory, CPU and disk).

    values: true / false

  • FILE_ROOT_DIR/jmalcloud/filesRoot directory where user files are stored and read.

    Root directory where user files are stored and read.

    values: Path

  • JVM_OPTSJVM start-up options (memory, GC). With EXACT_SEARCH=true, -Xmx of at least 4g is suggested.

    JVM start-up options (memory, GC). With EXACT_SEARCH=true, -Xmx of at least 4g is suggested.

    values: e.g. -Xms1g -Xmx4g

  • LOG_LEVELwarnRoot log output level (trace, debug, info, warn, error).

    Root log output level (trace, debug, info, warn, error).

    values: trace, debug, info, warn, error

  • MIGRATIONfalseMigrate data from MongoDB to sqlite, mysql or postgresql on startup.

    Migrate data from MongoDB to sqlite, mysql or postgresql on startup.

    values: true / false

  • MONGODB_URImongodb://mongo:27017/jmalcloudMongoDB connection URI.

    MongoDB connection URI.

    values: mongodb://[user:pass@]host[:port]/db

  • MONITOR_IGNORE_FILE_PREFIX.DS_Store,._Comma-separated filename prefixes the file watcher should ignore.

    Comma-separated filename prefixes the file watcher should ignore.

    values: CSV of prefixes

  • NGRAM_MAX_CONTENT_LENGTH_MB5Maximum document text length (MB) covered by the N-Gram exact search index.

    Maximum document text length (MB) covered by the N-Gram exact search index.

    values: Integer

  • NGRAM_MAX_SIZE6Maximum token length for N-Gram exact search.

    Maximum token length for N-Gram exact search.

    values: Integer

  • NGRAM_MIN_SIZE2Minimum token length for N-Gram exact search.

    Minimum token length for N-Gram exact search.

    values: Integer

  • PGID0Group ID the application process runs as, used with PUID.

    Group ID the application process runs as, used with PUID.

    values: Integer

  • PUID0User ID the application process runs as, for file permission management.

    User ID the application process runs as, for file permission management.

    values: Integer

  • RESET_ADMIN_PASSWORDfalseWhen true, the admin password is reset to the default on next startup.

    When true, the admin password is reset to the default on next startup.

    values: true / false

  • TESS4J_DATA_PATH/jmalcloud/tess4j/datapathtessdata directory for the Tess4J OCR engine; required for image text recognition.

    tessdata directory for the Tess4J OCR engine; required for image text recognition.

    values: Path, e.g. /usr/share/tessdata

  • TZAsia/ShanghaiApplication timezone, passed to the Java app through -Duser.timezone.

    Application timezone, passed to the Java app through -Duser.timezone.

    values: e.g. UTC, America/New_York

JmalCloud releases & version history

FAQ

How do I add a local directory to the cloud disk?

Bind-mount the folder under a user's directory inside the container (for example /jmalcloud/files/admin/doc) in docker-compose.yml, restart the container, then rebuild the index.

How do I reset the administrator password?

Set the RESET_ADMIN_PASSWORD environment variable to true; on the next start the admin password becomes the default jmalcloud. Remove it or set it back to false afterwards so it is not reset again.

More in Cloud Storage

Rate this project

Click to rate — no account needed.

0 comments

Posting as guest
Loading comments…