diff --git a/.gitignore b/.gitignore
index ee0d3d3..e69de29 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +0,0 @@
-.idea/
-static/blog/
-geodb/
diff --git a/Dockerfile b/Dockerfile
deleted file mode 100644
index 9874100..0000000
--- a/Dockerfile
+++ /dev/null
@@ -1,25 +0,0 @@
-FROM golang AS build
-COPY . /go/src/github.com/Kugelschieber/marvinblum
-WORKDIR /go/src/github.com/Kugelschieber/marvinblum
-RUN apt-get update && apt-get upgrade -y
-
-ENV GOPATH=/go
-ENV CGO_ENABLED=0
-RUN go build -ldflags "-s -w" main.go
-
-FROM alpine
-RUN apk update && \
- apk upgrade && \
- apk add --no-cache && \
- apk add ca-certificates && \
- rm -rf /var/cache/apk/*
-COPY --from=build /go/src/github.com/Kugelschieber/marvinblum /app
-WORKDIR /app
-
-# default config
-ENV MB_LOGLEVEL=info
-ENV MB_ALLOWED_ORIGINS=*
-ENV MB_HOST=0.0.0.0:8888
-
-EXPOSE 8888
-CMD ["/app/main"]
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index 18ba6be..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2020 Marvin Blum
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/README.md b/README.md
index cc8a0d6..19dec9f 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,3 @@
# marvinblum.de
-My website.
+My website build using [Oogway](https://github.com/emvi/oogway).
diff --git a/static/avatar.png b/assets/avatar.png
similarity index 100%
rename from static/avatar.png
rename to assets/avatar.png
diff --git a/assets/favicon/android-icon-144x144.png b/assets/favicon/android-icon-144x144.png
new file mode 100644
index 0000000..c81f4c5
Binary files /dev/null and b/assets/favicon/android-icon-144x144.png differ
diff --git a/assets/favicon/android-icon-192x192.png b/assets/favicon/android-icon-192x192.png
new file mode 100644
index 0000000..434a12b
Binary files /dev/null and b/assets/favicon/android-icon-192x192.png differ
diff --git a/assets/favicon/android-icon-36x36.png b/assets/favicon/android-icon-36x36.png
new file mode 100644
index 0000000..43c67e3
Binary files /dev/null and b/assets/favicon/android-icon-36x36.png differ
diff --git a/assets/favicon/android-icon-48x48.png b/assets/favicon/android-icon-48x48.png
new file mode 100644
index 0000000..6ae38c1
Binary files /dev/null and b/assets/favicon/android-icon-48x48.png differ
diff --git a/assets/favicon/android-icon-72x72.png b/assets/favicon/android-icon-72x72.png
new file mode 100644
index 0000000..5727886
Binary files /dev/null and b/assets/favicon/android-icon-72x72.png differ
diff --git a/assets/favicon/android-icon-96x96.png b/assets/favicon/android-icon-96x96.png
new file mode 100644
index 0000000..75cf4d0
Binary files /dev/null and b/assets/favicon/android-icon-96x96.png differ
diff --git a/assets/favicon/apple-icon-114x114.png b/assets/favicon/apple-icon-114x114.png
new file mode 100644
index 0000000..a7767e0
Binary files /dev/null and b/assets/favicon/apple-icon-114x114.png differ
diff --git a/assets/favicon/apple-icon-120x120.png b/assets/favicon/apple-icon-120x120.png
new file mode 100644
index 0000000..3a2e9bb
Binary files /dev/null and b/assets/favicon/apple-icon-120x120.png differ
diff --git a/assets/favicon/apple-icon-144x144.png b/assets/favicon/apple-icon-144x144.png
new file mode 100644
index 0000000..c81f4c5
Binary files /dev/null and b/assets/favicon/apple-icon-144x144.png differ
diff --git a/assets/favicon/apple-icon-152x152.png b/assets/favicon/apple-icon-152x152.png
new file mode 100644
index 0000000..73a281a
Binary files /dev/null and b/assets/favicon/apple-icon-152x152.png differ
diff --git a/assets/favicon/apple-icon-180x180.png b/assets/favicon/apple-icon-180x180.png
new file mode 100644
index 0000000..dd8c226
Binary files /dev/null and b/assets/favicon/apple-icon-180x180.png differ
diff --git a/assets/favicon/apple-icon-57x57.png b/assets/favicon/apple-icon-57x57.png
new file mode 100644
index 0000000..f930c77
Binary files /dev/null and b/assets/favicon/apple-icon-57x57.png differ
diff --git a/assets/favicon/apple-icon-60x60.png b/assets/favicon/apple-icon-60x60.png
new file mode 100644
index 0000000..e4eeb43
Binary files /dev/null and b/assets/favicon/apple-icon-60x60.png differ
diff --git a/assets/favicon/apple-icon-72x72.png b/assets/favicon/apple-icon-72x72.png
new file mode 100644
index 0000000..5727886
Binary files /dev/null and b/assets/favicon/apple-icon-72x72.png differ
diff --git a/assets/favicon/apple-icon-76x76.png b/assets/favicon/apple-icon-76x76.png
new file mode 100644
index 0000000..7eaff45
Binary files /dev/null and b/assets/favicon/apple-icon-76x76.png differ
diff --git a/assets/favicon/apple-icon-precomposed.png b/assets/favicon/apple-icon-precomposed.png
new file mode 100644
index 0000000..527c4c7
Binary files /dev/null and b/assets/favicon/apple-icon-precomposed.png differ
diff --git a/assets/favicon/apple-icon.png b/assets/favicon/apple-icon.png
new file mode 100644
index 0000000..527c4c7
Binary files /dev/null and b/assets/favicon/apple-icon.png differ
diff --git a/assets/favicon/browserconfig.xml b/assets/favicon/browserconfig.xml
new file mode 100644
index 0000000..c554148
--- /dev/null
+++ b/assets/favicon/browserconfig.xml
@@ -0,0 +1,2 @@
+
+
Hi, my name is Marvin. I'm a full-stack software engineer from Germany, open-source and Linux enthusiast, and co-founder of Emvi, where we build and maintain software projects for clients, and work on existing software.
+I’m building Pirsch Analytics — a privacy-friendly, cookie-less web analytics solution made for personal websites, freelancers, and agencies.
+ + +{{partial "end" .}} diff --git a/dev.sh b/dev.sh deleted file mode 100755 index c349c38..0000000 --- a/dev.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -# This file is for local development only! -# It configures and starts the website for local development. -# The "secret" for the Emvi API can be shared, as it gives access to public content only. - -export MB_LOGLEVEL=debug -export MB_ALLOWED_ORIGINS=* -export MB_HOST=localhost:8080 -export MB_HOT_RELOAD=true -export MB_EMVI_CLIENT_ID=3fBBn144yvSF9R3dPC8l -export MB_EMVI_CLIENT_SECRET= -export MB_EMVI_ORGA=marvin -export MB_PIRSCH_CLIENT_ID=gEb3pvgxZvZzFRlOTdMgPtyLvNYgeVKe -export MB_PIRSCH_CLIENT_SECRET=E7UqJehmxgnVuw81oq6ZhJAx9vCHqMimCUFfil7UFgbGhgQVVINqU7JqHBgaUvHg -export MB_PIRSCH_HOSTNAME=marvinblum.de - -go run main.go diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 57a637e..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,75 +0,0 @@ -version: "3" - -services: - traefik: - image: "traefik:v2.3" - container_name: traefik - restart: always - networks: - - traefik-internal - command: - - "--api.dashboard=true" - - "--providers.docker=true" - - "--providers.docker.exposedbydefault=false" - - "--providers.docker.network=marvinblum_traefik-internal" - - "--entrypoints.web.address=:80" - - "--entrypoints.websecure.address=:443" - - "--certificatesresolvers.tls-resolver.acme.httpchallenge=true" - - "--certificatesresolvers.tls-resolver.acme.httpchallenge.entrypoint=web" - - "--certificatesresolvers.tls-resolver.acme.email=marvin@marvinblum.de" - - "--certificatesresolvers.tls-resolver.acme.storage=/letsencrypt/acme.json" - ports: - - "80:80" - - "443:443" - - "8080:8080" - volumes: - - /var/run/docker.sock:/var/run/docker.sock:ro - - /root/marvinblum/letsencrypt:/letsencrypt - labels: - - "traefik.enable=true" - - "traefik.port=9999" - - "traefik.http.routers.traefik.entrypoints=websecure" - - "traefik.http.routers.traefik.rule=Host(`traefik.marvinblum.de`)" - - "traefik.http.routers.traefik.service=api@internal" - - "traefik.http.routers.traefik.tls.certresolver=tls-resolver" - - "traefik.http.routers.traefik.middlewares=traefik-auth" - - "traefik.http.middlewares.traefik-auth.basicauth.users=marvinblum:$$apr1$$u.IJozER$$DoY0zwzgAciDpPs4vZvxY/" - # Global redirection: http to https - - 'traefik.http.routers.http-catchall.rule=HostRegexp(`{host:(www\.)?.+}`)' - - "traefik.http.routers.http-catchall.entrypoints=web" - - "traefik.http.routers.http-catchall.middlewares=wwwtohttps" - # Global redirection: https (www.) to https - - 'traefik.http.routers.wwwsecure-catchall.rule=HostRegexp(`{host:(www\.).+}`)' - - "traefik.http.routers.wwwsecure-catchall.entrypoints=websecure" - - "traefik.http.routers.wwwsecure-catchall.tls=true" - - "traefik.http.routers.wwwsecure-catchall.middlewares=wwwtohttps" - # middleware: http(s)://(www.) to https:// - - 'traefik.http.middlewares.wwwtohttps.redirectregex.regex=^https?://(?:www\.)?(.+)' - - 'traefik.http.middlewares.wwwtohttps.redirectregex.replacement=https://$${1}' - - 'traefik.http.middlewares.wwwtohttps.redirectregex.permanent=true' - marvinblum: - image: kugel/marvinblum - container_name: marvinblum - restart: always - depends_on: - - traefik - networks: - - traefik-internal - env_file: - - secrets.env - environment: - MB_EMVI_CLIENT_ID: 3fBBn144yvSF9R3dPC8l - MB_EMVI_ORGA: marvin - MB_PIRSCH_CLIENT_ID: mkiAzI2ZGjGBv8fpwh1A09fCJ8G1YFgx - MB_PIRSCH_HOSTNAME: marvinblum.de - labels: - - "traefik.enable=true" - - "traefik.port=8888" - - "traefik.http.routers.marvinblum.rule=Host(`marvinblum.de`) || Host(`www.marvinblum.de`)" - - "traefik.http.routers.marvinblum.entrypoints=websecure" - - "traefik.http.routers.marvinblum.tls=true" - - "traefik.http.routers.marvinblum.tls.certresolver=tls-resolver" - -networks: - traefik-internal: - driver: bridge diff --git a/go.mod b/go.mod deleted file mode 100644 index 6940dc7..0000000 --- a/go.mod +++ /dev/null @@ -1,18 +0,0 @@ -module github.com/Kugelschieber/marvinblum - -go 1.15 - -require ( - github.com/NYTimes/gziphandler v1.1.1 - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/emvi/api-go v0.2.2 - github.com/emvi/logbuch v1.1.1 - github.com/gorilla/mux v1.8.0 - github.com/gosimple/slug v1.9.0 - github.com/kr/pretty v0.1.0 // indirect - github.com/lib/pq v1.9.0 - github.com/pirsch-analytics/pirsch-go-sdk v0.0.0-20201215183417-0e2a519a0dd1 - github.com/rs/cors v1.7.0 - github.com/stretchr/testify v1.6.1 // indirect - gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect -) diff --git a/go.sum b/go.sum deleted file mode 100644 index de2773a..0000000 --- a/go.sum +++ /dev/null @@ -1,33 +0,0 @@ -github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/emvi/api-go v0.2.2 h1:NrZNl0o0xAbgfK1dFsRt/BKLesHLVjC4OKXHKTZsIis= -github.com/emvi/api-go v0.2.2/go.mod h1:g9RdDC3s5ebCknAHQQ5PjoM2vRFSyyGoOUX3QkDKU+o= -github.com/emvi/logbuch v1.1.1/go.mod h1:J2Wgbr3BuSc1JO+D2MBVh6q3WPVSK5GzktwWz8pvkKw= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gosimple/slug v1.9.0 h1:r5vDcYrFz9BmfIAMC829un9hq7hKM4cHUrsv36LbEqs= -github.com/gosimple/slug v1.9.0/go.mod h1:AMZ+sOVe65uByN3kgEyf9WEBKBCSS+dJjMX9x4vDJbg= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/lib/pq v1.9.0 h1:L8nSXQQzAYByakOFMTwpjRoHsMJklur4Gi59b6VivR8= -github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/pirsch-analytics/pirsch-go-sdk v0.0.0-20201215183417-0e2a519a0dd1 h1:yn6F902YFyEMfXQIARsTXLW42TQKuH+BrKk0MjQu/ps= -github.com/pirsch-analytics/pirsch-go-sdk v0.0.0-20201215183417-0e2a519a0dd1/go.mod h1:PF2vnJw8FYcXQe6OTPQQcGn8l/agkpl7T4YO9d2aPSE= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rainycape/unidecode v0.0.0-20150907023854-cb7f23ec59be h1:ta7tUOvsPHVHGom5hKW5VXNc2xZIkfCKP8iaqOyYtUQ= -github.com/rainycape/unidecode v0.0.0-20150907023854-cb7f23ec59be/go.mod h1:MIDFMn7db1kT65GmV94GzpX9Qdi7N/pQlwb+AN8wh+Q= -github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/main.go b/main.go deleted file mode 100644 index 0694e58..0000000 --- a/main.go +++ /dev/null @@ -1,201 +0,0 @@ -package main - -import ( - "context" - "github.com/Kugelschieber/marvinblum/blog" - "github.com/Kugelschieber/marvinblum/tpl" - "github.com/NYTimes/gziphandler" - emvi "github.com/emvi/api-go" - "github.com/emvi/logbuch" - "github.com/gorilla/mux" - _ "github.com/lib/pq" - "github.com/pirsch-analytics/pirsch-go-sdk" - "github.com/rs/cors" - "html/template" - "net/http" - "os" - "os/signal" - "strings" - "time" -) - -const ( - staticDir = "static" - staticDirPrefix = "/static/" - logTimeFormat = "2006-01-02_15:04:05" - envPrefix = "MB_" - shutdownTimeout = time.Second * 30 -) - -var ( - client *pirsch.Client - tplCache *tpl.Cache - blogInstance *blog.Blog -) - -func serveAbout() http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - go hit(r) - tplCache.Render(w, "about.html", struct { - Articles []emvi.Article - }{ - blogInstance.GetLatestArticles(), - }) - } -} - -func serveLegal() http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - go hit(r) - tplCache.Render(w, "legal.html", nil) - } -} - -func serveBlogPage() http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - go hit(r) - tplCache.Render(w, "blog.html", struct { - Articles map[int][]emvi.Article - }{ - blogInstance.GetArticles(), - }) - } -} - -func serveBlogArticle() http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - slug := strings.Split(vars["slug"], "-") - - if len(slug) == 0 { - http.Redirect(w, r, "/notfound", http.StatusFound) - return - } - - article := blogInstance.GetArticle(slug[len(slug)-1]) - - if len(article.Id) == 0 { - http.Redirect(w, r, "/notfound", http.StatusFound) - return - } - - // track the hit if the article was found, otherwise we don't care - go hit(r) - - tplCache.RenderWithoutCache(w, "article.html", struct { - Title string - Content template.HTML - Published time.Time - }{ - article.LatestArticleContent.Title, - template.HTML(article.LatestArticleContent.Content), - article.Published, - }) - } -} - -func serveTracking() http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - http.Redirect(w, r, "https://marvinblum.pirsch.io/", http.StatusFound) - } -} - -func serveNotFound() http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - tplCache.Render(w, "notfound.html", nil) - } -} - -func setupRouter() *mux.Router { - router := mux.NewRouter() - router.PathPrefix(staticDirPrefix).Handler(http.StripPrefix(staticDirPrefix, gziphandler.GzipHandler(http.FileServer(http.Dir(staticDir))))) - router.Handle("/blog/{slug}", serveBlogArticle()) - router.Handle("/blog", serveBlogPage()) - router.Handle("/legal", serveLegal()) - router.Handle("/tracking", serveTracking()) - router.Handle("/", serveAbout()) - router.NotFoundHandler = serveNotFound() - return router -} - -func configureLog() { - logbuch.SetFormatter(logbuch.NewFieldFormatter(logTimeFormat, "\t\t")) - logbuch.Info("Configure logging...") - level := strings.ToLower(os.Getenv("MB_LOGLEVEL")) - - if level == "debug" { - logbuch.SetLevel(logbuch.LevelDebug) - } else if level == "info" { - logbuch.SetLevel(logbuch.LevelInfo) - } else { - logbuch.SetLevel(logbuch.LevelWarning) - } -} - -func logEnvConfig() { - for _, e := range os.Environ() { - if strings.HasPrefix(e, envPrefix) { - pair := strings.Split(e, "=") - logbuch.Info(pair[0] + "=" + pair[1]) - } - } -} - -func configureCors(router *mux.Router) http.Handler { - logbuch.Info("Configuring CORS...") - - origins := strings.Split(os.Getenv("MB_ALLOWED_ORIGINS"), ",") - c := cors.New(cors.Options{ - AllowedOrigins: origins, - AllowedMethods: []string{"GET", "POST", "PUT", "DELETE"}, - AllowedHeaders: []string{"*"}, - AllowCredentials: true, - Debug: strings.ToLower(os.Getenv("MB_CORS_LOGLEVEL")) == "debug", - }) - return c.Handler(router) -} - -func start(handler http.Handler) { - logbuch.Info("Starting server...") - var server http.Server - server.Handler = handler - server.Addr = os.Getenv("MB_HOST") - - go func() { - sigint := make(chan os.Signal) - signal.Notify(sigint, os.Interrupt) - <-sigint - logbuch.Info("Shutting down server...") - ctx, _ := context.WithTimeout(context.Background(), shutdownTimeout) - - if err := server.Shutdown(ctx); err != nil { - logbuch.Fatal("Error shutting down server gracefully", logbuch.Fields{"err": err}) - } - }() - - if err := server.ListenAndServe(); err != http.ErrServerClosed { - logbuch.Fatal("Error starting server", logbuch.Fields{"err": err}) - } - - logbuch.Info("Server shut down") -} - -func hit(r *http.Request) { - if err := client.Hit(r); err != nil { - logbuch.Warn("Error sending page hit to pirsch", logbuch.Fields{"err": err}) - } -} - -func main() { - configureLog() - logEnvConfig() - client = pirsch.NewClient(os.Getenv("MB_PIRSCH_CLIENT_ID"), - os.Getenv("MB_PIRSCH_CLIENT_SECRET"), - os.Getenv("MB_PIRSCH_HOSTNAME"), - nil) - tplCache = tpl.NewCache() - blogInstance = blog.NewBlog(tplCache) - router := setupRouter() - corsConfig := configureCors(router) - start(corsConfig) -} diff --git a/partials/end.html b/partials/end.html new file mode 100644 index 0000000..2ab5c0d --- /dev/null +++ b/partials/end.html @@ -0,0 +1,2 @@ +