مراية لـ
https://github.com/postalserver/postal.git
تم المزامنة 2026-03-03 14:24:06 +00:00
Compare commits
7 الالتزامات
| المؤلف | SHA1 | التاريخ | |
|---|---|---|---|
|
|
eded789c37 | ||
|
|
ea542a0694 | ||
|
|
7e2acccd1e | ||
|
|
ee8d829a85 | ||
|
|
4fcb9e9a2e | ||
|
|
45dd8aaac5 | ||
|
|
364eba6c5f |
@@ -1,3 +1,3 @@
|
||||
{
|
||||
".": "3.2.2"
|
||||
".": "3.3.0"
|
||||
}
|
||||
|
||||
20
CHANGELOG.md
20
CHANGELOG.md
@@ -2,6 +2,26 @@
|
||||
|
||||
This file contains all the latest changes and updates to Postal.
|
||||
|
||||
## [3.3.0](https://github.com/postalserver/postal/compare/3.2.2...3.3.0) (2024-03-18)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **prometheus:** add `postal_message_queue_latency` metric ([ee8d829](https://github.com/postalserver/postal/commit/ee8d829a854f91e476167869cafe35c2d37bb314))
|
||||
* **worker:** allow number of threads to be configured ([7e2accc](https://github.com/postalserver/postal/commit/7e2acccd1ebd80750a3ebdb96cb5c36b5263cc24))
|
||||
* **worker:** scale connection pool with worker threads ([ea542a0](https://github.com/postalserver/postal/commit/ea542a0694b3465b04fd3ebc439837df414deb1e))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **message-dequeuer:** ability to disable batching ([4fcb9e9](https://github.com/postalserver/postal/commit/4fcb9e9a2e34be5aa4bdf13f0529f40e564b72b4))
|
||||
|
||||
|
||||
### Miscellaneous Chores
|
||||
|
||||
* **config-docs:** update docs for latest oidc defaults ([364eba6](https://github.com/postalserver/postal/commit/364eba6c5fce2f08a36489f42856ad5024a2062c))
|
||||
* **config-docs:** update proxy protocol to mention v1 ([45dd8aa](https://github.com/postalserver/postal/commit/45dd8aaac56f15481cb7bf9081401cb28dc1e707))
|
||||
|
||||
## [3.2.2](https://github.com/postalserver/postal/compare/3.2.1...3.2.2) (2024-03-14)
|
||||
|
||||
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
module MessageDequeuer
|
||||
class InitialProcessor < Base
|
||||
|
||||
include HasPrometheusMetrics
|
||||
|
||||
attr_accessor :send_result
|
||||
|
||||
def process
|
||||
@@ -10,6 +12,7 @@ module MessageDequeuer
|
||||
logger.info "starting message unqueue"
|
||||
begin
|
||||
catch_stops do
|
||||
increment_dequeue_metric
|
||||
check_message_exists
|
||||
check_message_is_ready
|
||||
find_other_messages_for_batch
|
||||
@@ -17,7 +20,7 @@ module MessageDequeuer
|
||||
# Process the original message and then all of those
|
||||
# found for batching.
|
||||
process_message(@queued_message)
|
||||
@other_messages.each { |message| process_message(message) }
|
||||
@other_messages&.each { |message| process_message(message) }
|
||||
end
|
||||
ensure
|
||||
@state.finished
|
||||
@@ -28,6 +31,13 @@ module MessageDequeuer
|
||||
|
||||
private
|
||||
|
||||
def increment_dequeue_metric
|
||||
time_in_queue = Time.now.to_f - @queued_message.created_at.to_f
|
||||
log "queue latency is #{time_in_queue}s"
|
||||
observe_prometheus_histogram :postal_message_queue_latency,
|
||||
time_in_queue
|
||||
end
|
||||
|
||||
def check_message_exists
|
||||
return if @queued_message.message
|
||||
|
||||
@@ -45,6 +55,8 @@ module MessageDequeuer
|
||||
end
|
||||
|
||||
def find_other_messages_for_batch
|
||||
return unless Postal::Config.postal.batch_queued_messages?
|
||||
|
||||
@other_messages = @queued_message.batchable_messages(100)
|
||||
log "found #{@other_messages.size} associated messages to process at the same time", batch_key: @queued_message.batch_key
|
||||
rescue StandardError
|
||||
|
||||
@@ -45,7 +45,9 @@ module Worker
|
||||
].freeze
|
||||
|
||||
# @param [Integer] thread_count The number of worker threads to run in this process
|
||||
def initialize(thread_count: 2, work_sleep_time: 5, task_sleep_time: 60)
|
||||
def initialize(thread_count: Postal::Config.worker.threads,
|
||||
work_sleep_time: 5,
|
||||
task_sleep_time: 60)
|
||||
@thread_count = thread_count
|
||||
@exit_pipe_read, @exit_pipe_write = IO.pipe
|
||||
@work_sleep_time = work_sleep_time
|
||||
@@ -58,6 +60,7 @@ module Worker
|
||||
def run
|
||||
logger.tagged(component: "worker") do
|
||||
setup_traps
|
||||
ensure_connection_pool_size_is_suitable
|
||||
start_work_threads
|
||||
start_tasks_thread
|
||||
wait_for_threads
|
||||
@@ -94,6 +97,23 @@ module Worker
|
||||
@exit_pipe_read.wait_readable(wait_time) ? true : false
|
||||
end
|
||||
|
||||
# Ensure that the connection pool is big enough for the number of threads
|
||||
# configured.
|
||||
#
|
||||
# @return [void]
|
||||
def ensure_connection_pool_size_is_suitable
|
||||
current_pool_size = ActiveRecord::Base.connection_pool.size
|
||||
desired_pool_size = @thread_count + 3
|
||||
|
||||
return if current_pool_size >= desired_pool_size
|
||||
|
||||
logger.warn "number of worker threads (#{@thread_count}) is more " \
|
||||
"than the db connection pool size (#{current_pool_size}+3), " \
|
||||
"increasing connection pool size to #{desired_pool_size}"
|
||||
|
||||
Postal.change_database_connection_pool_size(desired_pool_size)
|
||||
end
|
||||
|
||||
# Wait for all threads to complete
|
||||
#
|
||||
# @return [void]
|
||||
@@ -288,6 +308,9 @@ module Worker
|
||||
register_prometheus_histogram :postal_worker_task_runtime,
|
||||
docstring: "The time taken to process tasks",
|
||||
labels: [:task]
|
||||
|
||||
register_prometheus_histogram :postal_message_queue_latency,
|
||||
docstring: "The length of time between a message being queued and being dequeued"
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@@ -19,11 +19,13 @@ This document contains all the environment variables which are available for thi
|
||||
| `POSTAL_SMTP_RELAYS` | Array of strings | An array of SMTP relays in the format of smtp://host:port | [] |
|
||||
| `POSTAL_TRUSTED_PROXIES` | Array of strings | An array of IP addresses to trust for proxying requests to Postal (in addition to localhost addresses) | [] |
|
||||
| `POSTAL_QUEUED_MESSAGE_LOCK_STALE_DAYS` | Integer | The number of days after which to consider a lock as stale. Messages with stale locks will be removed and not retried. | 1 |
|
||||
| `POSTAL_BATCH_QUEUED_MESSAGES` | Boolean | When enabled queued messages will be de-queued in batches based on their destination | true |
|
||||
| `WEB_SERVER_DEFAULT_PORT` | Integer | The default port the web server should listen on unless overriden by the PORT environment variable | 5000 |
|
||||
| `WEB_SERVER_DEFAULT_BIND_ADDRESS` | String | The default bind address the web server should listen on unless overriden by the BIND_ADDRESS environment variable | 127.0.0.1 |
|
||||
| `WEB_SERVER_MAX_THREADS` | Integer | The maximum number of threads which can be used by the web server | 5 |
|
||||
| `WORKER_DEFAULT_HEALTH_SERVER_PORT` | Integer | The default port for the worker health server to listen on | 9090 |
|
||||
| `WORKER_DEFAULT_HEALTH_SERVER_BIND_ADDRESS` | String | The default bind address for the worker health server to listen on | 127.0.0.1 |
|
||||
| `WORKER_THREADS` | Integer | The number of threads to execute within each worker | 2 |
|
||||
| `MAIN_DB_HOST` | String | Hostname for the main MariaDB server | localhost |
|
||||
| `MAIN_DB_PORT` | Integer | The MariaDB port to connect to | 3306 |
|
||||
| `MAIN_DB_USERNAME` | String | The MariaDB username | postal |
|
||||
@@ -53,7 +55,7 @@ This document contains all the environment variables which are available for thi
|
||||
| `SMTP_SERVER_TLS_PRIVATE_KEY_PATH` | String | The path to the SMTP server's TLS private key | $config-file-root/smtp.key |
|
||||
| `SMTP_SERVER_TLS_CIPHERS` | String | Override ciphers to use for SSL | |
|
||||
| `SMTP_SERVER_SSL_VERSION` | String | The SSL versions which are supported | SSLv23 |
|
||||
| `SMTP_SERVER_PROXY_PROTOCOL` | Boolean | Enable proxy protocol for use behind some load balancers | false |
|
||||
| `SMTP_SERVER_PROXY_PROTOCOL` | Boolean | Enable proxy protocol for use behind some load balancers (supports proxy protocol v1 only) | false |
|
||||
| `SMTP_SERVER_LOG_CONNECTIONS` | Boolean | Enable connection logging | false |
|
||||
| `SMTP_SERVER_MAX_MESSAGE_SIZE` | Integer | The maximum message size to accept from the SMTP server (in MB) | 14 |
|
||||
| `SMTP_SERVER_LOG_IP_ADDRESS_EXCLUSION_MATCHER` | String | A regular expression to use to exclude connections from logging | |
|
||||
@@ -98,13 +100,14 @@ This document contains all the environment variables which are available for thi
|
||||
| `MIGRATION_WAITER_ATTEMPTS` | Integer | The number of attempts to try waiting for migrations to complete before start | 120 |
|
||||
| `MIGRATION_WAITER_SLEEP_TIME` | Integer | The number of seconds to wait between each migration check | 2 |
|
||||
| `OIDC_ENABLED` | Boolean | Enable OIDC authentication | false |
|
||||
| `OIDC_LOCAL_AUTHENTICATION_ENABLED` | Boolean | When enabled, users with passwords will still be able to login locally. If disable, only OpenID Connect will be available. | true |
|
||||
| `OIDC_NAME` | String | The name of the OIDC provider as shown in the UI | OIDC Provider |
|
||||
| `OIDC_ISSUER` | String | The OIDC issuer URL | |
|
||||
| `OIDC_IDENTIFIER` | String | The client ID for OIDC | |
|
||||
| `OIDC_SECRET` | String | The client secret for OIDC | |
|
||||
| `OIDC_SCOPES` | Array of strings | Scopes to request from the OIDC server. | openid |
|
||||
| `OIDC_SCOPES` | Array of strings | Scopes to request from the OIDC server. | openid,email |
|
||||
| `OIDC_UID_FIELD` | String | The field to use to determine the user's UID | sub |
|
||||
| `OIDC_EMAIL_ADDRESS_FIELD` | String | The field to use to determine the user's email address | sub |
|
||||
| `OIDC_EMAIL_ADDRESS_FIELD` | String | The field to use to determine the user's email address | email |
|
||||
| `OIDC_NAME_FIELD` | String | The field to use to determine the user's name | name |
|
||||
| `OIDC_DISCOVERY` | Boolean | Enable discovery to determine endpoints from .well-known/openid-configuration from the Issuer | true |
|
||||
| `OIDC_AUTHORIZATION_ENDPOINT` | String | The authorize endpoint on the authorization server (only used when discovery is false) | |
|
||||
|
||||
@@ -31,6 +31,8 @@ postal:
|
||||
trusted_proxies: []
|
||||
# The number of days after which to consider a lock as stale. Messages with stale locks will be removed and not retried.
|
||||
queued_message_lock_stale_days: 1
|
||||
# When enabled queued messages will be de-queued in batches based on their destination
|
||||
batch_queued_messages: true
|
||||
|
||||
web_server:
|
||||
# The default port the web server should listen on unless overriden by the PORT environment variable
|
||||
@@ -45,6 +47,8 @@ worker:
|
||||
default_health_server_port: 9090
|
||||
# The default bind address for the worker health server to listen on
|
||||
default_health_server_bind_address: 127.0.0.1
|
||||
# The number of threads to execute within each worker
|
||||
threads: 2
|
||||
|
||||
main_db:
|
||||
# Hostname for the main MariaDB server
|
||||
@@ -113,7 +117,7 @@ smtp_server:
|
||||
tls_ciphers:
|
||||
# The SSL versions which are supported
|
||||
ssl_version: SSLv23
|
||||
# Enable proxy protocol for use behind some load balancers
|
||||
# Enable proxy protocol for use behind some load balancers (supports proxy protocol v1 only)
|
||||
proxy_protocol: false
|
||||
# Enable connection logging
|
||||
log_connections: false
|
||||
@@ -223,6 +227,8 @@ migration_waiter:
|
||||
oidc:
|
||||
# Enable OIDC authentication
|
||||
enabled: false
|
||||
# When enabled, users with passwords will still be able to login locally. If disable, only OpenID Connect will be available.
|
||||
local_authentication_enabled: true
|
||||
# The name of the OIDC provider as shown in the UI
|
||||
name: OIDC Provider
|
||||
# The OIDC issuer URL
|
||||
@@ -233,11 +239,11 @@ oidc:
|
||||
secret:
|
||||
# Scopes to request from the OIDC server.
|
||||
scopes:
|
||||
- openid
|
||||
- openid,email
|
||||
# The field to use to determine the user's UID
|
||||
uid_field: sub
|
||||
# The field to use to determine the user's email address
|
||||
email_address_field: sub
|
||||
email_address_field: email
|
||||
# The field to use to determine the user's name
|
||||
name_field: name
|
||||
# Enable discovery to determine endpoints from .well-known/openid-configuration from the Issuer
|
||||
|
||||
@@ -22,6 +22,8 @@ module Postal
|
||||
|
||||
class << self
|
||||
|
||||
attr_writer :current_process_type
|
||||
|
||||
# Return the path to the config file
|
||||
#
|
||||
# @return [String]
|
||||
@@ -136,6 +138,21 @@ module Postal
|
||||
end
|
||||
end
|
||||
|
||||
# Change the connection pool size to the given size.
|
||||
#
|
||||
# @param new_size [Integer]
|
||||
# @return [void]
|
||||
def change_database_connection_pool_size(new_size)
|
||||
ActiveRecord::Base.connection_pool.disconnect!
|
||||
|
||||
config = ActiveRecord::Base.configurations
|
||||
.configs_for(env_name: Rails.env)
|
||||
.first
|
||||
.configuration_hash
|
||||
|
||||
ActiveRecord::Base.establish_connection(config.merge(pool: new_size))
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
Config = initialize_config
|
||||
|
||||
@@ -96,6 +96,11 @@ module Postal
|
||||
description "The number of days after which to consider a lock as stale. Messages with stale locks will be removed and not retried."
|
||||
default 1
|
||||
end
|
||||
|
||||
boolean :batch_queued_messages do
|
||||
description "When enabled queued messages will be de-queued in batches based on their destination"
|
||||
default true
|
||||
end
|
||||
end
|
||||
|
||||
group :web_server do
|
||||
@@ -125,6 +130,11 @@ module Postal
|
||||
description "The default bind address for the worker health server to listen on"
|
||||
default "127.0.0.1"
|
||||
end
|
||||
|
||||
integer :threads do
|
||||
description "The number of threads to execute within each worker"
|
||||
default 2
|
||||
end
|
||||
end
|
||||
|
||||
group :main_db do
|
||||
|
||||
@@ -62,13 +62,28 @@ module MessageDequeuer
|
||||
@queued_message3 = create(:queued_message, message: @message3)
|
||||
end
|
||||
|
||||
it "calls the single message process for the initial message and all batchable messages" do
|
||||
[queued_message, @queued_message2, @queued_message3].each do |msg|
|
||||
expect(SingleMessageProcessor).to receive(:process).with(msg,
|
||||
logger: logger,
|
||||
state: processor.state)
|
||||
context "when postal.batch_queued_messages is enabled" do
|
||||
it "calls the single message process for the initial message and all batchable messages" do
|
||||
[queued_message, @queued_message2, @queued_message3].each do |msg|
|
||||
expect(SingleMessageProcessor).to receive(:process).with(msg,
|
||||
logger: logger,
|
||||
state: processor.state)
|
||||
end
|
||||
processor.process
|
||||
end
|
||||
end
|
||||
|
||||
context "when postal.batch_queued_messages is disabled" do
|
||||
before do
|
||||
allow(Postal::Config.postal).to receive(:batch_queued_messages?) { false }
|
||||
end
|
||||
|
||||
it "does not call the single message process more than once" do
|
||||
expect(SingleMessageProcessor).to receive(:process).once.with(queued_message,
|
||||
logger: logger,
|
||||
state: processor.state)
|
||||
processor.process
|
||||
end
|
||||
processor.process
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -9,4 +9,10 @@ RSpec.describe Postal do
|
||||
expect(Postal.signer.private_key.to_pem).to eq OpenSSL::PKey::RSA.new(File.read(Postal::Config.postal.signing_key_path)).to_pem
|
||||
end
|
||||
end
|
||||
|
||||
describe "#change_database_connection_pool_size" do
|
||||
it "changes the connection pool size" do
|
||||
expect { Postal.change_database_connection_pool_size(8) }.to change { ActiveRecord::Base.connection_pool.size }.from(5).to(8)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
المرجع في مشكلة جديدة
حظر مستخدم