diff --git a/.gitea/workflows/aws_deploy_on_push.yml b/.gitea/workflows/aws_deploy_on_push.yml index 7f2fb90..736a7ec 100644 --- a/.gitea/workflows/aws_deploy_on_push.yml +++ b/.gitea/workflows/aws_deploy_on_push.yml @@ -13,28 +13,39 @@ jobs: - run: echo "The name of your branch is ${{ gitea.ref }} and your repository is ${{ gitea.repository }}." - run: echo "The ${{ gitea.repository }} repository has been cloned to the runner." - uses: actions/checkout@v4 + - name: Set up Python 3.12 uses: actions/setup-python@v4 with: python-version: "3.12" + - name: Set up Node uses: actions/setup-node@v4 with: node-version: "22.15" + - name: Install Python dependencies and CDK run: | python -m pip install --upgrade pip pip install aws-cdk-lib constructs npm install -g aws-cdk + - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@master with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }} aws-secret-access-key: ${{ secrets.AWS_SECRET_KEY }} aws-region: "us-east-2" - - name: Destroy existing stack - run: cdk destroy --app="python3 ${PWD}/app.py" --force + - name: Deploy to AWS run: cdk deploy --app="python3 ${PWD}/app.py" --require-approval=never + - name: Update application on instance + run: | + INSTANCE_ID=$(aws ec2 describe-instances --filters "Name=tag:Name,Values=IptvUpdater/IptvUpdaterInstance" --query "Reservations[*].Instances[*].InstanceId" --output text) + aws ssm send-command \ + --instance-ids "$INSTANCE_ID" \ + --document-name "AWS-RunShellScript" \ + --parameters 'commands=["cd /home/ec2-user/iptv-updater-aws && git pull && pip3 install -r requirements.txt && systemctl restart iptv-updater"]' + - run: echo "This job's status is ${{ job.status }}." \ No newline at end of file diff --git a/infrastructure/stack.py b/infrastructure/stack.py index 10f8623..cab843b 100644 --- a/infrastructure/stack.py +++ b/infrastructure/stack.py @@ -97,8 +97,15 @@ class IptvUpdaterStack(Stack): user_data=userdata, ) + # Create Elastic IP + eip = ec2.CfnEIP( + self, "IptvUpdaterEIP", + domain="vpc", + instance_id=instance.instance_id + ) + # Output the public DNS name CfnOutput( self, "InstancePublicDNS", - value=instance.instance_public_dns_name + value=eip.attr_public_ip ) \ No newline at end of file diff --git a/infrastructure/userdata.sh b/infrastructure/userdata.sh index 16d35e7..92a26df 100644 --- a/infrastructure/userdata.sh +++ b/infrastructure/userdata.sh @@ -14,8 +14,26 @@ cd iptv-updater-aws pip3 install -r requirements.txt +# Create systemd service file +cat << 'EOF' > /etc/systemd/system/iptv-updater.service +[Unit] +Description=IPTV Updater Service +After=network.target + +[Service] +Type=simple +User=ec2-user +WorkingDirectory=/home/ec2-user/iptv-updater-aws +ExecStart=/usr/local/bin/uvicorn app.main:app --host 127.0.0.1 --port 8000 +Restart=always + +[Install] +WantedBy=multi-user.target +EOF + # Create nginx config -echo 'server { +cat << 'EOF' > /etc/nginx/conf.d/iptvUpdater.conf +server { listen 80; server_name $HOSTNAME; location / { @@ -25,11 +43,11 @@ echo 'server { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } -}' > /etc/nginx/conf.d/iptvUpdater.conf +} +EOF # Start nginx service systemctl enable nginx systemctl start nginx - -# Start IptvUpdater on port 8000 -nohup uvicorn app.main:app --host 127.0.0.1 --port 8000 /dev/null & \ No newline at end of file +systemctl enable iptv-updater +systemctl start iptv-updater \ No newline at end of file