@@ -8,19 +8,20 @@ import (
88 "fmt"
99 "os"
1010 "os/signal"
11- "path/filepath"
1211 "syscall"
1312 "time"
1413
1514 "github.com/golang-migrate/migrate/v4"
1615 githubPgx "github.com/golang-migrate/migrate/v4/database/pgx/v5"
1716 _ "github.com/golang-migrate/migrate/v4/source/file"
17+ "github.com/golang-migrate/migrate/v4/source/iofs"
1818 _ "github.com/jackc/pgx/v5/stdlib"
1919 "github.com/sirrobot01/mcpulse/internal/auth"
2020 "github.com/sirrobot01/mcpulse/internal/config"
2121 "github.com/sirrobot01/mcpulse/internal/database"
2222 "github.com/sirrobot01/mcpulse/internal/ingestion"
2323 "github.com/sirrobot01/mcpulse/internal/metrics"
24+ "github.com/sirrobot01/mcpulse/internal/migrations"
2425 "github.com/sirrobot01/mcpulse/internal/server"
2526 grpcserver "github.com/sirrobot01/mcpulse/internal/server/grpc"
2627 "go.uber.org/zap"
@@ -70,7 +71,7 @@ func main() {
7071 MaxLifetime : cfg .Database .MaxLifetime ,
7172 }
7273
73- if err := runMigrations (dbConfig , cfg . Database . MigrationsPath , logger ); err != nil {
74+ if err := runMigrations (dbConfig , logger ); err != nil {
7475 logger .Fatal ("failed to run database migrations" , zap .Error (err ))
7576 }
7677
@@ -141,27 +142,7 @@ func main() {
141142 }
142143}
143144
144- func runMigrations (cfg database.Config , migrationsPath string , logger * zap.Logger ) error {
145- if migrationsPath == "" {
146- migrationsPath = "migrations"
147- }
148-
149- absPath , err := filepath .Abs (migrationsPath )
150- if err != nil {
151- return fmt .Errorf ("resolve migrations path: %w" , err )
152- }
153-
154- if info , statErr := os .Stat (absPath ); statErr != nil {
155- if os .IsNotExist (statErr ) {
156- return fmt .Errorf ("migrations path does not exist: %s" , absPath )
157- }
158- return fmt .Errorf ("stat migrations path: %w" , statErr )
159- } else if ! info .IsDir () {
160- return fmt .Errorf ("migrations path is not a directory: %s" , absPath )
161- }
162-
163- sourceURL := fmt .Sprintf ("file://%s" , absPath )
164-
145+ func runMigrations (cfg database.Config , logger * zap.Logger ) error {
165146 db , err := sql .Open ("pgx/v5" , database .ConnectionString (cfg ))
166147 if err != nil {
167148 return fmt .Errorf ("open database for migrations: %w" , err )
@@ -178,10 +159,18 @@ func runMigrations(cfg database.Config, migrationsPath string, logger *zap.Logge
178159 return fmt .Errorf ("create migration driver: %w" , err )
179160 }
180161
181- m , err := migrate .NewWithDatabaseInstance (sourceURL , cfg .Database , driver )
182- if err != nil {
183- return fmt .Errorf ("create migrator: %w" , err )
162+ var m * migrate.Migrate
163+ var source string
164+
165+ // Try to use embedded migrations first
166+ d , iofsErr := iofs .New (migrations .FS , "." )
167+ if iofsErr == nil {
168+ m , err = migrate .NewWithInstance ("iofs" , d , cfg .Database , driver )
169+ if err == nil {
170+ source = "embedded"
171+ }
184172 }
173+
185174 defer func () {
186175 if sourceErr , dbErr := m .Close (); sourceErr != nil || dbErr != nil {
187176 logger .Warn ("migration close error" , zap .Error (errors .Join (sourceErr , dbErr )))
@@ -192,7 +181,7 @@ func runMigrations(cfg database.Config, migrationsPath string, logger *zap.Logge
192181 return fmt .Errorf ("run migrations: %w" , err )
193182 }
194183
195- logger .Info ("database migrations applied" , zap .String ("path " , absPath ))
184+ logger .Info ("database migrations applied" , zap .String ("source " , source ))
196185 return nil
197186}
198187
0 commit comments