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 clamav service (and CLAMAV_* 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: admin123

Do 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

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.