First of all, thank you everyone who made pull requests for Uptime Kuma, I never thought GitHub Community can be that nice! And also because of this, I also never thought other people actually read my code and edit my code. It is not structured and commented so well, lol. Sorry about that.
First of all, I want to thank everyone who made pull requests for Uptime Kuma. I never thought the GitHub Community would be so nice! Because of this, I also never thought that other people would actually read and edit my code. It is not very well structured or commented, sorry about that.
The project was created with vite.js (vue3). Then I created a subdirectory called "server" for server part. Both frontend and backend share the same package.json.
@ -27,7 +27,7 @@ The frontend code build into "dist" directory. The server (express.js) exposes t
## Can I create a pull request for Uptime Kuma?
Yes or no, it depends on what you will try to do. Since I don't want to waste your time, be sure to **create an empty draft pull request or open an issue, so we can discuss first**. Especially for a large pull request or you don't know it will be merged or not.
Yes or no, it depends on what you will try to do. Since I don't want to waste your time, be sure to **create an empty draft pull request or open an issue, so we can have a discussion first**. Especially for a large pull request or you don't know it will be merged or not.
Here are some references:
@ -51,6 +51,10 @@ Here are some references:
- Convert existing code into other programming languages
- Unnecessary large code changes (Hard to review, causes code conflicts to other pull requests)
The above cases cannot cover all situations.
I (@louislam) have the final say. If your pull request does not meet my expectations, I will reject it, no matter how much time you spend on it. Therefore, it is essential to have a discussion beforehand.
I will mark your pull request in the [milestones](https://github.com/louislam/uptime-kuma/milestones), if I am plan to review and merge it.
Also, please don't rush or ask for ETA, because I have to understand the pull request, make sure it is no breaking changes and stick to my vision of this project, especially for large pull requests.
@ -73,9 +77,9 @@ Before deep into coding, discussion first is preferred. Creating an empty pull r
## Project Styles
I personally do not like something need to learn so much and need to config so much before you can finally start the app.
I personally do not like it when something requires so much learning and configuration before you can finally start the app.
- Easy to install for non-Docker users, no native build dependency is needed (at least for x86_64), no extra config, no extra effort to get it run
- Easy to install for non-Docker users, no native build dependency is needed (at least for x86_64), no extra config, no extra effort required to get it running
- Single container for Docker users, no very complex docker-compose file. Just map the volume and expose the port, then good to go
- Settings should be configurable in the frontend. Environment variable is not encouraged, unless it is related to startup such as `DATA_DIR`.
- Easy to use
@ -173,15 +177,11 @@ The data and socket logic are in `src/mixins/socket.js`.
## Unit Test
It is an end-to-end testing. It is using Jest and Puppeteer.
```bash
npm run build
npm test
```
By default, the Chromium window will be shown up during the test. Specifying `HEADLESS_TEST=1` for terminal environments.
## Dependencies
Both frontend and backend share the same package.json. However, the frontend dependencies are eventually not used in the production environment, because it is usually also baked into dist files. So:
"Sms template must contain parameters: ":"短信模板必须包含以下变量:",
"Bark Endpoint":"Bark 接入点",
"Bark Group":"Bark 群组",
"Bark Sound":"Bark 铃声",
DingDing:"钉钉自定义机器人",
WebHookUrl:"钉钉自定义机器人 Webhook 地址",
SecretKey:"钉钉自定义机器人加签密钥",
"For safety, must use secret key":"出于安全考虑,必须使用加签密钥",
"Device Token":"Apple Device Token",
Platform:"平台",
iOS:"iOS",
@ -418,21 +460,18 @@ export default {
High:"高",
Retry:"重试次数",
Topic:"Gorush Topic",
WeCom:"企业微信群机器人",
"WeCom Bot Key":"企业微信群机器人 Key",
"Setup Proxy":"设置代理",
"Proxy Protocol":"代理协议",
"Proxy Server":"代理服务器",
"Server Address":"服务器地址",
"Proxy server has authentication":"代理服务器启用了身份验证功能",
User:"用户名",
Installed:"已安装",
"Not installed":"未安装",
Running:"运行中",
"Not running":"未运行",
"Message:":"信息:",
wayToGetCloudflaredURL:"(可从 {0} 下载 cloudflared)",
cloudflareWebsite:"Cloudflare 网站",
"Don't know how to get the token? Please read the guide:":"不知道如何获取 Token?请阅读指南:",
"The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.":"如果您正在通过 Cloudflare Tunnel 访问网站,则停止可能会导致当前连接断开。您确定要停止吗?请输入密码以确认。",
"Other Software":"其他软件",
"For example: nginx, Apache and Traefik.":"例如:nginx、Apache 和 Traefik。",
"Please read":"请阅读",
"Remove Token":"移除 Token",
Start:"启动",
Stop:"停止",
@ -450,6 +489,18 @@ export default {
"New Status Page":"新的状态页",
"Page Not Found":"未找到该页面",
"Reverse Proxy":"反向代理",
Backup:"备份",
About:"关于",
wayToGetCloudflaredURL:"(可从 {0} 下载 cloudflared)",
cloudflareWebsite:"Cloudflare 网站",
"Message:":"信息:",
"Don't know how to get the token? Please read the guide:":"不知道如何获取 Token?请阅读指南:",
"The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.":"如果您正在通过 Cloudflare Tunnel 访问网站,则停止可能会导致当前连接断开。您确定要停止吗?请输入密码以确认。",
"HTTP Headers":"HTTP 头",
"Trust Proxy":"可信的代理类字段",
"Other Software":"其他软件",
"For example: nginx, Apache and Traefik.":"例如:nginx、Apache 和 Traefik。",
"Please read":"请阅读",
"Subject:":"颁发给:",
"Valid To:":"有效期至:",
"Days Remaining:":"剩余有效天数:",
@ -459,26 +510,28 @@ export default {
"Domain Name Expiry Notification":"域名到期时通知",
Proxy:"代理",
"Date Created":"创建于",
HomeAssistant:"Home Assistant",
onebotHttpAddress:"OneBot HTTP 地址",
onebotMessageType:"OneBot 消息类型",
onebotGroupMessage:"群聊",
onebotPrivateMessage:"私聊",
onebotUserOrGroupId:"群组/用户ID",
onebotUserOrGroupId:"群组/用户ID",
onebotSafetyTips:"出于安全原因,请务必设置 AccessToken",
topic:"Topic",
topicExplanation:"MQTT 传递给监控的 Topic",
successMessage:"成功时消息",
successMessageExplanation:"MQTT 成功时所传递的消息",
Customize:"自定义",
"Custom Footer":"自定义底部",
"Custom CSS":"自定义 CSS",
"PushDeer Key":"PushDeer Key",
"Footer Text":"底部自定义文本",
"Show Powered By":"显示 Powered By",
"Domain Names":"域名",
signedInDisp:"当前用户: {0}",
signedInDispDisabled:"已禁用身份验证",
RadiusSecret:"Radius 共享机密",
RadiusSecretDescription:"客户端和服务器之间共享的密钥",
RadiusCalledStationId:"NAS 网络访问服务器号码(Called Station Id)",
RadiusCalledStationIdDescription:"所访问的服务器的标识",
RadiusCallingStationId:"呼叫方号码(Calling Station Id)",
RadiusCallingStationIdDescription:"发出请求的设备的标识",
"Certificate Expiry Notification":"证书到期时通知",
"API Username":"API 凭证 Username",
"API Key":"API 凭证 Key",
"API Username":"API Username",
"API Key":"API Key",
"Recipient Number":"收件人手机号码",
"From Name/Number":"发件人名称/手机号码",
"Leave blank to use a shared sender number.":"留空以使用平台共享的发件人手机号码",
@ -526,38 +579,11 @@ export default {
"Retype the address.":"重新输入地址;",
"Go back to the previous page.":"返回到上一页面。",
"Coming Soon":"即将推出",
wayToGetClickSendSMSToken:"您可以从 {0} 获取 API 凭证 Username 和 凭证 Key。",