diff --git a/README.md b/README.md deleted file mode 100644 index 242284c..0000000 --- a/README.md +++ /dev/null @@ -1,47 +0,0 @@ -# ✔[UptimeFlare](https://github.com/lyc8503/UptimeFlare) - -A more advanced, serverless, and free uptime monitoring & status page solution, powered by Cloudflare Workers, complete with a user-friendly interface. - -## ⭐Features -- Open-source, easy to deploy (in under 10 minutes, no local tools required), and free -- Monitoring capabilities - - Up to 50 checks at 1-minute intervals - - Geo-specific checks from over [310 cities](https://www.cloudflare.com/network/) worldwide - - Support for HTTP/HTTPS/TCP port monitoring - - Up to 90-day uptime history and uptime percentage tracking - - Customizable request methods, headers, and body for HTTP(s) - - Custom status code & keyword checks for HTTP(s) - - Downtime notification supporting [100+ notification channels](https://github.com/caronc/apprise/wiki) - - Customizable Webhook -- Status page - - Interactive ping (response time) chart for all types of monitors - - Responsive UI that adapts to your system theme - - Customizable status page - - Use your own domain with CNAME - -## 👀Demo - -My status page (Online demo): https://uptimeflare.pages.dev/ - -Some screenshots: - -![Desktop, Light theme](docs/desktop.png) - -## ⚡Quickstart / 📄Documentation - -Please refer to [Wiki](https://github.com/lyc8503/UptimeFlare/wiki) - -## New features (TODOs) - -- [x] Specify region for monitors -- [x] TCP `opened` promise -- [x] Use apprise to support various notification channels -- [x] ~~Telegram example~~ -- [x] ~~[Bark](https://bark.day.app) example~~ -- [x] ~~Email notification via Cloudflare Email Workers~~ -- [x] Improve docs by providing simple examples -- [x] Notification grace period -- [ ] SSL certificate checks -- [ ] Self-host Dockerfile -- [ ] Incident timeline -- [x] Remove old incidents diff --git a/components/DetailBar.tsx b/components/DetailBar.tsx index 6be4377..bd3ce78 100644 --- a/components/DetailBar.tsx +++ b/components/DetailBar.tsx @@ -49,7 +49,7 @@ export default function DetailBar({ key={i} label={ Number.isNaN(Number(dayPercent)) ? ( - 'No Data' + '无数据' ) : ( <>
{dayPercent + '%'}
diff --git a/components/DetailChart.tsx b/components/DetailChart.tsx index c6c45e6..53979d5 100644 --- a/components/DetailChart.tsx +++ b/components/DetailChart.tsx @@ -76,7 +76,7 @@ export default function DetailChart({ }, title: { display: true, - text: 'Response times(ms)', + text: '响应时间(ms)', align: 'start' as const, }, }, diff --git a/components/Header.tsx b/components/Header.tsx index 2b1be33..5a3beaa 100644 --- a/components/Header.tsx +++ b/components/Header.tsx @@ -21,10 +21,7 @@ export default function Header() {
- - - 🕒 - + - UptimeFlare + 凌云·LinYun 状态监控
diff --git a/components/MonitorDetail.tsx b/components/MonitorDetail.tsx index 2944360..1d6beed 100644 --- a/components/MonitorDetail.tsx +++ b/components/MonitorDetail.tsx @@ -19,11 +19,10 @@ export default function MonitorDetail({ {monitor.name} - No data available, please make sure you have deployed your workers with latest config and - check your worker status! + 没有可用的数据。请确保您已使用最新配置部署了Workers,并检查Workers状态! - ) + )Workers const statusIcon = state.incident[monitor.id].slice(-1)[0].end === undefined ? ( @@ -65,7 +64,7 @@ export default function MonitorDetail({ )} - Overall: {uptimePercent}% + 在线率: {uptimePercent}% diff --git a/components/OverallStatus.tsx b/components/OverallStatus.tsx index 72252d6..0ce3685 100644 --- a/components/OverallStatus.tsx +++ b/components/OverallStatus.tsx @@ -29,14 +29,14 @@ export default function OverallStatus({ let statusString = '' let icon = if (state.overallUp === 0 && state.overallDown === 0) { - statusString = 'No data yet' + statusString = '暂无数据' } else if (state.overallUp === 0) { - statusString = 'All systems not operational' + statusString = '所有系统均未正常运转' } else if (state.overallDown === 0) { - statusString = 'All systems operational' + statusString = '所有系统均正常运转' icon = } else { - statusString = `Some systems not operational (${state.overallDown} out of ${state.overallUp + state.overallDown})` + statusString = `部分系统未正常运转(${state.overallDown}个异常,共计${state.overallUp + state.overallDown}个)` } const [openTime] = useState(Math.round(Date.now() / 1000)) @@ -65,8 +65,8 @@ export default function OverallStatus({ {statusString} - Last updated on:{' '} - {`${new Date(state.lastUpdate * 1000).toLocaleString()} (${currentTime - state.lastUpdate} sec ago)`} + 上次更新时间:{' '} + {`${new Date(state.lastUpdate * 1000).toLocaleString()} (${currentTime - state.lastUpdate} 秒之前)`} ) diff --git a/docs/desktop.png b/docs/desktop.png deleted file mode 100644 index d90c359..0000000 Binary files a/docs/desktop.png and /dev/null differ diff --git a/pages/_document.tsx b/pages/_document.tsx index 83374be..f2da75c 100644 --- a/pages/_document.tsx +++ b/pages/_document.tsx @@ -3,7 +3,7 @@ import { ColorSchemeScript } from '@mantine/core' export default function Document() { return ( - + diff --git a/pages/index.tsx b/pages/index.tsx index 1becbac..8369593 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -73,19 +73,23 @@ export default function Home({ - Open-source monitoring and status page powered by{' '} + 由开源项目{' '} Uptimeflare {' '} - and{' '} + 和{' '} Cloudflare - , made with ❤ by{' '} + 强力驱动,项目由{' '} lyc8503 - . + 制作,此副本由{' '} + + wuyuhanzijin + + 汉化 diff --git a/public/favicon.ico b/public/favicon.ico index 718d6fe..e4052cf 100644 Binary files a/public/favicon.ico and b/public/favicon.ico differ diff --git a/uptime.config.ts b/uptime.config.ts index 00be288..12c51b8 100644 --- a/uptime.config.ts +++ b/uptime.config.ts @@ -1,77 +1,42 @@ const pageConfig = { - // Title for your status page - title: "lyc8503's Status Page", - // Links shown at the header of your status page, could set `highlight` to `true` + title: "凌云·LinYun 服务状态", links: [ - { link: 'https://github.com/lyc8503', label: 'GitHub' }, - { link: 'https://blog.lyc8503.net/', label: 'Blog' }, - { link: 'mailto:me@lyc8503.net', label: 'Email Me', highlight: true }, + { link: 'https://www.linyunlink.top/links/', label: '友情链接'}, + { link: 'https://www.linyunlink.top/', label: '博客', highlight: true }, ], } const workerConfig = { // Write KV at most every 3 minutes unless the status changed. - kvWriteCooldownMinutes: 3, + kvWriteCooldownMinutes: 10, // Define all your monitors here monitors: [ - // Example HTTP Monitor + // ==========[凌云服务监控]========== { - // `id` should be unique, history will be kept if the `id` remains constant - id: 'foo_monitor', - // `name` is used at status page and callback message - name: 'My API Monitor', - // `method` should be a valid HTTP Method + id: 'linyun_blog_monitor', + name: '凌云·LinYun 博客', + method: 'GET', + target: 'https://www.linyunlink.top/', + tooltip: '凌云·LinYun 博客', + statusPageLink: 'https://www.linyunlink.top/', + }, + { + id: 'linyun_twikoo_monitor', + name: '凌云·LinYun Twikoo评论系统', method: 'POST', - // `target` is a valid URL - target: 'https://example.com', - // [OPTIONAL] `tooltip` is ONLY used at status page to show a tooltip - tooltip: 'This is a tooltip for this monitor', - // [OPTIONAL] `statusPageLink` is ONLY used for clickable link at status page - statusPageLink: 'https://example.com', - // [OPTIONAL] `expectedCodes` is an array of acceptable HTTP response codes, if not specified, default to 2xx - expectedCodes: [200], - // [OPTIONAL] `timeout` in millisecond, if not specified, default to 10000 - timeout: 10000, - // [OPTIONAL] headers to be sent - headers: { - 'User-Agent': 'Uptimeflare', - Authorization: 'Bearer YOUR_TOKEN_HERE', - }, - // [OPTIONAL] body to be sent - body: 'Hello, world!', - // [OPTIONAL] if specified, the response must contains the keyword to be considered as operational. - responseKeyword: 'success', - // [OPTIONAL] if specified, the check will run in your specified region, - // refer to docs https://github.com/lyc8503/UptimeFlare/wiki/Geo-specific-checks-setup before setting this value - checkLocationWorkerRoute: 'https://xxx.example.com', + target: 'https://twikoo.linyunlink.top/', + tooltip: '凌云·LinYun Twikoo 评论服务后端', + statusPageLink: 'https://twikoo.linyunlink.top/', }, - // Example TCP Monitor { - id: 'test_tcp_monitor', - name: 'Example TCP Monitor', - // `method` should be `TCP_PING` for tcp monitors - method: 'TCP_PING', - // `target` should be `host:port` for tcp monitors - target: '1.2.3.4:22', - tooltip: 'My production server SSH', - statusPageLink: 'https://example.com', - timeout: 5000, - }, + id: 'linyun_image_monitor', + name: '凌云·LinYun 图片托管站', + method: 'GET', + target: 'https://image.linyunlink.top/', + tooltip: '凌云·LinYun 图片托管站', + statusPageLink: 'https://image.linyunlink.top/', + } ], - notification: { - // [Optional] apprise API server URL - // if not specified, no notification will be sent - appriseApiServer: "https://apprise.example.com/notify", - // [Optional] recipient URL for apprise, refer to https://github.com/caronc/apprise - // if not specified, no notification will be sent - recipientUrl: "tgram://bottoken/ChatID", - // [Optional] timezone used in notification messages, default to "Etc/GMT" - timeZone: "Asia/Shanghai", - // [Optional] grace period in minutes before sending a notification - // notification will be sent only if the monitor is down for N continuous checks after the initial failure - // if not specified, notification will be sent immediately - gracePeriod: 5, - }, callbacks: { onStatusChange: async ( env: any,