The Molly fork of Signal now has a variant that supports UnifiedPush, but it requires a helper called Mollysocket to be installed on a server somewhere. I can't get my head around the (we'll call them 'lean') docs, and I've never encountered such a helper for other UP apps. They just ask what to attach to, and they attach.
Internet-facing web server with reverse proxy and domain name (preferably SSL of course)
Server behind the reverse proxy with Rust environment
Installation
Don't bother downloading the source code to your server; installing it that way gives you a big debug executable
Instead just cargo install mollysocket
Move the mollysocket executable if desired
Run mollysocket once so that it will emit the default config
Configuration
Fish the config file out of .config/mollysocket/default-config.toml and copy it somewhere.
config.toml
In the new file, replace the allowed_endpoints line with allowed_endpoints = ['*']. The default 0.0.0.0 config appears to be a bug; this setting controls access to endpoints within the app, not IPs from outside. Leaving the original value causes mollysocket to reject everything.
Put a proper path in the db = './mollysocket.db' line rather than just having it land wherever you're sitting.
Delete the mollysocket.db that was created on first run (even if it's already where you're intending to put it). This is just to make sure the web server creates it and has the correct permissions.
Run script
The environment variable ROCKET_PORT must be set or the server will sit and do nothing. It's best to create all of the environment variables mentioned in the README, whether that is in a user profile script or in a shell script that wraps startup. You can change any of these values, but they must exist.