Skip to content

Commit efc1127

Browse files
committed
Add support for mounting rclone.conf as alternative to base64 config
1 parent 1da0157 commit efc1127

5 files changed

Lines changed: 124 additions & 15 deletions

File tree

Dockerfile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,9 @@ ENV RECOVERY_TARGET_XID=""
9292
ENV RECOVERY_TARGET_LSN=""
9393
ENV RECOVERY_TARGET_INCLUSIVE="true"
9494
ENV RECOVERY_TARGET_ACTION="promote"
95+
# rclone配置方式(二选一):
96+
# 1. RCLONE_CONF_BASE64 - Base64编码的rclone配置
97+
# 2. 挂载rclone.conf文件到 /root/.config/rclone/rclone.conf
9598

9699
# 暴露PostgreSQL端口
97100
EXPOSE 5432

QUICK_START_EN.md

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@
88
- PostgreSQL database to backup
99
- rclone configuration for remote storage (optional)
1010

11-
### Step 1: Prepare rclone Configuration
11+
### Step 1: Prepare rclone Configuration (Choose One Method)
1212

13-
Create a base64 encoded rclone configuration:
13+
#### Method 1: Environment Variable (Recommended for Production)
1414

1515
```bash
1616
# Create rclone config file
@@ -28,8 +28,23 @@ RCLONE_CONF_BASE64=$(cat rclone.conf | base64 -w 0)
2828
echo $RCLONE_CONF_BASE64
2929
```
3030

31+
#### Method 2: File Mount (Recommended for Development)
32+
33+
```bash
34+
# Create rclone config file
35+
cat > /path/to/rclone.conf << EOF
36+
[s3-remote]
37+
type = s3
38+
provider = AWS
39+
access_key_id = your_access_key
40+
secret_access_key = your_secret_key
41+
region = us-east-1
42+
EOF
43+
```
44+
3145
### Step 2: Run Backup Container
3246

47+
#### Using Method 1 (Environment Variable):
3348
```bash
3449
docker run -d \
3550
--name postgres-backup \
@@ -44,6 +59,21 @@ docker run -d \
4459
ghcr.io/whispin/postgres_nrt_backup:latest
4560
```
4661

62+
#### Using Method 2 (File Mount):
63+
```bash
64+
docker run -d \
65+
--name postgres-backup \
66+
-e POSTGRES_USER=myuser \
67+
-e POSTGRES_PASSWORD=mypassword \
68+
-e POSTGRES_DB=mydatabase \
69+
-e PGBACKREST_STANZA=main \
70+
-e WAL_GROWTH_THRESHOLD="100MB" \
71+
-v /var/lib/postgresql/data:/var/lib/postgresql/data:ro \
72+
-v ./backup-logs:/backup/logs \
73+
-v /path/to/rclone.conf:/root/.config/rclone/rclone.conf:ro \
74+
ghcr.io/whispin/postgres_nrt_backup:latest
75+
```
76+
4777
### Step 3: Verify Backup System
4878

4979
```bash

README.md

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ A comprehensive PostgreSQL near real-time backup and recovery solution based on
2424
# Pull the latest image
2525
docker pull ghcr.io/whispin/postgres_nrt_backup:latest
2626

27-
# Run backup container
27+
# Method 1: Using RCLONE_CONF_BASE64 environment variable
2828
docker run -d \
2929
--name postgres-backup \
3030
-e POSTGRES_USER=myuser \
@@ -36,11 +36,25 @@ docker run -d \
3636
-v /path/to/postgres/data:/var/lib/postgresql/data:ro \
3737
-v /path/to/backup:/backup/local \
3838
ghcr.io/whispin/postgres_nrt_backup:latest
39+
40+
# Method 2: Mounting rclone.conf file
41+
docker run -d \
42+
--name postgres-backup \
43+
-e POSTGRES_USER=myuser \
44+
-e POSTGRES_PASSWORD=mypass \
45+
-e POSTGRES_DB=mydb \
46+
-e PGBACKREST_STANZA=main \
47+
-e WAL_GROWTH_THRESHOLD="100MB" \
48+
-v /path/to/postgres/data:/var/lib/postgresql/data:ro \
49+
-v /path/to/backup:/backup/local \
50+
-v /path/to/rclone.conf:/root/.config/rclone/rclone.conf:ro \
51+
ghcr.io/whispin/postgres_nrt_backup:latest
3952
```
4053

4154
### Recovery Mode
4255

4356
```bash
57+
# Method 1: Using RCLONE_CONF_BASE64 environment variable
4458
# Recover to latest backup
4559
docker run -d \
4660
--name postgres-recovery \
@@ -51,12 +65,16 @@ docker run -d \
5165
-e RECOVERY_MODE="true" \
5266
ghcr.io/whispin/postgres_nrt_backup:latest
5367

68+
# Method 2: Mounting rclone.conf file
5469
# Point-in-time recovery
5570
docker run -d \
5671
--name postgres-recovery \
72+
-e POSTGRES_USER=myuser \
73+
-e POSTGRES_PASSWORD=mypass \
74+
-e POSTGRES_DB=mydb \
5775
-e RECOVERY_MODE="true" \
5876
-e RECOVERY_TARGET_TIME="2025-07-10 14:30:00" \
59-
# ... other environment variables
77+
-v /path/to/rclone.conf:/root/.config/rclone/rclone.conf:ro \
6078
ghcr.io/whispin/postgres_nrt_backup:latest
6179
```
6280

@@ -93,7 +111,7 @@ docker-compose -f docker-compose.ghcr.yml up -d
93111
| `PGBACKREST_STANZA` | `main` | pgBackRest stanza name |
94112
| `BACKUP_RETENTION_DAYS` | `3` | Backup retention period in days |
95113
| `BASE_BACKUP_SCHEDULE` | `"0 3 * * *"` | Full backup schedule (cron format) |
96-
| `RCLONE_CONF_BASE64` | - | Base64 encoded rclone configuration |
114+
| `RCLONE_CONF_BASE64` | - | Base64 encoded rclone configuration (optional if file mounted) |
97115
| `RCLONE_REMOTE_PATH` | `"postgres-backups"` | Remote storage path |
98116
| `RECOVERY_MODE` | `"false"` | Enable recovery mode |
99117
| `WAL_GROWTH_THRESHOLD` | `"100MB"` | WAL growth threshold for auto backups |
@@ -111,14 +129,31 @@ docker-compose -f docker-compose.ghcr.yml up -d
111129
| `RECOVERY_TARGET_INCLUSIVE` | `"true"` | Include recovery target |
112130
| `RECOVERY_TARGET_ACTION` | `"promote"` | Action after recovery |
113131

132+
### rclone Configuration (Choose One Method)
133+
134+
#### Method 1: Environment Variable
135+
```bash
136+
# Encode your rclone.conf to base64
137+
RCLONE_CONF_BASE64=$(cat rclone.conf | base64 -w 0)
138+
139+
# Use in docker run
140+
docker run -e RCLONE_CONF_BASE64="$RCLONE_CONF_BASE64" ...
141+
```
142+
143+
#### Method 2: File Mount
144+
```bash
145+
# Mount rclone.conf directly
146+
docker run -v /path/to/rclone.conf:/root/.config/rclone/rclone.conf:ro ...
147+
```
148+
114149
### Volume Mounts
115150

116151
| Path | Description | Permission |
117152
|------|-------------|------------|
118153
| `/var/lib/postgresql/data` | PostgreSQL data directory | Read-only |
119154
| `/backup/local` | Local backup storage | Read-write |
120155
| `/backup/logs` | Backup logs | Read-write |
121-
| `/root/.config/rclone/rclone.conf` | rclone configuration file | Read-only |
156+
| `/root/.config/rclone/rclone.conf` | rclone configuration file (optional) | Read-only |
122157

123158
## 🔧 Manual Operations
124159

@@ -246,6 +281,7 @@ The project uses GitHub Actions for automated building and publishing:
246281
## 📚 Documentation
247282

248283
- [Quick Start Guide](QUICK_START_EN.md) - Get started in 5 minutes
284+
- [rclone Configuration Guide](RCLONE_CONFIGURATION_GUIDE.md) - Two methods to configure rclone
249285
- [Manual Backup Guide](MANUAL_BACKUP_GUIDE.md)
250286
- [WAL Monitor Guide](WAL_MONITOR_GUIDE.md)
251287
- [Recovery Guide](RECOVERY_GUIDE.md)

README_ZH.md

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
# 拉取最新镜像
2525
docker pull ghcr.io/whispin/postgres_nrt_backup:latest
2626

27-
# 运行备份容器
27+
# 方式1:使用RCLONE_CONF_BASE64环境变量
2828
docker run -d \
2929
--name postgres-backup \
3030
-e POSTGRES_USER=myuser \
@@ -36,12 +36,25 @@ docker run -d \
3636
-v /path/to/postgres/data:/var/lib/postgresql/data:ro \
3737
-v /path/to/backup:/backup/local \
3838
ghcr.io/whispin/postgres_nrt_backup:latest
39+
40+
# 方式2:直接挂载rclone.conf文件
41+
docker run -d \
42+
--name postgres-backup \
43+
-e POSTGRES_USER=myuser \
44+
-e POSTGRES_PASSWORD=mypass \
45+
-e POSTGRES_DB=mydb \
46+
-e PGBACKREST_STANZA=main \
47+
-e WAL_GROWTH_THRESHOLD="100MB" \
48+
-v /path/to/postgres/data:/var/lib/postgresql/data:ro \
49+
-v /path/to/backup:/backup/local \
50+
-v /path/to/rclone.conf:/root/.config/rclone/rclone.conf:ro \
51+
ghcr.io/whispin/postgres_nrt_backup:latest
3952
```
4053

4154
### 恢复模式
4255

4356
```bash
44-
# 恢复到最新备份
57+
# 方式1:使用RCLONE_CONF_BASE64环境变量恢复到最新备份
4558
docker run -d \
4659
--name postgres-recovery \
4760
-e POSTGRES_USER=myuser \
@@ -51,12 +64,15 @@ docker run -d \
5164
-e RECOVERY_MODE="true" \
5265
ghcr.io/whispin/postgres_nrt_backup:latest
5366

54-
# 恢复到指定时间点
67+
# 方式2:挂载rclone.conf文件进行时间点恢复
5568
docker run -d \
5669
--name postgres-recovery \
70+
-e POSTGRES_USER=myuser \
71+
-e POSTGRES_PASSWORD=mypass \
72+
-e POSTGRES_DB=mydb \
5773
-e RECOVERY_MODE="true" \
5874
-e RECOVERY_TARGET_TIME="2025-07-10 14:30:00" \
59-
# ... 其他环境变量
75+
-v /path/to/rclone.conf:/root/.config/rclone/rclone.conf:ro \
6076
ghcr.io/whispin/postgres_nrt_backup:latest
6177
```
6278

scripts/backup-functions.sh

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -139,14 +139,38 @@ setup_rclone() {
139139

140140
mkdir -p "$(dirname "$RCLONE_CONFIG_PATH")"
141141

142-
if ! echo "$RCLONE_CONF_BASE64" | base64 -d | tr -d '\r' > "$RCLONE_CONFIG_PATH"; then
143-
log "ERROR" "Failed to decode RCLONE_CONF_BASE64 or write to $RCLONE_CONFIG_PATH."
142+
# Check if rclone.conf is already mounted
143+
if [ -f "$RCLONE_CONFIG_PATH" ] && [ -s "$RCLONE_CONFIG_PATH" ]; then
144+
log "INFO" "Found mounted rclone configuration file at $RCLONE_CONFIG_PATH"
145+
146+
# Verify the mounted configuration file
147+
if ! rclone config show --config "$RCLONE_CONFIG_PATH" >/dev/null 2>&1; then
148+
log "ERROR" "Mounted rclone configuration file is invalid"
149+
return 1
150+
fi
151+
152+
log "INFO" "Using mounted rclone configuration"
153+
154+
elif [ -n "$RCLONE_CONF_BASE64" ]; then
155+
log "INFO" "Using RCLONE_CONF_BASE64 environment variable"
156+
157+
# Decode and save rclone configuration
158+
if ! echo "$RCLONE_CONF_BASE64" | base64 -d | tr -d '\r' > "$RCLONE_CONFIG_PATH"; then
159+
log "ERROR" "Failed to decode RCLONE_CONF_BASE64 or write to $RCLONE_CONFIG_PATH."
160+
return 1
161+
fi
162+
163+
chmod 644 "$RCLONE_CONFIG_PATH"
164+
log "INFO" "Rclone configuration created from RCLONE_CONF_BASE64 at $RCLONE_CONFIG_PATH."
165+
166+
else
167+
log "ERROR" "Neither rclone.conf file nor RCLONE_CONF_BASE64 environment variable provided"
168+
log "INFO" "Please either:"
169+
log "INFO" " 1. Mount rclone.conf file to: $RCLONE_CONFIG_PATH"
170+
log "INFO" " 2. Set RCLONE_CONF_BASE64 environment variable"
144171
return 1
145172
fi
146173

147-
chmod 644 "$RCLONE_CONFIG_PATH"
148-
log "INFO" "Rclone configuration created at $RCLONE_CONFIG_PATH."
149-
150174
# Use RCLONE_REMOTE_NAME if specified, otherwise extract first remote from config
151175
if [[ -n "$RCLONE_REMOTE_NAME" ]]; then
152176
REMOTE_NAME="$RCLONE_REMOTE_NAME"

0 commit comments

Comments
 (0)