Skip to content

Commit cacb082

Browse files
committed
Move secrets to env (#53)
1 parent f94584f commit cacb082

File tree

14 files changed

+105
-40
lines changed

14 files changed

+105
-40
lines changed

bot/src/main/scala/com/github/mmvpm/bot/Main.scala

+4-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ import com.github.mmvpm.bot.manager.ofs.{OfsManager, OfsManagerImpl}
88
import com.github.mmvpm.bot.model.MessageID
99
import com.github.mmvpm.bot.render.{Renderer, RendererImpl}
1010
import com.github.mmvpm.bot.state.{State, StateManager, StateManagerImpl, StorageImpl}
11-
import com.github.mmvpm.bot.util.ResourceUtils
1211
import com.github.mmvpm.model.Session
12+
import com.github.mmvpm.secret.{SecretService, SecretServiceImpl}
1313
import com.github.mmvpm.util.ConfigUtils.configByStage
1414
import org.asynchttpclient.Dsl.asyncHttpClient
1515
import pureconfig.ConfigSource
@@ -22,7 +22,9 @@ object Main extends IOApp {
2222
for {
2323
random <- Random.scalaUtilRandom[IO]
2424

25-
token = ResourceUtils.readTelegramToken()
25+
secrets: SecretService[IO] = new SecretServiceImpl[IO]
26+
token <- secrets.telegramToken.map(_.get)
27+
2628
config = ConfigSource.resources(configByStage(args)).loadOrThrow[Config]
2729

2830
sttpBackend = AsyncHttpClientCatsBackend.usingClient[IO](asyncHttpClient)

bot/src/main/scala/com/github/mmvpm/bot/util/ResourceUtils.scala

-13
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.github.mmvpm.secret
2+
3+
trait SecretService[F[_]] {
4+
def telegramToken: F[Option[String]]
5+
def redisPassword: F[Option[String]]
6+
def postgresPassword: F[Option[String]]
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.github.mmvpm.secret
2+
3+
import cats.effect.std.Env
4+
import com.github.mmvpm.secret.SecretServiceImpl._
5+
6+
class SecretServiceImpl[F[_]: Env] extends SecretService[F] {
7+
8+
def telegramToken: F[Option[String]] =
9+
Env[F].get(TelegramToken)
10+
11+
def redisPassword: F[Option[String]] =
12+
Env[F].get(RedisPassword)
13+
14+
def postgresPassword: F[Option[String]] =
15+
Env[F].get(PostgresPassword)
16+
}
17+
18+
object SecretServiceImpl {
19+
private val TelegramToken = "TELEGRAM_TOKEN"
20+
private val RedisPassword = "REDIS_PASSWORD"
21+
private val PostgresPassword = "POSTGRES_PASSWORD"
22+
}

parsing/src/main/resources/application.conf

-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
redis {
22
host = "c-c9qhoa8bt19q7df1o5qi.rw.mdb.yandexcloud.net"
33
port = 6379
4-
password = "redis111"
54
}
65

76
ofs {

parsing/src/main/scala/com/github/mmvpm/parsing/Main.scala

+5-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import com.github.mmvpm.parsing.producer.catalog.{CatalogConverter, CatalogConve
1414
import com.github.mmvpm.parsing.producer.query.{QueryGenerator, QueryGeneratorFromSeq}
1515
import com.github.mmvpm.parsing.producer.{PageProducer, PageProducerImpl}
1616
import com.github.mmvpm.parsing.util.ResourcesUtils.unsafeReadLines
17+
import com.github.mmvpm.secret.{SecretService, SecretServiceImpl}
1718
import com.github.mmvpm.util.ConfigUtils.configByStage
1819
import com.github.mmvpm.util.Logging
1920
import net.ruippeixotog.scalascraper.browser._
@@ -33,7 +34,10 @@ object Main extends IOApp with Logging {
3334
for {
3435
random <- Random.scalaUtilRandom[IO]
3536
browser = JsoupBrowser()
36-
redisFactory = new RedisClientFactory(config.redis)
37+
38+
secrets: SecretService[IO] = new SecretServiceImpl[IO]
39+
redisPassword <- secrets.redisPassword
40+
redisFactory = new RedisClientFactory(config.redis.copy(password = redisPassword))
3741

3842
// separate redis client for each dao
3943
pageVisitedDao: PageVisitedDao[IO] = new PageVisitedDaoRedis[IO](redisFactory)

service/src/main/resources/application.conf

-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ server {
66
postgresql {
77
url = "jdbc:postgresql://rc1b-1zlmvzg3tj866pea.mdb.yandexcloud.net:6432/postgres1?targetServerType=master&ssl=true&sslmode=verify-full"
88
user = "postgres1"
9-
password = "postgres1"
109
pool-size = 2
1110
}
1211

@@ -15,5 +14,4 @@ session.expiration = 3 hours
1514
redis {
1615
host = "c-c9qhoa8bt19q7df1o5qi.rw.mdb.yandexcloud.net"
1716
port = 6379
18-
password = "redis111"
1917
}

service/src/main/scala/com/github/mmvpm/service/Main.scala

+11-6
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ import cats.data.EitherT
44
import cats.effect.std.Random
55
import cats.effect.{ExitCode, IO, IOApp}
66
import com.comcast.ip4s.{Host, Port}
7+
import com.github.mmvpm.secret.{SecretService, SecretServiceImpl}
78
import com.github.mmvpm.service.api.{AuthHandler, OfferHandler, UserHandler}
9+
import com.github.mmvpm.service.config.{Config, ConfigLoader}
810
import com.github.mmvpm.service.dao.offer.{OfferDao, OfferDaoPostgresql}
911
import com.github.mmvpm.service.dao.session.{SessionDao, SessionDaoRedis}
1012
import com.github.mmvpm.service.dao.user.{UserDao, UserDaoPostgresql}
@@ -19,24 +21,27 @@ import doobie.Transactor
1921
import org.http4s.HttpRoutes
2022
import org.http4s.ember.server.EmberServerBuilder
2123
import org.http4s.server.Router
22-
import pureconfig.ConfigSource
23-
import pureconfig.generic.auto._
2424
import sttp.tapir.server.ServerEndpoint
2525
import sttp.tapir.server.http4s.Http4sServerInterpreter
2626
import sttp.tapir.swagger.bundle.SwaggerInterpreter
2727

2828
object Main extends IOApp {
2929

3030
override def run(args: List[String]): IO[ExitCode] = {
31-
val config = ConfigSource.resources(configByStage(args)).loadOrThrow[Config]
32-
makeTransactor[IO](config.postgresql).use(runServer(config)(_))
31+
val secrets = new SecretServiceImpl[IO]
32+
val configLoader = ConfigLoader.impl[IO](secrets)
33+
for {
34+
config <- configLoader.load(configByStage(args))
35+
exitCode <- makeTransactor[IO](config.postgresql).use(runServer(config, secrets)(_))
36+
} yield exitCode
3337
}
3438

35-
private def runServer(config: Config)(implicit xa: Transactor[IO]): IO[ExitCode] =
39+
private def runServer(config: Config, secrets: SecretService[IO])(implicit xa: Transactor[IO]): IO[ExitCode] =
3640
for {
3741
random <- Random.scalaUtilRandom[IO]
3842

39-
redis = new RedisClient(config.redis.host, config.redis.port, secret = config.redis.password)
43+
redisPassword <- secrets.redisPassword
44+
redis = new RedisClient(config.redis.host, config.redis.port, secret = redisPassword)
4045

4146
offerDao: OfferDao[IO] = new OfferDaoPostgresql[IO]
4247
sessionDao: SessionDao[IO] = new SessionDaoRedis[IO](redis, config.session.expiration.toSeconds)

service/src/main/scala/com/github/mmvpm/service/Config.scala renamed to service/src/main/scala/com/github/mmvpm/service/config/Config.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
package com.github.mmvpm.service
1+
package com.github.mmvpm.service.config
22

33
import scala.concurrent.duration.FiniteDuration
44

55
case class Config(server: ServerConfig, session: SessionConfig, postgresql: PostgresqlConfig, redis: RedisConfig)
66

77
case class ServerConfig(host: String, port: Int)
88

9-
case class PostgresqlConfig(url: String, user: String, password: String, poolSize: Int)
9+
case class PostgresqlConfig(url: String, user: String, password: Option[String], poolSize: Int)
1010

1111
case class SessionConfig(expiration: FiniteDuration)
1212

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.github.mmvpm.service.config
2+
3+
import cats.Monad
4+
import cats.effect.std.Env
5+
import com.github.mmvpm.secret.SecretService
6+
import pureconfig.ConfigSource
7+
import pureconfig.generic.auto._
8+
import cats.implicits._
9+
10+
trait ConfigLoader[F[_]] {
11+
def load(filename: String): F[Config]
12+
}
13+
14+
object ConfigLoader {
15+
16+
def impl[F[_]: Monad: Env](secrets: SecretService[F]): ConfigLoader[F] =
17+
new Impl[F](secrets)
18+
19+
private final class Impl[F[_]: Monad: Env](secrets: SecretService[F]) extends ConfigLoader[F] {
20+
21+
def load(filename: String): F[Config] =
22+
enrichWithSecrets(ConfigSource.resources(filename).loadOrThrow[Config])
23+
24+
private def enrichWithSecrets(config: Config): F[Config] =
25+
for {
26+
redisSecret <- secrets.redisPassword
27+
redisPassword = redisSecret.orElse(config.redis.password)
28+
29+
postgresSecret <- secrets.postgresPassword
30+
postgresPassword = postgresSecret.orElse(config.postgresql.password)
31+
32+
redisEnriched = config.redis.copy(password = redisPassword)
33+
postgresqlEnriched = config.postgresql.copy(password = postgresPassword)
34+
35+
enriched = config.copy(
36+
redis = redisEnriched,
37+
postgresql = postgresqlEnriched
38+
)
39+
} yield enriched
40+
}
41+
}

service/src/main/scala/com/github/mmvpm/service/dao/util/FlywayMigration.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package com.github.mmvpm.service.dao.util
22

33
import cats.effect.Sync
44
import cats.syntax.functor._
5-
import com.github.mmvpm.service.PostgresqlConfig
5+
import com.github.mmvpm.service.config.PostgresqlConfig
66
import org.flywaydb.core.Flyway
77

88
object FlywayMigration {
@@ -22,6 +22,6 @@ object FlywayMigration {
2222
.configure()
2323
.locations(MigrationDirectory)
2424
.cleanDisabled(false)
25-
.dataSource(config.url, config.user, config.password)
25+
.dataSource(config.url, config.user, config.password.get)
2626
.load()
2727
}

service/src/main/scala/com/github/mmvpm/service/dao/util/Postgresql.scala

+7-7
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,24 @@ package com.github.mmvpm.service.dao.util
22

33
import cats.effect.{Async, Resource}
44
import cats.implicits.catsSyntaxOptionId
5-
import com.github.mmvpm.service.PostgresqlConfig
5+
import com.github.mmvpm.service.config.PostgresqlConfig
66
import doobie.hikari.{Config, HikariTransactor}
77
import doobie.util.ExecutionContexts
88

99
object Postgresql {
1010

11-
def makeTransactor[F[_]: Async](conf: PostgresqlConfig): Resource[F, HikariTransactor[F]] = {
11+
def makeTransactor[F[_]: Async](config: PostgresqlConfig): Resource[F, HikariTransactor[F]] = {
1212

1313
val hikariConfig = Config(
14-
jdbcUrl = conf.url.some,
15-
username = conf.user.some,
16-
password = conf.password.some,
17-
maximumPoolSize = conf.poolSize.some,
14+
jdbcUrl = config.url.some,
15+
username = config.user.some,
16+
password = config.password,
17+
maximumPoolSize = config.poolSize.some,
1818
driverClassName = "org.postgresql.Driver".some
1919
)
2020

2121
for {
22-
ce <- ExecutionContexts.fixedThreadPool[F](conf.poolSize)
22+
ce <- ExecutionContexts.fixedThreadPool[F](config.poolSize)
2323
xa <- HikariTransactor.fromConfig[F](hikariConfig, ce)
2424
} yield xa
2525
}

service/src/main/scala/com/github/mmvpm/service/util/FlywayMigration.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package com.github.mmvpm.service.util
22

33
import cats.effect.Sync
44
import cats.syntax.functor._
5-
import com.github.mmvpm.service.PostgresqlConfig
5+
import com.github.mmvpm.service.config.PostgresqlConfig
66
import org.flywaydb.core.Flyway
77

88
object FlywayMigration {
@@ -22,6 +22,6 @@ object FlywayMigration {
2222
.configure()
2323
.locations(MigrationDirectory)
2424
.cleanDisabled(false)
25-
.dataSource(config.url, config.user, config.password)
25+
.dataSource(config.url, config.user, config.password.get)
2626
.load()
2727
}

service/src/main/scala/com/github/mmvpm/service/util/Postgresql.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package com.github.mmvpm.service.util
22

33
import cats.effect.{Async, Resource}
44
import cats.implicits.catsSyntaxOptionId
5-
import com.github.mmvpm.service.PostgresqlConfig
5+
import com.github.mmvpm.service.config.PostgresqlConfig
66
import doobie.hikari.{Config, HikariTransactor}
77
import doobie.util.ExecutionContexts
88

@@ -13,7 +13,7 @@ object Postgresql {
1313
val hikariConfig = Config(
1414
jdbcUrl = conf.url.some,
1515
username = conf.user.some,
16-
password = conf.password.some,
16+
password = conf.password,
1717
maximumPoolSize = conf.poolSize.some,
1818
driverClassName = "org.postgresql.Driver".some
1919
)

0 commit comments

Comments
 (0)