From a5a155f2389d682a7dfab9fe443caedcac2e6b73 Mon Sep 17 00:00:00 2001 From: Henrik Jess Date: Tue, 10 Dec 2024 15:16:17 +0100 Subject: [PATCH] First real commit --- .env | 2 ++ .gitea/workflows/main.yml | 63 ++++++++++++++++++++++++++++++++++ .gitea/workflows/nomad-job.hcl | 60 ++++++++++++++++++++++++++++++++ .python-version | 1 + Dockerfile | 11 ++---- app.py | 11 ++++++ requirements.txt | 4 +++ 7 files changed, 144 insertions(+), 8 deletions(-) create mode 100644 .env create mode 100644 .gitea/workflows/main.yml create mode 100644 .gitea/workflows/nomad-job.hcl create mode 100644 .python-version create mode 100644 app.py diff --git a/.env b/.env new file mode 100644 index 0000000..0ae1c49 --- /dev/null +++ b/.env @@ -0,0 +1,2 @@ +APP_NAME=LifeFAQ +DEBUG=true diff --git a/.gitea/workflows/main.yml b/.gitea/workflows/main.yml new file mode 100644 index 0000000..387c43f --- /dev/null +++ b/.gitea/workflows/main.yml @@ -0,0 +1,63 @@ +name: Build, Push, and Deploy to Nomad + +on: + push: + branches: + - main + +jobs: + docker-nomad: + runs-on: self-hosted + steps: + - name: Check out code + uses: actions/checkout@v3 + + - name: Log in to Container Registry + run: echo ${{ secrets.password }} | docker login registry.i80.dk -u ${{ secrets.username }} --password-stdin + + - name: Build Docker Image + run: | + COMMIT_HASH=$(git rev-parse --short HEAD) + docker build -t registry.i80.dk/gitea/lifefaq:latest -t registry.i80.dk/gitea/lifefaq:${COMMIT_HASH} . + + + - name: Push Docker Image + run: | + COMMIT_HASH=$(git rev-parse --short HEAD) + echo "registry.i80.dk/gitea/lifefaq:latest" + echo "registry.i80.dk/gitea/lifefaq:${COMMIT_HASH}" + docker push registry.i80.dk/gitea/lifefaq:${COMMIT_HASH} + docker push registry.i80.dk/gitea/lifefaq:latest + + + - name: Validate Nomad Job + env: + NOMAD_ADDR: https://nomad.i80.dk + run: nomad job validate .gitea/workflows/nomad-job.hcl + + - name: Stop old deployment + env: + NOMAD_ADDR: https://nomad.i80.dk + run: nomad job stop -purge -no-shutdown-delay lifefaq + continue-on-error: true + + + - name: Apply Nomad Job + env: + NOMAD_ADDR: https://nomad.i80.dk + run: nomad job run .gitea/workflows/nomad-job.hcl + + - name: Update Nginx Configuration + run: ssh runner@nomad sudo /opt/nginx_updater/venv/bin/python3 /opt/nginx_updater/nginx_updater.py lifefaq + + - name: Update Forwarder Configuration + run: ssh runner@nomad sudo /opt/nginx_updater/venv/bin/python3 /opt/nginx_updater/update_forwarder.py lifefaq + + +# - name: Restart Nomad Job +# env: +# NOMAD_ADDR: https://nomad.i80.dk +# run: | +# nomad job stop lifefaq +# sleep 5 # Optional: Wait to ensure the old allocation is stopped +# nomad job run .gitea/workflows/nomad-job.hcl diff --git a/.gitea/workflows/nomad-job.hcl b/.gitea/workflows/nomad-job.hcl new file mode 100644 index 0000000..e37f6c1 --- /dev/null +++ b/.gitea/workflows/nomad-job.hcl @@ -0,0 +1,60 @@ +job "lifefaq" { + region = "global" + datacenters = ["dc1"] + type = "service" + + update { + stagger = "60s" + max_parallel = 1 + progress_deadline = "6m" + } + + group "lifefaq-group" { + count = 1 + + network { + port "port-app" { + to = 9210 # Internal application port + } + } + + # Register the service with Consul + service { + provider = "consul" + name = "lifefaq" + port = "port-app" + + # Traefik-specific tags for routing + tags = [ + "PORT=${NOMAD_PORT_port-app}" + ] + + # Define a health check using TCP + check { + name = "tcp_check" + type = "tcp" + interval = "10s" + timeout = "2s" + } + } + + task "lifefaq-task" { + driver = "docker" + + config { + image = "registry.i80.dk/gitea/lifefaq:latest" + ports = ["port-app"] + } + + env { + APP_ENV = "production" + PORT = "${NOMAD_PORT_port-app}" + } + + resources { + cpu = 250 + memory = 80 + } + } + } +} diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..d4b278f --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.11.7 diff --git a/Dockerfile b/Dockerfile index cc33f2b..7b8a42c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,13 +13,8 @@ RUN pip install --no-cache-dir -r requirements.txt # Copy the rest of the application code COPY . . -# Expose the port the app runs on (default Flask port) +# Expose the port the FastAPI app runs on (default Uvicorn port) EXPOSE 5000 -# Define environment variables -ENV FLASK_APP=app.py -ENV FLASK_RUN_HOST=0.0.0.0 -ENV PORT=5000 -# Command to run the application -#CMD ["flask", "run", "--port", "${PORT}"] -CMD flask run --port ${PORT} \ No newline at end of file +# Command to run the FastAPI application +CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "5000", "--workers", "1"] \ No newline at end of file diff --git a/app.py b/app.py new file mode 100644 index 0000000..5221b4f --- /dev/null +++ b/app.py @@ -0,0 +1,11 @@ +from fastapi import FastAPI +from dotenv import load_dotenv +import os + +load_dotenv() + +app = FastAPI(title=os.getenv("APP_NAME", "Default App")) + +@app.get("/") +def read_root(): + return {"debug": os.getenv("DEBUG", "false")} \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index e69de29..8ec772b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -0,0 +1,4 @@ +fastapi==0.110.0 # Latest FastAPI version +uvicorn[standard]==0.27.1 # ASGI server to run FastAPI +pydantic==2.6.3 +python-dotenv==1.0.1 # Manage environment variables \ No newline at end of file