simthem/privcloud-sharing

By simthem

Updated about 9 hours ago

A self-hosted file sharing platform and a secure alternative for WeTransfer.

Image
Security
Databases & storage
1

10K+

simthem/privcloud-sharing repository overview

PrivCloud_Sharing is a self-hosted file sharing platform and an alternative for WeTransfer.

For more informations -> https://github.com/Simthem/PrivCloud_Sharing

Features

  • Share files using a link
  • Unlimited file size (restricted only by disk space)
  • Set an expiration date for shares
  • Secure shares with visitor limits and passwords
  • End-to-end encryption (E2E) - Files are encrypted client-side with AES-256-GCM before upload. The server never sees the encryption key.
  • E2E encrypted reverse shares - Reverse share links include a per-share encryption key in the URL fragment. Senders encrypt files with that key, and only the reverse share creator can decrypt them.
  • Email recipients
  • Reverse shares
  • OIDC and LDAP authentication
  • Integration with ClamAV for security scans
  • Different file providers: local storage and S3

Security

PrivCloud_Sharing includes a hardened dependency tree with zero known CVEs across all three packages (backend, frontend, docs). Key upgrades:

  • Next.js 16 with @ducanh2912/next-pwa (replaces deprecated next-pwa)
  • NestJS 11 with Prisma 7 and stricter type guards
  • All transitive vulnerabilities resolved via targeted overrides
End-to-End Encryption

PrivCloud_Sharing encrypts all uploaded files client-side using AES-256-GCM via the Web Crypto API.

  • User uploads: A per-user master key (K_master) is generated on first upload and stored in the browser's localStorage. A SHA-256 hash of the key is stored server-side for verification - never the key itself. Share links include the key in the URL fragment (#key=...), which is never sent to the server.
  • Reverse share uploads: When a user creates a reverse share, a per-reverse-share key (K_rs) is generated and encrypted with K_master. The encrypted key is stored server-side. The cleartext K_rs is appended to the reverse share link via the URL fragment. Senders use K_rs to encrypt their files. Only the reverse share owner can decrypt K_rs (using their K_master) to access the uploaded files.

Get to know PrivCloud_Sharing

Setup

  1. Download the docker-compose.yaml file
  2. Run docker compose up -d

The website is now listening on http://localhost:3000, have fun with PrivCloud_Sharing!

Building from source

The Dockerfile compiles OpenSSL 3.6.2 and Node.js 24 from source to patch CVE-2026-2673 (HIGH). The first build takes ~20-30 min due to these compilation stages. Subsequent builds use Docker layer cache and are much faster.

docker compose build
# or, with explicit build args:
docker build -t privcloud-sharing .

Speed up rebuilds: you can cache the heavy compilation stages as local images so they are never recompiled unless you explicitly want to:

# Build and tag the OpenSSL stage (~5-10 min)
docker build --target openssl-builder -t my-registry/openssl-cache .

# Build and tag the Node.js stage (~15-25 min)
docker build --target node-builder -t my-registry/node-cache .

Then edit the Dockerfile and replace:

  • FROM debian:trixie-slim AS openssl-builder with FROM my-registry/openssl-cache AS openssl-builder
  • FROM debian:trixie-slim AS node-builder with FROM my-registry/node-cache AS node-builder

Node.js version: the NODE_VERSION build arg (default: 24.14.1) must match the node:24-slim base image. When upgrading the base image, update this arg accordingly.

Proxy Configuration

If your server accesses the internet through an HTTP proxy, uncomment and edit the proxy lines in docker-compose.yaml:

environment:
  - NODE_OPTIONS=--dns-result-order=ipv4first --require /opt/app/backend/node_modules/global-agent/bootstrap
  - GLOBAL_AGENT_HTTP_PROXY=http://your-proxy:3128
  - GLOBAL_AGENT_NO_PROXY=localhost,127.0.0.1,::1
  - HTTP_PROXY=http://your-proxy:3128
  - HTTPS_PROXY=http://your-proxy:3128
  - NO_PROXY=localhost,127.0.0.1,::1

If you are building the image yourself behind a proxy, also pass build args:

build:
  context: .
  args:
    HTTP_PROXY: http://your-proxy:3128
    HTTPS_PROXY: http://your-proxy:3128

Node.js does not natively honor HTTP_PROXY / HTTPS_PROXY environment variables. PrivCloud_Sharing bundles global-agent to patch http.globalAgent / https.globalAgent at runtime, so outbound requests (S3, external APIs) are properly routed through the proxy.

Environment Variables
VariableDescriptionDefault
TRUST_PROXYSet to true if a reverse proxy sits in front of the containerfalse
CADDY_DISABLEDSet to true to disable the built-in Caddy reverse proxyfalse
HTTP_PROXY / HTTPS_PROXYHTTP proxy URL for outbound connections(none)
GLOBAL_AGENT_HTTP_PROXYProxy URL for Node.js global-agent(none)
GLOBAL_AGENT_NO_PROXYComma-separated list of hosts to bypass proxy(none)
NO_PROXYComma-separated list of hosts to bypass proxy (system-level)(none)

Documentation

For more installation options and advanced configurations, please refer to the documentation.

This is a fork of Pingvin Share with some modifications since the original project is no longer maintained. The original project is licensed under the BSD 2-Clause License.

Packages and Vulnerabilities (2026-05-12)

Nothing found

Tag summary

Content type

Image

Digest

sha256:27bdd33c0

Size

212.8 MB

Last updated

about 9 hours ago

docker pull simthem/privcloud-sharing