auberge 0.10.4

CLI tool for managing self-hosted infrastructure with Ansible
# auberge dns migrate

Migrate all A records to new IP address

## Synopsis

```bash
auberge dns migrate --ip <IP> [OPTIONS]
```

## Alias

`auberge d m`

## Description

Updates all existing A records to point to a new IP address. Useful for server migrations.

Shows a table of old vs new IPs before making changes (dry run by default is recommended).

## Options

| Option              | Description                           | Default |
| ------------------- | ------------------------------------- | ------- |
| -i, --ip IP         | New IP address (required)             | None    |
| -n, --dry-run       | Preview without updating              | false   |
| -o, --output FORMAT | Output format (`human`, `json`)       | `human` |
| -P, --production    | Use production API (default: sandbox) | false   |

## Examples

```bash
# Preview migration
auberge dns migrate --ip 10.0.0.5 --dry-run

# Execute migration
auberge dns migrate --ip 10.0.0.5

# Production API
auberge dns migrate --ip 10.0.0.5 --production
```

## Dry Run Output

```
CLOUDFLARE DNS
[DRY RUN] DNS Migration Preview
--------------------------------------------------
SUBDOMAIN      CURRENT           NEW
--------------------------------------------------
blocky         192.168.1.10  ->  10.0.0.5
freshrss       192.168.1.10  ->  10.0.0.5
baikal       192.168.1.10  ->  10.0.0.5
calibre        192.168.1.10  ->  10.0.0.5
navidrome      192.168.1.10  ->  10.0.0.5

Would update 5 A record(s).
```

## Execution Output

```
CLOUDFLARE DNS
DNS Migration
--------------------------------------------------
SUBDOMAIN      CURRENT           NEW
--------------------------------------------------
blocky         192.168.1.10  ->  10.0.0.5
freshrss       192.168.1.10  ->  10.0.0.5
baikal       192.168.1.10  ->  10.0.0.5

Updated 3 A record(s).
```

## JSON Output

```bash
auberge dns migrate --ip 10.0.0.5 --output json
```

```json
[
  {
    "subdomain": "blocky",
    "old_ip": "192.168.1.10",
    "new_ip": "10.0.0.5",
    "success": true
  },
  {
    "subdomain": "freshrss",
    "old_ip": "192.168.1.10",
    "new_ip": "10.0.0.5",
    "success": true
  },
  {
    "subdomain": "baikal",
    "old_ip": "192.168.1.10",
    "new_ip": "10.0.0.5",
    "success": false
  }
]
```

JSON goes to stdout; human-format chrome (banners, info messages) goes to stderr.

**Schema**

| Field     | Type    | Description                                            |
| --------- | ------- | ------------------------------------------------------ |
| subdomain | string  | Subdomain label                                        |
| old_ip    | string  | IP address before migration                            |
| new_ip    | string  | IP address after migration (the `--ip` argument)       |
| success   | boolean | Whether the Cloudflare update succeeded (load-bearing) |

## Migration Process

1. **Query all A records** from Cloudflare
2. **Filter records** to migrate (only A records)
3. **Show preview** of changes
4. **Update each record** to new IP
5. **Report results**

## Use Cases

**VPS migration**:

```bash
# 1. Preview changes
auberge dns migrate --ip 10.0.0.5 --dry-run

# 2. Verify preview is correct
# 3. Execute migration
auberge dns migrate --ip 10.0.0.5

# 4. Verify records
auberge dns list
```

**Disaster recovery**:

```bash
# Quickly point all records to new server
auberge dns migrate --ip 203.0.113.5
```

## Workflow for Server Migration

1. **Prepare new server**:
   ```bash
   # Bootstrap new server
   auberge ansible bootstrap newserver --ip 10.0.0.5

   # Deploy applications
   auberge ansible run --host newserver
   ```

2. **Test before DNS migration**:
   ```bash
   # Add to /etc/hosts for testing
   echo "10.0.0.5 freshrss.example.com" | sudo tee -a /etc/hosts

   # Test services
   curl https://freshrss.example.com
   ```

3. **Migrate DNS** (dry run first):
   ```bash
   auberge dns migrate --ip 10.0.0.5 --dry-run
   auberge dns migrate --ip 10.0.0.5
   ```

4. **Verify migration**:
   ```bash
   auberge dns list
   dig freshrss.example.com
   ```

## Safety Features

**Dry run recommended**: Always preview with --dry-run first
**Only A records**: Doesn't touch CNAME, MX, TXT, etc.
**Atomic updates**: Each record updated independently

## Record Types Affected

**Affected**:

- A records (IPv4)

**Not affected**:

- AAAA records (IPv6) - use set-all or set individually
- CNAME records
- MX records
- TXT records
- NS records

## Troubleshooting

**No records updated**:

- Check you have A records: `auberge dns list`
- Verify IP format is valid

**Partial update**:

- Some records updated, some failed
- Check Cloudflare API status
- Manually fix failed records with `auberge dns set`

## Related Commands

- [auberge dns list]list.md - Verify migration
- [auberge dns set]set.md - Fix individual records
- [auberge dns set-all]set-all.md - Bulk create records

## See Also

- [DNS Management]../../dns/README.md
- [Migration Guide]../../backup-restore/migration.md