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 @@

Neem contact op

-

Heeft u vragen over Linux migratie? Wij helpen u graag verder!

+

Heeft u vragen over Linux‑migratie? Ik help u graag verder!

@@ -99,7 +101,7 @@

Openingstijden

-

Maandag - vrijdag: 09:00 - 17:00 (op afspraak)

+

Maandag – vrijdag: 09:00 – 17:00 (op afspraak)

Weekend: op afspraak

@@ -154,7 +156,7 @@
- +
@@ -167,11 +169,11 @@

Waarom kiezen voor {{.CompanyName}}?

-
+
🎯

Persoonlijke aanpak

-

Elke klant is uniek, en wij bieden maatwerkoplossingen.

+

Elke klant is uniek. Ik lever maatwerkoplossingen.

🛠️
@@ -181,12 +183,12 @@
🤝

Volledige ondersteuning

-

Van installatie tot training, wij begeleiden u door het hele proces.

+

Van installatie tot training: ik begeleid u door het hele proces.

💚

Duurzame keuze

-

Samen bouwen we aan een duurzamere digitale toekomst.

+

U kiest voor een duurzamere digitale toekomst.

diff --git a/templates/diensten.html b/templates/diensten.html index c2dbf31..b260355 100644 --- a/templates/diensten.html +++ b/templates/diensten.html @@ -15,7 +15,7 @@ - + @@ -86,7 +86,7 @@
🧾

Voorbeelden

-

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.

🔁
@@ -99,9 +99,9 @@
-

Belangrijke disclaimer over back-ups

-

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.

+

Belangrijk over back‑ups

+

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 @@

Gemeenschap

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.

Over mij · Contact

diff --git a/templates/index.html b/templates/index.html index fa8538a..5dd6830 100644 --- a/templates/index.html +++ b/templates/index.html @@ -11,14 +11,12 @@ - - - + - + @@ -29,7 +27,7 @@ - + @@ -49,6 +47,8 @@ + + @@ -110,43 +110,7 @@
-
-
-

Waarom Linux kiezen?

- -
-
+ {{template "benefits" .}}
@@ -344,47 +308,7 @@
-
-
-

Linux in actie

-

Zie hoe Linux eruitziet en werkt in de praktijk

- -
-
-
- Zorin OS 17 Desktop Interface -
- Bron: DebugPoint.com -
-
-

Moderne desktopinterface

-

Linux ziet er vertrouwd en professioneel uit. Deze Zorin OS desktop lijkt op Windows maar is veel sneller en veiliger.

-
- -
-
- Linux Mint Software Manager -
- Bron: LinuxMint.com -
-
-

Eenvoudig software installeren

-

Duizenden gratis programma's met één klik installeren via de Software Manager. Net zo makkelijk als een app store.

-
- -
- -

Gamingprestaties

-

Linux kan vaak betere gamingprestaties leveren dan Windows, dankzij minder overhead en optimalisaties voor moderne games.

-
-
-
-
+ {{template "linux_features" .}}
diff --git a/templates/linux.html b/templates/linux.html index 79d472e..f6ee43d 100644 --- a/templates/linux.html +++ b/templates/linux.html @@ -15,7 +15,7 @@ - + @@ -46,47 +46,11 @@

Waarom Linux?

-

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.

-
-
-

Voordelen van Linux

-
-
-
🛡️
-

Veilig en betrouwbaar

-

Linux is van nature veiliger dan Windows. Minder virussen, geen gedwongen updates en volledige controle over uw systeem.

-
-
-
💰
-

Volledig gratis

-

Geen licentiekosten, geen abonnementen. Linux en alle software zijn gratis en open source.

-
-
-
🔄
-

Oude hardware hergebruiken

-

Uw computer van 10 jaar oud? Linux maakt hem weer snel! Geen nieuwe hardware nodig.

-
-
-
🌱
-

Milieuvriendelijk

-

Stop e-waste! Door Linux te gebruiken houdt u uw apparaten langer werkend en uit de afvalberg.

-
-
-
🔒
-

Privacybescherming

-

Geen tracking en geen verborgen gegevensverzameling. Uw privacy blijft van uzelf.

-
-
-
-

Snel en efficiënt

-

Linux gebruikt minder systeembronnen, waardoor uw computer sneller opstart en soepeler werkt.

-
-
-
-
+ {{template "benefits" .}}
diff --git a/templates/partials/benefits.html b/templates/partials/benefits.html new file mode 100644 index 0000000..62637e7 --- /dev/null +++ b/templates/partials/benefits.html @@ -0,0 +1,40 @@ +{{define "benefits"}} +
+ +
+{{end}} + diff --git a/templates/partials/linux_features.html b/templates/partials/linux_features.html new file mode 100644 index 0000000..349ff11 --- /dev/null +++ b/templates/partials/linux_features.html @@ -0,0 +1,41 @@ +{{define "linux_features"}} +
+
+

Linux in actie

+

Zie hoe Linux eruitziet en werkt in de praktijk

+
+
+
+ Zorin OS 17 Desktop +
+ Bron: DebugPoint.com +
+
+

Moderne desktopinterface

+

Ziet er vertrouwd uit, werkt snel en stabiel. Ideaal voor dagelijks gebruik.

+
+
+
+ Linux Mint Softwarebeheer +
+ Bron: LinuxMint.com +
+
+

Eenvoudig software installeren

+

Duizenden gratis programma’s met één klik via Softwarebeheer.

+
+
+ +

Gamingprestaties

+

Prima geschikt voor gaming dankzij moderne drivers en optimalisaties.

+
+
+
+
+{{end}} +