@@ -697,7 +697,7 @@ func (r *RootCmd) Server(newAPI func(context.Context, *coderd.Options) (*coderd.
697
697
options .Database = dbmem .New ()
698
698
options .Pubsub = pubsub .NewInMemory ()
699
699
} else {
700
- sqlDB , dbURL , err := getPostgresDB (ctx , logger , vals .PostgresURL .String (), codersdk .PostgresAuth (vals .PostgresAuth ), sqlDriver )
700
+ sqlDB , dbURL , err := getAndMigratePostgresDB (ctx , logger , vals .PostgresURL .String (), codersdk .PostgresAuth (vals .PostgresAuth ), sqlDriver )
701
701
if err != nil {
702
702
return xerrors .Errorf ("connect to postgres: %w" , err )
703
703
}
@@ -2090,7 +2090,12 @@ func IsLocalhost(host string) bool {
2090
2090
return host == "localhost" || host == "127.0.0.1" || host == "::1"
2091
2091
}
2092
2092
2093
- func ConnectToPostgres (ctx context.Context , logger slog.Logger , driver string , dbURL string ) (sqlDB * sql.DB , err error ) {
2093
+ // ConnectToPostgres takes a control flag "migrate". If true, `migrations.Up` will be applied
2094
+ // to the database, potentially making schema changes.
2095
+ // If set to false, no database changes will be applied, however the migration version
2096
+ // will be checked. If the database is not fully up to date with its migrations, then
2097
+ // an error will be returned.
2098
+ func ConnectToPostgres (ctx context.Context , logger slog.Logger , migrate bool , driver string , dbURL string ) (sqlDB * sql.DB , err error ) {
2094
2099
logger .Debug (ctx , "connecting to postgresql" )
2095
2100
2096
2101
// Try to connect for 30 seconds.
@@ -2155,7 +2160,11 @@ func ConnectToPostgres(ctx context.Context, logger slog.Logger, driver string, d
2155
2160
}
2156
2161
logger .Debug (ctx , "connected to postgresql" , slog .F ("version" , versionNum ))
2157
2162
2158
- err = migrations .Up (sqlDB )
2163
+ if migrate {
2164
+ err = migrations .Up (sqlDB )
2165
+ } else {
2166
+ err = migrations .EnsureClean (sqlDB )
2167
+ }
2159
2168
if err != nil {
2160
2169
return nil , xerrors .Errorf ("migrate up: %w" , err )
2161
2170
}
@@ -2561,7 +2570,7 @@ func signalNotifyContext(ctx context.Context, inv *serpent.Invocation, sig ...os
2561
2570
return inv .SignalNotifyContext (ctx , sig ... )
2562
2571
}
2563
2572
2564
- func getPostgresDB (ctx context.Context , logger slog.Logger , postgresURL string , auth codersdk.PostgresAuth , sqlDriver string ) (* sql.DB , string , error ) {
2573
+ func getAndMigratePostgresDB (ctx context.Context , logger slog.Logger , postgresURL string , auth codersdk.PostgresAuth , sqlDriver string ) (* sql.DB , string , error ) {
2565
2574
dbURL , err := escapePostgresURLUserInfo (postgresURL )
2566
2575
if err != nil {
2567
2576
return nil , "" , xerrors .Errorf ("escaping postgres URL: %w" , err )
@@ -2574,7 +2583,7 @@ func getPostgresDB(ctx context.Context, logger slog.Logger, postgresURL string,
2574
2583
}
2575
2584
}
2576
2585
2577
- sqlDB , err := ConnectToPostgres (ctx , logger , sqlDriver , dbURL )
2586
+ sqlDB , err := ConnectToPostgres (ctx , logger , true , sqlDriver , dbURL )
2578
2587
if err != nil {
2579
2588
return nil , "" , xerrors .Errorf ("connect to postgres: %w" , err )
2580
2589
}
0 commit comments