From a86d1dccb105fe1da7c4222d45dfd753a21417a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jainil=20Prajapati=20=F0=9F=AA=90?= <86187588+jaainil@users.noreply.github.com> Date: Thu, 28 Aug 2025 11:55:19 +0530 Subject: [PATCH] Add Domain Locker blueprint (#308) * Add Domain Locker blueprint with PostgreSQL backend and cron-based updater service * Reformat "tags" arrays in meta.json to multi-line for improved readability --- blueprints/domain-locker/docker-compose.yml | 52 ++++++++++++++++++++ blueprints/domain-locker/image.png | Bin 0 -> 7893 bytes blueprints/domain-locker/template.toml | 33 +++++++++++++ meta.json | 18 +++++++ 4 files changed, 103 insertions(+) create mode 100644 blueprints/domain-locker/docker-compose.yml create mode 100644 blueprints/domain-locker/image.png create mode 100644 blueprints/domain-locker/template.toml diff --git a/blueprints/domain-locker/docker-compose.yml b/blueprints/domain-locker/docker-compose.yml new file mode 100644 index 00000000..d4d8b541 --- /dev/null +++ b/blueprints/domain-locker/docker-compose.yml @@ -0,0 +1,52 @@ +version: "3.8" + +services: + postgres: + image: postgres:15-alpine + restart: unless-stopped + environment: + POSTGRES_DB: ${DL_PG_NAME:-domain_locker} + POSTGRES_USER: ${DL_PG_USER:-postgres} + POSTGRES_PASSWORD: ${DL_PG_PASSWORD:-changeme2420} + expose: + - "5432" + volumes: + - postgres_data:/var/lib/postgresql/data + # - ./db/schema.sql:/docker-entrypoint-initdb.d/init-schema.sql:ro + healthcheck: + test: ["CMD-SHELL", "pg_isready -U ${DL_PG_USER:-postgres}"] + interval: 5s + timeout: 3s + retries: 10 + + app: + image: lissy93/domain-locker:latest + restart: unless-stopped + environment: + NODE_ENV: "production" + DL_ENV_TYPE: ${DL_ENV_TYPE:-selfHosted} + DL_PG_HOST: ${DL_PG_HOST:-postgres} + DL_PG_PORT: ${DL_PG_PORT:-5432} + DL_PG_USER: ${DL_PG_USER:-postgres} + DL_PG_PASSWORD: ${DL_PG_PASSWORD:-changeme2420} + DL_PG_NAME: ${DL_PG_NAME:-domain_locker} + expose: + - "3000" + depends_on: + - postgres + + updater: + image: alpine:3.20 + restart: unless-stopped + depends_on: + - app + command: > + /bin/sh -c " + apk add --no-cache curl && + echo '0 3 * * * /usr/bin/curl -s -X POST http://app:3000/api/domain-updater' > /etc/crontabs/root && + echo '0 4 * * * /usr/bin/curl -s -X POST http://app:3000/api/expiration-reminders' >> /etc/crontabs/root && + crond -f -L /dev/stdout + " + +volumes: + postgres_data: {} diff --git a/blueprints/domain-locker/image.png b/blueprints/domain-locker/image.png new file mode 100644 index 0000000000000000000000000000000000000000..001512e3473567f2c97b9cbfa81fc4b3e545db62 GIT binary patch literal 7893 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 v9SqJU7JCb7)3>+kr5X01IF0x3B#HxAb