diff --git a/.dockerignore b/.dockerignore index 6e11b36b..4a63437a 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,5 +1,4 @@ /.idea -/dist /node_modules /data /out diff --git a/.github/ISSUE_TEMPLATE/ask-for-help.yaml b/.github/ISSUE_TEMPLATE/ask-for-help.yaml index dd1bcaf7..a1425c9c 100644 --- a/.github/ISSUE_TEMPLATE/ask-for-help.yaml +++ b/.github/ISSUE_TEMPLATE/ask-for-help.yaml @@ -62,8 +62,8 @@ body: - type: checkboxes id: no-duplicate-issues attributes: - label: "👀 Have you spent some time to check if this question has been raised before?" - description: "Please search in the issues without filters [here](https://github.com/louislam/uptime-kuma/issues?q=)" + label: "⚠️ Please verify that this question has NOT been raised before." + description: "Search in the issues sections by clicking [HERE](https://github.com/louislam/uptime-kuma/issues?q=)" options: - label: "I checked and didn't find similar question" required: true diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index 5e3b5bf8..81ea9a32 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -86,8 +86,8 @@ body: - type: checkboxes id: no-duplicate-issues attributes: - label: "👀 Have you spent some time to check if this issue has been raised before?" - description: "Please search in the issues without filters [here](https://github.com/louislam/uptime-kuma/issues?q=)" + label: "⚠️ Please verify that this bug has NOT been raised before." + description: "Search in the issues sections by clicking [HERE](https://github.com/louislam/uptime-kuma/issues?q=)" options: - label: "I checked and didn't find similar issue" required: true diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml index bca32552..1a3cebc0 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -52,8 +52,8 @@ body: - type: checkboxes id: no-duplicate-issues attributes: - label: "👀 Have you spent some time to check if this feature request has been raised before?" - description: "Please search in the issues without filters [here](https://github.com/louislam/uptime-kuma/issues?q=)" + label: "⚠️ Please verify that this feature request has NOT been suggested before." + description: "Search in the issues sections by clicking [HERE](https://github.com/louislam/uptime-kuma/issues?q=)" options: - label: "I checked and didn't find similar feature request" required: true diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c9f186df..b2efe3e0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -226,10 +226,11 @@ https://github.com/louislam/uptime-kuma/issues?q=sort%3Aupdated-desc 1. Draft a release note 1. Make sure the repo is cleared 1. `npm run update-version 1.X.X` +1. `npm run build` 1. `npm run build-docker` -1. git push +1. `git push` 1. Publish the release note as 1.X.X -1. npm run upload-artifacts +1. `npm run upload-artifacts` 1. SSH to demo site server and update to 1.X.X Checking: diff --git a/docker/dockerfile b/docker/dockerfile index e2a3725f..efbbfe6f 100644 --- a/docker/dockerfile +++ b/docker/dockerfile @@ -4,9 +4,7 @@ WORKDIR /app ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1 COPY . . -RUN npm ci && \ - npm run build && \ - npm ci --production && \ +RUN npm ci --production && \ chmod +x /app/extra/entrypoint.sh @@ -22,9 +20,11 @@ HEALTHCHECK --interval=60s --timeout=30s --start-period=180s --retries=5 CMD nod ENTRYPOINT ["/usr/bin/dumb-init", "--", "extra/entrypoint.sh"] CMD ["node", "server/server.js"] + FROM release AS nightly RUN npm run mark-as-nightly + # Upload the artifact to Github FROM louislam/uptime-kuma:base-debian AS upload-artifact WORKDIR / diff --git a/docker/dockerfile-alpine b/docker/dockerfile-alpine index e883031a..ab9255f9 100644 --- a/docker/dockerfile-alpine +++ b/docker/dockerfile-alpine @@ -4,9 +4,7 @@ WORKDIR /app ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1 COPY . . -RUN npm ci && \ - npm run build && \ - npm ci --production && \ +RUN npm ci --production && \ chmod +x /app/extra/entrypoint.sh @@ -22,5 +20,6 @@ HEALTHCHECK --interval=60s --timeout=30s --start-period=180s --retries=5 CMD nod ENTRYPOINT ["/usr/bin/dumb-init", "--", "extra/entrypoint.sh"] CMD ["node", "server/server.js"] + FROM release AS nightly RUN npm run mark-as-nightly diff --git a/package.json b/package.json index 644533d5..9aa8be06 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "uptime-kuma", - "version": "1.9.1", + "version": "1.9.2", "license": "MIT", "repository": { "type": "git", @@ -30,13 +30,13 @@ "build-docker": "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-alpine": "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:1.9.1-alpine --target release . --push", - "build-docker-debian": "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:1.9.1 -t louislam/uptime-kuma:debian -t louislam/uptime-kuma:1-debian -t louislam/uptime-kuma:1.9.1-debian --target release . --push", + "build-docker-alpine": "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:1.9.2-alpine --target release . --push", + "build-docker-debian": "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:1.9.2 -t louislam/uptime-kuma:debian -t louislam/uptime-kuma:1-debian -t louislam/uptime-kuma:1.9.2-debian --target release . --push", "build-docker-nightly": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly --target nightly . --push", "build-docker-nightly-alpine": "docker buildx build -f docker/dockerfile-alpine --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly-alpine --target nightly . --push", "build-docker-nightly-amd64": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain", "upload-artifacts": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:upload-artifact --build-arg GITHUB_TOKEN --target upload-artifact . --progress plain", - "setup": "git checkout 1.9.1 && npm ci --production && npm run download-dist", + "setup": "git checkout 1.9.2 && npm ci --production && npm run download-dist", "download-dist": "node extra/download-dist.js", "update-version": "node extra/update-version.js", "mark-as-nightly": "node extra/mark-as-nightly.js", diff --git a/server/check-version.js b/server/check-version.js index 2ab5fe51..a3465ddf 100644 --- a/server/check-version.js +++ b/server/check-version.js @@ -9,18 +9,17 @@ let interval; exports.startInterval = () => { let check = async () => { try { - const res = await axios.get("https://raw.githubusercontent.com/louislam/uptime-kuma/master/package.json"); - - if (typeof res.data === "string") { - res.data = JSON.parse(res.data); - } + const res = await axios.get("https://uptime.kuma.pet/version"); // For debug if (process.env.TEST_CHECK_VERSION === "1") { - res.data.version = "1000.0.0"; + res.data.slow = "1000.0.0"; + } + + if (res.data.slow) { + exports.latestVersion = res.data.slow; } - exports.latestVersion = res.data.version; } catch (_) { } }; diff --git a/server/server.js b/server/server.js index fe0d2e66..0af003d1 100644 --- a/server/server.js +++ b/server/server.js @@ -291,9 +291,8 @@ exports.entryPage = "dashboard"; let user = await login(data.username, data.password); if (user) { - afterLogin(socket, user); - if (user.twofa_status == 0) { + afterLogin(socket, user); callback({ ok: true, token: jwt.sign({ @@ -312,6 +311,7 @@ exports.entryPage = "dashboard"; let verify = notp.totp.verify(data.token, user.twofa_secret, twofa_verification_opts); if (user.twofa_last_token !== data.token && verify) { + afterLogin(socket, user); await R.exec("UPDATE `user` SET twofa_last_token = ? WHERE id = ? ", [ data.token, diff --git a/src/languages/hr-HR.js b/src/languages/hr-HR.js index 78143a14..35383a0f 100644 --- a/src/languages/hr-HR.js +++ b/src/languages/hr-HR.js @@ -5,7 +5,7 @@ export default { retriesDescription: "Broj ponovnih pokušaja prije nego će se servis označiti kao DOWN te poslati obavijest", ignoreTLSError: "Ignoriraj TLS/SSL pogreške za HTTPS web stranice", upsideDownModeDescription: "Preokreni logiku statusa. Ako je usluga dostupna, smatra se da je DOWN.", - maxRedirectDescription: "Maksimalan broj preusmjeravanja. Postaviti na 0 kako bi se preusmeravanja onemogućila.", + maxRedirectDescription: "Maksimalan broj preusmjeravanja. Postaviti na 0 kako bi se preusmjeravanja onemogućila.", acceptedStatusCodesDescription: "Odaberite statusne kodove koji se smatraju uspješnim odgovorom.", passwordNotMatchMsg: "Lozinke se ne poklapaju.", notificationDescription: "Obavijesti će funkcionirati samo ako su dodijeljene monitoru.", @@ -20,7 +20,7 @@ export default { clearEventsMsg: "Jeste li sigurni da želite izbrisati sve zapise o događajima za ovaj monitor?", clearHeartbeatsMsg: "Jeste li sigurni da želite izbrisati sve zapise o provjerama za ovaj monitor?", confirmClearStatisticsMsg: "Jeste li sigurni da želite izbrisati SVE statistike?", - importHandleDescription: "Odaberite opciju 'Preskoči postojeće' ako želite prekočiti uvoz već postojećih monitora i obavijesti. Opcija 'Prepiši' će izbrisati postojeće monitore i obavijesti.", + importHandleDescription: "Odaberite opciju \"Preskoči postojeće\" ako želite preskočiti uvoz postojećih monitora i obavijesti ako dođe do poklapanja u imenu. Opcija \"Prepiši\" će izbrisati postojeće monitore i obavijesti.", confirmImportMsg: "Jeste li sigurni da želite pokrenuti uvoz? Provjerite jeste li odabrali ispravnu opciju uvoza.", twoFAVerifyLabel: "Unesite svoj 2FA token:", tokenValidSettingsMsg: "Token je važeći! Sada možete spremiti postavke dvofaktorske autentikacije.", @@ -44,7 +44,7 @@ export default { Down: "Nedostupno", Pending: "U tijeku", Unknown: "Nepoznato", - Pause: "Pauziraj", + Pause: "Pauzirano", Name: "Naziv monitora", Status: "Status", DateTime: "Vremenska oznaka", @@ -77,7 +77,7 @@ export default { "Max. Redirects": "Maksimalan broj preusmjeravanja", "Accepted Status Codes": "Prihvaćeni statusni kodovi", "Push URL": "Push URL", - needPushEvery: "Potrebno je zvati ovaj URL svakih {0} sekundi.", + needPushEvery: "Potrebno je slati zahtjeve na URL svakih {0} sekundi.", pushOptionalParams: "Neobavezni parametri: {0}", Save: "Spremi", Notifications: "Obavijesti", @@ -135,9 +135,9 @@ export default { Events: "Events", Heartbeats: "Provjere", "Auto Get": "Automatski dohvat", - backupDescription: "Moguće je napraviti sigurnosnu kopiju svih monitora i obavijesti u JSON datoteku.", + backupDescription: "Moguće je napraviti sigurnosnu kopiju svih monitora i obavijesti koja će biti spremljena kao JSON datoteka.", backupDescription2: "Napomena: povijest i podaci o događajima nisu uključeni u sigurnosnu kopiju.", - backupDescription3: "Osjetljivi podaci poput tokena za obavijesti jesu uključeni u izvozu; potrebno je čuvati izvoz na sigurnom mjestu.", + backupDescription3: "Osjetljivi podaci poput tokena za obavijesti jesu uključeni u sigurnosnu kopiju. Zato je potrebno čuvati izvoz na sigurnom mjestu.", alertNoFile: "Datoteka za uvoz nije odabrana.", alertWrongFileType: "Datoteka za uvoz nije u JSON formatu.", "Clear all statistics": "Obriši sve statistike", @@ -197,14 +197,14 @@ export default { webhook: "Webhook", "Post URL": "Post URL", "Content Type": "Tip sadržaja (Content Type)", - webhookJsonDesc: "{0} je moguća opcija za moderne HTTP poslužitelje poput Express.js-a", + webhookJsonDesc: "{0} je dobra opcija za moderne HTTP poslužitelje poput Express.js-a", webhookFormDataDesc: "{multipart} je moguća alternativa za PHP, samo je potrebno parsirati JSON koristeći {decodeFunction}", smtp: "E-pošta (SMTP)", secureOptionNone: "Bez sigurnosti / STARTTLS (25, 587)", secureOptionTLS: "TLS (465)", "Ignore TLS Error": "Ignoriraj greške TLS-a", - "From Email": "Adresa za From polje", - emailCustomSubject: "Prilagođeno Subject polje", + "From Email": "Adresa za \"From\" polje", + emailCustomSubject: "Prilagođeno \"Subject\" polje", "To Email": "Odredišne adrese e-pošte", smtpCC: "Cc", smtpBCC: "Bcc", @@ -233,7 +233,7 @@ export default { "Uptime Kuma URL": "Uptime Kuma URL", aboutWebhooks: "Dodatne informacije o webhookovima su dostupne na: {0}", aboutChannelName: "Unesite ime {0} kanala u polju Naziv kanala ako želite zaobići webhook kanal. Primjerice: #neki-kanal", - aboutKumaURL: "Ako je polje Uptime Kuma URL prazno, koristi se zadana vrijednost koja vodi na GitHub stranicu projekta.", + aboutKumaURL: "Ako je polje \"Uptime Kuma URL\" prazno, koristi se zadana vrijednost koja vodi na GitHub stranicu projekta.", emojiCheatSheet: "Popis emotikona: {0}", "rocket.chat": "Rocket.Chat", pushover: "Pushover", @@ -252,7 +252,7 @@ export default { "Notification Sound": "Zvuk obavijesti", "More info on:": "Više informacija na: {0}", pushoverDesc1: "Hitni prioritet (2) ima zadani istek vremena od 30 sekundi između ponovnih pokušaja te će isteći nakon 1 sata.", - pushoverDesc2: "Ako želite slati obavijesti na više uređaja, ispunite polje Uređaji.", + pushoverDesc2: "Ako želite slati obavijesti na više uređaja, ispunite polje \"Uređaji\".", "SMS Type": "Tip SMS-a", octopushTypePremium: "Premium (Brzo - preporučeno za obavijesti)", octopushTypeLowCost: "Low Cost (Sporo - mobilni operateri ponekad blokiraju ove poruke)", @@ -277,7 +277,7 @@ export default { "Basic Settings": "Osnovne Postavke", "User ID": "Korisnički ID", "Messaging API": "API za razmjenu poruka", - wayToGetLineChannelToken: "Prvo, pristupite {0}, kreirajte create a pružatelja usluga te kanal (API za razmjenu poruka), zatim možete dobiti you can get the token za pristup kanalu te korisnički ID za polja iznad.", + wayToGetLineChannelToken: "Prvo, pristupite {0}, kreirajte pružatelja usluga te kanal (API za razmjenu poruka), zatim možete dobiti token za pristup kanalu te korisnički ID za polja iznad.", "Icon URL": "URL slike", aboutIconURL: "Možete postaviti poveznicu na sliku u polju \"URL slike\" kako biste spriječili korištenje zadane slike. Ovo se polje neće koristiti ako je postavljeno polje \"Emotikon\".", aboutMattermostChannelName: "Možete promijeniti kanal u kojeg webhook šalje tako da ispunite polje \"Naziv kanala\". Ta opcija mora biti omogućena unutar Mattermost postavki za webhook. Primjerice: #neki-kanal", @@ -286,19 +286,19 @@ export default { promosmsTypeFlash: "SMS FLASH - Poruka se automatski pojavljuje na uređaju primatelja. Ograničeno samo na primatelje unutar Poljske.", promosmsTypeFull: "SMS FULL - Premium razina usluge, dozvoljava postavljanje naziva SMS pošiljatelja (Naziv mora biti registriran). Usluga pouzdana za obavijesti.", promosmsTypeSpeed: "SMS SPEED - Usluga najvećeg prioriteta. Brza i pouzdana, ali skupa (otprilike dvostruko skuplja od cijene usluge SMS FULL).", - promosmsPhoneNumber: "Telefonski broj (za primitalje unutar Poljske nije potrebno navoditi pozivni broj države)", + promosmsPhoneNumber: "Telefonski broj (za primatelje unutar Poljske nije potrebno navoditi pozivni broj države)", promosmsSMSSender: "Naziv SMS pošiljatelja: Registriran naziv ili jedan od zadanih: InfoSMS, SMS Info, MaxSMS, INFO, SMS", "Feishu WebHookUrl": "Feishu URL webhooka", - matrixHomeserverURL: "URL homeservera (uključujući http(s):// te port, ako je potrebno)", + matrixHomeserverURL: "URL Matrix homeservera (uključujući http(s):// te port, ako je potrebno)", "Internal Room Id": "Interni ID sobe", matrixDesc1: "Interni ID sobe se može pronaći u naprednim postavkama sobe unutar Matrix klijenta. ID sobe nalikuje idućem zapisu: !QMdRCpUIfLwsfjxye6:home.server.", - matrixDesc2: "Preporuča se stvaranje novog korisnika te suzdržavanje od korištenja pristupnog tokena vlastitog Matrix korisnika. Novog korisnika potrebno je dodati u sobe u kojima želite primati obavijesti. Pristupni token možete dobiti pokretanjem naredbe {0}", + matrixDesc2: "Preporučuje se stvaranje novog korisnika te suzdržavanje od korištenja pristupnog tokena vlastitog Matrix korisnika. Novog korisnika potrebno je dodati u sobe u kojima želite primati obavijesti. Pristupni token možete dobiti pokretanjem naredbe {0}", Method: "Metoda", Body: "Tijelo", Headers: "Zaglavlja", PushUrl: "Push URL", HeadersInvalidFormat: "Zaglavlja nisu nije valjani JSON: ", - BodyInvalidFormat: "Tijelo zahjeva nije valjani JSON: ", + BodyInvalidFormat: "Tijelo zahtjeva nije valjani JSON: ", "Monitor History": "Povijest monitora", clearDataOlderThan: "Podaci o povijesti monitora čuvaju se {0} dana.", PasswordsDoNotMatch: "Lozinke se ne poklapaju.", diff --git a/src/mixins/socket.js b/src/mixins/socket.js index 67979449..170a07a7 100644 --- a/src/mixins/socket.js +++ b/src/mixins/socket.js @@ -265,10 +265,10 @@ export default { }, logout() { + socket.emit("logout", () => { }); this.storage().removeItem("token"); this.socket.token = null; this.loggedIn = false; - this.clearData(); },