Skip to content

Commit

Permalink
Updates
Browse files Browse the repository at this point in the history
  • Loading branch information
parhamrahmani committed May 28, 2024
1 parent 840a732 commit cd033c5
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 40 deletions.
82 changes: 44 additions & 38 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -997,7 +997,7 @@ name: Build and Deploy to AWS
on:
push:
branches:
- master
- main
jobs:
build-and-deploy:
Expand Down Expand Up @@ -1028,22 +1028,23 @@ jobs:
SPOTIFY_CLIENT_ID=${{ secrets.SPOTIFY_CLIENT_ID }}
SPOTIFY_SECRET_ID=${{ secrets.SPOTIFY_SECRET_ID }}
ENVIRONMENT=${{ secrets.ENVIRONMENT }}
- name: Set up AWS CLI
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.AWS_REGION }}
- name: Retrieve EC2 instance IP
- name: Retrieve EC2 instance IPs
id: get_instances_ips
run: |
aws ec2 describe-instances --filters "Name=tag:Name,Values=ec2-1" "Name=instance-state-name,Values=running" --query "Reservations[*].Instances[*].PublicIpAddress" --output text > ec2_instance_ip.txt
echo "EC2_1_IP=$(cat ec2_instance_ip.txt)" >> $GITHUB_ENV
aws ec2 describe-instances --filters "Name=tag:Name,Values=ec2-2" "Name=instance-state-name,Values=running" --query "Reservations[*].Instances[*].PublicIpAddress" --output text > ec2_instance_ip.txt
echo "EC2_2_IP=$(cat ec2_instance_ip.txt)" >> $GITHUB_ENV
aws ec2 describe-instances --filters "Name=tag:Name,Values=ec2-3" "Name=instance-state-name,Values=running" --query "Reservations[*].Instances[*].PublicIpAddress" --output text > ec2_instance_ip.txt
echo "EC2_3_IP=$(cat ec2_instance_ip.txt)" >> $GITHUB_ENV
aws ec2 describe-instances --filters "Name=tag:Name,Values=ec2-1" "Name=instance-state-name,Values=running" --query "Reservations[*].Instances[*].PublicIpAddress" --output text > ec2_instance_ip_1.txt
echo "EC2_1_IP=$(cat ec2_instance_ip_1.txt)" >> $GITHUB_ENV
aws ec2 describe-instances --filters "Name=tag:Name,Values=ec2-2" "Name=instance-state-name,Values=running" --query "Reservations[*].Instances[*].PublicIpAddress" --output text > ec2_instance_ip_2.txt
echo "EC2_2_IP=$(cat ec2_instance_ip_2.txt)" >> $GITHUB_ENV
aws ec2 describe-instances --filters "Name=tag:Name,Values=ec2-3" "Name=instance-state-name,Values=running" --query "Reservations[*].Instances[*].PublicIpAddress" --output text > ec2_instance_ip_3.txt
echo "EC2_3_IP=$(cat ec2_instance_ip_3.txt)" >> $GITHUB_ENV
- name: Create .ssh directory
run: mkdir -p /home/runner/.ssh
Expand All @@ -1056,51 +1057,56 @@ jobs:
- name: Update EC2 with new Docker image
run: |
ssh -o StrictHostKeyChecking=no -i /home/runner/.ssh/id_rsa ubuntu@${{ env.EC2_1_IP }} << EOF
ssh -o StrictHostKeyChecking=no -i /home/runner/.ssh/id_rsa ubuntu@${{ env.EC2_1_IP }} << 'EOF'
docker pull ${{ secrets.DOCKER_HUB_USERNAME }}/flask-app-image-repository:latest
docker stop my-container || true
docker rm my-container || true
docker run -d --name my-container -p 80:5000 ${{ secrets.DOCKER_HUB_USERNAME }}/flask-app-image-repository:latest
EOF
ssh -o StrictHostKeyChecking=no -i /home/runner/.ssh/id_rsa ubuntu@${{ env.EC2_2_IP }} << EOF
ssh -o StrictHostKeyChecking=no -i /home/runner/.ssh/id_rsa ubuntu@${{ env.EC2_2_IP }} << 'EOF'
docker pull ${{ secrets.DOCKER_HUB_USERNAME }}/flask-app-image-repository:latest
docker stop my-container || true
docker rm my-container || true
docker run -d --name my-container -p 80:5000 ${{ secrets.DOCKER_HUB_USERNAME }}/flask-app-image-repository:latest
EOF
ssh -o StrictHostKeyChecking=no -i /home/runner/.ssh/id_rsa ubuntu@${{ env.EC2_3_IP }} << 'EOF'
docker pull ${{ secrets.DOCKER_HUB_USERNAME }}/flask-app-image-repository:latest
docker stop my-container || true
docker rm my-container || true
docker run -d --name my-container -p 80:5000 ${{ secrets.DOCKER_HUB_USERNAME }}/flask-app-image-repository:latest
EOF
ssh -o StrictHostKeyChecking=no -i /home/runner/.ssh/id_rsa ubuntu@${{ env.EC2_3_IP }} << EOF
docker pull ${{ secrets.DOCKER_HUB_USERNAME }}/flask-app-image-repository:latest
docker stop my-container || true
docker rm my-container || true
docker run -d --name my-container -p 80:5000 ${{ secrets.DOCKER_HUB_USERNAME }}/flask-app-image-repository:latest
- name: Retrieve Autoscaling EC2 server ips
- name: Retrieve Autoscaling EC2 server IPs
id: get_autoscaling_instances_ips
run: |
aws ec2 describe-instances --instance-ids $(cat autoscaling_instance_ids.txt) --query "Reservations[*].Instances[*].PublicIpAddress" --output text > autoscaling_instance_ips.txt << EOF
aws autoscaling describe-auto-scaling-instances --query "AutoScalingInstances[*].InstanceId" --output text > autoscaling_instance_ids.txt
aws ec2 describe-instances --instance-ids $(cat autoscaling_instance_ids.txt) --query "Reservations[*].Instances[*].PublicIpAddress" --output text > autoscaling_instance_ips.txt
ips_file="autoscaling_instance_ips.txt"
IFS=$'\n' read -d '' -r -a ips < "$ips_file"
for i in "${!ips[@]}"; do
echo "Auto_Instance_ID_$((i+1)): ${ids[i]}" >> $GITHUB_ENV
echo "Auto_Instance_IP_$((i+1)): ${ips[i]}" >> $GITHUB_ENV
mapfile -t ips < "$ips_file"
for ip in "${ips[@]}"; do
touch update_instance_$ip.sh
echo '#!/bin/bash' > "update_instance_$ip.sh"
echo '' >> update_instance_$ip.sh
echo "Updating instance with IP: $ip" >> "update_instance_$ip.sh"
echo "ssh -o StrictHostKeyChecking=no -i /home/runner/.ssh/id_rsa ubuntu@$ip <<EOF" >> "update_instance_$ip.sh"
echo "docker pull ${{ secrets.DOCKER_HUB_USERNAME }}/flask-app-image-repository:latest" >> "update_instance_$ip.sh"
echo "docker stop my-container || true" >> "update_instance_$ip.sh"
echo "docker rm my-container || true" >> "update_instance_$ip.sh"
echo "docker run -d --name my-container -p 80:5000 ${{ secrets.DOCKER_HUB_USERNAME }}/flask-app-image-repository:latest" >> "update_instance_$ip.sh"
echo "EOF" >> "update_instance_$ip.sh"
echo "shell script created for $ip"
echo "Running shell script for $ip"
chmod +x "update_instance_$ip.sh"
cat "update_instance_$ip.sh"
./update_instance_$ip.sh
done
EOF
- name: Update Autoscaling EC2 with new Docker image
run: |
aws ec2 describe-instances --instance-ids $(cat autoscaling_instance_ids.txt) --query "Reservations[*].Instances[*].PublicIpAddress" --output text > autoscaling_instance_ips.txt << EOF
ips_file="autoscaling_instance_ips.txt"
IFS=$'\n' read -d '' -r -a ips < "$ips_file"
for i in "${!ips[@]}"; do
ssh -o StrictHostKeyChecking=no -i /home/runner/.ssh/id_rsa ubuntu@${ips[i]} << EOF
docker pull ${{ secrets.DOCKER_HUB_USERNAME }}/flask-app-image-repository:latest
docker stop my-container || true
docker rm my-container || true
docker run -d --name my-container -p 80:5000 ${{ secrets.DOCKER_HUB_USERNAME }}/flask-app-image-repository:latest
EOF
done
env:
AWS_DEFAULT_REGION: ${{ secrets.AWS_DEFAULT_REGION }}
AWS_REGION: ${{ secrets.AWS_REGION }}
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
DOCKER_HUB_USERNAME: ${{ secrets.DOCKER_HUB_USERNAME }}
```

Expand Down
47 changes: 46 additions & 1 deletion app.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import os
import urllib

import mysql.connector
from mysql.connector import Error
import markdown
from markdown.extensions.codehilite import CodeHiliteExtension
import json
Expand Down Expand Up @@ -45,6 +46,50 @@ def get_ip():
REDIRECT_URI = REDIRECT_URI_REMOTE if ENVIRONMENT == 'production' else REDIRECT_URI_LOCAL


def create_db_connection():
try:
connection = mysql.connector.connect(
host=os.getenv('EC2_dbs_IP'),
user=os.getenv('MYSQL_USER'),
password=os.getenv('MYSQL_PASSWORD'),
database=os.getenv('MYSQL_DATABASE')
)
if connection.is_connected():
print("Connected to MySQL database")
return connection
except Error as e:
print(f"Error: {e}")
return None


@app.route("/save_recommendations", methods=['POST'])
def save_recommendations():
data = request.json
connection = create_db_connection()
if connection is None:
return "Failed to connect to the database", 500

cursor = connection.cursor()
insert_query = """
INSERT INTO recommendations (user_id, seed_tracks, market, min_energy, max_energy, target_popularity,
target_acousticness, target_instrumentalness, target_tempo, song_title,
album_title, year, artist_name)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
"""

for rec in data['recommendations']:
cursor.execute(insert_query, (
data['user_id'], data['seed_tracks'], data['market'], data['min_energy'], data['max_energy'],
data['target_popularity'], data['target_acousticness'], data['target_instrumentalness'],
data['target_tempo'], rec['song_title'], rec['album_title'], rec['year'], rec['artist_name']
))

connection.commit()
cursor.close()
connection.close()
return jsonify({'message': 'Recommendations saved successfully'})


@app.route("/")
def index():
return render_template('welcome.html')
Expand Down
3 changes: 2 additions & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@ Werkzeug~=3.0.0
python-dotenv~=1.0.0
Markdown~=3.6
Pygments~=2.18.0
requests~=2.31.0
requests~=2.31.0
mysql-connector-python~=8.4.0

0 comments on commit cd033c5

Please sign in to comment.