bitmagnet-io / bitmagnet

A self-hosted BitTorrent indexer, DHT crawler, content classifier and torrent search engine with web UI, GraphQL API and Servarr stack integration.
https://bitmagnet.io/
MIT License
2.01k stars 76 forks source link

Cannot set postgres port from enviroment variable. #23

Closed meteokr closed 7 months ago

meteokr commented 7 months ago

Setting POSTGRES_PORT= any value crashes. This is the full output of the command, but I think only the very last line looks relevant. Leaving this environment value as the default seems to work as intended, but my environment requires an alternate port to be used.

command to produce error: podman run -it --rm -e POSTGRES_PORT=6463 ghcr.io/bitmagnet-io/bitmagnet:latest

[Fx] PROVIDE *cli.Command[group = "commands"] <= github.com/bitmagnet-io/bitmagnet/internal/app/cmd/searchcmd.New() from module "app" [Fx] PROVIDE *cli.Command[group = "commands"] <= github.com/bitmagnet-io/bitmagnet/internal/app/cmd/torrentcmd.New() from module "app" [Fx] PROVIDE httpserver.Option[group = "http_server_options"] <= github.com/bitmagnet-io/bitmagnet/internal/webui.New() from module "app" [Fx] PROVIDE hooks.AttachedHooks <= github.com/bitmagnet-io/bitmagnet/internal/boilerplate/cli/hooks.New() from module "app_boilerplate" [Fx] PROVIDE *cli.Command[group = "commands"] <= github.com/bitmagnet-io/bitmagnet/internal/boilerplate/app/cmd/config.New() from module "app_boilerplate" [Fx] PROVIDE *cli.Command[group = "commands"] <= github.com/bitmagnet-io/bitmagnet/internal/boilerplate/app/cmd/worker.New() from module "app_boilerplate" [Fx] PROVIDE []string[name = "cli_args"] <= github.com/bitmagnet-io/bitmagnet/internal/boilerplate/cli/args.New() from module "cli" [Fx] PROVIDE *cli.App <= github.com/bitmagnet-io/bitmagnet/internal/boilerplate/cli.New() from module "cli" [Fx] PROVIDE config.ResolvedConfig <= github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config.New() from module "config" [Fx] PROVIDE configresolver.Resolver[group = "config_resolvers"] <= fx.Annotated{Group: "config_resolvers", Target: github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config/configfx.New.func1()} from module "config" [Fx] PROVIDE configresolver.Resolver[group = "config_resolvers"] <= fx.Annotated{Group: "config_resolvers", Target: github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config/configfx.New.func2()} from module "config" [Fx] PROVIDE configresolver.Resolver[group = "config_resolvers"] <= fx.Annotated{Group: "config_resolvers", Target: github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config/configfx.New.func3()} from module "config" [Fx] PROVIDE *health.Health <= github.com/bitmagnet-io/bitmagnet/internal/boilerplate/healthcheck.New() from module "healthcheck" [Fx] PROVIDE httpserver.Option[group = "http_server_options"] <= github.com/bitmagnet-io/bitmagnet/internal/boilerplate/healthcheck/httpserver.New() from module "healthcheck" [Fx] PROVIDE zap.Config <= github.com/bitmagnet-io/bitmagnet/internal/boilerplate/logging.NewZapConfig() from module "logging" [Fx] PROVIDE *zap.Logger <= github.com/bitmagnet-io/bitmagnet/internal/boilerplate/logging.New() from module "logging" [Fx] PROVIDE *zap.SugaredLogger <= github.com/bitmagnet-io/bitmagnet/internal/boilerplate/logging.New() from module "logging" [Fx] PROVIDE config.Spec[group = "config_specs"] <= fx.Annotated{Group: "config_specs", Target: github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config/configfx.NewConfigModule[...].func1()} from module "config:log" [Fx] PROVIDE logging.Config <= fx.Annotated{Target: github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config/configfx.NewConfigModule[...].func2()} from module "config:log" [Fx] PROVIDE *validator.Validate <= github.com/bitmagnet-io/bitmagnet/internal/boilerplate/validation.New() from module "validation" [Fx] PROVIDE worker.Registry <= github.com/bitmagnet-io/bitmagnet/internal/boilerplate/worker.NewRegistry() from module "worker" [Fx] PROVIDE classifier.Classifier <= github.com/bitmagnet-io/bitmagnet/internal/classifier.New() from module "classifier" [Fx] PROVIDE consumer.Consumer[group = "queue_consumers"] <= github.com/bitmagnet-io/bitmagnet/internal/classifier/asynq/consumer.New() from module "classifier" [Fx] PROVIDE producer.Producer[github.com/bitmagnet-io/bitmagnet/internal/classifier/asynq/message.ClassifyTorrentPayload] <= github.com/bitmagnet-io/bitmagnet/internal/classifier/asynq/producer.New() from module "classifier" [Fx] PROVIDE publisher.Publisher[github.com/bitmagnet-io/bitmagnet/internal/classifier/asynq/message.ClassifyTorrentPayload] <= github.com/bitmagnet-io/bitmagnet/internal/classifier/asynq/publisher.New() from module "classifier" [Fx] PROVIDE resolver.SubResolver[group = "content_resolvers"] <= github.com/bitmagnet-io/bitmagnet/internal/classifier/resolver/video.New() from module "classifier" [Fx] PROVIDE *tmdb.Client <= github.com/bitmagnet-io/bitmagnet/internal/classifier/video/tmdb.New() from module "movie" [Fx] PROVIDE tmdb.Client <= github.com/bitmagnet-io/bitmagnet/internal/classifier/video/tmdb.New() from module "movie" [Fx] PROVIDE resolver.RootResolver <= github.com/bitmagnet-io/bitmagnet/internal/classifier/resolver.New() from module "movie" [Fx] PROVIDE config.Spec[group = "config_specs"] <= fx.Annotated{Group: "config_specs", Target: github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config/configfx.NewConfigModule[...].func1()} from module "config:tmdb" [Fx] PROVIDE tmdb.Config <= fx.Annotated{Target: github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config/configfx.NewConfigModule[...].func2()} from module "config:tmdb" [Fx] PROVIDE server.Server <= github.com/bitmagnet-io/bitmagnet/internal/dht/server.New() from module "dht" [Fx] PROVIDE fx.Hook[group = "app_hooks"] <= github.com/bitmagnet-io/bitmagnet/internal/dht/server.New() from module "dht" [Fx] PROVIDE crawler.Crawler <= github.com/bitmagnet-io/bitmagnet/internal/dht/crawler.New() from module "dht" [Fx] PROVIDE worker.Worker[group = "workers"] <= github.com/bitmagnet-io/bitmagnet/internal/dht/crawler.New() from module "dht" [Fx] PROVIDE health.Option[group = "healthcheck_options"] <= github.com/bitmagnet-io/bitmagnet/internal/dht/healthcheck.New() from module "dht" [Fx] PROVIDE staging.Staging <= github.com/bitmagnet-io/bitmagnet/internal/dht/staging.New() from module "dht" [Fx] PROVIDE config.Spec[group = "config_specs"] <= fx.Annotated{Group: "config_specs", Target: github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config/configfx.NewConfigModule[...].func1()} from module "config:dht_crawler" [Fx] PROVIDE dht.Config <= fx.Annotated{Target: github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config/configfx.NewConfigModule[...].func2()} from module "config:dht_crawler" [Fx] PROVIDE config.Spec[group = "config_specs"] <= fx.Annotated{Group: "config_specs", Target: github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config/configfx.NewConfigModule[...].func1()} from module "config:dht_server" [Fx] PROVIDE server.Config <= fx.Annotated{Target: github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config/configfx.NewConfigModule[...].func2()} from module "config:dht_server" [Fx] PROVIDE caches.Cacher <= github.com/bitmagnet-io/bitmagnet/internal/database/cache.NewInMemoryCacher() from module "database" [Fx] PROVIDE *caches.Caches <= github.com/bitmagnet-io/bitmagnet/internal/database/cache.NewPlugin() from module "database" [Fx] PROVIDE *dao.Query <= github.com/bitmagnet-io/bitmagnet/internal/database/dao.New() from module "database" [Fx] PROVIDE *sql.DB <= github.com/bitmagnet-io/bitmagnet/internal/database.New() from module "database" [Fx] PROVIDE *gorm.DB <= github.com/bitmagnet-io/bitmagnet/internal/database.New() from module "database" [Fx] PROVIDE health.Option[group = "healthcheck_options"] <= github.com/bitmagnet-io/bitmagnet/internal/database/healthcheck.New() from module "database" [Fx] PROVIDE persistence.Persistence <= github.com/bitmagnet-io/bitmagnet/internal/database/persistence.New() from module "database" [Fx] PROVIDE gorm.Dialector <= github.com/bitmagnet-io/bitmagnet/internal/database/postgres.New() from module "database" [Fx] PROVIDE search.Search <= github.com/bitmagnet-io/bitmagnet/internal/database/search.New() from module "database" [Fx] PROVIDE config.Spec[group = "config_specs"] <= fx.Annotated{Group: "config_specs", Target: github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config/configfx.NewConfigModule[...].func1()} from module "config:postgres" [Fx] PROVIDE postgres.Config <= fx.Annotated{Target: github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config/configfx.NewConfigModule[...].func2()} from module "config:postgres" [Fx] PROVIDE config.Spec[group = "config_specs"] <= fx.Annotated{Group: "config_specs", Target: github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config/configfx.NewConfigModule[...].func1()} from module "config:gorm_cache" [Fx] PROVIDE cache.Config <= fx.Annotated{Target: github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config/configfx.NewConfigModule[...].func2()} from module "config:gorm_cache" [Fx] PROVIDE gql.Config <= github.com/bitmagnet-io/bitmagnet/internal/gql/config.New() from module "graphql" [Fx] PROVIDE graphql.ExecutableSchema <= github.com/bitmagnet-io/bitmagnet/internal/gql.NewExecutableSchema() from module "graphql" [Fx] PROVIDE gql.ResolverRoot <= github.com/bitmagnet-io/bitmagnet/internal/gql/resolvers.New() from module "graphql" [Fx] PROVIDE httpserver.Option[group = "http_server_options"] <= github.com/bitmagnet-io/bitmagnet/internal/gql/httpserver.New() from module "graphql" [Fx] PROVIDE *gin.Engine <= github.com/bitmagnet-io/bitmagnet/internal/boilerplate/httpserver.New() from module "http_server" [Fx] PROVIDE *http.Server <= github.com/bitmagnet-io/bitmagnet/internal/boilerplate/httpserver.New() from module "http_server" [Fx] PROVIDE worker.Worker[group = "workers"] <= github.com/bitmagnet-io/bitmagnet/internal/boilerplate/httpserver.New() from module "http_server" [Fx] PROVIDE httpserver.Option[group = "http_server_options"] <= github.com/bitmagnet-io/bitmagnet/internal/boilerplate/httpserver/cors.New() from module "http_server" [Fx] PROVIDE config.Spec[group = "config_specs"] <= fx.Annotated{Group: "config_specs", Target: github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config/configfx.NewConfigModule[...].func1()} from module "config:http_server" [Fx] PROVIDE httpserver.Config <= fx.Annotated{Target: github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config/configfx.NewConfigModule[...].func2()} from module "config:http_server" [Fx] PROVIDE httpserver.Option[group = "http_server_options"] <= github.com/bitmagnet-io/bitmagnet/internal/importer/httpserver.New() from module "importer" [Fx] PROVIDE importer.Importer <= github.com/bitmagnet-io/bitmagnet/internal/importer.New() from module "importer" [Fx] PROVIDE metainforequester.Requester <= github.com/bitmagnet-io/bitmagnet/internal/metainfo/metainforequester.New() from module "metainfo" [Fx] PROVIDE config.Spec[group = "config_specs"] <= fx.Annotated{Group: "config_specs", Target: github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config/configfx.NewConfigModule[...].func1()} from module "config:metainfo_requester" [Fx] PROVIDE metainforequester.Config <= fx.Annotated{Target: github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config/configfx.NewConfigModule[...].func2()} from module "config:metainfo_requester" [Fx] PROVIDE *asynq.Client <= github.com/bitmagnet-io/bitmagnet/internal/queue/client.New() from module "subscriber" [Fx] PROVIDE *asynq.Server <= github.com/bitmagnet-io/bitmagnet/internal/queue/server.New() from module "subscriber" [Fx] PROVIDE *asynq.ServeMux <= github.com/bitmagnet-io/bitmagnet/internal/queue/server.New() from module "subscriber" [Fx] PROVIDE worker.Worker[group = "workers"] <= github.com/bitmagnet-io/bitmagnet/internal/queue/server.New() from module "subscriber" [Fx] PROVIDE config.Spec[group = "config_specs"] <= fx.Annotated{Group: "config_specs", Target: github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config/configfx.NewConfigModule[...].func1()} from module "config:queue" [Fx] PROVIDE queue.Config <= fx.Annotated{Target: github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config/configfx.NewConfigModule[...].func2()} from module "config:queue" [Fx] PROVIDE *redis.Client <= github.com/bitmagnet-io/bitmagnet/internal/redis/redisfx.New.func1() from module "redis" [Fx] PROVIDE health.Option[group = "healthcheck_options"] <= github.com/bitmagnet-io/bitmagnet/internal/redis/healthcheck.New() from module "redis" [Fx] PROVIDE config.Spec[group = "config_specs"] <= fx.Annotated{Group: "config_specs", Target: github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config/configfx.NewConfigModule[...].func1()} from module "config:redis" [Fx] PROVIDE redisconfig.Config <= fx.Annotated{Target: github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config/configfx.NewConfigModule[...].func2()} from module "config:redis" [Fx] PROVIDE torznab.Client <= github.com/bitmagnet-io/bitmagnet/internal/torznab/adapter.New() from module "torznab" [Fx] PROVIDE httpserver.Option[group = "http_server_options"] <= github.com/bitmagnet-io/bitmagnet/internal/torznab/httpserver.New() from module "torznab" [Fx] PROVIDE health.Option[group = "healthcheck_options"] <= github.com/bitmagnet-io/bitmagnet/internal/version/healthcheck.New() from module "version" [Fx] PROVIDE fx.Lifecycle <= go.uber.org/fx.New.func1() [Fx] PROVIDE fx.Shutdowner <= go.uber.org/fx.(*App).shutdowner-fm() [Fx] PROVIDE fx.DotGraph <= go.uber.org/fx.(*App).dotGraph-fm() [Fx] DECORATE *gorm.DB <= github.com/bitmagnet-io/bitmagnet/internal/database/migrations.NewDecorator() from module "app" [Fx] DECORATE *gorm.DB <= github.com/bitmagnet-io/bitmagnet/internal/database/cache.NewDecorator() from module "database" [Fx] RUN provide: fx.Annotated{Group: "config_specs", Target: github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config/configfx.NewConfigModule[...].func1()} from module "config:log" [Fx] RUN provide: fx.Annotated{Group: "config_specs", Target: github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config/configfx.NewConfigModule[...].func1()} from module "config:tmdb" [Fx] RUN provide: fx.Annotated{Group: "config_specs", Target: github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config/configfx.NewConfigModule[...].func1()} from module "config:dht_crawler" [Fx] RUN provide: fx.Annotated{Group: "config_specs", Target: github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config/configfx.NewConfigModule[...].func1()} from module "config:dht_server" [Fx] RUN provide: fx.Annotated{Group: "config_specs", Target: github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config/configfx.NewConfigModule[...].func1()} from module "config:postgres" [Fx] RUN provide: fx.Annotated{Group: "config_specs", Target: github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config/configfx.NewConfigModule[...].func1()} from module "config:gorm_cache" [Fx] RUN provide: fx.Annotated{Group: "config_specs", Target: github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config/configfx.NewConfigModule[...].func1()} from module "config:http_server" [Fx] RUN provide: fx.Annotated{Group: "config_specs", Target: github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config/configfx.NewConfigModule[...].func1()} from module "config:metainfo_requester" [Fx] RUN provide: fx.Annotated{Group: "config_specs", Target: github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config/configfx.NewConfigModule[...].func1()} from module "config:queue" [Fx] RUN provide: fx.Annotated{Group: "config_specs", Target: github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config/configfx.NewConfigModule[...].func1()} from module "config:redis" [Fx] RUN provide: fx.Annotated{Group: "config_resolvers", Target: github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config/configfx.New.func1()} from module "config" [Fx] RUN provide: fx.Annotated{Group: "config_resolvers", Target: github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config/configfx.New.func2()} from module "config" [Fx] RUN provide: fx.Annotated{Group: "config_resolvers", Target: github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config/configfx.New.func3()} from module "config" [Fx] RUN provide: github.com/bitmagnet-io/bitmagnet/internal/boilerplate/validation.New() from module "validation" [Fx] RUN provide: github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config.New() from module "config" [Fx] Error returned: received non-nil error from function "github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config".New /build/internal/boilerplate/config/config.go:28: error coercing env key 'POSTGRES_PORT' with value '6463' to type uint: cannot coerce value to type uint [Fx] ERROR Failed to initialize custom logger: could not build arguments for function "go.uber.org/fx".(*module).constructCustomLogger.func2 /go/pkg/mod/go.uber.org/fx@v1.20.0/module.go:251: failed to build fxevent.Logger: could not build arguments for function "github.com/bitmagnet-io/bitmagnet/internal/boilerplate/logging/loggingfx".WithLogger.func1 /build/internal/boilerplate/logging/loggingfx/module.go:22: failed to build *zap.Logger: could not build arguments for function "github.com/bitmagnet-io/bitmagnet/internal/boilerplate/logging".New /build/internal/boilerplate/logging/logger.go:19: failed to build zap.Config: could not build arguments for function "github.com/bitmagnet-io/bitmagnet/internal/boilerplate/logging".NewZapConfig /build/internal/boilerplate/logging/config.go:24: failed to build logging.Config: could not build arguments for function "github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config/configfx".NewConfigModule[...].func2 /build/internal/boilerplate/config/configfx/factory.go:25: failed to build config.ResolvedConfig: received non-nil error from function "github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config".New /build/internal/boilerplate/config/config.go:28: error coercing env key 'POSTGRES_PORT' with value '6463' to type uint: cannot coerce value to type uint [Fx] ERROR Failed to start: could not build arguments for function "go.uber.org/fx".(*module).constructCustomLogger.func2 /go/pkg/mod/go.uber.org/fx@v1.20.0/module.go:251: failed to build fxevent.Logger: could not build arguments for function "github.com/bitmagnet-io/bitmagnet/internal/boilerplate/logging/loggingfx".WithLogger.func1 /build/internal/boilerplate/logging/loggingfx/module.go:22: failed to build *zap.Logger: could not build arguments for function "github.com/bitmagnet-io/bitmagnet/internal/boilerplate/logging".New /build/internal/boilerplate/logging/logger.go:19: failed to build zap.Config: could not build arguments for function "github.com/bitmagnet-io/bitmagnet/internal/boilerplate/logging".NewZapConfig /build/internal/boilerplate/logging/config.go:24: failed to build logging.Config: could not build arguments for function "github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config/configfx".NewConfigModule[...].func2 /build/internal/boilerplate/config/configfx/factory.go:25: failed to build config.ResolvedConfig: received non-nil error from function "github.com/bitmagnet-io/bitmagnet/internal/boilerplate/config".New /build/internal/boilerplate/config/config.go:28: error coercing env key 'POSTGRES_PORT' with value '6463' to type uint: cannot coerce value to type uint

mgdigital commented 7 months ago

Thanks, I'll get a fix in soon. In the meantime you can set it with the YAML config option. I'm aware that setting some types of values as env vars will produce an error like the above (uints was a bit of a glaring oversight though!), will cover them all off in due course.....

myyc commented 7 months ago

i also wanted to try this out on a k8s deployment but for whatever reason the default port ends up being a string (tcp://ip:5432 obviously not parsable as an int) and setting it as 5432 via an env variable triggers this bug

meteokr commented 7 months ago

Thanks, I'll get a fix in soon. In the meantime you can set it with the YAML config option. I'm aware that setting some types of values as env vars will produce an error like the above (uints was a bit of a glaring oversight though!), will cover them all off in due course.....

Would it be possible to add a "--config /config/file/location.yml" command line option as well? Currently this exclusively reads ./config.yml as its only file input. I'd like to be able to use different config files for different workers, but keep them together in a git repo together.

Thank you very much for this program though, extremely excited for this, but I don't know anything in Golang.