From 22a960799cee2f750eabdac7b58e09ca74575a0e Mon Sep 17 00:00:00 2001 From: eric Date: Mon, 8 Jun 2026 02:24:55 -0500 Subject: [PATCH] Add ntfy push and Listmonk newsletter with lightweight Docker deploy tooling. Co-authored-by: Cursor --- .env.example | 12 ++ app/[locale]/city/[slug]/page.tsx | 3 + app/[locale]/meetups/page.tsx | 13 +++ app/[locale]/settings/notifications/page.tsx | 23 +++- app/components/NewsletterSubscribe.tsx | 97 ++++++++++++++++ app/lib/listmonk.ts | 6 + app/lib/meetups.ts | 1 + app/lib/ntfy.ts | 5 + backend/integrations.py | 41 +++++++ backend/main.py | 59 +++++++++- backend/ntfy_push.py | 105 ++++++++++++++++++ backend/settings.py | 25 +++++ config/remote-services.ts | 2 + docker/integrations/README.md | 47 ++++++++ docker/integrations/daemon.json.cn | 9 ++ docker/integrations/docker-compose.yml | 43 +++++++ docker/integrations/init-dbs.sql | 1 + .../nginx/listmonk.nomadro.cn.conf | 50 +++++++++ .../integrations/nginx/ntfy.nomadro.cn.conf | 54 +++++++++ docker/integrations/pull-images-cn.sh | 22 ++++ scripts/ssh-cleanup-heavy.py | 55 +++++++++ scripts/ssh-fix-ntfy.py | 76 +++++++++++++ scripts/ssh-git-pull-prod.py | 55 +++++++++ scripts/ssh-restart-listmonk.py | 45 ++++++++ 24 files changed, 846 insertions(+), 3 deletions(-) create mode 100644 app/components/NewsletterSubscribe.tsx create mode 100644 app/lib/listmonk.ts create mode 100644 app/lib/ntfy.ts create mode 100644 backend/integrations.py create mode 100644 backend/ntfy_push.py create mode 100644 docker/integrations/README.md create mode 100644 docker/integrations/daemon.json.cn create mode 100644 docker/integrations/docker-compose.yml create mode 100644 docker/integrations/init-dbs.sql create mode 100644 docker/integrations/nginx/listmonk.nomadro.cn.conf create mode 100644 docker/integrations/nginx/ntfy.nomadro.cn.conf create mode 100644 docker/integrations/pull-images-cn.sh create mode 100644 scripts/ssh-cleanup-heavy.py create mode 100644 scripts/ssh-fix-ntfy.py create mode 100644 scripts/ssh-git-pull-prod.py create mode 100644 scripts/ssh-restart-listmonk.py diff --git a/.env.example b/.env.example index 02710b4..bc822d3 100644 --- a/.env.example +++ b/.env.example @@ -54,3 +54,15 @@ DEV_AUTO_PAY=true # 视频会议 / 群聊 NEXT_PUBLIC_MIROTALK_URL=https://mirotalk.nomadro.cn NEXT_PUBLIC_LOUNGE_URL=https://lounge.nomadro.cn + +# 邮件通讯(Listmonk,Go 轻量服务) +NEXT_PUBLIC_LISTMONK_URL=https://listmonk.nomadro.cn +LISTMONK_API_URL=https://listmonk.nomadro.cn +LISTMONK_API_KEY= +LISTMONK_DEFAULT_LIST_IDS=1 + +# 手机推送(ntfy,Go 轻量服务) +NEXT_PUBLIC_NTFY_URL=https://ntfy.nomadro.cn +NTFY_URL=https://ntfy.nomadro.cn +NTFY_ENABLED=true +NTFY_AUTH_TOKEN= diff --git a/app/[locale]/city/[slug]/page.tsx b/app/[locale]/city/[slug]/page.tsx index f337fd6..074c489 100644 --- a/app/[locale]/city/[slug]/page.tsx +++ b/app/[locale]/city/[slug]/page.tsx @@ -3,6 +3,7 @@ import { use, useEffect, useMemo, useState } from "react"; import { Link } from "@/i18n/navigation"; import Footer from "@/app/components/Footer"; +import NewsletterSubscribe from "@/app/components/NewsletterSubscribe"; import { apiFetch } from "@/app/lib/api-client"; interface CityGuide { @@ -377,6 +378,8 @@ export default function CityGuidePage({ params }: { params: Promise<{ slug: stri + +
{c.chatHint}

)} + {meetup.replayUrl ? ( + + {locale === "zh" ? "观看活动回放" : "Watch replay"} + + ) : null} {embedOpen && canJoin && (