Installation
This guide walks you through installing Nexo Share using Docker Compose — a self-hosted WeTransfer alternative with app, PostgreSQL, and ClamAV.
Security notice: After first boot the default admin is
[email protected]/admin123. Change these credentials immediately before exposing the instance.
Quick Start
1. Create Installation Directory
mkdir -p ~/Nexoshare/{uploads,data,clamav}
cd ~/Nexoshare
Make sure that it has read and write permissions!
2. Create Docker Compose File
Create docker-compose.yml:
services:
nexoshare:
image: ghcr.io/minemap-nl/nexoshare:latest
container_name: nexoshare
restart: unless-stopped
ports:
- "3000:3000"
environment:
PORT: 3000
DB_HOST: postgres
DB_PORT: 5432
DB_NAME: nexoshare
DB_USER: nexoshare
DB_PASSWORD: CHANGE_THIS_PASSWORD
JWT_SECRET: CHANGE_THIS_SECRET
UPLOAD_DIR: /app/backend/uploads
APP_URL: http://localhost:3000
ALLOWED_ORIGINS: http://localhost:3000
NODE_ENV: production
TZ: UTC
APP_LOCALE: en-GB
CLAMAV_HOST: clamav
CLAMAV_PORT: 3310
volumes:
- ./uploads:/app/backend/uploads
depends_on:
postgres:
condition: service_healthy
clamav:
condition: service_healthy
postgres:
image: postgres:17-alpine
container_name: nexoshare_db
restart: unless-stopped
environment:
POSTGRES_USER: nexoshare
POSTGRES_PASSWORD: CHANGE_THIS_PASSWORD
POSTGRES_DB: nexoshare
healthcheck:
test: ["CMD-SHELL", "pg_isready -U nexoshare -d nexoshare"]
interval: 10s
timeout: 5s
retries: 5
volumes:
- ./data:/var/lib/postgresql/data
clamav:
image: clamav/clamav:latest
container_name: nexoshare_clamav
restart: unless-stopped
environment:
# Align StreamMaxLength with Settings → Max Virus Scan File Size
- CLAMD_CONF_StreamMaxLength=25M
# Archive / zip-bomb limits (see also Settings → Security in the app)
- CLAMD_CONF_MaxScanSize=100M
- CLAMD_CONF_MaxFileSize=50M
- CLAMD_CONF_MaxFiles=10000
- CLAMD_CONF_MaxRecursion=16
- CLAMD_CONF_MaxScanTime=120000
healthcheck:
test: ["CMD", "nc", "-z", "localhost", "3310"]
interval: 30s
timeout: 10s
retries: 5
start_period: 120s
volumes:
- ./clamav:/var/lib/clamav
Minimal stack: PostgreSQL is required. You can omit the
clamavservice (andCLAMAV_*env vars) for a smaller deploy without virus scanning — that works, but the compose above is what we recommend.
3. Generate Secure Credentials
Critical: Replace the default passwords and secrets!
# Generate JWT secret (copy output and paste in docker-compose.yml)
openssl rand -hex 32
# Generate database password (copy and use for DB_PASSWORD in both places)
openssl rand -base64 32
Update DB_PASSWORD and JWT_SECRET in your docker-compose.yml file.
4. Start Nexo Share
docker compose up -d
First start takes 5-10 minutes because ClamAV downloads virus definitions (~200MB).
5. Check Status
docker compose logs -f
Wait for these messages:
✅ DB Ready & Up-to-date✅ ClamAV is active and connected🚀 API on 3000
Press Ctrl+C to exit logs.
6. Access Nexo Share
Open your browser: http://localhost:3000
You’ll see the Setup Wizard on first login.
Change the default admin credentials immediately.
Email:
[email protected]
Password:admin123Do not leave these defaults on any internet-facing or shared instance.
Post-Installation
After successful startup:
1. Complete the setup wizard
2. Login with your new admin account and delete the default one
3. Configure SMTP (optional, but recommended)
4. Change default upload limits if needed
Troubleshooting
ClamAV Won’t Start
ClamAV needs ~2GB RAM. If your system has less, you can disable virus scanning in settings (not recommended for production). Keep in mind, that ClamAV keeps all files that need to be checked in memory. This means that if you upload a 10gb file for example, then you will need 10gb of ram. In this case, you will need to up ClamAV’s limits. You can also add a thresshold from which, virusscanning will be skipped, but this is not recommended. You will need to tell ClamAV the limits using the following:
clamd.conf
StreamMaxLength 2048M
MaxScanSize 2048M
MaxFileSize 2048M
or
ClamAV docker compose
environment:
- CLAMD_CONF_StreamMaxLength=2048M
- CLAMD_CONF_MaxScanSize=2048M
- CLAMD_CONF_MaxFileSize=2048M
Both are in megabytes.
Database Connection Failed
Check if PostgreSQL is ready: docker compose logs postgres
Port Already in Use
Change 3000:3000 to 8080:3000 (or any other available port) in docker-compose.yml. Make sure to change it in the APP_URL and ALLOWED_ORIGINS as well.
Application Shows “Waiting for Database”
Wait longer - database initialization can take 30-60 seconds on first start.
Next Steps
Continue to Configuration to customize Nexo Share for your organization.