---
description: how to deploy elmeg changes safely
---

# Elmeg Safe Deployment

## CRITICAL: Never wipe the database

When deploying changes to elmeg, **ONLY rebuild the backend and frontend containers**. The database must NEVER be rebuilt or recreated.

## Safe deployment command

### Production (`elmeg.xyz`) - tangible-aacorn

```bash
# turbo
ssh tangible-aacorn "cd /srv/containers/elmeg-demo && git pull && docker compose up -d --build --no-deps backend frontend"
```

### Staging (`elmeg.runfoo.run`) - nexus-vector

```bash
# turbo
ssh nexus-vector "cd /srv/containers/elmeg-demo && git pull && docker compose up -d --build --no-deps backend frontend"
```

## DANGEROUS - Do NOT use these commands

```bash
# These will WIPE THE DATABASE:
docker compose up -d --build          # Rebuilds ALL containers including db
docker compose down && docker compose up -d  # Recreates all containers
docker compose up -d --force-recreate  # Force recreates all
```

## Backup before any deployment (optional but recommended)

```bash
# turbo
ssh nexus-vector "docker exec elmeg-demo-db-1 pg_dump -U elmeg elmeg > /srv/containers/elmeg-demo/backup-\$(date +%Y%m%d-%H%M%S).sql"
```

## Restore from backup if needed

```bash
ssh nexus-vector "cat /srv/containers/elmeg-demo/backup-YYYYMMDD-HHMMSS.sql | docker exec -i elmeg-demo-db-1 psql -U elmeg elmeg"
```

## Data Import (Recovery)

If the database is wiped or fresh, use the Smart Import script to populate shows and setlists. This script is memory-optimized and checks for infinite loops.

### Production (tangible-aacorn)

```bash
ssh tangible-aacorn "docker exec elmeg-backend-1 python import_setlists_smart.py"
```

### Staging (nexus-vector)

```bash
ssh nexus-vector "docker exec elmeg-demo-backend-1 python import_setlists_smart.py"
```

## Git Configuration (Production)

To ensure `git pull` works correctly on production:

```bash
# On nexus-vector
cd /srv/containers/elmeg-demo
git branch --set-upstream-to=origin/main main
```
