mirror of
				https://github.com/louislam/uptime-kuma.git
				synced 2025-10-31 11:29:20 +08:00 
			
		
		
		
	Merge branch 'master' into feature/#2365-allow-markdown-in-status-page-footer
This commit is contained in:
		
							
								
								
									
										2
									
								
								.github/workflows/auto-test.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/auto-test.yml
									
									
									
									
										vendored
									
									
								
							| @@ -18,7 +18,7 @@ jobs: | ||||
|     strategy: | ||||
|       matrix: | ||||
|         os: [macos-latest, ubuntu-latest, windows-latest] | ||||
|         node: [ 14, 16, 17, 18 ] | ||||
|         node: [ 14, 16, 18, 19 ] | ||||
|         # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ | ||||
|  | ||||
|     steps: | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| # Project Info | ||||
|  | ||||
| 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: | ||||
|   | ||||
							
								
								
									
										16
									
								
								docker/builder-go.dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								docker/builder-go.dockerfile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| ############################################ | ||||
| # Build in Golang | ||||
| # Run npm run build-healthcheck-armv7 in the host first, another it will be super slow where it is building the armv7 healthcheck | ||||
| ############################################ | ||||
| FROM golang:1.19.4-buster | ||||
| WORKDIR /app | ||||
| ARG TARGETPLATFORM | ||||
| COPY ./extra/ ./extra/ | ||||
|  | ||||
| # Compile healthcheck.go | ||||
| RUN apt update && \ | ||||
|     apt --yes --no-install-recommends install curl && \ | ||||
|     curl -sL https://deb.nodesource.com/setup_18.x | bash && \ | ||||
|     apt --yes --no-install-recommends install nodejs && \ | ||||
|     node ./extra/build-healthcheck.js $TARGETPLATFORM && \ | ||||
|     apt --yes remove nodejs | ||||
| @@ -1,19 +1,9 @@ | ||||
| ############################################ | ||||
| # Build in Golang | ||||
| # Run npm run build-healthcheck-armv7 in the host first, another it will be super slow where it is building the armv7 healthcheck | ||||
| # Check file: builder-go.dockerfile | ||||
| ############################################ | ||||
| FROM golang:1.19.4-buster AS build_healthcheck | ||||
| WORKDIR /app | ||||
| ARG TARGETPLATFORM | ||||
| COPY ./extra/ ./extra/ | ||||
|  | ||||
| # Compile healthcheck.go | ||||
| RUN apt update | ||||
| RUN apt --yes --no-install-recommends install curl | ||||
| RUN curl -sL https://deb.nodesource.com/setup_18.x | bash | ||||
| RUN apt --yes --no-install-recommends install nodejs | ||||
| RUN node -v | ||||
| RUN node ./extra/build-healthcheck.js $TARGETPLATFORM | ||||
| FROM louislam/uptime-kuma:builder-go AS build_healthcheck | ||||
|  | ||||
| ############################################ | ||||
| # Build in Node.js | ||||
| @@ -22,10 +12,13 @@ FROM louislam/uptime-kuma:base-debian AS build | ||||
| WORKDIR /app | ||||
|  | ||||
| ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1 | ||||
| COPY .npmrc .npmrc | ||||
| COPY package.json package.json | ||||
| COPY package-lock.json package-lock.json | ||||
| RUN npm ci --omit=dev | ||||
| COPY . . | ||||
| COPY --from=build_healthcheck /app/extra/healthcheck /app/extra/healthcheck | ||||
| RUN npm ci --production && \ | ||||
|     chmod +x /app/extra/entrypoint.sh | ||||
| RUN chmod +x /app/extra/entrypoint.sh | ||||
|  | ||||
| ############################################ | ||||
| # ⭐ Main Image | ||||
|   | ||||
| @@ -3,10 +3,12 @@ WORKDIR /app | ||||
|  | ||||
| ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1 | ||||
|  | ||||
| COPY .npmrc .npmrc | ||||
| COPY package.json package.json | ||||
| COPY package-lock.json package-lock.json | ||||
| RUN npm ci --omit=dev | ||||
| COPY . . | ||||
| RUN npm ci --production && \ | ||||
|     chmod +x /app/extra/entrypoint.sh | ||||
|  | ||||
| RUN chmod +x /app/extra/entrypoint.sh | ||||
|  | ||||
| FROM louislam/uptime-kuma:base-alpine AS release | ||||
| WORKDIR /app | ||||
|   | ||||
| @@ -1,3 +1,7 @@ | ||||
| /* | ||||
|  * If changed, have to run `npm run build-docker-builder-go`. | ||||
|  * This script should be run after a period of time (180s), because the server may need some time to prepare. | ||||
|  */ | ||||
| package main | ||||
|  | ||||
| import ( | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "uptime-kuma", | ||||
|     "version": "1.19.3", | ||||
|     "version": "1.19.4", | ||||
|     "license": "MIT", | ||||
|     "repository": { | ||||
|         "type": "git", | ||||
| @@ -31,6 +31,7 @@ | ||||
|         "build-docker": "npm run build && npm run build-docker-debian && npm run build-docker-alpine", | ||||
|         "build-docker-alpine-base": "docker buildx build -f docker/alpine-base.dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:base-alpine . --push", | ||||
|         "build-docker-debian-base": "docker buildx build -f docker/debian-base.dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:base-debian . --push", | ||||
|         "build-docker-builder-go": "docker buildx build -f docker/builder-go.dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:builder-go . --push", | ||||
|         "build-docker-alpine": "node ./extra/env2arg.js docker buildx build -f docker/dockerfile-alpine --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:alpine -t louislam/uptime-kuma:1-alpine -t louislam/uptime-kuma:$VERSION-alpine --target release . --push", | ||||
|         "build-docker-debian": "node ./extra/env2arg.js docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma -t louislam/uptime-kuma:1 -t louislam/uptime-kuma:$VERSION -t louislam/uptime-kuma:debian -t louislam/uptime-kuma:1-debian -t louislam/uptime-kuma:$VERSION-debian --target release . --push", | ||||
|         "build-docker-nightly": "npm run build && docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly --target nightly . --push", | ||||
| @@ -38,7 +39,7 @@ | ||||
|         "build-docker-nightly-amd64": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain", | ||||
|         "build-docker-pr-test": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64 -t louislam/uptime-kuma:pr-test --target pr-test . --push", | ||||
|         "upload-artifacts": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:upload-artifact --build-arg VERSION --build-arg GITHUB_TOKEN --target upload-artifact . --progress plain", | ||||
|         "setup": "git checkout 1.19.3 && npm ci --production && npm run download-dist", | ||||
|         "setup": "git checkout 1.19.4 && npm ci --production && npm run download-dist", | ||||
|         "download-dist": "node extra/download-dist.js", | ||||
|         "mark-as-nightly": "node extra/mark-as-nightly.js", | ||||
|         "reset-password": "node extra/reset-password.js", | ||||
|   | ||||
| @@ -25,15 +25,20 @@ const DEFAULT_KEEP_PERIOD = 180; | ||||
|         parsedPeriod = DEFAULT_KEEP_PERIOD; | ||||
|     } | ||||
|  | ||||
|     log(`Clearing Data older than ${parsedPeriod} days...`); | ||||
|     if (parsedPeriod < 1) { | ||||
|         log(`Data deletion has been disabled as period is less than 1. Period is ${parsedPeriod} days.`); | ||||
|     } else { | ||||
|  | ||||
|     try { | ||||
|         await R.exec( | ||||
|             "DELETE FROM heartbeat WHERE time < DATETIME('now', '-' || ? || ' days') ", | ||||
|             [ parsedPeriod ] | ||||
|         ); | ||||
|     } catch (e) { | ||||
|         log(`Failed to clear old data: ${e.message}`); | ||||
|         log(`Clearing Data older than ${parsedPeriod} days...`); | ||||
|  | ||||
|         try { | ||||
|             await R.exec( | ||||
|                 "DELETE FROM heartbeat WHERE time < DATETIME('now', '-' || ? || ' days') ", | ||||
|                 [ parsedPeriod ] | ||||
|             ); | ||||
|         } catch (e) { | ||||
|             log(`Failed to clear old data: ${e.message}`); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     exit(); | ||||
|   | ||||
| @@ -10,7 +10,7 @@ class Pushover extends NotificationProvider { | ||||
|         let pushoverlink = "https://api.pushover.net/1/messages.json"; | ||||
|  | ||||
|         let data = { | ||||
|             "message": "<b>Uptime Kuma Alert</b>\n\n<b>Message</b>:" + msg, | ||||
|             "message": "<b>Message</b>:" + msg, | ||||
|             "user": notification.pushoveruserkey, | ||||
|             "token": notification.pushoverapptoken, | ||||
|             "sound": notification.pushoversounds, | ||||
|   | ||||
| @@ -7,6 +7,7 @@ | ||||
|                         settings.keepDataPeriodDays, | ||||
|                     ]) | ||||
|                 }} | ||||
|                 {{ $t("infiniteRetention") }} | ||||
|             </label> | ||||
|             <input | ||||
|                 id="keepDataPeriodDays" | ||||
| @@ -14,9 +15,12 @@ | ||||
|                 type="number" | ||||
|                 class="form-control" | ||||
|                 required | ||||
|                 min="1" | ||||
|                 min="0" | ||||
|                 step="1" | ||||
|             /> | ||||
|             <div v-if="settings.keepDataPeriodDays < 0" class="form-text"> | ||||
|                 {{ $t("dataRetentionTimeError") }} | ||||
|             </div> | ||||
|         </div> | ||||
|         <div class="my-4"> | ||||
|             <button class="btn btn-primary" type="button" @click="saveSettings()"> | ||||
|   | ||||
| @@ -669,4 +669,10 @@ export default { | ||||
|     "General Monitor Type": "Общ тип монитор", | ||||
|     "Passive Monitor Type": "Пасивет тип монитор", | ||||
|     "Specific Monitor Type": "Специфичен тип монитор", | ||||
|     ZohoCliq: "ZohoCliq", | ||||
|     wayToGetZohoCliqURL: "Можете да научите как се създава URL адрес за уеб кука {0}.", | ||||
|     Kook: "Kook", | ||||
|     wayToGetKookBotToken: "Създайте приложение и вземете вашия бот токен на {0}", | ||||
|     wayToGetKookGuildID: "Превключете в 'Developer Mode' в 'Kook' настройките, след което десен клик върху 'guild' за да вземете неговото 'ID'", | ||||
|     "Guild ID": "Guild ID", | ||||
| }; | ||||
|   | ||||
| @@ -676,4 +676,6 @@ export default { | ||||
|     "Passive Monitor Type": "Passive Monitor Type", | ||||
|     "Specific Monitor Type": "Specific Monitor Type", | ||||
|     markdownSupported: "Markdown syntax supported", | ||||
|     dataRetentionTimeError: "Retention period must be 0 or greater", | ||||
|     infiniteRetention: "Set to 0 for infinite retention.", | ||||
| }; | ||||
|   | ||||
| @@ -209,6 +209,7 @@ export default { | ||||
|     here: "ici", | ||||
|     Required: "Requis", | ||||
|     telegram: "Telegram", | ||||
|     "ZohoCliq": "ZohoCliq", | ||||
|     "Bot Token": "Jeton du robot", | ||||
|     wayToGetTelegramToken: "Vous pouvez obtenir un token depuis {0}.", | ||||
|     "Chat ID": "Chat ID", | ||||
| @@ -240,7 +241,8 @@ export default { | ||||
|     "Hello @everyone is...": "Bonjour {'@'}everyone il...", | ||||
|     teams: "Microsoft Teams", | ||||
|     "Webhook URL": "URL vers le webhook", | ||||
|     wayToGetTeamsURL: "Vous pouvez apprendre comment créer un Webhook {0}.", | ||||
|     wayToGetTeamsURL: "Vous pouvez apprendre comment créer une URL Webhook {0}.", | ||||
|     wayToGetZohoCliqURL: "Vous pouvez apprendre comment créer une URL Webhook {0}.", | ||||
|     signal: "Signal", | ||||
|     Number: "Numéro", | ||||
|     Recipients: "Destinataires", | ||||
| @@ -270,6 +272,10 @@ export default { | ||||
|     apprise: "Apprise (prend en charge plus de 50 services de notification)", | ||||
|     GoogleChat: "Google Chat (Google Workspace uniquement)", | ||||
|     pushbullet: "Pushbullet", | ||||
|     Kook: "Kook", | ||||
|     wayToGetKookBotToken: "Créez une application et récupérer le jeton de robot à l'addresse {0}", | ||||
|     wayToGetKookGuildID: "Passez en « mode développeur » dans les paramètres de Kook, et cliquez droit sur le Guild pour obtenir son identifiant", | ||||
|     "Guild ID": "Identifiant de Guild", | ||||
|     line: "Line Messenger", | ||||
|     mattermost: "Mattermost", | ||||
|     "User Key": "Clé d'utilisateur", | ||||
|   | ||||
| @@ -189,14 +189,36 @@ export default { | ||||
|          * @param {string} [currentPassword] Only need for disableAuth to true | ||||
|          */ | ||||
|         saveSettings(callback, currentPassword) { | ||||
|             this.$root.getSocket().emit("setSettings", this.settings, currentPassword, (res) => { | ||||
|                 this.$root.toastRes(res); | ||||
|                 this.loadSettings(); | ||||
|             let valid = this.validateSettings(); | ||||
|             if (valid.success) { | ||||
|                 this.$root.getSocket().emit("setSettings", this.settings, currentPassword, (res) => { | ||||
|                     this.$root.toastRes(res); | ||||
|                     this.loadSettings(); | ||||
|  | ||||
|                 if (callback) { | ||||
|                     callback(); | ||||
|                 } | ||||
|             }); | ||||
|                     if (callback) { | ||||
|                         callback(); | ||||
|                     } | ||||
|                 }); | ||||
|             } else { | ||||
|                 this.$root.toastError(valid.msg); | ||||
|             } | ||||
|         }, | ||||
|  | ||||
|         /** | ||||
|          * Ensure settings are valid | ||||
|          * @returns {Object} Contains success state and error msg | ||||
|          */ | ||||
|         validateSettings() { | ||||
|             if (this.settings.keepDataPeriodDays < 0) { | ||||
|                 return { | ||||
|                     success: false, | ||||
|                     msg: this.$t("dataRetentionTimeError"), | ||||
|                 }; | ||||
|             } | ||||
|             return { | ||||
|                 success: true, | ||||
|                 msg: "", | ||||
|             }; | ||||
|         }, | ||||
|     } | ||||
| }; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user