From 248ac0fe11394d52ccbbbdeaeb9bafba3876f9e5 Mon Sep 17 00:00:00 2001 From: Alexandre Blause <46499306+ablause@users.noreply.github.com> Date: Sun, 21 Sep 2025 07:10:02 +0200 Subject: [PATCH] feat(blueprint): add notifuse template (#373) * feat(blueprint): add notifuse template * fix(meta): reorganized notifuse in meta file --- blueprints/notifuse/docker-compose.yml | 58 +++++++++++++++++++++++++ blueprints/notifuse/logo.png | Bin 0 -> 42647 bytes blueprints/notifuse/template.toml | 29 +++++++++++++ meta.json | 18 ++++++++ 4 files changed, 105 insertions(+) create mode 100644 blueprints/notifuse/docker-compose.yml create mode 100644 blueprints/notifuse/logo.png create mode 100644 blueprints/notifuse/template.toml diff --git a/blueprints/notifuse/docker-compose.yml b/blueprints/notifuse/docker-compose.yml new file mode 100644 index 00000000..7a33cd4d --- /dev/null +++ b/blueprints/notifuse/docker-compose.yml @@ -0,0 +1,58 @@ +services: + db: + image: postgres:17-alpine + restart: unless-stopped + volumes: + - db-data:/var/lib/postgresql/data + environment: + - POSTGRES_DB=postgres + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=postgres + healthcheck: + test: ["CMD-SHELL", "pg_isready -U postgres"] + interval: 5s + timeout: 5s + retries: 5 + + notifuse: + image: notifuse/notifuse:latest + restart: unless-stopped + depends_on: + - db + environment: + # Root user configuration + - ROOT_EMAIL=${ROOT_EMAIL} + + # API configuration + - API_ENDPOINT=${API_ENDPOINT} + + # Database configuration + - DB_HOST=db + - DB_PORT=5432 + - DB_USER=postgres + - DB_PASSWORD=postgres + - DB_PREFIX=notifuse + - DB_NAME=notifuse_system + - DB_SSLMODE=disable + + # PASETO keys for authentication + # Default keys for testing - GENERATE YOUR OWN for production at https://paseto.notifuse.com/ + - PASETO_PRIVATE_KEY=${PASETO_PRIVATE_KEY} + - PASETO_PUBLIC_KEY=${PASETO_PUBLIC_KEY} + + # SMTP configuration + - SMTP_HOST=${SMTP_HOST} + - SMTP_PORT=${SMTP_PORT} + - SMTP_USERNAME=${SMTP_USERNAME} + - SMTP_PASSWORD=${SMTP_PASSWORD} + - SMTP_FROM_EMAIL=${SMTP_FROM_EMAIL} + - SMTP_FROM_NAME=${SMTP_FROM_NAME} + + # Server configuration + - SERVER_PORT=8080 + - SERVER_HOST=0.0.0.0 + - ENVIRONMENT=production + +volumes: + db-data: + driver: local diff --git a/blueprints/notifuse/logo.png b/blueprints/notifuse/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..af7655407262efb5874de8b7f41781aba409d45a GIT binary patch literal 42647 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

q3)czOd3q&5&_nDk1{4d2w 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
BKnAj*laPxdYsu=u- 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 literal 0 HcmV?d00001 diff --git a/blueprints/notifuse/template.toml b/blueprints/notifuse/template.toml new file mode 100644 index 00000000..ec619010 --- /dev/null +++ b/blueprints/notifuse/template.toml @@ -0,0 +1,29 @@ +[variables] +main_domain = "${domain}" +paseto_private_key = "d04zCk3Fa45oOjDWHpAvc1AZxnLdGffOnNWK+Jt2yXf37+FTfuMMHb8flcfPMqLluRR3rvhbr555r6j1DEigrA==" +paseto_public_key = "9+/hU37jDB2/H5XHzzKi5bkUd674W6+eea+o9QxIoKw=" + +[config] +[[config.domains]] +serviceName = "notifuse" +port = 8080 +host = "${main_domain}" + +[config.env] +ROOT_EMAIL = "${email}" +API_ENDPOINT = "https://${main_domain}" + +# PASETO keys for authentication +# Default keys for testing - GENERATE YOUR OWN for production at https://paseto.notifuse.com/ +PASETO_PRIVATE_KEY = "${paseto_private_key}" +PASETO_PUBLIC_KEY = "${paseto_public_key}" + +# SMTP Configuration (users need to configure these) +SMTP_HOST = "smtp.gmail.com" +SMTP_PORT = "587" +SMTP_USERNAME = "your-email@gmail.com" +SMTP_PASSWORD = "your-smtp-password" +SMTP_FROM_EMAIL = "noreply@yourdomain.com" +SMTP_FROM_NAME = "Notifuse" + +[[config.mounts]] diff --git a/meta.json b/meta.json index 51e72251..3e263e16 100644 --- a/meta.json +++ b/meta.json @@ -3398,6 +3398,24 @@ "nocode" ] }, + { + "id": "notifuse", + "name": "Notifuse", + "version": "latest", + "description": "Open-source newsletter and notification platform that empowers teams to create, send, and track communications at scale.", + "logo": "logo.png", + "links": { + "github": "https://github.com/notifuse/notifuse", + "website": "https://notifuse.com/", + "docs": "https://docs.notifuse.com/" + }, + "tags": [ + "newsletter", + "email", + "communication", + "notifications" + ] + }, { "id": "ntfy", "name": "NTFY",