diff --git a/server/datasource.ts b/server/datasource.ts index 3a19a9af..e4ba67cb 100644 --- a/server/datasource.ts +++ b/server/datasource.ts @@ -1,4 +1,6 @@ -import 'reflect-metadata'; +import fs from 'fs'; +import * as process from 'process'; +import type { TlsOptions } from 'tls'; import type { DataSourceOptions, EntityTarget, Repository } from 'typeorm'; import { DataSource } from 'typeorm'; @@ -12,7 +14,7 @@ const devConfig: DataSourceOptions = { logging: false, enableWAL: true, entities: ['server/entity/**/*.ts'], - migrations: ['server/migration/**/*.ts'], + migrations: ['server/migration/sqlite/**/*.ts'], subscribers: ['server/subscriber/**/*.ts'], }; @@ -26,7 +28,7 @@ const prodConfig: DataSourceOptions = { logging: false, enableWAL: true, entities: ['dist/entity/**/*.js'], - migrations: ['dist/migration/**/*.js'], + migrations: ['dist/migration/sqlite/**/*.js'], subscribers: ['dist/subscriber/**/*.js'], }; @@ -42,29 +44,7 @@ const postgresDevConfig: DataSourceOptions = { migrationsRun: false, logging: false, entities: ['server/entity/**/*.ts'], - migrations: ['server/migration/**/*.ts'], - subscribers: ['server/subscriber/**/*.ts'], -}; - -const postgresDevConfigSSL: DataSourceOptions = { - type: 'postgres', - name: 'pgdb', - host: process.env.DB_HOST, - port: parseInt(process.env.DB_PORT ?? '5432'), - username: process.env.DB_USER, - password: process.env.DB_PASS, - database: process.env.DB_NAME ?? 'jellyseerr', - ssl: { - rejectUnauthorized: false, // Disable root certificate verification - //ca: fs.readFileSync('/path/to/server-certificates/root.crt').toString(), - //key: fs.readFileSync('/path/to/client-key/postgresql.key').toString(), - //cert: fs.readFileSync('/path/to/client-certificates/postgresql.crt').toString(), - }, - synchronize: true, - migrationsRun: false, - logging: false, - entities: ['server/entity/**/*.ts'], - migrations: ['server/migration/**/*.ts'], + migrations: ['server/migration/postgres/**/*.ts'], subscribers: ['server/subscriber/**/*.ts'], }; @@ -76,55 +56,53 @@ const postgresProdConfig: DataSourceOptions = { username: process.env.DB_USER, password: process.env.DB_PASS, database: process.env.DB_NAME ?? 'jellyseerr', + ssl: buildSslConfig(), synchronize: false, migrationsRun: false, logging: false, entities: ['dist/entity/**/*.js'], - migrations: ['dist/migration/**/*.js'], - subscribers: ['dist/subscriber/**/*.js'], -}; - -const postgresProdConfigSSL: DataSourceOptions = { - type: 'postgres', - name: 'pgdb', - host: process.env.DB_HOST, - port: parseInt(process.env.DB_PORT ?? '5432'), - username: process.env.DB_USER, - password: process.env.DB_PASS, - database: process.env.DB_NAME ?? 'jellyseerr', - ssl: { - rejectUnauthorized: false, // Disable root certificate verification - //ca: fs.readFileSync('/path/to/server-certificates/root.crt').toString(), - //key: fs.readFileSync('/path/to/client-key/postgresql.key').toString(), - //cert: fs.readFileSync('/path/to/client-certificates/postgresql.crt').toString(), - }, - synchronize: false, - migrationsRun: false, - logging: false, - entities: ['dist/entity/**/*.js'], - migrations: ['dist/migration/**/*.js'], + migrations: ['dist/migration/postgres/**/*.js'], subscribers: ['dist/subscriber/**/*.js'], }; export const isPgsql = process.env.DB_TYPE === 'postgres'; -export const pgsqlUseSSL = process.env.DB_USE_SSL === 'true'; +const DB_SSL_PREFIX = 'DB_SSL_CONF_'; + +function boolFromEnv(envVar: string) { + return process.env[envVar]?.toLowerCase() === 'true'; +} + +function stringOrReadFileFromEnv(envVar: string): Buffer | string | undefined { + if (process.env[envVar]) { + return process.env[envVar]; + } + const filePath = process.env[`${envVar}_FILE`]; + if (filePath) { + return fs.readFileSync(filePath); + } + return undefined; +} + +function buildSslConfig(): TlsOptions | undefined { + if (process.env.DB_USE_SSL?.toLowerCase() !== 'true') { + return undefined; + } + return { + rejectUnauthorized: boolFromEnv(`${DB_SSL_PREFIX}REJECT_UNAUTHORIZED`), + ca: stringOrReadFileFromEnv(`${DB_SSL_PREFIX}CA`), + key: stringOrReadFileFromEnv(`${DB_SSL_PREFIX}KEY`), + cert: stringOrReadFileFromEnv(`${DB_SSL_PREFIX}CERT`), + }; +} function getDataSource(): DataSourceOptions { if (process.env.NODE_ENV === 'production') { if (isPgsql) { - if (pgsqlUseSSL) { - return postgresProdConfigSSL; - } else { - return postgresProdConfig; - } + return postgresProdConfig; } return prodConfig; } else if (isPgsql) { - if (pgsqlUseSSL) { - return postgresDevConfigSSL; - } else { - return postgresDevConfig; - } + return postgresDevConfig; } return devConfig; } diff --git a/server/migration/postgres/1705599190375-InitialMigration.ts b/server/migration/postgres/1705599190375-InitialMigration.ts new file mode 100644 index 00000000..1a862cd5 --- /dev/null +++ b/server/migration/postgres/1705599190375-InitialMigration.ts @@ -0,0 +1,303 @@ +import type { MigrationInterface, QueryRunner } from 'typeorm'; + +export class InitialMigration1705599190375 implements MigrationInterface { + name = 'InitialMigration1705599190375'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `create table if not exists session + ( + "expiredAt" int, + id text, + json text + );` + ); + await queryRunner.query( + `create index if not exists "idx_194703_IDX_28c5d1d16da7908c97c9bc2f74" + on session ("expiredAt");` + ); + await queryRunner.query( + `create unique index if not exists idx_194703_sqlite_autoindex_session_1 + on session (id);` + ); + await queryRunner.query( + `create table if not exists media + ( + id serial, + "mediaType" text, + "tmdbId" int, + "tvdbId" int, + "imdbId" text, + status int default '1'::int, + status4k int default '1'::int, + "createdAt" timestamp with time zone, + "updatedAt" timestamp with time zone, + "lastSeasonChange" timestamp with time zone, + "mediaAddedAt" timestamp with time zone, + "serviceId" int, + "serviceId4k" int, + "externalServiceId" int, + "externalServiceId4k" int, + "externalServiceSlug" text, + "externalServiceSlug4k" text, + "ratingKey" text, + "ratingKey4k" text, + "jellyfinMediaId" text, + "jellyfinMediaId4k" text, + constraint idx_194722_media_pkey + primary key (id) + );` + ); + await queryRunner.query( + `create table if not exists season + ( + id serial, + "seasonNumber" int, + status int default '1'::int, + "createdAt" timestamp with time zone, + "updatedAt" timestamp with time zone, + "mediaId" int, + status4k int default '1'::int, + constraint idx_194715_season_pkey + primary key (id), + foreign key ("mediaId") references media + on delete cascade + );` + ); + await queryRunner.query( + `create index if not exists "idx_194722_IDX_7ff2d11f6a83cb52386eaebe74" + on media ("imdbId");` + ); + await queryRunner.query( + `create index if not exists "idx_194722_IDX_41a289eb1fa489c1bc6f38d9c3" + on media ("tvdbId");` + ); + await queryRunner.query( + `create index if not exists "idx_194722_IDX_7157aad07c73f6a6ae3bbd5ef5" + on media ("tmdbId");` + ); + await queryRunner.query( + `create unique index if not exists idx_194722_sqlite_autoindex_media_1 + on media ("tvdbId");` + ); + await queryRunner.query( + `create table if not exists "user" + ( + id serial, + email text, + username text, + "plexId" int, + "plexToken" text, + permissions int default '0'::int, + avatar text, + "createdAt" timestamp with time zone, + "updatedAt" timestamp with time zone, + password text, + "userType" int default '1'::int, + "plexUsername" text, + "resetPasswordGuid" text, + "recoveryLinkExpirationDate" date, + "movieQuotaLimit" int, + "movieQuotaDays" int, + "tvQuotaLimit" int, + "tvQuotaDays" int, + "jellyfinUsername" text, + "jellyfinAuthToken" text, + "jellyfinUserId" text, + "jellyfinDeviceId" text, + constraint idx_194731_user_pkey + primary key (id) + );` + ); + await queryRunner.query( + `create unique index if not exists idx_194731_sqlite_autoindex_user_1 + on "user" (email);` + ); + await queryRunner.query( + `create table if not exists user_push_subscription + ( + id serial, + endpoint text, + p256dh text, + auth text, + "userId" int, + constraint idx_194740_user_push_subscription_pkey + primary key (id), + foreign key ("userId") references "user" + on delete cascade + );` + ); + await queryRunner.query( + `create unique index if not exists idx_194740_sqlite_autoindex_user_push_subscription_1 + on user_push_subscription (auth);` + ); + await queryRunner.query( + `create table if not exists issue + ( + id serial, + "issueType" int, + status int default '1'::int, + "problemSeason" int default '0'::int, + "problemEpisode" int default '0'::int, + "createdAt" timestamp with time zone, + "updatedAt" timestamp with time zone, + "mediaId" int, + "createdById" int, + "modifiedById" int, + constraint idx_194747_issue_pkey + primary key (id), + foreign key ("modifiedById") references "user" + on delete cascade, + foreign key ("createdById") references "user" + on delete cascade, + foreign key ("mediaId") references media + on delete cascade + );` + ); + await queryRunner.query( + `create table if not exists issue_comment + ( + id serial, + message text, + "createdAt" timestamp with time zone, + "updatedAt" timestamp with time zone, + "userId" int, + "issueId" int, + constraint idx_194755_issue_comment_pkey + primary key (id), + foreign key ("issueId") references issue + on delete cascade, + foreign key ("userId") references "user" + on delete cascade + );` + ); + await queryRunner.query( + `create table if not exists user_settings + ( + id serial, + "notificationTypes" text, + "discordId" text, + "userId" int, + region text, + "originalLanguage" text, + "telegramChatId" text, + "telegramSendSilently" boolean, + "pgpKey" text, + locale text default ''::text, + "pushbulletAccessToken" text, + "pushoverApplicationToken" text, + "pushoverUserKey" text, + "watchlistSyncMovies" boolean, + "watchlistSyncTv" boolean, + constraint idx_194762_user_settings_pkey + primary key (id), + foreign key ("userId") references "user" + on delete cascade + );` + ); + await queryRunner.query( + `create unique index if not exists idx_194762_sqlite_autoindex_user_settings_1 + on user_settings ("userId");` + ); + await queryRunner.query( + `create table if not exists media_request + ( + id serial, + status int, + "createdAt" timestamp with time zone, + "updatedAt" timestamp with time zone, + type text, + "mediaId" int, + "requestedById" int, + "modifiedById" int, + is4k boolean default false, + "serverId" int, + "profileId" int, + "rootFolder" text, + "languageProfileId" int, + tags text, + "isAutoRequest" boolean default false, + constraint idx_194770_media_request_pkey + primary key (id), + foreign key ("modifiedById") references "user" + on delete set null, + foreign key ("requestedById") references "user" + on delete cascade, + foreign key ("mediaId") references media + on delete cascade + );` + ); + await queryRunner.query( + `create table if not exists season_request + ( + id serial, + "seasonNumber" int, + status int default '1'::int, + "createdAt" timestamp with time zone default now(), + "updatedAt" timestamp with time zone default now(), + "requestId" int, + constraint idx_194709_season_request_pkey + primary key (id), + foreign key ("requestId") references media_request + on delete cascade + );` + ); + await queryRunner.query( + `create table if not exists discover_slider + ( + id serial, + type integer, + "order" integer, + "isBuiltIn" boolean default false, + enabled boolean default true, + title text, + data text, + "createdAt" timestamp with time zone, + "updatedAt" timestamp with time zone, + constraint idx_194779_discover_slider_pkey + primary key (id) + );` + ); + await queryRunner.query( + `create table if not exists watchlist + ( + id serial, + "ratingKey" text, + "mediaType" text, + title text, + "tmdbId" int, + "createdAt" timestamp with time zone, + "updatedAt" timestamp with time zone, + "requestedById" int, + "mediaId" int, + constraint idx_194788_watchlist_pkey + primary key (id) + );` + ); + await queryRunner.query( + `create index if not exists "idx_194788_IDX_939f205946256cc0d2a1ac51a8" + on watchlist ("tmdbId");` + ); + await queryRunner.query( + `create unique index if not exists idx_194788_sqlite_autoindex_watchlist_1 + on watchlist ("tmdbId", "requestedById");` + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`drop table if exists session cascade`); + await queryRunner.query(`drop table if exists season_request cascade`); + await queryRunner.query(`drop table if exists season cascade`); + await queryRunner.query( + `drop table if exists user_push_subscription cascade` + ); + await queryRunner.query(`drop table if exists issue_comment cascade`); + await queryRunner.query(`drop table if exists issue cascade`); + await queryRunner.query(`drop table if exists user_settings cascade`); + await queryRunner.query(`drop table if exists media_request cascade`); + await queryRunner.query(`drop table if exists media cascade`); + await queryRunner.query(`drop table if exists "user" cascade`); + await queryRunner.query(`drop table if exists discover_slider cascade`); + await queryRunner.query(`drop table if exists watchlist cascade`); + } +} diff --git a/server/migration/1603944374840-InitialMigration.ts b/server/migration/sqlite/1603944374840-InitialMigration.ts similarity index 100% rename from server/migration/1603944374840-InitialMigration.ts rename to server/migration/sqlite/1603944374840-InitialMigration.ts diff --git a/server/migration/1605085519544-SeasonStatus.ts b/server/migration/sqlite/1605085519544-SeasonStatus.ts similarity index 100% rename from server/migration/1605085519544-SeasonStatus.ts rename to server/migration/sqlite/1605085519544-SeasonStatus.ts diff --git a/server/migration/1606730060700-CascadeMigration.ts b/server/migration/sqlite/1606730060700-CascadeMigration.ts similarity index 100% rename from server/migration/1606730060700-CascadeMigration.ts rename to server/migration/sqlite/1606730060700-CascadeMigration.ts diff --git a/server/migration/1607928251245-DropImdbIdConstraint.ts b/server/migration/sqlite/1607928251245-DropImdbIdConstraint.ts similarity index 100% rename from server/migration/1607928251245-DropImdbIdConstraint.ts rename to server/migration/sqlite/1607928251245-DropImdbIdConstraint.ts diff --git a/server/migration/1608217312474-AddUserRequestDeleteCascades.ts b/server/migration/sqlite/1608217312474-AddUserRequestDeleteCascades.ts similarity index 100% rename from server/migration/1608217312474-AddUserRequestDeleteCascades.ts rename to server/migration/sqlite/1608217312474-AddUserRequestDeleteCascades.ts diff --git a/server/migration/1608477467935-AddLastSeasonChangeMedia.ts b/server/migration/sqlite/1608477467935-AddLastSeasonChangeMedia.ts similarity index 100% rename from server/migration/1608477467935-AddLastSeasonChangeMedia.ts rename to server/migration/sqlite/1608477467935-AddLastSeasonChangeMedia.ts diff --git a/server/migration/1608477467936-ForceDropImdbUniqueConstraint.ts b/server/migration/sqlite/1608477467936-ForceDropImdbUniqueConstraint.ts similarity index 100% rename from server/migration/1608477467936-ForceDropImdbUniqueConstraint.ts rename to server/migration/sqlite/1608477467936-ForceDropImdbUniqueConstraint.ts diff --git a/server/migration/1609236552057-RemoveTmdbIdUniqueConstraint.ts b/server/migration/sqlite/1609236552057-RemoveTmdbIdUniqueConstraint.ts similarity index 100% rename from server/migration/1609236552057-RemoveTmdbIdUniqueConstraint.ts rename to server/migration/sqlite/1609236552057-RemoveTmdbIdUniqueConstraint.ts diff --git a/server/migration/1610070934506-LocalUsers.ts b/server/migration/sqlite/1610070934506-LocalUsers.ts similarity index 100% rename from server/migration/1610070934506-LocalUsers.ts rename to server/migration/sqlite/1610070934506-LocalUsers.ts diff --git a/server/migration/1610370640747-Add4kStatusFields.ts b/server/migration/sqlite/1610370640747-Add4kStatusFields.ts similarity index 100% rename from server/migration/1610370640747-Add4kStatusFields.ts rename to server/migration/sqlite/1610370640747-Add4kStatusFields.ts diff --git a/server/migration/1610522845513-AddMediaAddedFieldToMedia.ts b/server/migration/sqlite/1610522845513-AddMediaAddedFieldToMedia.ts similarity index 100% rename from server/migration/1610522845513-AddMediaAddedFieldToMedia.ts rename to server/migration/sqlite/1610522845513-AddMediaAddedFieldToMedia.ts diff --git a/server/migration/1611508672722-AddDisplayNameToUser.ts b/server/migration/sqlite/1611508672722-AddDisplayNameToUser.ts similarity index 100% rename from server/migration/1611508672722-AddDisplayNameToUser.ts rename to server/migration/sqlite/1611508672722-AddDisplayNameToUser.ts diff --git a/server/migration/1611757511674-SonarrRadarrSyncServiceFields.ts b/server/migration/sqlite/1611757511674-SonarrRadarrSyncServiceFields.ts similarity index 100% rename from server/migration/1611757511674-SonarrRadarrSyncServiceFields.ts rename to server/migration/sqlite/1611757511674-SonarrRadarrSyncServiceFields.ts diff --git a/server/migration/1611801511397-AddRatingKeysToMedia.ts b/server/migration/sqlite/1611801511397-AddRatingKeysToMedia.ts similarity index 100% rename from server/migration/1611801511397-AddRatingKeysToMedia.ts rename to server/migration/sqlite/1611801511397-AddRatingKeysToMedia.ts diff --git a/server/migration/1612482778137-AddResetPasswordGuidAndExpiryDate.ts b/server/migration/sqlite/1612482778137-AddResetPasswordGuidAndExpiryDate.ts similarity index 100% rename from server/migration/1612482778137-AddResetPasswordGuidAndExpiryDate.ts rename to server/migration/sqlite/1612482778137-AddResetPasswordGuidAndExpiryDate.ts diff --git a/server/migration/1612571545781-AddLanguageProfileId.ts b/server/migration/sqlite/1612571545781-AddLanguageProfileId.ts similarity index 100% rename from server/migration/1612571545781-AddLanguageProfileId.ts rename to server/migration/sqlite/1612571545781-AddLanguageProfileId.ts diff --git a/server/migration/1613379909641-AddJellyfinUserParams.ts b/server/migration/sqlite/1613379909641-AddJellyfinUserParams.ts similarity index 100% rename from server/migration/1613379909641-AddJellyfinUserParams.ts rename to server/migration/sqlite/1613379909641-AddJellyfinUserParams.ts diff --git a/server/migration/1613412948344-ServerTypeEnum.ts b/server/migration/sqlite/1613412948344-ServerTypeEnum.ts similarity index 100% rename from server/migration/1613412948344-ServerTypeEnum.ts rename to server/migration/sqlite/1613412948344-ServerTypeEnum.ts diff --git a/server/migration/1613615266968-CreateUserSettings.ts b/server/migration/sqlite/1613615266968-CreateUserSettings.ts similarity index 100% rename from server/migration/1613615266968-CreateUserSettings.ts rename to server/migration/sqlite/1613615266968-CreateUserSettings.ts diff --git a/server/migration/1613670041760-AddJellyfinDeviceId.ts b/server/migration/sqlite/1613670041760-AddJellyfinDeviceId.ts similarity index 100% rename from server/migration/1613670041760-AddJellyfinDeviceId.ts rename to server/migration/sqlite/1613670041760-AddJellyfinDeviceId.ts diff --git a/server/migration/1613955393450-UpdateUserSettingsRegions.ts b/server/migration/sqlite/1613955393450-UpdateUserSettingsRegions.ts similarity index 100% rename from server/migration/1613955393450-UpdateUserSettingsRegions.ts rename to server/migration/sqlite/1613955393450-UpdateUserSettingsRegions.ts diff --git a/server/migration/1614334195680-AddTelegramSettingsToUserSettings.ts b/server/migration/sqlite/1614334195680-AddTelegramSettingsToUserSettings.ts similarity index 100% rename from server/migration/1614334195680-AddTelegramSettingsToUserSettings.ts rename to server/migration/sqlite/1614334195680-AddTelegramSettingsToUserSettings.ts diff --git a/server/migration/1615333940450-AddPGPToUserSettings.ts b/server/migration/sqlite/1615333940450-AddPGPToUserSettings.ts similarity index 100% rename from server/migration/1615333940450-AddPGPToUserSettings.ts rename to server/migration/sqlite/1615333940450-AddPGPToUserSettings.ts diff --git a/server/migration/1616576677254-AddUserQuotaFields.ts b/server/migration/sqlite/1616576677254-AddUserQuotaFields.ts similarity index 100% rename from server/migration/1616576677254-AddUserQuotaFields.ts rename to server/migration/sqlite/1616576677254-AddUserQuotaFields.ts diff --git a/server/migration/1617624225464-CreateTagsFieldonMediaRequest.ts b/server/migration/sqlite/1617624225464-CreateTagsFieldonMediaRequest.ts similarity index 100% rename from server/migration/1617624225464-CreateTagsFieldonMediaRequest.ts rename to server/migration/sqlite/1617624225464-CreateTagsFieldonMediaRequest.ts diff --git a/server/migration/1617730837489-AddUserSettingsNotificationAgentsField.ts b/server/migration/sqlite/1617730837489-AddUserSettingsNotificationAgentsField.ts similarity index 100% rename from server/migration/1617730837489-AddUserSettingsNotificationAgentsField.ts rename to server/migration/sqlite/1617730837489-AddUserSettingsNotificationAgentsField.ts diff --git a/server/migration/1618912653565-CreateUserPushSubscriptions.ts b/server/migration/sqlite/1618912653565-CreateUserPushSubscriptions.ts similarity index 100% rename from server/migration/1618912653565-CreateUserPushSubscriptions.ts rename to server/migration/sqlite/1618912653565-CreateUserPushSubscriptions.ts diff --git a/server/migration/1619239659754-AddUserSettingsLocale.ts b/server/migration/sqlite/1619239659754-AddUserSettingsLocale.ts similarity index 100% rename from server/migration/1619239659754-AddUserSettingsLocale.ts rename to server/migration/sqlite/1619239659754-AddUserSettingsLocale.ts diff --git a/server/migration/1619339817343-AddUserSettingsNotificationTypes.ts b/server/migration/sqlite/1619339817343-AddUserSettingsNotificationTypes.ts similarity index 100% rename from server/migration/1619339817343-AddUserSettingsNotificationTypes.ts rename to server/migration/sqlite/1619339817343-AddUserSettingsNotificationTypes.ts diff --git a/server/migration/1634904083966-AddIssues.ts b/server/migration/sqlite/1634904083966-AddIssues.ts similarity index 100% rename from server/migration/1634904083966-AddIssues.ts rename to server/migration/sqlite/1634904083966-AddIssues.ts diff --git a/server/migration/1635079863457-AddPushbulletPushoverUserSettings.ts b/server/migration/sqlite/1635079863457-AddPushbulletPushoverUserSettings.ts similarity index 100% rename from server/migration/1635079863457-AddPushbulletPushoverUserSettings.ts rename to server/migration/sqlite/1635079863457-AddPushbulletPushoverUserSettings.ts diff --git a/server/migration/1660632269368-AddWatchlistSyncUserSetting.ts b/server/migration/sqlite/1660632269368-AddWatchlistSyncUserSetting.ts similarity index 100% rename from server/migration/1660632269368-AddWatchlistSyncUserSetting.ts rename to server/migration/sqlite/1660632269368-AddWatchlistSyncUserSetting.ts diff --git a/server/migration/1660714479373-AddMediaRequestIsAutoRequestedField.ts b/server/migration/sqlite/1660714479373-AddMediaRequestIsAutoRequestedField.ts similarity index 100% rename from server/migration/1660714479373-AddMediaRequestIsAutoRequestedField.ts rename to server/migration/sqlite/1660714479373-AddMediaRequestIsAutoRequestedField.ts diff --git a/server/migration/1672041273674-AddDiscoverSlider.ts b/server/migration/sqlite/1672041273674-AddDiscoverSlider.ts similarity index 100% rename from server/migration/1672041273674-AddDiscoverSlider.ts rename to server/migration/sqlite/1672041273674-AddDiscoverSlider.ts diff --git a/server/migration/1682608634546-AddWatchlists.ts b/server/migration/sqlite/1682608634546-AddWatchlists.ts similarity index 100% rename from server/migration/1682608634546-AddWatchlists.ts rename to server/migration/sqlite/1682608634546-AddWatchlists.ts