aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Joe Banks <[email protected]>2021-09-10 20:51:10 +0100
committerGravatar GitHub <[email protected]>2021-09-10 20:51:10 +0100
commitf1219bc472bfa497057a1535b6d37752002e8492 (patch)
treeaf0717e76f4b0b8f4bb440f8ceee1563e6d480b9
parentMerge pull request #6 from python-discord/sync-channels-guard-no-category (diff)
parentCapitalise SKIP_METRICITY env var name (diff)
Merge pull request #7 from python-discord/metricity-creates-own-database
-rw-r--r--Dockerfile2
-rw-r--r--create_metricity_db.py46
-rw-r--r--docker-compose.yml43
-rw-r--r--entry_point.sh9
4 files changed, 99 insertions, 1 deletions
diff --git a/Dockerfile b/Dockerfile
index c1d0877..926b015 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -16,4 +16,4 @@ RUN poetry config virtualenvs.create false && poetry install
COPY . /metricity
-CMD ["sh", "-c", "alembic upgrade head && poetry run start"]
+CMD ["bash", "entry_point.sh"]
diff --git a/create_metricity_db.py b/create_metricity_db.py
new file mode 100644
index 0000000..edec2db
--- /dev/null
+++ b/create_metricity_db.py
@@ -0,0 +1,46 @@
+"""Ensures the metricity db exists before running migrations."""
+import os
+from urllib.parse import SplitResult, urlsplit
+
+import psycopg2
+from psycopg2 import sql
+from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT
+
+
+def parse_db_url(db_url: str) -> SplitResult:
+ """Validate and split the given databse url."""
+ db_url_parts = urlsplit(db_url)
+ if not all((
+ db_url_parts.hostname,
+ db_url_parts.username,
+ db_url_parts.password
+ )):
+ raise ValueError(
+ "The given db_url is not a valid PostgreSQL database URL."
+ )
+ return db_url_parts
+
+
+if __name__ == "__main__":
+ database_parts = parse_db_url(os.environ["DATABASE_URI"])
+
+ conn = psycopg2.connect(
+ host=database_parts.hostname,
+ port=database_parts.port,
+ user=database_parts.username,
+ password=database_parts.password
+ )
+
+ db_name = database_parts.path[1:] or "metricity"
+
+ # Required to create a database in a .execute() call
+ conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)
+ with conn.cursor() as cursor:
+ cursor.execute("SELECT 1 FROM pg_catalog.pg_database WHERE datname = %s", (db_name,))
+ exists = cursor.fetchone()
+ if not exists:
+ print("Creating metricity database.")
+ cursor.execute(
+ sql.SQL("CREATE DATABASE {dbname}").format(dbname=sql.Identifier(db_name))
+ )
+ conn.close()
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000..9128f58
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,43 @@
+version: "3.8"
+
+x-logging: &logging
+ logging:
+ driver: "json-file"
+ options:
+ max-file: "5"
+ max-size: "10m"
+
+x-restart-policy: &restart_policy
+ restart: "no"
+
+services:
+ postgres:
+ << : *logging
+ << : *restart_policy
+ image: postgres:13-alpine
+ environment:
+ POSTGRES_DB: pysite
+ POSTGRES_PASSWORD: pysite
+ POSTGRES_USER: pysite
+ healthcheck:
+ test: ["CMD-SHELL", "pg_isready -U pysite"]
+ interval: 2s
+ timeout: 1s
+ retries: 5
+
+ metricity:
+ << : *logging
+ << : *restart_policy
+ depends_on:
+ postgres:
+ condition: service_healthy
+ build:
+ context: .
+ dockerfile: Dockerfile
+ volumes:
+ - ./logs:/metricity/logs
+ - .:/metricity:ro
+ env_file:
+ - .env
+ environment:
+ DATABASE_URI: postgres://pysite:pysite@postgres
diff --git a/entry_point.sh b/entry_point.sh
new file mode 100644
index 0000000..cf101da
--- /dev/null
+++ b/entry_point.sh
@@ -0,0 +1,9 @@
+set -e
+
+python create_metricity_db.py
+alembic upgrade head
+
+shopt -s nocasematch
+if [ "$SKIP_METRICITY" != "true" ]; then
+ poetry run start
+fi