@intentsolutionsio/fairdb-ops-manager 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +22 -0
- package/LICENSE +21 -0
- package/README.md +609 -0
- package/agents/fairdb-incident-responder.md +365 -0
- package/agents/fairdb-ops-auditor.md +525 -0
- package/agents/fairdb-setup-wizard.md +393 -0
- package/commands/daily-health-check.md +225 -0
- package/commands/incident-p0-database-down.md +318 -0
- package/commands/incident-p0-disk-full.md +344 -0
- package/commands/sop-001-vps-setup.md +84 -0
- package/commands/sop-002-postgres-install.md +104 -0
- package/commands/sop-003-backup-setup.md +160 -0
- package/package.json +45 -0
- package/scripts/backup-status.sh +122 -0
- package/scripts/pg-health-check.sh +74 -0
- package/scripts/sop-checklist.sh +354 -0
- package/skills/skill-adapter/assets/README.md +5 -0
- package/skills/skill-adapter/assets/config-template.json +32 -0
- package/skills/skill-adapter/assets/skill-schema.json +28 -0
- package/skills/skill-adapter/assets/test-data.json +27 -0
- package/skills/skill-adapter/references/README.md +4 -0
- package/skills/skill-adapter/references/best-practices.md +69 -0
- package/skills/skill-adapter/references/examples.md +73 -0
- package/skills/skill-adapter/scripts/README.md +11 -0
- package/skills/skill-adapter/scripts/helper-template.sh +42 -0
- package/skills/skill-adapter/scripts/validation.sh +32 -0
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: incident-p0-database-down
|
|
3
|
+
description: Emergency response procedure for SOP-201 P0 - Database Down (Critical)
|
|
4
|
+
model: sonnet
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# SOP-201: P0 - Database Down (CRITICAL)
|
|
8
|
+
|
|
9
|
+
🚨 **EMERGENCY INCIDENT RESPONSE**
|
|
10
|
+
|
|
11
|
+
You are responding to a **P0 CRITICAL incident**: PostgreSQL database is down.
|
|
12
|
+
|
|
13
|
+
## Severity: P0 - CRITICAL
|
|
14
|
+
- **Impact:** ALL customers affected
|
|
15
|
+
- **Response Time:** IMMEDIATE
|
|
16
|
+
- **Resolution Target:** <15 minutes
|
|
17
|
+
|
|
18
|
+
## Your Mission
|
|
19
|
+
|
|
20
|
+
Guide rapid diagnosis and recovery with:
|
|
21
|
+
- Systematic troubleshooting steps
|
|
22
|
+
- Clear commands for each check
|
|
23
|
+
- Fast recovery procedures
|
|
24
|
+
- Customer communication templates
|
|
25
|
+
- Post-incident documentation
|
|
26
|
+
|
|
27
|
+
## IMMEDIATE ACTIONS (First 60 seconds)
|
|
28
|
+
|
|
29
|
+
### 1. Verify the Issue
|
|
30
|
+
```bash
|
|
31
|
+
# Is PostgreSQL running?
|
|
32
|
+
sudo systemctl status postgresql
|
|
33
|
+
|
|
34
|
+
# Can we connect?
|
|
35
|
+
sudo -u postgres psql -c "SELECT 1;"
|
|
36
|
+
|
|
37
|
+
# Check recent logs
|
|
38
|
+
sudo tail -100 /var/log/postgresql/postgresql-16-main.log
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### 2. Alert Stakeholders
|
|
42
|
+
**Post to incident channel IMMEDIATELY:**
|
|
43
|
+
```
|
|
44
|
+
🚨 P0 INCIDENT - Database Down
|
|
45
|
+
Time: [TIMESTAMP]
|
|
46
|
+
Server: VPS-XXX
|
|
47
|
+
Impact: All customers unable to connect
|
|
48
|
+
Status: Investigating
|
|
49
|
+
ETA: TBD
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## DIAGNOSTIC PROTOCOL
|
|
53
|
+
|
|
54
|
+
### Check 1: Service Status
|
|
55
|
+
```bash
|
|
56
|
+
sudo systemctl status postgresql
|
|
57
|
+
sudo systemctl status pgbouncer # If installed
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**Possible states:**
|
|
61
|
+
- `inactive (dead)` → Service stopped
|
|
62
|
+
- `failed` → Service crashed
|
|
63
|
+
- `active (running)` → Service running but not responding
|
|
64
|
+
|
|
65
|
+
### Check 2: Process Status
|
|
66
|
+
```bash
|
|
67
|
+
# Check for PostgreSQL processes
|
|
68
|
+
ps aux | grep postgres
|
|
69
|
+
|
|
70
|
+
# Check listening ports
|
|
71
|
+
sudo ss -tlnp | grep 5432
|
|
72
|
+
sudo ss -tlnp | grep 6432 # pgBouncer
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Check 3: Disk Space
|
|
76
|
+
```bash
|
|
77
|
+
df -h /var/lib/postgresql
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
⚠️ **If disk is full (100%):**
|
|
81
|
+
- This is likely the cause!
|
|
82
|
+
- Jump to "Recovery: Disk Full" section
|
|
83
|
+
|
|
84
|
+
### Check 4: Log Analysis
|
|
85
|
+
```bash
|
|
86
|
+
# Check for errors in PostgreSQL log
|
|
87
|
+
sudo grep -i "error\|fatal\|panic" /var/log/postgresql/postgresql-16-main.log | tail -50
|
|
88
|
+
|
|
89
|
+
# Check system logs
|
|
90
|
+
sudo journalctl -u postgresql -n 100 --no-pager
|
|
91
|
+
|
|
92
|
+
# Check for OOM (Out of Memory) kills
|
|
93
|
+
sudo grep -i "killed process" /var/log/syslog | grep postgres
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Check 5: Configuration Issues
|
|
97
|
+
```bash
|
|
98
|
+
# Test PostgreSQL config
|
|
99
|
+
sudo -u postgres /usr/lib/postgresql/16/bin/postgres --check -D /var/lib/postgresql/16/main
|
|
100
|
+
|
|
101
|
+
# Check for lock files
|
|
102
|
+
ls -la /var/run/postgresql/
|
|
103
|
+
ls -la /var/lib/postgresql/16/main/postmaster.pid
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## RECOVERY PROCEDURES
|
|
107
|
+
|
|
108
|
+
### Recovery 1: Simple Service Restart
|
|
109
|
+
|
|
110
|
+
**If service is stopped but no obvious errors:**
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
# Start PostgreSQL
|
|
114
|
+
sudo systemctl start postgresql
|
|
115
|
+
|
|
116
|
+
# Check status
|
|
117
|
+
sudo systemctl status postgresql
|
|
118
|
+
|
|
119
|
+
# Test connection
|
|
120
|
+
sudo -u postgres psql -c "SELECT version();"
|
|
121
|
+
|
|
122
|
+
# Monitor logs
|
|
123
|
+
sudo tail -f /var/log/postgresql/postgresql-16-main.log
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
**✅ If successful:** Jump to "Post-Recovery" section
|
|
127
|
+
|
|
128
|
+
### Recovery 2: Remove Stale PID File
|
|
129
|
+
|
|
130
|
+
**If error mentions "postmaster.pid already exists":**
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
# Stop PostgreSQL (if running)
|
|
134
|
+
sudo systemctl stop postgresql
|
|
135
|
+
|
|
136
|
+
# Remove stale PID file
|
|
137
|
+
sudo rm /var/lib/postgresql/16/main/postmaster.pid
|
|
138
|
+
|
|
139
|
+
# Start PostgreSQL
|
|
140
|
+
sudo systemctl start postgresql
|
|
141
|
+
|
|
142
|
+
# Verify
|
|
143
|
+
sudo systemctl status postgresql
|
|
144
|
+
sudo -u postgres psql -c "SELECT 1;"
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### Recovery 3: Disk Full Emergency
|
|
148
|
+
|
|
149
|
+
**If disk is 100% full:**
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
# Find largest files
|
|
153
|
+
sudo du -sh /var/lib/postgresql/16/main/* | sort -rh | head -10
|
|
154
|
+
|
|
155
|
+
# Option A: Clear old logs
|
|
156
|
+
sudo find /var/log/postgresql/ -name "*.log" -mtime +7 -delete
|
|
157
|
+
|
|
158
|
+
# Option B: Vacuum to reclaim space
|
|
159
|
+
sudo -u postgres vacuumdb --all --full
|
|
160
|
+
|
|
161
|
+
# Option C: Archive/delete old WAL files (DANGER!)
|
|
162
|
+
# Only if you have confirmed backups!
|
|
163
|
+
sudo -u postgres pg_archivecleanup /var/lib/postgresql/16/main/pg_wal 000000010000000000000010
|
|
164
|
+
|
|
165
|
+
# Check space
|
|
166
|
+
df -h /var/lib/postgresql
|
|
167
|
+
|
|
168
|
+
# Start PostgreSQL
|
|
169
|
+
sudo systemctl start postgresql
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Recovery 4: Configuration Fix
|
|
173
|
+
|
|
174
|
+
**If config test fails:**
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
# Restore backup config
|
|
178
|
+
sudo cp /etc/postgresql/16/main/postgresql.conf.backup /etc/postgresql/16/main/postgresql.conf
|
|
179
|
+
sudo cp /etc/postgresql/16/main/pg_hba.conf.backup /etc/postgresql/16/main/pg_hba.conf
|
|
180
|
+
|
|
181
|
+
# Start PostgreSQL
|
|
182
|
+
sudo systemctl start postgresql
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### Recovery 5: Database Corruption (WORST CASE)
|
|
186
|
+
|
|
187
|
+
**If logs show corruption errors:**
|
|
188
|
+
|
|
189
|
+
```bash
|
|
190
|
+
# Stop PostgreSQL
|
|
191
|
+
sudo systemctl stop postgresql
|
|
192
|
+
|
|
193
|
+
# Run filesystem check (if safe to do so)
|
|
194
|
+
# sudo fsck /dev/sdX # Only if unmounted!
|
|
195
|
+
|
|
196
|
+
# Try single-user mode recovery
|
|
197
|
+
sudo -u postgres /usr/lib/postgresql/16/bin/postgres --single -D /var/lib/postgresql/16/main
|
|
198
|
+
|
|
199
|
+
# If that fails, restore from backup (SOP-204)
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
⚠️ **At this point, escalate to backup restoration procedure!**
|
|
203
|
+
|
|
204
|
+
## POST-RECOVERY ACTIONS
|
|
205
|
+
|
|
206
|
+
### 1. Verify Full Functionality
|
|
207
|
+
```bash
|
|
208
|
+
# Test connections
|
|
209
|
+
sudo -u postgres psql -c "SELECT version();"
|
|
210
|
+
|
|
211
|
+
# Check all databases
|
|
212
|
+
sudo -u postgres psql -c "\l"
|
|
213
|
+
|
|
214
|
+
# Test customer database access (example)
|
|
215
|
+
sudo -u postgres psql -d customer_db_001 -c "SELECT 1;"
|
|
216
|
+
|
|
217
|
+
# Check active connections
|
|
218
|
+
sudo -u postgres psql -c "SELECT count(*) FROM pg_stat_activity;"
|
|
219
|
+
|
|
220
|
+
# Run health check
|
|
221
|
+
/opt/fairdb/scripts/pg-health-check.sh
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### 2. Update Incident Status
|
|
225
|
+
```
|
|
226
|
+
✅ RESOLVED - Database Restored
|
|
227
|
+
Resolution Time: [X minutes]
|
|
228
|
+
Root Cause: [Brief description]
|
|
229
|
+
Recovery Method: [Which recovery procedure used]
|
|
230
|
+
Customer Impact: [Duration of outage]
|
|
231
|
+
Follow-up: [Post-mortem scheduled]
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### 3. Customer Communication
|
|
235
|
+
|
|
236
|
+
**Template:**
|
|
237
|
+
```
|
|
238
|
+
Subject: [RESOLVED] Database Service Interruption
|
|
239
|
+
|
|
240
|
+
Dear FairDB Customer,
|
|
241
|
+
|
|
242
|
+
We experienced a brief service interruption affecting database
|
|
243
|
+
connectivity from [START_TIME] to [END_TIME] ([DURATION]).
|
|
244
|
+
|
|
245
|
+
The issue has been fully resolved and all services are operational.
|
|
246
|
+
|
|
247
|
+
Root Cause: [Brief explanation]
|
|
248
|
+
Resolution: [What we did]
|
|
249
|
+
Prevention: [Steps to prevent recurrence]
|
|
250
|
+
|
|
251
|
+
We apologize for any inconvenience. If you continue to experience
|
|
252
|
+
issues, please contact support@fairdb.io.
|
|
253
|
+
|
|
254
|
+
- FairDB Operations Team
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
### 4. Document Incident
|
|
258
|
+
|
|
259
|
+
Create incident report at `/opt/fairdb/incidents/YYYY-MM-DD-database-down.md`:
|
|
260
|
+
|
|
261
|
+
```markdown
|
|
262
|
+
# Incident Report: Database Down
|
|
263
|
+
|
|
264
|
+
**Incident ID:** INC-YYYYMMDD-001
|
|
265
|
+
**Severity:** P0 - Critical
|
|
266
|
+
**Date:** YYYY-MM-DD
|
|
267
|
+
**Duration:** X minutes
|
|
268
|
+
|
|
269
|
+
## Timeline
|
|
270
|
+
- HH:MM - Issue detected
|
|
271
|
+
- HH:MM - Investigation started
|
|
272
|
+
- HH:MM - Root cause identified
|
|
273
|
+
- HH:MM - Resolution implemented
|
|
274
|
+
- HH:MM - Service restored
|
|
275
|
+
- HH:MM - Verified functionality
|
|
276
|
+
|
|
277
|
+
## Root Cause
|
|
278
|
+
[Detailed explanation]
|
|
279
|
+
|
|
280
|
+
## Impact
|
|
281
|
+
- Customers affected: X
|
|
282
|
+
- Downtime: X minutes
|
|
283
|
+
- Data loss: None / [describe if any]
|
|
284
|
+
|
|
285
|
+
## Resolution
|
|
286
|
+
[Detailed steps taken]
|
|
287
|
+
|
|
288
|
+
## Prevention
|
|
289
|
+
[Action items to prevent recurrence]
|
|
290
|
+
|
|
291
|
+
## Follow-up Tasks
|
|
292
|
+
- [ ] Review monitoring alerts
|
|
293
|
+
- [ ] Update runbooks
|
|
294
|
+
- [ ] Implement preventive measures
|
|
295
|
+
- [ ] Schedule post-mortem meeting
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
## ESCALATION CRITERIA
|
|
299
|
+
|
|
300
|
+
Escalate if:
|
|
301
|
+
- ❌ Cannot restore service within 15 minutes
|
|
302
|
+
- ❌ Data corruption suspected
|
|
303
|
+
- ❌ Backup restoration required
|
|
304
|
+
- ❌ Multiple VPS affected
|
|
305
|
+
- ❌ Security incident suspected
|
|
306
|
+
|
|
307
|
+
**Escalation contacts:** [Document your escalation chain]
|
|
308
|
+
|
|
309
|
+
## START RESPONSE
|
|
310
|
+
|
|
311
|
+
Begin by asking:
|
|
312
|
+
1. "What symptoms are you seeing? (Can't connect, service down, etc.)"
|
|
313
|
+
2. "When did the issue start?"
|
|
314
|
+
3. "Are you on the affected server now?"
|
|
315
|
+
|
|
316
|
+
Then immediately execute Diagnostic Protocol starting with Check 1.
|
|
317
|
+
|
|
318
|
+
**Remember:** Speed is critical. Every minute counts. Stay calm, work systematically.
|
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: incident-p0-disk-full
|
|
3
|
+
description: Emergency response for SOP-203 P0 - Disk Space Emergency
|
|
4
|
+
model: sonnet
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# SOP-203: P0 - Disk Space Emergency
|
|
8
|
+
|
|
9
|
+
🚨 **CRITICAL: Disk Space at 100% or >95%**
|
|
10
|
+
|
|
11
|
+
You are responding to a **disk space emergency** that threatens database operations.
|
|
12
|
+
|
|
13
|
+
## Severity: P0 - CRITICAL
|
|
14
|
+
- **Impact:** Database writes failing, potential data loss
|
|
15
|
+
- **Response Time:** IMMEDIATE
|
|
16
|
+
- **Resolution Target:** <30 minutes
|
|
17
|
+
|
|
18
|
+
## IMMEDIATE DANGER SIGNS
|
|
19
|
+
|
|
20
|
+
If disk is at 100%:
|
|
21
|
+
- ❌ PostgreSQL cannot write data
|
|
22
|
+
- ❌ WAL files cannot be created
|
|
23
|
+
- ❌ Transactions will fail
|
|
24
|
+
- ❌ Database may crash
|
|
25
|
+
- ❌ Backups will fail
|
|
26
|
+
|
|
27
|
+
**Act NOW to free space!**
|
|
28
|
+
|
|
29
|
+
## RAPID ASSESSMENT
|
|
30
|
+
|
|
31
|
+
### 1. Check Current Usage
|
|
32
|
+
```bash
|
|
33
|
+
# Overall disk usage
|
|
34
|
+
df -h
|
|
35
|
+
|
|
36
|
+
# PostgreSQL data directory
|
|
37
|
+
du -sh /var/lib/postgresql/16/main
|
|
38
|
+
|
|
39
|
+
# Find largest directories
|
|
40
|
+
du -sh /var/lib/postgresql/16/main/* | sort -rh | head -10
|
|
41
|
+
|
|
42
|
+
# Find largest files
|
|
43
|
+
find /var/lib/postgresql/16/main -type f -size +100M -exec ls -lh {} \; | sort -k5 -rh | head -20
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### 2. Identify Culprits
|
|
47
|
+
```bash
|
|
48
|
+
# Check log sizes
|
|
49
|
+
du -sh /var/log/postgresql/
|
|
50
|
+
|
|
51
|
+
# Check WAL directory
|
|
52
|
+
du -sh /var/lib/postgresql/16/main/pg_wal/
|
|
53
|
+
ls -lh /var/lib/postgresql/16/main/pg_wal/ | wc -l
|
|
54
|
+
|
|
55
|
+
# Check for temp files
|
|
56
|
+
du -sh /tmp/
|
|
57
|
+
find /tmp -type f -size +10M -ls
|
|
58
|
+
|
|
59
|
+
# Database sizes
|
|
60
|
+
sudo -u postgres psql -c "
|
|
61
|
+
SELECT
|
|
62
|
+
datname,
|
|
63
|
+
pg_size_pretty(pg_database_size(datname)) AS size,
|
|
64
|
+
pg_database_size(datname) AS size_bytes
|
|
65
|
+
FROM pg_database
|
|
66
|
+
ORDER BY size_bytes DESC;"
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## EMERGENCY SPACE RECOVERY
|
|
70
|
+
|
|
71
|
+
### Priority 1: Clear Old Logs (SAFEST)
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
# PostgreSQL logs older than 7 days
|
|
75
|
+
sudo find /var/log/postgresql/ -name "*.log" -mtime +7 -delete
|
|
76
|
+
|
|
77
|
+
# Compress recent logs
|
|
78
|
+
sudo gzip /var/log/postgresql/*.log
|
|
79
|
+
|
|
80
|
+
# Clear syslog/journal
|
|
81
|
+
sudo journalctl --vacuum-time=7d
|
|
82
|
+
|
|
83
|
+
# Check space recovered
|
|
84
|
+
df -h
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
**Expected recovery:** 1-5 GB
|
|
88
|
+
|
|
89
|
+
### Priority 2: Archive Old WAL Files
|
|
90
|
+
|
|
91
|
+
⚠️ **ONLY if you have confirmed backups!**
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
# Check WAL retention settings
|
|
95
|
+
sudo -u postgres psql -c "SHOW wal_keep_size;"
|
|
96
|
+
|
|
97
|
+
# List old WAL files
|
|
98
|
+
ls -lh /var/lib/postgresql/16/main/pg_wal/ | tail -50
|
|
99
|
+
|
|
100
|
+
# Archive WAL files (pgBackRest will help)
|
|
101
|
+
sudo -u postgres pgbackrest --stanza=main --type=full backup
|
|
102
|
+
|
|
103
|
+
# Clean archived WALs (CAREFUL!)
|
|
104
|
+
sudo -u postgres pg_archivecleanup /var/lib/postgresql/16/main/pg_wal \
|
|
105
|
+
$(ls /var/lib/postgresql/16/main/pg_wal/ | grep -v '\.history' | head -1)
|
|
106
|
+
|
|
107
|
+
# Check space
|
|
108
|
+
df -h
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
**Expected recovery:** 5-20 GB
|
|
112
|
+
|
|
113
|
+
### Priority 3: Vacuum Databases
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
# Quick vacuum (recovers space within tables)
|
|
117
|
+
sudo -u postgres vacuumdb --all --analyze
|
|
118
|
+
|
|
119
|
+
# Check largest tables
|
|
120
|
+
sudo -u postgres psql -c "
|
|
121
|
+
SELECT
|
|
122
|
+
schemaname,
|
|
123
|
+
tablename,
|
|
124
|
+
pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) AS size
|
|
125
|
+
FROM pg_tables
|
|
126
|
+
WHERE schemaname NOT IN ('pg_catalog', 'information_schema')
|
|
127
|
+
ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC
|
|
128
|
+
LIMIT 10;"
|
|
129
|
+
|
|
130
|
+
# Full vacuum on bloated tables (SLOW, locks table)
|
|
131
|
+
sudo -u postgres psql -d [database] -c "VACUUM FULL [table_name];"
|
|
132
|
+
|
|
133
|
+
# Check space
|
|
134
|
+
df -h
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
**Expected recovery:** Variable, depends on bloat
|
|
138
|
+
|
|
139
|
+
### Priority 4: Remove Temp Files
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
# Clear PostgreSQL temp files
|
|
143
|
+
sudo rm -rf /var/lib/postgresql/16/main/pgsql_tmp/*
|
|
144
|
+
|
|
145
|
+
# Clear system temp
|
|
146
|
+
sudo rm -rf /tmp/*
|
|
147
|
+
|
|
148
|
+
# Clear old backups (if local copies exist)
|
|
149
|
+
ls -lh /opt/fairdb/backups/
|
|
150
|
+
# Delete old local backups if remote backups are confirmed
|
|
151
|
+
|
|
152
|
+
df -h
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### Priority 5: Drop Old/Unused Databases (DANGER!)
|
|
156
|
+
|
|
157
|
+
⚠️ **ONLY with customer approval!**
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
# List databases and last access
|
|
161
|
+
sudo -u postgres psql -c "
|
|
162
|
+
SELECT
|
|
163
|
+
datname,
|
|
164
|
+
pg_size_pretty(pg_database_size(datname)) AS size,
|
|
165
|
+
(SELECT max(query_start) FROM pg_stat_activity WHERE datname = d.datname) AS last_activity
|
|
166
|
+
FROM pg_database d
|
|
167
|
+
WHERE datname NOT IN ('template0', 'template1', 'postgres')
|
|
168
|
+
ORDER BY pg_database_size(datname) DESC;"
|
|
169
|
+
|
|
170
|
+
# Identify inactive databases (last_activity is NULL or very old)
|
|
171
|
+
|
|
172
|
+
# BEFORE DROPPING: Backup!
|
|
173
|
+
sudo -u postgres pg_dump [database_name] | gzip > /opt/fairdb/backups/emergency-backup-[database_name].sql.gz
|
|
174
|
+
|
|
175
|
+
# Drop database (IRREVERSIBLE!)
|
|
176
|
+
sudo -u postgres psql -c "DROP DATABASE [database_name];"
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## LONG-TERM SOLUTIONS
|
|
180
|
+
|
|
181
|
+
### Option 1: Increase Disk Size
|
|
182
|
+
|
|
183
|
+
**Contabo/VPS Provider:**
|
|
184
|
+
1. Log into provider control panel
|
|
185
|
+
2. Upgrade storage plan
|
|
186
|
+
3. Resize disk partition
|
|
187
|
+
4. Expand filesystem
|
|
188
|
+
|
|
189
|
+
```bash
|
|
190
|
+
# After resize, expand filesystem
|
|
191
|
+
sudo resize2fs /dev/sda1 # Adjust device as needed
|
|
192
|
+
|
|
193
|
+
# Verify
|
|
194
|
+
df -h
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### Option 2: Move Data to External Volume
|
|
198
|
+
|
|
199
|
+
```bash
|
|
200
|
+
# Create new volume/mount point
|
|
201
|
+
# Move PostgreSQL data directory
|
|
202
|
+
sudo systemctl stop postgresql
|
|
203
|
+
sudo rsync -av /var/lib/postgresql/ /mnt/new-volume/postgresql/
|
|
204
|
+
sudo mv /var/lib/postgresql /var/lib/postgresql.old
|
|
205
|
+
sudo ln -s /mnt/new-volume/postgresql /var/lib/postgresql
|
|
206
|
+
sudo systemctl start postgresql
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### Option 3: Offload Old Data
|
|
210
|
+
|
|
211
|
+
- Archive old customer databases
|
|
212
|
+
- Export historical data to cold storage
|
|
213
|
+
- Implement data retention policies
|
|
214
|
+
|
|
215
|
+
### Option 4: Optimize Storage
|
|
216
|
+
|
|
217
|
+
```bash
|
|
218
|
+
# Enable compression for tables (PostgreSQL 14+)
|
|
219
|
+
ALTER TABLE [table_name] SET COMPRESSION lz4;
|
|
220
|
+
|
|
221
|
+
# Rewrite table to apply compression
|
|
222
|
+
VACUUM FULL [table_name];
|
|
223
|
+
|
|
224
|
+
# Set autovacuum more aggressively
|
|
225
|
+
ALTER TABLE [table_name] SET (autovacuum_vacuum_scale_factor = 0.05);
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
## MONITORING & PREVENTION
|
|
229
|
+
|
|
230
|
+
### Set Up Disk Monitoring
|
|
231
|
+
|
|
232
|
+
Add to cron (`crontab -e`):
|
|
233
|
+
```bash
|
|
234
|
+
# Check disk space every hour
|
|
235
|
+
0 * * * * /opt/fairdb/scripts/check-disk-space.sh
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
**Create script** `/opt/fairdb/scripts/check-disk-space.sh`:
|
|
239
|
+
```bash
|
|
240
|
+
#!/bin/bash
|
|
241
|
+
THRESHOLD=80
|
|
242
|
+
USAGE=$(df -h /var/lib/postgresql | awk 'NR==2 {print $5}' | sed 's/%//')
|
|
243
|
+
|
|
244
|
+
if [ "$USAGE" -gt "$THRESHOLD" ]; then
|
|
245
|
+
echo "WARNING: Disk usage at ${USAGE}%" | mail -s "FairDB Disk Warning" your-email@example.com
|
|
246
|
+
fi
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### Configure Log Rotation
|
|
250
|
+
|
|
251
|
+
Edit `/etc/logrotate.d/postgresql`:
|
|
252
|
+
```
|
|
253
|
+
/var/log/postgresql/*.log {
|
|
254
|
+
daily
|
|
255
|
+
rotate 7
|
|
256
|
+
compress
|
|
257
|
+
delaycompress
|
|
258
|
+
notifempty
|
|
259
|
+
missingok
|
|
260
|
+
}
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### Implement Database Quotas
|
|
264
|
+
|
|
265
|
+
```sql
|
|
266
|
+
-- Set database size limits
|
|
267
|
+
ALTER DATABASE customer_db_001 SET max_database_size = '10GB';
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
## POST-RECOVERY ACTIONS
|
|
271
|
+
|
|
272
|
+
### 1. Verify Database Health
|
|
273
|
+
```bash
|
|
274
|
+
# Check PostgreSQL status
|
|
275
|
+
sudo systemctl status postgresql
|
|
276
|
+
|
|
277
|
+
# Test connections
|
|
278
|
+
sudo -u postgres psql -c "SELECT 1;"
|
|
279
|
+
|
|
280
|
+
# Run health check
|
|
281
|
+
/opt/fairdb/scripts/pg-health-check.sh
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
### 2. Document Incident
|
|
285
|
+
|
|
286
|
+
```markdown
|
|
287
|
+
# Disk Space Emergency - YYYY-MM-DD
|
|
288
|
+
|
|
289
|
+
## Initial State
|
|
290
|
+
- Disk usage: X%
|
|
291
|
+
- Free space: XGB
|
|
292
|
+
- Affected services: [list]
|
|
293
|
+
|
|
294
|
+
## Actions Taken
|
|
295
|
+
- [List each action with space recovered]
|
|
296
|
+
|
|
297
|
+
## Final State
|
|
298
|
+
- Disk usage: X%
|
|
299
|
+
- Free space: XGB
|
|
300
|
+
- Time to resolution: X minutes
|
|
301
|
+
|
|
302
|
+
## Root Cause
|
|
303
|
+
[Why did disk fill up?]
|
|
304
|
+
|
|
305
|
+
## Prevention
|
|
306
|
+
- [ ] Implement monitoring
|
|
307
|
+
- [ ] Set up log rotation
|
|
308
|
+
- [ ] Schedule regular cleanups
|
|
309
|
+
- [ ] Consider storage upgrade
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
### 3. Implement Monitoring
|
|
313
|
+
|
|
314
|
+
```bash
|
|
315
|
+
# Install monitoring script
|
|
316
|
+
sudo cp /opt/fairdb/scripts/check-disk-space.sh /etc/cron.hourly/
|
|
317
|
+
|
|
318
|
+
# Set up alerts
|
|
319
|
+
# (Configure email/Slack notifications)
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
## DECISION TREE
|
|
323
|
+
|
|
324
|
+
```
|
|
325
|
+
Disk at 100%?
|
|
326
|
+
├─ Yes → Priority 1 & 2 (Logs + WAL) IMMEDIATELY
|
|
327
|
+
│ ├─ Space freed? → Continue to monitoring
|
|
328
|
+
│ └─ Still full? → Priority 3 (Vacuum) + Consider Priority 5
|
|
329
|
+
│
|
|
330
|
+
└─ Disk at 85-99%?
|
|
331
|
+
├─ Priority 1 (Logs) + Schedule Priority 3 (Vacuum)
|
|
332
|
+
└─ Plan long-term solution (resize disk)
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
## START RESPONSE
|
|
336
|
+
|
|
337
|
+
Ask user:
|
|
338
|
+
1. "What is the current disk usage? (run `df -h`)"
|
|
339
|
+
2. "Is PostgreSQL still running?"
|
|
340
|
+
3. "When did this start happening?"
|
|
341
|
+
|
|
342
|
+
Then immediately execute Rapid Assessment and Emergency Space Recovery procedures.
|
|
343
|
+
|
|
344
|
+
**Remember:** Time is critical. Database writes are failing. Act fast but safely!
|