Skip to content

Commit

Permalink
Merge pull request #38 from hngprojects/main
Browse files Browse the repository at this point in the history
Update dev with changes from main
  • Loading branch information
vicradon authored Jul 19, 2024
2 parents ee30afd + 46cea05 commit 2323197
Show file tree
Hide file tree
Showing 12 changed files with 215 additions and 47 deletions.
6 changes: 3 additions & 3 deletions .github/workflows/development.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:
with:
go-version: "1.22.1"
- name: Build the application
run: go build -o learnai_dev
run: go build -o development_app

test:
runs-on: ubuntu-latest
Expand Down Expand Up @@ -56,7 +56,7 @@ jobs:
SSH_HOST: ${{ secrets.SSH_HOST }}
SSH_PORT: ${{ secrets.SSH_PORT }}
SSH_PASSWORD: ${{ secrets.SSH_PASSWORD }}
PROCESS_NAME: run_learnai_dev
PROCESS_NAME: run_development_app

steps:
- name: SSH into server and deploy
Expand Down Expand Up @@ -84,7 +84,7 @@ jobs:
fi
cp app-sample.env app.env
go build -o ~/deployments/development/learnai_dev
go build -o ~/deployments/development/development_app
# Check if pm2 is already running
if pm2 list | grep -q "${{ env.PROCESS_NAME }}"; then
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/production.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:
with:
go-version: "1.22.1"
- name: Build the application
run: go build -o learnai_prod
run: go build -o production_app

test:
runs-on: ubuntu-latest
Expand Down Expand Up @@ -56,7 +56,7 @@ jobs:
SSH_HOST: ${{ secrets.SSH_HOST }}
SSH_PORT: ${{ secrets.SSH_PORT }}
SSH_PASSWORD: ${{ secrets.SSH_PASSWORD }}
PROCESS_NAME: run_learnai_prod
PROCESS_NAME: run_production_app

steps:
- name: SSH into server and deploy
Expand Down Expand Up @@ -84,7 +84,7 @@ jobs:
fi
cp app-sample.env app.env
go build -o ~/deployments/production/learnai_prod
go build -o ~/deployments/production/production_app
# Check if pm2 is already running
if pm2 list | grep -q "${{ env.PROCESS_NAME }}"; then
Expand Down
96 changes: 96 additions & 0 deletions .github/workflows/staging.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
name: Build, Test, and Deploy for Staging

on:
push:
branches:
- staging

jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v4
- name: Set Golang
uses: actions/setup-go@v4
with:
go-version: "1.22.1"
- name: Build the application
run: go build -o staging_app

test:
runs-on: ubuntu-latest
needs: build
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
POSTGRES_DB: db_name
services:
postgres:
image: postgres:latest
env:
POSTGRES_USER: ${{ env.POSTGRES_USER }}
POSTGRES_PASSWORD: ${{ env.POSTGRES_PASSWORD }}
POSTGRES_DB: ${{ env.POSTGRES_DB }}
ports:
- 5432:5432
steps:
- name: Checkout Code
uses: actions/checkout@v4
- name: Create the app config file
run: cp app-sample.env app.env
- name: Run The Project
run: nohup go run main.go > /dev/null 2>&1 &
- name: Wait for application to start
run: sleep 30s
- name: Test for reachability
run: curl http://localhost:8019
- name: Run All Tests
run: go test ./... -timeout 99999s

deploy:
runs-on: ubuntu-latest
needs: test
env:
SSH_USERNAME: ${{ secrets.SSH_USERNAME }}
SSH_HOST: ${{ secrets.SSH_HOST }}
SSH_PORT: ${{ secrets.SSH_PORT }}
SSH_PASSWORD: ${{ secrets.SSH_PASSWORD }}
PROCESS_NAME: run_staging_app

steps:
- name: SSH into server and deploy
uses: appleboy/[email protected]
with:
host: ${{ env.SSH_HOST }}
username: ${{ env.SSH_USERNAME }}
password: ${{ env.SSH_PASSWORD }}
port: ${{ env.SSH_PORT }}
script: |
export APPROOT=~/deployments/staging
export PATH=$PATH:~/.nvm/versions/node/v20.15.1/bin
export PATH=$PATH:/usr/local/go/bin
mkdir -p $APPROOT
cd $APPROOT
if [ -d "$APPROOT/.git" ]; then
# Navigate to the repository directory and pull changes
cd $APPROOT || { echo "Failed to navigate to web root directory"; exit 1; }
git reset --hard HEAD || { echo "Failed to reset local changes"; exit 1; }
git pull origin main || { echo "Failed to pull latest changes"; exit 1; }
else
git clone -b staging http://github.com/${{ github.repository }} . || { echo "Failed to clone repository"; exit 1; }
fi
cp app-sample.env app.env
go build -o ~/deployments/staging/staging_app
# Check if pm2 is already running
if pm2 list | grep -q "${{ env.PROCESS_NAME }}"; then
echo "Process ${{ env.PROCESS_NAME }} is running. Restarting..."
pm2 restart "${{ env.PROCESS_NAME }}"
else
echo "Process ${{ env.PROCESS_NAME }} is not running. Starting..."
pm2 start "${{ env.PROCESS_NAME }}".sh
fi
6 changes: 3 additions & 3 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ RUN go mod download

COPY . .

RUN go build -o learnai_app main.go
RUN go build -o production_app main.go

FROM alpine:latest

Expand All @@ -21,7 +21,7 @@ RUN addgroup -S nonroot && adduser -S nonroot -G nonroot
WORKDIR /


COPY --from=build-stage learnai_app .
COPY --from=build-stage production_app .


EXPOSE 8080
Expand All @@ -30,4 +30,4 @@ EXPOSE 8080
USER nonroot:nonroot


ENTRYPOINT ["./learnai_app"]
ENTRYPOINT ["./production_app"]
37 changes: 37 additions & 0 deletions ecosystem.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
module.exports = {
apps: [
{
name: "run_production_app",
script: "/home/vicradon/deployments/production/production_app",
env: {
SERVER_PORT: 9000,
DB_NAME: "production_db",
USERNAME: "production_user",
APP_NAME: "production",
APP_URL: "http://localhost:9000",
},
},
{
name: "run_staging_app",
script: "/home/vicradon/deployments/staging/staging_app",
env: {
SERVER_PORT: 8000,
DB_NAME: "staging_db",
USERNAME: "staging_user",
APP_NAME: "staging",
APP_URL: "http://localhost:8000",
},
},
{
name: "run_development_app",
script: "/home/vicradon/deployments/development/development_app",
env: {
SERVER_PORT: 7000,
DB_NAME: "development_db",
USERNAME: "development_user",
APP_NAME: "development",
APP_URL: "http://localhost:7000",
},
},
],
};
3 changes: 3 additions & 0 deletions run_development_app.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#!/bin/bash

~/deployments/development/development_app
3 changes: 0 additions & 3 deletions run_learnai_dev.sh

This file was deleted.

3 changes: 0 additions & 3 deletions run_learnai_prod.sh

This file was deleted.

3 changes: 3 additions & 0 deletions run_production_app.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#!/bin/bash

~/deployments/production/production_app
3 changes: 3 additions & 0 deletions run_staging_app.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#!/bin/bash

~/deployments/staging/staging_app
56 changes: 38 additions & 18 deletions scripts/install_and_setup_nginx.sh
Original file line number Diff line number Diff line change
@@ -1,30 +1,50 @@
#! /bin/bash
WEB_ROOT="/var/www/production"
CONFIG_FILE="/etc/nginx/conf.d/production.conf"
DOMAIN_OR_IP="91.229.239.238"
#!/bin/bash

sudo mkdir -p $WEB_ROOT
# Define environment configurations
declare -A environments
environments=(
["development"]="7000 deployment.api-golang.boilerplate.hng.tech"
["staging"]="8000 staging.api-golang.boilerplate.hng.tech"
["production"]="9000 api-golang.boilerplate.hng.tech"
)

# General setup
sudo apt update
sudo apt install -y nginx

# Configuring Nginx Reverse Proxy for the Production Server
content='server {
listen 80;
server_name 91.229.239.238;
location / {
proxy_pass http://127.0.0.1:8019;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}'
# Create directories and configure Nginx for each environment
for env in "${!environments[@]}"; do
# Split the value into port and domain using parameter expansion
port="${environments[$env]%% *}"
domain="${environments[$env]#* }"
web_root="~/deployments/$env"
config_file="/etc/nginx/conf.d/$env.conf"

# Create web root directory
sudo mkdir -p $web_root

echo "$content" | sudo tee $CONFIG_FILE > /dev/null
sudo chmod 664 $CONFIG_FILE
# Nginx configuration content
content="server {
listen 80;
server_name $domain;
location / {
proxy_pass http://127.0.0.1:$port;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
}
}"

# Write Nginx configuration file
echo "$content" | sudo tee $config_file > /dev/null
sudo chmod 664 $config_file
done

# Delete Default Nginx Webpage
sudo rm /etc/nginx/sites-available/default && sudo rm /etc/nginx/sites-enabled/default

# Validate the Configuration
sudo nginx -t
sudo systemctl restart nginx
echo "PRODUCTION SERVER URL: http://$DOMAIN_OR_IP"

# Output
echo "Nginx setup for the applications to reverse proxy requests to them"
40 changes: 26 additions & 14 deletions scripts/setup_postgres.sh
Original file line number Diff line number Diff line change
@@ -1,31 +1,43 @@
#! /bin/bash

# Variables for credentials
DB_USER="postgres"
DB_PASSWORD="password"
DB_NAME="db_name"

# Check if the DB_USER is postgres and alter the password of this user else create a new user
if [ "$DB_USER" == "postgres" ]; then
# Define the databases and users
DATABASES=("development" "staging" "production")
USERS=("development_user" "staging_user" "production_user")

# Check if the script is running as root (necessary for changing PostgreSQL settings)
if [ "$(id -u)" -ne "0" ]; then
echo "This script must be run as root."
exit 1
fi

# Check if the DB_USER is postgres and alter the password of this user if necessary
if echo "${USERS[@]}" | grep -qw "postgres"; then
sudo -i -u postgres psql <<EOF
ALTER USER postgres WITH PASSWORD '$DB_PASSWORD';
EOF
echo "Password for 'postgres' user has been updated to '$DB_PASSWORD'."
else
sudo -i -u postgres psql <<EOF
-- Create a user named '$DB_USER' with password '$DB_PASSWORD'
CREATE USER $DB_USER WITH PASSWORD '$DB_PASSWORD';
ALTER USER postgres WITH PASSWORD '$DB_PASSWORD';
EOF
echo "Password for 'postgres' user has been updated."
fi

# Create the database and grant the user access to it
sudo -i -u postgres psql <<EOF
# Create databases and users, and grant permissions
for i in ${!DATABASES[@]}; do
DB_NAME=${DATABASES[$i]}
DB_USER=${USERS[$i]}

sudo -i -u postgres psql <<EOF
-- Create a database named '$DB_NAME'
CREATE DATABASE $DB_NAME;
-- Create a user named '$DB_USER' with password '$DB_PASSWORD'
CREATE USER $DB_USER WITH PASSWORD '$DB_PASSWORD';
-- Grant all privileges on the database '$DB_NAME' to the user '$DB_USER'
GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO $DB_USER;
EOF
echo "Database '$DB_NAME' and user '$DB_USER' created with full access."
done

# Modify pg_hba.conf to allow password authentication
PG_HBA_FILE=$(sudo -i -u postgres psql -t -P format=unaligned -c 'SHOW hba_file')
Expand All @@ -42,4 +54,4 @@ sudo sed -i "s/^#listen_addresses = 'localhost'/listen_addresses = '*'/" $POSTGR
# Restart PostgreSQL to apply changes
sudo systemctl restart postgresql

echo "PostgreSQL setup is complete. User '$DB_USER' with database '$DB_NAME' has been created. The user can connect using the password '$DB_PASSWORD'."
echo "PostgreSQL setup is complete. Databases and users have been created and configured."

0 comments on commit 2323197

Please sign in to comment.