send/docs/deployment.md

2.2 KiB

Requirements

This document describes how to do a full deployment of Send on your own Linux server. You will need:

  • A working (and ideally somewhat recent) installation of NodeJS and NPM
  • GIT
  • An Apache webserver
  • Optionally telnet, to be able to quickly check your installation

For Debian/Ubuntu systems this probably just means something like this:

  • apt install git apache2 nodejs npm telnet

Building

  • We assume an already configured virtual-host on your webserver with an existing empty htdocs folder
  • First, remove that htdocs folder - we will replace it with Send's version now
  • git clone https://github.com/mozilla/send.git htdocs
  • Make now sure you are NOT root but rather the user your webserver is serving files under (e.g. "su www-data" or whoever the owner of your htdocs folder is)
  • npm install
  • npm run build

Running

To have a permanently running version of Send as a background process:

  • Create a file "run.sh" with:
#!/bin/bash
nohup su www-data -c "npm run prod" 2>/dev/null &
  • chmod +x run.sh
  • ./run.sh

Now the Send backend should be running on port 1443. You can check with:

  • telnet localhost 1443

Reverse Proxy

Of course, we don't want to expose the service on port 1443. Instead we want our normal webserver to forward all requests to Send ("Reverse proxy").

Apache webserver

  • a2enmod proxy
  • a2enmod proxy_http
  • a2enmod proxy_wstunnel
  • a2enmod rewrite

In your Apache virtual host configuration file, insert this:

    # Enable rewrite engine
    RewriteEngine on

    # Make sure the original domain name is forwarded to Send
    # Otherwise the generated URLs will be wrong
    ProxyPreserveHost on

    # Make sure the generated URL is https://
    RequestHeader set X-Forwarded-Proto https

    # If it's a normal file (e.g. PNG, CSS) just return it
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule .* - [L]

    # If it's a websocket connection, redirect it to a Send WS connection
    RewriteCond %{HTTP:Upgrade} =websocket [NC]
    RewriteRule /(.*) ws://127.0.0.1:1443/$1 [P,L]

    # Otherwise redirect it to a normal HTTP connection
    RewriteRule ^/(.*)$ http://127.0.0.1:1443/$1 [P,QSA]
    ProxyPassReverse  "/" "http://127.0.0.1:1443"