Skip to main content
Markdown

Deploying a Flask app

Under Gunicorn or uWSGI behind nginx, or on a PaaS: nothing realtime is kept on your servers, so any worker answers any request.

Its settings​

WORDPLUS_SITE, WORDPLUS_SECRETfrom your app in WordPlus Cloud
WORDPLUS_LOCAL_KEYyours: kept as long as the app

Set them in the server environment, as you do SECRET_KEY. Keep the secret and the local key out of your repository and out of every page. The key reaches pages through config(), which is what it is for.

Its addresses​

Add every address your pages are served from to the app in WordPlus Cloud: scheme, host and port exactly (https://shop.example.com, https://www.shop.example.com). A page anywhere else is refused with wrong_origin. Up to 20 addresses an app. If your server hears webhooks, set their address there too.

Its files​

realtime-worker.js, realtime-rooms.min.js, realtime-rooms-e2ee.worker.js and realtime-ui.min.js are served by your app, from its own address: a browser runs a worker only from the page origin. Copy them into static/ in your build (npx wordplus-realtime copy static/), so each release serves the ones its package came with.

Workers​

Every Gunicorn worker answers the realtime route, and an emit is an HTTPS request to WordPlus Cloud, done in the view. For many emits, or ones you do not want a request to wait on, send them from a task queue (Celery, RQ).

Behind a proxy​

Wrap the app in the Werkzeug ProxyFix, and set SESSION_COOKIE_SECURE = True, as for any Flask app behind TLS: the realtime route uses the session.

Content Security Policy​

If your pages send one, let them reach the WordPlus Cloud servers (the realtime servers, which may move a connection to another of them, and the media servers for group calls) and run the workers from your own address:

connect-src 'self' https://*.wordplus.cloud wss://*.wordplus.cloud;
worker-src 'self';

Clocks​

Your server signs what it sends with the time. Keep its clock synced (NTP): one more than 5 minutes off has its emits refused with stale_signature.