From 186f1213a685b9f164c9dbcea0ebaf4d27172934 Mon Sep 17 00:00:00 2001
From: Marvin Blum
Date: Sun, 21 Jun 2020 16:01:42 +0200
Subject: [PATCH 01/13] Added experimental version of pirsch for server side
tracking.
---
Dockerfile | 2 ++
dev.sh | 9 +++++++
docker-compose.yml | 4 +++
go.mod | 2 ++
go.sum | 4 +++
main.go | 51 ++++++++++++++++++++++++++++++++-----
postgres/clear_logs.sh | 4 +++
postgres/docker-compose.yml | 22 ++++++++++++++++
postgres/gen_cert.sh | 10 ++++++++
tpl/template.go | 5 +++-
10 files changed, 106 insertions(+), 7 deletions(-)
create mode 100644 postgres/clear_logs.sh
create mode 100644 postgres/docker-compose.yml
create mode 100755 postgres/gen_cert.sh
diff --git a/Dockerfile b/Dockerfile
index 4d5de08..b86e0ac 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -20,6 +20,8 @@ WORKDIR /app
ENV MB_LOGLEVEL=info
ENV MB_ALLOWED_ORIGINS=*
ENV MB_HOST=0.0.0.0:80
+ENV MB_DB_PORT=5432
+ENV MB_DB_SSLMODE=disable
EXPOSE 80
EXPOSE 443
diff --git a/dev.sh b/dev.sh
index e86e4e6..8b6e51f 100755
--- a/dev.sh
+++ b/dev.sh
@@ -10,5 +10,14 @@ export MB_HOT_RELOAD=true
export MB_EMVI_CLIENT_ID=3fBBn144yvSF9R3dPC8l
export MB_EMVI_CLIENT_SECRET=dw3FeshelTgdf1Gj13J7uF5FfdPDi40sQvvwqeFVKTTyIDuCdlAHhRY72csFL6yg
export MB_EMVI_ORGA=marvin
+export MB_DB_HOST=localhost
+export MB_DB_PORT=5432
+export MB_DB_USER=postgres
+export MB_DB_PASSWORD=postgres
+export MB_DB_SCHEMA=marvinblum
+export MB_DB_SSLMODE=disable
+export MB_DB_SSLCERT=
+export MB_DB_SSLKEY=
+export MB_DB_SSLROOTCERT=
go run main.go
diff --git a/docker-compose.yml b/docker-compose.yml
index cc4ccb7..373f795 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -34,6 +34,10 @@ services:
- MB_EMVI_CLIENT_ID="3fBBn144yvSF9R3dPC8l"
- MB_EMVI_CLIENT_SECRET="dw3FeshelTgdf1Gj13J7uF5FfdPDi40sQvvwqeFVKTTyIDuCdlAHhRY72csFL6yg"
- MB_EMVI_ORGA=marvin
+ - MB_DB_HOST=postgres
+ - MB_DB_USER=
+ - MB_DB_PASSWORD=
+ - MB_DB_SCHEMA=
labels:
- "traefik.enable=true"
- "traefik.http.routers.marvinblum.entrypoints=web"
diff --git a/go.mod b/go.mod
index 5fdb28f..5d20415 100644
--- a/go.mod
+++ b/go.mod
@@ -7,7 +7,9 @@ require (
github.com/caddyserver/certmagic v0.10.13
github.com/emvi/api-go v0.0.0-20191210194347-0a945446f6a8
github.com/emvi/logbuch v0.0.0-20200214115750-61de9b6d5934
+ github.com/emvi/pirsch v0.0.0-20200621133222-e65f2459e5a3
github.com/gorilla/mux v1.7.4
github.com/gosimple/slug v1.9.0
+ github.com/lib/pq v1.7.0 // indirect
github.com/rs/cors v1.7.0
)
diff --git a/go.sum b/go.sum
index 6e5c114..855cf81 100644
--- a/go.sum
+++ b/go.sum
@@ -77,6 +77,8 @@ github.com/emvi/api-go v0.0.0-20191210194347-0a945446f6a8 h1:DZJfRdvwlybLvHkyeN8
github.com/emvi/api-go v0.0.0-20191210194347-0a945446f6a8/go.mod h1:g9RdDC3s5ebCknAHQQ5PjoM2vRFSyyGoOUX3QkDKU+o=
github.com/emvi/logbuch v0.0.0-20200214115750-61de9b6d5934 h1:+G10WRp72llJuaW89QezNK8QU9SsOmd5Ja7ocrrUaI0=
github.com/emvi/logbuch v0.0.0-20200214115750-61de9b6d5934/go.mod h1:J2Wgbr3BuSc1JO+D2MBVh6q3WPVSK5GzktwWz8pvkKw=
+github.com/emvi/pirsch v0.0.0-20200621133222-e65f2459e5a3 h1:Du+BjUUrCH7XptKBgsyTeLCPFOuYNArPfja53XFwzl4=
+github.com/emvi/pirsch v0.0.0-20200621133222-e65f2459e5a3/go.mod h1:+YmBbltJ3feZz9L/QQyqwywltYvQKBfzrGD51TPKl5g=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/exoscale/egoscale v0.18.1/go.mod h1:Z7OOdzzTOz1Q1PjQXumlz9Wn/CddH0zSYdCF3rnBKXE=
@@ -169,6 +171,8 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/labbsr0x/bindman-dns-webhook v1.0.2/go.mod h1:p6b+VCXIR8NYKpDr8/dg1HKfQoRHCdcsROXKvmoehKA=
github.com/labbsr0x/goh v1.0.1/go.mod h1:8K2UhVoaWXcCU7Lxoa2omWnC8gyW8px7/lmO61c027w=
+github.com/lib/pq v1.7.0 h1:h93mCPfUSkaul3Ka/VG8uZdmW1uMHDGxzu0NWHuJmHY=
+github.com/lib/pq v1.7.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/linode/linodego v0.10.0/go.mod h1:cziNP7pbvE3mXIPneHj0oRY8L1WtGEIKlZ8LANE4eXA=
github.com/liquidweb/liquidweb-go v1.6.0/go.mod h1:UDcVnAMDkZxpw4Y7NOHkqoeiGacVLEIG/i5J9cyixzQ=
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
diff --git a/main.go b/main.go
index 7e9d4ed..38c16d0 100644
--- a/main.go
+++ b/main.go
@@ -1,29 +1,36 @@
package main
import (
+ "database/sql"
+ "fmt"
"github.com/Kugelschieber/marvinblum.de/blog"
"github.com/Kugelschieber/marvinblum.de/tpl"
"github.com/NYTimes/gziphandler"
"github.com/caddyserver/certmagic"
emvi "github.com/emvi/api-go"
"github.com/emvi/logbuch"
+ "github.com/emvi/pirsch"
"github.com/gorilla/mux"
+ _ "github.com/lib/pq"
"github.com/rs/cors"
"html/template"
"net/http"
"os"
+ "strconv"
"strings"
"time"
)
const (
- staticDir = "static"
- staticDirPrefix = "/static/"
- logTimeFormat = "2006-01-02_15:04:05"
- envPrefix = "MB_"
+ staticDir = "static"
+ staticDirPrefix = "/static/"
+ logTimeFormat = "2006-01-02_15:04:05"
+ envPrefix = "MB_"
+ connectionString = `host=%s port=%s user=%s password=%s dbname=%s sslmode=%s sslcert=%s sslkey=%s sslrootcert=%s connectTimeout=%s timezone=%s`
)
var (
+ tracker *pirsch.Tracker
blogInstance *blog.Blog
)
@@ -50,8 +57,37 @@ func logEnvConfig() {
}
}
+func setupTracker() {
+ logbuch.Info("Connecting to database...")
+ host := os.Getenv("MB_DB_HOST")
+ port := os.Getenv("MB_DB_PORT")
+ user := os.Getenv("MB_DB_USER")
+ password := os.Getenv("MB_DB_PASSWORD")
+ schema := os.Getenv("MB_DB_SCHEMA")
+ sslMode := os.Getenv("MB_DB_SSLMODE")
+ sslCert := os.Getenv("MB_DB_SSLCERT")
+ sslKey := os.Getenv("MB_DB_SSLKEY")
+ sslRootCert := os.Getenv("MB_DB_SSLROOTCERT")
+ zone, offset := time.Now().Zone()
+ timezone := zone + strconv.Itoa(-offset/3600)
+ logbuch.Info("Setting time zone", logbuch.Fields{"timezone": timezone})
+ connectionStr := fmt.Sprintf(connectionString, host, port, user, password, schema, sslMode, sslCert, sslKey, sslRootCert, "30", timezone)
+ db, err := sql.Open("postgres", connectionStr)
+
+ if err != nil {
+ logbuch.Fatal("Error connecting to database", logbuch.Fields{"err": err})
+ }
+
+ if err := db.Ping(); err != nil {
+ logbuch.Fatal("Error pinging database", logbuch.Fields{"err": err})
+ }
+
+ tracker = pirsch.NewTracker(pirsch.NewPostgresStore(db))
+}
+
func serveAbout() http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
+ tracker.Hit(r)
data := struct {
Articles []emvi.Article
}{
@@ -67,6 +103,7 @@ func serveAbout() http.HandlerFunc {
func serveBlogPage() http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
+ tracker.Hit(r)
data := struct {
Articles map[int][]emvi.Article
}{
@@ -82,6 +119,7 @@ func serveBlogPage() http.HandlerFunc {
func serveBlogArticle() http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
+ tracker.Hit(r)
vars := mux.Vars(r)
slug := strings.Split(vars["slug"], "-")
@@ -119,9 +157,9 @@ func setupRouter() *mux.Router {
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", tpl.ServeTemplate("legal.html"))
+ router.Handle("/legal", tpl.ServeTemplate("legal.html", tracker))
router.Handle("/", serveAbout())
- router.NotFoundHandler = tpl.ServeTemplate("notfound.html")
+ router.NotFoundHandler = tpl.ServeTemplate("notfound.html", tracker)
return router
}
@@ -162,6 +200,7 @@ func main() {
configureLog()
logEnvConfig()
tpl.LoadTemplate()
+ setupTracker()
blogInstance = blog.NewBlog()
router := setupRouter()
corsConfig := configureCors(router)
diff --git a/postgres/clear_logs.sh b/postgres/clear_logs.sh
new file mode 100644
index 0000000..08ea2b0
--- /dev/null
+++ b/postgres/clear_logs.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+
+echo "Clearing docker logs..."
+echo "" > $(docker inspect --format='{{.LogPath}}' postgres)
diff --git a/postgres/docker-compose.yml b/postgres/docker-compose.yml
new file mode 100644
index 0000000..44ab03c
--- /dev/null
+++ b/postgres/docker-compose.yml
@@ -0,0 +1,22 @@
+version: "3"
+
+services:
+ postgres:
+ image: postgres:12-alpine
+ container_name: postgres
+ restart: always
+ command: -c ssl=on -c ssl_cert_file=/var/lib/postgresql/server.crt -c ssl_key_file=/var/lib/postgresql/server.key
+ networks:
+ - db-internal
+ environment:
+ POSTGRES_PASSWORD: #
+ ports:
+ - "5432:5432"
+ volumes:
+ - /root/postgres/data:/var/lib/postgresql/data
+ - /root/postgres/cert/server.crt:/var/lib/postgresql/server.crt
+ - /root/postgres/cert/server.key:/var/lib/postgresql/server.key
+
+networks:
+ db-internal:
+ driver: bridge
diff --git a/postgres/gen_cert.sh b/postgres/gen_cert.sh
new file mode 100755
index 0000000..7a75bb4
--- /dev/null
+++ b/postgres/gen_cert.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+mkdir cert
+cd cert
+openssl req -new -text -passout pass:$1 -subj /CN=localhost -out server.req -keyout privkey.pem
+openssl rsa -in privkey.pem -passin pass:$1 -out server.key
+openssl req -x509 -in server.req -text -key server.key -out server.crt
+chown 0:70 server.key
+chmod 640 server.key
+echo "done"
diff --git a/tpl/template.go b/tpl/template.go
index ecea8dc..226bce8 100644
--- a/tpl/template.go
+++ b/tpl/template.go
@@ -3,6 +3,7 @@ package tpl
import (
"bytes"
"github.com/emvi/logbuch"
+ "github.com/emvi/pirsch"
"github.com/gosimple/slug"
"html/template"
"net/http"
@@ -55,11 +56,13 @@ func Get() *template.Template {
return tpl
}
-func ServeTemplate(name string) http.HandlerFunc {
+func ServeTemplate(name string, tracker *pirsch.Tracker) http.HandlerFunc {
// render once so we have it in cache
renderTemplate(name)
return func(w http.ResponseWriter, r *http.Request) {
+ tracker.Hit(r)
+
if hotReload {
LoadTemplate()
renderTemplate(name)
From 4d45b2aee35329428120243f3937c23897a2ddba Mon Sep 17 00:00:00 2001
From: Marvin Blum
Date: Sun, 21 Jun 2020 16:45:08 +0200
Subject: [PATCH 02/13] Changed port in Dockerfile, updated traefik
configuration.
---
Dockerfile | 5 ++---
docker-compose.yml | 22 ++++++++++++++++++++--
2 files changed, 22 insertions(+), 5 deletions(-)
diff --git a/Dockerfile b/Dockerfile
index b86e0ac..5dcfde5 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -19,10 +19,9 @@ WORKDIR /app
# default config
ENV MB_LOGLEVEL=info
ENV MB_ALLOWED_ORIGINS=*
-ENV MB_HOST=0.0.0.0:80
+ENV MB_HOST=0.0.0.0:8888
ENV MB_DB_PORT=5432
ENV MB_DB_SSLMODE=disable
-EXPOSE 80
-EXPOSE 443
+EXPOSE 8888
CMD ["/app/main"]
diff --git a/docker-compose.yml b/docker-compose.yml
index 373f795..19bdfad 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -5,11 +5,14 @@ services:
image: "traefik:v2.2"
container_name: traefik
restart: always
+ networks:
+ - traefik-internal
command:
# - "--log.level=DEBUG"
# - "--api.insecure=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"
@@ -24,15 +27,23 @@ services:
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- /root/marvinblum/letsencrypt:/letsencrypt
+ # labels:
+ # - "traefik.enable=true"
+ # - "traefik.port=8080"
+ # - "traefik.http.routers.traefik.entrypoints=web"
+ # - "traefik.http.routers.traefik.service=api@internal"
marvinblum:
image: kugel/marvinblum
container_name: marvinblum
restart: always
depends_on:
- traefik
+ networks:
+ - postgres_db-internal
+ - traefik-internal
environment:
- - MB_EMVI_CLIENT_ID="3fBBn144yvSF9R3dPC8l"
- - MB_EMVI_CLIENT_SECRET="dw3FeshelTgdf1Gj13J7uF5FfdPDi40sQvvwqeFVKTTyIDuCdlAHhRY72csFL6yg"
+ - MB_EMVI_CLIENT_ID=3fBBn144yvSF9R3dPC8l
+ - MB_EMVI_CLIENT_SECRET=dw3FeshelTgdf1Gj13J7uF5FfdPDi40sQvvwqeFVKTTyIDuCdlAHhRY72csFL6yg
- MB_EMVI_ORGA=marvin
- MB_DB_HOST=postgres
- MB_DB_USER=
@@ -40,6 +51,7 @@ services:
- MB_DB_SCHEMA=
labels:
- "traefik.enable=true"
+ - "traefik.port=8888"
- "traefik.http.routers.marvinblum.entrypoints=web"
- "traefik.http.routers.marvinblum.rule=Host(`marvinblum.de`)"
- "traefik.http.routers.marvinblum.middlewares=http-redirect"
@@ -48,3 +60,9 @@ services:
- "traefik.http.routers.marvinblum-secure.tls.certresolver=tls-resolver"
- "traefik.http.middlewares.http-redirect.redirectscheme.scheme=https"
- "traefik.http.middlewares.http-redirect.redirectscheme.permanent=true"
+
+networks:
+ traefik-internal:
+ driver: bridge
+ postgres_db-internal:
+ external: true
From ac368102d7b2748c82618c7a2177d5a1059b63f8 Mon Sep 17 00:00:00 2001
From: Marvin Blum
Date: Sun, 21 Jun 2020 16:45:55 +0200
Subject: [PATCH 03/13] Postgres env config...
---
postgres/docker-compose.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/postgres/docker-compose.yml b/postgres/docker-compose.yml
index 44ab03c..c6b965b 100644
--- a/postgres/docker-compose.yml
+++ b/postgres/docker-compose.yml
@@ -9,7 +9,7 @@ services:
networks:
- db-internal
environment:
- POSTGRES_PASSWORD: #
+ - POSTGRES_PASSWORD=
ports:
- "5432:5432"
volumes:
From 38bfac3a8afe9dda97057b236ace105606141d9f Mon Sep 17 00:00:00 2001
From: Marvin Blum
Date: Sun, 21 Jun 2020 16:50:56 +0200
Subject: [PATCH 04/13] Changed docker-compose env format.
---
docker-compose.yml | 14 +++++++-------
postgres/docker-compose.yml | 2 +-
2 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/docker-compose.yml b/docker-compose.yml
index 19bdfad..8562a1a 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -42,13 +42,13 @@ services:
- postgres_db-internal
- traefik-internal
environment:
- - MB_EMVI_CLIENT_ID=3fBBn144yvSF9R3dPC8l
- - MB_EMVI_CLIENT_SECRET=dw3FeshelTgdf1Gj13J7uF5FfdPDi40sQvvwqeFVKTTyIDuCdlAHhRY72csFL6yg
- - MB_EMVI_ORGA=marvin
- - MB_DB_HOST=postgres
- - MB_DB_USER=
- - MB_DB_PASSWORD=
- - MB_DB_SCHEMA=
+ MB_EMVI_CLIENT_ID: 3fBBn144yvSF9R3dPC8l
+ MB_EMVI_CLIENT_SECRET: dw3FeshelTgdf1Gj13J7uF5FfdPDi40sQvvwqeFVKTTyIDuCdlAHhRY72csFL6yg
+ MB_EMVI_ORGA: marvin
+ MB_DB_HOST: postgres
+ MB_DB_USER:
+ MB_DB_PASSWORD:
+ MB_DB_SCHEMA:
labels:
- "traefik.enable=true"
- "traefik.port=8888"
diff --git a/postgres/docker-compose.yml b/postgres/docker-compose.yml
index c6b965b..2f3f5fc 100644
--- a/postgres/docker-compose.yml
+++ b/postgres/docker-compose.yml
@@ -9,7 +9,7 @@ services:
networks:
- db-internal
environment:
- - POSTGRES_PASSWORD=
+ POSTGRES_PASSWORD:
ports:
- "5432:5432"
volumes:
From 619924b4ec2587e153993bcba1274b007cf7ea2c Mon Sep 17 00:00:00 2001
From: Marvin Blum
Date: Sun, 21 Jun 2020 23:18:52 +0200
Subject: [PATCH 05/13] Improved page rendering and caching and disabled
tracking for not found handler.
---
blog/blog.go | 11 +++++--
main.go | 45 +++++++++++++------------
tpl/template.go | 87 ++++++++++++++++++++++++++-----------------------
3 files changed, 78 insertions(+), 65 deletions(-)
diff --git a/blog/blog.go b/blog/blog.go
index 7c47e38..8e2a71b 100644
--- a/blog/blog.go
+++ b/blog/blog.go
@@ -2,6 +2,7 @@ package blog
import (
"fmt"
+ "github.com/Kugelschieber/marvinblum.de/tpl"
emvi "github.com/emvi/api-go"
"github.com/emvi/logbuch"
"io/ioutil"
@@ -9,6 +10,7 @@ import (
"os"
"path/filepath"
"regexp"
+ "sync"
"time"
)
@@ -29,11 +31,13 @@ type Blog struct {
articles map[string]emvi.Article // id -> article
articlesYear map[int][]emvi.Article // year -> articles
nextUpdate time.Time
+ cache *tpl.Cache
+ m sync.Mutex
}
-func NewBlog() *Blog {
+func NewBlog(cache *tpl.Cache) *Blog {
logbuch.Info("Initializing blog")
- b := new(Blog)
+ b := &Blog{cache: cache}
b.client = emvi.NewClient(os.Getenv("MB_EMVI_CLIENT_ID"),
os.Getenv("MB_EMVI_CLIENT_SECRET"),
os.Getenv("MB_EMVI_ORGA"),
@@ -76,6 +80,8 @@ func (blog *Blog) GetLatestArticles() []emvi.Article {
}
func (blog *Blog) loadArticles() {
+ blog.m.Lock()
+ defer blog.m.Unlock()
logbuch.Info("Refreshing blog articles...")
articles, offset, count := make(map[string]emvi.Article), 0, 1
var err error
@@ -188,6 +194,7 @@ func (blog *Blog) setArticles(articles map[string]emvi.Article) {
func (blog *Blog) refreshIfRequired() {
if blog.nextUpdate.Before(time.Now()) {
+ blog.cache.Clear()
blog.loadArticles()
}
}
diff --git a/main.go b/main.go
index 38c16d0..5fb6ba7 100644
--- a/main.go
+++ b/main.go
@@ -31,6 +31,7 @@ const (
var (
tracker *pirsch.Tracker
+ tplCache *tpl.Cache
blogInstance *blog.Blog
)
@@ -88,32 +89,29 @@ func setupTracker() {
func serveAbout() http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
tracker.Hit(r)
- data := struct {
+ tplCache.Render(w, "about.html", struct {
Articles []emvi.Article
}{
blogInstance.GetLatestArticles(),
- }
+ })
+ }
+}
- if err := tpl.Get().ExecuteTemplate(w, "about.html", data); err != nil {
- logbuch.Error("Error executing blog template", logbuch.Fields{"err": err})
- w.WriteHeader(http.StatusInternalServerError)
- }
+func serveLegal() http.HandlerFunc {
+ return func(w http.ResponseWriter, r *http.Request) {
+ tracker.Hit(r)
+ tplCache.Render(w, "legal.html", nil)
}
}
func serveBlogPage() http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
tracker.Hit(r)
- data := struct {
+ tplCache.Render(w, "blog.html", struct {
Articles map[int][]emvi.Article
}{
blogInstance.GetArticles(),
- }
-
- if err := tpl.Get().ExecuteTemplate(w, "blog.html", data); err != nil {
- logbuch.Error("Error executing blog template", logbuch.Fields{"err": err})
- w.WriteHeader(http.StatusInternalServerError)
- }
+ })
}
}
@@ -135,7 +133,7 @@ func serveBlogArticle() http.HandlerFunc {
return
}
- data := struct {
+ tplCache.Render(w, "article.html", struct {
Title string
Content template.HTML
Published time.Time
@@ -143,12 +141,13 @@ func serveBlogArticle() http.HandlerFunc {
article.LatestArticleContent.Title,
template.HTML(article.LatestArticleContent.Content),
article.Published,
- }
+ })
+ }
+}
- if err := tpl.Get().ExecuteTemplate(w, "article.html", data); err != nil {
- logbuch.Error("Error executing blog article template", logbuch.Fields{"err": err})
- w.WriteHeader(http.StatusInternalServerError)
- }
+func serveNotFound() http.HandlerFunc {
+ return func(w http.ResponseWriter, r *http.Request) {
+ tplCache.Render(w, "notfound.html", nil)
}
}
@@ -157,9 +156,9 @@ func setupRouter() *mux.Router {
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", tpl.ServeTemplate("legal.html", tracker))
+ router.Handle("/legal", serveLegal())
router.Handle("/", serveAbout())
- router.NotFoundHandler = tpl.ServeTemplate("notfound.html", tracker)
+ router.NotFoundHandler = serveNotFound()
return router
}
@@ -199,9 +198,9 @@ func start(handler http.Handler) {
func main() {
configureLog()
logEnvConfig()
- tpl.LoadTemplate()
setupTracker()
- blogInstance = blog.NewBlog()
+ tplCache = tpl.NewCache()
+ blogInstance = blog.NewBlog(tplCache)
router := setupRouter()
corsConfig := configureCors(router)
start(corsConfig)
diff --git a/tpl/template.go b/tpl/template.go
index 226bce8..c13e53a 100644
--- a/tpl/template.go
+++ b/tpl/template.go
@@ -3,11 +3,11 @@ package tpl
import (
"bytes"
"github.com/emvi/logbuch"
- "github.com/emvi/pirsch"
"github.com/gosimple/slug"
"html/template"
"net/http"
"os"
+ "sync"
"time"
)
@@ -15,61 +15,68 @@ const (
templateDir = "template/*"
)
-var (
+type Cache struct {
tpl *template.Template
- tplCache = make(map[string][]byte)
+ cache map[string][]byte
hotReload bool
-)
-
-var funcMap = template.FuncMap{
- "slug": slug.Make,
- "format": func(t time.Time, layout string) string {
- return t.Format(layout)
- },
+ m sync.RWMutex
}
-func LoadTemplate() {
+func NewCache() *Cache {
+ cache := &Cache{
+ cache: make(map[string][]byte),
+ hotReload: os.Getenv("MB_HOT_RELOAD") == "true",
+ }
+ cache.load()
+ return cache
+}
+
+func (cache *Cache) load() {
logbuch.Debug("Loading templates")
+ funcMap := template.FuncMap{
+ "slug": slug.Make,
+ "format": func(t time.Time, layout string) string {
+ return t.Format(layout)
+ },
+ }
var err error
- tpl, err = template.New("").Funcs(funcMap).ParseGlob(templateDir)
+ cache.tpl, err = template.New("").Funcs(funcMap).ParseGlob(templateDir)
if err != nil {
logbuch.Fatal("Error loading template", logbuch.Fields{"err": err})
}
- hotReload = os.Getenv("MB_HOT_RELOAD") == "true"
- logbuch.Debug("Templates loaded", logbuch.Fields{"hot_reload": hotReload})
+ logbuch.Debug("Templates loaded", logbuch.Fields{"hot_reload": cache.hotReload})
}
-func renderTemplate(name string) {
- logbuch.Debug("Rendering template", logbuch.Fields{"name": name})
- var buffer bytes.Buffer
+func (cache *Cache) Render(w http.ResponseWriter, name string, data interface{}) {
+ cache.m.RLock()
- if err := tpl.ExecuteTemplate(&buffer, name, nil); err != nil {
- logbuch.Fatal("Error executing template", logbuch.Fields{"err": err, "name": name})
- }
+ if cache.cache[name] == nil || cache.hotReload {
+ cache.m.RUnlock()
+ cache.m.Lock()
+ defer cache.m.Unlock()
+ logbuch.Debug("Rendering template", logbuch.Fields{"name": name})
+ var buffer bytes.Buffer
- tplCache[name] = buffer.Bytes()
-}
-
-func Get() *template.Template {
- return tpl
-}
-
-func ServeTemplate(name string, tracker *pirsch.Tracker) http.HandlerFunc {
- // render once so we have it in cache
- renderTemplate(name)
-
- return func(w http.ResponseWriter, r *http.Request) {
- tracker.Hit(r)
-
- if hotReload {
- LoadTemplate()
- renderTemplate(name)
+ if err := cache.tpl.ExecuteTemplate(&buffer, name, data); err != nil {
+ logbuch.Error("Error executing template", logbuch.Fields{"err": err, "name": name})
+ w.WriteHeader(http.StatusInternalServerError)
}
- if _, err := w.Write(tplCache[name]); err != nil {
- logbuch.Error("Error returning page to client", logbuch.Fields{"err": err, "name": name})
- }
+ cache.cache[name] = buffer.Bytes()
+ } else {
+ cache.m.RUnlock()
+ }
+
+ if _, err := w.Write(cache.cache[name]); err != nil {
+ logbuch.Error("Error sending response to client", logbuch.Fields{"err": err, "template": name})
+ w.WriteHeader(http.StatusInternalServerError)
}
}
+
+func (cache *Cache) Clear() {
+ cache.m.Lock()
+ defer cache.m.Unlock()
+ cache.cache = make(map[string][]byte)
+}
From d66babd7cff786cb66eb31e240887ec149ddd997 Mon Sep 17 00:00:00 2001
From: Marvin Blum
Date: Mon, 22 Jun 2020 15:46:43 +0200
Subject: [PATCH 06/13] Updated pirsch.
---
go.mod | 14 +++++++++++---
go.sum | 21 +++++++++++++++++++++
main.go | 2 +-
3 files changed, 33 insertions(+), 4 deletions(-)
diff --git a/go.mod b/go.mod
index 5d20415..f289e69 100644
--- a/go.mod
+++ b/go.mod
@@ -4,12 +4,20 @@ go 1.14
require (
github.com/NYTimes/gziphandler v1.1.1
- github.com/caddyserver/certmagic v0.10.13
+ github.com/caddyserver/certmagic v0.11.2
+ github.com/cenkalti/backoff/v4 v4.0.2 // indirect
github.com/emvi/api-go v0.0.0-20191210194347-0a945446f6a8
github.com/emvi/logbuch v0.0.0-20200214115750-61de9b6d5934
- github.com/emvi/pirsch v0.0.0-20200621133222-e65f2459e5a3
+ github.com/emvi/pirsch v0.0.0-20200622133635-64ba650609a3
github.com/gorilla/mux v1.7.4
github.com/gosimple/slug v1.9.0
- github.com/lib/pq v1.7.0 // indirect
+ github.com/klauspost/cpuid v1.3.0 // indirect
+ github.com/lib/pq v1.7.0
+ github.com/miekg/dns v1.1.29 // indirect
github.com/rs/cors v1.7.0
+ golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9 // indirect
+ golang.org/x/net v0.0.0-20200602114024-627f9648deb9 // indirect
+ golang.org/x/sys v0.0.0-20200620081246-981b61492c35 // indirect
+ golang.org/x/text v0.3.3 // indirect
+ gopkg.in/square/go-jose.v2 v2.5.1 // indirect
)
diff --git a/go.sum b/go.sum
index 855cf81..fd8ddca 100644
--- a/go.sum
+++ b/go.sum
@@ -53,8 +53,12 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/caddyserver/certmagic v0.10.13 h1:wfyYpXVXSSYMS1ZFpSr7HptwsC+j7elda5PUERrHtRc=
github.com/caddyserver/certmagic v0.10.13/go.mod h1:Yz6cSRUdddGy6Ut5JfrvcqBwrm1BqXxJRqJq2TwjPnA=
+github.com/caddyserver/certmagic v0.11.2 h1:nPBqyuFNHJEf2FwC1ixJjArtTKWyPqpaH6k4jl7gxYI=
+github.com/caddyserver/certmagic v0.11.2/go.mod h1:fqY1IZk5iqhsj5FU3Vw20Sjq66tEKaanTFYNZ74soMY=
github.com/cenkalti/backoff/v4 v4.0.0 h1:6VeaLF9aI+MAUQ95106HwWzYZgJJpZ4stumjj6RFYAU=
github.com/cenkalti/backoff/v4 v4.0.0/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8Bog/87DQnVg=
+github.com/cenkalti/backoff/v4 v4.0.2 h1:JIufpQLbh4DkbQoii76ItQIUFzevQSqOLZca4eamEDs=
+github.com/cenkalti/backoff/v4 v4.0.2/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8Bog/87DQnVg=
github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
@@ -79,6 +83,8 @@ github.com/emvi/logbuch v0.0.0-20200214115750-61de9b6d5934 h1:+G10WRp72llJuaW89Q
github.com/emvi/logbuch v0.0.0-20200214115750-61de9b6d5934/go.mod h1:J2Wgbr3BuSc1JO+D2MBVh6q3WPVSK5GzktwWz8pvkKw=
github.com/emvi/pirsch v0.0.0-20200621133222-e65f2459e5a3 h1:Du+BjUUrCH7XptKBgsyTeLCPFOuYNArPfja53XFwzl4=
github.com/emvi/pirsch v0.0.0-20200621133222-e65f2459e5a3/go.mod h1:+YmBbltJ3feZz9L/QQyqwywltYvQKBfzrGD51TPKl5g=
+github.com/emvi/pirsch v0.0.0-20200622133635-64ba650609a3 h1:hrABK1QPR52kqoUpSR7/0Oa/oKk39Swc1KBg6I70WHw=
+github.com/emvi/pirsch v0.0.0-20200622133635-64ba650609a3/go.mod h1:+YmBbltJ3feZz9L/QQyqwywltYvQKBfzrGD51TPKl5g=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/exoscale/egoscale v0.18.1/go.mod h1:Z7OOdzzTOz1Q1PjQXumlz9Wn/CddH0zSYdCF3rnBKXE=
@@ -162,6 +168,8 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/klauspost/cpuid v1.2.3 h1:CCtW0xUnWGVINKvE/WWOYKdsPV6mawAtvQuSl8guwQs=
github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
+github.com/klauspost/cpuid v1.3.0 h1:2JqaNE1hGdABW2YbA3TenkO7RiPFRvSWnEnGqWh9sHE=
+github.com/klauspost/cpuid v1.3.0/go.mod h1:bYW4mA6ZgKPob1/Dlai2LviZJO7KGI3uoWLd42rAQw4=
github.com/kolo/xmlrpc v0.0.0-20190717152603-07c4ee3fd181/go.mod h1:o03bZfuBwAXHetKXuInt4S7omeXUu62/A845kiycsSQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
@@ -182,6 +190,8 @@ github.com/mattn/go-tty v0.0.0-20180219170247-931426f7535a/go.mod h1:XPvLUNfbS4f
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/miekg/dns v1.1.27 h1:aEH/kqUzUxGJ/UHcEKdJY+ugH6WEzsEBBSPa8zuy1aM=
github.com/miekg/dns v1.1.27/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
+github.com/miekg/dns v1.1.29 h1:xHBEhR+t5RzcFJjBLJlax2daXOrTYtr9z4WdKEfWFzg=
+github.com/miekg/dns v1.1.29/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/go-vnc v0.0.0-20150629162542-723ed9867aed/go.mod h1:3rdaFaCv4AyBgu5ALFM0+tSuHrBh6v692nyQe3ikrq0=
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
@@ -272,6 +282,8 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073 h1:xMPOj6Pz6UipU1wXLkrtqpHbR0AVFnyPEQq/wRWz9lM=
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9 h1:vEg9joUBmeBcK9iSJftGNf3coIG4HqZElCPehJsfAYM=
+golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -327,6 +339,8 @@ golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLL
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200301022130-244492dfa37a h1:GuSPYbZzB5/dcLNCwLQLsg3obCJtX9IJhpXkvY7kzk0=
golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200602114024-627f9648deb9 h1:pNX+40auqi2JqRfOP1akLGtYcn15TUbkhwuCO3foqqM=
+golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -368,11 +382,16 @@ golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527 h1:uYVVQ9WP/Ds2ROhcaGPeIdVq0RIXVLwsHlnvJ+cT1So=
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200620081246-981b61492c35 h1:wb/9mP8eUAmHfkM8RmpeLq6nUA7c2i5+bQOtcDftjaE=
+golang.org/x/sys v0.0.0-20200620081246-981b61492c35/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190921001708-c4c64cad1fd0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -469,6 +488,8 @@ gopkg.in/resty.v1 v1.9.1/go.mod h1:vo52Hzryw9PnPHcJfPsBiFW62XhNx5OczbV9y+IMpgc=
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
gopkg.in/square/go-jose.v2 v2.3.1 h1:SK5KegNXmKmqE342YYN2qPHEnUYeoMiXXl1poUlI+o4=
gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
+gopkg.in/square/go-jose.v2 v2.5.1 h1:7odma5RETjNHWJnR32wx8t+Io4djHE1PqxCFx3iiZ2w=
+gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
diff --git a/main.go b/main.go
index 5fb6ba7..562bf69 100644
--- a/main.go
+++ b/main.go
@@ -83,7 +83,7 @@ func setupTracker() {
logbuch.Fatal("Error pinging database", logbuch.Fields{"err": err})
}
- tracker = pirsch.NewTracker(pirsch.NewPostgresStore(db))
+ tracker = pirsch.NewTracker(pirsch.NewPostgresStore(db), nil)
}
func serveAbout() http.HandlerFunc {
From 188d8a3d4065c21b38e3cec1e370400c302fc964 Mon Sep 17 00:00:00 2001
From: Marvin Blum
Date: Mon, 22 Jun 2020 15:57:54 +0200
Subject: [PATCH 07/13] Fixed pirsch version.
---
go.mod | 20 ++++++--------------
go.sum | 23 ++---------------------
2 files changed, 8 insertions(+), 35 deletions(-)
diff --git a/go.mod b/go.mod
index f289e69..62d2ece 100644
--- a/go.mod
+++ b/go.mod
@@ -3,21 +3,13 @@ module github.com/Kugelschieber/marvinblum.de
go 1.14
require (
- github.com/NYTimes/gziphandler v1.1.1
- github.com/caddyserver/certmagic v0.11.2
- github.com/cenkalti/backoff/v4 v4.0.2 // indirect
+ github.com/NYTimes/gziphandler v1.1.1 // indirect
+ github.com/caddyserver/certmagic v0.11.2 // indirect
github.com/emvi/api-go v0.0.0-20191210194347-0a945446f6a8
github.com/emvi/logbuch v0.0.0-20200214115750-61de9b6d5934
- github.com/emvi/pirsch v0.0.0-20200622133635-64ba650609a3
- github.com/gorilla/mux v1.7.4
+ github.com/emvi/pirsch v0.0.0-20200622134545-a195c9efe6b2 // indirect
+ github.com/gorilla/mux v1.7.4 // indirect
github.com/gosimple/slug v1.9.0
- github.com/klauspost/cpuid v1.3.0 // indirect
- github.com/lib/pq v1.7.0
- github.com/miekg/dns v1.1.29 // indirect
- github.com/rs/cors v1.7.0
- golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9 // indirect
- golang.org/x/net v0.0.0-20200602114024-627f9648deb9 // indirect
- golang.org/x/sys v0.0.0-20200620081246-981b61492c35 // indirect
- golang.org/x/text v0.3.3 // indirect
- gopkg.in/square/go-jose.v2 v2.5.1 // indirect
+ github.com/lib/pq v1.7.0 // indirect
+ github.com/rs/cors v1.7.0 // indirect
)
diff --git a/go.sum b/go.sum
index fd8ddca..9c60c12 100644
--- a/go.sum
+++ b/go.sum
@@ -51,14 +51,10 @@ github.com/aws/aws-sdk-go v1.30.20/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZve
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
-github.com/caddyserver/certmagic v0.10.13 h1:wfyYpXVXSSYMS1ZFpSr7HptwsC+j7elda5PUERrHtRc=
-github.com/caddyserver/certmagic v0.10.13/go.mod h1:Yz6cSRUdddGy6Ut5JfrvcqBwrm1BqXxJRqJq2TwjPnA=
github.com/caddyserver/certmagic v0.11.2 h1:nPBqyuFNHJEf2FwC1ixJjArtTKWyPqpaH6k4jl7gxYI=
github.com/caddyserver/certmagic v0.11.2/go.mod h1:fqY1IZk5iqhsj5FU3Vw20Sjq66tEKaanTFYNZ74soMY=
github.com/cenkalti/backoff/v4 v4.0.0 h1:6VeaLF9aI+MAUQ95106HwWzYZgJJpZ4stumjj6RFYAU=
github.com/cenkalti/backoff/v4 v4.0.0/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8Bog/87DQnVg=
-github.com/cenkalti/backoff/v4 v4.0.2 h1:JIufpQLbh4DkbQoii76ItQIUFzevQSqOLZca4eamEDs=
-github.com/cenkalti/backoff/v4 v4.0.2/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8Bog/87DQnVg=
github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
@@ -81,10 +77,10 @@ github.com/emvi/api-go v0.0.0-20191210194347-0a945446f6a8 h1:DZJfRdvwlybLvHkyeN8
github.com/emvi/api-go v0.0.0-20191210194347-0a945446f6a8/go.mod h1:g9RdDC3s5ebCknAHQQ5PjoM2vRFSyyGoOUX3QkDKU+o=
github.com/emvi/logbuch v0.0.0-20200214115750-61de9b6d5934 h1:+G10WRp72llJuaW89QezNK8QU9SsOmd5Ja7ocrrUaI0=
github.com/emvi/logbuch v0.0.0-20200214115750-61de9b6d5934/go.mod h1:J2Wgbr3BuSc1JO+D2MBVh6q3WPVSK5GzktwWz8pvkKw=
-github.com/emvi/pirsch v0.0.0-20200621133222-e65f2459e5a3 h1:Du+BjUUrCH7XptKBgsyTeLCPFOuYNArPfja53XFwzl4=
-github.com/emvi/pirsch v0.0.0-20200621133222-e65f2459e5a3/go.mod h1:+YmBbltJ3feZz9L/QQyqwywltYvQKBfzrGD51TPKl5g=
github.com/emvi/pirsch v0.0.0-20200622133635-64ba650609a3 h1:hrABK1QPR52kqoUpSR7/0Oa/oKk39Swc1KBg6I70WHw=
github.com/emvi/pirsch v0.0.0-20200622133635-64ba650609a3/go.mod h1:+YmBbltJ3feZz9L/QQyqwywltYvQKBfzrGD51TPKl5g=
+github.com/emvi/pirsch v0.0.0-20200622134545-a195c9efe6b2 h1:YYyV0ECyRDibtua7F8his3QlAnxc+e60Bp6JGA9gsjM=
+github.com/emvi/pirsch v0.0.0-20200622134545-a195c9efe6b2/go.mod h1:+YmBbltJ3feZz9L/QQyqwywltYvQKBfzrGD51TPKl5g=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/exoscale/egoscale v0.18.1/go.mod h1:Z7OOdzzTOz1Q1PjQXumlz9Wn/CddH0zSYdCF3rnBKXE=
@@ -168,8 +164,6 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/klauspost/cpuid v1.2.3 h1:CCtW0xUnWGVINKvE/WWOYKdsPV6mawAtvQuSl8guwQs=
github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
-github.com/klauspost/cpuid v1.3.0 h1:2JqaNE1hGdABW2YbA3TenkO7RiPFRvSWnEnGqWh9sHE=
-github.com/klauspost/cpuid v1.3.0/go.mod h1:bYW4mA6ZgKPob1/Dlai2LviZJO7KGI3uoWLd42rAQw4=
github.com/kolo/xmlrpc v0.0.0-20190717152603-07c4ee3fd181/go.mod h1:o03bZfuBwAXHetKXuInt4S7omeXUu62/A845kiycsSQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
@@ -190,8 +184,6 @@ github.com/mattn/go-tty v0.0.0-20180219170247-931426f7535a/go.mod h1:XPvLUNfbS4f
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/miekg/dns v1.1.27 h1:aEH/kqUzUxGJ/UHcEKdJY+ugH6WEzsEBBSPa8zuy1aM=
github.com/miekg/dns v1.1.27/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
-github.com/miekg/dns v1.1.29 h1:xHBEhR+t5RzcFJjBLJlax2daXOrTYtr9z4WdKEfWFzg=
-github.com/miekg/dns v1.1.29/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/go-vnc v0.0.0-20150629162542-723ed9867aed/go.mod h1:3rdaFaCv4AyBgu5ALFM0+tSuHrBh6v692nyQe3ikrq0=
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
@@ -282,8 +274,6 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073 h1:xMPOj6Pz6UipU1wXLkrtqpHbR0AVFnyPEQq/wRWz9lM=
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9 h1:vEg9joUBmeBcK9iSJftGNf3coIG4HqZElCPehJsfAYM=
-golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -339,8 +329,6 @@ golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLL
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200301022130-244492dfa37a h1:GuSPYbZzB5/dcLNCwLQLsg3obCJtX9IJhpXkvY7kzk0=
golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200602114024-627f9648deb9 h1:pNX+40auqi2JqRfOP1akLGtYcn15TUbkhwuCO3foqqM=
-golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -382,16 +370,11 @@ golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527 h1:uYVVQ9WP/Ds2ROhcaGPeIdVq0RIXVLwsHlnvJ+cT1So=
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200620081246-981b61492c35 h1:wb/9mP8eUAmHfkM8RmpeLq6nUA7c2i5+bQOtcDftjaE=
-golang.org/x/sys v0.0.0-20200620081246-981b61492c35/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
-golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
-golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190921001708-c4c64cad1fd0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -488,8 +471,6 @@ gopkg.in/resty.v1 v1.9.1/go.mod h1:vo52Hzryw9PnPHcJfPsBiFW62XhNx5OczbV9y+IMpgc=
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
gopkg.in/square/go-jose.v2 v2.3.1 h1:SK5KegNXmKmqE342YYN2qPHEnUYeoMiXXl1poUlI+o4=
gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
-gopkg.in/square/go-jose.v2 v2.5.1 h1:7odma5RETjNHWJnR32wx8t+Io4djHE1PqxCFx3iiZ2w=
-gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
From 3322651bc0324e0d01a9dc229b6d0c6ed117e42d Mon Sep 17 00:00:00 2001
From: Marvin Blum
Date: Tue, 23 Jun 2020 21:37:49 +0200
Subject: [PATCH 08/13] Updated pirsch to support processing tracking data.
---
go.sum | 39 +++++++++++++++++++++++++++++++++------
main.go | 21 ++++++++++++++++++++-
2 files changed, 53 insertions(+), 7 deletions(-)
diff --git a/go.sum b/go.sum
index 9c60c12..c65b544 100644
--- a/go.sum
+++ b/go.sum
@@ -55,6 +55,8 @@ github.com/caddyserver/certmagic v0.11.2 h1:nPBqyuFNHJEf2FwC1ixJjArtTKWyPqpaH6k4
github.com/caddyserver/certmagic v0.11.2/go.mod h1:fqY1IZk5iqhsj5FU3Vw20Sjq66tEKaanTFYNZ74soMY=
github.com/cenkalti/backoff/v4 v4.0.0 h1:6VeaLF9aI+MAUQ95106HwWzYZgJJpZ4stumjj6RFYAU=
github.com/cenkalti/backoff/v4 v4.0.0/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8Bog/87DQnVg=
+github.com/cenkalti/backoff/v4 v4.0.2 h1:JIufpQLbh4DkbQoii76ItQIUFzevQSqOLZca4eamEDs=
+github.com/cenkalti/backoff/v4 v4.0.2/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8Bog/87DQnVg=
github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
@@ -75,12 +77,16 @@ github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1
github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
github.com/emvi/api-go v0.0.0-20191210194347-0a945446f6a8 h1:DZJfRdvwlybLvHkyeN8HRU4QnBFqVZg21ki4to1AVPo=
github.com/emvi/api-go v0.0.0-20191210194347-0a945446f6a8/go.mod h1:g9RdDC3s5ebCknAHQQ5PjoM2vRFSyyGoOUX3QkDKU+o=
-github.com/emvi/logbuch v0.0.0-20200214115750-61de9b6d5934 h1:+G10WRp72llJuaW89QezNK8QU9SsOmd5Ja7ocrrUaI0=
-github.com/emvi/logbuch v0.0.0-20200214115750-61de9b6d5934/go.mod h1:J2Wgbr3BuSc1JO+D2MBVh6q3WPVSK5GzktwWz8pvkKw=
-github.com/emvi/pirsch v0.0.0-20200622133635-64ba650609a3 h1:hrABK1QPR52kqoUpSR7/0Oa/oKk39Swc1KBg6I70WHw=
-github.com/emvi/pirsch v0.0.0-20200622133635-64ba650609a3/go.mod h1:+YmBbltJ3feZz9L/QQyqwywltYvQKBfzrGD51TPKl5g=
-github.com/emvi/pirsch v0.0.0-20200622134545-a195c9efe6b2 h1:YYyV0ECyRDibtua7F8his3QlAnxc+e60Bp6JGA9gsjM=
-github.com/emvi/pirsch v0.0.0-20200622134545-a195c9efe6b2/go.mod h1:+YmBbltJ3feZz9L/QQyqwywltYvQKBfzrGD51TPKl5g=
+github.com/emvi/logbuch v1.1.1 h1:poBGNbHy/nB95oNoqLKAaJoBrcKxTO0W9DhMijKEkkU=
+github.com/emvi/logbuch v1.1.1/go.mod h1:J2Wgbr3BuSc1JO+D2MBVh6q3WPVSK5GzktwWz8pvkKw=
+github.com/emvi/pirsch v0.0.0-20200623183712-76dda933f960 h1:7q8uRCOILenzPP7au4BsylEvkJeIkqJcKN5z/49Wpm8=
+github.com/emvi/pirsch v0.0.0-20200623183712-76dda933f960/go.mod h1:+YmBbltJ3feZz9L/QQyqwywltYvQKBfzrGD51TPKl5g=
+github.com/emvi/pirsch v0.0.0-20200623190422-b0f4c9980175 h1:rj+o6eyEkYy9bYd/pupAiUnLZxo9U1qRfdHJ9nzQSLY=
+github.com/emvi/pirsch v0.0.0-20200623190422-b0f4c9980175/go.mod h1:+YmBbltJ3feZz9L/QQyqwywltYvQKBfzrGD51TPKl5g=
+github.com/emvi/pirsch v0.0.0-20200623192632-5c5fcd1d78cc h1:G05tiq3JKZwjnPSObRBwypzWplKTUWG2XFWhgFnqD/g=
+github.com/emvi/pirsch v0.0.0-20200623192632-5c5fcd1d78cc/go.mod h1:+YmBbltJ3feZz9L/QQyqwywltYvQKBfzrGD51TPKl5g=
+github.com/emvi/pirsch v0.0.0-20200623193552-b3a3d4a6434d h1:+HRIYgA9AaXlGFQfhXpUShXxJ1knG2stwNIai1M6mzs=
+github.com/emvi/pirsch v0.0.0-20200623193552-b3a3d4a6434d/go.mod h1:+YmBbltJ3feZz9L/QQyqwywltYvQKBfzrGD51TPKl5g=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/exoscale/egoscale v0.18.1/go.mod h1:Z7OOdzzTOz1Q1PjQXumlz9Wn/CddH0zSYdCF3rnBKXE=
@@ -97,6 +103,7 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
+github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
@@ -154,6 +161,8 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:
github.com/iij/doapi v0.0.0-20190504054126-0bbf12d6d7df/go.mod h1:QMZY7/J/KSQEhKWFeDesPjMj+wCHReeknARU3wqlyN4=
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik=
+github.com/jmoiron/sqlx v1.2.0 h1:41Ip0zITnmWNR/vHV+S4m+VoUivnWY5E4OJfLZjCJMA=
+github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks=
github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
@@ -164,6 +173,8 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/klauspost/cpuid v1.2.3 h1:CCtW0xUnWGVINKvE/WWOYKdsPV6mawAtvQuSl8guwQs=
github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
+github.com/klauspost/cpuid v1.3.0 h1:2JqaNE1hGdABW2YbA3TenkO7RiPFRvSWnEnGqWh9sHE=
+github.com/klauspost/cpuid v1.3.0/go.mod h1:bYW4mA6ZgKPob1/Dlai2LviZJO7KGI3uoWLd42rAQw4=
github.com/kolo/xmlrpc v0.0.0-20190717152603-07c4ee3fd181/go.mod h1:o03bZfuBwAXHetKXuInt4S7omeXUu62/A845kiycsSQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
@@ -173,6 +184,8 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/labbsr0x/bindman-dns-webhook v1.0.2/go.mod h1:p6b+VCXIR8NYKpDr8/dg1HKfQoRHCdcsROXKvmoehKA=
github.com/labbsr0x/goh v1.0.1/go.mod h1:8K2UhVoaWXcCU7Lxoa2omWnC8gyW8px7/lmO61c027w=
+github.com/lib/pq v1.0.0 h1:X5PMW56eZitiTeO7tKzZxFCSpbFZJtkMMooicw2us9A=
+github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.7.0 h1:h93mCPfUSkaul3Ka/VG8uZdmW1uMHDGxzu0NWHuJmHY=
github.com/lib/pq v1.7.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/linode/linodego v0.10.0/go.mod h1:cziNP7pbvE3mXIPneHj0oRY8L1WtGEIKlZ8LANE4eXA=
@@ -180,10 +193,13 @@ github.com/liquidweb/liquidweb-go v1.6.0/go.mod h1:UDcVnAMDkZxpw4Y7NOHkqoeiGacVL
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
+github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
github.com/mattn/go-tty v0.0.0-20180219170247-931426f7535a/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/miekg/dns v1.1.27 h1:aEH/kqUzUxGJ/UHcEKdJY+ugH6WEzsEBBSPa8zuy1aM=
github.com/miekg/dns v1.1.27/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
+github.com/miekg/dns v1.1.29 h1:xHBEhR+t5RzcFJjBLJlax2daXOrTYtr9z4WdKEfWFzg=
+github.com/miekg/dns v1.1.29/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/go-vnc v0.0.0-20150629162542-723ed9867aed/go.mod h1:3rdaFaCv4AyBgu5ALFM0+tSuHrBh6v692nyQe3ikrq0=
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
@@ -274,6 +290,8 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073 h1:xMPOj6Pz6UipU1wXLkrtqpHbR0AVFnyPEQq/wRWz9lM=
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -329,6 +347,8 @@ golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLL
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200301022130-244492dfa37a h1:GuSPYbZzB5/dcLNCwLQLsg3obCJtX9IJhpXkvY7kzk0=
golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200602114024-627f9648deb9 h1:pNX+40auqi2JqRfOP1akLGtYcn15TUbkhwuCO3foqqM=
+golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -370,11 +390,16 @@ golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527 h1:uYVVQ9WP/Ds2ROhcaGPeIdVq0RIXVLwsHlnvJ+cT1So=
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4 h1:5/PjkGUjvEU5Gl6BxmvKRPpqo2uNMv4rcHBMwzk/st8=
+golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190921001708-c4c64cad1fd0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -471,6 +496,8 @@ gopkg.in/resty.v1 v1.9.1/go.mod h1:vo52Hzryw9PnPHcJfPsBiFW62XhNx5OczbV9y+IMpgc=
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
gopkg.in/square/go-jose.v2 v2.3.1 h1:SK5KegNXmKmqE342YYN2qPHEnUYeoMiXXl1poUlI+o4=
gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
+gopkg.in/square/go-jose.v2 v2.5.1 h1:7odma5RETjNHWJnR32wx8t+Io4djHE1PqxCFx3iiZ2w=
+gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
diff --git a/main.go b/main.go
index 562bf69..01b098f 100644
--- a/main.go
+++ b/main.go
@@ -83,7 +83,26 @@ func setupTracker() {
logbuch.Fatal("Error pinging database", logbuch.Fields{"err": err})
}
- tracker = pirsch.NewTracker(pirsch.NewPostgresStore(db), nil)
+ store := pirsch.NewPostgresStore(db)
+ tracker = pirsch.NewTracker(store, nil)
+ processor := pirsch.NewProcessor(store)
+ processTrackingData(processor)
+ pirsch.RunAtMidnight(func() {
+ processTrackingData(processor)
+ })
+}
+
+func processTrackingData(processor *pirsch.Processor) {
+ logbuch.Info("Processing tracking data...")
+
+ defer func() {
+ if err := recover(); err != nil {
+ logbuch.Error("Error processing tracking data", logbuch.Fields{"err": err})
+ }
+ }()
+
+ processor.Process()
+ logbuch.Info("Done processing tracking data")
}
func serveAbout() http.HandlerFunc {
From 0c92f47e33daf3ad444494415ec791a17e14c0d4 Mon Sep 17 00:00:00 2001
From: Marvin Blum
Date: Tue, 23 Jun 2020 21:39:16 +0200
Subject: [PATCH 09/13] ...
---
go.mod | 23 ++++++++++++++++-------
1 file changed, 16 insertions(+), 7 deletions(-)
diff --git a/go.mod b/go.mod
index 62d2ece..bd54f87 100644
--- a/go.mod
+++ b/go.mod
@@ -3,13 +3,22 @@ module github.com/Kugelschieber/marvinblum.de
go 1.14
require (
- github.com/NYTimes/gziphandler v1.1.1 // indirect
- github.com/caddyserver/certmagic v0.11.2 // indirect
+ github.com/NYTimes/gziphandler v1.1.1
+ github.com/caddyserver/certmagic v0.11.2
+ github.com/cenkalti/backoff/v4 v4.0.2 // indirect
github.com/emvi/api-go v0.0.0-20191210194347-0a945446f6a8
- github.com/emvi/logbuch v0.0.0-20200214115750-61de9b6d5934
- github.com/emvi/pirsch v0.0.0-20200622134545-a195c9efe6b2 // indirect
- github.com/gorilla/mux v1.7.4 // indirect
+ github.com/emvi/logbuch v1.1.1
+ github.com/emvi/pirsch v0.0.0-20200623193552-b3a3d4a6434d
+ github.com/gorilla/mux v1.7.4
github.com/gosimple/slug v1.9.0
- github.com/lib/pq v1.7.0 // indirect
- github.com/rs/cors v1.7.0 // indirect
+ github.com/jmoiron/sqlx v1.2.0 // indirect
+ github.com/klauspost/cpuid v1.3.0 // indirect
+ github.com/lib/pq v1.7.0
+ github.com/miekg/dns v1.1.29 // indirect
+ github.com/rs/cors v1.7.0
+ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 // indirect
+ golang.org/x/net v0.0.0-20200602114024-627f9648deb9 // indirect
+ golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4 // indirect
+ golang.org/x/text v0.3.3 // indirect
+ gopkg.in/square/go-jose.v2 v2.5.1 // indirect
)
From 4515f3d165ca6835634d410123adc732340131c1 Mon Sep 17 00:00:00 2001
From: Marvin Blum
Date: Wed, 24 Jun 2020 14:51:19 +0200
Subject: [PATCH 10/13] Small refactoring and improved legal page and more
whitespace.
---
go.mod | 2 +-
go.sum | 2 ++
main.go | 62 ++++-------------------------------------
template/about.html | 13 +++++----
template/blog.html | 12 +++++---
template/end.html | 4 +--
template/legal.html | 9 ++++++
tracking/tracking.go | 66 ++++++++++++++++++++++++++++++++++++++++++++
8 files changed, 102 insertions(+), 68 deletions(-)
create mode 100644 tracking/tracking.go
diff --git a/go.mod b/go.mod
index bd54f87..ec32a51 100644
--- a/go.mod
+++ b/go.mod
@@ -8,7 +8,7 @@ require (
github.com/cenkalti/backoff/v4 v4.0.2 // indirect
github.com/emvi/api-go v0.0.0-20191210194347-0a945446f6a8
github.com/emvi/logbuch v1.1.1
- github.com/emvi/pirsch v0.0.0-20200623193552-b3a3d4a6434d
+ github.com/emvi/pirsch v0.0.0-20200624123353-86381b017755
github.com/gorilla/mux v1.7.4
github.com/gosimple/slug v1.9.0
github.com/jmoiron/sqlx v1.2.0 // indirect
diff --git a/go.sum b/go.sum
index c65b544..8a46cdd 100644
--- a/go.sum
+++ b/go.sum
@@ -87,6 +87,8 @@ github.com/emvi/pirsch v0.0.0-20200623192632-5c5fcd1d78cc h1:G05tiq3JKZwjnPSObRB
github.com/emvi/pirsch v0.0.0-20200623192632-5c5fcd1d78cc/go.mod h1:+YmBbltJ3feZz9L/QQyqwywltYvQKBfzrGD51TPKl5g=
github.com/emvi/pirsch v0.0.0-20200623193552-b3a3d4a6434d h1:+HRIYgA9AaXlGFQfhXpUShXxJ1knG2stwNIai1M6mzs=
github.com/emvi/pirsch v0.0.0-20200623193552-b3a3d4a6434d/go.mod h1:+YmBbltJ3feZz9L/QQyqwywltYvQKBfzrGD51TPKl5g=
+github.com/emvi/pirsch v0.0.0-20200624123353-86381b017755 h1:TdiDC7+IfV6giMtFNvbYKFlSPJJZewr9jfh3KGcr8QQ=
+github.com/emvi/pirsch v0.0.0-20200624123353-86381b017755/go.mod h1:+YmBbltJ3feZz9L/QQyqwywltYvQKBfzrGD51TPKl5g=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/exoscale/egoscale v0.18.1/go.mod h1:Z7OOdzzTOz1Q1PjQXumlz9Wn/CddH0zSYdCF3rnBKXE=
diff --git a/main.go b/main.go
index 01b098f..075584d 100644
--- a/main.go
+++ b/main.go
@@ -1,10 +1,9 @@
package main
import (
- "database/sql"
- "fmt"
"github.com/Kugelschieber/marvinblum.de/blog"
"github.com/Kugelschieber/marvinblum.de/tpl"
+ "github.com/Kugelschieber/marvinblum.de/tracking"
"github.com/NYTimes/gziphandler"
"github.com/caddyserver/certmagic"
emvi "github.com/emvi/api-go"
@@ -16,17 +15,15 @@ import (
"html/template"
"net/http"
"os"
- "strconv"
"strings"
"time"
)
const (
- staticDir = "static"
- staticDirPrefix = "/static/"
- logTimeFormat = "2006-01-02_15:04:05"
- envPrefix = "MB_"
- connectionString = `host=%s port=%s user=%s password=%s dbname=%s sslmode=%s sslcert=%s sslkey=%s sslrootcert=%s connectTimeout=%s timezone=%s`
+ staticDir = "static"
+ staticDirPrefix = "/static/"
+ logTimeFormat = "2006-01-02_15:04:05"
+ envPrefix = "MB_"
)
var (
@@ -58,53 +55,6 @@ func logEnvConfig() {
}
}
-func setupTracker() {
- logbuch.Info("Connecting to database...")
- host := os.Getenv("MB_DB_HOST")
- port := os.Getenv("MB_DB_PORT")
- user := os.Getenv("MB_DB_USER")
- password := os.Getenv("MB_DB_PASSWORD")
- schema := os.Getenv("MB_DB_SCHEMA")
- sslMode := os.Getenv("MB_DB_SSLMODE")
- sslCert := os.Getenv("MB_DB_SSLCERT")
- sslKey := os.Getenv("MB_DB_SSLKEY")
- sslRootCert := os.Getenv("MB_DB_SSLROOTCERT")
- zone, offset := time.Now().Zone()
- timezone := zone + strconv.Itoa(-offset/3600)
- logbuch.Info("Setting time zone", logbuch.Fields{"timezone": timezone})
- connectionStr := fmt.Sprintf(connectionString, host, port, user, password, schema, sslMode, sslCert, sslKey, sslRootCert, "30", timezone)
- db, err := sql.Open("postgres", connectionStr)
-
- if err != nil {
- logbuch.Fatal("Error connecting to database", logbuch.Fields{"err": err})
- }
-
- if err := db.Ping(); err != nil {
- logbuch.Fatal("Error pinging database", logbuch.Fields{"err": err})
- }
-
- store := pirsch.NewPostgresStore(db)
- tracker = pirsch.NewTracker(store, nil)
- processor := pirsch.NewProcessor(store)
- processTrackingData(processor)
- pirsch.RunAtMidnight(func() {
- processTrackingData(processor)
- })
-}
-
-func processTrackingData(processor *pirsch.Processor) {
- logbuch.Info("Processing tracking data...")
-
- defer func() {
- if err := recover(); err != nil {
- logbuch.Error("Error processing tracking data", logbuch.Fields{"err": err})
- }
- }()
-
- processor.Process()
- logbuch.Info("Done processing tracking data")
-}
-
func serveAbout() http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
tracker.Hit(r)
@@ -217,7 +167,7 @@ func start(handler http.Handler) {
func main() {
configureLog()
logEnvConfig()
- setupTracker()
+ tracker = tracking.NewTracker()
tplCache = tpl.NewCache()
blogInstance = blog.NewBlog(tplCache)
router := setupRouter()
diff --git a/template/about.html b/template/about.html
index 42cce9e..d28c66b 100644
--- a/template/about.html
+++ b/template/about.html
@@ -11,14 +11,14 @@
{{template "menu.html"}}
- who am I?
+ Who Am I?
I'm a full stack software engineer from Germany, open source and Linux enthusiast and co-founder of Emvi.
In love with Go, but fluent in a lot of programming languages.
- projects
+ Projects
-
Emvi a note taking, collaboration and knowledge management tool for personal use and teams of any size
+ -
+ pirsch a server side, no-cookie and privacy focused tracking library for Golang
+
-
logbuch a simple Golang logging library
@@ -52,7 +55,7 @@
- skills
+ Skills
- Go (Golang)
- JavaScript (Vue, Node)
@@ -66,7 +69,7 @@
- work
+ Work
-
Emvi co-founder of a note taking, collaboration and knowledge management SaaS startup
diff --git a/template/blog.html b/template/blog.html
index 1550da0..e04a0c1 100644
--- a/template/blog.html
+++ b/template/blog.html
@@ -3,7 +3,9 @@
Blog
- {{range $year, $articles := .Articles}}
+
+{{range $year, $articles := .Articles}}
+
{{$year}}
{{range $article := $articles}}
@@ -12,9 +14,11 @@
{{format $article.Published "2. January 2006"}}
{{end}}
- {{else}}
+
+{{else}}
+
There are no blog posts yet...
- {{end}}
-
+
+{{end}}
{{template "end.html"}}
diff --git a/template/end.html b/template/end.html
index 4636f0a..6e357f9 100644
--- a/template/end.html
+++ b/template/end.html
@@ -1,13 +1,13 @@
- Like to see more? Read my blog articles on Emvi, my project page on GitHub or send me a mail.
+ Would you like to see more? Read my blog articles on Emvi, my project page on GitHub or send me a mail.
This page uses concrete for styling. Check it out!
- Legal
+ This page does not use Cookies. Legal