mirror of
https://github.com/spacedriveapp/spacedrive.git
synced 2026-04-21 06:59:17 -04:00
285 lines
7.5 KiB
Markdown
285 lines
7.5 KiB
Markdown
# Spacedrive Server
|
|
|
|
HTTP server for Spacedrive with embedded daemon (RPC only, no web UI).
|
|
|
|
## Overview
|
|
|
|
`sd-server` runs the Spacedrive daemon and exposes RPC endpoints over HTTP. Perfect for:
|
|
- **NAS deployments** (TrueNAS, Unraid, Synology, etc.)
|
|
- **Headless servers**
|
|
- **Remote access** to your Spacedrive libraries
|
|
- **Docker/container environments**
|
|
- **CLI-only usage** with `sd-cli`
|
|
|
|
## Architecture
|
|
|
|
```
|
|
┌─────────────────────────────────────────┐
|
|
│ sd-server (HTTP Server) │
|
|
│ ┌───────────────────────────────────┐ │
|
|
│ │ Axum HTTP Server (Port 8080) │ │
|
|
│ │ ├─ /health (healthcheck) │ │
|
|
│ │ └─ /rpc (proxy to daemon) │ │
|
|
│ └───────────────────────────────────┘ │
|
|
│ ↓ │
|
|
│ ┌───────────────────────────────────┐ │
|
|
│ │ Embedded Daemon │ │
|
|
│ │ (Unix socket: daemon.sock) │ │
|
|
│ │ ├─ Core VDFS │ │
|
|
│ │ ├─ Indexing │ │
|
|
│ │ ├─ P2P Networking │ │
|
|
│ │ └─ File Operations │ │
|
|
│ └───────────────────────────────────┘ │
|
|
└─────────────────────────────────────────┘
|
|
```
|
|
|
|
Unlike Tauri (desktop app), the server:
|
|
- Embeds the daemon instead of spawning a separate process
|
|
- Provides only RPC endpoints (no bundled web UI)
|
|
- Proxies RPC requests to daemon via Unix socket
|
|
- Provides basic auth for security
|
|
|
|
## Quick Start
|
|
|
|
### Development (without Docker)
|
|
|
|
1. **Build the server:**
|
|
```bash
|
|
cargo build -p sd-server
|
|
```
|
|
|
|
2. **Run the server:**
|
|
```bash
|
|
# Development mode (creates temp data dir)
|
|
cargo run -p sd-server
|
|
|
|
# Production mode (requires DATA_DIR)
|
|
DATA_DIR=/path/to/data cargo run -p sd-server --release
|
|
```
|
|
|
|
3. **Access the RPC endpoint:**
|
|
- Health check: http://localhost:8080/health
|
|
- RPC endpoint: http://localhost:8080/rpc
|
|
- Default auth: disabled in dev mode
|
|
|
|
### Docker Deployment (Recommended)
|
|
|
|
Perfect for TrueNAS, Unraid, or any Docker-compatible NAS.
|
|
|
|
1. **Create a `.env` file:**
|
|
```bash
|
|
# REQUIRED: Set your credentials
|
|
SD_AUTH=admin:your-secure-password
|
|
|
|
# Optional: Change port
|
|
PORT=8080
|
|
|
|
# Optional: Disable auth (NOT RECOMMENDED)
|
|
# SD_AUTH=disabled
|
|
```
|
|
|
|
2. **Start with docker-compose:**
|
|
```bash
|
|
cd apps/server
|
|
docker-compose up -d
|
|
```
|
|
|
|
3. **Access the server:**
|
|
- Navigate to `http://your-nas-ip:8080`
|
|
- Login with credentials from `.env`
|
|
|
|
## Configuration
|
|
|
|
### Environment Variables
|
|
|
|
| Variable | Description | Default | Required |
|
|
|----------|-------------|---------|----------|
|
|
| `DATA_DIR` | Path to Spacedrive data directory | `/data` (in Docker) | Yes (production) |
|
|
| `PORT` | HTTP server port | `8080` | No |
|
|
| `SD_AUTH` | Authentication credentials (format: `user:pass,user2:pass2`) | None | Recommended |
|
|
| `SD_P2P` | Enable P2P networking | `true` | No |
|
|
| `RUST_LOG` | Log level | `info,sd_core=debug` | No |
|
|
|
|
### Authentication
|
|
|
|
**IMPORTANT:** Always set `SD_AUTH` in production!
|
|
|
|
```bash
|
|
# Single user
|
|
SD_AUTH=admin:securepassword123
|
|
|
|
# Multiple users
|
|
SD_AUTH=admin:pass1,user:pass2,readonly:pass3
|
|
|
|
# Disable (NOT RECOMMENDED - only for trusted networks)
|
|
SD_AUTH=disabled
|
|
```
|
|
|
|
Uses HTTP Basic Authentication. The server will return `401 Unauthorized` if credentials don't match.
|
|
|
|
### Data Storage
|
|
|
|
The server stores all data in `DATA_DIR`:
|
|
```
|
|
$DATA_DIR/
|
|
├── daemon/
|
|
│ └── daemon.sock # Unix socket for RPC
|
|
├── libraries/
|
|
│ └── *.sdlibrary/ # Library databases
|
|
├── logs/ # Application logs
|
|
└── current_library_id.txt # Last opened library
|
|
```
|
|
|
|
**Docker volumes:** Mounted at `/data` inside the container.
|
|
|
|
## TrueNAS Setup
|
|
|
|
### Using TrueNAS SCALE (Docker)
|
|
|
|
1. **Navigate to Apps** in TrueNAS web UI
|
|
2. **Click "Launch Docker Image"**
|
|
3. **Configure:**
|
|
- **Image:** Build locally or use pre-built image
|
|
- **Port:** Map `8080` to host
|
|
- **Volume:** Mount `/mnt/pool/spacedrive` to `/data`
|
|
- **Environment:**
|
|
- `SD_AUTH=admin:yourpassword`
|
|
- `TZ=America/New_York` (your timezone)
|
|
|
|
4. **Add storage pools** (optional):
|
|
- Mount your datasets as read-only volumes
|
|
- Example: `/mnt/tank/photos` → `/photos` in container
|
|
|
|
### Manual Docker Run
|
|
|
|
```bash
|
|
docker run -d \
|
|
--name spacedrive \
|
|
-p 8080:8080 \
|
|
-p 7373:7373 \
|
|
-v /mnt/pool/spacedrive:/data \
|
|
-v /mnt/pool/media:/media:ro \
|
|
-e SD_AUTH=admin:password \
|
|
-e TZ=UTC \
|
|
--restart unless-stopped \
|
|
spacedrive/server:latest
|
|
```
|
|
|
|
## Building
|
|
|
|
```bash
|
|
# Build server (RPC only)
|
|
cargo build --release -p sd-server
|
|
|
|
# Run server
|
|
./target/release/sd-server --data-dir /path/to/data
|
|
```
|
|
|
|
You can connect with:
|
|
- `sd-cli` (CLI client)
|
|
- Custom HTTP clients via `/rpc`
|
|
- Tauri desktop app configured to connect to this server
|
|
- Future web UI (not yet implemented)
|
|
|
|
## Development Workflow
|
|
|
|
```bash
|
|
# Run server in dev mode
|
|
cargo run -p sd-server
|
|
|
|
# Server starts on http://localhost:8080
|
|
# Use sd-cli or custom client to interact with RPC endpoint
|
|
```
|
|
|
|
## API Endpoints
|
|
|
|
### `GET /health`
|
|
Health check endpoint.
|
|
|
|
**Response:** `200 OK` with body `"OK"`
|
|
|
|
### `POST /rpc`
|
|
JSON-RPC proxy to daemon.
|
|
|
|
**Request:**
|
|
```json
|
|
{
|
|
"jsonrpc": "2.0",
|
|
"id": 1,
|
|
"method": "query:libraries.list",
|
|
"params": { "include_stats": false }
|
|
}
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"jsonrpc": "2.0",
|
|
"id": 1,
|
|
"result": [...]
|
|
}
|
|
```
|
|
|
|
|
|
## Comparison: Server vs Tauri
|
|
|
|
| Feature | Server | Tauri |
|
|
|---------|--------|-------|
|
|
| **Platform** | Linux/Docker | macOS/Windows/Linux |
|
|
| **UI** | None (RPC only) | Native webview |
|
|
| **Daemon** | Embedded in process | Spawned as child process |
|
|
| **Access** | Remote over HTTP | Local only |
|
|
| **Auth** | HTTP Basic Auth | Not needed (local) |
|
|
| **Use Case** | NAS, headless servers, CLI | Desktop workstations |
|
|
|
|
Both use the same Spacedrive core!
|
|
|
|
## Troubleshooting
|
|
|
|
### Server won't start
|
|
- Check `DATA_DIR` exists and is writable
|
|
- Verify port 8080 is not in use: `lsof -i :8080`
|
|
- Check logs: `RUST_LOG=debug cargo run -p sd-server`
|
|
|
|
### Can't connect to daemon
|
|
- Ensure `daemon.sock` exists in `$DATA_DIR/daemon/`
|
|
- Check daemon logs in `$DATA_DIR/logs/`
|
|
- Try removing stale socket: `rm $DATA_DIR/daemon/daemon.sock`
|
|
|
|
### Authentication failing
|
|
- Verify `SD_AUTH` format: `username:password`
|
|
- Check browser is sending Basic Auth header
|
|
- Test with curl:
|
|
```bash
|
|
curl -u admin:password http://localhost:8080/health
|
|
```
|
|
|
|
### Docker build failing
|
|
- Ensure you're building from repository root:
|
|
```bash
|
|
docker build -f apps/server/Dockerfile .
|
|
```
|
|
- Check Docker has enough memory (4GB+ recommended)
|
|
|
|
## Contributing
|
|
|
|
The server app is part of the Spacedrive v2 monorepo.
|
|
|
|
**Project structure:**
|
|
```
|
|
apps/server/
|
|
├── src/
|
|
│ └── main.rs # Server implementation
|
|
├── Cargo.toml # Dependencies
|
|
├── Dockerfile # Container image
|
|
└── docker-compose.yml # Docker setup
|
|
```
|
|
|
|
**Making changes:**
|
|
1. Server code: Edit `apps/server/src/main.rs`
|
|
2. Daemon integration: See `core/src/infra/daemon/`
|
|
|
|
## License
|
|
|
|
AGPL-3.0 - See LICENSE file in repository root.
|