diff --git a/main.go b/main.go
index fedb3d87042a393b6c5fc77cf9e52f0949e014dc..dd0f50bf9d368ae97e9df8d826293dcfb38439ad 100644
--- a/main.go
+++ b/main.go
@@ -5,6 +5,7 @@ import (
 	"embed"
 	"errors"
 	"flag"
+	"fmt"
 	"net/http"
 	"os"
 	"time"
@@ -88,37 +89,19 @@ func wrapMiddleware(hdlr http.Handler, sessions session.Provider, logger kitlog.
 	return log.Request(auth.Require(hdlr, authFailed, sessions), logger)
 }
 
-func main() {
-	dbPath := flag.String("db", "vino.sqlite", "Path to database file")
-	dumpPath := flag.String("dump", "dumped", "Path to dump of old database")
-	listenAddr := flag.String("listen", "127.0.0.1:7878", "Listening address")
-	debug := flag.Bool("debug", false, "Enable debug logging")
-
-	flag.Parse()
-
+func setupLogger(debug bool) kitlog.Logger {
 	logger := kitlog.NewLogfmtLogger(kitlog.NewSyncWriter(os.Stdout))
 	logger = kitlog.With(logger, "ts", kitlog.DefaultTimestampUTC)
 
 	filter := level.AllowInfo()
-	if *debug {
+	if debug {
 		filter = level.AllowDebug()
 	}
 
-	logger = level.NewFilter(logger, filter)
-
-	level.Info(logger).
-		Log("commit", commitHash, "build", buildTime)
-
-	ctx, done := context.WithCancel(context.Background())
-	defer done()
-
-	db, err := storage.Open(ctx, *dbPath, *dumpPath, logger)
-	if err != nil {
-		level.Error(logger).Log("error", err, "msg", "can't open DB")
-		os.Exit(1)
-	}
-	defer db.Close()
+	return level.NewFilter(logger, filter)
+}
 
+func registerHTTPHandlers(ctx context.Context, db query.DBTX, logger kitlog.Logger) error {
 	logged404 := log.Request(http.HandlerFunc(http.NotFound), kitlog.With(logger, "code", 404))
 
 	http.Handle("/favicon.ico", logged404)
@@ -128,8 +111,7 @@ func main() {
 
 	sessions, err := session.NewProvider(ctx, query.New(db))
 	if err != nil {
-		level.Error(logger).Log("error", err, "msg", "can't initialize session provider")
-		os.Exit(1)
+		return fmt.Errorf("setting up session provider: %w", err)
 	}
 
 	handler := Handler{
@@ -157,6 +139,37 @@ func main() {
 		index.ServeHTTP(w, r)
 	})
 
+	return nil
+}
+
+func main() {
+	dbPath := flag.String("db", "vino.sqlite", "Path to database file")
+	dumpPath := flag.String("dump", "dumped", "Path to dump of old database")
+	listenAddr := flag.String("listen", "127.0.0.1:7878", "Listening address")
+	debug := flag.Bool("debug", false, "Enable debug logging")
+
+	flag.Parse()
+
+	logger := setupLogger(*debug)
+
+	level.Info(logger).Log("commit", commitHash, "build", buildTime)
+
+	ctx, done := context.WithCancel(context.Background())
+	defer done()
+
+	db, err := storage.Open(ctx, *dbPath, *dumpPath, logger)
+	if err != nil {
+		level.Error(logger).Log("error", err, "msg", "can't open DB")
+		os.Exit(1)
+	}
+	defer db.Close()
+
+	err = registerHTTPHandlers(ctx, db, logger)
+	if err != nil {
+		level.Error(logger).Log("error", err)
+		os.Exit(1)
+	}
+
 	var g run.Group
 
 	g.Add(run.SignalHandler(ctx, os.Interrupt))
@@ -167,21 +180,18 @@ func main() {
 		}
 
 		g.Add(func() error {
-			level.Info(logger).
-				Log("addr", "http://"+*listenAddr, "msg", "starting http server")
+			level.Info(logger).Log("addr", "http://"+*listenAddr, "msg", "starting http server")
 
 			return srv.ListenAndServe()
 		}, func(err error) {
-			level.Info(logger).
-				Log("error", err, "msg", "shutting down HTTP listener")
+			level.Info(logger).Log("error", err, "msg", "shutting down HTTP listener")
 
 			shutdownCtx, done := context.WithTimeout(context.Background(), 15*time.Second)
 			defer done()
 
 			err = srv.Shutdown(shutdownCtx)
 			if err != nil {
-				level.Error(logger).
-					Log("error", err, "msg", "clean shut down failed")
+				level.Error(logger).Log("error", err, "msg", "clean shut down failed")
 			}
 		})
 	}