From c9c44cac88ccc326cb298bbdd461c6f1530017ab Mon Sep 17 00:00:00 2001 From: ricin9 Date: Wed, 25 Sep 2024 21:29:44 +0100 Subject: [PATCH] added migrations on run, fly deployments --- config/databases.go | 26 +++++++++++++++++++++----- fly.toml | 31 +++++++++++++++++++------------ go.mod | 3 +++ go.sum | 18 ++++++++++++++++++ handlers/routes.go | 6 ------ main.go | 28 +++++++++++++++++++--------- utils/migrate.go | 24 ++++++++++++++++++++++++ 7 files changed, 104 insertions(+), 32 deletions(-) create mode 100644 utils/migrate.go diff --git a/config/databases.go b/config/databases.go index 76370c2..2e0a481 100644 --- a/config/databases.go +++ b/config/databases.go @@ -3,6 +3,7 @@ package config import ( "database/sql" "log" + "os" "github.com/redis/go-redis/v9" ) @@ -19,8 +20,9 @@ func SetupDatabasesConfig() { } func SetupSqlite() { - if *Prod { - SqliteSrc = "prod.db" + dbpath := os.Getenv("DATABASE_PATH") + if len(dbpath) != 0 { + SqliteSrc = dbpath } else { SqliteSrc = "test.db" } @@ -34,7 +36,21 @@ func SetupSqlite() { } func SetupRedis() { - RedisClient = redis.NewClient(&redis.Options{ - Addr: ":6379", - }) + var opts *redis.Options + + rediscConnStr := os.Getenv("REDIS_CONN_STRING") + if len(rediscConnStr) != 0 { + parsed, err := redis.ParseURL(rediscConnStr) + if err != nil { + log.Fatalln("REDIS_CONN_STRING Redis connection string is invalid") + } + + opts = parsed + } else { + opts = &redis.Options{ + Addr: ":6379", + } + } + + RedisClient = redis.NewClient(opts) } diff --git a/fly.toml b/fly.toml index 196b089..cf40c85 100644 --- a/fly.toml +++ b/fly.toml @@ -7,21 +7,28 @@ app = 'fiber-chat' primary_region = 'mad' [build] - [build.args] - GO_VERSION = '1.23.1' +[build.args] +GO_VERSION = '1.23.1' [env] - PORT = '8080' + +PORT = '8080' +DATABASE_PATH = "/mnt/sqlite-db-volume/prod.db" [http_service] - internal_port = 8080 - force_https = true - auto_stop_machines = 'stop' - auto_start_machines = true - min_machines_running = 0 - processes = ['app'] +internal_port = 8080 +force_https = true +auto_stop_machines = 'stop' +auto_start_machines = true +min_machines_running = 0 +processes = ['app'] [[vm]] - memory = '1gb' - cpu_kind = 'shared' - cpus = 1 +memory = '1gb' +cpu_kind = 'shared' +cpus = 1 + + +[mounts] +source = "sqlite_db" +destination = "/mnt/sqlite-db-volume" diff --git a/go.mod b/go.mod index 660631e..4f4fb45 100644 --- a/go.mod +++ b/go.mod @@ -7,8 +7,11 @@ require ( github.com/gofiber/contrib/websocket v1.3.2 github.com/gofiber/fiber/v2 v2.52.5 github.com/redis/go-redis/v9 v9.6.1 + github.com/rubenv/sql-migrate v1.7.0 ) +require github.com/go-gorp/gorp/v3 v3.1.0 // indirect + require ( github.com/andybalholm/brotli v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect diff --git a/go.sum b/go.sum index ad4b436..5332439 100644 --- a/go.sum +++ b/go.sum @@ -16,6 +16,8 @@ github.com/fasthttp/websocket v1.5.8 h1:k5DpirKkftIF/w1R8ZzjSgARJrs54Je9YJK37DL/ github.com/fasthttp/websocket v1.5.8/go.mod h1:d08g8WaT6nnyvg9uMm8K9zMYyDjfKyj3170AtPRuVU0= github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/go-gorp/gorp/v3 v3.1.0 h1:ItKF/Vbuj31dmV4jxA1qblpSwkl9g1typ24xoe70IGs= +github.com/go-gorp/gorp/v3 v3.1.0/go.mod h1:dLEjIyyRNiXvNZ8PSmzpt1GsWAUK8kjVhEpjH8TixEw= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= @@ -24,6 +26,8 @@ github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJn github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= github.com/go-playground/validator/v10 v10.22.1 h1:40JcKH+bBNGFczGuoBYgX4I6m/i27HYW8P9FDk5PbgA= github.com/go-playground/validator/v10 v10.22.1/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/gofiber/contrib/websocket v1.3.2 h1:AUq5PYeKwK50s0nQrnluuINYeep1c4nRCJ0NWsV3cvg= github.com/gofiber/contrib/websocket v1.3.2/go.mod h1:07u6QGMsvX+sx7iGNCl5xhzuUVArWwLQ3tBIH24i+S8= github.com/gofiber/fiber/v2 v2.52.5 h1:tWoP1MJQjGEe4GB5TUGOi7P2E0ZMMRx5ZTG4rT+yGMo= @@ -34,8 +38,14 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg= github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= +github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= @@ -47,10 +57,16 @@ github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/poy/onpar v1.1.2 h1:QaNrNiZx0+Nar5dLgTVp5mXkyoVFIbepjyEoGSnhbAY= +github.com/poy/onpar v1.1.2/go.mod h1:6X8FLNoxyr9kkmnlqpK6LSoiOtrO6MICtWwEuWkLjzg= github.com/redis/go-redis/v9 v9.6.1 h1:HHDteefn6ZkTtY5fGUE8tj8uy85AHk6zP7CpzIAM0y4= github.com/redis/go-redis/v9 v9.6.1/go.mod h1:0C0c6ycQsdpVNQpxb1njEQIqkx5UcsM8FJCQLgE9+RA= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rubenv/sql-migrate v1.7.0 h1:HtQq1xyTN2ISmQDggnh0c9U3JlP8apWh8YO2jzlXpTI= +github.com/rubenv/sql-migrate v1.7.0/go.mod h1:S4wtDEG1CKn+0ShpTtzWhFpHHI5PvCUtiGI+C+Z2THE= github.com/savsgio/gotils v0.0.0-20240303185622-093b76447511 h1:KanIMPX0QdEdB4R3CiimCAbxFrhB3j7h0/OvpYGVQa8= github.com/savsgio/gotils v0.0.0-20240303185622-093b76447511/go.mod h1:sM7Mt7uEoCeFSCBM+qBrqvEo+/9vdmj19wzp3yzUhmg= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= @@ -71,5 +87,7 @@ golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/handlers/routes.go b/handlers/routes.go index 9d286de..d5d6c73 100644 --- a/handlers/routes.go +++ b/handlers/routes.go @@ -1,12 +1,10 @@ package handlers import ( - "net/http" "ricin9/fiber-chat/middleware" "github.com/gofiber/contrib/websocket" "github.com/gofiber/fiber/v2" - "github.com/gofiber/fiber/v2/middleware/filesystem" ) func Setup(app *fiber.App) { @@ -46,8 +44,4 @@ func Setup(app *fiber.App) { }) app.Get("/ws", websocket.New(Websocket)) - - app.Use("/", filesystem.New(filesystem.Config{ - Root: http.Dir("static"), - })) } diff --git a/main.go b/main.go index ad66c31..bb3776d 100644 --- a/main.go +++ b/main.go @@ -1,26 +1,31 @@ package main import ( - "context" + "embed" + "net/http" "ricin9/fiber-chat/config" "ricin9/fiber-chat/handlers" + "ricin9/fiber-chat/utils" "log" "github.com/gofiber/fiber/v2" + "github.com/gofiber/fiber/v2/middleware/filesystem" "github.com/gofiber/fiber/v2/middleware/logger" "github.com/gofiber/fiber/v2/middleware/recover" ) -var ctx = context.Background() +var ( + //go:embed static + embedStaticDir embed.FS + + //go:embed migrations/* + embedMigrationsDir embed.FS +) func main() { config.Setup() - - // run migrations, dont know where to put this yet - // migrations := &migrate.FileMigrationSource{ - // Dir: "migrations", - // } + utils.Migrate(embedMigrationsDir) // Create fiber app app := fiber.New(fiber.Config{ @@ -34,6 +39,11 @@ func main() { // Routes handlers.Setup(app) - // Listen on port 3000 - log.Fatal(app.Listen(config.Port)) // go run app.go -port=:3000 + app.Use("/", filesystem.New(filesystem.Config{ + Root: http.FS(embedStaticDir), + PathPrefix: "/static", + })) + + // Listen on port $PORT or 3000 + log.Fatal(app.Listen(config.Port)) } diff --git a/utils/migrate.go b/utils/migrate.go new file mode 100644 index 0000000..4825ced --- /dev/null +++ b/utils/migrate.go @@ -0,0 +1,24 @@ +package utils + +import ( + "embed" + "log" + "ricin9/fiber-chat/config" + + migrate "github.com/rubenv/sql-migrate" +) + +func Migrate(migrations embed.FS) { + + // run migrations + migrationSrc := &migrate.EmbedFileSystemMigrationSource{ + FileSystem: migrations, + Root: "migrations", + } + + n, err := migrate.Exec(config.Db, "sqlite3", migrationSrc, migrate.Up) + if err != nil { + log.Fatalln("[MIGRATIONS] Error running migrations: ", err) + } + log.Println("[MIGRATIONS] Applied ", n, " migrations") +}