Skip to content

Commit

Permalink
Merge pull request #22 from tblanarik/tblanarik/dockerize
Browse files Browse the repository at this point in the history
Move to Docker instead of Azure Functions
  • Loading branch information
tblanarik authored Nov 16, 2024
2 parents 52eb5df + 95a13a8 commit 0795c44
Show file tree
Hide file tree
Showing 10 changed files with 101 additions and 118 deletions.
48 changes: 48 additions & 0 deletions .github/workflows/deploy-docker.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# Docs for the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy
# More GitHub Actions for Azure: https://github.com/Azure/actions

name: Build and deploy container app to Azure Web App - spotbot-docker

on:
workflow_dispatch:

jobs:
build:
runs-on: 'ubuntu-latest'

steps:
- uses: actions/checkout@v2

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2

- name: Log in to registry
uses: docker/login-action@v2
with:
registry: https://index.docker.io/v1/
username: ${{ secrets.AzureAppService_ContainerUsername_630053f317634033aaa0862db4b07802 }}
password: ${{ secrets.AzureAppService_ContainerPassword_71079aba47ee4c1196a01eaf134b3447 }}

- name: Build and push container image to registry
uses: docker/build-push-action@v3
with:
push: true
tags: index.docker.io/${{ secrets.AzureAppService_ContainerUsername_630053f317634033aaa0862db4b07802 }}/python:${{ github.sha }}
file: ./Dockerfile

deploy:
runs-on: ubuntu-latest
needs: build
environment:
name: 'production'
url: ${{ steps.deploy-to-webapp.outputs.webapp-url }}

steps:
- name: Deploy to Azure Web App
id: deploy-to-webapp
uses: azure/webapps-deploy@v2
with:
app-name: 'spotbot-docker'
slot-name: 'production'
publish-profile: ${{ secrets.AzureAppService_PublishProfile_e744ed7c6ffe4564a93b0e3c07ec1ed1 }}
images: 'index.docker.io/${{ secrets.AzureAppService_ContainerUsername_630053f317634033aaa0862db4b07802 }}/python:${{ github.sha }}'
73 changes: 0 additions & 73 deletions .github/workflows/main_hamalertspotbot.yml

This file was deleted.

9 changes: 9 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# syntax=docker/dockerfile:1

FROM python:3.13
WORKDIR /
COPY requirements.txt .
RUN pip3 install -r requirements.txt
COPY . .
EXPOSE 50505
ENTRYPOINT ["gunicorn", "app:app"]
8 changes: 5 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

## Description

Spotbot is an Azure Function App to convert [HamAlert](https://hamalert.org/) alerts from [POTA](https://pota.app) or [SOTA](https://www.sota.org.uk/) in to a message format that can be forwarded on to a Discord channel webhook.
Spotbot is an application to convert [HamAlert](https://hamalert.org/) alerts from [POTA](https://pota.app) or [SOTA](https://www.sota.org.uk/) in to a message format that can be forwarded on to a Discord channel webhook.

| HamAlert Configuration |
| -- |
Expand All @@ -19,15 +19,17 @@ You can find a live, working version of this bot in the [Cascadia Radio](https:/

## Config

The Azure Function App expects three environment variables:
The app expects four environment variables:
- `TARGET_URL` - the webhook URL from the target Discord channel.
- `LOOKBACK_SECONDS` - the number of seconds to look backwards for previous messages to update instead of posting a new one
- `TABLE_NAME` - the name of the table in the Azure Storage Account where the last messageIds will be stored for each callsign
- `AzureWebJobsStorage` - the full connection string to the Azure Storage Account
- `SECRET_ENDPOINT` - the name of the endpoint, kept secret to prevent abuse / unwanted messages

## Deploy Notes

- Some basic tests run in `tests.py` on the creation of a new PR
- To deploy, manually run `main_hamalertspotbot.yml`
- To deploy, manually run `deploy-docker.yml`
- This will deploy to the staging slot for testing.
- The staging `TARGET_URL` points to my private Discord server
- `LOOKBACK_SECONDS` is set to only 300 (instead of 7200) for easier testing.
28 changes: 28 additions & 0 deletions app.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import os
from flask import Flask, request, make_response
import logging
import spotbot as sb
import tables
import discord_http
app = Flask(__name__)
endpoint = os.environ.get('SECRET_ENDPOINT')

@app.route(f'/{endpoint}', methods=["POST"])
def run():
try:
sb.SpotBot(request, tables.HamAlertTable(), discord_http.DiscordHttp()).process()
except Exception as _excpt:
logging.error(f"Exception occurred: {_excpt}")
return make_response(f"Exception occurred: {_excpt}", 500)
else:
return make_response("Accepted", 202)

'''
Empty endpoint used for keeping the container on and loaded
'''
@app.route('/', methods=["GET"])
def always_on():
return make_response("OK", 200)

if __name__ == "__main__":
app.run()
4 changes: 0 additions & 4 deletions cleanup.py

This file was deleted.

29 changes: 0 additions & 29 deletions function_app.py

This file was deleted.

8 changes: 8 additions & 0 deletions gunicorn_config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import os

workers = int(os.environ.get('GUNICORN_PROCESSES', '2'))
threads = int(os.environ.get('GUNICORN_THREADS', '4'))
# timeout = int(os.environ.get('GUNICORN_TIMEOUT', '120'))
bind = os.environ.get('GUNICORN_BIND', '0.0.0.0:50505')
forwarded_allow_ips = '*'
secure_scheme_headers = { 'X-Forwarded-Proto': 'https' }
7 changes: 0 additions & 7 deletions host.json

This file was deleted.

5 changes: 3 additions & 2 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
azure-functions
azure-data-tables
requests
pytz
pytz
flask
gunicorn

0 comments on commit 0795c44

Please sign in to comment.