简介

一个All-in-one的项目,集成了uptime-kuma+ nezha + umami 的功能的超强应用.

项目地址

https://github.com/msgbyte/tianji

预览

2025-03-16T08:08:01.png

部署

使用 docker compose 的方式来部署

mkdir /home/tianji
cd /home/tianji
vi docker-compose.yaml

docker-compose.yaml的内容如下

services:
tianji:
image: moonrailgun/tianji
ports:
- "12345:12345"
environment:
DATABASE_URL: postgresql://tianji:tianji@postgres:5432/tianji
JWT_SECRET: replace-me-with-a-random-string
ALLOW_REGISTER: "false"
ALLOW_OPENAPI: "true"
depends_on:
- postgres
restart: always
postgres:
image: postgres:15.4-alpine
environment:
POSTGRES_DB: tianji
POSTGRES_USER: tianji
POSTGRES_PASSWORD: tianji
volumes:
- ./tianji-db-data:/var/lib/postgresql/data
restart: always
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
interval: 5s
timeout: 5s
retries: 5

运行容器

Terminal window
docker compose up -d

默认密码

Url: http://<your-ip>:12345
Default username: admin
Default password: admin

监控

https://0tz.top/status/imsun 可以使用一个小徽章显示状态

遥测

在页面插入一张图片就可以侦测到访问量,但是只能显示 pv 浏览量

多用户

没错,Tianji是支持多用户使用的,若是有想体验的朋友可以留言,我可以发送邀请.

通知

可以支持多种通知方式

访客统计

从木木老师那里得到灵感,使用API获取网站的统计数据并使用js 调用,替代Umami.

在后台获取token websiteID workspaceID

然后使用Cloudflare Workers来保护token. 新建一个workers,填入以下代码(需要修改的部分已经标注出来)

addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
const tianji = 'https://tianji.top'; #自行修改
const token = 'sk_cf38cfb0bcb22d****'; #自行修改
const workspaceID = 'clnzoxcy10001vy2ohi4obbi0'; #自行修改
const websiteID = 'cm3sj40cs00018n2ezrgbdl5w'; #自行修改
async function handleRequest(request) {
const url = `${tianji}/open/workspace/${workspaceID}/website/${websiteID}/stats`;
// 获取当前时间的 Unix 时间戳(以毫秒为单位)
const now = Date.now();
// 设置查询参数
const params = new URLSearchParams({
startAt: '1704067200000', // 2024年1月1日的 Unix 时间戳(毫秒)
endAt: now.toString()
});
const fullUrl = `${url}?${params.toString()}`;
const headers = new Headers({
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
});
const response = await fetch(fullUrl, {
method: 'GET',
headers: headers
});
const corsHeaders = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type, Authorization'
};
if (request.method === 'OPTIONS') {
return new Response(null, {
headers: corsHeaders
});
}
if (response.ok) {
const data = await response.json();
return new Response(JSON.stringify(data), {
headers: {
'Content-Type': 'application/json',
...corsHeaders
}
});
} else {
return new Response(`Failed to fetch data: ${response.status} ${response.statusText}`, {
status: response.status,
headers: corsHeaders
});
}
}

startAt 的值 是某时间的unix时间戳 可以自行设置查询范围

调用

使用html+js调用

👣<p>本站到访<span id="uniques">0</span>位朋友.</p><p>共浏览页面<span id="pageviews">0</span>次</p>
<script>
// 定义 API URL
const apiUrl = 'https://tj.imsun.org';
fetch(apiUrl)
.then(response => {
if (!response.ok) {
throw new Error('error');
}
return response.json();
})
.then(data => {
const pageviewsElement = document.getElementById('pageviews');
const uniquesElement = document.getElementById('uniques');
pageviewsElement.textContent = data.pageviews.value;
uniquesElement.textContent = data.uniques.value;
})
.catch(error => {
console.error('获取数据时出现问题:', error);
});
</script>

其他

还有其他很多功能,等待摸索

本文作者:浪子 @ 提剑追梦

本文链接:https://blog.imsun.org/blog/1690/

本文标题:Tianji - 一个集成 网站分析 + 上线监控 + 服务器状态 的应用

本文版权:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!