Files
postal/CONTRIBUTING.md
T
Adam Cooke 5eeed7c023 chore(deps): upgrade to Rails 7.2.3.2, Ruby 3.4.10 and latest gems
Upgrades Rails from 7.1.6 to 7.2.3.2, Ruby from 3.4.6 to 3.4.10, and
brings the rest of the bundle up to date.

Two things were broken by Rails 7.2 and are fixed here:

* MigrationWaiter called `ActiveRecord::Base.connection.migration_context`,
  which moved to the connection pool in 7.2. This raised NoMethodError on
  boot for any deployment with `migration_waiter.enabled` set, and had no
  test covering it.
* `config.action_dispatch.show_exceptions = false` was deprecated in 7.1
  and removed in 7.2. Now `:none`.

`json` is pinned to < 3. Active Support 7.2 passes `quirks_mode:` to both
`JSON.generate` and `JSON.parse`, and json 3.0 removed that option, so an
unpinned json resolves to 3.x and makes every `to_json` raise - webhook
payloads included. Nothing else in the bundle constrains it. The pin can go
when we reach Rails 8.1, which no longer passes the option.

`dynamic_form` is dropped. It is unmaintained and from 1.3.1 requires Ruby
< 3.4, so it could never be updated again. Ten views used it, so
`error_messages_for` now lives in ErrorMessagesHelper and `f.error_messages`
in a form builder extension. The rendered markup is unchanged apart from a
heading and description the stylesheet had always hidden; the rules that
hid them are removed too.

`execjs` is unpinned. The `< 2.8` constraint dated from the Rails 6.0
upgrade and asset output is byte-identical without it.

Notable gem majors: puma 8, haml 7, secure_headers 7, sentry 7, jwt 3,
prometheus-client 5, highline 3, omniauth-rails_csrf_protection 2,
rspec-rails 8, shoulda-matchers 8, rubocop 1.91. secure_headers 7 changes
X-XSS-Protection from "1; mode=block" to "0", which is the correct modern
default and matches Rails' own.

`config.load_defaults` deliberately stays at 7.0. The pending 7.1 and 7.2
options are listed, commented out, in new_framework_defaults_7_1.rb and
_7_2.rb so they can be adopted in stages - several change the signed cookie
and cache formats and need a staged deploy. The vestigial
new_framework_defaults_7_0.rb is removed, as `load_defaults 7.0` already
applies all of it.

Adds tests for the areas this touched, which were mostly uncovered:
MigrationWaiter, the serialized columns that gate a defaults bump, JSON
encoding, HAML template compilation for all 103 templates, page rendering,
form error rendering and security headers. The assets Gemfile group now
includes :test so the view layer can be exercised at all.
2026-09-15 10:27:16 +01:00

1.9 KiB

Contributing to Postal

This doc explains how to go about running Postal in development to allow you to make contributions to the project.

Dependencies

You will need a MySQL database server to get started. Postal needs to be able to make databases within that server whenever new mail servers are created so the permissions that you use should be suitable for that.

You'll also need Ruby. Postal currently uses the Ruby version in .ruby-version. Install that using whichever version manager takes your fancy - rbenv, asdf, rvm etc.

Clone

You'll need to clone the repository

git clone git@github.com:postalserver/postal

Once cloned, you can install the Ruby dependencies using bundler.

bundle install

Configuration

Configuration is handled using a config file. This lives in config/postal/postal.yml. An example configuration file is provided in config/examples/development.yml. This example is for development use only and not an example for production use.

You'll also need a key for signing. You can generate one of these like this:

openssl genrsa -out config/postal/signing.key 2048

If you're running the tests (and you probably should be), you'll find an example file for test configuration in config/examples/test.yml. This should be placed in config/postal/postal.test.yml with the appropriate values.

If you prefer, you can configure Postal using environment variables. These should be placed in .env or .env.test as apprpriate.

Running

The neatest way to run postal is to ensure that ./bin is your $PATH and then use one of the following commands.

  • bin/dev - will run all components of the application using Foreman
  • bin/postal - will run the Postal binary providing access to running individual components or other tools.

Database initialization

Use the commands below to initialize your database and make your first user.

postal initialize
postal make-user