This is an opinionated handbook on how I migrated all my Rails apps off the cloud and into VPS.
This is how I manage real production loads for my Rails apps. It assumes:
- Rails 7+
- Ruby 3+
- PostgreSQL
- Ubuntu Server 24.04
- Capistrano, Puma, Nginx
This is an opinionated handbook on how I migrated all my Rails apps off the cloud and into VPS.
This is how I manage real production loads for my Rails apps. It assumes:
| #!/bin/bash | |
| # Ensure the script is run as root | |
| if [ "$(id -u)" -ne 0 ]; then | |
| echo -e "${RED}ERROR: This script must be run as root.${NC}" | |
| exit 1 | |
| fi | |
| # Define aesthetics | |
| RED='\033[0;31m' |
| #!/bin/bash | |
| # Ensure the script is run as root | |
| if [ "$(id -u)" -ne 0 ]; then | |
| echo -e "\e[31mERROR: This script must be run as root.\e[0m" | |
| exit 1 | |
| fi | |
| # Define aesthetics | |
| GREEN='\033[0;32m' |
| #!/bin/bash | |
| # Ensure the script is run as root | |
| if [[ $EUID -ne 0 ]]; then | |
| echo "This script must be run as root" | |
| exit 1 | |
| fi | |
| # Define aesthetics | |
| GREEN='\033[0;32m' |
| # You need to give the Lambda the following permissions. | |
| # Head to the Lambda page, and under Configuration > Permissions > Resource-based policy statements add a new policy statement: | |
| # - Select "AWS Service" | |
| # - On "Service", choose "Other" | |
| # - Statement ID: AlarmAction | |
| # - Principal: lambda.alarms.cloudwatch.amazonaws.com | |
| # - Source ARN: arn:aws:cloudwatch:us-east-1:YOUR_ACCOUNT_ID:alarm:* | |
| # - Action: lambda:InvokeFunction | |
| # | |
| # The same result can be achieved with `aws-cli`: |
| # Needed previous configuration: | |
| # | |
| # - In UptimeRobot, configure a new **Webhook** Alert Contact with this POST payload: | |
| # ``` | |
| # { | |
| # "monitorID": "*monitorID*", | |
| # "monitorURL": "*monitorURL*", | |
| # "monitorFriendlyName": "*monitorFriendlyName*", | |
| # "alertType": "*alertType*", | |
| # "alertTypeFriendlyName": "*alertTypeFriendlyName*", |
| #!/bin/bash | |
| # This script takes a clean Ubuntu Server 24.04 LTS AMI and installs and configures | |
| # everything needed to deploy a Rails 7 app to it. The resulting state is a secure, | |
| # production-ready instance. | |
| set -euo pipefail | |
| # --- AESTHETICS --- |
| #!/bin/bash | |
| # This scripts performs the initial setup for an EC2 AMI that has | |
| # been previously prepared to accept Rails apps. | |
| # --- USER DATA SCRIPT STARTS --- | |
| # Configure SSH key for the rails user (same as ubuntu, AWS configured key) | |
| sudo mkdir /home/rails/.ssh |
| #!/bin/bash | |
| # This scrips takes a clean AWS Amazon Linux 2023 AMI and installs and configures | |
| # everything needed to deploy a Rails app to it. The resulting state is a clean | |
| # instance that can be used to build a base AMI for an EC2 ASG. | |
| # --- AESTHETICS --- | |
| # Define the color code for green for echo messages |
| { | |
| "Version": "2012-10-17", | |
| "Statement": [ | |
| { | |
| "Sid": "VisualEditor0", | |
| "Effect": "Allow", | |
| "Action": [ | |
| "s3:PutObject", | |
| "s3:GetObject", | |
| "s3:PutBucketPublicAccessBlock", |