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.
@@ -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 " 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"
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 " 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"
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 " 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"
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 " rake postgres:migrate # Run migrations on primary only"
314
+ puts ' rake postgres:migrate # Run migrations on primary only'
315
315
 
316
316
  puts "\nPgBouncer"
317
- puts " rake postgres:pgbouncer:update_userlist[users] # Update userlist"
318
- puts " rake postgres:pgbouncer:stats # Service status + stats"
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 " rake postgres:test:replication[rows] # Replication stress test"
322
- puts " rake postgres:test:pgbouncer[connections] # PgBouncer load test"
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, [:target_time, :target_action] => :environment do |_t, args|
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(/O\s*=\s*"?([^",\/]+)"?/)&.captures&.first
611
- issuer_cn = cert_issuer.match(/CN\s*=\s*([^,\/]+)/)&.captures&.first
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' | sort -u)
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.5
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.3'
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.3'
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.0'
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.0'
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: '6.0'
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: '6.0'
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.21'
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.21'
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.3'
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.3'
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: 3.3.0
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: 3.6.9
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: []