# Palmr (File Sharing - Dropbox Alternative) Self-hosted file sharing platform (like WeTransfer/Dropbox) for sending and receiving files. ## Access | Property | Value | |----------|-------| | **Public URL** | `https://alezmad-nuc.tail58f5ad.ts.net:8443` | | **Local URL** | `http://192.168.1.3:3334` | | **Login page** | `/login` | | **Container** | `palmr` | | **Image** | `kyantech/palmr:latest` | | **Network** | `coolify` (IP: `10.0.1.5`) | ## Users | Username | Email | Password | Admin | |----------|-------|----------|-------| | `alezmad` | `agutierrez@mineryreport.com` | *(set via UI)* | Yes | | `michi` | `michi@nuc.lan` | `FlexiCar2025.` | No | ## Architecture ``` External Browser → Funnel :8443 → 127.0.0.1:3334 → container:5487 (Next.js frontend) Funnel :10000 → 127.0.0.1:9379 → container:9379 (MinIO uploads) ↑ via port-fwd-palmr-minio ``` Palmr uses **presigned URLs** for file uploads — the browser uploads directly to MinIO, NOT through the backend. This means MinIO MUST be reachable from the client's browser. ## Key Environment Variables | Variable | Value | Purpose | |----------|-------|---------| | `STORAGE_URL` | `https://alezmad-nuc.tail58f5ad.ts.net:10000` | Public MinIO URL for presigned upload URLs | | `API_BASE_URL` | `http://127.0.0.1:3333` | Internal backend API (Next.js → Fastify) | ## Volume Mounts | Volume | Mount Point | Contents | |--------|-------------|----------| | `5273abd0c...` (anonymous) | `/app/server` | SQLite DB, MinIO data, credentials | | `palmr_uploads` | `/app/uploads` | Uploaded files | ## Container Recreation ```bash ssh nuc "docker stop palmr && docker rm palmr && docker run -d \ --name palmr \ --network coolify \ --restart unless-stopped \ -p 3334:5487 \ -v 5273abd0c536116056362397cdb568d2eab066b8289412dd91ecce58c174df68:/app/server \ -v palmr_uploads:/app/uploads \ -e STORAGE_URL=https://alezmad-nuc.tail58f5ad.ts.net:10000 \ kyantech/palmr:latest" ``` ## Port Forwarder (MinIO) MinIO runs inside the Palmr container on port 9379 (not exposed). A socat forwarder bridges it: ```bash ssh nuc "docker run -d --name port-fwd-palmr-minio --network coolify -p 9379:9379 \ alpine/socat tcp-listen:9379,fork,reuseaddr tcp-connect:palmr:9379" ``` ## Database Access Palmr uses SQLite at `/app/server/prisma/palmr.db`. Passwords are **bcrypt** hashed. ```bash # Copy DB locally for queries ssh nuc "docker cp palmr:/app/server/prisma/palmr.db /tmp/palmr.db" scp nuc:/tmp/palmr.db /tmp/palmr.db sqlite3 /tmp/palmr.db "SELECT username, email, isAdmin FROM users;" # Generate bcrypt hash inside container ssh nuc "docker exec palmr sh -c 'cd /app/palmr-app && node -e \"const bcrypt = require(\\\"bcryptjs\\\"); console.log(bcrypt.hashSync(\\\"PASSWORD\\\", 10));\"'" ``` ## Troubleshooting 1. **Upload stuck on loader**: Check `docker logs palmr` for `STORAGE_URL` errors. MinIO must be reachable from the client browser via the presigned URL. 2. **Blank page externally**: Verify Funnel is on a supported port (443/8443/10000) and target uses `127.0.0.1` not `localhost`. 3. **JWT token invalid after restart**: Expected — users must log in again after container recreation (JWT secret regenerated). 4. **Config limits**: File size and storage limits are in `app_configs` table (values in bytes). Update via SQLite, copy DB back, restart.