# Running MeshView with Docker

MeshView container images are built automatically and published to GitHub Container Registry.

## Quick Start

Pull and run the latest image:

```bash
docker pull ghcr.io/pablorevilla-meshtastic/meshview:latest

docker run -d \
  --name meshview \
  -p 8081:8081 \
  -v ./config:/etc/meshview \
  -v ./data:/var/lib/meshview \
  -v ./logs:/var/log/meshview \
  ghcr.io/pablorevilla-meshtastic/meshview:latest
```

Access the web interface at: http://localhost:8081

## Volume Mounts

The container uses three volumes for persistent data:

| Volume | Purpose | Required |
|--------|---------|----------|
| `/etc/meshview` | Configuration files | Yes |
| `/var/lib/meshview` | Database storage | Recommended |
| `/var/log/meshview` | Log files | Optional |

### Configuration Volume

Mount a directory containing your `config.ini` file:

```bash
-v /path/to/your/config:/etc/meshview
```

If no config is provided, the container will use the default `sample.config.ini`.

### Database Volume

Mount a directory to persist the SQLite database:

```bash
-v /path/to/your/data:/var/lib/meshview
```

**Important:** Without this mount, your database will be lost when the container stops.

### Logs Volume

Mount a directory to access logs from the host:

```bash
-v /path/to/your/logs:/var/log/meshview
```

## Complete Example

Create a directory structure and run:

```bash
# Create directories
mkdir -p meshview/{config,data,logs,backups}

# Copy sample config (first time only)
docker run --rm ghcr.io/pablorevilla-meshtastic/meshview:latest \
  cat /etc/meshview/config.ini > meshview/config/config.ini

# Edit config.ini with your MQTT settings
nano meshview/config/config.ini

# Run the container
docker run -d \
  --name meshview \
  --restart unless-stopped \
  -p 8081:8081 \
  -v $(pwd)/meshview/config:/etc/meshview \
  -v $(pwd)/meshview/data:/var/lib/meshview \
  -v $(pwd)/meshview/logs:/var/log/meshview \
  ghcr.io/pablorevilla-meshtastic/meshview:latest
```

## Docker Compose

Create a `docker-compose.yml`:

```yaml
version: '3.8'

services:
  meshview:
    image: ghcr.io/pablorevilla-meshtastic/meshview:latest
    container_name: meshview
    restart: unless-stopped
    ports:
      - "8081:8081"
    volumes:
      - ./config:/etc/meshview
      - ./data:/var/lib/meshview
      - ./logs:/var/log/meshview
      - ./backups:/var/lib/meshview/backups  # For database backups
    environment:
      - TZ=America/Los_Angeles  # Set your timezone
```

Run with:

```bash
docker-compose up -d
```

## Configuration

### Minimum Configuration

Edit your `config.ini` to configure MQTT connection:

```ini
[mqtt]
server = mqtt.meshtastic.org
topics = ["msh/US/#"]
port = 1883
username =
password =

[database]
# SQLAlchemy async connection string.
# Examples:
#   sqlite+aiosqlite:///var/lib/meshview/packets.db
#   postgresql+asyncpg://user:pass@host:5432/meshview
connection_string = sqlite+aiosqlite:///var/lib/meshview/packets.db
```

### Database Backups

To enable automatic daily backups inside the container:

```ini
[cleanup]
backup_enabled = True
backup_dir = /var/lib/meshview/backups
backup_hour = 2
backup_minute = 00
```

Then mount the backups directory:

```bash
-v $(pwd)/meshview/backups:/var/lib/meshview/backups
```

## Available Tags

| Tag | Description |
|-----|-------------|
| `latest` | Latest build from the main branch |
| `dev-v3` | Development branch |
| `v1.2.3` | Specific version tags |

## Updating

Pull the latest image and restart:

```bash
docker pull ghcr.io/pablorevilla-meshtastic/meshview:latest
docker restart meshview
```

Or with docker-compose:

```bash
docker-compose pull
docker-compose up -d
```

## Logs

View container logs:

```bash
docker logs meshview

# Follow logs
docker logs -f meshview

# Last 100 lines
docker logs --tail 100 meshview
```

## Troubleshooting

### Container won't start

Check logs:
```bash
docker logs meshview
```

### Database permission issues

Ensure the data directory is writable:
```bash
chmod -R 755 meshview/data
```

### Can't connect to MQTT

1. Check your MQTT configuration in `config.ini`
2. Verify network connectivity from the container:
   ```bash
   docker exec meshview ping mqtt.meshtastic.org
   ```

### Port already in use

Change the host port (left side):
```bash
-p 8082:8081
```

Then access at: http://localhost:8082

## Building Your Own Image

If you want to build from source:

```bash
git clone https://github.com/pablorevilla-meshtastic/meshview.git
cd meshview
docker build -f Containerfile -t meshview:local .
```

## Security Notes

- The container runs as a non-root user (`app`, UID 10001)
- No privileged access required
- Only port 8081 is exposed
- All data stored in mounted volumes

## Support

- GitHub Issues: https://github.com/pablorevilla-meshtastic/meshview/issues
- Documentation: https://github.com/pablorevilla-meshtastic/meshview
