diff --git a/app/src/components/TemplateDialog.tsx b/app/src/components/TemplateDialog.tsx index 89e08933..b1e9b2f0 100644 --- a/app/src/components/TemplateDialog.tsx +++ b/app/src/components/TemplateDialog.tsx @@ -55,7 +55,9 @@ const TemplateDialog: React.FC = ({ config: templateFiles.config || "", }; - return btoa(JSON.stringify(configObj, null, 2)); + // Use encodeURIComponent to handle Unicode characters properly + const jsonString = JSON.stringify(configObj, null, 2); + return btoa(unescape(encodeURIComponent(jsonString))); }; return ( diff --git a/app/src/components/TemplateGrid.tsx b/app/src/components/TemplateGrid.tsx index 5269c6fb..8f51dd69 100644 --- a/app/src/components/TemplateGrid.tsx +++ b/app/src/components/TemplateGrid.tsx @@ -120,7 +120,6 @@ const TemplateGrid: React.FC = ({ view }) => { return matchesSearch && matchesTags; }); - console.log("ffiltered tem", filtered.length); setTemplatesCount(filtered.length); setFilteredTemplates(filtered); }, [searchQuery, selectedTags]); diff --git a/blueprints/kener/docker-compose.yml b/blueprints/kener/docker-compose.yml new file mode 100644 index 00000000..01f9a689 --- /dev/null +++ b/blueprints/kener/docker-compose.yml @@ -0,0 +1,39 @@ +version: "3.8" + +services: + kener: + image: rajnandan1/kener:latest + environment: + - TZ=${TZ} + - KENER_SECRET_KEY=${KENER_SECRET_KEY} # 🔐 API key / secret + - DATABASE_URL=${DATABASE_URL} + - KENER_BASE_PATH=${KENER_BASE_PATH} + - ORIGIN=${ORIGIN} + - RESEND_API_KEY=${RESEND_API_KEY} # 🔐 API key + - RESEND_SENDER_EMAIL=${RESEND_SENDER_EMAIL} + ports: + - 3000 + volumes: + - kener_db:/app/database + - ../files/uploads:/app/uploads + restart: unless-stopped + + postgres: + image: postgres:alpine + environment: + - POSTGRES_USER=${POSTGRES_USER} + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} # 🔐 DB password + - POSTGRES_DB=${POSTGRES_DB} + restart: unless-stopped + + mysql: + image: mariadb:11 + environment: + - MYSQL_USER=${MYSQL_USER} + - MYSQL_PASSWORD=${MYSQL_PASSWORD} # 🔐 DB password + - MYSQL_DATABASE=${MYSQL_DATABASE} + - MYSQL_RANDOM_ROOT_PASSWORD=true + restart: unless-stopped + +volumes: + kener_db: {} diff --git a/blueprints/kener/image.png b/blueprints/kener/image.png new file mode 100644 index 00000000..19b6230b Binary files /dev/null and b/blueprints/kener/image.png differ diff --git a/blueprints/kener/template.toml b/blueprints/kener/template.toml new file mode 100644 index 00000000..916f987e --- /dev/null +++ b/blueprints/kener/template.toml @@ -0,0 +1,37 @@ +[variables] +main_domain = "${domain}" +KENER_SECRET_KEY = "${password:64}" +POSTGRES_PASSWORD = "${password:32}" +MYSQL_PASSWORD = "${password:32}" + +[config] +[[config.domains]] +serviceName = "kener" +port = 3000 +host = "${main_domain}" + +[config.env] +TZ = "Etc/UTC" +KENER_SECRET_KEY = "${KENER_SECRET_KEY}" # 🔐 API key / secret +DATABASE_URL = "sqlite://./database/kener.sqlite.db" +KENER_BASE_PATH = "" +ORIGIN = "http://localhost:3000" +RESEND_API_KEY = "" +RESEND_SENDER_EMAIL = "Accounts " +POSTGRES_USER = "user" +POSTGRES_DB = "kener_db" +MYSQL_USER = "user" +MYSQL_DATABASE = "kener_db" +MYSQL_RANDOM_ROOT_PASSWORD = "true" +MYSQL_PASSWORD = "${MYSQL_PASSWORD}" # 🔐 DB password +POSTGRES_PASSWORD = "${POSTGRES_PASSWORD}" # 🔐 DB password + +[[config.mounts]] +type = "volume" +source = "kener_db" +target = "/app/database" + +[[config.mounts]] +type = "bind" +source = "../files/uploads" +target = "/app/uploads" diff --git a/meta.json b/meta.json index adce1e24..b2da5a70 100644 --- a/meta.json +++ b/meta.json @@ -2571,6 +2571,19 @@ }, "tags": ["link-shortener", "link-sharing"] }, + { + "id": "kener", + "name": "Kener", + "version": "latest", + "description": "Kener is an open-source status page system for monitoring and alerting. It provides a modern interface for tracking service uptime and sending notifications.", + "logo": "image.png", + "links": { + "github": "https://github.com/rajnandan1/kener", + "website": "https://kener.ing/", + "docs": "https://kener.ing/docs/" + }, + "tags": ["monitoring", "status-page", "alerting", "self-hosted"] + }, { "id": "palmr", "name": "Palmr",