diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..98250aa
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,27 @@
+# Binaries
+linuxservice
+*.exe
+*.dll
+*.so
+*.dylib
+
+# Build directories
+/bin/
+/build/
+/dist/
+
+# Logs and caches
+*.log
+*.cache
+
+# OS files
+.DS_Store
+Thumbs.db
+
+# Editor/project files
+.vscode/
+.idea/
+
+# Go
+*.test
+coverage.out
diff --git a/linuxservice b/linuxservice
deleted file mode 100755
index 30c4a42..0000000
Binary files a/linuxservice and /dev/null differ
diff --git a/main.go b/main.go
index 6f6f576..d653547 100644
--- a/main.go
+++ b/main.go
@@ -9,6 +9,7 @@ import (
"log"
"net/http"
"os"
+ "path/filepath"
"strings"
"sync"
"time"
@@ -102,6 +103,12 @@ func NewServer() *Server {
if err != nil {
log.Fatalf("Failed to parse templates: %v", err)
}
+ // Optionally parse partials if any exist
+ if matches, _ := filepath.Glob("templates/partials/*.html"); len(matches) > 0 {
+ if _, err := templates.ParseFiles(matches...); err != nil {
+ log.Fatalf("Failed to parse partial templates: %v", err)
+ }
+ }
return &Server{
config: config,
@@ -109,6 +116,21 @@ func NewServer() *Server {
}
}
+// cleanupOldSubmissions periodically purges stale rate-limit entries
+func cleanupOldSubmissions() {
+ for {
+ time.Sleep(10 * time.Minute)
+ mu.Lock()
+ cutoff := time.Now().Add(-submissionCooldown)
+ for ip, t := range lastSubmissionTime {
+ if t.Before(cutoff) {
+ delete(lastSubmissionTime, ip)
+ }
+ }
+ mu.Unlock()
+ }
+}
+
// createPageData creates PageData with the given title and current page
func (s *Server) createPageData(title, currentPage string) PageData {
return PageData{
@@ -208,7 +230,7 @@ func (s *Server) handleContactForm(w http.ResponseWriter, r *http.Request, data
mu.Unlock()
// On success, render success message
- data.SuccessMessage = "Bedankt voor uw bericht! We nemen zo snel mogelijk contact met u op."
+ data.SuccessMessage = "Bedankt voor uw bericht! Ik neem zo snel mogelijk contact met u op."
data.FormData = ContactForm{} // Clear form data
s.renderTemplate(w, "contact.html", *data)
}
@@ -238,7 +260,7 @@ func (s *Server) sendToTelegram(form ContactForm) error {
payload := map[string]interface{}{
"chat_id": s.config.TelegramChatID,
"text": message,
- "parse_mode": "Markdown",
+ "parse_mode": "MarkdownV2",
}
jsonData, err := json.Marshal(payload)
@@ -362,7 +384,7 @@ func (s *Server) linuxHandler(w http.ResponseWriter, r *http.Request) {
func (s *Server) setupRoutes() {
// Static files
fs := http.FileServer(http.Dir("static/"))
- http.Handle("/static/", http.StripPrefix("/static/", fs))
+ http.Handle("/static/", http.StripPrefix("/static/", cacheControlMiddleware(fs)))
// Page routes
http.HandleFunc("/", s.homeHandler)
@@ -376,7 +398,27 @@ func (s *Server) setupRoutes() {
func main() {
server := NewServer()
server.setupRoutes()
+ // Start background cleanup for rate limiting map
+ go cleanupOldSubmissions()
log.Printf("Server starting on %s", server.config.Port)
log.Fatal(http.ListenAndServe(server.config.Port, nil))
}
+
+// cacheControlMiddleware sets Cache-Control headers for static assets
+func cacheControlMiddleware(next http.Handler) http.Handler {
+ return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ path := r.URL.Path
+ switch {
+ case strings.HasSuffix(path, ".css") || strings.HasSuffix(path, ".js") ||
+ strings.HasSuffix(path, ".png") || strings.HasSuffix(path, ".jpg") ||
+ strings.HasSuffix(path, ".jpeg") || strings.HasSuffix(path, ".webp") ||
+ strings.HasSuffix(path, ".svg") || strings.HasSuffix(path, ".ico") ||
+ strings.HasSuffix(path, ".woff2"):
+ w.Header().Set("Cache-Control", "public, max-age=31536000, immutable")
+ default:
+ w.Header().Set("Cache-Control", "public, max-age=300")
+ }
+ next.ServeHTTP(w, r)
+ })
+}
diff --git a/static/icons/manifest.json b/static/icons/manifest.json
index b515705..7ad6277 100644
--- a/static/icons/manifest.json
+++ b/static/icons/manifest.json
@@ -8,12 +8,12 @@
"theme_color": "#059669",
"icons": [
{
- "src": "/static/android-chrome-192x192.png",
+ "src": "/static/images/android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
- "src": "/static/android-chrome-512x512.png",
+ "src": "/static/images/android-chrome-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
diff --git a/templates/contact.html b/templates/contact.html
index 03dffd5..02dd993 100644
--- a/templates/contact.html
+++ b/templates/contact.html
@@ -15,7 +15,7 @@
-
+
@@ -26,7 +26,7 @@
-
+
@@ -45,6 +45,8 @@
+
+
@@ -58,7 +60,7 @@
Heeft u vragen over Linux migratie? Wij helpen u graag verder! Heeft u vragen over Linux‑migratie? Ik help u graag verder!Neem contact op
-
Maandag - vrijdag: 09:00 - 17:00 (op afspraak)
+Maandag – vrijdag: 09:00 – 17:00 (op afspraak)
Weekend: op afspraak
Elke klant is uniek, en wij bieden maatwerkoplossingen.
+Elke klant is uniek. Ik lever maatwerkoplossingen.
Van installatie tot training, wij begeleiden u door het hele proces.
+Van installatie tot training: ik begeleid u door het hele proces.
Samen bouwen we aan een duurzamere digitale toekomst.
+U kiest voor een duurzamere digitale toekomst.
Installatie + basisinrichting: 1–2 uur. Migratie van gegevens: afhankelijk van volume en snelheid van opslag.
+Installatie + basisinrichting: 1 à 2 uur. Migratie van gegevens: afhankelijk van volume en snelheid van opslag.
Ik lever in de kern een Linux-installatie- en migratieservice en ben geen back-updienst. Back-ups maken en bewaren is in principe de verantwoordelijkheid van de klant. Als extra service kan ik — op uw verzoek — data kopiëren naar door u aangeleverde USB-sticks of een externe schijf.
-Hoewel ik zorgvuldig werk, kan er bij datakopie of -migratie altijd een risico op dataverlies bestaan (bijvoorbeeld door defecte schijven, corrupte data of hardwarefouten). U blijft verantwoordelijk voor uw eigen data. Ik ben niet aansprakelijk voor verlies of beschadiging van gegevens. Ik adviseer altijd om vooraf een eigen back-up te maken.
+Ik lever een Linux‑installatie‑ en migratieservice en ben geen back‑updienst. Back‑ups maken en bewaren is in principe de verantwoordelijkheid van de klant. Als extra service kan ik, op uw verzoek, data kopiëren naar door u aangeleverde USB‑sticks of een externe schijf.
+Hoewel ik zorgvuldig werk, kan er bij datakopie of migratie altijd een risico op dataverlies bestaan (bijvoorbeeld door defecte schijven, corrupte data of hardwarefouten). U blijft verantwoordelijk voor uw eigen data. Ik ben niet aansprakelijk voor verlies of beschadiging van gegevens. Ik adviseer altijd om vooraf een eigen back‑up te maken.
diff --git a/templates/footer.html b/templates/footer.html index 521222a..6937a59 100644 --- a/templates/footer.html +++ b/templates/footer.html @@ -20,7 +20,7 @@Lid van Nederlandse Linux Gebruikers Groep (NLLGG.nl)
Actief bij Buurtlinux.nl initiatief
-Wij ondersteunen de End-of-10-beweging voor duurzaam computergebruik.
+Ik ondersteun de End‑of‑10-beweging voor duurzaam computergebruik.
Linux is van nature veiliger dan Windows. Minder virussen, geen gedwongen updates en volledige controle over uw systeem.
- - -Geen licentiekosten, geen abonnementen. Linux en alle software zijn gratis en open source.
- - -Uw computer van 10 jaar oud? Linux maakt hem weer snel! Geen nieuwe hardware nodig.
- - -Stop e-waste! Door Linux te gebruiken houdt u uw apparaten langer werkend en uit de afvalberg.
- - -Geen tracking en geen verborgen gegevensverzameling. Uw privacy blijft van uzelf.
- - -Linux gebruikt minder systeembronnen, waardoor uw computer sneller opstart en soepeler werkt.
- -Zie hoe Linux eruitziet en werkt in de praktijk
- -Linux ziet er vertrouwd en professioneel uit. Deze Zorin OS desktop lijkt op Windows maar is veel sneller en veiliger.
-Duizenden gratis programma's met één klik installeren via de Software Manager. Net zo makkelijk als een app store.
-Linux kan vaak betere gamingprestaties leveren dan Windows, dankzij minder overhead en optimalisaties voor moderne games.
-Nieuw bij Linux? Geen zorgen. Linux is een veilig en snel besturingssysteem dat uw huidige computer nieuw leven kan geven – zonder licentiekosten. Hieronder leest u kort de voordelen en ziet u voorbeelden en populaire keuzes.
+Nieuw bij Linux? Geen zorgen. Linux is een veilig en snel besturingssysteem dat uw huidige computer nieuw leven kan geven, zonder licentiekosten. Hieronder vindt u een korte beslishulp, mijn aanpak en voorbeelden in beeld.
Linux is van nature veiliger dan Windows. Minder virussen, geen gedwongen updates en volledige controle over uw systeem.
-Geen licentiekosten, geen abonnementen. Linux en alle software zijn gratis en open source.
-Uw computer van 10 jaar oud? Linux maakt hem weer snel! Geen nieuwe hardware nodig.
-Stop e-waste! Door Linux te gebruiken houdt u uw apparaten langer werkend en uit de afvalberg.
-Geen tracking en geen verborgen gegevensverzameling. Uw privacy blijft van uzelf.
-Linux gebruikt minder systeembronnen, waardoor uw computer sneller opstart en soepeler werkt.
-Linux is van nature veiliger dan Windows. Minder virussen, geen gedwongen updates en volledige controle over uw systeem.
+ + +Geen licentiekosten, geen abonnementen. Linux en alle software zijn gratis en open source.
+ + +Uw computer van 10 jaar oud? Linux maakt hem weer snel! Geen nieuwe hardware nodig.
+ + +Stop e-waste! Door Linux te gebruiken houdt u uw apparaten langer werkend en uit de afvalberg.
+ + +Geen tracking en geen verborgen gegevensverzameling. Uw privacy blijft van uzelf.
+ + +Linux gebruikt minder systeembronnen, waardoor uw computer sneller opstart en soepeler werkt.
+ +Zie hoe Linux eruitziet en werkt in de praktijk
+Ziet er vertrouwd uit, werkt snel en stabiel. Ideaal voor dagelijks gebruik.
+Duizenden gratis programma’s met één klik via Softwarebeheer.
+Prima geschikt voor gaming dankzij moderne drivers en optimalisaties.
+