Refactor config loading and add config from environment

Issue: #1121
This commit is contained in:
eikek
2021-10-24 23:02:39 +02:00
parent 252741dc64
commit 4e5924d796
11 changed files with 339 additions and 110 deletions

View File

@ -8,10 +8,13 @@ package docspell.restserver
import cats.Semigroup
import cats.data.{Validated, ValidatedNec}
import cats.effect.Async
import cats.implicits._
import docspell.backend.signup.{Config => SignupConfig}
import docspell.common.config.Implicits._
import docspell.common.Logger
import docspell.config.ConfigFactory
import docspell.config.Implicits._
import docspell.oidc.{ProviderConfig, SignatureAlgo}
import docspell.restserver.auth.OpenId
@ -21,8 +24,12 @@ import pureconfig.generic.auto._
object ConfigFile {
import Implicits._
def loadConfig: Config =
Validate(ConfigSource.default.at("docspell.server").loadOrThrow[Config])
def loadConfig[F[_]: Async](args: List[String]): F[Config] = {
val logger = Logger.log4s(org.log4s.getLogger)
ConfigFactory
.default[F, Config](logger, "docspell.server")(args)
.map(cfg => Validate(cfg))
}
object Implicits {
implicit val signupModeReader: ConfigReader[SignupConfig.Mode] =

View File

@ -6,46 +6,21 @@
package docspell.restserver
import java.nio.file.{Files, Paths}
import cats.effect._
import cats.implicits._
import docspell.common._
import org.log4s._
import org.log4s.getLogger
object Main extends IOApp {
private[this] val logger = getLogger
private[this] val logger: Logger[IO] = Logger.log4s(getLogger)
val blockingEC =
ThreadFactories.cached[IO](ThreadFactories.ofName("docspell-restserver-blocking"))
val connectEC =
private val connectEC =
ThreadFactories.fixed[IO](5, ThreadFactories.ofName("docspell-dbconnect"))
val restserverEC =
ThreadFactories.workSteal[IO](ThreadFactories.ofNameFJ("docspell-restserver"))
def run(args: List[String]) = {
args match {
case file :: Nil =>
val path = Paths.get(file).toAbsolutePath.normalize
logger.info(s"Using given config file: $path")
System.setProperty("config.file", file)
case _ =>
Option(System.getProperty("config.file")) match {
case Some(f) if f.nonEmpty =>
val path = Paths.get(f).toAbsolutePath.normalize
if (!Files.exists(path)) {
logger.info(s"Not using config file '$f' because it doesn't exist")
System.clearProperty("config.file")
} else
logger.info(s"Using config file from system properties: $f")
case _ =>
}
}
val cfg = ConfigFile.loadConfig
val banner = Banner(
def run(args: List[String]) = for {
cfg <- ConfigFile.loadConfig[IO](args)
banner = Banner(
"REST Server",
BuildInfo.version,
BuildInfo.gitHeadCommit,
@ -55,18 +30,20 @@ object Main extends IOApp {
cfg.baseUrl,
Some(cfg.fullTextSearch.solr.url).filter(_ => cfg.fullTextSearch.enabled)
)
val pools = connectEC.map(Pools.apply)
logger.info(s"\n${banner.render("***>")}")
if (EnvMode.current.isDev) {
logger.warn(">>>>> Docspell is running in DEV mode! <<<<<")
}
_ <- logger.info(s"\n${banner.render("***>")}")
_ <-
if (EnvMode.current.isDev) {
logger.warn(">>>>> Docspell is running in DEV mode! <<<<<")
} else IO(())
pools.use(p =>
RestServer
.stream[IO](cfg, p)
.compile
.drain
.as(ExitCode.Success)
)
}
pools = connectEC.map(Pools.apply)
rc <-
pools.use(p =>
RestServer
.stream[IO](cfg, p)
.compile
.drain
.as(ExitCode.Success)
)
} yield rc
}