1
mirror of https://git.sr.ht/~cadence/tube-docs synced 2025-10-27 11:49:12 +00:00

Add system services; split nginx to a separate file

This commit is contained in:
Cadence Ember 2021-03-27 22:41:07 +13:00
parent edd207ba87
commit cd382ea594
No known key found for this signature in database
GPG Key ID: BC1C2C61CF521B17
3 changed files with 265 additions and 115 deletions

View File

@ -78,11 +78,13 @@ This service should be run as the cloudtube user rather than as the system.
You may need to adjust the paths in these files. You may need to adjust the paths in these files.
### As user service
If you find that these processes terminate when you log out, see the documentation for [`libpam-systemd`](https://manpages.debian.org/stretch/libpam-systemd/pam_systemd.8.en.html) and [`logind.conf`](https://manpages.debian.org/stretch/systemd/logind.conf.5.en.html). If you find that these processes terminate when you log out, see the documentation for [`libpam-systemd`](https://manpages.debian.org/stretch/libpam-systemd/pam_systemd.8.en.html) and [`logind.conf`](https://manpages.debian.org/stretch/systemd/logind.conf.5.en.html).
``` ```
[Unit] [Unit]
Description=cloudtube website Description=CloudTube website
[Service] [Service]
Type=simple Type=simple
@ -99,7 +101,38 @@ SyslogIdentifier=cloudtube
WantedBy=default.target WantedBy=default.target
``` ```
Save it to `~/.config/systemd/user/cloudtube.service`, then issue these commands: Save to `~/.config/systemd/user/cloudtube.service`.
### As system service
```
[Unit]
Description=CloudTube
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/node /home/cloudtube/cloudtube/server.js
WorkingDirectory=/home/cloudtube/cloudtube
# Restart timing
Restart=always
RestartSec=60
# Disable logs
StandardOutput=null
StandardError=null
SyslogIdentifier=cloudtube
# User to run service as
User=cloudtube
[Install]
WantedBy=multi-user.target
```
Save to `/etc/systemd/system/cloudtube.service`.
### Start service
``` ```
$ systemctl daemon-reload $ systemctl daemon-reload
@ -116,116 +149,6 @@ $ systemctl enable cloudtube
This will allow people to access CloudTube over HTTPS and without having to enter a port into the browser's address bar. This will allow people to access CloudTube over HTTPS and without having to enter a port into the browser's address bar.
It's highly recommended for public instances, but if this installation is for a test or for your personal use, you don't need it. It's highly recommended for public instances, but if this installation is for a test or for your personal use, you don't need to do it.
SSL options are from [Mozilla's SSL configuration generator.](https://ssl-config.mozilla.org/#server=nginx&version=1.17.7&config=intermediate&openssl=1.1.1d&hsts=false&ocsp=false&guideline=5.6 Follow the steps [on the nginx documentation page →](./Proxy with nginx.md)
)
Download `dhparam.pem`: ([Why?](https://security.stackexchange.com/questions/94390/whats-the-purpose-of-dh-parameters/94397#94397))
```
# mkdir -p /etc/nginx/ssl
# wget https://ssl-config.mozilla.org/ffdhe2048.txt -O /etc/nginx/ssl/dhparam.pem
```
Then create a file inside the directory /etc/nginx/sites-available (suggested name: cloudtube-proxy) with contents like this:
```
server {
listen 80;
listen [::]:80;
server_name cloudtube.example.com; # [1]
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name cloudtube.example.com; # [1]
ssl_certificate /etc/letsencrypt/live/cloudtube.example.com/fullchain.pem; # [2]
ssl_certificate_key /etc/letsencrypt/live/cloudtube.example.com/privkey.pem; # [2]
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_dhparam /etc/nginx/ssl/dhparam; # [3]
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
location / {
proxy_pass http://127.0.0.1:10412;
}
}
```
- `[1]` Write your actual domain here in place of cloudtube.example.com, without capital letters.
- `[2]` Write your actual domain here in place of cloudtube.example.com. If your certificate is not from Let's Encrypt, you'll have to replace the entire path.
- `[3]` [More information.](https://security.stackexchange.com/questions/94390/whats-the-purpose-of-dh-parameters/94397#94397)
Set the configuration as enabled:
```
# cd /etc/nginx/sites-enabled
# ln -sv ../sites-available/cloudtube-proxy .
```
And delete the default "it works" server that comes with nginx:
```
# rm default
```
Check your configuration. If there are errors, find them and fix them.
This sample config should be good on its own.
```
# nginx -t
```
Once there are no errors in the configuration, start nginx:
```
# systemctl start nginx
```
Enable the nginx service to automatically start nginx after a machine reboot:
```
# systemctl enable nginx
```
If nginx is already running, you only have to reload the configuration:
```
# systemctl reload nginx
```
Now set up CAA for your DNS. You must set up DNS before you can do this. ([Why is CAA important?](https://blog.qualys.com/ssllabs/2017/03/13/caa-mandated-by-cabrowser-forum))
1. First, go to the [SSLMate CAA record generator.][caa generator]
1. Enter your domain name, then press "auto-generate policy".
1. Scroll the list and make sure all boxes are unchecked _except_ for
the one that has your certificate authority.
1. If it's all good, go down to the "publish your CAA policy" section
and examine the first code block. You need to create a DNS record with
this information on your domain.
[caa generator]: https://sslmate.com/caa/
Once you've set everything up, open your domain
(ex: `https://cloudtube.example.com`) in your browser and check that:
1. The CloudTube home page appears
1. You are connected over HTTPS
Now that that works,
[run the Qualys SSL Labs server test][ssl server test] to make sure
your configuration is secure. The test will take a few minutes to run.
[ssl server test]: https://www.ssllabs.com/ssltest/

View File

@ -82,6 +82,8 @@ This service should be run as the cloudtube user rather than as the system.
You may need to adjust the paths in these files. You may need to adjust the paths in these files.
### As user service
If you find that these processes terminate when you log out, see the documentation for [`libpam-systemd`](https://manpages.debian.org/stretch/libpam-systemd/pam_systemd.8.en.html) and [`logind.conf`](https://manpages.debian.org/stretch/systemd/logind.conf.5.en.html). If you find that these processes terminate when you log out, see the documentation for [`libpam-systemd`](https://manpages.debian.org/stretch/libpam-systemd/pam_systemd.8.en.html) and [`logind.conf`](https://manpages.debian.org/stretch/systemd/logind.conf.5.en.html).
``` ```
@ -106,7 +108,38 @@ SyslogIdentifier=newleaf
WantedBy=multi-user.target WantedBy=multi-user.target
``` ```
As above, save it to `~/.config/systemd/user/newleaf.service`, then issue these commands: Save to `~/.config/systemd/user/newleaf.service`.
### As system service
```
[Unit]
Description=NewLeaf
After=network.target
[Service]
Type=simple
ExecStart=/home/cloudtube/newleaf-venv/bin/python3 /home/cloudtube/NewLeaf/index.py
WorkingDirectory=/home/cloudtube/NewLeaf
# Restart timing
Restart=always
RestartSec=60
# Disable logs
StandardOutput=null
StandardError=null
SyslogIdentifier=newleaf
# User to run as
User=cloudtube
[Install]
WantedBy=multi-user.target
```
Save to `/etc/systemd/system/newleaf.service`.
### Start service
``` ```
$ systemctl daemon-reload $ systemctl daemon-reload
@ -118,3 +151,16 @@ $ systemctl start newleaf
``` ```
$ systemctl enable newleaf $ systemctl enable newleaf
``` ```
## nginx reverse proxy
This will allow people to access NewLeaf over HTTPS and without a port number in the URL.
You should do this if:
- You will run a public NewLeaf instance
- You will run a public CloudTube instance (NewLeaf also needs to be public)
If this installation is a test, or for your personal use, you don't need to do this.
Follow the steps [on the nginx documentation page →](./Proxy with nginx.md)

181
docs/Proxy with nginx.md Normal file
View File

@ -0,0 +1,181 @@
# Proxy with nginx
## Prerequisites
Install nginx from the package manager.
## Configuration
```
# cd /etc/nginx
```
SSL options are from [Mozilla's SSL configuration generator.](https://ssl-config.mozilla.org/#server=nginx&version=1.17.7&config=intermediate&openssl=1.1.1d&hsts=false&ocsp=false&guideline=5.6
)
Download `dhparam.pem`: ([Why?](https://security.stackexchange.com/questions/94390/whats-the-purpose-of-dh-parameters/94397#94397))
```
# mkdir -p /etc/nginx/ssl
# wget https://ssl-config.mozilla.org/ffdhe2048.txt -O /etc/nginx/ssl/dhparam.pem
```
Delete the default "it works" server that comes with nginx:
```
# rm sites-enabled/default
```
## NewLeaf
Create a file inside the directory `/etc/nginx/sites-available` (suggested name: newleaf-proxy) with contents like this:
```
server {
listen 80;
listen [::]:80;
server_name newleaf.example.com; # [1]
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name newleaf.example.com; # [1]
ssl_certificate /etc/letsencrypt/live/newleaf.example.com/fullchain.pem; # [2]
ssl_certificate_key /etc/letsencrypt/live/newleaf.example.com/privkey.pem; # [2]
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_dhparam /etc/nginx/ssl/dhparam; # [3]
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
location / {
proxy_pass http://127.0.0.1:3000;
}
}
```
- `[1]` Write your actual domain here in place of newleaf.example.com, without capital letters.
- `[2]` Write your actual domain here in place of newleaf.example.com. If your certificate is not from Let's Encrypt, you'll have to replace the entire path.
- `[3]` [More information.](https://security.stackexchange.com/questions/94390/whats-the-purpose-of-dh-parameters/94397#94397)
Set the configuration as enabled:
```
# cd /etc/nginx/sites-enabled
# ln -sv ../sites-available/newleaf-proxy .
```
## CloudTube
(If you are installing NewLeaf only, you can skip this section.)
Create a file inside the directory `/etc/nginx/sites-available` (suggested name: cloudtube-proxy) with contents like this:
```
server {
listen 80;
listen [::]:80;
server_name cloudtube.example.com; # [1]
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name cloudtube.example.com; # [1]
ssl_certificate /etc/letsencrypt/live/cloudtube.example.com/fullchain.pem; # [2]
ssl_certificate_key /etc/letsencrypt/live/cloudtube.example.com/privkey.pem; # [2]
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_dhparam /etc/nginx/ssl/dhparam;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
location / {
proxy_pass http://127.0.0.1:10412;
}
}
```
- `[1]` Write your actual domain here in place of cloudtube.example.com, without capital letters.
- `[2]` Write your actual domain here in place of cloudtube.example.com. If your certificate is not from Let's Encrypt, you'll have to replace the entire path.
Set the configuration as enabled:
```
# cd /etc/nginx/sites-enabled
# ln -sv ../sites-available/cloudtube-proxy .
```
## Apply changes
Check your configuration. If there are errors, find them and fix them.
This sample config should be good on its own.
```
# nginx -t
```
Once there are no errors in the configuration, start nginx:
```
# systemctl start nginx
```
Enable the nginx service to automatically start nginx after a machine reboot:
```
# systemctl enable nginx
```
If nginx is already running, you only have to reload the configuration:
```
# systemctl reload nginx
```
## CAA for DNS
Now set up CAA for your DNS. You must set up DNS before you can do this. ([Why is CAA important?](https://blog.qualys.com/ssllabs/2017/03/13/caa-mandated-by-cabrowser-forum))
1. First, go to the [SSLMate CAA record generator.][caa generator]
1. Enter your domain name, then press "auto-generate policy".
1. Scroll the list and make sure all boxes are unchecked _except_ for
the one that has your certificate authority.
1. If it's all good, go down to the "publish your CAA policy" section
and examine the first code block. You need to create a DNS record with
this information on your domain.
[caa generator]: https://sslmate.com/caa/
## Conclusion
Once you've set everything up, open your domain
(ex: `https://cloudtube.example.com`) in your browser and check that:
1. The CloudTube home page appears
1. You are connected over HTTPS
Now that that works,
[run the Qualys SSL Labs server test][ssl server test] to make sure
your configuration is secure. The test will take a few minutes to run.
[ssl server test]: https://www.ssllabs.com/ssltest/