Slim CLAUDE.md from 65K to 21K by splitting app-specific docs
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>
This commit is contained in:
92
docs/palmr.md
Normal file
92
docs/palmr.md
Normal file
@@ -0,0 +1,92 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user