Move OpenClaw, Palmr, MinIO, JSX publishing, MCP configs, and migration candidates into dedicated docs/ files. Keep only DevOps-essential content inline (deployment rules, DNS, router, credentials, troubleshooting). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
93 lines
3.4 KiB
Markdown
93 lines
3.4 KiB
Markdown
# 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.
|