2
0
Эх сурвалжийг харах

better docker compose setup with config

Alexander Belanger 5 жил өмнө
parent
commit
1a8846769e

+ 1 - 0
.gitignore

@@ -0,0 +1 @@
+.DS_Store

+ 13 - 8
cmd/app/main.go

@@ -1,21 +1,24 @@
 package main
 
 import (
+	"fmt"
 	"log"
 	"net/http"
-	"time"
 
 	"github.com/porter-dev/porter/server/api"
 
 	adapter "github.com/porter-dev/porter/internal/adapter"
+	"github.com/porter-dev/porter/internal/config"
 	lr "github.com/porter-dev/porter/internal/logger"
 	vr "github.com/porter-dev/porter/internal/validator"
 	"github.com/porter-dev/porter/server/router"
 )
 
 func main() {
-	logger := lr.NewConsole(true)
-	db, err := adapter.New()
+	appConf := config.AppConfig()
+
+	logger := lr.NewConsole(appConf.Debug)
+	db, err := adapter.New(&appConf.Db)
 
 	if err != nil {
 		logger.Fatal().Err(err).Msg("")
@@ -28,14 +31,16 @@ func main() {
 
 	appRouter := router.New(a)
 
-	logger.Info().Msgf("Starting server %v", "8080")
+	address := fmt.Sprintf(":%d", appConf.Server.Port)
+
+	logger.Info().Msgf("Starting server %v", address)
 
 	s := &http.Server{
-		Addr:         ":8080",
+		Addr:         address,
 		Handler:      appRouter,
-		ReadTimeout:  30 * time.Second,
-		WriteTimeout: 30 * time.Second,
-		IdleTimeout:  120 * time.Second,
+		ReadTimeout:  appConf.Server.TimeoutRead,
+		WriteTimeout: appConf.Server.TimeoutWrite,
+		IdleTimeout:  appConf.Server.TimeoutIdle,
 	}
 
 	if err := s.ListenAndServe(); err != nil && err != http.ErrServerClosed {

+ 8 - 1
cmd/migrate/main.go

@@ -1,14 +1,21 @@
 package main
 
 import (
+	"fmt"
+
 	adapter "github.com/porter-dev/porter/internal/adapter"
+	"github.com/porter-dev/porter/internal/config"
 	lr "github.com/porter-dev/porter/internal/logger"
 	"github.com/porter-dev/porter/internal/models"
 )
 
 func main() {
+	fmt.Println("running migrations...")
+
+	appConf := config.AppConfig()
+
 	logger := lr.NewConsole(true)
-	db, err := adapter.New()
+	db, err := adapter.New(&appConf.Db)
 
 	if err != nil {
 		logger.Fatal().Err(err).Msg("")

+ 6 - 1
docker-compose.yaml

@@ -8,9 +8,14 @@ services:
       - 8080:8080
     depends_on:
       - postgres
+    env_file:
+      - ./docker/.env
+    command: /bin/sh -c '/porter/bin/migrate; air -c .air.toml;'
     restart: on-failure
     volumes:
-      - ./:/porter
+      - ./cmd:/porter/cmd
+      - ./internal:/porter/internal
+      - ./server:/porter/server
 
   postgres:
     image: postgres:latest

+ 12 - 0
docker/.env

@@ -0,0 +1,12 @@
+DEBUG=true
+
+SERVER_PORT=8080
+SERVER_TIMEOUT_READ=5s
+SERVER_TIMEOUT_WRITE=10s
+SERVER_TIMEOUT_IDLE=15s
+
+DB_HOST=postgres
+DB_PORT=5432
+DB_USER=porter
+DB_PASS=porter
+DB_NAME=porter

+ 3 - 0
docker/dev.Dockerfile

@@ -10,6 +10,9 @@ RUN go mod download
 
 COPY . ./
 
+RUN go build -ldflags '-w -s' -a -o ./bin/migrate ./cmd/migrate \
+    && chmod +x /porter/docker/bin/*
+
 # for live reloading of go container
 RUN go get github.com/cosmtrek/air
 

+ 1 - 0
go.mod

@@ -12,6 +12,7 @@ require (
 	github.com/go-playground/validator/v10 v10.3.0
 	github.com/imdario/mergo v0.3.11 // indirect
 	github.com/jinzhu/gorm v1.9.16
+	github.com/joeshaw/envdecode v0.0.0-20200121155833-099f1fc765bd
 	github.com/leodido/go-urn v1.2.0 // indirect
 	github.com/mattn/go-colorable v0.1.7 // indirect
 	github.com/pelletier/go-toml v1.8.1 // indirect

+ 2 - 0
go.sum

@@ -230,6 +230,8 @@ github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkr
 github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
 github.com/jinzhu/now v1.1.1 h1:g39TucaRWyV3dwDO++eEc6qf8TVIQ/Da48WmqjZ3i7E=
 github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
+github.com/joeshaw/envdecode v0.0.0-20200121155833-099f1fc765bd h1:nIzoSW6OhhppWLm4yqBwZsKJlAayUu5FGozhrF3ETSM=
+github.com/joeshaw/envdecode v0.0.0-20200121155833-099f1fc765bd/go.mod h1:MEQrHur0g8VplbLOv5vXmDzacSaH9Z7XhcgsSh1xciU=
 github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
 github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68=
 github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=

+ 11 - 2
internal/adapter/gorm.go

@@ -1,14 +1,23 @@
 package gorm
 
 import (
+	"fmt"
+
+	"github.com/porter-dev/porter/internal/config"
 	"gorm.io/driver/postgres"
 	"gorm.io/gorm"
 )
 
 // New returns a new gorm database instance
 // TODO -- accept config to generate connection
-func New() (*gorm.DB, error) {
-	dsn := "user=porter password=porter dbname=porter port=5432 host=postgres sslmode=disable"
+func New(conf *config.DBConf) (*gorm.DB, error) {
+	dsn := fmt.Sprintf(
+		"user=%s password=%s port=%d host=%s sslmode=disable",
+		conf.Username,
+		conf.Password,
+		conf.Port,
+		conf.Host,
+	)
 
 	return gorm.Open(postgres.Open(dsn), &gorm.Config{})
 }

+ 39 - 0
internal/config/config.go

@@ -0,0 +1,39 @@
+package config
+
+import (
+	"log"
+	"time"
+
+	"github.com/joeshaw/envdecode"
+)
+
+type Conf struct {
+	Debug  bool `env:"DEBUG,required"`
+	Server ServerConf
+	Db     DBConf
+}
+
+type ServerConf struct {
+	Port         int           `env:"SERVER_PORT,required"`
+	TimeoutRead  time.Duration `env:"SERVER_TIMEOUT_READ,required"`
+	TimeoutWrite time.Duration `env:"SERVER_TIMEOUT_WRITE,required"`
+	TimeoutIdle  time.Duration `env:"SERVER_TIMEOUT_IDLE,required"`
+}
+
+type DBConf struct {
+	Host     string `env:"DB_HOST,required"`
+	Port     int    `env:"DB_PORT,required"`
+	Username string `env:"DB_USER,required"`
+	Password string `env:"DB_PASS,required"`
+	DbName   string `env:"DB_NAME,required"`
+}
+
+func AppConfig() *Conf {
+	var c Conf
+
+	if err := envdecode.StrictDecode(&c); err != nil {
+		log.Fatalf("Failed to decode: %s", err)
+	}
+
+	return &c
+}

BIN
tmp/app