module main import vweb import db.sqlite import time import os import log struct App { vweb.Context config Config [vweb_global] mut: logger log.Logger [vweb_global] is_admin bool pub mut: db sqlite.DB } fn main() { config := load_config() or { panic('Could not load config file: ${err.str()}') } mut logger := &log.Log{ level: log.level_from_tag(config.loglevel.to_upper()) or { log.Level.info } output_target: log.LogTarget.console } log.set_logger(logger) if !os.exists(config.db_path) { logger.info('Creating database file at ' + config.db_path) mut file := os.create(config.db_path) or { logger.fatal(err.str()) } file.close() } db := sqlite.connect(config.db_path) or { logger.fatal('Database error! ${err.str()}') } mut app := &App{ config: config logger: logger db: db } app.create_tables() or { logger.fatal('Could not create database tables! ${err.str()}') } mut host := '0.0.0.0' if config.host.len != 0 { host = config.host } // Handle graceful shutdown for Docker os.signal_opt(os.Signal.int, app.shutdown) or { logger.fatal(err.str()) } os.signal_opt(os.Signal.term, app.shutdown) or { logger.fatal(err.str()) } vweb.run_at(app, vweb.RunParams{ host: host port: config.port family: .ip }) or { logger.fatal(err.str()) } } fn (mut app App) shutdown(sig os.Signal) { app.db.close() or { app.logger.fatal(err.str()) } app.logger.info('Shut down database gracefully') app.logger.info('Exiting...') time.sleep(1e+9) // Sleep one second exit(0) }