---
title: "Linux Deployment"
description: "Deploy Spacedrive CLI and daemon on Linux systems"
---

## Overview

The Spacedrive daemon and CLI can be deployed on Linux systems in several ways:
- **Docker** - Recommended for easy deployment and isolation
- **Native binaries** - Direct installation for TrueNAS, Raspberry Pi, and other Linux systems
- **Systemd service** - Auto-start on boot with native binaries

## Docker Deployment

### Prerequisites

- Docker 20.10+ or Docker Engine
- Docker Compose (optional, but recommended)

### Quick Start with Docker Compose

1. **Create docker-compose.yml**:

```yaml
version: '3.8'

services:
  spacedrive:
    image: spacedrive:latest
    container_name: spacedrive-daemon
    restart: unless-stopped
    volumes:
      - spacedrive-data:/data
      # Mount directories to index
      - /path/to/your/files:/mnt/files:ro
    environment:
      - SPACEDRIVE_DATA_DIR=/data

volumes:
  spacedrive-data:
```

2. **Build and start**:

```bash
# Build the image
docker compose build

# Start the daemon
docker compose up -d

# View logs
docker compose logs -f
```

### Docker CLI Commands

```bash
# Build image
docker build -t spacedrive:latest .

# Run daemon
docker run -d \
  --name spacedrive-daemon \
  --restart unless-stopped \
  -v spacedrive-data:/data \
  -v /path/to/files:/mnt/files:ro \
  spacedrive:latest

# View status
docker exec spacedrive-daemon sd-cli status

# View logs
docker logs -f spacedrive-daemon

# Execute CLI commands
docker exec spacedrive-daemon sd-cli library list
```

### Multi-Architecture Support

The Dockerfile supports both x86_64 and ARM64:

```bash
# Build for ARM64 (Raspberry Pi)
docker build --platform linux/arm64 -t spacedrive:arm64 .

# Build for x86_64 (servers, TrueNAS)
docker build --platform linux/amd64 -t spacedrive:amd64 .

# Build multi-arch with buildx
docker buildx build \
  --platform linux/amd64,linux/arm64 \
  -t spacedrive:latest \
  --push .
```

## Native Binary Deployment

### Installation

1. **Download binaries**:

```bash
# For x86_64 Linux
curl -LO https://github.com/YOUR_ORG/releases/latest/download/sd-linux-x86_64
curl -LO https://github.com/YOUR_ORG/releases/latest/download/sd-daemon-linux-x86_64

# For ARM64 (Raspberry Pi)
curl -LO https://github.com/YOUR_ORG/releases/latest/download/sd-linux-aarch64
curl -LO https://github.com/YOUR_ORG/releases/latest/download/sd-daemon-linux-aarch64
```

2. **Install binaries**:

```bash
# Move to PATH
sudo mv sd-linux-* /usr/local/bin/sd-cli
sudo mv sd-daemon-linux-* /usr/local/bin/sd-daemon

# Set permissions
sudo chmod +x /usr/local/bin/sd-cli /usr/local/bin/sd-daemon

# Test installation
sd-cli --version
```

### Running the Daemon

```bash
# Start in foreground (for testing)
sd-cli start --foreground

# Start in background
sd-cli start

# Check status
sd-cli status

# Stop daemon
sd-cli stop
```

## Systemd Service (Auto-Start)

### Installation

The CLI includes built-in systemd service management:

```bash
# Install and enable auto-start
sd-cli daemon install

# Check status
sd-cli daemon status

# Uninstall auto-start
sd-cli daemon uninstall
```

This creates a systemd user service at:
```
~/.config/systemd/user/spacedrive-daemon.service
```

### Manual Systemd Setup

If you prefer manual setup, create the service file:

```bash
mkdir -p ~/.config/systemd/user
cat > ~/.config/systemd/user/spacedrive-daemon.service << 'EOF'
[Unit]
Description=Spacedrive Daemon
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/sd-daemon --data-dir %h/.local/share/spacedrive
Restart=on-failure
RestartSec=5s
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=default.target
EOF
```

Then enable and start:

```bash
# Reload systemd
systemctl --user daemon-reload

# Enable auto-start
systemctl --user enable spacedrive-daemon

# Start now
systemctl --user start spacedrive-daemon

# Check status
systemctl --user status spacedrive-daemon

# View logs
journalctl --user -u spacedrive-daemon -f
```

## TrueNAS Deployment

### TrueNAS SCALE (Debian-based)

TrueNAS SCALE supports Docker, so you can use either method:

#### Option 1: Docker (Recommended)

1. Enable Docker/Kubernetes in TrueNAS SCALE Apps
2. Deploy using the docker-compose.yml above
3. Mount your TrueNAS pools as volumes

#### Option 2: Native Binary

```bash
# SSH into TrueNAS
ssh admin@truenas

# Download and install binaries
curl -LO https://github.com/YOUR_ORG/releases/latest/download/sd-linux-x86_64
curl -LO https://github.com/YOUR_ORG/releases/latest/download/sd-daemon-linux-x86_64

sudo mv sd-linux-x86_64 /usr/local/bin/sd-cli
sudo mv sd-daemon-linux-x86_64 /usr/local/bin/sd-daemon
sudo chmod +x /usr/local/bin/sd-cli /usr/local/bin/sd-daemon

# Set up systemd service
sd-cli daemon install

# Index your pools
sd-cli location add /mnt/pool1
sd-cli location add /mnt/pool2
```

### TrueNAS CORE (FreeBSD)

Currently unsupported. Use TrueNAS SCALE (recommended) or run in a Linux VM.

## Raspberry Pi Deployment

### Prerequisites

- Raspberry Pi 3/4/5 or newer
- Raspberry Pi OS (64-bit recommended)
- At least 1GB free RAM

### Installation

```bash
# Update system
sudo apt-get update && sudo apt-get upgrade -y

# Download ARM64 binaries
wget https://github.com/YOUR_ORG/releases/latest/download/sd-linux-aarch64
wget https://github.com/YOUR_ORG/releases/latest/download/sd-daemon-linux-aarch64

# Install
sudo mv sd-linux-aarch64 /usr/local/bin/sd-cli
sudo mv sd-daemon-linux-aarch64 /usr/local/bin/sd-daemon
sudo chmod +x /usr/local/bin/sd-cli /usr/local/bin/sd-daemon

# Install auto-start
sd-cli daemon install

# Start daemon
sudo systemctl --user start spacedrive-daemon
```

### Performance Tips

- Use external SSD for better I/O performance
- Limit concurrent indexing jobs: `sd-cli config set jobs.max_concurrent 2`
- Disable thumbnail generation for large libraries to save RAM

## Configuration

### Data Directory

By default, data is stored at:
- Native: `~/.local/share/spacedrive` (Linux)
- Docker: `/data` (mapped to volume)

Override with `--data-dir` flag:

```bash
sd-cli --data-dir /mnt/external/spacedrive start
```

### Auto-Update

Configure update repository:

```bash
# Set your releases repo
sd-cli config set update.repo "your-org/spacedrive-cli-releases"

# Check for updates
sd-cli update

# Auto-update on schedule (cron)
echo "0 2 * * * /usr/local/bin/sd-cli update --force" | crontab -
```

### Multiple Instances

Run multiple daemon instances:

```bash
# Instance for work files
sd-cli --instance work --data-dir ~/spacedrive-work start

# Instance for personal files
sd-cli --instance personal --data-dir ~/spacedrive-personal start

# Install both as services
sd-cli --instance work daemon install
sd-cli --instance personal daemon install
```

## Monitoring

### Health Checks

```bash
# Check daemon status
sd-cli status

# Check systemd service
systemctl --user status spacedrive-daemon

# View recent logs
journalctl --user -u spacedrive-daemon --since "1 hour ago"

# Follow logs in real-time
sd-cli logs follow
```

### Resource Usage

```bash
# Check memory usage
ps aux | grep sd-daemon

# Check disk usage
du -sh ~/.local/share/spacedrive

# Monitor with htop
htop -p $(pgrep sd-daemon)
```

## Troubleshooting

### Daemon Won't Start

```bash
# Check logs
journalctl --user -u spacedrive-daemon -n 50

# Or with CLI
sd-cli logs follow

# Reset data and restart
sd-cli restart --reset
```

### Permission Issues

```bash
# Fix binary permissions
sudo chmod +x /usr/local/bin/sd-cli /usr/local/bin/sd-daemon

# Fix data directory permissions
chmod -R u+rw ~/.local/share/spacedrive
```

### Port Conflicts

If you see "address already in use":

```bash
# Check what's using the socket
lsof ~/.local/share/spacedrive/daemon/daemon.sock

# Kill old process
pkill sd-daemon

# Restart
sd-cli start
```

### Out of Memory (Raspberry Pi)

```bash
# Check available memory
free -h

# Reduce concurrent jobs
sd-cli config set jobs.max_concurrent 1

# Restart daemon
sd-cli restart
```

## Security Considerations

### Running as Non-Root

Always run as a regular user, never as root:

```bash
# DON'T do this
sudo sd-cli start  # ❌

# DO this instead
sd-cli start  # ✓
```

### Firewall Configuration

If enabling API access (future):

```bash
# Allow specific port
sudo ufw allow 8080/tcp

# Or limit to local network
sudo ufw allow from 192.168.1.0/24 to any port 8080
```

### File Permissions

Ensure indexed directories are readable:

```bash
# Check permissions
ls -la /path/to/index

# Fix if needed
chmod -R u+r /path/to/index
```

## Uninstallation

### Remove Daemon

```bash
# Stop daemon
sd-cli stop

# Remove auto-start
sd-cli daemon uninstall

# Remove binaries
sudo rm /usr/local/bin/sd-cli /usr/local/bin/sd-daemon

# Remove data (optional)
rm -rf ~/.local/share/spacedrive
```

### Remove Docker

```bash
# Stop and remove container
docker compose down

# Remove volumes
docker volume rm spacedrive-data

# Remove image
docker rmi spacedrive:latest
```

## Advanced Configuration

### Custom Systemd Service Options

Edit `~/.config/systemd/user/spacedrive-daemon.service`:

```ini
[Service]
# Limit memory usage
MemoryMax=1G

# Set nice priority
Nice=10

# Set I/O priority
IOSchedulingClass=best-effort
IOSchedulingPriority=5

# Environment variables
Environment="RUST_LOG=info"
```

Then reload and restart:

```bash
systemctl --user daemon-reload
systemctl --user restart spacedrive-daemon
```

### Docker Resource Limits

In docker-compose.yml:

```yaml
services:
  spacedrive:
    # ... other config ...
    deploy:
      resources:
        limits:
          cpus: '2.0'
          memory: 2G
        reservations:
          memory: 512M
```

## Next Steps

- [CLI Architecture](/core/cli) - Learn about the CLI architecture
- [Library Sync Setup](/cli/library-sync-setup) - Set up multi-device sync
- [Multi-Instance](/cli/multi-instance) - Run multiple daemon instances
