active_postgres 0.9.5 → 0.9.7
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +40 -0
- data/README.md +47 -6
- data/SECURITY.md +21 -0
- data/lib/active_postgres/components/base.rb +2 -0
- data/lib/active_postgres/components/core.rb +11 -4
- data/lib/active_postgres/components/monitoring.rb +2 -2
- data/lib/active_postgres/components/pgbackrest.rb +13 -17
- data/lib/active_postgres/components/pgbouncer.rb +5 -9
- data/lib/active_postgres/components/repmgr.rb +165 -105
- data/lib/active_postgres/configuration/pgbackrest_policy.rb +19 -0
- data/lib/active_postgres/configuration/standby_policy.rb +24 -0
- data/lib/active_postgres/configuration.rb +64 -38
- data/lib/active_postgres/deployment_flow.rb +5 -1
- data/lib/active_postgres/direct_executor.rb +3 -9
- data/lib/active_postgres/error_handler.rb +18 -18
- data/lib/active_postgres/generators/active_postgres/templates/postgres.yml.erb +7 -0
- data/lib/active_postgres/health_checker.rb +10 -12
- data/lib/active_postgres/installer.rb +2 -2
- data/lib/active_postgres/overview.rb +10 -10
- data/lib/active_postgres/secrets.rb +6 -7
- data/lib/active_postgres/ssh_executor.rb +66 -9
- data/lib/active_postgres/standby_deployment_flow.rb +46 -8
- data/lib/active_postgres/version.rb +1 -1
- data/lib/tasks/postgres.rake +26 -26
- data/templates/pgbackrest.conf.erb +9 -1
- data/templates/postgresql.conf.erb +5 -0
- data/templates/repmgr_dns_failover.sh.erb +2 -2
- metadata +18 -56
data/lib/tasks/postgres.rake
CHANGED
|
@@ -287,39 +287,39 @@ namespace :postgres do
|
|
|
287
287
|
puts "\nTip: set RAILS_ENV=production for production targets"
|
|
288
288
|
|
|
289
289
|
puts "\nSetup & Maintenance"
|
|
290
|
-
puts
|
|
291
|
-
puts
|
|
292
|
-
puts
|
|
293
|
-
puts
|
|
294
|
-
puts
|
|
295
|
-
puts
|
|
296
|
-
puts
|
|
297
|
-
puts
|
|
290
|
+
puts ' rake postgres:setup # Deploy HA cluster (CLEAN=true for fresh install)'
|
|
291
|
+
puts ' rake postgres:purge # Destroy cluster (DESTRUCTIVE)'
|
|
292
|
+
puts ' rake postgres:setup:core # PostgreSQL config (postgresql.conf, pg_hba.conf)'
|
|
293
|
+
puts ' rake postgres:setup:repmgr # HA + failover (repmgr)'
|
|
294
|
+
puts ' rake postgres:setup:pgbouncer # PgBouncer pooling'
|
|
295
|
+
puts ' rake postgres:setup:pgbackrest # Backups (pgBackRest)'
|
|
296
|
+
puts ' rake postgres:setup:monitoring # postgres_exporter'
|
|
297
|
+
puts ' rake postgres:setup:ssl # SSL certs'
|
|
298
298
|
|
|
299
299
|
puts "\nStatus & Health"
|
|
300
|
-
puts
|
|
301
|
-
puts
|
|
302
|
-
puts
|
|
303
|
-
puts
|
|
304
|
-
puts
|
|
300
|
+
puts ' rake postgres:status # Cluster status (SSH by default)'
|
|
301
|
+
puts ' rake postgres:overview # Control tower overview'
|
|
302
|
+
puts ' rake postgres:nodes # Topology view'
|
|
303
|
+
puts ' rake postgres:verify # Comprehensive checklist'
|
|
304
|
+
puts ' ACTIVE_POSTGRES_STATUS_MODE=ssh|direct rake postgres:status'
|
|
305
305
|
|
|
306
306
|
puts "\nBackups"
|
|
307
|
-
puts
|
|
308
|
-
puts
|
|
309
|
-
puts
|
|
310
|
-
puts
|
|
311
|
-
puts
|
|
307
|
+
puts ' rake postgres:backup:full # Full backup'
|
|
308
|
+
puts ' rake postgres:backup:incremental # Incremental backup'
|
|
309
|
+
puts ' rake postgres:backup:list # List backups'
|
|
310
|
+
puts ' rake postgres:backup:restore[ID] # Restore backup set'
|
|
311
|
+
puts ' rake postgres:backup:restore_at["YYYY-MM-DD HH:MM:SS",promote] # PITR'
|
|
312
312
|
|
|
313
313
|
puts "\nMigrations"
|
|
314
|
-
puts
|
|
314
|
+
puts ' rake postgres:migrate # Run migrations on primary only'
|
|
315
315
|
|
|
316
316
|
puts "\nPgBouncer"
|
|
317
|
-
puts
|
|
318
|
-
puts
|
|
317
|
+
puts ' rake postgres:pgbouncer:update_userlist[users] # Update userlist'
|
|
318
|
+
puts ' rake postgres:pgbouncer:stats # Service status + stats'
|
|
319
319
|
|
|
320
320
|
puts "\nTests"
|
|
321
|
-
puts
|
|
322
|
-
puts
|
|
321
|
+
puts ' rake postgres:test:replication[rows] # Replication stress test'
|
|
322
|
+
puts ' rake postgres:test:pgbouncer[connections] # PgBouncer load test'
|
|
323
323
|
|
|
324
324
|
puts
|
|
325
325
|
end
|
|
@@ -380,7 +380,7 @@ namespace :postgres do
|
|
|
380
380
|
end
|
|
381
381
|
|
|
382
382
|
desc 'Restore to a point in time (PITR)'
|
|
383
|
-
task :restore_at, [
|
|
383
|
+
task :restore_at, %i[target_time target_action] => :environment do |_t, args|
|
|
384
384
|
require 'active_postgres'
|
|
385
385
|
|
|
386
386
|
unless args[:target_time]
|
|
@@ -607,8 +607,8 @@ namespace :postgres do
|
|
|
607
607
|
nil
|
|
608
608
|
end
|
|
609
609
|
if cert_issuer
|
|
610
|
-
issuer_o = cert_issuer.match(
|
|
611
|
-
issuer_cn = cert_issuer.match(
|
|
610
|
+
issuer_o = cert_issuer.match(%r{O\s*=\s*"?([^",/]+)"?})&.captures&.first
|
|
611
|
+
issuer_cn = cert_issuer.match(%r{CN\s*=\s*([^,/]+)})&.captures&.first
|
|
612
612
|
issuer_name = issuer_o || issuer_cn || cert_issuer.sub('issuer=', '')
|
|
613
613
|
info " Issuer: #{issuer_name.strip}"
|
|
614
614
|
end
|
|
@@ -40,6 +40,15 @@ repo1-path=<%= pgbackrest_config[:repo_path] || '/var/lib/pgbackrest' %>
|
|
|
40
40
|
repo1-retention-full=<%= pgbackrest_config[:retention_full] || 7 %>
|
|
41
41
|
repo1-retention-archive=<%= pgbackrest_config[:retention_archive] || 14 %>
|
|
42
42
|
|
|
43
|
+
<% if pgbackrest_config[:repo_bundle] %>
|
|
44
|
+
# Bundle small files and metadata into fewer repository objects.
|
|
45
|
+
repo1-bundle=y
|
|
46
|
+
<% end %>
|
|
47
|
+
<% if pgbackrest_config[:repo_block] %>
|
|
48
|
+
# Back up changed blocks instead of entire relation files.
|
|
49
|
+
repo1-block=y
|
|
50
|
+
<% end %>
|
|
51
|
+
|
|
43
52
|
# Compression
|
|
44
53
|
compress-type=lz4
|
|
45
54
|
compress-level=3
|
|
@@ -69,4 +78,3 @@ pg1-path=/var/lib/postgresql/<%= config.version %>/main
|
|
|
69
78
|
pg1-port=5432
|
|
70
79
|
pg1-socket-path=/var/run/postgresql
|
|
71
80
|
pg1-user=<%= config.postgres_user %>
|
|
72
|
-
|
|
@@ -52,6 +52,11 @@ archive_command = '<%= pg_config[:archive_command] %>'
|
|
|
52
52
|
<% elsif config.component_enabled?(:pgbackrest) %>
|
|
53
53
|
archive_command = 'pgbackrest --stanza=main archive-push %p'
|
|
54
54
|
<% end %>
|
|
55
|
+
<% if pg_config[:restore_command] %>
|
|
56
|
+
restore_command = '<%= pg_config[:restore_command] %>'
|
|
57
|
+
<% elsif config.component_enabled?(:pgbackrest) %>
|
|
58
|
+
restore_command = 'pgbackrest --pg1-path=/var/lib/postgresql/<%= config.version %>/main --stanza=main archive-get %f "%p"'
|
|
59
|
+
<% end %>
|
|
55
60
|
<% if pg_config[:shared_memory_type] %>
|
|
56
61
|
shared_memory_type = <%= pg_config[:shared_memory_type] %>
|
|
57
62
|
<% end %>
|
|
@@ -17,13 +17,13 @@ REPMGR_DB=$(grep -oP "dbname=\K[^ ']+" "$REPMGR_CONF" | head -1)
|
|
|
17
17
|
REPMGR_USER=$(grep -oP "user=\K[^ ']+" "$REPMGR_CONF" 2>/dev/null | head -1)
|
|
18
18
|
REPMGR_USER="${REPMGR_USER:-repmgr}"
|
|
19
19
|
|
|
20
|
-
cluster_data=$(psql -h /var/run/postgresql -d "$REPMGR_DB" -tAF',' -c "SELECT type, conninfo FROM repmgr.nodes WHERE active = true" 2>/dev/null || true)
|
|
20
|
+
cluster_data=$(psql -h /var/run/postgresql -d "$REPMGR_DB" -tAF',' -c "SELECT type, conninfo FROM repmgr.nodes WHERE active = true ORDER BY node_id" 2>/dev/null || true)
|
|
21
21
|
if [[ -z "$cluster_data" ]]; then
|
|
22
22
|
exit 0
|
|
23
23
|
fi
|
|
24
24
|
|
|
25
25
|
primary_host=$(printf "%s\n" "$cluster_data" | awk -F',' '$1 == "primary" {print $2; exit}' | sed -n 's/.*host=\([^ ]*\).*/\1/p')
|
|
26
|
-
standby_hosts=$(printf "%s\n" "$cluster_data" | awk -F',' '$1 == "standby" {print $2}' | sed -n 's/.*host=\([^ ]*\).*/\1/p'
|
|
26
|
+
standby_hosts=$(printf "%s\n" "$cluster_data" | awk -F',' '$1 == "standby" {print $2; exit}' | sed -n 's/.*host=\([^ ]*\).*/\1/p')
|
|
27
27
|
|
|
28
28
|
if [[ -z "$primary_host" ]]; then
|
|
29
29
|
exit 0
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: active_postgres
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.9.
|
|
4
|
+
version: 0.9.7
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- BoringCache
|
|
@@ -29,35 +29,35 @@ dependencies:
|
|
|
29
29
|
requirements:
|
|
30
30
|
- - "~>"
|
|
31
31
|
- !ruby/object:Gem::Version
|
|
32
|
-
version: '1.
|
|
32
|
+
version: '1.4'
|
|
33
33
|
type: :runtime
|
|
34
34
|
prerelease: false
|
|
35
35
|
version_requirements: !ruby/object:Gem::Requirement
|
|
36
36
|
requirements:
|
|
37
37
|
- - "~>"
|
|
38
38
|
- !ruby/object:Gem::Version
|
|
39
|
-
version: '1.
|
|
39
|
+
version: '1.4'
|
|
40
40
|
- !ruby/object:Gem::Dependency
|
|
41
41
|
name: pg
|
|
42
42
|
requirement: !ruby/object:Gem::Requirement
|
|
43
43
|
requirements:
|
|
44
44
|
- - "~>"
|
|
45
45
|
- !ruby/object:Gem::Version
|
|
46
|
-
version: '1.
|
|
46
|
+
version: '1.6'
|
|
47
47
|
type: :runtime
|
|
48
48
|
prerelease: false
|
|
49
49
|
version_requirements: !ruby/object:Gem::Requirement
|
|
50
50
|
requirements:
|
|
51
51
|
- - "~>"
|
|
52
52
|
- !ruby/object:Gem::Version
|
|
53
|
-
version: '1.
|
|
53
|
+
version: '1.6'
|
|
54
54
|
- !ruby/object:Gem::Dependency
|
|
55
55
|
name: railties
|
|
56
56
|
requirement: !ruby/object:Gem::Requirement
|
|
57
57
|
requirements:
|
|
58
58
|
- - ">="
|
|
59
59
|
- !ruby/object:Gem::Version
|
|
60
|
-
version: '
|
|
60
|
+
version: '8.1'
|
|
61
61
|
- - "<"
|
|
62
62
|
- !ruby/object:Gem::Version
|
|
63
63
|
version: '9.0'
|
|
@@ -67,7 +67,7 @@ dependencies:
|
|
|
67
67
|
requirements:
|
|
68
68
|
- - ">="
|
|
69
69
|
- !ruby/object:Gem::Version
|
|
70
|
-
version: '
|
|
70
|
+
version: '8.1'
|
|
71
71
|
- - "<"
|
|
72
72
|
- !ruby/object:Gem::Version
|
|
73
73
|
version: '9.0'
|
|
@@ -77,70 +77,28 @@ dependencies:
|
|
|
77
77
|
requirements:
|
|
78
78
|
- - "~>"
|
|
79
79
|
- !ruby/object:Gem::Version
|
|
80
|
-
version: '1.
|
|
80
|
+
version: '1.25'
|
|
81
81
|
type: :runtime
|
|
82
82
|
prerelease: false
|
|
83
83
|
version_requirements: !ruby/object:Gem::Requirement
|
|
84
84
|
requirements:
|
|
85
85
|
- - "~>"
|
|
86
86
|
- !ruby/object:Gem::Version
|
|
87
|
-
version: '1.
|
|
87
|
+
version: '1.25'
|
|
88
88
|
- !ruby/object:Gem::Dependency
|
|
89
89
|
name: thor
|
|
90
90
|
requirement: !ruby/object:Gem::Requirement
|
|
91
91
|
requirements:
|
|
92
92
|
- - "~>"
|
|
93
93
|
- !ruby/object:Gem::Version
|
|
94
|
-
version: '1.
|
|
94
|
+
version: '1.5'
|
|
95
95
|
type: :runtime
|
|
96
96
|
prerelease: false
|
|
97
97
|
version_requirements: !ruby/object:Gem::Requirement
|
|
98
98
|
requirements:
|
|
99
99
|
- - "~>"
|
|
100
100
|
- !ruby/object:Gem::Version
|
|
101
|
-
version: '1.
|
|
102
|
-
- !ruby/object:Gem::Dependency
|
|
103
|
-
name: minitest
|
|
104
|
-
requirement: !ruby/object:Gem::Requirement
|
|
105
|
-
requirements:
|
|
106
|
-
- - "~>"
|
|
107
|
-
- !ruby/object:Gem::Version
|
|
108
|
-
version: '5.0'
|
|
109
|
-
type: :development
|
|
110
|
-
prerelease: false
|
|
111
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
112
|
-
requirements:
|
|
113
|
-
- - "~>"
|
|
114
|
-
- !ruby/object:Gem::Version
|
|
115
|
-
version: '5.0'
|
|
116
|
-
- !ruby/object:Gem::Dependency
|
|
117
|
-
name: rubocop
|
|
118
|
-
requirement: !ruby/object:Gem::Requirement
|
|
119
|
-
requirements:
|
|
120
|
-
- - "~>"
|
|
121
|
-
- !ruby/object:Gem::Version
|
|
122
|
-
version: '1.50'
|
|
123
|
-
type: :development
|
|
124
|
-
prerelease: false
|
|
125
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
126
|
-
requirements:
|
|
127
|
-
- - "~>"
|
|
128
|
-
- !ruby/object:Gem::Version
|
|
129
|
-
version: '1.50'
|
|
130
|
-
- !ruby/object:Gem::Dependency
|
|
131
|
-
name: simplecov
|
|
132
|
-
requirement: !ruby/object:Gem::Requirement
|
|
133
|
-
requirements:
|
|
134
|
-
- - "~>"
|
|
135
|
-
- !ruby/object:Gem::Version
|
|
136
|
-
version: '0.22'
|
|
137
|
-
type: :development
|
|
138
|
-
prerelease: false
|
|
139
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
140
|
-
requirements:
|
|
141
|
-
- - "~>"
|
|
142
|
-
- !ruby/object:Gem::Version
|
|
143
|
-
version: '0.22'
|
|
101
|
+
version: '1.5'
|
|
144
102
|
description: Production-grade PostgreSQL HA with deep Rails integration. Automated
|
|
145
103
|
deployment, replication, failover, and monitoring.
|
|
146
104
|
email:
|
|
@@ -150,8 +108,10 @@ executables:
|
|
|
150
108
|
extensions: []
|
|
151
109
|
extra_rdoc_files: []
|
|
152
110
|
files:
|
|
111
|
+
- CHANGELOG.md
|
|
153
112
|
- LICENSE
|
|
154
113
|
- README.md
|
|
114
|
+
- SECURITY.md
|
|
155
115
|
- exe/activepostgres
|
|
156
116
|
- lib/active_postgres.rb
|
|
157
117
|
- lib/active_postgres/cli.rb
|
|
@@ -166,6 +126,8 @@ files:
|
|
|
166
126
|
- lib/active_postgres/components/repmgr.rb
|
|
167
127
|
- lib/active_postgres/components/ssl.rb
|
|
168
128
|
- lib/active_postgres/configuration.rb
|
|
129
|
+
- lib/active_postgres/configuration/pgbackrest_policy.rb
|
|
130
|
+
- lib/active_postgres/configuration/standby_policy.rb
|
|
169
131
|
- lib/active_postgres/connection_pooler.rb
|
|
170
132
|
- lib/active_postgres/credentials.rb
|
|
171
133
|
- lib/active_postgres/deployment_flow.rb
|
|
@@ -209,10 +171,10 @@ homepage: https://github.com/boringcache/active_postgres
|
|
|
209
171
|
licenses:
|
|
210
172
|
- MIT
|
|
211
173
|
metadata:
|
|
212
|
-
homepage_uri: https://github.com/boringcache/active_postgres
|
|
213
174
|
source_code_uri: https://github.com/boringcache/active_postgres
|
|
214
175
|
documentation_uri: https://github.com/boringcache/active_postgres/blob/main/README.md
|
|
215
176
|
changelog_uri: https://github.com/boringcache/active_postgres/blob/main/CHANGELOG.md
|
|
177
|
+
bug_tracker_uri: https://github.com/boringcache/active_postgres/issues
|
|
216
178
|
rubygems_mfa_required: 'true'
|
|
217
179
|
rdoc_options: []
|
|
218
180
|
require_paths:
|
|
@@ -221,14 +183,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
221
183
|
requirements:
|
|
222
184
|
- - ">="
|
|
223
185
|
- !ruby/object:Gem::Version
|
|
224
|
-
version:
|
|
186
|
+
version: 4.0.0
|
|
225
187
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
226
188
|
requirements:
|
|
227
189
|
- - ">="
|
|
228
190
|
- !ruby/object:Gem::Version
|
|
229
191
|
version: '0'
|
|
230
192
|
requirements: []
|
|
231
|
-
rubygems_version:
|
|
193
|
+
rubygems_version: 4.0.16
|
|
232
194
|
specification_version: 4
|
|
233
195
|
summary: PostgreSQL High Availability for Rails, made simple
|
|
234
196
|
test_files: []
|