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 versionshould 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=UTC2. Start Thingport
docker compose up -dThingport 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 -dTo 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 -dFor hot-reload development, see Development setup.