haven notify :)
Some checks failed
Check scripts syntax / check-scripts-syntax (push) Successful in 37s
Haven Notify Build and Deploy / build_haven_notify (push) Failing after 3m30s
Haven Notify Build and Deploy / deploy_haven_notify (push) Has been skipped

This commit is contained in:
2025-08-16 21:53:37 -03:00
parent df11d9dcf8
commit 72ec3e2477
4 changed files with 224 additions and 0 deletions

View File

@@ -0,0 +1,82 @@
name: Haven Notify Build and Deploy
on:
push:
branches:
- main
paths:
- 'haven-notify/**'
workflow_dispatch: {}
env:
REGISTRY_HOST: git.ivanch.me
REGISTRY_USERNAME: ivanch
IMAGE_NOTIFY: ${{ env.REGISTRY_HOST }}/ivanch/haven-notify
KUBE_CONFIG: ${{ secrets.KUBE_CONFIG }}
jobs:
build_haven_notify:
runs-on: ubuntu-arm64
steps:
- name: Check out repository
uses: actions/checkout@v2
- name: Log in to Container Registry
run: |
echo "${{ secrets.REGISTRY_PASSWORD }}" \
| docker login "${{ env.REGISTRY_HOST }}" \
-u "${{ env.REGISTRY_USERNAME }}" \
--password-stdin
- name: Build and Push Image
run: |
TAG=latest
cd haven-notify
docker build \
-t "${{ env.IMAGE_NOTIFY }}:${TAG}" \
-f haven-notify/Dockerfile \
haven-notify
docker push "${{ env.IMAGE_NOTIFY }}:${TAG}"
deploy_haven_notify:
runs-on: ubuntu-arm64
needs: build_haven_notify
steps:
- name: Check KUBE_CONFIG validity
run: |
if [ -z "${KUBE_CONFIG}" ] || [ "${KUBE_CONFIG}" = "" ] || [ "${KUBE_CONFIG// }" = "" ]; then
echo "KUBE_CONFIG is not set or is empty."
exit 1
fi
- name: Check out repository
uses: actions/checkout@v2
- name: Download and install kubectl
run: |
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
install -m 0755 kubectl /usr/local/bin/kubectl
kubectl version --client
- name: Set up kubeconfig
run: |
cd haven-notify/deploy
echo "$KUBE_CONFIG" > kubeconfig.yaml
env:
KUBE_CONFIG: ${{ env.KUBE_CONFIG }}
- name: Test connection to cluster
run: |
kubectl --kubeconfig=kubeconfig.yaml cluster-info
- name: Apply haven-notify deployment
run: |
kubectl --kubeconfig=kubeconfig.yaml apply -f haven-notify.yaml
- name: Rollout restart haven-notify
run: |
kubectl --kubeconfig=kubeconfig.yaml rollout restart deployment/haven-notify

12
haven-notify/Dockerfile Normal file
View File

@@ -0,0 +1,12 @@
# Start from the official Golang image for building
FROM golang:1.25 AS builder
WORKDIR /app
COPY . .
RUN go build -o haven-notify main.go
# Use a minimal image for running
FROM busybox:latest
WORKDIR /app
COPY --from=builder /app/haven-notify .
EXPOSE 8080
ENTRYPOINT ["/app/haven-notify"]

View File

@@ -0,0 +1,54 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: haven-notify
labels:
app: haven-notify
spec:
replicas: 1
selector:
matchLabels:
app: haven-notify
template:
metadata:
labels:
app: haven-notify
spec:
containers:
- name: haven-notify
image: git.ivanch.me/ivanch/haven-notify:latest
imagePullPolicy: Always
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: haven-notify
spec:
selector:
app: haven-notify
ports:
- protocol: TCP
port: 8080
targetPort: 8080
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: haven-notify
namespace: default
annotations:
traefik.ingress.kubernetes.io/router.entrypoints: web
spec:
rules:
- host: notify.haven
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: haven-notify
port:
number: 8080

76
haven-notify/main.go Normal file
View File

@@ -0,0 +1,76 @@
package main
import (
"bytes"
"encoding/json"
"fmt"
"log"
"net/http"
)
// Notification payload
type Notification struct {
Title string `json:"title"`
Message string `json:"message"`
}
func main() {
http.HandleFunc("/notify", notifyHandler)
log.Println("Starting server on :8080...")
log.Fatal(http.ListenAndServe(":8080", nil))
}
func notifyHandler(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
w.WriteHeader(http.StatusMethodNotAllowed)
w.Write([]byte("Method not allowed"))
return
}
var notif Notification
if err := json.NewDecoder(r.Body).Decode(&notif); err != nil {
w.WriteHeader(http.StatusBadRequest)
w.Write([]byte("Invalid payload"))
return
}
// Call Discord notification function
if err := sendDiscordNotification(notif.Title, notif.Message); err != nil {
w.WriteHeader(http.StatusInternalServerError)
w.Write([]byte("Failed to send Discord notification"))
return
}
w.WriteHeader(http.StatusOK)
w.Write([]byte("Notification sent"))
}
func sendDiscordNotification(title, message string) error {
const webhookURL = ""
// Discord webhook payload
type discordPayload struct {
Content string `json:"content"`
}
content := "**" + title + "**\n" + message
payload := discordPayload{Content: content}
jsonData, err := json.Marshal(payload)
if err != nil {
return err
}
resp, err := http.Post(webhookURL, "application/json", bytes.NewBuffer(jsonData))
if err != nil {
return err
}
defer resp.Body.Close()
if resp.StatusCode < 200 || resp.StatusCode >= 300 {
return fmt.Errorf("Discord webhook returned status: %s", resp.Status)
}
return nil
}