A stack manager that deploys from its own directory resolved ./data to an
empty folder, so Postgres initialised a blank database and the install
looked wiped. The compose defaults are absolute now, and survive a sync
that deletes an untracked .env.
The backup script asks the running container where /app/uploads comes from
rather than trusting a setting, refuses to mirror an empty folder, and
won't write a dump of an empty library over backups that have one.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
DATA_DIR takes the files and PGDATA_DIR the database, so the database can
stay on a filesystem that supports ownership when the files live on a disk
that doesn't. The example .env points both at /Volumes/Data/printhive.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The database and files now live under ./data (DATA_DIR to move them), so
they can be seen, backed up and restored without going through Docker.
tools/volumes-to-folders.sh copies an existing install's named volumes
across; it only copies, leaving the volumes in place.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- The background worker now also gives models without a thumbnail one:
an embedded 3MF/plate preview, else a picture uploaded with the model,
else a 3MF preview or picture inside one of its archives, else a render
of an STL/OBJ/3MF (loose or inside an archive).
- tools/render_thumbnail.py renders without a GPU: meshes are simplified
per distinct part (the 8M-face lion project renders in ~8 s / ~200 MB),
3MF projects show their first plate in filament colours, and only
camera-facing faces are painted (inside-out meshes and mirrored parts are
re-oriented first).
- models.thumbnail_status stops retries when there's nothing to use; adding
files clears it. The browser now only renders FBX/STEP/3DM thumbnails.
- The library checks back while fingerprints or thumbnails are pending and
refreshes when they land.
- Python sidecar needs pillow and fast-simplification; compose keeps the
archive extraction cache in a volume. README covers the phase 2 features.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- users + password_resets tables; bcrypt hashing; JWT session in an
httpOnly cookie (auth_secret auto-generated in settings)
- /api gated behind auth (except /api/config and /api/auth/*)
- First-run creates the account (no open registration after that);
login, logout, forgot/reset-password flows
- SMTP settings (host/port/secure/user/pass/from) in Settings menu;
nodemailer sends reset links
- Auth screen (sign in / create account / forgot / reset) gates the SPA;
Sign out button; COOKIE_SECURE=true in compose for HTTPS
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The 404 was a router that wouldn't load: cert resolver is named `le`
(not `letsencrypt`) and the explicit `tls=true` label was missing.
Mirror the working paperless service.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
That's the actual network Traefik runs on; was defaulting to a
non-existent `traefik` network, causing "network ... could not be found".
Still overridable via TRAEFIK_NETWORK.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add Traefik labels so the Docker provider auto-discovers the app.
Includes traefik.docker.network (the app is on two networks) which is
the usual fix for routing not resolving. Host/entrypoint/certresolver
overridable via PRINTHIVE_HOST / TRAEFIK_ENTRYPOINT / TRAEFIK_CERTRESOLVER.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Drop the published host port (it clashed on the deploy host) and attach
the app to the external Traefik network so Traefik routes to it directly.
Stable container_name printhive-app for the file provider to target;
network name configurable via TRAEFIK_NETWORK.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Host port 3000 can clash with other services on the deploy host; allow
overriding via APP_PORT (default 3000). Only needed for Traefik to reach
the app — can be dropped entirely if Traefik shares the Docker network.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Dockhand pulls the CI-built image, so drop `build: .` (no build context
on the deploy host) and add pull_policy: always.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
On push to main (and v* tags), builds the Docker image and pushes it to
the Forgejo container registry at git.plexultra.com/dlawler489/printhive
(:latest and :<short-sha>). Uses the auto-provided Actions token with
packages:write; plain docker CLI so it only needs the checkout action.
Compose image reference updated to the Forgejo registry.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Dockerfile: node:22-bookworm-slim + Python venv with trimesh for the
3MF->GLB sidecar (PYTHON_BIN env points the converter at it)
- docker-compose.yml: app + postgres 16 with healthcheck/depends_on,
named volumes for pgdata/uploads/thumbnails/glb, token env passthrough
- .dockerignore, tools/requirements.txt
- converter.js honours PYTHON_BIN (defaults to local venv)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>