docs: added staging configuration guide #4
217
server-configuration/staging.md
Normal file
217
server-configuration/staging.md
Normal file
@ -0,0 +1,217 @@
|
|||||||
|
# Server configuration of the staging server
|
||||||
|
|
||||||
|
Staging server has `51.161.134.20` IP address and `staging.cellar.social` DNS record associated with it.
|
||||||
|
|
||||||
|
`otto` user has sudo rights at staging server, all operations that require sudo rights will be performed under this user.
|
||||||
|
|
||||||
|
## Fail2ban
|
||||||
|
|
||||||
|
Install `fail2ban` to scan the log files for too many failed login attempts and block the IP address which is showing malicious signs.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo apt-get install fail2ban
|
||||||
|
```
|
||||||
|
|
||||||
|
## Nginx
|
||||||
|
|
||||||
|
Under `otto` user:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Update packages
|
||||||
|
sudo apt update
|
||||||
|
|
||||||
|
# Install Nginx
|
||||||
|
sudo apt install nginx
|
||||||
|
|
||||||
|
# List the application configurations that ufw knows how to work with
|
||||||
|
sudo ufw app list
|
||||||
|
|
||||||
|
# Activate firewall
|
||||||
|
sudo ufw enable
|
||||||
|
|
||||||
|
# Allow ssh connections
|
||||||
|
sudo ufw allow 'OpenSSH'
|
||||||
|
|
||||||
|
# Allow HTTPS traffic
|
||||||
|
sudo ufw allow 'Nginx HTTPS'
|
||||||
|
|
||||||
|
# Allow HTTP traffic (HTTP traffic should be allowed to equire SSL certificate and will be disabled later)
|
||||||
|
sudo ufw allow 'Nginx HTTP'
|
||||||
|
|
||||||
|
# Check ufw status
|
||||||
|
sudo ufw status
|
||||||
|
|
||||||
|
# Check Nginx status
|
||||||
|
systemctl status nginx
|
||||||
|
|
||||||
|
# Create the directory for `api` domain
|
||||||
|
sudo mkdir -p /var/www/api/html
|
||||||
|
|
||||||
|
# Assign ownership of the directory to the `api` user
|
||||||
|
sudo chown -R api:api /var/www/api/html
|
||||||
|
|
||||||
|
# Adjust permissions
|
||||||
|
sudo chmod -R 755 /var/www/api
|
||||||
|
|
||||||
|
# Install certbot
|
||||||
|
sudo apt install certbot python3-certbot-nginx
|
||||||
|
|
||||||
|
# Fetch a certificate from Let's Encrypt and follow the prompts
|
||||||
|
sudo certbot --nginx -d staging.cellar.social
|
||||||
|
|
||||||
|
# Verify that certificate renewal is on
|
||||||
|
sudo systemctl status certbot.timer
|
||||||
|
|
||||||
|
# Create a configuration file for api subdomain
|
||||||
|
sudo nano /etc/nginx/sites-available/api
|
||||||
|
```
|
||||||
|
|
||||||
|
Paste into `/etc/nginx/sites-available/api`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
listen [::]:80;
|
||||||
|
|
||||||
|
root /var/www/html;
|
||||||
|
index index.html index.htm index.nginx-debian.html;
|
||||||
|
|
||||||
|
# Put your domain name here
|
||||||
|
server_name staging.cellar.social;
|
||||||
|
|
||||||
|
# Needed for Let's Encrypt verification
|
||||||
|
location ~ /.well-known/acme-challenge {
|
||||||
|
allow all;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Force HTTP to HTTPS
|
||||||
|
location / {
|
||||||
|
return 301 https://$http_host$request_uri;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 443 ssl http2;
|
||||||
|
|
||||||
|
ssl on;
|
||||||
|
|
||||||
|
# SSL certificate by Let's Encrypt in this Nginx
|
||||||
|
ssl_certificate /etc/letsencrypt/live/staging.cellar.social/fullchain.pem;
|
||||||
|
ssl_certificate_key /etc/letsencrypt/live/staging.cellar.social/privkey.pem;
|
||||||
|
|
||||||
|
# root /var/www/html;
|
||||||
|
# index index.html index.htm index.nginx-debian.html;
|
||||||
|
|
||||||
|
# domain name here
|
||||||
|
server_name staging.cellar.social;
|
||||||
|
|
||||||
|
location /api {
|
||||||
|
proxy_pass http://127.0.0.1:3000/;
|
||||||
|
|
||||||
|
proxy_set_header Host $http_host;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Needed for Let's Encrypt verification
|
||||||
|
location ~ /.well-known/acme-challenge {
|
||||||
|
allow all;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Next:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Enable the file by creating a link from it to the sites-enabled directory, which Nginx reads from during startup
|
||||||
|
sudo ln -s /etc/nginx/sites-available/api /etc/nginx/sites-enabled/
|
||||||
|
|
||||||
|
# Restart Nginx
|
||||||
|
sudo systemctl restart nginx
|
||||||
|
|
||||||
|
# Check Nginx status
|
||||||
|
systemctl status nginx
|
||||||
|
|
||||||
|
# Check firewall status
|
||||||
|
sudo ufw status
|
||||||
|
|
||||||
|
# Deny HTTP traffic
|
||||||
|
sudo ufw deny 'Nginx HTTP'
|
||||||
|
|
||||||
|
# Check firewall status
|
||||||
|
sudo ufw status
|
||||||
|
```
|
||||||
|
|
||||||
|
## Install Node and NPM
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Update packages
|
||||||
|
sudo apt update
|
||||||
|
|
||||||
|
# Install nvm (node version manager)
|
||||||
|
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
|
||||||
|
|
||||||
|
# Install Node v20
|
||||||
|
nvm install 20.12.2
|
||||||
|
|
||||||
|
# Set 20.12.2 as a default version of Node
|
||||||
|
nvm alias default 20.12.2
|
||||||
|
|
||||||
|
# Use default Node version
|
||||||
|
nvm use default
|
||||||
|
```
|
||||||
|
|
||||||
|
## API user
|
||||||
|
|
||||||
|
`api` user doesn't have sudo rights and will be used to run `cellar-api` and all related processes.
|
||||||
|
|
||||||
|
Under `otto` user:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Create api user
|
||||||
|
sudo adduser api
|
||||||
|
|
||||||
|
# Switch to api user
|
||||||
|
su api
|
||||||
|
```
|
||||||
|
|
||||||
|
Under `api` user:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Generate SSH keys.
|
||||||
|
# These keys will be used by CI/CD pipeline.
|
||||||
|
ssh-keygen
|
||||||
|
|
||||||
|
# Change to ssh directory
|
||||||
|
cd .ssh/
|
||||||
|
|
||||||
|
# Create authorized_keys file
|
||||||
|
touch authorized_keys
|
||||||
|
|
||||||
|
# Copy public key from `id_ed25519.pub` and paste into `authorized_keys` file
|
||||||
|
# Private key is stored in SSH_STAGING_PRIVATE_KEY variable of the CI/CD pipeline.
|
||||||
|
|
||||||
|
# Install PM2 package globally
|
||||||
|
npm i -g pm2
|
||||||
|
|
||||||
|
# Clone cellar/cs-backend repository
|
||||||
|
git clone ssh://git@git.nostrdev.com:29418/cellar/cs-backend.git
|
||||||
|
|
||||||
|
# Change to cs-backend directory
|
||||||
|
cd cs-backend
|
||||||
|
|
||||||
|
# Install dependencies
|
||||||
|
npm ci
|
||||||
|
|
||||||
|
# Build API app
|
||||||
|
npm run build
|
||||||
|
|
||||||
|
# Start API app
|
||||||
|
npm run start
|
||||||
|
|
||||||
|
# Verify that cellar-api process is running
|
||||||
|
pm2 list
|
||||||
|
```
|
Loading…
x
Reference in New Issue
Block a user