Compare commits

..

9 Commits

Author SHA1 Message Date
e4d47b46e4 Merge pull request 'staging' (#9) from staging into main
All checks were successful
release-tag / release-image (push) Successful in 2m11s
Reviewed-on: #9
2025-05-11 10:18:49 +00:00
16b5ddfb7b Merge pull request 'Anpassung für dynamische Content-Gits' (#8) from staging into main
Some checks failed
release-tag / release-image (push) Failing after 45s
Reviewed-on: #8
2025-05-10 17:14:28 +00:00
5f089d727e Merge pull request 'staging' (#7) from staging into main
All checks were successful
release-tag / release-image (push) Successful in 1m52s
Reviewed-on: #7
2025-05-10 13:09:28 +00:00
0d98bd064e Merge pull request 'staging' (#6) from staging into main
All checks were successful
release-tag / release-image (push) Successful in 1m49s
Reviewed-on: #6
2025-05-07 20:28:52 +00:00
2a63985564 Merge pull request 'Update Datenschutz und Impressum Telefonnummer' (#5) from staging into main
All checks were successful
release-tag / release-image (push) Successful in 1m50s
Reviewed-on: #5
2025-05-07 16:18:58 +00:00
33c0f9d954 Merge pull request 'staging' (#4) from staging into main
All checks were successful
release-tag / release-image (push) Successful in 1m56s
Reviewed-on: #4
2025-05-06 22:00:17 +00:00
08cb7b689d Merge pull request 'staging' (#3) from staging into main
All checks were successful
release-tag / release-image (push) Successful in 1m50s
Reviewed-on: #3
2025-05-06 18:03:54 +00:00
32d3fc33d6 Merge pull request 'Contentpatch 20250506' (#2) from staging into main
All checks were successful
release-tag / release-image (push) Successful in 1m58s
Reviewed-on: #2
2025-05-06 12:52:51 +00:00
7afa89a66b Merge pull request 'staging' (#1) from staging into main
All checks were successful
release-tag / release-image (push) Successful in 1m55s
Reviewed-on: #1
2025-05-06 10:20:47 +00:00
4 changed files with 10 additions and 250 deletions

View File

@@ -1,7 +1,7 @@
############################
# 1) GoBuild
############################
FROM golang:1.25 AS build
FROM golang:1.23.1 AS build
WORKDIR /app
COPY go.mod go.sum ./
@@ -41,7 +41,7 @@ FROM debian:bookworm-slim
# (optional) MySQLClient für später
RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates git \
ca-certificates \
&& rm -rf /var/lib/apt/lists/*
# ─── Binärdatei ─────
@@ -60,11 +60,6 @@ ENV BLOG_STATIC_DIR=/static
ENV BLOG_PAGES_DIR=/pages
ENV BLOG_TEMPLATES_DIR=/templates
ENV BLOG_TICKS_DIR=/ticks
ENV GIT_ENABLE=false
ENV GIT_REPO=null
ENV GIT_BRANCH=main
ENV GIT_DIR=/git-temp
ENV GIT_INTERVAL=10
EXPOSE 8080
CMD ["blog"]

View File

@@ -1,41 +0,0 @@
############################
# 1) GoBuild
############################
FROM golang:1.23.1 AS build
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o /blog ./cmd/blog
############################
# 3) RuntimeImage
############################
FROM debian:bookworm-slim
# (optional) MySQLClient für später
RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates git \
&& rm -rf /var/lib/apt/lists/*
# ─── Binärdatei ─────
COPY --from=build /blog /usr/local/bin/blog
# ─── Content + Assets ───
RUN mkdir -p /content /static /pages /app /templates /ticks /git-temp
COPY . /app
ENV BLOG_CONTENT_DIR=/content
ENV BLOG_STATIC_DIR=/static
ENV BLOG_PAGES_DIR=/pages
ENV BLOG_TEMPLATES_DIR=/templates
ENV BLOG_TICKS_DIR=/ticks
ENV GIT_ENABLE=false
ENV GIT_REPO=null
ENV GIT_BRANCH=main
ENV GIT_DIR=/git-temp
ENV GIT_INTERVAL=10
EXPOSE 8080
CMD ["blog"]

View File

@@ -4,12 +4,9 @@ import (
"encoding/json"
"fmt"
"html/template"
"io"
"net/http"
"os"
"os/exec"
"os/signal"
"path/filepath"
"strconv"
"strings"
"syscall"
@@ -96,8 +93,6 @@ var (
tplArticle *template.Template
)
var Xarticles []article.Article
func main() {
// Signal-Kanal einrichten
@@ -117,13 +112,7 @@ func main() {
staticDir := getenv("BLOG_STATIC_DIR", "/app/internal/web/static")
pagesDir := getenv("BLOG_PAGES_DIR", "/pages")
templatesDir := getenv("BLOG_TEMPLATES_DIR", "/templates")
storeEnabled := enabled("STORE_ENABLE", false)
ticksDir := getenv("BLOG_TICKS_DIR", "/ticks")
gitEnable := enabled("GIT_ENABLE", false)
gitRepo := getenv("GIT_REPO", "null")
gitBranch := getenv("GIT_BRANCH", "main")
gitDir := getenv("GIT_DIR", "/git-temp")
gitInterval := getenv("GIT_INTERVAL", "10")
TickCatalog = nil
if err := LoadTickCatalog(ticksDir + "/ticks.json"); err != nil {
@@ -132,8 +121,6 @@ func main() {
fmt.Println("Geladener Katalog:", TickCatalog)
cloneRepo(gitRepo, gitBranch, gitDir)
funcs := template.FuncMap{
"now": time.Now, // jetztZeit bereitstellen
}
@@ -141,11 +128,6 @@ func main() {
// Basislayout zuerst parsen
layout := template.Must(template.New("base").Funcs(funcs).ParseFiles(templatesDir + "/base.html"))
var tplStore *template.Template
if storeEnabled {
tplStore = template.Must(template.New("store").Funcs(funcs).ParseFiles(templatesDir + "/store.html"))
}
// LISTSeite: base + list.html
tplList = template.Must(layout.Clone())
template.Must(tplList.Funcs(funcs).ParseFiles(templatesDir + "/list.html"))
@@ -164,8 +146,6 @@ func main() {
fmt.Println(err)
}
Xarticles = articles
staticPages, err := article.LoadStatic(pagesDir)
if err != nil {
fmt.Println(err)
@@ -182,8 +162,8 @@ func main() {
/* */
for a, b := range Xarticles {
Xarticles[a].Counter = getTick(b.Slug)
for a, b := range articles {
articles[a].Counter = getTick(b.Slug)
}
/* */
@@ -191,7 +171,7 @@ func main() {
if err := tplList.ExecuteTemplate(w, "layout", article.ListPage{
Title: "Startseite",
Description: "Alle Artikel im Überblick",
Articles: Xarticles,
Articles: articles,
}); err != nil {
http.Error(w, err.Error(), 500)
}
@@ -199,7 +179,7 @@ func main() {
mux.HandleFunc("/post/", func(w http.ResponseWriter, r *http.Request) {
slug := strings.TrimPrefix(r.URL.Path, "/post/")
for _, a := range Xarticles {
for _, a := range articles {
if a.Slug == slug {
IncTick(slug)
t := getTick(slug)
@@ -226,24 +206,9 @@ func main() {
}
})
mux.Handle("/static/", cacheControl(http.StripPrefix("/static/", http.FileServer(http.Dir(staticDir)))))
mux.HandleFunc("/store", func(w http.ResponseWriter, r *http.Request) {
if storeEnabled {
if err := tplStore.ExecuteTemplate(w, "store", nil); err != nil {
http.Error(w, err.Error(), 500)
}
} else {
http.NotFound(w, r)
}
})
if gitEnable {
xMinute, _ := strconv.Atoi(gitInterval)
xDuration := time.Duration(xMinute) * time.Minute
go startAutoClone(gitRepo, gitBranch, gitDir, xDuration)
}
mux.Handle("/static/",
cacheControl(http.StripPrefix("/static/",
http.FileServer(http.Dir(staticDir)))))
StopServer(http.ListenAndServe(":8080", mux))
@@ -263,162 +228,3 @@ func StopServer(e error) {
prepareExit()
fmt.Println("~", "Server stopped!")
}
func cloneRepo(repoURL, branch, dir string) {
fmt.Printf("Starte Klonvorgang für Branch '%s'...\n", branch)
// Verzeichnis löschen
if err := os.RemoveAll(dir); err != nil {
fmt.Println("Fehler beim Löschen des Verzeichnisses:", err)
return
}
// Git-Clone mit Branch
cmd := exec.Command("git", "clone", "--branch", branch, "--single-branch", repoURL, dir)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil {
fmt.Println("Fehler beim Klonen:", err)
} else {
fmt.Println("Repo erfolgreich geklont.")
}
contentDir := getenv("BLOG_CONTENT_DIR", "/content")
err := os.RemoveAll("/content")
if err != nil {
fmt.Println(err, "/content")
}
err = os.RemoveAll("/static")
if err != nil {
fmt.Println(err, "/static")
}
err = os.RemoveAll("/pages")
if err != nil {
fmt.Println(err, "/pages")
}
err = os.RemoveAll("/templates")
if err != nil {
fmt.Println(err, "/templates")
}
if err := os.MkdirAll("/content", 0755); err != nil {
fmt.Println("Fehler beim Erstellen des Zielordners:", err)
return
}
if err := os.MkdirAll("/static", 0755); err != nil {
fmt.Println("Fehler beim Erstellen des Zielordners:", err)
return
}
if err := os.MkdirAll("/pages", 0755); err != nil {
fmt.Println("Fehler beim Erstellen des Zielordners:", err)
return
}
if err := os.MkdirAll("/templates", 0755); err != nil {
fmt.Println("Fehler beim Erstellen des Zielordners:", err)
return
}
if err := copyDirContents("/git-temp/articles", "/content"); err != nil {
fmt.Println("Fehler beim Kopieren:", err)
} else {
fmt.Println("Kopieren abgeschlossen.")
}
if err := copyDirContents("/git-temp/static", "/static"); err != nil {
fmt.Println("Fehler beim Kopieren:", err)
} else {
fmt.Println("Kopieren abgeschlossen.")
}
if err := copyDirContents("/git-temp/pages", "/pages"); err != nil {
fmt.Println("Fehler beim Kopieren:", err)
} else {
fmt.Println("Kopieren abgeschlossen.")
}
if err := copyDirContents("/git-temp/templates", "/templates"); err != nil {
fmt.Println("Fehler beim Kopieren:", err)
} else {
fmt.Println("Kopieren abgeschlossen.")
}
articles, err := article.LoadDir(contentDir)
if err != nil {
fmt.Println(err)
}
Xarticles = articles
}
func copyDirContents(srcDir, destDir string) error {
entries, err := os.ReadDir(srcDir)
if err != nil {
return fmt.Errorf("Fehler beim Lesen von %s: %w", srcDir, err)
}
for _, entry := range entries {
srcPath := filepath.Join(srcDir, entry.Name())
destPath := filepath.Join(destDir, entry.Name())
info, err := entry.Info()
if err != nil {
return err
}
if info.IsDir() {
if err := os.MkdirAll(destPath, info.Mode()); err != nil {
return fmt.Errorf("Fehler beim Erstellen von Ordner %s: %w", destPath, err)
}
// rekursiv kopieren
if err := copyDirContents(srcPath, destPath); err != nil {
return err
}
} else {
if err := copyFile(srcPath, destPath, info); err != nil {
return err
}
}
}
return nil
}
func copyFile(src, dest string, info os.FileInfo) error {
in, err := os.Open(src)
if err != nil {
return err
}
defer in.Close()
out, err := os.Create(dest)
if err != nil {
return err
}
defer out.Close()
if _, err := io.Copy(out, in); err != nil {
return err
}
return os.Chmod(dest, info.Mode())
}
func startAutoClone(repoURL, branch, dir string, interval time.Duration) {
go cloneRepo(repoURL, branch, dir) // sofortiger Start
ticker := time.NewTicker(interval)
defer ticker.Stop()
for range ticker.C {
go cloneRepo(repoURL, branch, dir)
}
}

2
go.mod
View File

@@ -1,5 +1,5 @@
module git.send.nrw/sendnrw/b1tsblog
go 1.25.3
go 1.23.1
require github.com/gomarkdown/markdown v0.0.0-20250311123330-531bef5e742b