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 storage with WebDAV and object storage support

ReleaseOpen SourceMIT
Updated2 weeks ago
LanguageJava
Setup difficultyModerate
Stars
410
Port
8088 (HTTP API and web UI)
Docker
jmal/jmalcloud-sql:latest
Install with Docker
JmalCloud web UI - main file browser viewJmalCloud web UI - file preview or upload viewJmalCloud web UI - settings or user managementJmalCloud web UI - document editing viewJmalCloud web UI - search or sharing viewJmalCloud web UI - mobile or responsive viewJmalCloud web UI - additional feature view

What is JmalCloud?

JmalCloud is a private cloud storage project built with Java and a Vue.js frontend. You can run your own file server with support for large uploads that resume after interruption, preview of images, audio, video, documents and DWG drawings, online editing of office files through OnlyOffice, WebDAV access to mount the drive locally, and full-text search across many file types. It works with SQLite, MongoDB, MySQL or PostgreSQL for the database, and can store files on major cloud object storage services or MinIO. The server listens on port 8088 and is deployed via Docker or Docker Compose. Login supports TOTP two-factor authentication and LDAP. A public demo exists at jmal.top/demo.

Should you self-host JmalCloud?

JmalCloud scores 50/100 on selfhost.directory (how scoring works) and ranks #7 of 15 in File Storage. It has 410 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 moderate: expect some configuration beyond a single command. An official Docker image is available. It is MIT-licensed and written mostly in Java.

Its closest alternative on selfhost.directory is juicefs (73/100, 14 582 stars). It scores higher overall, so compare the two before you pick. See JmalCloud vs juicefs side by side.

Features

  • CLI upload tool
  • Custom iframe preview handlers
  • DWG drawing preview
  • File Preview
  • File storage and management
  • Full-Text Search
  • Large file upload with resumable transfer
  • LDAP Authentication
  • Multiple Database Backends
  • Object storage backends
  • Online document editingRequires separate OnlyOffice Document Server deployment
  • STUN channel / gost dynamic nodes
  • Two-factor authentication (TOTP)
  • WebDAV Support

JmalCloud README

How to install JmalCloud

Install JmalCloud with Docker

Docker Engine
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, DATABASE_HOST, DATABASE_PORT, DATABASE_NAME, DATABASE_USER, DATABASE_PASSWORD

docker run -d
--name jmalcloud
-p 8088:8088
-v ./jmalcloud/files:/jmalcloud/files
--restart always
jmal/jmalcloud-sql:latest

Simple single-container deployment with SQLite database

How to configure JmalCloud

  • DATABASE_HOSTDatabase host for MySQL/PostgreSQL

    Database host for MySQL/PostgreSQL

    values: Hostname or IP

  • DATABASE_NAMEDatabase name for MySQL/PostgreSQL

    Database name for MySQL/PostgreSQL

    values: Database name

  • DATABASE_PASSWORDDatabase password for MySQL/PostgreSQL

    Database password for MySQL/PostgreSQL

    values: Password

  • DATABASE_PORTDatabase port for MySQL/PostgreSQL

    Database port for MySQL/PostgreSQL

    values: Port number (3306 for MySQL, 5432 for PostgreSQL)

  • DATA_BASE_TYPEsqliteDatabase type: sqlite, mongodb, mysql, or postgresql

    Database type: sqlite, mongodb, mysql, or postgresql

    values: sqlite, mongodb, mysql, postgresql

  • DATABASE_USERDatabase user for MySQL/PostgreSQL

    Database user for MySQL/PostgreSQL

    values: Username

  • ENCRYPTION_SALTauto-generatedSalt value for encryption (16+ bytes recommended)

    Salt value for encryption (16+ bytes recommended)

    values: Hex string (32 chars for 16 bytes)

  • ENCRYPTION_SECRET_KEYauto-generatedKey for data encryption/decryption (32+ bytes recommended)

    Key for data encryption/decryption (32+ bytes recommended)

    values: Hex string (64 chars for 32 bytes)

  • EXACT_SEARCHfalseEnable exact search (N-Gram indexing) for file content

    Enable exact search (N-Gram indexing) for file content

    values: true or false

  • FILE_ROOT_DIR/jmalcloud/filesRoot directory for file storage

    Root directory for file storage

    values: Filesystem path

  • JVM_OPTSJVM startup arguments for memory and GC tuning

    JVM startup arguments for memory and GC tuning

    values: JVM flags (e.g., -Xms1g -Xmx4g)

  • LOG_LEVELwarnRoot logging level

    Root logging level

    values: trace, debug, info, warn, error

  • 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 to ignore in file monitoring

    Comma-separated filename prefixes to ignore in file monitoring

    values: Comma-separated prefixes

  • NGRAM_MAX_CONTENT_LENGTH_MB5Max file content length (MB) for N-Gram exact search indexing

    Max file content length (MB) for N-Gram exact search indexing

    values: Integer (e.g., 10)

  • NGRAM_MAX_SIZE6Maximum N-Gram token length for exact search

    Maximum N-Gram token length for exact search

    values: Integer

  • NGRAM_MIN_SIZE2Minimum N-Gram token length for exact search

    Minimum N-Gram token length for exact search

    values: Integer

  • PGID0Group ID for the application process, used with PUID for file permission management

    Group ID for the application process, used with PUID for file permission management

    values: Integer (e.g., 1000)

  • PUID0User ID for the application process, used for file permission management in Docker

    User ID for the application process, used for file permission management in Docker

    values: Integer (e.g., 1000)

  • RESET_ADMIN_PASSWORDfalseReset admin password to default on next startup

    Reset admin password to default on next startup

    values: true or false

  • TESS4J_DATA_PATH/jmalcloud/tess4j/datapathPath to Tess4J OCR tessdata directory for OCR feature

    Path to Tess4J OCR tessdata directory for OCR feature

    values: Filesystem path

  • TZAsia/ShanghaiApplication timezone (e.g., Asia/Shanghai, UTC)

    Application timezone (e.g., Asia/Shanghai, UTC)

    values: Valid timezone string

JmalCloud releases & version history

FAQ

What databases does JmalCloud support?

SQLite (default), MongoDB, MySQL, and PostgreSQL. Configure via DATA_BASE_TYPE environment variable.

How do I configure custom iframe preview handlers?

Provide a JSON configuration mapping file extensions to preview handler URLs with $e_url or $eb_url placeholders for the file URL.

Why can't I view Office documents after deployment?

Two common causes: 1) Reverse proxy missing 'proxy_set_header Host $http_host' when using non-standard ports. 2) OnlyOffice JWT_SECRET not configured correctly in JmalCloud settings.

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

Mount the local directory into the container under a user's folder (e.g., /jmalcloud/files/admin/doc), restart the container, then click 'Rebuild Index' in the cloud drive settings.

How do I reset the administrator password?

Set the RESET_ADMIN_PASSWORD environment variable to true, restart the container, check the logs for the new default password, then remove or set the variable to false.

More in File Storage

Rate this project

Click to rate — no account needed.

0 comments

Posting as guest
Loading comments…