Update TEMPLATES.md
This commit is contained in:
150
TEMPLATES.md
150
TEMPLATES.md
@@ -307,8 +307,115 @@ _check_required_env_vars "CONTAINER_NAME"
|
|||||||
docker logs "$CONTAINER_NAME" "$@"
|
docker logs "$CONTAINER_NAME" "$@"
|
||||||
```
|
```
|
||||||
|
|
||||||
### backup.sh / restore.sh
|
### backup.sh
|
||||||
Handle data backup and restoration for services with persistent data.
|
|
||||||
|
Backs up persistent data for a service. **OPTIONAL** - if not provided, `dropshell backup` reports "nothing to backup".
|
||||||
|
|
||||||
|
**Environment Variables Provided:**
|
||||||
|
- `BACKUP_FILE`: Full path where the backup archive (.tgz) must be created
|
||||||
|
- `TEMP_DIR`: Temporary directory for intermediate files (automatically cleaned up)
|
||||||
|
|
||||||
|
**Requirements:**
|
||||||
|
- Must be non-interactive (no prompts)
|
||||||
|
- Must create a tar.gz archive at the exact path specified by `BACKUP_FILE`
|
||||||
|
- Should back up all persistent data (volumes, paths, files)
|
||||||
|
|
||||||
|
**Example using datacommands_v2.sh:**
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
source "${AGENT_PATH}/common.sh"
|
||||||
|
source "${AGENT_PATH}/datacommands_v2.sh"
|
||||||
|
_check_required_env_vars "CONTAINER_NAME" "DATA_VOLUME" "CONFIG_PATH"
|
||||||
|
|
||||||
|
# Format: type:label:location
|
||||||
|
# Types: volume, path, file
|
||||||
|
backup_items \
|
||||||
|
"volume:data:${DATA_VOLUME}" \
|
||||||
|
"path:config:${CONFIG_PATH}" \
|
||||||
|
"file:settings:/etc/myapp/settings.conf"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Example manual implementation:**
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
source "${AGENT_PATH}/common.sh"
|
||||||
|
_check_required_env_vars "CONTAINER_NAME" "DATA_VOLUME" "BACKUP_FILE" "TEMP_DIR"
|
||||||
|
|
||||||
|
# Create working directory
|
||||||
|
mkdir -p "${TEMP_DIR}/backup"
|
||||||
|
|
||||||
|
# Export data from Docker volume
|
||||||
|
docker run --rm -v "${DATA_VOLUME}":/source -v "${TEMP_DIR}/backup":/backup \
|
||||||
|
debian tar -czf /backup/data.tgz -C /source .
|
||||||
|
|
||||||
|
# Create final archive at BACKUP_FILE path
|
||||||
|
tar -czf "${BACKUP_FILE}" -C "${TEMP_DIR}/backup" .
|
||||||
|
|
||||||
|
echo "Backup completed successfully"
|
||||||
|
```
|
||||||
|
|
||||||
|
### restore.sh
|
||||||
|
|
||||||
|
Restores data from a backup archive. **OPTIONAL** - required only if backup.sh exists.
|
||||||
|
|
||||||
|
**Environment Variables Provided:**
|
||||||
|
- `BACKUP_FILE`: Full path to the backup archive (.tgz) to restore from
|
||||||
|
- `TEMP_DIR`: Temporary directory for intermediate files (automatically cleaned up)
|
||||||
|
|
||||||
|
**Requirements:**
|
||||||
|
- Must be non-interactive (no prompts)
|
||||||
|
- Must extract and restore data from the archive at `BACKUP_FILE`
|
||||||
|
- The service is freshly installed before restore.sh runs (volumes/paths may be empty)
|
||||||
|
|
||||||
|
**Important:** When `dropshell restore` runs, it:
|
||||||
|
1. First backs up any existing data (safety measure)
|
||||||
|
2. Destroys the old service
|
||||||
|
3. Reinstalls the service fresh
|
||||||
|
4. Copies the backup file to the remote server
|
||||||
|
5. Runs restore.sh
|
||||||
|
|
||||||
|
**Example using datacommands_v2.sh:**
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
source "${AGENT_PATH}/common.sh"
|
||||||
|
source "${AGENT_PATH}/datacommands_v2.sh"
|
||||||
|
_check_required_env_vars "CONTAINER_NAME" "DATA_VOLUME" "CONFIG_PATH"
|
||||||
|
|
||||||
|
# Must match the same items used in backup.sh
|
||||||
|
restore_items \
|
||||||
|
"volume:data:${DATA_VOLUME}" \
|
||||||
|
"path:config:${CONFIG_PATH}" \
|
||||||
|
"file:settings:/etc/myapp/settings.conf"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Example manual implementation:**
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
source "${AGENT_PATH}/common.sh"
|
||||||
|
_check_required_env_vars "CONTAINER_NAME" "DATA_VOLUME" "BACKUP_FILE" "TEMP_DIR"
|
||||||
|
|
||||||
|
# Extract backup archive
|
||||||
|
mkdir -p "${TEMP_DIR}/restore"
|
||||||
|
tar -xzf "${BACKUP_FILE}" -C "${TEMP_DIR}/restore"
|
||||||
|
|
||||||
|
# Restore data to Docker volume
|
||||||
|
docker volume rm "${DATA_VOLUME}" 2>/dev/null || true
|
||||||
|
docker volume create "${DATA_VOLUME}"
|
||||||
|
docker run --rm -v "${DATA_VOLUME}":/target -v "${TEMP_DIR}/restore":/backup \
|
||||||
|
debian tar -xzf /backup/data.tgz -C /target
|
||||||
|
|
||||||
|
echo "Restore completed successfully"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Backup/Restore Data Types
|
||||||
|
|
||||||
|
The datacommands helper scripts support three data types:
|
||||||
|
|
||||||
|
| Type | Description | Example |
|
||||||
|
|------|-------------|---------|
|
||||||
|
| `volume` | Docker named volume | `volume:data:myapp_data` |
|
||||||
|
| `path` | Directory on the host filesystem | `path:config:/var/lib/myapp` |
|
||||||
|
| `file` | Single file on the host filesystem | `file:settings:/etc/app.conf` |
|
||||||
|
|
||||||
## Common Functions (from common.sh)
|
## Common Functions (from common.sh)
|
||||||
|
|
||||||
@@ -454,17 +561,40 @@ POSTGRES_DB="myapp"
|
|||||||
```bash
|
```bash
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
source "${AGENT_PATH}/common.sh"
|
source "${AGENT_PATH}/common.sh"
|
||||||
_check_required_env_vars "CONTAINER_NAME" "BACKUP_VOLUME" "POSTGRES_USER" "POSTGRES_DB"
|
_check_required_env_vars "CONTAINER_NAME" "POSTGRES_USER" "POSTGRES_DB" "BACKUP_FILE" "TEMP_DIR"
|
||||||
|
|
||||||
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
mkdir -p "${TEMP_DIR}/backup"
|
||||||
BACKUP_FILE="backup_${TIMESTAMP}.sql"
|
|
||||||
|
|
||||||
echo "Creating backup ${BACKUP_FILE}..."
|
# Dump database to temp location
|
||||||
docker exec "$CONTAINER_NAME" pg_dump -U "$POSTGRES_USER" "$POSTGRES_DB" > "/tmp/${BACKUP_FILE}"
|
echo "Dumping database..."
|
||||||
docker cp "/tmp/${BACKUP_FILE}" "${CONTAINER_NAME}:/${BACKUP_VOLUME}/${BACKUP_FILE}"
|
docker exec "$CONTAINER_NAME" pg_dump -U "$POSTGRES_USER" "$POSTGRES_DB" > "${TEMP_DIR}/backup/database.sql"
|
||||||
rm "/tmp/${BACKUP_FILE}"
|
|
||||||
|
|
||||||
echo "Backup completed: ${BACKUP_FILE}"
|
# Create the backup archive at BACKUP_FILE path
|
||||||
|
tar -czf "${BACKUP_FILE}" -C "${TEMP_DIR}/backup" .
|
||||||
|
|
||||||
|
echo "Backup completed successfully"
|
||||||
|
```
|
||||||
|
|
||||||
|
`restore.sh`:
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
source "${AGENT_PATH}/common.sh"
|
||||||
|
_check_required_env_vars "CONTAINER_NAME" "POSTGRES_USER" "POSTGRES_DB" "BACKUP_FILE" "TEMP_DIR"
|
||||||
|
|
||||||
|
mkdir -p "${TEMP_DIR}/restore"
|
||||||
|
|
||||||
|
# Extract the backup archive
|
||||||
|
tar -xzf "${BACKUP_FILE}" -C "${TEMP_DIR}/restore"
|
||||||
|
|
||||||
|
# Wait for postgres to be ready
|
||||||
|
echo "Waiting for database to be ready..."
|
||||||
|
sleep 5
|
||||||
|
|
||||||
|
# Restore database from dump
|
||||||
|
echo "Restoring database..."
|
||||||
|
docker exec -i "$CONTAINER_NAME" psql -U "$POSTGRES_USER" "$POSTGRES_DB" < "${TEMP_DIR}/restore/database.sql"
|
||||||
|
|
||||||
|
echo "Restore completed successfully"
|
||||||
```
|
```
|
||||||
|
|
||||||
`destroy.sh`:
|
`destroy.sh`:
|
||||||
|
|||||||
Reference in New Issue
Block a user