Install with Docker Compose

Thingport runs from pre-built images on the GitHub Container Registry, so there's no build step and no need to clone the repository. It works on any Docker host, including a NAS such as Synology, QNAP or Unraid.

On Unraid, TrueNAS SCALEor CasaOS? Follow the platform guide instead. They use each platform's own app-data paths and setup screens.

Requirements

  • Docker with the Compose plugin (docker compose version should work).
  • A few hundred MB of RAM for the stack: Postgres, FlareSolverr, the API and the web app. Disk space depends on the size of your library.

1. Create the files

Create a folder for Thingport, for example ~/thingport, and add these two files to it.

docker-compose.yml

services:
  db:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      - POSTGRES_USER=${POSTGRES_USER:-thingport}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-thingport}
      - POSTGRES_DB=${POSTGRES_DB:-thingport}
    volumes:
      - thingport_db:/var/lib/postgresql/data
    networks:
      - app-net
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-thingport}"]
      interval: 5s
      timeout: 5s
      retries: 10

  flaresolverr:
    image: ghcr.io/flaresolverr/flaresolverr:latest
    restart: unless-stopped
    environment:
      - LOG_LEVEL=${FLARESOLVERR_LOG_LEVEL:-info}
      - TZ=${TZ:-UTC}
    networks:
      - app-net

  backend:
    # Pin to a specific build instead of :latest, e.g.:
    #   BACKEND_IMAGE=ghcr.io/tautvydasderzinskas/thingport-backend:sha-a8fef7d
    image: ${BACKEND_IMAGE:-ghcr.io/tautvydasderzinskas/thingport-backend:latest}
    restart: unless-stopped
    environment:
      - PUID=${PUID:-1000}
      - PGID=${PGID:-1000}
      - AUTH_SECRET=${AUTH_SECRET:-changeme-secret}
      - AUTH_TOKEN_TTL=${AUTH_TOKEN_TTL:-43200}
      - PUBLIC_URL=${PUBLIC_URL:-}
      - SMTP_HOST=${SMTP_HOST:-}
      - SMTP_PORT=${SMTP_PORT:-587}
      - SMTP_SECURE=${SMTP_SECURE:-false}
      - SMTP_USER=${SMTP_USER:-}
      - SMTP_PASS=${SMTP_PASS:-}
      - SMTP_FROM=${SMTP_FROM:-Thingport <no-reply@localhost>}
      - FILE_STORAGE=/app/storage
      - DATABASE_URL=postgresql://${POSTGRES_USER:-thingport}:${POSTGRES_PASSWORD:-thingport}@db:5432/${POSTGRES_DB:-thingport}?schema=public
      - CORS_ORIGINS=${CORS_ORIGINS:-}
      - FLARESOLVERR_URL=${FLARESOLVERR_URL:-http://flaresolverr:8191/v1}
    depends_on:
      db:
        condition: service_healthy
      flaresolverr:
        condition: service_started
    volumes:
      - thingport_storage:/app/storage
    networks:
      - app-net

  # Frontend: nginx serving the built static app and reverse-proxying /api/* to the backend
  # container over the compose network (see frontend/nginx.conf) — the same single-entry-point
  # pattern as docker-compose.yml, just built from a published image instead of local source.
  frontend:
    # Pin to a specific build instead of :latest, e.g.:
    #   FRONTEND_IMAGE=ghcr.io/tautvydasderzinskas/thingport-frontend:sha-a8fef7d
    image: ${FRONTEND_IMAGE:-ghcr.io/tautvydasderzinskas/thingport-frontend:latest}
    restart: unless-stopped
    ports:
      - "${WEB_PORT:-80}:80"
    depends_on:
      - backend
    networks:
      - app-net

volumes:
  thingport_storage:
  thingport_db:

networks:
  app-net:
    driver: bridge

.env

At minimum, set AUTH_SECRET (it signs login tokens; generate one with openssl rand -hex 32) and POSTGRES_PASSWORD. Everything else has sensible defaults.

# Required
# AUTH_SECRET signs login tokens -- use your own random value
AUTH_SECRET=b1193c7014e833a063f750d6e4644d615e90e6ee81dbde619e1818e9675a3374
POSTGRES_PASSWORD=change-this-password

# Optional (defaults shown)
PUID=1000
PGID=1000
WEB_PORT=80
POSTGRES_USER=thingport
POSTGRES_DB=thingport
# e.g. https://thingport.example.com -- needed for links in verification emails
PUBLIC_URL=
# login token lifetime, in seconds
AUTH_TOKEN_TTL=43200
SMTP_HOST=
SMTP_PORT=587
SMTP_SECURE=false
SMTP_USER=
SMTP_PASS=
SMTP_FROM=Thingport <no-reply@localhost>
FLARESOLVERR_URL=http://flaresolverr:8191/v1
TZ=UTC

2. Start Thingport

docker compose up -d

Thingport is then available at http://<host>:<WEB_PORT>. The default port is 80.

3. Sign up

Open Thingport in your browser and register. The first account you register becomes the admin. Thenset up your providers so you can import from MakerWorld and Thingiverse. Printables works right away.

Updating

Pull the latest images and recreate the containers. Your database and files live in Docker volumes and are kept.

docker compose pull
docker compose up -d

To stay on a specific build, set BACKEND_IMAGE and FRONTEND_IMAGE in .env to a pinned tag, as shown in the comments in the compose file.

Building from source

To build the images yourself instead of pulling them:

git clone https://github.com/TautvydasDerzinskas/Thingport.git
cd Thingport
cp .env.example .env
docker compose up -d

For hot-reload development, see Development setup.