From e48e968fb8f1c6368da0614337d34ff93863e260 Mon Sep 17 00:00:00 2001 From: iPromKnight Date: Sat, 9 Mar 2024 19:52:17 +0000 Subject: [PATCH] Add database migrations service --- src/migrator/.dockerignore | 1 + src/migrator/.pgmigrate.yaml | 4 + src/migrator/Dockerfile | 8 ++ src/migrator/entrypoint.sh | 6 ++ src/migrator/migrations/001_initial.sql | 111 ++++++++++++++++++++++++ 5 files changed, 130 insertions(+) create mode 100644 src/migrator/.dockerignore create mode 100644 src/migrator/.pgmigrate.yaml create mode 100644 src/migrator/Dockerfile create mode 100644 src/migrator/entrypoint.sh create mode 100644 src/migrator/migrations/001_initial.sql diff --git a/src/migrator/.dockerignore b/src/migrator/.dockerignore new file mode 100644 index 0000000..9414382 --- /dev/null +++ b/src/migrator/.dockerignore @@ -0,0 +1 @@ +Dockerfile diff --git a/src/migrator/.pgmigrate.yaml b/src/migrator/.pgmigrate.yaml new file mode 100644 index 0000000..6c63622 --- /dev/null +++ b/src/migrator/.pgmigrate.yaml @@ -0,0 +1,4 @@ +migrations: "./migrations" +schema: + name: "public" + file: "./schema.sql" diff --git a/src/migrator/Dockerfile b/src/migrator/Dockerfile new file mode 100644 index 0000000..2f75b5d --- /dev/null +++ b/src/migrator/Dockerfile @@ -0,0 +1,8 @@ +FROM ghcr.io/peterldowns/pgmigrate:latest +USER root +RUN addgroup -S migrator && adduser -S -G migrator migrator +USER migrator +WORKDIR /tmp +COPY --chmod=0777 . . +COPY --from=ghcr.io/ufoscout/docker-compose-wait:latest /wait ./wait +ENTRYPOINT [ "./entrypoint.sh" ] diff --git a/src/migrator/entrypoint.sh b/src/migrator/entrypoint.sh new file mode 100644 index 0000000..21a0769 --- /dev/null +++ b/src/migrator/entrypoint.sh @@ -0,0 +1,6 @@ +#!/bin/sh +export WAIT_HOSTS="${POSTGRES_HOST}:${POSTGRES_PORT}" +export WAIT_BEFORE=3 +export WAIT_TIMEOUT=15 +./wait && \ +pgmigrate apply -d "postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}" diff --git a/src/migrator/migrations/001_initial.sql b/src/migrator/migrations/001_initial.sql new file mode 100644 index 0000000..b18939a --- /dev/null +++ b/src/migrator/migrations/001_initial.sql @@ -0,0 +1,111 @@ +CREATE TABLE public.contents ( + "infoHash" character varying(64) NOT NULL, + "fileIndex" integer NOT NULL, + path character varying(512) NOT NULL, + size bigint +); + +ALTER TABLE public.contents +ADD CONSTRAINT contents_pkey +PRIMARY KEY ("infoHash", "fileIndex"); + +CREATE SEQUENCE public.files_id_seq; + +CREATE TABLE public.files ( + id integer PRIMARY KEY NOT NULL DEFAULT nextval('files_id_seq'::regclass), + "infoHash" character varying(64) NOT NULL, + "fileIndex" integer, + title character varying(512) NOT NULL, + size bigint, + "imdbId" character varying(32), + "imdbSeason" integer, + "imdbEpisode" integer, + "kitsuId" integer, + "kitsuEpisode" integer, + "createdAt" timestamp with time zone NOT NULL, + "updatedAt" timestamp with time zone NOT NULL +); + +CREATE INDEX files_imdb_id_imdb_season_imdb_episode ON public.files USING btree ("imdbId", "imdbSeason", "imdbEpisode"); + +CREATE INDEX files_kitsu_id_kitsu_episode ON public.files USING btree ("kitsuId", "kitsuEpisode"); + +CREATE UNIQUE INDEX files_unique_file_constraint ON public.files USING btree ("infoHash", "fileIndex", "imdbId", "imdbSeason", "imdbEpisode", "kitsuId", "kitsuEpisode"); + +ALTER SEQUENCE public.files_id_seq OWNED BY public.files.id; + +CREATE SEQUENCE public.ingested_pages_id_seq; + +CREATE TABLE public.ingested_pages ( + id integer PRIMARY KEY NOT NULL DEFAULT nextval('ingested_pages_id_seq'::regclass), + url character varying(512) UNIQUE NOT NULL, + "createdAt" timestamp with time zone NOT NULL, + "updatedAt" timestamp with time zone NOT NULL +); + +ALTER SEQUENCE public.ingested_pages_id_seq OWNED BY public.ingested_pages.id; + +CREATE SEQUENCE public.ingested_torrents_id_seq; + +CREATE TABLE public.ingested_torrents ( + id integer PRIMARY KEY NOT NULL DEFAULT nextval('ingested_torrents_id_seq'::regclass), + name character varying(512), + source character varying(512), + category character varying(32), + info_hash character varying(64), + size character varying(32), + seeders integer, + leechers integer, + imdb character varying(32), + processed boolean DEFAULT false, + "createdAt" timestamp with time zone NOT NULL, + "updatedAt" timestamp with time zone NOT NULL +); + +CREATE UNIQUE INDEX ingested_torrent_unique_source_info_hash_constraint ON public.ingested_torrents USING btree (source, info_hash); + +ALTER SEQUENCE public.ingested_torrents_id_seq OWNED BY public.ingested_torrents.id; + +CREATE TABLE public.providers ( + name character varying(32) PRIMARY KEY NOT NULL, + "lastScraped" timestamp with time zone, + "lastScrapedId" character varying(128) +); + +CREATE TABLE public.skip_torrents ( + "infoHash" character varying(64) PRIMARY KEY NOT NULL +); + +CREATE SEQUENCE public.subtitles_id_seq; + +CREATE TABLE public.subtitles ( + id integer PRIMARY KEY NOT NULL DEFAULT nextval('subtitles_id_seq'::regclass), + "infoHash" character varying(64) NOT NULL, + "fileIndex" integer NOT NULL, + "fileId" bigint, + title character varying(512) NOT NULL +); + +CREATE INDEX subtitles_file_id ON public.subtitles USING btree ("fileId"); + +CREATE UNIQUE INDEX subtitles_unique_subtitle_constraint ON public.subtitles USING btree ("infoHash", "fileIndex", "fileId"); + +ALTER SEQUENCE public.subtitles_id_seq OWNED BY public.subtitles.id; + +CREATE TABLE public.torrents ( + "infoHash" character varying(64) PRIMARY KEY NOT NULL, + provider character varying(32) NOT NULL, + "torrentId" character varying(512), + title character varying(512) NOT NULL, + size bigint, + type character varying(16) NOT NULL, + "uploadDate" timestamp with time zone NOT NULL, + seeders smallint, + trackers character varying(8000), + languages character varying(4096), + resolution character varying(16), + reviewed boolean NOT NULL DEFAULT false, + opened boolean NOT NULL DEFAULT false, + "createdAt" timestamp with time zone NOT NULL, + "updatedAt" timestamp with time zone NOT NULL +);