diff --git a/README.md b/README.md index befce69..457bd59 100644 --- a/README.md +++ b/README.md @@ -997,7 +997,7 @@ name: Build and Deploy to AWS on: push: branches: - - master + - main jobs: build-and-deploy: @@ -1028,6 +1028,7 @@ 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: @@ -1035,15 +1036,15 @@ jobs: 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 @@ -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 <> "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 }} + ``` diff --git a/app.py b/app.py index 2e6f351..c21e815 100644 --- a/app.py +++ b/app.py @@ -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 @@ -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') diff --git a/requirements.txt b/requirements.txt index 44f5326..1377f9f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,4 +8,5 @@ Werkzeug~=3.0.0 python-dotenv~=1.0.0 Markdown~=3.6 Pygments~=2.18.0 -requests~=2.31.0 \ No newline at end of file +requests~=2.31.0 +mysql-connector-python~=8.4.0 \ No newline at end of file