package main import ( "database/sql" _ "embed" "log" "net/http" "os" "os/signal" "syscall" "time" "github.com/gorilla/mux" _ "github.com/mattn/go-sqlite3" ) const ( Addr = "127.0.0.1:8000" ReadTimeout = 15 * time.Second WriteTimeout = 15 * time.Second DatabasePath = "/var/lib/finserv/main.sqlite3" ) //go:embed VERSION.txt var versionTxt string var router *mux.Router = mux.NewRouter() func init() { log.SetFlags(0) } func main() { run( router, Addr, WriteTimeout, ReadTimeout, []syscall.Signal{syscall.SIGTERM, syscall.SIGINT}, DatabasePath, ) } func run( handler http.Handler, addr string, wTimeout time.Duration, rTimeout time.Duration, signals []syscall.Signal, dbPath string, ) { log.Println("finserv finance server was started.") defer log.Println("finserv finance server was stopped.") var err error db, err := sql.Open("sqlite3", dbPath) if err != nil { log.Fatalf("Failed to open SQLite3 database '%s': %v", dbPath, err) } defer db.Close() _, err = db.Exec(`PRAGMA foreign_keys = ON;`) if err != nil { log.Fatalf("Failed to enable foreign key support in database: %v", err) } err = MigrateToLatest(db) if err != nil { log.Fatalf("Failed to migrate SQLite3 database '%s': %v", dbPath, err) } registerHandlers(router, db) server := &http.Server{ Handler: handler, Addr: addr, WriteTimeout: wTimeout, ReadTimeout: rTimeout, } go server.ListenAndServe() log.Printf("Serving at http://%s.\n", Addr) await(signals...) } func await(signals ...syscall.Signal) { listener := make(chan os.Signal, 1) for _, s := range signals { signal.Notify(listener, s) } sig := <-listener log.Printf("Received OS signal '%v'.\n", sig) }