--- type: video yt_id: VVU2YVRMdUlfajQtMHdpRFN6bWFQY3RRLm9IQVEzVHpVVHJv videoId: nQdyiK7-VlQ title: 'Deploying Full Stack Apps to AWS EC2 with SQL Databases' date: '2024-01-18T04:46:20.706Z' slug: 'deploying-full-stack-js-to-aws-ec2' image: name: 'aws-cli-vpc-subnets-ec2-and-more-2.png' width: 1280 height: 720 status: 'published' description: "EC2 are virtual machines, so you're basically going to copy what you've done locally (localhost) and put that on a computer owned by amazon running in the cloud" tags: ['aws', 'cloud computing', 'nodejs', 'express', 'postgresql', 'sql', 'react', 'javascript', 'full stack', 'deployment'] --- # Deploying Full Stack Apps to AWS EC2 with SQL Databases ## Setup EC2 Instance ```sh sudo apt update sudo apt upgrade ``` ## Install Node.js ```sh curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt-get install -y nodejs ``` ## rsync ```sh rsync -avz --exclude 'node_modules' --exclude '.git' --exclude '.env' \ -e "ssh -i ~/.ssh/your-key.pem" \ . ubuntu@ip-address:~/app ``` ## Database {/* prettier-ignore */} ```sh sudo apt install mysql-server sudo systemctl start mysql sudo systemctl enable mysql sudo mysql -u root ```
```sql CREATE DATABASE my_app; CREATE USER 'my_app_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'MyNewPass1!'; GRANT ALL PRIVILEGES ON my_app.* TO 'my_app_user'@'localhost'; ```
```sh sudo apt install postgresql postgresql-contrib sudo systemctl start postgresql sudo systemctl enable postgresql sudo -i -u postgres ```
```sql CREATE DATABASE my_app; CREATE ROLE my_app_role WITH LOGIN PASSWORD 'some_password'; GRANT ALL PRIVILEGES ON DATABASE "my_app" TO my_app_role; ```
## systemd ### Step 1: Create the Environment File Create a new file for your environment variables and open the file in Vim: ```sh sudo vim /etc/app.env ``` In Vim, add your variables in the format `VARIABLE=value`. For example: ```sh DB_PASSWORD=your_secure_password ``` to save and exit vim, press `esc` then `:wq` then `enter` Restrict the file permissions for security. ```sh sudo chmod 600 /etc/app.env sudo chown ubuntu:ubuntu /etc/app.env ``` ### Step 2: Create the systemd Service File Navigate to the systemd directory and create a new service file, `myapp.service`. ```sh sudo vim /etc/systemd/system/myapp.service ``` Define the service settings. Add the following content in Vim, modifying as needed for your application: ```sh [Unit] Description=Node.js App After=network.target multi-user.target [Service] User=ubuntu WorkingDirectory=/home/ubuntu/app ExecStart=/usr/bin/npm start Restart=always Environment=NODE_ENV=production EnvironmentFile=/etc/app.env StandardOutput=syslog StandardError=syslog SyslogIdentifier=myapp [Install] WantedBy=multi-user.target ``` Reload systemd and start your service. ```sh sudo systemctl daemon-reload sudo systemctl enable myapp.service sudo systemctl start myapp.service ``` Verify that the service is running properly. ```sh sudo systemctl status myapp.service ``` ### View Logs ```sh sudo journalctl -u myapp.service ``` tail logs: ```sh sudo journalctl -fu myapp.service ``` ## Caddy ### Step 1: Install Caddy [https://caddyserver.com/docs/install](https://caddyserver.com/docs/install) ```sh sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list sudo apt update sudo apt install caddy ``` ``` sudo vim /etc/caddy/Caddyfile ``` ``` :80 { reverse_proxy localhost:3000 } ``` ``` sudo systemctl restart caddy ``` ### Step 2: Configure Caddy to Use HTTPS Add a domain name for your server. Update the Caddyfile to use your domain name and enable HTTPS. ``` sudo vim /etc/caddy/Caddyfile ``` ``` mydomain.com { reverse_proxy localhost:3000 } ``` ``` sudo systemctl restart caddy ```