Compare commits

..

857 Commits

Author SHA1 Message Date
Louis Lam
c742153d4d Merge pull request #1449 from mhkarimi1383/ansible-unofficial
making it functional when you have a minimal host
2022-04-04 14:16:25 +08:00
Muhammed Hussein Karimi
4aa4c5b853 update readme for new tag 2022-04-04 06:24:48 +04:30
Muhammed Hussein Karimi
2e7231edd1 making it functional when you have a minimal host 2022-04-04 06:16:59 +04:30
Louis Lam
c25b4cf9c8 Merge pull request #1188 from mhkarimi1383/patch-1
FIX: [ansible]logging volume not working
2022-01-18 00:03:40 +08:00
Louis Lam
a5d2dbf620 Merge pull request #1189 from mhkarimi1383/patch-2
always recreate uptime kuma containers
2022-01-18 00:03:29 +08:00
Muhammed Hussein karimi
10220ec5bc always recreate uptime kuma containers
this will fix the problem when you change nginx configuration and containers are not reloaded
2022-01-15 01:08:50 +03:30
Muhammed Hussein karimi
a6de002eda FIX: logging volume not working
fix path for logging in nginx ansible role
2022-01-15 00:56:57 +03:30
Louis Lam
df4c354e46 Merge pull request #1058 from mhkarimi1383/patch-1
fix: nginx role should run before uptime-kuma role
2021-12-15 00:51:24 +08:00
Muhammed Hussein karimi
7af628211e fix: nginx role should run before uptime-kuma role
this is required because of configuration files should be present.
2021-12-14 20:17:40 +03:30
Louis Lam
bb43dc2825 only for ansible 2021-12-14 18:46:34 +08:00
Louis Lam
a1b20698be Merge branch 'mhkarimi1383_master' into ansible-unofficial 2021-12-14 18:45:46 +08:00
Louis Lam
6d6cb2ad49 Merge pull request #1047 from dhfhfk/master
Update Ko-KR.js
2021-12-14 17:28:38 +08:00
Louis Lam
cb76801b85 Merge pull request #1049 from Ponkhy/german-language
Updated de-De.js
2021-12-14 13:17:22 +08:00
Muhammed Hussein Karimi
2c0e22ad31 some minor features and fixes for ansible role 2021-12-14 01:14:44 +03:30
Muhammed Hussein karimi
f05651d235 Merge branch 'louislam:master' into master 2021-12-14 01:02:30 +03:30
Ponkhy
aa92727a61 Updated de-De 2021-12-12 21:52:51 +01:00
dhfhfk
56dfa05642 Update Ko-KR.js 2021-12-12 18:56:10 +09:00
Louis Lam
71492aeb3a Merge remote-tracking branch 'origin/master' 2021-12-11 20:59:45 +08:00
Louis Lam
5ee5ea909d Add Github Action: close-incorrect-issue.yml 2021-12-11 20:59:31 +08:00
Louis Lam
a09b97f778 Merge pull request #1032 from titiscan/patch-1
Update fr-FR.js
2021-12-11 17:31:13 +08:00
Louis Lam
e0a08e6b5d Merge pull request #1038 from iomataani/master
Updated italian translation
2021-12-11 17:30:44 +08:00
Louis Lam
6f5cbbdf69 Merge pull request #1018 from Lrss/master
Update Danish translation
2021-12-11 17:29:46 +08:00
Louis Lam
34ee342d3e eslint 2021-12-11 17:20:51 +08:00
Ioma Taani
f793aa5264 better translations 2021-12-10 09:26:55 +01:00
Ioma Taani
728485d686 updated translations 2021-12-10 09:08:01 +01:00
titiscan
cb3429d3c7 Update fr-FR.js
typo fix
2021-12-09 17:26:05 +01:00
Louis Lam
0d69b4426e Merge pull request #1017 from SiderealArt/patch-1
update zh-TW translation
2021-12-09 21:32:10 +08:00
Louis Lam
8bb8b0a53c update to 1.11.1 2021-12-09 01:23:49 +08:00
Louis Lam
a4841eb8aa Fix #1016, .at() is not support in Safari 2021-12-09 01:19:09 +08:00
Lars Sørensen
2ef2a42e87 Fixed string enclosure as suggested by update-language-files 2021-12-08 11:35:55 +01:00
Lars Sørensen
9473cd6919 Update da-DK.js translation 2021-12-08 11:14:10 +01:00
SiderealArt
74f18a2b3f update zh-TW translation 2021-12-08 17:23:13 +08:00
Louis Lam
f9cd0eb084 fix upload-artifacts 2021-12-08 15:35:44 +08:00
Louis Lam
6a845bd937 Merge remote-tracking branch 'origin/master' 2021-12-08 15:26:19 +08:00
Louis Lam
c91f517121 Update README.md 2021-12-08 15:25:43 +08:00
Louis Lam
7899707582 update to 1.11.0 2021-12-08 15:17:37 +08:00
Louis Lam
12215af2f4 Merge pull request #1014 from iooner/patch-2
Fix typos
2021-12-08 15:04:33 +08:00
Louis Lam
d4bfe57b79 minor: improve formatting 2021-12-08 15:04:18 +08:00
Louis Lam
dcc91d6c72 Fix #922 2021-12-08 14:59:59 +08:00
iooner
a041a7964a Fix typos 2021-12-07 14:23:13 +01:00
Louis Lam
76611ecaca Merge pull request #1011 from iomataani/master
Updated translation
2021-12-07 19:26:22 +08:00
Ioma Taani
f802154456 updated 2021-12-06 11:33:39 +01:00
Ioma Taani
9fb461976d Merge branch 'louislam:master' into master 2021-12-06 11:32:24 +01:00
Louis Lam
c8e364911f Delete close-issue.yml, no idea why not working 2021-12-06 17:46:46 +08:00
Louis Lam
88bc08e7b7 Update close-issue.yml 2021-12-06 17:36:18 +08:00
Louis Lam
03aeab0421 close issues that don't follow the issue template
Copy from axios
2021-12-06 17:31:25 +08:00
Louis Lam
f331f1a63e Merge pull request #873 from Saibamen/fix_871
Fix Telegram Bot Token displayed in notification setup view
2021-12-05 18:04:54 +08:00
Louis
d645e29455 mask telegram api url with asterisk 2021-12-05 17:40:13 +08:00
Louis Lam
b4507f9706 Merge pull request #992 from jlbrt/stackfield-notifications
Add support for Stackfield notifications
2021-12-05 16:45:30 +08:00
Louis Lam
fc6d0d1fca Merge pull request #1000 from BCsabaEngine/master
NPM update and (boring) HU lang
2021-12-05 16:30:31 +08:00
Louis
b62f1475ee 🐍 2021-12-05 16:28:59 +08:00
Louis
d47d8517a8 update apprise to 0.9.6 2021-12-05 16:05:52 +08:00
Ioma Taani
19d2db6c8c better translation 2021-12-04 11:19:56 +01:00
Balázs Csaba
5a8162747c Upgrade qrcode to 1.5.0 2021-12-03 22:47:40 +01:00
Balázs Csaba
220108ebc6 Upgrade bree to 7.1 2021-12-03 22:39:38 +01:00
Balázs Csaba
984a3704e0 HU lang 2021-12-03 22:29:53 +01:00
Ioma Taani
909412c87e Merge branch 'louislam:master' into master 2021-12-03 11:11:38 +01:00
Ashish Bansal
481fd3a05f Updated monitor service details in README.md (#990)
* Updated monitor service details in README.md

Added `Steam Gamer Server' to the monitor service list.

* Update README.md

* Update README.md

* Update README.md
2021-12-03 15:49:46 +08:00
Louis Lam
5434e2da4f Merge pull request #993 from Saibamen/patch-1
Fix typos in markdown files
2021-12-03 15:48:57 +08:00
Ioma Taani
b3d348dcea Translation Update (#994)
* Better translation

* better translation

* aggiornato
2021-12-03 15:48:11 +08:00
Csaba Balázs
0aca0455ab HU language typo and missing items (#996)
* HU language

* run eslint on hu.js

* Last HU typo

* package.json valid required node engine syntax

Package.json required node engine version can contain multiple rules separated with ||. With this mode package-lock.json will be valid and error codes does not diplay.

Co-authored-by: Louis Lam <louislam@users.noreply.github.com>
2021-12-03 15:47:35 +08:00
Louis Lam
8f3ef734bc disable e2e test, as it is getting unstable recently on GitHub action 2021-12-03 01:31:19 +08:00
Ioma Taani
120eb0d85f aggiornato 2021-12-02 12:51:10 +01:00
Ioma Taani
4aaed0837e Merge branch 'louislam:master' into master 2021-12-02 12:44:13 +01:00
Adam Stachowicz
60657132c0 Update PULL_REQUEST_TEMPLATE.md 2021-12-02 11:19:59 +01:00
Adam Stachowicz
76cbef85d5 Update README.md 2021-12-02 11:18:30 +01:00
Adam Stachowicz
e17ef02008 Update CONTRIBUTING.md 2021-12-02 11:15:14 +01:00
Adam Stachowicz
f33d55c92d Update README.md 2021-12-02 11:09:27 +01:00
Jonas Liebert
67849a9e84 add support for stackfield notifications 2021-12-02 08:53:45 +01:00
Louis Lam
ee79a34148 Merge pull request #989 from BCsabaEngine/master
HU language typo
2021-12-02 12:44:18 +08:00
Louis Lam
d2f0480889 Merge pull request #988 from tgcentral/readme-md-typo
Typo correction
2021-12-02 12:43:19 +08:00
Balázs Csaba
c36190bba6 Node engine version 2021-12-01 15:40:22 +01:00
Balázs Csaba
4b3fae53d4 HU language typo 2021-12-01 15:32:39 +01:00
tgcentral
4dd60cba3d Typo correction 2021-12-01 09:43:58 +00:00
Ioma Taani
4bc84d2122 Merge branch 'louislam:master' into master 2021-12-01 08:47:57 +01:00
Louis Lam
a796f80018 Merge pull request #902 from ivanbratovic/improve-translatables
Fix untranslatable parts of the UI
2021-12-01 13:59:00 +08:00
Louis Lam
40cb22e671 Merge pull request #963 from kffl/feat/serwersms-provider
Add SerwerSMS.pl notification provider
2021-11-29 20:43:38 +08:00
Ivan Bratović
d95258e7db Merge remote-tracking branch 'upstream/master' into improve-translatables 2021-11-29 12:51:08 +01:00
Ivan Bratović
baae4b5a5e Remove unused translation keys from hr-HR 2021-11-29 12:49:38 +01:00
Ivan Bratović
c1b118a0f6 Use existing Example translation for HTTP headers and body placeholders 2021-11-29 12:49:08 +01:00
Ivan Bratović
9c5466890e Revert "Replace body and header placeholder functions with translations"
This reverts commit 2c85491ee0.
2021-11-29 12:40:53 +01:00
Louis Lam
bf8dbd78b3 temporary disable test for settings page 2021-11-29 17:25:30 +08:00
Louis Lam
6cd130de38 minor 2021-11-29 17:20:12 +08:00
Louis Lam
a864b72e03 fix pushover for general message 2021-11-29 17:19:55 +08:00
Louis Lam
5070927478 Merge pull request #980 from MrEddX/bulgarian
Update bg-BG.js
2021-11-29 16:56:02 +08:00
Louis Lam
bedc1f8617 Merge pull request #966 from louislam/lazy-load-lang
Lazy load language files
2021-11-29 16:54:25 +08:00
Louis Lam
077f3837d9 update language guide 2021-11-29 16:53:00 +08:00
Louis Lam
aea128a85b make settings' menu reactive 2021-11-29 16:50:00 +08:00
Louis Lam
c50b2b636a [lazy load lang] load the language file on create 2021-11-29 16:45:52 +08:00
MrEddX
a284703d9e Update bg-BG.js
- Fixed existing field
- Added new field
- Translated new field
2021-11-28 07:11:20 +02:00
kffl
64ec766423 translate(serwersms): fix pl translation capitalization
Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
2021-11-27 13:22:54 +01:00
kffl
186c11540f style(serwersms): add missing trailing commas
Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
2021-11-27 13:16:17 +01:00
Ioma Taani
4d947d9374 better translation 2021-11-26 10:37:42 +01:00
Ioma Taani
4888c97d86 Better translation 2021-11-26 10:33:15 +01:00
Louis Lam
50593f3edf [wip] lazy load language file 2021-11-26 16:31:19 +08:00
Paweł Kuffel
c1267e9b3b feat: add SerwerSMS notification provider 2021-11-25 18:24:36 +01:00
Ivan Bratović
2ca7a5b962 Merge branch 'master' into improve-translatables 2021-11-24 10:03:30 +01:00
Louis Lam
9f0c66d775 fix node-sqlite3 security issues 2021-11-24 14:53:15 +08:00
Louis Lam
a1f9a82537 Merge pull request #884 from thomasleveil/ux/add-group-at-the-top
🚸 Status page - add group action adds the new group at the top
2021-11-24 11:48:58 +08:00
Louis Lam
37e6ca8d77 Merge pull request #950 from dingdayu/master
Update dingding notification title
2021-11-24 11:36:00 +08:00
Louis Lam
0b0fd6609d Merge pull request #951 from iomataani/master
Updated translations.
2021-11-24 00:37:12 +08:00
Ioma Taani
3a32fd6f42 aggiornata la traduzione 2021-11-23 16:39:38 +01:00
Ioma Taani
97cb060cf5 another typo 2021-11-23 16:39:04 +01:00
Ioma Taani
5afb29f8f9 typo 2021-11-23 16:35:18 +01:00
Ioma Taani
f9b8dbf4db Merge branch 'louislam:master' into master 2021-11-23 16:30:48 +01:00
Louis Lam
92a5f18bf5 Merge pull request #864 from ivanbratovic/http-basicauth
Implement explicit HTTP "basic" authentication support
2021-11-23 22:48:54 +08:00
小雨
dce908a07b Update dingding notification title
Add the status to the title, you can see the message title on the friend list page.
2021-11-23 20:36:22 +08:00
Louis
4155f84eec improve basic auth style 2021-11-23 19:20:55 +08:00
Louis Lam
94ffeeeab6 update dependencies 2021-11-23 13:32:24 +08:00
Louis Lam
3d222ac5f5 fix btoa is not define 2021-11-23 12:59:48 +08:00
Louis Lam
c811c1ccde Merge pull request #753 from chakflying/settings-redesign
UI: Redesign/organize settings page
2021-11-23 12:46:59 +08:00
Ioma Taani
bd3d34400d Merge branch 'master' of https://github.com/iomataani/uptime-kuma 2021-11-22 23:39:10 +01:00
Louis Lam
5d3bf68123 add remove-2fa command 2021-11-18 18:22:03 +08:00
Nelson Chan
1f77526210 Chore: Run spell check 2021-11-17 14:09:12 +08:00
Nelson Chan
88ed965d69 Test: Disable clear stats test 2021-11-17 10:52:14 +08:00
Nelson Chan
7f4d5a0f76 Test: fix tests
Test: Attempt to fix tests

Test: Attempt to fix tests

Test: Attempt to fix tests

Test: Attempt to fix tests

Test: Attempt to fix tests

Test: Attempt to fix tests

Test: Attempt to fix tests

Test: Attempt to fix tests

Test: Attempt to fix tests

Test: Attempt to fix tests

Test: Attempt to fix tests

Test: Attempt to fix tests

Test: Attempt to fix tests

Test: Attempt to fix tests

Test: Investigate error message

Test: Attempt to fix tests

Chore: Cleanup code

Test: Attempt to fix tests

Test: Attempt to fix tests
2021-11-17 10:45:24 +08:00
Nelson Chan
df813fbdee Fix: Add save in monitor history 2021-11-17 10:45:19 +08:00
Nelson Chan
07742799ed Test: Fix tests
Test: Add clear stats test

Test: Attempt to fix tests

Test: Add test for disable auth

Update README
2021-11-17 10:45:19 +08:00
Nelson Chan
f65cc655c0 Fix: Fix nav highlight in settings sub-page 2021-11-17 10:45:19 +08:00
Nelson Chan
1a218aaa17 Fix: Fix page transition & improve active handling
Fix: Fix current route parsing
2021-11-17 10:45:19 +08:00
Nelson Chan
369cad90c1 WIP: Convert to use vue-router & improve layout
WIP: Fix security page & improve layout

WIP: Fix displaying current page

UI: Improve spacing

Chore: Improve styling
2021-11-17 10:45:18 +08:00
Nelson Chan
f9bb48de13 WIP: Convert Settings to components 2021-11-17 10:45:18 +08:00
Louis Lam
74d2b38cb6 Merge pull request #925 from iomataani/italian-language-update
Translation update
2021-11-16 19:12:07 +08:00
Louis Lam
7bba4fe2d0 Merge pull request #926 from MG8853/patch-1
Update ja.js
2021-11-16 18:53:30 +08:00
MultiGamer8853
be3a791e6e Update ja.js
日本語を最適化
2021-11-16 18:14:23 +09:00
Ioma Taani
9747048890 correzioni e miglioramenti 2021-11-16 09:04:10 +01:00
Phuong Nguyen Minh
d5d957b748 update vi.js (#853)
* update vi.js

* Update vi.js

* Update vi.js
2021-11-15 13:27:31 +08:00
Ioma Taani
5cdb5edeb3 corretto 2021-11-13 17:00:23 +01:00
Ioma Taani
73c18b6ff0 correzione 2021-11-13 16:53:07 +01:00
Ivan
567ea346fe Add missing translations for placeholders in EditMonitor page 2021-11-12 15:30:31 +01:00
Ivan
453f6fbadf Add more missing translations 2021-11-12 15:19:33 +01:00
Ivan
dd79042128 Add translation for "Info" in Settings 2021-11-12 15:14:28 +01:00
Ivan
583e6bf978 Update croatian language for testing new translation 2021-11-12 13:32:24 +01:00
Ivan
b1fca7c1a7 Add translation of toast success message 2021-11-12 12:00:10 +01:00
Ivan
19dd11d624 Add translation for incident error message 2021-11-12 10:14:23 +01:00
Ivan
42ce34b6c7 Add more Status page tranlations 2021-11-12 09:54:31 +01:00
Ivan
b7a9d1474f Fix translation of selected incident style 2021-11-12 09:53:41 +01:00
Ivan
31fa67452e Delint English language file 2021-11-12 09:31:27 +01:00
Ivan
9ef3727c91 Backed out of commit be1933614
Running update-language-files will just confuse translators
2021-11-12 09:29:06 +01:00
Ivan Bratović
ed39485af9 Merge with upstream master
Signed-off-by: Ivan Bratović <ivanbratovic4@gmail.com>
2021-11-12 09:23:20 +01:00
Ioma Taani
daef238a70 Updated Italian Language (#911)
Co-authored-by: Paride Barison <paride.barison@lantechlongwave.it>
2021-11-12 01:28:22 +08:00
Ivan
4cc433166e Add missing translation for SMTP security option 2021-11-11 11:14:21 +01:00
Ivan
28f530394e Add missing translation lookup for ClickSendSMS 2021-11-11 11:12:48 +01:00
Ivan
b0615d347b Add incident creation translations 2021-11-11 11:07:48 +01:00
Ivan
be19336149 Run update-language-files for all languages 2021-11-11 10:57:33 +01:00
Ivan
94508cae2f Add some missing translations 2021-11-11 10:54:36 +01:00
Ivan
265cca9ed1 Replace "Default" notification badge with translation 2021-11-11 10:54:09 +01:00
Ivan
267654c987 Replace hard-coded names for groups in Status page with translations 2021-11-11 10:53:38 +01:00
Ivan
2c85491ee0 Replace body and header placeholder functions with translations 2021-11-11 10:52:22 +01:00
Ivan Bratović
5d836cf05d [empty commit] pull request for updating translatables 2021-11-10 10:09:21 +01:00
Adam Stachowicz
ba46fb6b1c Clickable URL 2021-11-10 09:11:19 +01:00
Louis Lam
5df34cd137 Merge pull request #885 from ZegertBoele/patch-1
Update to dutch translations
2021-11-09 23:20:21 +08:00
Louis Lam
bf64095cea update to 1.10.2 2021-11-09 22:42:13 +08:00
Louis Lam
2333d1c7a7 Merge remote-tracking branch 'origin/master' 2021-11-09 22:37:20 +08:00
Louis Lam
95bae8289d Fix setting page when disabled auth 2021-11-09 22:37:05 +08:00
Louis Lam
45f7c647a6 Update feature_request.yaml 2021-11-09 21:31:04 +08:00
Zegert Boele
dff1056bb1 Update nl-NL.js
@deefdragon noticed a flaw, fixed in here
2021-11-09 09:52:09 +01:00
Zegert Boele
62222c0336 Update src/languages/nl-NL.js
@koen20 added this correction.

Co-authored-by: Koen Habets <6172623+koen20@users.noreply.github.com>
2021-11-09 09:49:42 +01:00
Muhammed Hussein Karimi
8f7ca1f4db I forgot to commit this part :) 2021-11-08 21:06:58 +03:30
Muhammed Hussein Karimi
9a36e227a3 docker-compose is made in one, volume for error & access log, better tagging for docker 2021-11-08 21:01:52 +03:30
Louis Lam
733d0af75f update to 1.10.1 2021-11-08 18:03:00 +08:00
Louis Lam
b88e74fad8 Merge pull request #891 from ivanbratovic/croatian-language
Update Croatian languange
2021-11-08 17:35:13 +08:00
Ivan Bratović
734762b773 Merge with master
Signed-off-by: Ivan Bratović <ivanbratovic4@gmail.com>
2021-11-08 09:53:54 +01:00
Louis Lam
0275d7a42b minor 2021-11-08 15:51:32 +08:00
Louis Lam
41a6d1b701 Fix parseCertificateInfo possibly in dead loop 2021-11-08 15:39:17 +08:00
Ivan Bratović
34d8984e3a Merge branch 'master' into http-basicauth 2021-11-07 17:15:36 +01:00
Louis Lam
c92153c97e add more debug msg 2021-11-07 21:00:47 +08:00
Louis Lam
ad82ab0305 Merge pull request #883 from andreasbrett/patch-7
24h tooltip on status page
2021-11-07 17:24:03 +08:00
Louis Lam
f952d283c6 Merge pull request #815 from Fallstop/tags-on-status
Display Monitor Tags on Status Page
2021-11-07 17:05:21 +08:00
Louis Lam
e164fabf81 Merge pull request #849 from Minvinea/master
Adding missing translations
2021-11-07 13:56:15 +08:00
Louis Lam
bc69a331ee eslint 2021-11-07 13:50:22 +08:00
Jasper Miller-Waugh
e4506963d9 Merge branch 'louislam:master' into tags-on-status 2021-11-07 14:39:43 +13:00
Zegert Boele
222540898b Some translations were not translated
Some translations were not translated yet. I have added them and can be contacted if you want more English-Dutch translations.
2021-11-05 13:57:55 +01:00
Thomas LEVEIL
baf3612ece 🚸 Status page - add group action adds the new group at the top of the page 2021-11-05 11:27:19 +01:00
Andreas Brett
8f44b9f618 24h tooltip on status page 2021-11-05 09:54:10 +01:00
Louis Lam
210566c7af remove prefix for issue title, so users need to input the title 2021-11-05 11:34:50 +08:00
Ivan Bratović
0481a241f3 Add translated placeholders for editing basic auth 2021-11-04 10:22:42 +01:00
Ivan Bratović
179ca232bc Minor refactor - change variable names and add commas to object definitions 2021-11-04 10:14:17 +01:00
Ivan Bratović
0dcb7aed21 Delinting 2021-11-04 09:50:10 +01:00
Ivan Bratović
23736549f9 Implement HTTP basic auth feature 2021-11-04 09:50:10 +01:00
Ivan Bratović
665c263c03 Add db migrations for new basic auth fields 2021-11-04 09:50:10 +01:00
Louis Lam
c5e6628803 Merge pull request #870 from chakflying/patch-3
Update PULL_REQUEST_TEMPLATE.md
2021-11-04 11:55:06 +08:00
Louis Lam
3a1d8ddc11 Merge pull request #869 from MrEddX/bulgarian
Update bg-BG.js
2021-11-04 11:54:25 +08:00
Nelson Chan
bc5f61b3ec Chore: Add drag and drop
Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
2021-11-04 10:21:57 +08:00
Adam Stachowicz
314fa18bdc Fix #871 2021-11-04 00:19:04 +01:00
Nelson Chan
57389fab2c Update PULL_REQUEST_TEMPLATE.md 2021-11-03 19:13:11 +08:00
MrEddX
ee2c54cfd1 Update bg-BG.js
- Added New Fields
- Fixed Existing Fields
2021-11-03 11:49:22 +02:00
Louis Lam
82cde7c847 Merge pull request #854 from 634750802/patch-1
Add a status prefix for feishu notification's title
2021-11-03 16:36:21 +08:00
Louis Lam
1ba2034701 freeze bootstrap to 5.1.3 to prevent breaking changes 2021-11-03 13:03:36 +08:00
Louis Lam
dee131c25d fix table hover color not working after updated bootstrap to 5.1.3 2021-11-03 13:02:44 +08:00
Jasper Miller-Waugh
e5d6410caf Apply formatting suggestions from code review
Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
2021-11-03 11:46:53 +13:00
Louis Lam
e496c3b3be update healthcheck.js 2021-11-02 22:03:02 +08:00
Louis Lam
69f5112b38 Merge remote-tracking branch 'origin/master' 2021-11-02 21:49:02 +08:00
Louis Lam
c094dc0c5b speed up redirect by using 302 redirect instead of vue redirect 2021-11-02 21:48:46 +08:00
Ivan Bratović
1fb9b25d13 Improve hr-HR translations 2021-11-02 14:09:01 +01:00
Ivan Bratović
9a135deac2 Add new translation for 'Uptime' 2021-11-02 11:48:55 +01:00
Your Name
8e6173c05e Fix and add new hr-HR translations 2021-11-02 10:33:13 +01:00
Louis Lam
dec84282ed Update bug_report.yaml 2021-11-02 13:31:27 +08:00
Louis Lam
df80f413b5 Update feature_request.yaml 2021-11-02 13:31:19 +08:00
Louis Lam
17e59f1d8d Update ask-for-help.yaml 2021-11-02 13:30:39 +08:00
Louis Lam
973c2bb429 Update ask-for-help.yaml 2021-11-02 13:30:13 +08:00
Louis Lam
da0eaddeb8 Update SECURITY.md 2021-11-02 13:25:34 +08:00
Louis Lam
b2bc8d9db9 Update bug_report.yaml 2021-11-02 13:24:15 +08:00
Louis Lam
541068ff3b Update bug_report.yaml 2021-11-02 13:23:47 +08:00
Louis Lam
83ee46454a Update bug_report.yaml 2021-11-02 13:12:46 +08:00
Louis Lam
75b21c905f Merge pull request #847 from Saibamen/update_pl
Update `pl.js`
2021-11-02 10:44:19 +08:00
Louis Lam
60e12f4bfa fix healthcheck.js with prefix UPTIME_KUMA_ 2021-11-02 01:13:05 +08:00
Jasper Miller-Waugh
191b81ee07 Fix grammer in comment
Co-authored-by: Nelson Chan <chakflying@hotmail.com>
2021-11-01 22:14:41 +13:00
Jagger
f3651a1219 Add a status prefix for feishu notification 2021-11-01 13:31:31 +08:00
Jasper Miller-Waugh
12ef9f39c5 Merged buttons, cleaned up SS tag retrieval and made tagsVisible a bool.
Also to note: due to the transition of tagsVisible this breaks compatibility with the previous commits, delete the  tagsVisible setting in the database to fix.
2021-11-01 13:23:46 +13:00
Jasper Miller-Waugh
4004926e64 Small formatting changes from code-review
Co-authored-by: deef <deef551@gmail.com>
2021-11-01 12:52:21 +13:00
Adam Stachowicz
4d3d6d6e25 Missing this... 2021-10-31 21:59:56 +01:00
Adam Stachowicz
d06e5ef6fa More small letters 2021-10-31 21:53:11 +01:00
Adam Stachowicz
b12b848d97 One more typo... 2021-10-31 21:48:43 +01:00
Adam Stachowicz
bb96a577ca Fix typos + translate wayToGetTeamsURL 2021-10-31 21:47:07 +01:00
Adam Stachowicz
8840ca618b Update pl.js 2021-10-31 21:22:19 +01:00
Minvinea
8ec858fd14 Add missing translation
Line 282 to 306
2021-10-31 21:18:36 +01:00
Louis Lam
124c98ce76 update to 1.10.0 2021-10-31 13:48:05 +08:00
Louis Lam
61135e8500 update package-lock.json 2021-10-31 13:18:06 +08:00
Louis Lam
08a58dec2b fix manifest.json path 2021-10-31 13:17:34 +08:00
Louis Lam
741ed548da Merge branch 'master' into use_hideCount_option 2021-10-31 13:09:50 +08:00
Louis Lam
52d80d3a5d Merge remote-tracking branch 'origin/master' 2021-10-31 13:08:00 +08:00
Louis Lam
586c748d44 vite build on host machine, since it is very slow on armv7/arm64 build 2021-10-31 13:07:10 +08:00
Louis Lam
b5d6e96b1d Merge pull request #842 from gaby/issue-form-updates
Update the wording used when reporting an Issue via Forms
2021-10-31 10:49:24 +08:00
Juan Calderon-Perez
68b74f07e4 Update wording of form field 2021-10-30 19:06:32 -04:00
Louis Lam
bc615c2dd8 Merge pull request #832 from ivanbratovic/croatian-language
Clarity and grammar fixes to hr-HR languange file
2021-10-31 00:52:41 +08:00
Louis Lam
e7104737e7 prevent to show "New Update" when the Docker image is not ready yet 2021-10-31 00:36:46 +08:00
Louis Lam
1dbf1c3dea fix logout 2021-10-30 23:33:20 +08:00
Jasper Miller-Waugh
74688e69aa Remove debug statement in server/routers/api-router.js
Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
2021-10-30 21:16:10 +13:00
Jasper Miller-Waugh
b32bfb3ff1 Added toggle for tag visibility 2021-10-30 21:16:10 +13:00
Jasper Miller-Waugh
24664cde2c Smarter CSS to fix Mobile alignment 2021-10-30 21:16:10 +13:00
Jasper Miller-Waugh
348c5ec995 Match lint settings 2021-10-30 21:16:10 +13:00
Jasper Miller-Waugh
9143b73f84 Styling for tags 2021-10-30 21:16:10 +13:00
Jasper Miller-Waugh
5e6d945095 Most hacked in POC 2021-10-30 21:16:10 +13:00
Louis
ba93129b18 Merge branch '1.9.X'
# Conflicts:
#	server/server.js
2021-10-30 10:05:08 +08:00
Louis
cf548df15f update to 1.9.2 2021-10-30 02:36:40 +08:00
Louis
caa2a34177 fix 2fa not working #833 2021-10-30 02:35:05 +08:00
Adam Stachowicz
69aa60d1fb Add missing i18n key + translate 2 keys for polish 2021-10-29 17:01:29 +02:00
Ivan Bratović
eaecd6e571 Clarity and grammar fixes to hr_HR languange file 2021-10-29 16:53:55 +02:00
Adam Stachowicz
f2a27a2cf1 Use hideCount option for pagination 2021-10-29 13:37:38 +02:00
Louis
d4c9431142 catch createWriteStream error 2021-10-29 18:28:31 +08:00
Louis
d7f7dba13f write some error logs to ./data/error.log 2021-10-29 18:24:47 +08:00
Louis
3e5ae00d25 update dependencies 2021-10-29 18:04:58 +08:00
Louis Lam
5311bef3eb Merge pull request #809 from Saibamen/pagination_no_text
Don't display "count" text for pagination
2021-10-29 16:05:59 +08:00
Louis Lam
c400595f67 Merge pull request #825 from SiderealArt/patch-1
Add Traditional Chinese (Taiwan) translation
2021-10-29 16:05:01 +08:00
Louis Lam
e84f7dac60 Merge pull request #821 from ivanbratovic/croatian-language
Add Croatian language
2021-10-29 16:03:28 +08:00
SiderealArt
67a22399bc Update i18n.js 2021-10-29 15:44:33 +08:00
SiderealArt
947fc6001e Update Settings.vue 2021-10-29 15:43:21 +08:00
SiderealArt
c87e67ad1b Add Traditional Chinese (Taiwan) translation 2021-10-29 15:39:02 +08:00
Ivan Bratović
6f92774a8f ESLint pass on hr-HR.js file 2021-10-28 16:17:07 +02:00
Ivan Bratović
6e76ab7426 Import hr-HR language in i18n.js 2021-10-28 16:07:47 +02:00
Ivan Bratović
b2fbd7e263 Add confirmDisableAuth tranlation for hr-HR 2021-10-28 16:04:56 +02:00
Ivan Bratović
199e6ec82b Add initial version of Croatian language 2021-10-28 15:56:34 +02:00
Adam Stachowicz
18a99c2016 Revert deleting records and "One record" keys 2021-10-28 14:20:56 +02:00
Louis Lam
e261a27ebe fix wrong call of rejectUnauthorized for smtp (#757) 2021-10-28 11:10:09 +08:00
Louis Lam
de5cce9d90 Steam API Key to HiddenInput 2021-10-27 23:03:03 +08:00
Louis Lam
b85c9186f9 Merge pull request #781 from louislam/cert-notification
Certificate renewal notifications
2021-10-27 22:43:43 +08:00
Louis Lam
eb22ad5ffe [certificate notification] error handling and better msg 2021-10-27 16:12:18 +08:00
Louis Lam
f5f4835b74 [certificate notification] clear sent history if the cert is changed 2021-10-27 16:03:16 +08:00
Louis Lam
44c1b336dc send certificate notifications in 21, 14, 7 days 2021-10-27 15:33:15 +08:00
Louis Lam
110ec491ee Merge branch 'master' into cert-notification 2021-10-27 14:16:37 +08:00
Louis Lam
640b6e5b1c prevent monitor dead for unexpected error 2021-10-27 14:08:44 +08:00
Louis Lam
234fba3978 Update SECURITY.md 2021-10-27 12:31:18 +08:00
Louis Lam
1285ccb537 Merge pull request #784 from gaby/issue-forms
Migrate issue templates to Github Issue Forms
2021-10-27 12:29:44 +08:00
Juan Calderon-Perez
6c542edfc9 Add examples for version and image tag. 2021-10-27 00:23:13 -04:00
Juan Calderon-Perez
767807dd22 Added text placeholders for versions. 2021-10-27 00:18:05 -04:00
Juan Calderon-Perez
546402f3d2 Added docker-image-tag field. 2021-10-27 00:11:50 -04:00
Louis Lam
698a38e773 clear status page cache in a better place 2021-10-27 11:39:46 +08:00
Louis Lam
71884cf42a Merge pull request #772 from andreasbrett/patch-6
show logged in user on settings page
2021-10-27 10:24:45 +08:00
Louis Lam
d676c782bb Update README.md 2021-10-27 10:11:08 +08:00
Juan Calderon-Perez
dd773aa5a2 Updates based on PR comments. 2021-10-26 22:10:48 -04:00
Louis Lam
2852e59ffb Merge pull request #812 from MrEddX/bulgarian
Update bg-BG.js
2021-10-27 09:37:42 +08:00
MrEddX
cb3da50e7e Update bg-BG.js
Small fixes
2021-10-26 22:46:57 +03:00
Louis Lam
f25653d778 Update README.md 2021-10-27 00:07:17 +08:00
Adam Stachowicz
2e7ad1b7b2 Don't display "count" text for pagination 2021-10-26 18:03:49 +02:00
Louis Lam
e0e1ab6fa6 Update CONTRIBUTING.md 2021-10-27 00:02:20 +08:00
Louis Lam
8d984881c9 Update CONTRIBUTING.md 2021-10-26 23:56:14 +08:00
Louis Lam
955f9ae20a Merge pull request #794 from louislam/free-disk-space
Free Disk Space
2021-10-26 23:09:27 +08:00
Louis Lam
a9e319517a add auto vacuum and shrink database button 2021-10-26 23:02:32 +08:00
Louis Lam
39ad8b4bb7 Merge branch 'master' into free-disk-space 2021-10-26 21:18:22 +08:00
Andreas Brett
8fb8cbdaf3 use auth0/jwt-decode 2021-10-26 13:15:31 +02:00
Andreas Brett
3f3d8b4eb3 fixes 2021-10-26 12:58:04 +02:00
Louis Lam
9123e9461f Update CONTRIBUTING.md 2021-10-26 16:38:00 +08:00
Louis Lam
77addfebc8 Merge branch 'tarun7singh_master'
# Conflicts:
#	src/languages/vi.js
2021-10-26 16:26:59 +08:00
Louis Lam
16846c7c6d Merge pull request #790 from Saibamen/pl_update+fixes
PL update + fixes
2021-10-26 16:25:04 +08:00
Louis Lam
d1c4d13903 Merge pull request #782 from Co2333/dev-lakr233-bark_notification
Support for Bark (APN) notifications
2021-10-26 16:23:11 +08:00
Louis Lam
7cd4bfc11d Merge pull request #806 from Saibamen/patch-1
Update PULL_REQUEST_TEMPLATE.md
2021-10-26 15:58:14 +08:00
Adam Stachowicz
1d5c0502ab Add other 2021-10-26 09:48:17 +02:00
Adam Stachowicz
a1cda93ad5 Update PULL_REQUEST_TEMPLATE.md
See https://github.com/louislam/uptime-kuma/pull/785#issuecomment-950521657
2021-10-26 09:46:12 +02:00
Louis Lam
3bd420f0e0 Merge pull request #752 from chakflying/feat/chart-period
Feat: Add options for Chart period
2021-10-26 12:53:42 +08:00
Louis Lam
78424b4f2d add simple loading chart effect 2021-10-26 12:48:21 +08:00
Louis Lam
f8055ed03d minor css 2021-10-26 12:33:46 +08:00
Louis Lam
fe4724fc53 Merge branch 'master' into feat/chart-period 2021-10-26 12:25:07 +08:00
Louis Lam
7f0dda6a44 Update CONTRIBUTING.md 2021-10-26 11:28:38 +08:00
Lakr Aream
43791ee97e Merge branch 'master' into dev-lakr233-bark_notification 2021-10-26 09:08:11 +08:00
Tarun Singh
6362ef6a9c removed other langauge translation data 2021-10-25 18:30:40 -04:00
Adam Stachowicz
9d3a4e9d1e Remove dot from needPushEvery 2021-10-26 00:00:54 +02:00
Tarun Singh
6c60096f56 Merge branch 'louislam:master' into master 2021-10-25 04:12:39 -04:00
Tarun Singh
ba1e025353 added click send to number 2021-10-25 04:11:57 -04:00
Louis Lam
a41a081727 Merge remote-tracking branch 'origin/master' 2021-10-25 12:29:53 +08:00
Louis Lam
a5f15f2319 Fix #793, check dist-backup existing before delete 2021-10-25 12:29:40 +08:00
Louis Lam
e69799f613 Update CONTRIBUTING.md 2021-10-25 12:07:44 +08:00
Louis Lam
3c795bebe3 Update CONTRIBUTING.md 2021-10-25 12:06:49 +08:00
Louis Lam
3a43fec666 add recommend pull request guideline 2021-10-25 12:06:01 +08:00
Louis Lam
24c645e437 [empty commit] pull request for free-disk-space 2021-10-25 10:59:13 +08:00
Louis Lam
9d31da1fe8 Merge pull request #792 from gaby/stalebot-fix
Rename stale-bot to stale-bot.yml
2021-10-25 10:26:15 +08:00
Juan Calderon-Perez
2e4c42941a Rename stale-bot to stale-bot.yml 2021-10-24 21:31:10 -04:00
Andreas Brett
4fc2603818 Merge branch 'patch-6' of https://github.com/andreasbrett/uptime-kuma into patch-6 2021-10-25 01:34:06 +02:00
Andreas Brett
7bc38d4231 remove unused vars 2021-10-25 01:33:45 +02:00
Andreas Brett
daad63d70b Merge branch 'master' into patch-6 2021-10-25 01:24:31 +02:00
Andreas Brett
9ddd2c7365 use jwt 2021-10-25 01:23:02 +02:00
Adam Stachowicz
fa5ba12e14 Missing this 2021-10-24 22:15:02 +02:00
Adam Stachowicz
85053f865e Fix typo 2021-10-24 21:56:37 +02:00
Adam Stachowicz
1239f6d1a2 PL update + fixes 2021-10-24 21:50:02 +02:00
Tarun Singh
fed611d1b9 Merge branch 'master' of https://github.com/louislam/uptime-kuma 2021-10-24 15:19:25 -04:00
Tarun Singh
bc68088350 Click send sms integration for notifications 2021-10-24 15:17:29 -04:00
Louis Lam
90200958cd Merge pull request #780 from kry008/patch-4
Update pl.js
2021-10-25 00:35:31 +08:00
Louis Lam
aa13d74d7a Merge pull request #788 from Ponkhy/german-language
Updated german language file
2021-10-25 00:32:40 +08:00
Ponkhy
d82f305f6e Updated german language file 2021-10-24 17:56:05 +02:00
Louis Lam
7c63cbfd84 add node.js 17 to auto test 2021-10-24 22:50:33 +08:00
Juan Calderon-Perez
c7e1267779 More syntax changes. Change What to Which 2021-10-24 10:12:17 -04:00
Louis Lam
5d0b54c292 Merge pull request #785 from Saibamen/patch-1
Create PULL_REQUEST_TEMPLATE.md
2021-10-24 22:07:46 +08:00
Juan Calderon-Perez
b50b390048 Changes based on PR requests 2021-10-24 10:04:56 -04:00
Adam Stachowicz
65158cb06b Update PULL_REQUEST_TEMPLATE.md
Changes after Code Review
2021-10-24 12:21:59 +02:00
Adam Stachowicz
8fe5e4e605 Fix lint 2021-10-24 11:19:42 +02:00
Adam Stachowicz
ab5ddae2ee Delete double new line 2021-10-24 11:18:07 +02:00
Adam Stachowicz
89c64f4ea2 Create PULL_REQUEST_TEMPLATE.md
From https://github.com/Harsha200105/DesktopAssistant/pull/51
2021-10-24 11:16:29 +02:00
Muhammed Hussein Karimi
4ccff95d9c add some information to readme (It should be final) 2021-10-24 11:42:09 +03:30
Juan Calderon-Perez
40a1ebecc5 Update feature_request.yaml 2021-10-24 00:51:47 -04:00
Juan Calderon-Perez
e1793596fe Merge pull request #1 from gaby/issue-forms 2021-10-24 00:49:18 -04:00
Juan Calderon-Perez
c489058a57 Update labels for each form 2021-10-24 00:46:10 -04:00
Juan Calderon-Perez
95342ec006 Update label for ask for help 2021-10-24 00:41:51 -04:00
Juan Calderon-Perez
bdebbf8e40 Add Support for Issue Forms 2021-10-24 00:40:06 -04:00
Juan Calderon-Perez
9a9fca67d5 Migrate Bug Report to Github Issue Forms 2021-10-23 22:58:35 -04:00
Muhammed Hussein Karimi
17a572112c better readme 2021-10-23 23:04:47 +03:30
Muhammed Hussein Karimi
91649e7956 change docker compose version 2021-10-23 22:50:02 +03:30
Nelson Chan
665bae0806 UI: Simplify dropdown design 2021-10-24 01:45:57 +08:00
Nelson Chan
e4be28a9e7 Fix: Validate beat time before appending 2021-10-24 01:45:38 +08:00
Nelson Chan
445674aacb Chore: Improve code formatting & comments 2021-10-24 01:45:10 +08:00
Nelson Chan
2f7b60f5e5 Feat: Use separate storage for custom chart period
Fix: Fix import error
2021-10-24 01:44:55 +08:00
Nelson Chan
b83c59e308 WIP: Add options for chart period
Fix: Fix callback, add toast on error

Fix: Improve styling

Fix: Restore default chart behavior

Fix: Replace 1h with 3h

draft only
2021-10-24 01:44:08 +08:00
Lakr Aream
ce852dfa02 Support for Bark (APN) notifications
Update bark.js
2021-10-24 00:31:43 +08:00
Louis Lam
c9549c0de2 change body and header placeholders, less misleading. 2021-10-23 22:14:05 +08:00
Louis Lam
957c292307 add certificate-notification job 2021-10-23 21:44:21 +08:00
kry008
b5eb17ed93 Update pl.js 2021-10-23 15:07:24 +02:00
Louis Lam
d578300104 Merge pull request #743 from andreasbrett/patch-4
Harden 2FA/TOTP implementation according to rfc6238 (part 2)
2021-10-23 17:00:46 +08:00
Louis Lam
b77b33e790 add login rate limiter 2021-10-23 16:35:13 +08:00
Andreas Brett
4becb97a5d Update en.js 2021-10-23 01:54:36 +02:00
Andreas Brett
85e2b36424 Update en.js 2021-10-23 01:54:07 +02:00
Andreas Brett
abdf1ae90a Update en.js 2021-10-23 01:53:31 +02:00
Andreas Brett
606c967985 Merge branch 'master' into patch-6 2021-10-23 01:52:54 +02:00
Andreas Brett
93c231b4d9 Update server/server.js
Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
2021-10-23 01:52:02 +02:00
Muhammed Hussein Karimi
c42c985e9e installing docker python library
see https://github.com/geerlingguy/ansible-role-docker#use-with-ansible-and-docker-python-library
2021-10-22 21:30:56 +03:30
Muhammed Hussein Karimi
177a9598ea better ssl handling 2021-10-22 21:08:19 +03:30
Muhammed Hussein Karimi
133def93fe typo fix 2021-10-22 20:56:58 +03:30
Muhammed Hussein Karimi
90ebf4f66c using variables for domain and guid to run added to readme 2021-10-22 20:53:28 +03:30
Muhammed Hussein Karimi
e0e5f3518a ansible requirements added 2021-10-22 20:40:01 +03:30
Muhammed Hussein Karimi
a81cc92b07 Fix name for docker_compose ansible module
to make it working with newer ansible
2021-10-22 20:39:43 +03:30
Muhammed Hussein karimi
d6f79ee80b Using geerlingguy ansible role for docker compose 2021-10-22 20:18:51 +03:30
Muhammed Hussein karimi
f0632f32ee remove docker role 2021-10-22 20:17:34 +03:30
Andreas Brett
9ad8e5f56a show logged in user 2021-10-22 13:05:52 +02:00
Louis Lam
8a481a1be0 Merge pull request #769 from andreasbrett/patch-5
show beat.msg only if available
2021-10-22 18:14:52 +08:00
Andreas Brett
657987a013 fix: show beat.msg only if available 2021-10-22 11:59:53 +02:00
Louis Lam
d74577608b Merge pull request #766 from DX37/translation-ru
Update notifications area in ru-RU.js
2021-10-22 14:10:15 +08:00
Louis Lam
20a399c557 Merge pull request #767 from mrphuongbn/master
Add Vietnamese language
2021-10-22 14:04:32 +08:00
Phuong Nguyen Minh
060dde9827 Merge branch 'louislam:master' into master 2021-10-22 08:08:22 +07:00
DX37
1d1601cf24 Update notifications area in ru-RU.js 2021-10-21 22:49:17 +07:00
Louis Lam
ff5f2e8dfb add limiter 2021-10-21 23:03:40 +08:00
Louis Lam
5451fb7672 Merge remote-tracking branch 'origin/master' 2021-10-21 22:54:21 +08:00
Louis Lam
56094a43d7 add passwordStrength 2021-10-21 22:54:04 +08:00
Louis Lam
68bbe8944a Merge pull request #756 from DX37/translation-ru
Update ru-RU.js
2021-10-21 10:56:54 +08:00
Louis Lam
8f1da6aa22 Update CONTRIBUTING.md 2021-10-21 00:08:46 +08:00
Louis Lam
c0d6fe0d76 Update CONTRIBUTING.md 2021-10-21 00:03:55 +08:00
DX37
29e4e41215 Update ru-RU.js 2021-10-20 23:00:29 +07:00
Louis Lam
7a1bb964e9 Update bug_report.md 2021-10-20 18:09:23 +08:00
Louis Lam
3fe0e9bf1e Update ask-for-help.md 2021-10-20 18:09:10 +08:00
Louis Lam
9982887783 Update feature_request.md 2021-10-20 18:08:52 +08:00
Louis Lam
c31efc0ef4 Merge pull request #748 from MrEddX/bulgarian
Fix: Integration Link Text
2021-10-20 14:37:45 +08:00
MrEddX
6463d4b209 Fix: Integration Link Text
Maybe left there from the Slack template.
2021-10-20 09:09:08 +03:00
Louis Lam
acada8028a Merge pull request #747 from MrEddX/bulgarian
Update bg-BG.js
2021-10-20 11:58:12 +08:00
MrEddX
d0b0c64b81 Update bg-BG.js
- Fixed existing fields
- Added new fields
- Translated new fields
2021-10-19 23:03:46 +03:00
Louis Lam
cd04ac4557 "dist/index.html" is no longer needed for development environment 2021-10-20 01:32:19 +08:00
Louis Lam
d7d2f7b7fc Merge pull request #745 from dpatrongomez/patch-2
Add steam translation in spanish
2021-10-20 00:46:55 +08:00
Daniel Patrón Gómez
5a05d135b8 Add steam translation in spanish 2021-10-19 17:11:32 +02:00
Louis Lam
e03ee593e2 Merge pull request #716 from NeuralMiner/textchanges
Text update
2021-10-19 16:34:00 +08:00
Louis Lam
6c1ee70e15 fix 2021-10-19 16:29:09 +08:00
Louis Lam
5c3892313e add env var: UPTIME_KUMA_DISABLE_FRAME_SAMEORIGIN 2021-10-19 14:41:05 +08:00
Louis Lam
c57c94642c Merge remote-tracking branch 'origin/master' 2021-10-19 14:26:26 +08:00
Louis Lam
62f168a2a5 config response header 2021-10-19 14:26:10 +08:00
Louis Lam
c808f78f09 Merge pull request #735 from gaby/stale-bot
Support for closing stale Issues/PRs after 6 months of inactivity
2021-10-19 11:59:37 +08:00
Louis Lam
9c80e1c732 Merge pull request #641 from andreasbrett/patch-1
Harden 2FA/TOTP implementation according to rfc6238 (part 1)
2021-10-19 10:17:04 +08:00
Andreas Brett
acc2995d86 invalidate used token 2021-10-19 00:42:33 +02:00
Andreas Brett
7def9dcec7 Merge branch 'louislam:master' into patch-1 2021-10-19 00:37:15 +02:00
NeuralMiner
a35569481d Updates 2021-10-18 15:26:38 -06:00
NeuralMiner
9ddffc0f7f Updates 2021-10-18 14:35:47 -06:00
NeuralMiner
76e7c8b276 Rebase 2021-10-18 14:35:36 -06:00
NeuralMiner
572a5300aa Recommended updates. 2021-10-18 13:25:53 -06:00
NeuralMiner
e1f1d4a959 Merge branch 'louislam:master' into textchanges 2021-10-18 12:57:28 -06:00
Louis Lam
c6fc385289 update to 1.9.1 2021-10-19 00:20:27 +08:00
Louis Lam
c645658161 Merge remote-tracking branch 'origin/master' 2021-10-19 00:19:41 +08:00
Louis Lam
182597944d fix #721 2021-10-19 00:19:26 +08:00
Louis Lam
8eaa8116c3 update email 2021-10-18 23:55:00 +08:00
Louis Lam
3512faad14 move kubernetes folder to the k8s-unofficial branch 2021-10-18 23:38:29 +08:00
Louis Lam
f11417e854 [upload artifacts] no idea why suddenly not working via env var, hardcode the VERSION instead 2021-10-18 20:43:17 +08:00
Juan Calderon-Perez
b5857f7c0c Fix syntax issue. 2021-10-18 08:23:18 -04:00
Juan Calderon-Perez
6277babf25 Migrate to actions/stale v4.0 2021-10-18 08:22:08 -04:00
Louis Lam
5f36d2acda fix upload artifacts 2021-10-18 20:02:50 +08:00
Louis Lam
cc36ff5210 update to 1.9.0 2021-10-18 19:46:15 +08:00
Louis Lam
c363d3374e fix "build-docker-nightly-alpine" wrong path 2021-10-18 19:45:50 +08:00
Louis Lam
65a8cb5307 Merge pull request #738 from NixNotCastey/promosms
PromoSMS - Fixed values for sms type
2021-10-18 18:28:58 +08:00
Lukas
f74b2662c5 Fixed values for sms type 2021-10-18 12:02:54 +02:00
Louis Lam
300a95d779 recompile util.js with tsconfig.json 2021-10-18 17:51:40 +08:00
Louis Lam
23714ab688 genSecret don't need await 2021-10-18 17:37:11 +08:00
Louis Lam
16b44001e7 Merge remote-tracking branch 'andreasbrett/patch-1' into andreasbrett_patch-1
# Conflicts:
#	src/util.js
2021-10-18 17:35:17 +08:00
Louis Lam
f2f8f33b86 Merge branch 'master' into andreasbrett_patch-1
# Conflicts:
#	src/util.js
2021-10-18 17:30:21 +08:00
Louis Lam
6e18f39eb4 [steam] code cleanup 2021-10-18 17:15:28 +08:00
Louis Lam
68d44dd9b3 [steam] do not request if there is no steam api key 2021-10-18 17:11:41 +08:00
Louis Lam
20d59e5a13 fix and move the steam api key to settings page 2021-10-18 17:02:05 +08:00
Louis Lam
ae31eb6ba9 Merge branch 'master' into Revyn112_master
# Conflicts:
#	server/model/monitor.js
#	src/languages/en.js
#	src/pages/EditMonitor.vue
2021-10-18 15:50:35 +08:00
Andreas Brett
df4682d19b Merge branch 'master' into patch-1 2021-10-18 01:14:58 +02:00
Andreas Brett
11a1f35cc5 independent csprng solution 2021-10-18 01:06:20 +02:00
Juan Calderon-Perez
2a3ce15328 Use default number of operations per day. Defaults to 30 2021-10-17 17:23:44 -04:00
Juan Calderon-Perez
7cb25255bf Update stale-bot 2021-10-17 17:20:32 -04:00
Juan Calderon-Perez
c622f7958f Add support for closing stale Issues/PR 2021-10-17 17:16:07 -04:00
Louis Lam
df5efcc71c Merge pull request #730 from sargonas/sargonas-patch-1
Update README.md
2021-10-17 23:25:19 +08:00
J. Eckert
4cd66b20b1 Update README.md
additional spelling correction
2021-10-17 08:08:44 -07:00
J. Eckert
1276102c18 Update README.md
minor grammatical edits for slight improvements. (Honestly though, your grammar is not that bad at all for not being a native speaker!)
2021-10-16 23:07:25 -07:00
Louis Lam
6944b35ea7 Merge pull request #667 from zsxeee/i18n
Missing i18n and zh-CN translation
2021-10-16 22:47:58 +08:00
Louis Lam
88757ebbbe Merge pull request #722 from dpatrongomez/master
Add spanish translation for monitor history and records
2021-10-16 22:46:29 +08:00
Daniel Patrón Gómez
0a73b84ae6 Add records translations and fix pause translation 2021-10-16 12:45:41 +02:00
Daniel Patrón Gómez
15f36f96c3 Add spanish translation for monitor history 2021-10-16 12:15:39 +02:00
Louis Lam
edcaf93446 Merge pull request #721 from dpatrongomez/master
Add Status Translation
2021-10-16 17:41:46 +08:00
Louis Lam
dec175d55f Merge pull request #719 from bertyhell/bugfix/edit-monitor
fix(edit-monitor): no need to escape placeholder {} if not translated
2021-10-16 17:38:00 +08:00
Louis Lam
9a60f69f66 Merge pull request #720 from bertyhell/bugfix/fix-error-on-first-hearthbeat
fix(monitor): safely get status of previous beat if first beat
2021-10-16 17:34:44 +08:00
Daniel Patrón Gómez
53a008ae2b Add Status Translation 2021-10-16 11:32:15 +02:00
Bert Verhelst
1d63dd9ddd fix(monitor): safely get status of previous beat if first beat 2021-10-16 11:28:03 +02:00
Bert Verhelst
61627545a5 fix(edit-monitor): no need to escape placeholder {} if not translated 2021-10-16 11:26:32 +02:00
Louis Lam
176fa6b60d merge package-lock.json 2021-10-16 16:32:28 +08:00
Louis Lam
cb43ecb46e Merge branch 'master' into background-jobs
# Conflicts:
#	package-lock.json
#	package.json
#	src/languages/en.js
2021-10-16 15:06:59 +08:00
Louis Lam
2e24312f67 [test] jest please 2021-10-16 14:54:45 +08:00
Louis Lam
6ff3cb275e Merge pull request #642 from andreasbrett/patch-2
Harden 2FA/TOTP implementation according to rfc6238 (part 3)
2021-10-16 14:30:25 +08:00
Louis Lam
9d364b28b1 Merge pull request #715 from januridp/master
Fix(Language): Bahasa Indonesia (Indonesian)
2021-10-16 13:02:57 +08:00
Louis Lam
bc3e3f9118 [test] update 2021-10-16 13:02:04 +08:00
Louis Lam
0f3ab7b1d8 [test] increase the timeout for reset-password 2021-10-16 12:56:33 +08:00
NeuralMiner
8cb26d2b31 Text update 2021-10-15 19:12:09 -06:00
januridp
d94fbede32 Fix(Language): Bahasa Indonesia (Indonesian) 2021-10-16 07:39:32 +07:00
januridp
76e619c066 Fix(Language): Bahasa Indonesia (Indonesian) 2021-10-16 07:36:07 +07:00
januridp
4e4f94ab98 Fix(Language): Bahasa Indonesia (Indonesian) 2021-10-16 07:29:51 +07:00
januridp
ed3a558397 Fix(Language): Bahasa Indonesia (Indonesian) 2021-10-16 07:15:01 +07:00
Louis Lam
a419aa527f Merge remote-tracking branch 'origin/master' 2021-10-16 01:33:56 +08:00
Louis Lam
4d26825cbe [test] reset-password 2021-10-16 01:33:44 +08:00
Louis Lam
7276f34d90 fix reset-password 2021-10-16 00:57:26 +08:00
Louis Lam
e1eeb44e7f Update SECURITY.md 2021-10-15 19:44:29 +08:00
Louis Lam
f4b8da0a5c Merge branch 'feature/add-support-for-method-body-and-headers' 2021-10-15 19:02:49 +08:00
Louis Lam
4178983df3 Merge remote-tracking branch 'origin/master' 2021-10-15 19:01:04 +08:00
Louis Lam
7ac0ab2e34 [http options] beautify the json format when clicked the save button 2021-10-15 18:57:27 +08:00
Louis Lam
cd211a6be7 [http options] fine tune 2021-10-15 18:36:40 +08:00
Louis Lam
4e71ab7406 Merge branch 'master' into feature/add-support-for-method-body-and-headers 2021-10-15 16:07:05 +08:00
Louis Lam
76c68071f1 Merge pull request #709 from iooner/patch-1
Update fr-FR.js
2021-10-15 15:16:22 +08:00
Phuong Nguyen Minh
bda481c61e Update vi.js 2021-10-15 08:26:33 +07:00
iooner
8242a1586d Update fr-FR.js 2021-10-14 22:23:01 +02:00
Louis Lam
c593a962c2 Merge pull request #627 from NixNotCastey/smtp-subject
Add support for custom subject in emails
2021-10-15 00:54:31 +08:00
Louis Lam
c9b4d2ae2a Merge pull request #698 from erktime/master
Add monitor name context to Slack fallback text.
2021-10-14 23:31:48 +08:00
Louis Lam
37105d720b Merge pull request #706 from firattemel/master
Update tr-TR.js
2021-10-14 22:40:45 +08:00
Louis Lam
3b74b727f2 [Push Type] fix missing important flag and missing up notification 2021-10-14 22:32:15 +08:00
firattemel
2f0119bc3f Update tr-TR.js 2021-10-14 17:29:13 +03:00
Louis Lam
a7d2a34dae fix ping bug 2021-10-14 18:48:40 +08:00
Louis Lam
60acb91fc8 Merge pull request #687 from xjoker/master
Add new notification `Aliyun Sms` and `DingDing`
2021-10-14 17:02:23 +08:00
Louis Lam
f51156f18e run eslint for #687 2021-10-14 16:24:03 +08:00
Louis Lam
8338881927 [SMTP] change {{HOSTNAME}} to {{HOSTNAME_OR_URL}}, support for http montior type, some UI improvements 2021-10-14 16:07:25 +08:00
Louis Lam
674b387c95 Merge branch 'master' into smtp-subject 2021-10-14 14:59:54 +08:00
Louis Lam
5ff9a64e5e [Push Type] Fix missing duration calculation (#685) 2021-10-14 14:42:34 +08:00
Louis Lam
4bee57ea7f Merge remote-tracking branch 'giacomo892/patch-1'
# Conflicts:
#	server/ping-lite.js
2021-10-14 14:10:51 +08:00
Louis Lam
f75c9e4f0c add UPTIME_KUMA_HOST, UPTIME_KUMA_PORT and special handling for FreeBSD 2021-10-14 14:09:16 +08:00
xJoker
8ab4788f80 Update src/components/notifications/index.js
Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
2021-10-14 09:33:36 +08:00
xJoker
4e4ab0577e Update src/components/notifications/index.js
Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
2021-10-14 09:33:31 +08:00
xJoker
6e04ec436e Update server/notification-providers/dingding.js
Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
2021-10-14 07:34:45 +08:00
xJoker
2d471a5e84 Update server/notification-providers/dingding.js
Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
2021-10-14 07:34:33 +08:00
xJoker
cae194f58f Update server/notification-providers/dingding.js
Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
2021-10-14 07:34:24 +08:00
Aaron Erkenswick
655ccc86b9 Add monitor name context to Slack fallback text.
The text block of a slack notification payload is used for mobile
devices and plain text previews. This change allows slack users to see
the name of the failing service without having to open up Slack to read
the entire message.
2021-10-13 11:47:23 -07:00
Louis Lam
e2dbacb383 Fix encoding problem of ping result for non-English Windows 2021-10-14 00:22:49 +08:00
Lukas
89b34b5748 Use double curly brackets and sanity check for customSubject 2021-10-13 18:05:18 +02:00
Andreas Brett
86dcc9bc8f import webcrypto lib 2021-10-13 17:34:56 +02:00
Louis Lam
9b05e86c25 set newLine to LF for ts compiler 2021-10-13 22:31:36 +08:00
Louis Lam
145b722aec Merge branch 'master' into andreasbrett_patch-1 2021-10-13 22:17:33 +08:00
Louis Lam
2ff7c4de5d [test] genSecret 2021-10-13 22:16:46 +08:00
Louis Lam
79c81395bc Merge branch 'master' into andreasbrett_patch-1 2021-10-13 22:02:27 +08:00
Louis Lam
178e5cd2c0 Merge pull request #689 from hrtkpf/master
fix translations (de-DE and en)
2021-10-13 17:47:20 +08:00
hrtkpf
84507268ad fix translations (de-DE and en) 2021-10-13 11:13:51 +02:00
wuwenjing
843992c410 Add DingDing notification 2021-10-13 16:13:46 +08:00
zsxeee
33f773fcd0 Move param out of the translation file 2021-10-13 15:36:07 +08:00
zsxeee
26841a64f0 Update zh-CN.js 2021-10-13 15:10:59 +08:00
Phuong Nguyen Minh
89c0f8b734 Update i18n.js 2021-10-13 13:44:31 +07:00
wuwenjing
57a76e6129 remove alicloud/pop-core keep simple 2021-10-13 14:41:59 +08:00
Phuong Nguyen Minh
dc805cff97 Add files via upload 2021-10-13 13:36:09 +07:00
giacomo892
3fe3450533 Prioritize port passed from args
Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
2021-10-13 08:29:55 +02:00
Lukas
330cd6e058 Minor rehabilitanty impedyment
Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
2021-10-13 07:32:09 +02:00
wuwenjing
a2f2253221 Add aliyun sms notification 2021-10-13 11:55:01 +08:00
Louis Lam
1e5ce92917 Merge pull request #678 from wellart/master
add indonesian language
2021-10-13 11:23:21 +08:00
Louis Lam
0d7c2960b0 Merge pull request #683 from Saibamen/fix_markdown
Fix some of markdownlint warnings
2021-10-13 11:01:37 +08:00
Louis Lam
82343de972 Merge pull request #682 from Saibamen/patch-1
Fix build and tests
2021-10-13 10:54:30 +08:00
Adam Stachowicz
521d57c483 Fix some of markdownlint warnings 2021-10-13 02:01:34 +02:00
Adam Stachowicz
281671b938 Fix build
Add `cross-env` deleted in 11c3c636e0
2021-10-13 01:10:17 +02:00
Lukas
30d8aadf12 Slightly refactor 2021-10-12 23:24:34 +02:00
KangAlleW
2939bd4138 fix locale 2021-10-13 03:12:26 +07:00
KangAlleW
dcf15c3eb7 edit i18n.js 2021-10-13 02:58:09 +07:00
KangAlleW
7c9ed98408 rename id.js to id-ID.js 2021-10-13 02:57:36 +07:00
KangAlleW
4b9f0a3fe6 add indonesian language and edit settings.vue 2021-10-13 02:53:46 +07:00
KangAlleW
5b67fec084 add indonesian language 2021-10-13 02:46:11 +07:00
Louis Lam
407581ee07 move jest config files to config dir 2021-10-13 02:53:59 +08:00
Louis Lam
11c3c636e0 move dockerfile, docker-compose.yml to docker folder 2021-10-13 02:32:02 +08:00
Louis Lam
911d4ea37b move vite.config.js to config folder 2021-10-13 02:27:25 +08:00
Louis Lam
4039c6549e Merge remote-tracking branch 'origin/master' 2021-10-13 02:16:03 +08:00
giacomo892
d733ec018e Prioritize host arg
Otherwise launching the program with the --host argument does nothing
2021-10-12 19:37:58 +02:00
Muhammed Hussein karimi
97fe7c001c Uaing alpine image 2021-10-12 19:35:25 +03:30
Nelson Chan
03b07730d3 Fix: Increase default kept period 2021-10-12 23:28:21 +08:00
Louis Lam
dbc87d8ab3 Merge pull request #670 from dhfhfk/master
Update ko-KR.js
2021-10-12 22:27:27 +08:00
dhfhfk
05b691d4c9 Fix typo 2021-10-12 20:39:15 +09:00
Louis Lam
029d6412da Merge pull request #669 from pemassi/patch-2
Update ko-KR.js
2021-10-12 18:27:11 +08:00
Louis Lam
9f12f95cce Merge pull request #666 from Rohlik/patch-1
Fix length
2021-10-12 17:32:20 +08:00
Kyungyoon Kim
c1112a32df Update ko-KR.js 2021-10-12 18:19:44 +09:00
Kyungyoon Kim
efc78acfeb Update ko-KR.js 2021-10-12 18:17:13 +09:00
zsxeee
9e01959d15 Update zh-CN.js 2021-10-12 16:30:39 +08:00
zsxeee
3fe91c52cb Fix i18n
Missing webhook json description
Ajust Telegram context-based sentence, (also changed translated language files)
Missing primary base url label
Wrong PromoSMS i18n
Missing Octopush legacy hint
Missing Matrix i18n
Missing push url i18n
2021-10-12 16:29:18 +08:00
Tomas Rohrer
5269dcec60 Fix length
In fact, it is 10 min demo :)
2021-10-12 10:21:03 +02:00
zsxeee
a2cc7d1db9 Avoid directory not found error 2021-10-12 15:10:32 +08:00
Muhammed Hussein karimi
de6437e494 Apply suggestion (nginx version and config)
Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
2021-10-12 08:08:07 +03:30
Muhammed Hussein karimi
5db728841b somthing was missing in nginx tasks 2021-10-12 07:57:44 +03:30
Louis Lam
18c5a16783 Update README.md 2021-10-12 11:15:02 +08:00
Muhammed Hussein karimi
166c4d6b5f Update README.md 2021-10-11 23:51:17 +03:30
Muhammed Hussein Karimi
12d3aeb0cd ansible playbook added
this playbook will install docker
then install uptime kuma using docker
and install and configure nginx with ssl
2021-10-11 23:48:01 +03:30
Andreas Brett
2538bd04ce notp verification defaults 2021-10-11 20:18:40 +02:00
Louis Lam
b7528b9a4e Merge pull request #657 from thomasleveil/patch-2
[i18n] minor fixes to french translations
2021-10-12 02:17:53 +08:00
Thomas LÉVEIL
9c058054b9 [i18n] minor update to french translations 2021-10-11 19:55:02 +02:00
Louis Lam
c6683e2a9b Merge pull request #648 from atlochowski/patch-1
Update pl.js
2021-10-12 00:04:33 +08:00
Louis Lam
b558708be2 Merge pull request #650 from xjoker/master
Add Feishu as notification provider
2021-10-12 00:02:29 +08:00
Louis Lam
fd0dd2d284 Merge pull request #652 from GhostSlayer/patch-1
Create PM2 Config file
2021-10-11 23:50:37 +08:00
xJoker
1bc77a06e5 Update server/notification-providers/feishu.js
Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
2021-10-11 20:38:32 +08:00
xJoker
69c623ac2b Update server/notification-providers/feishu.js
Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
2021-10-11 20:38:19 +08:00
Atlochowski
69ffee55dd Update pl.js 2021-10-11 14:33:00 +02:00
Slayer
d769c4426c Create PM2 Config file
I don't know if this is a good idea, but users that prefer to use PM2 instead, they can run `pm2 start` instead of `pm2 start server/server.js --name uptime-kuma` with this configuration
2021-10-11 15:22:52 +03:00
Atlochowski
ebf0671fef Update pl.js 2021-10-11 13:45:25 +02:00
Louis Lam
97af09fd50 Update README.md 2021-10-11 19:41:56 +08:00
Louis Lam
5b19e3f025 Update README.md 2021-10-11 19:40:51 +08:00
wuwenjing
ce2df137e6 change text to using variable msg 2021-10-11 17:53:13 +08:00
wuwenjing
6d9b71c054 Add Feishu notification 2021-10-11 17:20:09 +08:00
Atlochowski
a433de74e6 Update pl.js
small fix
2021-10-11 09:24:45 +02:00
LouisLam
8e3f43d60b Merge remote-tracking branch 'origin/master' 2021-10-11 13:28:42 +08:00
Louis Lam
2a1fd93444 Merge pull request #643 from andreasbrett/patch-3
translation fixes (german)
2021-10-11 12:55:25 +08:00
Andreas Brett
dc1de50a02 fix for max-inclusive 2021-10-11 01:18:33 +02:00
Andreas Brett
e223e826a3 linting 2021-10-11 01:02:54 +02:00
Andreas Brett
0e6d7694ce Update util.js 2021-10-10 23:54:45 +02:00
Andreas Brett
503d1f0a91 translation fixes 2021-10-10 23:20:56 +02:00
Andreas Brett
11bcd1e2ed const 2021-10-10 22:55:32 +02:00
Andreas Brett
06310423f4 typo 2021-10-10 22:19:10 +02:00
Andreas Brett
e127e168b6 typed parameters 2021-10-10 22:15:42 +02:00
Andreas Brett
b5b391c73b avoid default values for token verification
override default values: window=1, window size=30 (see https://github.com/louislam/uptime-kuma/issues/640)
2021-10-10 22:13:18 +02:00
Andreas Brett
075535ba46 Update util.ts 2021-10-10 21:59:23 +02:00
Andreas Brett
13cf6891ac cryptographically strong secret generation
generate TOTP secret using WebCrypto API (see https://github.com/louislam/uptime-kuma/issues/640)
2021-10-10 21:58:23 +02:00
Louis Lam
ad0cde6554 Merge pull request #633 from dhfhfk/master
Update ko-KR
2021-10-11 01:04:32 +08:00
Louis Lam
25d18f0da3 Merge pull request #636 from DanielRTRD/add-norwegian-lang
Add Norwegian Language
2021-10-11 01:03:55 +08:00
RisedSky
e9445bb2e3 Merge pull request #1 from RisedSky/RisedSky-patch-FR-Lang
Update fr-FR.js (again)
2021-10-10 19:03:22 +02:00
RisedSky
ecc25ba596 Update fr-FR.js
Fixed wrong string
Also, "Primary Base URL" is missing from english file
2021-10-10 19:02:35 +02:00
LouisLam
e5286b0973 eslint for ko-KR.js 2021-10-11 00:52:46 +08:00
LouisLam
4e94cb9aad fix upload dist path 2021-10-11 00:51:18 +08:00
Daniel S. Billing
037fdd73a3 Norsk 2021-10-10 18:50:18 +02:00
Daniel S. Billing
bb9a936658 Translated some of the notifications services 2021-10-10 18:49:03 +02:00
Bert Verhelst
5445c2a2ff fix(monitor): revert unintentional change to comment 2021-10-10 18:41:29 +02:00
Bert Verhelst
dc08510e72 Merge remote-tracking branch 'origin/master' into feature/add-support-for-method-body-and-headers 2021-10-10 18:40:53 +02:00
Daniel S. Billing
62805014df Update Settings.vue 2021-10-10 18:38:19 +02:00
Daniel S. Billing
c79e80442a Update i18n.js 2021-10-10 18:38:15 +02:00
Daniel S. Billing
f0ff96afd9 Create nb-NO.js 2021-10-10 18:31:17 +02:00
Louis Lam
8083368a81 Merge pull request #634 from RisedSky/patch-1
Update fr-FR.js
2021-10-10 23:58:09 +08:00
RisedSky
afb75e07d5 Update fr-FR.js
Fixed string (Device => Appareil in French)
2021-10-10 17:37:05 +02:00
RisedSky
efd3822930 Update fr-FR.js
All the lines corresponds to the English version (sorted correctly)
Plus, updated all the translated strings
2021-10-10 17:33:02 +02:00
dhfhfk
2adac64c83 Update ko-KR.js 2021-10-11 00:02:37 +09:00
Louis
cee225bcb2 no idea why npm prune --production suddenly not working, switch to npm ci --production 2021-10-10 17:55:31 +08:00
Louis
8958c21736 Merge remote-tracking branch 'origin/master' 2021-10-10 17:41:54 +08:00
Louis
2286f78f57 update to 1.8.0 2021-10-10 16:37:53 +08:00
Louis
d9eab90a69 Merge branch 'no-need-build'
# Conflicts:
#	.dockerignore
#	.gitignore
2021-10-10 16:34:13 +08:00
Louis Lam
4ba2025451 minor 2021-10-10 14:40:19 +08:00
LouisLam
272d4bde45 find promossms language key typo 2021-10-10 13:19:10 +08:00
LouisLam
0550ceb6d4 Merge remote-tracking branch 'origin/master' 2021-10-10 13:09:52 +08:00
LouisLam
82131f4dd2 merge conflict 2021-10-10 13:09:30 +08:00
Louis Lam
0c88e4b2f6 Merge pull request #629 from NixNotCastey/pl-update
Polish translation update
2021-10-10 12:45:26 +08:00
Louis Lam
5c6230da58 Merge pull request #630 from xinac721/master
Update Simplified Chinese Language(更新简体中文语言)
2021-10-10 12:43:17 +08:00
Louis Lam
d6753b8833 Update SECURITY.md 2021-10-10 12:20:29 +08:00
Louis Lam
93a021d027 Update SECURITY.md 2021-10-10 12:20:15 +08:00
新逸Cary
54f864a1bb Update Simplified Chinese Language(更新简体中文语言) 2021-10-10 10:04:07 +08:00
Lukas
d6f7be9112 Translated all missing texts and updated few of previously translated. 2021-10-10 00:38:19 +02:00
Bert Verhelst
5137c80c07 fix(monitor): handle empty headers 2021-10-09 21:51:24 +02:00
Lukas
792f3c7c5c Add support for values of Name, Hostname and Status 2021-10-09 21:48:28 +02:00
Bert Verhelst
8a739af5ad Merge remote-tracking branch 'origin/master' into feature/add-support-for-method-body-and-headers 2021-10-09 21:44:22 +02:00
Lukas
edb75808d8 Merge branch 'louislam:master' into smtp-subject 2021-10-09 20:37:12 +02:00
LouisLam
56ae6f6117 fix demoMode export 2021-10-10 02:36:20 +08:00
Lukas
5e3ea3293c Very basic email subject customization 2021-10-09 20:32:45 +02:00
LouisLam
5c89562650 not allow lower than 20s for demo mode 2021-10-10 02:23:27 +08:00
Louis Lam
1f7f20526f Merge pull request #620 from MrEddX/bulgarian
Update bg-BG.js
2021-10-10 01:12:38 +08:00
Louis Lam
0f5b437015 Merge pull request #622 from robinschneider/patch-1
Fixed spelling for german language support
2021-10-10 00:25:04 +08:00
Nelson Chan
ac80631bcd Fix: Run clear data at specific time 2021-10-10 00:16:29 +08:00
Nelson Chan
8caf47988c Fix: Allow setting settings type 2021-10-10 00:16:13 +08:00
Robin Schneider
6fe014fa5e Fixed spelling for german language support
Fixed spelling for german language support, hacktoberfest-accepted label woul be appreciated.
2021-10-09 18:05:52 +02:00
Nelson Chan
6cf2eb036d Fix: Improve settings layout and wording 2021-10-09 23:51:05 +08:00
MrEddX
9d7def93a5 Update bg-BG.js 2021-10-09 18:44:12 +03:00
Nelson Chan
dca5a59dbc Feat: Implement data clearing logic & frontend 2021-10-09 23:33:47 +08:00
Nelson Chan
656a4d6270 WIP: Enable background jobs
WIP: Remove better-sqlite3
2021-10-09 21:46:59 +08:00
Louis Lam
6dd0e082b4 Merge pull request #614 from pemassi/patch-1
More translate to Korean
2021-10-09 19:43:49 +08:00
Kyungyoon Kim
2e95e2016d Translate to Korean 2021-10-09 05:25:49 -06:00
Louis Lam
4169127143 Update FUNDING.yml 2021-10-09 19:17:01 +08:00
LouisLam
cac0a46bac fix error if tls info object is in old format 2021-10-09 19:08:38 +08:00
Bert Verhelst
d71d27220b fix(edit-monitor): store headers as JSON 2021-10-09 12:42:32 +02:00
Bert Verhelst
fba4f86552 Merge branch 'master' into feature/add-support-for-method-body-and-headers 2021-10-09 12:35:08 +02:00
LouisLam
e023ddf1c2 Merge remote-tracking branch 'origin/master' 2021-10-09 17:45:20 +08:00
LouisLam
23a2d33f8c [backup] restore pushToken 2021-10-09 17:45:05 +08:00
Bert Verhelst
b8093e909b fix(edit-monitor): fix minification of translations containing { } 2021-10-09 11:38:12 +02:00
Bert Verhelst
c3c273f9df fix(edit-monitor): fix regex to allow a single header 2021-10-09 11:20:33 +02:00
Bert Verhelst
daab2a05f5 Merge remote-tracking branch 'louislam/master' into feature/add-support-for-method-body-and-headers 2021-10-09 11:13:16 +02:00
LouisLam
a15e9077fc [status page] clear cache if it is an important beat 2021-10-09 17:04:51 +08:00
Louis Lam
8431a25a3a Update README.md 2021-10-09 16:54:26 +08:00
Louis Lam
e8cc7ff771 Merge pull request #609 from dpatrongomez/patch-1
Update es-ES.js
2021-10-09 14:02:06 +08:00
新逸Cary
5d617012a3 Merge pull request #5 from louislam/master
update
2021-10-09 09:28:53 +08:00
Daniel Patrón Gómez
d7eac1a413 Update es-ES.js 2021-10-08 23:48:37 +02:00
Louis Lam
c589bd836d [test] change to npm install for pull requests 2021-10-08 22:39:35 +08:00
LouisLam
5ce09953e2 use Segoe UI font for Windows among all languages 2021-10-08 20:15:54 +08:00
LouisLam
fc8d1e78b6 [push type] hide upside down mode, apply primary base url 2021-10-08 20:03:52 +08:00
LouisLam
3f26327f95 Merge remote-tracking branch 'origin/master' 2021-10-08 18:29:01 +08:00
Louis Lam
efb3f2b19c Merge pull request #605 from NixNotCastey/promosms
Add PromoSMS as notification provider
2021-10-08 18:19:06 +08:00
Lukas
db791c880a Don't use then with await. 2021-10-08 11:49:12 +02:00
新逸Cary
cdda182311 Merge pull request #4 from louislam/master
update
2021-10-08 15:51:06 +08:00
LouisLam
a1c2a1bc52 [test] auto test for node lts only 2021-10-08 15:34:19 +08:00
Louis Lam
432b156fce Merge pull request #595 from kvpt/status-page-default-locale
Use browser language as default language
2021-10-08 15:33:38 +08:00
LouisLam
01812cc446 [test] add test for i18n currentLocale 2021-10-08 15:11:50 +08:00
Lukas
dfd63386ba Make PromoSMS actually working
Make PromoSMS actually working and inform on success only when API return 0
2021-10-08 09:11:13 +02:00
LouisLam
11abc1f1e0 [test] add test for i18n currentLocale 2021-10-08 13:35:04 +08:00
LouisLam
288e87bb3d Merge branch 'master' into status-page-default-locale 2021-10-08 12:12:29 +08:00
Louis Lam
79ee0e1ef4 Update ask-for-help.md 2021-10-08 11:39:31 +08:00
LouisLam
8ae79ab9bf improve #560 2021-10-08 10:51:03 +08:00
Lukas
12b5489eb5 PromoSMS as Notification Provider
Add PromoSMS (Polish SMS Gateway) as new notification provider
2021-10-07 21:56:32 +02:00
LouisLam
ddad2dcb4a Merge remote-tracking branch 'origin/master'
# Conflicts:
#	src/languages/en.js
2021-10-08 01:40:34 +08:00
LouisLam
e96121f69a fix merging mistake 2021-10-08 01:39:14 +08:00
LouisLam
5b4af550fb Merge branch 'master' into DeeJayPee_master 2021-10-08 01:27:06 +08:00
Louis Lam
dd183e2ec2 Merge pull request #567 from Empty2k12/feature/matrix-notifications
Matrix Notifications
2021-10-08 01:21:52 +08:00
LouisLam
0fcb310b97 Merge remote-tracking branch 'Empty2k12/feature/matrix-notifications' into feature/matrix-notifications
# Conflicts:
#	src/languages/en.js
2021-10-08 01:13:09 +08:00
LouisLam
3a0143ac46 [matrix] use encodeURIComponent to handle the url encode 2021-10-08 01:11:33 +08:00
LouisLam
2ce5c28ed4 Merge branch 'master' into feature/matrix-notifications
# Conflicts:
#	src/languages/en.js
2021-10-08 00:59:39 +08:00
Bert Verhelst
ec4b7e4064 Merge remote-tracking branch 'louislam/master' into feature/add-support-for-method-body-and-headers 2021-10-07 18:22:59 +02:00
Kevin Petit
5b758a4e98 Better locale default for status page. 2021-10-07 18:07:24 +02:00
LouisLam
7907c07034 Merge remote-tracking branch 'origin/master' 2021-10-07 23:07:16 +08:00
LouisLam
adfe640f42 show fewer beat on mobile 2021-10-07 22:53:13 +08:00
Louis Lam
469f7a3e32 Update README.md 2021-10-07 22:33:39 +08:00
LouisLam
9f1e7b0a88 Revert "fix(heartbeat-bar): cleanup css styling and minor syntax issues"
This reverts commit 3d6c8b7f
2021-10-07 21:47:11 +08:00
LouisLam
cdf81a36d3 fix broken animation caused by #521 2021-10-07 21:42:36 +08:00
LouisLam
bf4ac0cf17 fix dockerfile issue on arm 2021-10-07 21:24:10 +08:00
LouisLam
c0846124c2 update vite to 1.6.4, since it fixed the issue 2021-10-07 21:23:28 +08:00
LouisLam
3d30ed3d3b update security policy 2021-10-07 20:16:15 +08:00
LouisLam
deec15c09e [test] better job name 2021-10-07 20:14:24 +08:00
LouisLam
3423cb5d8e [test] try to auto test Windows and MacOS 2021-10-07 20:05:12 +08:00
LouisLam
20af179a82 [test] try to auto test Windows and MacOS 2021-10-07 20:01:33 +08:00
LouisLam
3c60800eab [test] github action please ok🙏🏻🙏🏻🙏🏻 2021-10-07 18:47:44 +08:00
LouisLam
34586d7b8f [test] github action please ok 2021-10-07 18:10:35 +08:00
LouisLam
2c19aef4dc minor 2021-10-07 18:06:43 +08:00
LouisLam
67a623be18 e2e testing, it's hard 2021-10-07 17:48:13 +08:00
LouisLam
e5f6d7f047 slack and rocket.chat use the primary base url
env var to show time logger
2021-10-07 17:39:58 +08:00
LouisLam
b69550f5b9 Improve the test 2021-10-07 17:01:17 +08:00
LouisLam
d08a71ab49 Set primary base url in settings page 2021-10-07 16:30:16 +08:00
LouisLam
ed67803af8 improve minor style 2021-10-07 16:10:21 +08:00
Louis Lam
a6c839709c Merge pull request #589 from MrEddX/bulgarian
Updated Bulgarian language
2021-10-07 15:15:54 +08:00
Louis Lam
5eb3c6b194 Merge branch 'master' into bulgarian 2021-10-07 15:12:53 +08:00
LouisLam
8233f3b875 try to standardize the language name list 2021-10-07 15:06:16 +08:00
Bert Verhelst
8be4bf0e16 Merge remote-tracking branch 'louislam/master' into feature/add-support-for-method-body-and-headers 2021-10-07 08:56:29 +02:00
LouisLam
cccf393ee5 update zh-HK.js 2021-10-07 14:55:32 +08:00
MrEddX
9f5bf37a96 Update Settings.vue 2021-10-07 09:37:13 +03:00
LouisLam
18e4702375 ignore .env 2021-10-07 14:34:30 +08:00
MrEddX
1eb3f63a82 Update bg-BG.js 2021-10-07 09:27:05 +03:00
Louis Lam
8c63536eb8 Merge pull request #451 from zsxeee/notification_form_i18n
Notification form i18n
2021-10-07 14:13:08 +08:00
LouisLam
3e1788983e Merge remote-tracking branch 'origin/master' 2021-10-07 14:10:15 +08:00
LouisLam
a8badb027d update modded node-sqlite3 to 6.0.0 2021-10-07 14:09:50 +08:00
MrEddX
0c6b434d79 Moved Bulgarian to the Cyrillic family languages 2021-10-07 08:00:53 +03:00
Louis Lam
b5bd92ce78 Merge pull request #578 from jtagcat/et5
l10n: update et
2021-10-07 11:31:02 +08:00
Louis Lam
3f80cf5e54 Merge pull request #581 from chakflying/patch-2
Fix: Allow underscore in hostname
2021-10-07 11:30:33 +08:00
Bert Verhelst
162ef04c41 Merge branch 'master' into feature/add-support-for-method-body-and-headers 2021-10-06 21:56:28 +02:00
Nelson Chan
a87595a849 Fix: Allow underscore in hostname 2021-10-07 03:29:42 +08:00
jtagcat
7626e1f2e4 l10n: update et 2021-10-06 21:02:34 +03:00
zsxeee
7f1edb49bc Fix i18n
Upgrade vue-i18n to 9.1.9.
Fix wrong tag name.
2021-10-07 00:04:13 +08:00
Gero Gerke
d184733af9 update text 2021-10-06 13:44:36 +02:00
Gero Gerke
704d63b49f Merge branch 'master' into feature/matrix-notifications 2021-10-06 13:36:28 +02:00
zsxeee
7002a778f0 Rollback vue-i18n version to 9.1.7 2021-10-06 19:12:23 +08:00
zsxeee
54d2fbcc02 Fix i18n
Prevent use esm-bundler build vue-i18n
Escape keyword:  '@'
2021-10-06 18:21:31 +08:00
Gero Gerke
fbd4d54812 Update src/components/notifications/Matrix.vue
Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
2021-10-06 10:55:21 +02:00
LouisLam
c8706b9aa1 Merge branch 'master' into notification_form_i18n
# Conflicts:
#	src/components/notifications/SMTP.vue
#	src/languages/en.js
2021-10-06 16:48:14 +08:00
Louis Lam
54d7830813 Update CONTRIBUTING.md 2021-10-06 15:36:45 +08:00
LouisLam
fef26f3d5e Merge remote-tracking branch 'origin/master' 2021-10-06 15:35:39 +08:00
LouisLam
cb263f2a08 [test] wait for #language 2021-10-06 15:34:57 +08:00
Louis Lam
52102d72a0 Merge pull request #572 from Brainpitcher/patch-1
Update ru-RU.js
2021-10-06 15:28:29 +08:00
LouisLam
2b00e59c7a [test] update 2021-10-06 15:25:00 +08:00
Louis Lam
8ea7a693a1 Merge pull request #499 from Saibamen/fix_pl_i18n
Fix Polish language, add missing `Status Page` i18n
2021-10-06 13:29:02 +08:00
LouisLam
4ded0c073a [test] fix timeout issue 2021-10-06 13:26:43 +08:00
Brainpitcher
7a8b6a03e0 Update ru-RU.js
"Cert Exp.": "Сертификат истекает" now it sounds in russian
2021-10-06 09:49:44 +05:00
Gero Gerke
6bebc623f9 UI polish 2021-10-05 21:59:58 +02:00
Gero Gerke
34b86352f2 remove double spaces 2021-10-05 21:40:59 +02:00
Gero Gerke
99e8a33118 escape room characters 2021-10-05 21:36:01 +02:00
Gero Gerke
d7cc585101 Update server/notification-providers/matrix.js
Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
2021-10-05 20:42:44 +02:00
Gero Gerke
8c357a04bf Update src/components/notifications/index.js
Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
2021-10-05 20:42:36 +02:00
DeeJayPee
044c78aa2d Typo \o/ 2021-10-05 20:16:16 +02:00
DeeJayPee
49eaa1a166 Typo fix 2021-10-05 20:13:24 +02:00
DeeJayPee
215cc07907 Rename versions 2021-10-05 20:12:36 +02:00
LouisLam
22227be408 update version in wiki too 2021-10-06 02:06:59 +08:00
Gero Gerke
5decfb9fad Matrix Notifications 2021-10-05 20:03:56 +02:00
DeeJayPee
f9d7b99367 Add legacy version back on refactored master branch 2021-10-05 20:01:07 +02:00
DeeJayPee
359fe52c2e Merge branch 'louislam-master' 2021-10-05 19:59:20 +02:00
DeeJayPee
bc4db6c692 Merge branch 'master' of https://github.com/louislam/uptime-kuma into louislam-master 2021-10-05 19:57:27 +02:00
DeeJayPee
f14a798b2c Fix indentation + typo 2021-10-05 19:43:04 +02:00
Bert Verhelst
a0ffa42b42 fix(translations): add translations for method body and headers to dutch 2021-10-05 18:21:31 +02:00
Bert Verhelst
550825927c Merge branch 'master' into feature/add-support-for-method-body-and-headers 2021-10-05 18:19:07 +02:00
LouisLam
c1501742f5 test github secret 2021-10-05 21:15:30 +08:00
LouisLam
7c98fe603e test github secret 2021-10-05 21:11:11 +08:00
LouisLam
b7ae49c644 update github action 2021-10-05 20:42:15 +08:00
LouisLam
edad2caf8e return the correct exit code from jest 2021-10-05 20:40:40 +08:00
LouisLam
2bf6a04f81 fix preparing test 2021-10-05 20:37:32 +08:00
Louis Lam
f0670dde20 Update auto-test.yml 2021-10-05 20:33:47 +08:00
Louis Lam
73068763c0 Create auto-test.yml 2021-10-05 20:32:48 +08:00
LouisLam
73bf1216d1 [wip] more test 2021-10-05 20:27:43 +08:00
LouisLam
98436f91b5 Merge remote-tracking branch 'origin/master' 2021-10-05 19:14:41 +08:00
LouisLam
49720c709c improve the test with a single command only "npm test" 2021-10-05 19:13:57 +08:00
Louis Lam
842d359ad3 Update CONTRIBUTING.md 2021-10-05 18:17:54 +08:00
LouisLam
e71f5bf314 update dependencies 2021-10-05 17:53:17 +08:00
LouisLam
79e0c9e1f1 setup unit test for setup 2021-10-05 17:39:44 +08:00
LouisLam
e6ff957d9d Merge remote-tracking branch 'origin/master' 2021-10-05 16:12:44 +08:00
Louis Lam
865b721b79 Merge pull request #519 from chakflying/improve-certInfo
Feat: Improve Certificate Info Display
2021-10-05 16:09:08 +08:00
LouisLam
b5d987863d Merge remote-tracking branch 'origin/master' 2021-10-05 16:04:50 +08:00
Louis Lam
911690bea8 Merge pull request #521 from bertyhell/bugfix/heartbeat-bar-cleanup
fix(heartbeat-bar): cleanup css styling and minor syntax issues
2021-10-05 16:04:33 +08:00
LouisLam
d25603e629 update jest test 2021-10-05 16:03:35 +08:00
LouisLam
259bcf9426 [SMTP] "To Email" is not required if CC/BCC is set. (#461) 2021-10-05 15:57:13 +08:00
Bert Verhelst
afeb424dc0 fix(edit-monitor): add translations to en.js 2021-10-05 09:20:24 +02:00
Bert Verhelst
6b44116245 Merge remote-tracking branch 'louislam/master' into feature/add-support-for-method-body-and-headers 2021-10-05 08:54:40 +02:00
Louis Lam
aa478af286 Merge pull request #557 from Saibamen/patch-1
Fix typo in `CONTRIBUTING.md`
2021-10-05 12:54:29 +08:00
Adam Stachowicz
5f8d0faacd Update CONTRIBUTING.md 2021-10-05 02:44:50 +02:00
Adam Stachowicz
707e05c330 Fix after merge 2021-10-04 23:39:56 +02:00
Adam Stachowicz
4da63c5fb8 Revert silentTranslationWarn change 2021-10-04 23:33:52 +02:00
Adam Stachowicz
8ae64843fc run update-language-files 2021-10-04 23:32:16 +02:00
Adam Stachowicz
23e64b8efd Merge branch 'master' into fix_pl_i18n 2021-10-04 23:29:21 +02:00
Louis Lam
8c55a8bf98 Update CONTRIBUTING.md 2021-10-04 23:31:36 +08:00
Louis Lam
387a8919f9 Merge pull request #542 from csabibela/master
Hungarian translation
2021-10-04 21:14:12 +08:00
Louis Lam
a1edc23b1d Merge pull request #540 from jtagcat/et4
i10n: update estonian
2021-10-04 21:13:14 +08:00
Bert Verhelst
7ee89fab5c fix(edit-monitor): Make json capitalised
Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
2021-10-04 11:29:43 +02:00
Csábi Béla
980342546e Merge branch 'hu' 2021-10-03 23:38:13 +02:00
Csábi Béla
6b60dc9630 Initial Hungarian translation 2021-10-03 23:15:34 +02:00
Csábi Béla
8d22b43f24 Revert "Initial Hungarian translation"
This reverts commit dad58341c6.
2021-10-03 23:11:19 +02:00
Csábi Béla
dad58341c6 Initial Hungarian translation 2021-10-03 23:09:17 +02:00
jtagcat
275902be38 update estonian translation 2021-10-03 20:35:41 +03:00
jtagcat
38213585f3 update style for et translation
kuigi pingviini stiilijuhend
https://viki.pingviin.org/Stiilijuhend_tarkvara_t%C3%B5lkimiseks
on otseses konfliktis (ok:seiskamine;nok:seiska),
tundub nupudel nok ikkagi paremini

nupud on ikkagi käsk, mitte tegevus

muutus ühtlustab ka nuppude keele
2021-10-03 20:35:30 +03:00
LouisLam
37d1e50ff1 fix data path for test 2021-10-03 18:18:47 +08:00
LouisLam
a2a4c70cf5 setup jest-puppeteer 2021-10-03 18:16:55 +08:00
Louis Lam
446fc1af0b Update CONTRIBUTING.md 2021-10-03 16:04:16 +08:00
LouisLam
51acd107e3 Merge branch 'master' into notification_form_i18n 2021-10-03 15:28:33 +08:00
LouisLam
d3517e76c1 change to npm ci 2021-10-03 15:27:15 +08:00
Bert Verhelst
3f0b85e5a8 feat(http-requests): add support for methods, body and headers for http 2021-10-02 16:48:27 +02:00
LouisLam
2625cbe0d2 add script for downloading the dist files from github 2021-10-02 14:43:31 +08:00
LouisLam
c93f42794f upload prebuilt dist to github release 2021-10-02 01:48:15 +08:00
Nelson Chan
668fd58af3 Fix: Slightly improve validity styling 2021-10-01 22:43:09 +08:00
Nelson Chan
b7568e9caa Fix: Update Certificate Icon 2021-10-01 22:29:22 +08:00
Bert Verhelst
1c2adf8723 fix(monitor-list): increase padding to keep same monitor item height 2021-10-01 15:43:20 +02:00
Bert Verhelst
96129921e9 Merge remote-tracking branch 'origin/master' into bugfix/heartbeat-bar-cleanup 2021-10-01 15:40:48 +02:00
Louis Lam
2b1fe815f9 Merge pull request #522 from bertyhell/bugfix/improve-setup-styles
fix(setup): increase left padding input fields + avoid clipping
2021-10-01 21:38:18 +08:00
Louis Lam
fcf017d5c7 Merge pull request #523 from bertyhell/bugfix/hide-dashboard-and-settings-when-not-logged-in
fix(layout): hide dashboard and settings buttons when not logged in
2021-10-01 21:19:33 +08:00
Bert Verhelst
843830a38a fix(layout): hide dashboard and settings buttons when not logged in 2021-10-01 15:12:37 +02:00
Bert Verhelst
ee830621dd fix(login): fix the same padding issues for the login screen 2021-10-01 15:07:05 +02:00
Bert Verhelst
c2a560e2ed fix(setup): increase left padding input fields + avoid clipping 2021-10-01 14:57:31 +02:00
Nelson Chan
13bdfefa9d Feat: Improve Certificaet Info Display 2021-10-01 18:56:28 +08:00
Bert Verhelst
3d6c8b7f05 fix(heartbeat-bar): cleanup css styling and minor syntax issues 2021-10-01 12:49:49 +02:00
LouisLam
2aaed66b38 [docker: debian] reduce the image size dramatically! Compressed size from 240 MB~ to 100 MB~ 2021-10-01 18:25:21 +08:00
LouisLam
7b4c70860c split the base images in order to prevent recompile the base part 2021-10-01 17:28:00 +08:00
LouisLam
6513c3e75f allow update minor version only, to prevent the breaking change in the future like vite 2.6 2021-10-01 16:48:23 +08:00
LouisLam
7fa1cb83af [push type] add ping parameter 2021-10-01 16:43:11 +08:00
Louis Lam
9d079eeec0 Merge pull request #487 from cmandesign/feature/fa-lang-rtl
Feature/fa lang rtl
2021-10-01 16:28:20 +08:00
LouisLam
21dd5ad3dd Merge remote-tracking branch 'origin/master' 2021-10-01 15:48:04 +08:00
LouisLam
3394e1f148 fix undefined callback 2021-10-01 15:47:51 +08:00
Louis Lam
ee22406301 Update README.md 2021-10-01 02:38:41 +08:00
LouisLam
8d5eaaf8a7 minor 2021-10-01 00:26:27 +08:00
LouisLam
b246c8e0f2 Fix 2fa for iOS Google authenticator (#486) 2021-10-01 00:23:18 +08:00
LouisLam
1ed4ac9494 add Push-based monitoring (#279) 2021-10-01 00:09:43 +08:00
zsxeee
0f2059cde0 Use named slot translation when has multi-slot 2021-09-30 19:48:24 +08:00
zsxeee
138ddf5608 Move attribute tag to start of tag 2021-09-30 19:22:17 +08:00
zsxeee
dcd68213b1 Merge remote-tracking branch 'upstream/master' into notification_form_i18n
# Conflicts:
#	src/languages/en.js
2021-09-30 19:16:14 +08:00
Louis Lam
9e95d568c2 Merge pull request #501 from Saibamen/incident_use_local_timezone
[status-page] Display created and updated time in local timezone. Fixes #491
2021-09-30 18:13:55 +08:00
Louis Lam
fa3da819f8 Merge pull request #512 from chakflying/reduce-bundle-size
Build: Reduce client bundle size with more async components
2021-09-30 18:04:27 +08:00
Louis Lam
9e1f1f006b Merge pull request #511 from chakflying/fix-multiselect-css
Chore: Move multiselect css to its own file
2021-09-30 17:56:58 +08:00
Louis Lam
55cb497301 Merge pull request #427 from zsxeee/notification_component
chore(NotificationDialog): Convert notification form to separate component
2021-09-30 17:53:36 +08:00
LouisLam
8d8d5987e7 update to 1.7.3 2021-09-30 14:44:37 +08:00
LouisLam
1fa90bffaa freeze vite version to 2.5.* (2.6.* is broken when build the project) 2021-09-30 14:43:29 +08:00
LouisLam
67f221d3c7 update to 1.7.2 2021-09-30 13:04:49 +08:00
Nelson Chan
05f28fecb2 Build: Use async component for status and settings 2021-09-30 00:16:15 +08:00
Nelson Chan
ba4a4aaf1c Chore: Move multiselect css to own file 2021-09-30 00:08:37 +08:00
LouisLam
6eceb4c744 Merge remote-tracking branch 'origin/master' 2021-09-29 17:20:58 +08:00
LouisLam
3e4154dfb5 Fix retry interval affected bug 2021-09-29 17:20:35 +08:00
Louis Lam
fbc8828ddc Merge pull request #464 from chakflying/fix-delete-monitor
Fix: clear important beats after deleteMonitor
2021-09-29 15:39:57 +08:00
Soroosh
f2c7308c96 Fixed Change Language Direction In Setting Page 2021-09-29 10:44:34 +03:30
LouisLam
3677aa639f update to 1.7.1 2021-09-29 14:26:30 +08:00
LouisLam
aaddfa1786 update package-lock.json 2021-09-29 13:30:28 +08:00
LouisLam
6d65d248f4 Merge branch 'bulgarian'
# Conflicts:
#	src/languages/da-DK.js
#	src/languages/fr-FR.js
#	src/languages/it-IT.js
#	src/languages/pl.js
#	src/languages/ru-RU.js
#	src/languages/zh-CN.js
2021-09-29 13:28:43 +08:00
LouisLam
87a4748b40 check back to root user for Debian, until problem has been found (#488) 2021-09-29 12:40:28 +08:00
Louis Lam
182bdf13a7 Merge pull request #500 from Saibamen/remove_timezone_console_log
Remove "Skip Timezone" console log from frontend
2021-09-29 12:16:51 +08:00
MrEddX
0f66e5cfc5 Added Bulgarian Language 2021-09-28 23:21:59 +03:00
Louis Lam
fe5ae46013 Merge pull request #480 from gaby/init-support
Add dumb-init to avoid zombie processes
2021-09-28 21:58:26 +08:00
Denis Freund
efbadd0737 only allow ip address for hostname when monitor type is steam 2021-09-28 13:38:46 +02:00
Adam Stachowicz
f9d633e02b Display created and updated time in local timezone. Fixes #491 2021-09-28 08:07:42 +02:00
Adam Stachowicz
756f317f82 Remove "Skip Timezone" console log from frontend 2021-09-28 07:29:32 +02:00
Adam Stachowicz
fa9d26416c silentTranslationWarn if not development 2021-09-28 07:02:19 +02:00
Adam Stachowicz
58aa83331e Fix Polish language, add missing Status Page i18n 2021-09-28 06:53:23 +02:00
Louis Lam
cc9fe26584 Merge pull request #498 from kry008/patch-2
Update pl.js
2021-09-28 11:59:25 +08:00
kry008
99818aa370 Update pl.js
Aby było że to serwer sprawdza, a nie użytkownik ma.
Dokończenie tłumaczenia
2021-09-27 21:58:18 +02:00
Louis Lam
682265fe9c Merge pull request #481 from DX37/translation-ru
fix some ru-RU lines and add new ones
2021-09-28 00:13:37 +08:00
Louis Lam
4406e51ab6 Merge pull request #496 from bertyhell/bugfix/remove-zero-width-spaces
fix(nl-NL): remove ZWSP from translation
2021-09-28 00:13:16 +08:00
Louis Lam
c3d5be5a5e Merge pull request #493 from iomataani/master
updated translation
2021-09-28 00:08:12 +08:00
Louis Lam
dfe12c99c1 Merge pull request #490 from Minvinea/master
Update fr-FR.js
2021-09-28 00:07:58 +08:00
Louis Lam
bb69851160 Merge pull request #485 from Lrss/patch-1
Update Danish translation
2021-09-28 00:07:44 +08:00
Louis Lam
6c9323351d Merge pull request #484 from xinac721/master
Update Simplified Chinese Language(更新简体中文语言)
2021-09-28 00:06:57 +08:00
Bert Verhelst
8e9fa20e57 fix(nl-NL): remove ZWSP from translation 2021-09-27 17:51:48 +02:00
Ioma Taani
da7c29f4b9 updated translation 2021-09-27 13:23:53 +02:00
Denis Freund
b67b4d5afd add steam gameserver for monitoring 2021-09-27 11:17:57 +02:00
Soroosh
9f06d54688 Remove font import and update font-family for lang fa 2021-09-27 09:37:43 +03:30
Soroosh
1448de7b19 Update some translations 2021-09-27 00:32:51 +03:30
Minvinea
e545d48583 Update fr-FR.js
Update line 112 to 181
2021-09-26 21:39:38 +02:00
Soroosh
47749ca58d Replace some hardcoded with translations 2021-09-26 19:56:43 +03:30
Soroosh
04b7a4a423 Merge Conflict Resolved
Farsi Lang Updated
Some hardcoded words has been replaced with translations
2021-09-26 19:56:25 +03:30
Soroosh
56d8f585fd Add postcss-rtlcss and postcss-scss 2021-09-26 18:54:51 +03:30
Soroosh
07c9d78829 Update Farsi translations 2021-09-26 18:52:53 +03:30
Soroosh
15c4a8fb02 Add RTL direction support to styles using postcss & rtlcss 2021-09-26 18:52:38 +03:30
Soroosh
f41e95921f Enable localization for pagination 2021-09-26 18:50:12 +03:30
Soroosh
647184e5d1 Update Title to use translation files 2021-09-26 18:49:39 +03:30
Soroosh
e60426bdcd Add Localization CSS & Persian Font 2021-09-26 18:49:03 +03:30
Lars Sørensen
8d84d8f891 Update da-DK.js with new strings 2021-09-26 15:28:46 +02:00
新逸Cary
74acc2cea7 Update Simplified Chinese Language(更新简体中文语言) 2021-09-26 14:31:16 +08:00
新逸Cary
ba4a4089eb Merge pull request #3 from louislam/master
update-21.09.26
2021-09-26 13:17:48 +08:00
Soroosh
251d42f1a6 Add localeDirection method to i18n.js
Add dir to html tag based on localeDirection
Add Farsi to the languages
2021-09-26 01:09:00 +03:30
DX37
122631c91b fix some ru-RU lines and add new ones 2021-09-26 01:44:00 +07:00
Juan Calderon-Perez
1e12f25c4b Add support for using init to start service 2021-09-25 12:26:30 -04:00
LouisLam
9e10296290 Merge remote-tracking branch 'origin/master' 2021-09-25 22:44:47 +08:00
LouisLam
87e213085f add /status, alias of /status-page (#471) 2021-09-25 22:44:29 +08:00
Louis Lam
d9038f1da2 Merge pull request #473 from Ponkhy/german-language
Added german translation for the status page
2021-09-24 23:26:30 +08:00
Louis Lam
3fb2d0ce68 Update README.md 2021-09-24 22:38:54 +08:00
Ponkhy
50a33e3b45 Added german translation for the status page 2021-09-24 15:56:35 +02:00
zsxeee
f24abac7fc Merge branch 'master' into notification_component 2021-09-24 20:33:29 +08:00
Nelson Chan
32c9dfbb31 Fix: clear important beats after deleteMonitor 2021-09-23 23:21:08 +08:00
zsxeee
624f632a7a Apprise status translation key 2021-09-22 22:15:50 +08:00
zsxeee
6e9d12638c Avoid space ending in translation key 2021-09-22 16:20:59 +08:00
zsxeee
6e55c44773 Chore 2021-09-22 16:13:23 +08:00
zsxeee
601204ae77 Default friendly name i18n and auto increase 2021-09-21 17:25:54 +08:00
zsxeee
8c941b1d56 Add i18n for notification form 2021-09-21 13:02:41 +08:00
zsxeee
ad6fcc2f2e Merge branch 'master' into notification_component 2021-09-20 13:16:24 +08:00
zsxeee
ffbc25722d Move default setting to child component 2021-09-19 18:05:22 +08:00
zsxeee
2fb3c40307 Variable name and key binding 2021-09-17 20:40:57 +08:00
zsxeee
66e40d9fcb Edit comment and remove unused variable 2021-09-17 20:20:44 +08:00
zsxeee
de8b61ef2b Remove unused imports 2021-09-17 17:16:52 +08:00
zsxeee
534ac4b720 Move Apprise check to child component 2021-09-17 16:54:50 +08:00
zsxeee
e9735d239b Convert notification form to separate component 2021-09-17 16:07:03 +08:00
DeeJayPee
29d0db805d Add legacy octopush (Octopush-DM from 2011 to 2020 accounts) version 2021-09-13 10:25:44 +02:00
191 changed files with 261 additions and 32438 deletions

View File

@@ -1,46 +0,0 @@
/.idea
/dist
/node_modules
/data
/out
/test
/kubernetes
/.do
**/.dockerignore
/private
**/.git
**/.gitignore
**/docker-compose*
**/[Dd]ockerfile*
LICENSE
README.md
.editorconfig
.vscode
.eslint*
.stylelint*
/.github
package-lock.json
yarn.lock
app.json
CODE_OF_CONDUCT.md
CONTRIBUTING.md
CNAME
install.sh
SECURITY.md
tsconfig.json
### .gitignore content (commented rules are duplicated)
#node_modules
.DS_Store
#dist
dist-ssr
*.local
#.idea
#/data
#!/data/.gitkeep
#.vscode
### End of .gitignore content

View File

@@ -1,21 +0,0 @@
root = true
[*]
indent_style = space
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.md]
trim_trailing_whitespace = false
[*.yaml]
indent_size = 2
[*.yml]
indent_size = 2
[*.vue]
trim_trailing_whitespace = false

View File

@@ -1,96 +0,0 @@
module.exports = {
root: true,
env: {
browser: true,
commonjs: true,
es2020: true,
node: true,
},
extends: [
"eslint:recommended",
"plugin:vue/vue3-recommended",
],
parser: "vue-eslint-parser",
parserOptions: {
parser: "@babel/eslint-parser",
sourceType: "module",
requireConfigFile: false,
},
rules: {
"linebreak-style": ["error", "unix"],
"camelcase": ["warn", {
"properties": "never",
"ignoreImports": true
}],
// override/add rules settings here, such as:
// 'vue/no-unused-vars': 'error'
"no-unused-vars": "warn",
indent: [
"error",
4,
{
ignoredNodes: ["TemplateLiteral"],
SwitchCase: 1,
},
],
quotes: ["warn", "double"],
semi: "warn",
"vue/html-indent": ["warn", 4], // default: 2
"vue/max-attributes-per-line": "off",
"vue/singleline-html-element-content-newline": "off",
"vue/html-self-closing": "off",
"vue/attribute-hyphenation": "off", // This change noNL to "no-n-l" unexpectedly
"no-multi-spaces": ["error", {
ignoreEOLComments: true,
}],
"space-before-function-paren": ["error", {
"anonymous": "always",
"named": "never",
"asyncArrow": "always"
}],
"curly": "error",
"object-curly-spacing": ["error", "always"],
"object-curly-newline": "off",
"object-property-newline": "error",
"comma-spacing": "error",
"brace-style": "error",
"no-var": "error",
"key-spacing": "warn",
"keyword-spacing": "warn",
"space-infix-ops": "warn",
"arrow-spacing": "warn",
"no-trailing-spaces": "warn",
"no-constant-condition": ["error", {
"checkLoops": false,
}],
"space-before-blocks": "warn",
//'no-console': 'warn',
"no-extra-boolean-cast": "off",
"no-multiple-empty-lines": ["warn", {
"max": 1,
"maxBOF": 0,
}],
"lines-between-class-members": ["warn", "always", {
exceptAfterSingleLine: true,
}],
"no-unneeded-ternary": "error",
"array-bracket-newline": ["error", "consistent"],
"eol-last": ["error", "always"],
//'prefer-template': 'error',
"comma-dangle": ["warn", "only-multiline"],
"no-empty": ["error", {
"allowEmptyCatch": true
}],
"no-control-regex": "off",
"one-var": ["error", "never"],
"max-statements-per-line": ["error", { "max": 1 }]
},
"overrides": [
{
"files": [ "src/languages/*.js", "src/icon.js" ],
"rules": {
"comma-dangle": ["error", "always-multiline"],
}
}
]
};

12
.github/FUNDING.yml vendored
View File

@@ -1,12 +0,0 @@
# These are supported funding model platforms
#github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
#patreon: # Replace with a single Patreon username
open_collective: uptime-kuma # Replace with a single Open Collective username
#ko_fi: # Replace with a single Ko-fi username
#tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
#community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
#liberapay: # Replace with a single Liberapay username
#issuehunt: # Replace with a single IssueHunt username
#otechie: # Replace with a single Otechie username
#custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']

View File

@@ -1,18 +0,0 @@
---
name: Ask for help
about: You can ask any question related to Uptime Kuma.
title: ''
labels: help
assignees: ''
---
**Is it a duplicate question?**
Please search in Issues without filters: https://github.com/louislam/uptime-kuma/issues?q=
**Info**
Uptime Kuma Version:
Using Docker?: Yes/No
Docker Version:
Node.js Version (Without Docker only):
OS:
Browser:

View File

@@ -1,42 +0,0 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: bug
assignees: ''
---
**Is it a duplicate question?**
Please search in Issues without filters: https://github.com/louislam/uptime-kuma/issues?q=
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Info**
Uptime Kuma Version:
Using Docker?: Yes/No
Docker Version:
Node.js Version (Without Docker only):
OS:
Browser:
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Error Log**
It is easier for us to find out the problem.
Docker: `docker logs <container id>`
PM2: `~/.pm2/logs/` (e.g. `/home/ubuntu/.pm2/logs`)

View File

@@ -1,22 +0,0 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: enhancement
assignees: ''
---
**Is it a duplicate question?**
Please search in Issues without filters: https://github.com/louislam/uptime-kuma/issues?q=
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

13
.gitignore vendored
View File

@@ -1,13 +0,0 @@
node_modules
.DS_Store
dist
dist-ssr
*.local
.idea
/data
!/data/.gitkeep
.vscode
/private
/out

View File

@@ -1,9 +0,0 @@
{
"extends": "stylelint-config-standard",
"rules": {
"indentation": 4,
"no-descending-specificity": null,
"selector-list-comma-newline-after": null,
"declaration-empty-line-before": null
}
}

1
CNAME
View File

@@ -1 +0,0 @@
git.kuma.pet

View File

@@ -1,128 +0,0 @@
# Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
overall community
Examples of unacceptable behavior include:
* The use of sexualized language or imagery, and sexual attention or
advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
louis@uptimekuma.louislam.net.
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series
of actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within
the community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement ladder](https://github.com/mozilla/diversity).
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.

View File

@@ -1,144 +0,0 @@
# 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 structed and commented so well, lol. Sorry about that.
The project was created with vite.js (vue3). Then I created a sub-directory called "server" for server part. Both frontend and backend share the same package.json.
The frontend code build into "dist" directory. The server uses "dist" as root. This is how production is working.
# Can I create a pull request for Uptime Kuma?
Generally, if the pull request is working fine and it do not affect any existing logic, workflow and perfomance, I will merge to the master branch once it is tested.
If you are not sure, feel free to create an empty pull request draft first.
## Pull Request Examples
### ✅ High - Medium Priority
- Add a new notification
- Add a chart
- Fix a bug
### *️⃣ Requires one more reviewer
I do not have such knowledge to test it.
- Add k8s supports
### *️⃣ Low Priority
It changed my current workflow and require further studies.
- Change my release approach
### ❌ Won't Merge
- Duplicated pull request
- Buggy
- Existing logic is completely modified or deleted
- A function that is completely out of scope
# 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.
For example, recently, because I am not a python expert, I spent a 2 hours to resolve all problems in order to install and use the Apprise cli. Apprise requires so many hidden requirements, I have to figure out myself how to solve the problems by Google search for my OS. That is painful. I do not want Uptime Kuma to be like this way, so:
- 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
- Single container for Docker users, no very complex docker-composer file. Just map the volume and expose the port, then good to go
- All settings in frontend.
- Easy to use
# Coding Styles
- Follow `.editorconfig`
- Follow ESLint
## Name convention
- Javascript/Typescript: camelCaseType
- SQLite: underscore_type
- CSS/SCSS: dash-type
# Tools
- Node.js >= 14
- Git
- IDE that supports EditorConfig and ESLint (I am using Intellji Idea)
- A SQLite tool (I am using SQLite Expert Personal)
# Install dependencies
```bash
npm install --dev
```
For npm@7, you need --legacy-peer-deps
```bash
npm install --legacy-peer-deps --dev
```
# Backend Dev
(2021-09-23 Update)
```bash
npm run start-server-dev
```
It binds to `0.0.0.0:3001` by default.
## Backend Details
It is mainly a socket.io app + express.js.
express.js is just used for serving the frontend built files (index.html, .js and .css etc.)
# Frontend Dev
Start frontend dev server. Hot-reload enabled in this way. It binds to `0.0.0.0:3000` by default.
```bash
npm run dev
```
PS: You can ignore those scss warnings, those warnings are from Bootstrap that I cannot fix.
You can use Vue.js devtools Chrome extension for debugging.
After the frontend server started. It cannot connect to the websocket server even you have started the server. You need to tell the frontend that is a dev env by running this in DevTool console and refresh:
```javascript
localStorage.dev = "dev";
```
So that the frontend will try to connect websocket server in 3001.
Alternately, you can specific `NODE_ENV` to "development".
## Build the frontend
```bash
npm run build
```
## Frontend Details
Uptime Kuma Frontend is a single page application (SPA). Most paths are handled by Vue Router.
The router is in `src/router.js`
As you can see, most data in frontend is stored in root level, even though you changed the current router to any other pages.
The data and socket logic are in `src/mixins/socket.js`.
# Database Migration
1. Create `patch{num}.sql` in `./db/`
2. Update `latestVersion` in `./server/database.js`
# Unit Test
Yes, no unit test for now. I know it is very important, but at the same time my spare time is very limited. I want to implement my ideas first. I will go back to this in some points.

21
LICENSE
View File

@@ -1,21 +0,0 @@
MIT License
Copyright (c) 2021 Louis Lam
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

126
README.md
View File

@@ -1,126 +0,0 @@
# Uptime Kuma
<a target="_blank" href="https://github.com/louislam/uptime-kuma"><img src="https://img.shields.io/github/stars/louislam/uptime-kuma" /></a> <a target="_blank" href="https://hub.docker.com/r/louislam/uptime-kuma"><img src="https://img.shields.io/docker/pulls/louislam/uptime-kuma" /></a> <a target="_blank" href="https://hub.docker.com/r/louislam/uptime-kuma"><img src="https://img.shields.io/docker/v/louislam/uptime-kuma/latest?label=docker%20image%20ver." /></a> <a target="_blank" href="https://github.com/louislam/uptime-kuma"><img src="https://img.shields.io/github/last-commit/louislam/uptime-kuma" /></a>
<div align="center" width="100%">
<img src="./public/icon.svg" width="128" alt="" />
</div>
It is a self-hosted monitoring tool like "Uptime Robot".
<img src="https://louislam.net/uptimekuma/1.jpg" width="512" alt="" />
## 🥔 Live Demo
Try it!
https://demo.uptime.kuma.pet
It is a 5 minutes live demo, all data will be deleted after that. The server is located at Tokyo, if you live far away from here, it may affact your experience. I suggest that you should install to try it.
VPS is sponsored by Uptime Kuma sponsors on [Open Collective](https://opencollective.com/uptime-kuma)! Thank you so much!
## ⭐ Features
* Monitoring uptime for HTTP(s) / TCP / Ping / DNS Record.
* Fancy, Reactive, Fast UI/UX.
* Notifications via Telegram, Discord, Gotify, Slack, Pushover, Email (SMTP), and [70+ notification services, click here for the full list](https://github.com/louislam/uptime-kuma/issues/284).
* 20 seconds interval.
* [Multi Languages](https://github.com/louislam/uptime-kuma/tree/master/src/languages)
## 🔧 How to Install
### 🐳 Docker
```bash
docker volume create uptime-kuma
docker run -d --restart=always -p 3001:3001 -v uptime-kuma:/app/data --name uptime-kuma louislam/uptime-kuma:1
```
Browse to http://localhost:3001 after started.
### 💪🏻 Without Docker
Required Tools: Node.js >= 14, git and pm2.
```bash
git clone https://github.com/louislam/uptime-kuma.git
cd uptime-kuma
npm run setup
# Option 1. Try it
node server/server.js
# (Recommended) Option 2. Run in background using PM2
# Install PM2 if you don't have: npm install pm2 -g
pm2 start server/server.js --name uptime-kuma
```
Browse to http://localhost:3001 after started.
### Advanced Installation
If you need more options or need to browse via a reserve proxy, please read:
https://github.com/louislam/uptime-kuma/wiki/%F0%9F%94%A7-How-to-Install
## 🆙 How to Update
Please read:
https://github.com/louislam/uptime-kuma/wiki/%F0%9F%86%99-How-to-Update
## 🆕 What's Next?
I will mark requests/issues to the next milestone.
https://github.com/louislam/uptime-kuma/milestones
Project Plan:
https://github.com/louislam/uptime-kuma/projects/1
## 🖼 More Screenshots
Dark Mode:
<img src="https://user-images.githubusercontent.com/1336778/128710166-908f8d88-9256-43f3-9c49-bfc2c56011d2.png" width="400" alt="" />
Settings Page:
<img src="https://louislam.net/uptimekuma/2.jpg" width="400" alt="" />
Telegram Notification Sample:
<img src="https://louislam.net/uptimekuma/3.jpg" width="400" alt="" />
## Motivation
* I was looking for a self-hosted monitoring tool like "Uptime Robot", but it is hard to find a suitable one. One of the close ones is statping. Unfortunately, it is not stable and unmaintained.
* Want to build a fancy UI.
* Learn Vue 3 and vite.js.
* Show the power of Bootstrap 5.
* Try to use WebSocket with SPA instead of REST API.
* Deploy my first Docker image to Docker Hub.
If you love this project, please consider giving me a ⭐.
## 🗣️ Discussion
### Issues Page
You can discuss or ask for help in [Issues](https://github.com/louislam/uptime-kuma/issues).
### Subreddit
My Reddit account: louislamlam
You can mention me if you ask question on Reddit.
https://www.reddit.com/r/UptimeKuma/
## Contribute
If you want to report a bug or request a new feature. Free feel to open a [new issue](https://github.com/louislam/uptime-kuma/issues).
If you want to translate Uptime Kuma into your langauge, please read: https://github.com/louislam/uptime-kuma/tree/master/src/languages
If you want to modify Uptime Kuma, this guideline may be useful for you: https://github.com/louislam/uptime-kuma/blob/master/CONTRIBUTING.md
English proofreading is needed too because my grammar is not that great sadly. Feel free to correct my grammar in this readme, source code, or wiki.

View File

@@ -1,15 +0,0 @@
# Security Policy
## Supported Versions
Use this section to tell people about which versions of your project are
currently being supported with security updates.
| Version | Supported |
| ------- | ------------------ |
| 1.x.x | :white_check_mark: |
## Reporting a Vulnerability
Please report security issues to uptime@kuma.pet.
Do not use the issue tracker or discuss it in the public as it will cause more damage.

1
ansible/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
roles/nginx/files/ssl/*

39
ansible/README.md Normal file
View File

@@ -0,0 +1,39 @@
# Ansible Playbook to install uptime kuma using docker
This playbook comes with three tags
1. requirements (will install anything needed to make next parts working)
2. docker (to install docker)
3. nginx (to install nginx using docker with ssl)
4. uptime kuma (to install uptime kuma using docker)
To see more info see docker-compose, tasks and config files
I will try to make this readme better
## To run it
1. install ansible see [here](https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html)
2. run `ansible-galaxy install -r ansible-requirements.yml` to get requirements
3. prepare inventory hosts
4. put your certificates in files section in nginx role with this structure below:
```
ansible -> roles -> nginx -> files -> ssl -> <uptime kuma domain>.fullchain.pem
ansible -> roles -> nginx -> files -> ssl -> <uptime kuma domain>.privkey.pem
```
5. to run playbook
```bash
ansible-playbook ./playbook.yml -i <your inventory path> -e "kuma_domain=<uptime kuma domain>" -e "kuma_image_os=<alpine or debian>" -e "kuma_image_version=<version>"
```
you can use other ansible playbook options too
> Note: Replace `<uptime kuma domain>` with your desired domain for uptime kuma
> replace `<version>` with a version from https://github.com/louislam/uptime-kuma/releases
> replace `<alpine or debian>` with one of options
> `-e "kuma_image_os=<alpine or debian>" -e "kuma_image_version=<version>"` is not required and you can remove this part or change only one of them (kuma_image_os is debian & kuma_image_version is 1 by default)
> If you are not using root user as your ansible_user use -bK option to become root
> instead of `-e "kuma_image_os=<alpine or debian>" -e "kuma_image_version=<version>"` You can use `-e kuma_tag=<uptime kuma full tag>` and replace `<uptime kuma full tag>` with your desired tag (e.g. `latest`)
> you can also create a yaml file with variables that you want to set & use it (also: ansible-vars)

View File

@@ -0,0 +1,6 @@
roles:
- src: geerlingguy.docker
- src: geerlingguy.pip
collections:
- name: community.docker

20
ansible/playbook.yml Normal file
View File

@@ -0,0 +1,20 @@
- name: install uptime kuma with nginx connected
hosts: all
vars:
pip_install_packages:
- name: wheel
- name: pip
state: latest
- name: setuptools
- name: cffi
- name: docker
- name: dockerpty
docker_compose_version: "v2.0.1"
roles:
- {role: requirements, tags: ["docker", "requirements"]}
- {role: geerlingguy.docker, tags: ["docker"]}
- {role: geerlingguy.pip, tags: ["docker"]}
- {role: nginx, tags: ["nginx"]}
- {role: uptime-kuma, tags: ["kuma"]}

View File

@@ -0,0 +1,22 @@
- name: Ensure Volumes & Files directories exists
file:
dest: "{{item}}"
state: directory
loop:
- /compose
- /compose/volumes
- /compose/volumes/nginx
- /compose/volumes/nginx/log/{{ kuma_domain }}
- name: Ensure nginx SSL certificates exist
copy:
src: ssl
dest: /compose/volumes/nginx
mode: 'preserve'
group: root
owner: root
- name: Ensure config files are updated
template:
src: "nginx.conf"
dest: /compose/volumes/nginx/nginx.conf

View File

@@ -0,0 +1,88 @@
user nginx;
worker_processes auto;
pid /var/run/nginx.pid;
error_log /var/log/nginx/error.log;
events {
worker_connections 2048;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
server_tokens off;
default_type application/octet-stream;
### SSL Settings for all servers (https://ssl-config.mozilla.org/#server=nginx&server-version=1.17.2&config=intermediate)
# certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
ssl_certificate /etc/nginx/ssl/{{ kuma_domain }}.fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/{{ kuma_domain }}.privkey.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
ssl_session_tickets off;
# intermediate configuration
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# curl https://ssl-config.mozilla.org/ffdhe2048.txt > /etc/nginx/ssl/dhparam.pem (TODO: check if it's secure to use others DH parameters!)
# openssl dhparam -out /etc/nginx/ssl/dhparam.pem 4096
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
# HSTS (ngx_http_headers_module is required) (63072000 seconds)
add_header Strict-Transport-Security "max-age=63072000" always;
# OCSP stapling
ssl_stapling on;
ssl_stapling_verify on;
log_format main '$remote_addr - $remote_user [$time_local] "$request_method $scheme://$host$request_uri $server_protocol" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" $request_time $upstream_response_time UPA:$upstream_addr BYS:$bytes_sent BYR:$request_length';
access_log /var/log/nginx/access.log main;
### Set additional headers to be send to upstream
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Remove Headers that gonna be sent to client
proxy_hide_header X-Powered-By;
proxy_hide_header Server;
# Redirect HTTP request to HTTPS
server {
listen 80 default_server;
server_name {{ kuma_domain }};
return 302 https://$host$request_uri;
}
server {
server_name {{ kuma_domain }};
listen 443 ssl http2 default_server;
access_log /var/log/nginx/{{ kuma_domain }}/access.log main;
error_log /var/log/nginx/{{ kuma_domain }}/error.log;
location / {
# rewrite ^/(.*)/$ /$1 permanent;
### redirect urls with trailing slash to non-trailing slash
# https://serverfault.dev/questions/597302/removing-the-trailing-slash-from-a-url-with-nginx
# location ~ (?<no_slash>.+)/$ {
# return 302 https://$host$no_slash;
# }
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://uptime-kuma:3001/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
}

View File

@@ -0,0 +1,11 @@
---
- name: Ensure {{inventory_hostname}} is set as hostname
hostname:
name: "{{inventory_hostname}}"
tags: ["hostname"]
- include_tasks: setup-RedHat.yml
when: ansible_os_family == 'RedHat'
- include_tasks: setup-Debian.yml
when: ansible_os_family == 'Debian'

View File

@@ -0,0 +1,9 @@
- name: Ensure packages for some requirements are installed
apt:
pkg:
- libffi-dev
- libzbar-dev
- libzbar0
- python3-docopt
update_cache: yes
state: present

View File

@@ -0,0 +1,9 @@
- name: Ensure packages for some requirements are installed
dnf:
name:
- libffi-devel
- zbar-devel
- zbar
- python3-docopt
update_cache: yes
state: present

View File

@@ -0,0 +1,4 @@
---
kuma_image_version: '1'
kuma_image_os: 'debian'
kuma_tag: "{{kuma_image_version}}-{{kuma_image_os}}"

View File

@@ -0,0 +1,23 @@
- name: Ensure Volumes & Files directories exists
file:
dest: "{{item}}"
state: directory
loop:
- /compose
- /compose/kuma
- /compose/volumes
- /compose/volumes/kuma
- name: Ensure docker-compose file has been updated
template:
src: "{{item}}"
dest: /compose/kuma/
loop:
- docker-compose.yml
- name: Ensure uptime-kuma is up
community.docker.docker_compose:
state: present
project_src: /compose/kuma
pull: yes
recreate: always

View File

@@ -0,0 +1,29 @@
version: '3.3'
services:
uptime-kuma:
restart: always
networks:
- uptime-kuma
expose:
- 3001
volumes:
- '/compose/volumes/uptime-kuma:/app/data'
container_name: uptime-kuma
image: 'louislam/uptime-kuma:{{kuma_tag}}'
nginx:
ports:
- 443:443
- 80:80
networks:
- uptime-kuma
depends_on:
- uptime-kuma
restart: always
image: nginx:stable-alpine
volumes:
- '/compose/volumes/nginx/:/etc/nginx/'
- '/compose/volumes/nginx/log/{{ kuma_domain }}:/var/log/nginx/{{ kuma_domain }}/'
networks:
uptime-kuma:

View File

Binary file not shown.

View File

@@ -1,10 +0,0 @@
-- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
BEGIN TRANSACTION;
ALTER TABLE user
ADD twofa_secret VARCHAR(64);
ALTER TABLE user
ADD twofa_status BOOLEAN default 0 NOT NULL;
COMMIT;

View File

@@ -1,7 +0,0 @@
-- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
BEGIN TRANSACTION;
ALTER TABLE monitor
ADD retry_interval INTEGER default 0 not null;
COMMIT;

View File

@@ -1,30 +0,0 @@
-- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
BEGIN TRANSACTION;
create table `group`
(
id INTEGER not null
constraint group_pk
primary key autoincrement,
name VARCHAR(255) not null,
created_date DATETIME default (DATETIME('now')) not null,
public BOOLEAN default 0 not null,
active BOOLEAN default 1 not null,
weight BOOLEAN NOT NULL DEFAULT 1000
);
CREATE TABLE [monitor_group]
(
[id] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
[monitor_id] INTEGER NOT NULL REFERENCES [monitor] ([id]) ON DELETE CASCADE ON UPDATE CASCADE,
[group_id] INTEGER NOT NULL REFERENCES [group] ([id]) ON DELETE CASCADE ON UPDATE CASCADE,
weight BOOLEAN NOT NULL DEFAULT 1000
);
CREATE INDEX [fk]
ON [monitor_group] (
[monitor_id],
[group_id]);
COMMIT;

View File

@@ -1,10 +0,0 @@
-- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
BEGIN TRANSACTION;
-- For sendHeartbeatList
CREATE INDEX monitor_time_index ON heartbeat (monitor_id, time);
-- For sendImportantHeartbeatList
CREATE INDEX monitor_important_time_index ON heartbeat (monitor_id, important,time);
COMMIT;

View File

@@ -1,18 +0,0 @@
-- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
BEGIN TRANSACTION;
create table incident
(
id INTEGER not null
constraint incident_pk
primary key autoincrement,
title VARCHAR(255) not null,
content TEXT not null,
style VARCHAR(30) default 'warning' not null,
created_date DATETIME default (DATETIME('now')) not null,
last_updated_date DATETIME,
pin BOOLEAN default 1 not null,
active BOOLEAN default 1 not null
);
COMMIT;

View File

@@ -1,22 +0,0 @@
-- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
BEGIN TRANSACTION;
-- Generated by Intellij IDEA
create table setting_dg_tmp
(
id INTEGER
primary key autoincrement,
key VARCHAR(200) not null
unique,
value TEXT,
type VARCHAR(20)
);
insert into setting_dg_tmp(id, key, value, type) select id, key, value, type from setting;
drop table setting;
alter table setting_dg_tmp rename to setting;
COMMIT;

View File

@@ -1,37 +0,0 @@
-- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
-- Change Monitor.created_date from "TIMESTAMP" to "DATETIME"
-- SQL Generated by Intellij Idea
PRAGMA foreign_keys=off;
BEGIN TRANSACTION;
create table monitor_dg_tmp
(
id INTEGER not null
primary key autoincrement,
name VARCHAR(150),
active BOOLEAN default 1 not null,
user_id INTEGER
references user
on update cascade on delete set null,
interval INTEGER default 20 not null,
url TEXT,
type VARCHAR(20),
weight INTEGER default 2000,
hostname VARCHAR(255),
port INTEGER,
created_date DATETIME,
keyword VARCHAR(255)
);
insert into monitor_dg_tmp(id, name, active, user_id, interval, url, type, weight, hostname, port, created_date, keyword) select id, name, active, user_id, interval, url, type, weight, hostname, port, created_date, keyword from monitor;
drop table monitor;
alter table monitor_dg_tmp rename to monitor;
create index user_id on monitor (user_id);
COMMIT;
PRAGMA foreign_keys=on;

View File

@@ -1,19 +0,0 @@
-- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
CREATE TABLE tag (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
name VARCHAR(255) NOT NULL,
color VARCHAR(255) NOT NULL,
created_date DATETIME DEFAULT (DATETIME('now')) NOT NULL
);
CREATE TABLE monitor_tag (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
monitor_id INTEGER NOT NULL,
tag_id INTEGER NOT NULL,
value TEXT,
CONSTRAINT FK_tag FOREIGN KEY (tag_id) REFERENCES tag(id) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT FK_monitor FOREIGN KEY (monitor_id) REFERENCES monitor(id) ON DELETE CASCADE ON UPDATE CASCADE
);
CREATE INDEX monitor_tag_monitor_id_index ON monitor_tag (monitor_id);
CREATE INDEX monitor_tag_tag_id_index ON monitor_tag (tag_id);

View File

@@ -1,9 +0,0 @@
BEGIN TRANSACTION;
CREATE TABLE monitor_tls_info (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
monitor_id INTEGER NOT NULL,
info_json TEXT
);
COMMIT;

View File

@@ -1,37 +0,0 @@
-- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
-- Add maxretries column to monitor
PRAGMA foreign_keys=off;
BEGIN TRANSACTION;
create table monitor_dg_tmp
(
id INTEGER not null
primary key autoincrement,
name VARCHAR(150),
active BOOLEAN default 1 not null,
user_id INTEGER
references user
on update cascade on delete set null,
interval INTEGER default 20 not null,
url TEXT,
type VARCHAR(20),
weight INTEGER default 2000,
hostname VARCHAR(255),
port INTEGER,
created_date DATETIME,
keyword VARCHAR(255),
maxretries INTEGER NOT NULL DEFAULT 0
);
insert into monitor_dg_tmp(id, name, active, user_id, interval, url, type, weight, hostname, port, created_date, keyword) select id, name, active, user_id, interval, url, type, weight, hostname, port, created_date, keyword from monitor;
drop table monitor;
alter table monitor_dg_tmp rename to monitor;
create index user_id on monitor (user_id);
COMMIT;
PRAGMA foreign_keys=on;

View File

@@ -1,40 +0,0 @@
-- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
-- OK.... serious wrong, missing maxretries column
-- Developers should patch it manually if you have missing the maxretries column
PRAGMA foreign_keys=off;
BEGIN TRANSACTION;
create table monitor_dg_tmp
(
id INTEGER not null
primary key autoincrement,
name VARCHAR(150),
active BOOLEAN default 1 not null,
user_id INTEGER
references user
on update cascade on delete set null,
interval INTEGER default 20 not null,
url TEXT,
type VARCHAR(20),
weight INTEGER default 2000,
hostname VARCHAR(255),
port INTEGER,
created_date DATETIME,
keyword VARCHAR(255),
maxretries INTEGER NOT NULL DEFAULT 0,
ignore_tls BOOLEAN default 0 not null,
upside_down BOOLEAN default 0 not null
);
insert into monitor_dg_tmp(id, name, active, user_id, interval, url, type, weight, hostname, port, created_date, keyword, maxretries) select id, name, active, user_id, interval, url, type, weight, hostname, port, created_date, keyword, maxretries from monitor;
drop table monitor;
alter table monitor_dg_tmp rename to monitor;
create index user_id on monitor (user_id);
COMMIT;
PRAGMA foreign_keys=on;

View File

@@ -1,70 +0,0 @@
-- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
PRAGMA foreign_keys = off;
BEGIN TRANSACTION;
create table monitor_dg_tmp (
id INTEGER not null primary key autoincrement,
name VARCHAR(150),
active BOOLEAN default 1 not null,
user_id INTEGER references user on update cascade on delete
set
null,
interval INTEGER default 20 not null,
url TEXT,
type VARCHAR(20),
weight INTEGER default 2000,
hostname VARCHAR(255),
port INTEGER,
created_date DATETIME default (DATETIME('now')) not null,
keyword VARCHAR(255),
maxretries INTEGER NOT NULL DEFAULT 0,
ignore_tls BOOLEAN default 0 not null,
upside_down BOOLEAN default 0 not null
);
insert into
monitor_dg_tmp(
id,
name,
active,
user_id,
interval,
url,
type,
weight,
hostname,
port,
keyword,
maxretries,
ignore_tls,
upside_down
)
select
id,
name,
active,
user_id,
interval,
url,
type,
weight,
hostname,
port,
keyword,
maxretries,
ignore_tls,
upside_down
from
monitor;
drop table monitor;
alter table
monitor_dg_tmp rename to monitor;
create index user_id on monitor (user_id);
COMMIT;
PRAGMA foreign_keys = on;

View File

@@ -1,74 +0,0 @@
-- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
PRAGMA foreign_keys = off;
BEGIN TRANSACTION;
create table monitor_dg_tmp (
id INTEGER not null primary key autoincrement,
name VARCHAR(150),
active BOOLEAN default 1 not null,
user_id INTEGER references user on update cascade on delete
set
null,
interval INTEGER default 20 not null,
url TEXT,
type VARCHAR(20),
weight INTEGER default 2000,
hostname VARCHAR(255),
port INTEGER,
created_date DATETIME default (DATETIME('now')) not null,
keyword VARCHAR(255),
maxretries INTEGER NOT NULL DEFAULT 0,
ignore_tls BOOLEAN default 0 not null,
upside_down BOOLEAN default 0 not null,
maxredirects INTEGER default 10 not null,
accepted_statuscodes_json TEXT default '["200-299"]' not null
);
insert into
monitor_dg_tmp(
id,
name,
active,
user_id,
interval,
url,
type,
weight,
hostname,
port,
created_date,
keyword,
maxretries,
ignore_tls,
upside_down
)
select
id,
name,
active,
user_id,
interval,
url,
type,
weight,
hostname,
port,
created_date,
keyword,
maxretries,
ignore_tls,
upside_down
from
monitor;
drop table monitor;
alter table
monitor_dg_tmp rename to monitor;
create index user_id on monitor (user_id);
COMMIT;
PRAGMA foreign_keys = on;

View File

@@ -1,10 +0,0 @@
-- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
BEGIN TRANSACTION;
ALTER TABLE monitor
ADD dns_resolve_type VARCHAR(5);
ALTER TABLE monitor
ADD dns_resolve_server VARCHAR(255);
COMMIT;

View File

@@ -1,7 +0,0 @@
-- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
BEGIN TRANSACTION;
ALTER TABLE monitor
ADD dns_last_result VARCHAR(255);
COMMIT;

View File

@@ -1,7 +0,0 @@
-- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
BEGIN TRANSACTION;
ALTER TABLE notification
ADD is_default BOOLEAN default 0 NOT NULL;
COMMIT;

View File

@@ -1,13 +0,0 @@
# Simple docker-composer.yml
# You can change your port or volume location
version: '3.3'
services:
uptime-kuma:
image: louislam/uptime-kuma
container_name: uptime-kuma
volumes:
- ./uptime-kuma:/app/data
ports:
- 3001:3001

View File

@@ -1,33 +0,0 @@
# DON'T UPDATE TO node:14-bullseye-slim, see #372.
# If the image changed, the second stage image should be changed too
FROM node:14-buster-slim AS build
WORKDIR /app
COPY . .
RUN npm install --legacy-peer-deps && \
npm run build && \
npm prune --production && \
chmod +x /app/extra/entrypoint.sh
FROM node:14-buster-slim AS release
WORKDIR /app
# Install Apprise, add sqlite3 cli for debugging in the future, iputils-ping for ping, util-linux for setpriv
RUN apt update && \
apt --yes install python3 python3-pip python3-cryptography python3-six python3-yaml python3-click python3-markdown python3-requests python3-requests-oauthlib \
sqlite3 iputils-ping util-linux && \
pip3 --no-cache-dir install apprise && \
rm -rf /var/lib/apt/lists/*
# Copy app files from build layer
COPY --from=build /app /app
EXPOSE 3001
VOLUME ["/app/data"]
HEALTHCHECK --interval=60s --timeout=30s --start-period=180s --retries=5 CMD node extra/healthcheck.js
ENTRYPOINT ["extra/entrypoint.sh"]
CMD ["node", "server/server.js"]
FROM release AS nightly
RUN npm run mark-as-nightly

View File

@@ -1,30 +0,0 @@
# DON'T UPDATE TO alpine3.13, 1.14, see #41.
FROM node:14-alpine3.12 AS build
WORKDIR /app
COPY . .
RUN npm install --legacy-peer-deps && \
npm run build && \
npm prune --production && \
chmod +x /app/extra/entrypoint.sh
FROM node:14-alpine3.12 AS release
WORKDIR /app
# Install apprise, iputils for non-root ping, setpriv
RUN apk add --no-cache iputils setpriv python3 py3-cryptography py3-pip py3-six py3-yaml py3-click py3-markdown py3-requests py3-requests-oauthlib && \
pip3 --no-cache-dir install apprise && \
rm -rf /root/.cache
# Copy app files from build layer
COPY --from=build /app /app
EXPOSE 3001
VOLUME ["/app/data"]
HEALTHCHECK --interval=60s --timeout=30s --start-period=180s --retries=5 CMD node extra/healthcheck.js
ENTRYPOINT ["extra/entrypoint.sh"]
CMD ["node", "server/server.js"]
FROM release AS nightly
RUN npm run mark-as-nightly

View File

@@ -1,2 +0,0 @@
# Must enable File Sharing in Docker Desktop
docker run -it --rm -v ${pwd}:/app louislam/batsh /usr/bin/batsh bash --output ./install.sh ./extra/install.batsh

View File

@@ -1,21 +0,0 @@
#!/usr/bin/env sh
# set -e Exit the script if an error happens
set -e
PUID=${PUID=1000}
PGID=${PGID=1000}
files_ownership () {
# -h Changes the ownership of an encountered symbolic link and not that of the file or directory pointed to by the symbolic link.
# -R Recursively descends the specified directories
# -c Like verbose but report only when a change is made
chown -hRc "$PUID":"$PGID" /app/data
}
echo "==> Performing startup jobs and maintenance tasks"
files_ownership
echo "==> Starting application with user $PUID group $PGID"
# --clear-groups Clear supplementary groups.
exec setpriv --reuid "$PUID" --regid "$PGID" --clear-groups "$@"

View File

@@ -1,34 +0,0 @@
/*
* This script should be run after a period of time (180s), because the server may need some time to prepare.
*/
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
let client;
if (process.env.SSL_KEY && process.env.SSL_CERT) {
client = require("https");
} else {
client = require("http");
}
let options = {
host: process.env.HOST || "127.0.0.1",
port: parseInt(process.env.PORT) || 3001,
timeout: 28 * 1000,
};
let request = client.request(options, (res) => {
console.log(`Health Check OK [Res Code: ${res.statusCode}]`);
if (res.statusCode === 200) {
process.exit(0);
} else {
process.exit(1);
}
});
request.on("error", function (err) {
console.error("Health Check ERROR");
process.exit(1);
});
request.end();

View File

@@ -1,245 +0,0 @@
// install.sh is generated by ./extra/install.batsh, do not modify it directly.
// "npm run compile-install-script" to compile install.sh
// The command is working on Windows PowerShell and Docker for Windows only.
// curl -o kuma_install.sh https://raw.githubusercontent.com/louislam/uptime-kuma/master/install.sh && sudo bash kuma_install.sh
println("=====================");
println("Uptime Kuma Installer");
println("=====================");
println("Supported OS: CentOS 7/8, Ubuntu >= 16.04 and Debian");
println("---------------------------------------");
println("This script is designed for Linux and basic usage.");
println("For advanced usage, please go to https://github.com/louislam/uptime-kuma/wiki/Installation");
println("---------------------------------------");
println("");
println("Local - Install Uptime Kuma in your current machine with git, Node.js 14 and pm2");
println("Docker - Install Uptime Kuma Docker container");
println("");
if ("$1" != "") {
type = "$1";
} else {
call("read", "-p", "Which installation method do you prefer? [DOCKER/local]: ", "type");
}
defaultPort = "3001";
function checkNode() {
bash("nodeVersion=$(node -e 'console.log(process.versions.node.split(`.`)[0])')");
println("Node Version: " ++ nodeVersion);
if (nodeVersion < "12") {
println("Error: Required Node.js 14");
call("exit", "1");
}
if (nodeVersion == "12") {
println("Warning: NodeJS " ++ nodeVersion ++ " is not tested.");
}
}
function deb() {
bash("nodeCheck=$(node -v)");
bash("apt --yes update");
if (nodeCheck != "") {
checkNode();
} else {
// Old nodejs binary name is "nodejs"
bash("check=$(nodejs --version)");
if (check != "") {
println("Error: 'node' command is not found, but 'nodejs' command is found. Your NodeJS should be too old.");
bash("exit 1");
}
bash("curlCheck=$(curl --version)");
if (curlCheck == "") {
println("Installing Curl");
bash("apt --yes install curl");
}
println("Installing Node.js 14");
bash("curl -sL https://deb.nodesource.com/setup_14.x | bash - > log.txt");
bash("apt --yes install nodejs");
bash("node -v");
bash("nodeCheckAgain=$(node -v)");
if (nodeCheckAgain == "") {
println("Error during Node.js installation");
bash("exit 1");
}
}
bash("check=$(git --version)");
if (check == "") {
println("Installing Git");
bash("apt --yes install git");
}
}
if (type == "local") {
defaultInstallPath = "/opt/uptime-kuma";
if (exists("/etc/redhat-release")) {
os = call("cat", "/etc/redhat-release");
distribution = "rhel";
} else if (exists("/etc/issue")) {
bash("os=$(head -n1 /etc/issue | cut -f 1 -d ' ')");
if (os == "Ubuntu") {
distribution = "ubuntu";
}
if (os == "Debian") {
distribution = "debian";
}
}
bash("arch=$(uname -i)");
println("Your OS: " ++ os);
println("Distribution: " ++ distribution);
println("Arch: " ++ arch);
if ("$3" != "") {
port = "$3";
} else {
call("read", "-p", "Listening Port [$defaultPort]: ", "port");
if (port == "") {
port = defaultPort;
}
}
if ("$2" != "") {
installPath = "$2";
} else {
call("read", "-p", "Installation Path [$defaultInstallPath]: ", "installPath");
if (installPath == "") {
installPath = defaultInstallPath;
}
}
// CentOS
if (distribution == "rhel") {
bash("nodeCheck=$(node -v)");
if (nodeCheck != "") {
checkNode();
} else {
bash("curlCheck=$(curl --version)");
if (curlCheck == "") {
println("Installing Curl");
bash("yum -y -q install curl");
}
println("Installing Node.js 14");
bash("curl -sL https://rpm.nodesource.com/setup_14.x | bash - > log.txt");
bash("yum install -y -q nodejs");
bash("node -v");
bash("nodeCheckAgain=$(node -v)");
if (nodeCheckAgain == "") {
println("Error during Node.js installation");
bash("exit 1");
}
}
bash("check=$(git --version)");
if (check == "") {
println("Installing Git");
bash("yum -y -q install git");
}
// Ubuntu
} else if (distribution == "ubuntu") {
deb();
// Debian
} else if (distribution == "debian") {
deb();
} else {
// Unknown distribution
error = 0;
bash("check=$(git --version)");
if (check == "") {
error = 1;
println("Error: git is missing");
}
bash("check=$(node -v)");
if (check == "") {
error = 1;
println("Error: node is missing");
}
if (error > 0) {
println("Please install above missing software");
bash("exit 1");
}
}
bash("check=$(pm2 --version)");
if (check == "") {
println("Installing PM2");
bash("npm install pm2 -g");
bash("pm2 startup");
}
bash("mkdir -p $installPath");
bash("cd $installPath");
bash("git clone https://github.com/louislam/uptime-kuma.git .");
bash("npm run setup");
bash("pm2 start server/server.js --name uptime-kuma -- --port=$port");
} else {
defaultVolume = "uptime-kuma";
bash("check=$(docker -v)");
if (check == "") {
println("Error: docker is not found!");
bash("exit 1");
}
bash("check=$(docker info)");
bash("if [[ \"$check\" == *\"Is the docker daemon running\"* ]]; then
\"echo\" \"Error: docker is not running\"
\"exit\" \"1\"
fi");
if ("$3" != "") {
port = "$3";
} else {
call("read", "-p", "Expose Port [$defaultPort]: ", "port");
if (port == "") {
port = defaultPort;
}
}
if ("$2" != "") {
volume = "$2";
} else {
call("read", "-p", "Volume Name [$defaultVolume]: ", "volume");
if (volume == "") {
volume = defaultVolume;
}
}
println("Port: $port");
println("Volume: $volume");
bash("docker volume create $volume");
bash("docker run -d --restart=always -p $port:3001 -v $volume:/app/data --name uptime-kuma louislam/uptime-kuma:1");
}
println("http://localhost:$port");

View File

@@ -1,24 +0,0 @@
const pkg = require("../package.json");
const fs = require("fs");
const util = require("../src/util");
util.polyfill();
const oldVersion = pkg.version
const newVersion = oldVersion + "-nightly"
console.log("Old Version: " + oldVersion)
console.log("New Version: " + newVersion)
if (newVersion) {
// Process package.json
pkg.version = newVersion
pkg.scripts.setup = pkg.scripts.setup.replaceAll(oldVersion, newVersion)
pkg.scripts["build-docker"] = pkg.scripts["build-docker"].replaceAll(oldVersion, newVersion)
fs.writeFileSync("package.json", JSON.stringify(pkg, null, 4) + "\n")
// Process README.md
if (fs.existsSync("README.md")) {
fs.writeFileSync("README.md", fs.readFileSync("README.md", "utf8").replaceAll(oldVersion, newVersion))
}
}

View File

@@ -1,61 +0,0 @@
console.log("== Uptime Kuma Reset Password Tool ==");
console.log("Loading the database");
const Database = require("../server/database");
const { R } = require("redbean-node");
const readline = require("readline");
const { initJWTSecret } = require("../server/util-server");
const args = require("args-parser")(process.argv);
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
(async () => {
Database.init(args);
await Database.connect();
try {
const user = await R.findOne("user");
if (! user) {
throw new Error("user not found, have you installed?");
}
console.log("Found user: " + user.username);
while (true) {
let password = await question("New Password: ");
let confirmPassword = await question("Confirm New Password: ");
if (password === confirmPassword) {
await user.resetPassword(password);
// Reset all sessions by reset jwt secret
await initJWTSecret();
rl.close();
break;
} else {
console.log("Passwords do not match, please try again.");
}
}
console.log("Password reset successfully.");
} catch (e) {
console.error("Error: " + e.message);
}
await Database.close();
console.log("Finished. You should restart the Uptime Kuma server.")
})();
function question(question) {
return new Promise((resolve) => {
rl.question(question, (answer) => {
resolve(answer);
})
});
}

View File

@@ -1,144 +0,0 @@
/*
* Simple DNS Server
* For testing DNS monitoring type, dev only
*/
const dns2 = require("dns2");
const { Packet } = dns2;
const server = dns2.createServer({
udp: true
});
server.on("request", (request, send, rinfo) => {
for (let question of request.questions) {
console.log(question.name, type(question.type), question.class);
const response = Packet.createResponseFromRequest(request);
if (question.name === "existing.com") {
if (question.type === Packet.TYPE.A) {
response.answers.push({
name: question.name,
type: question.type,
class: question.class,
ttl: 300,
address: "1.2.3.4"
});
} if (question.type === Packet.TYPE.AAAA) {
response.answers.push({
name: question.name,
type: question.type,
class: question.class,
ttl: 300,
address: "fe80::::1234:5678:abcd:ef00",
});
} else if (question.type === Packet.TYPE.CNAME) {
response.answers.push({
name: question.name,
type: question.type,
class: question.class,
ttl: 300,
domain: "cname1.existing.com",
});
} else if (question.type === Packet.TYPE.MX) {
response.answers.push({
name: question.name,
type: question.type,
class: question.class,
ttl: 300,
exchange: "mx1.existing.com",
priority: 5
});
} else if (question.type === Packet.TYPE.NS) {
response.answers.push({
name: question.name,
type: question.type,
class: question.class,
ttl: 300,
ns: "ns1.existing.com",
});
} else if (question.type === Packet.TYPE.SOA) {
response.answers.push({
name: question.name,
type: question.type,
class: question.class,
ttl: 300,
primary: "existing.com",
admin: "admin@existing.com",
serial: 2021082701,
refresh: 300,
retry: 3,
expiration: 10,
minimum: 10,
});
} else if (question.type === Packet.TYPE.SRV) {
response.answers.push({
name: question.name,
type: question.type,
class: question.class,
ttl: 300,
priority: 5,
weight: 5,
port: 8080,
target: "srv1.existing.com",
});
} else if (question.type === Packet.TYPE.TXT) {
response.answers.push({
name: question.name,
type: question.type,
class: question.class,
ttl: 300,
data: "#v=spf1 include:_spf.existing.com ~all",
});
} else if (question.type === Packet.TYPE.CAA) {
response.answers.push({
name: question.name,
type: question.type,
class: question.class,
ttl: 300,
flags: 0,
tag: "issue",
value: "ca.existing.com",
});
}
}
if (question.name === "4.3.2.1.in-addr.arpa") {
if (question.type === Packet.TYPE.PTR) {
response.answers.push({
name: question.name,
type: question.type,
class: question.class,
ttl: 300,
domain: "ptr1.existing.com",
});
}
}
send(response);
}
});
server.on("listening", () => {
console.log("Listening");
console.log(server.addresses());
});
server.on("close", () => {
console.log("server closed");
});
server.listen({
udp: 5300
});
function type(code) {
for (let name in Packet.TYPE) {
if (Packet.TYPE[name] === code) {
return name;
}
}
}

View File

@@ -1,3 +0,0 @@
package-lock.json
test.js
languages/

View File

@@ -1,84 +0,0 @@
// Need to use ES6 to read language files
import fs from "fs";
import path from "path";
import util from "util";
// https://stackoverflow.com/questions/13786160/copy-folder-recursively-in-node-js
/**
* Look ma, it's cp -R.
* @param {string} src The path to the thing to copy.
* @param {string} dest The path to the new copy.
*/
const copyRecursiveSync = function (src, dest) {
let exists = fs.existsSync(src);
let stats = exists && fs.statSync(src);
let isDirectory = exists && stats.isDirectory();
if (isDirectory) {
fs.mkdirSync(dest);
fs.readdirSync(src).forEach(function (childItemName) {
copyRecursiveSync(path.join(src, childItemName),
path.join(dest, childItemName));
});
} else {
fs.copyFileSync(src, dest);
}
};
console.log("Arguments:", process.argv)
const baseLangCode = process.argv[2] || "en";
console.log("Base Lang: " + baseLangCode);
fs.rmdirSync("./languages", { recursive: true });
copyRecursiveSync("../../src/languages", "./languages");
const en = (await import("./languages/en.js")).default;
const baseLang = (await import(`./languages/${baseLangCode}.js`)).default;
const files = fs.readdirSync("./languages");
console.log("Files:", files);
for (const file of files) {
if (!file.endsWith(".js")) {
console.log("Skipping " + file)
continue;
}
console.log("Processing " + file);
const lang = await import("./languages/" + file);
let obj;
if (lang.default) {
obj = lang.default;
} else {
console.log("Empty file");
obj = {
languageName: "<Your Language name in your language (not in English)>"
};
}
// En first
for (const key in en) {
if (! obj[key]) {
obj[key] = en[key];
}
}
if (baseLang !== en) {
// Base second
for (const key in baseLang) {
if (! obj[key]) {
obj[key] = key;
}
}
}
const code = "export default " + util.inspect(obj, {
depth: null,
});
fs.writeFileSync(`../../src/languages/${file}`, code);
}
fs.rmdirSync("./languages", { recursive: true });
console.log("Done. Fixing formatting by ESLint...");

View File

@@ -1,12 +0,0 @@
{
"name": "update-language-files",
"type": "module",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}

View File

@@ -1,61 +0,0 @@
const pkg = require("../package.json");
const fs = require("fs");
const child_process = require("child_process");
const util = require("../src/util");
util.polyfill();
const oldVersion = pkg.version;
const newVersion = process.argv[2];
console.log("Old Version: " + oldVersion);
console.log("New Version: " + newVersion);
if (! newVersion) {
console.error("invalid version");
process.exit(1);
}
const exists = tagExists(newVersion);
if (! exists) {
// Process package.json
pkg.version = newVersion;
pkg.scripts.setup = pkg.scripts.setup.replaceAll(oldVersion, newVersion);
pkg.scripts["build-docker"] = pkg.scripts["build-docker"].replaceAll(oldVersion, newVersion);
pkg.scripts["build-docker-alpine"] = pkg.scripts["build-docker-alpine"].replaceAll(oldVersion, newVersion);
pkg.scripts["build-docker-debian"] = pkg.scripts["build-docker-debian"].replaceAll(oldVersion, newVersion);
fs.writeFileSync("package.json", JSON.stringify(pkg, null, 4) + "\n");
commit(newVersion);
tag(newVersion);
} else {
console.log("version exists")
}
function commit(version) {
let msg = "update to " + version;
let res = child_process.spawnSync("git", ["commit", "-m", msg, "-a"]);
let stdout = res.stdout.toString().trim();
console.log(stdout)
if (stdout.includes("no changes added to commit")) {
throw new Error("commit error")
}
}
function tag(version) {
let res = child_process.spawnSync("git", ["tag", version]);
console.log(res.stdout.toString().trim())
}
function tagExists(version) {
if (! version) {
throw new Error("invalid version");
}
let res = child_process.spawnSync("git", ["tag", "-l", version]);
return res.stdout.toString().trim() === version;
}

View File

@@ -1,17 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="icon" type="image/svg+xml" href="/icon.svg" />
<link rel="manifest" href="manifest.json" />
<meta name="theme-color" id="theme-color" content="" />
<meta name="description" content="Uptime Kuma monitoring tool" />
<title>Uptime Kuma</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>

View File

@@ -1,203 +0,0 @@
# install.sh is generated by ./extra/install.batsh, do not modify it directly.
# "npm run compile-install-script" to compile install.sh
# The command is working on Windows PowerShell and Docker for Windows only.
# curl -o kuma_install.sh https://raw.githubusercontent.com/louislam/uptime-kuma/master/install.sh && sudo bash kuma_install.sh
"echo" "-e" "====================="
"echo" "-e" "Uptime Kuma Installer"
"echo" "-e" "====================="
"echo" "-e" "Supported OS: CentOS 7/8, Ubuntu >= 16.04 and Debian"
"echo" "-e" "---------------------------------------"
"echo" "-e" "This script is designed for Linux and basic usage."
"echo" "-e" "For advanced usage, please go to https://github.com/louislam/uptime-kuma/wiki/Installation"
"echo" "-e" "---------------------------------------"
"echo" "-e" ""
"echo" "-e" "Local - Install Uptime Kuma in your current machine with git, Node.js 14 and pm2"
"echo" "-e" "Docker - Install Uptime Kuma Docker container"
"echo" "-e" ""
if [ "$1" != "" ]; then
type="$1"
else
"read" "-p" "Which installation method do you prefer? [DOCKER/local]: " "type"
fi
defaultPort="3001"
function checkNode {
local _0
nodeVersion=$(node -e 'console.log(process.versions.node.split(`.`)[0])')
"echo" "-e" "Node Version: ""$nodeVersion"
_0="12"
if [ $(($nodeVersion < $_0)) == 1 ]; then
"echo" "-e" "Error: Required Node.js 14"
"exit" "1"
fi
if [ "$nodeVersion" == "12" ]; then
"echo" "-e" "Warning: NodeJS ""$nodeVersion"" is not tested."
fi
}
function deb {
nodeCheck=$(node -v)
apt --yes update
if [ "$nodeCheck" != "" ]; then
"checkNode"
else
# Old nodejs binary name is "nodejs"
check=$(nodejs --version)
if [ "$check" != "" ]; then
"echo" "-e" "Error: 'node' command is not found, but 'nodejs' command is found. Your NodeJS should be too old."
exit 1
fi
curlCheck=$(curl --version)
if [ "$curlCheck" == "" ]; then
"echo" "-e" "Installing Curl"
apt --yes install curl
fi
"echo" "-e" "Installing Node.js 14"
curl -sL https://deb.nodesource.com/setup_14.x | bash - > log.txt
apt --yes install nodejs
node -v
nodeCheckAgain=$(node -v)
if [ "$nodeCheckAgain" == "" ]; then
"echo" "-e" "Error during Node.js installation"
exit 1
fi
fi
check=$(git --version)
if [ "$check" == "" ]; then
"echo" "-e" "Installing Git"
apt --yes install git
fi
}
if [ "$type" == "local" ]; then
defaultInstallPath="/opt/uptime-kuma"
if [ -e "/etc/redhat-release" ]; then
os=$("cat" "/etc/redhat-release")
distribution="rhel"
else
if [ -e "/etc/issue" ]; then
os=$(head -n1 /etc/issue | cut -f 1 -d ' ')
if [ "$os" == "Ubuntu" ]; then
distribution="ubuntu"
fi
if [ "$os" == "Debian" ]; then
distribution="debian"
fi
fi
fi
arch=$(uname -i)
"echo" "-e" "Your OS: ""$os"
"echo" "-e" "Distribution: ""$distribution"
"echo" "-e" "Arch: ""$arch"
if [ "$3" != "" ]; then
port="$3"
else
"read" "-p" "Listening Port [$defaultPort]: " "port"
if [ "$port" == "" ]; then
port="$defaultPort"
fi
fi
if [ "$2" != "" ]; then
installPath="$2"
else
"read" "-p" "Installation Path [$defaultInstallPath]: " "installPath"
if [ "$installPath" == "" ]; then
installPath="$defaultInstallPath"
fi
fi
# CentOS
if [ "$distribution" == "rhel" ]; then
nodeCheck=$(node -v)
if [ "$nodeCheck" != "" ]; then
"checkNode"
else
curlCheck=$(curl --version)
if [ "$curlCheck" == "" ]; then
"echo" "-e" "Installing Curl"
yum -y -q install curl
fi
"echo" "-e" "Installing Node.js 14"
curl -sL https://rpm.nodesource.com/setup_14.x | bash - > log.txt
yum install -y -q nodejs
node -v
nodeCheckAgain=$(node -v)
if [ "$nodeCheckAgain" == "" ]; then
"echo" "-e" "Error during Node.js installation"
exit 1
fi
fi
check=$(git --version)
if [ "$check" == "" ]; then
"echo" "-e" "Installing Git"
yum -y -q install git
fi
# Ubuntu
else
if [ "$distribution" == "ubuntu" ]; then
"deb"
# Debian
else
if [ "$distribution" == "debian" ]; then
"deb"
else
# Unknown distribution
error=$((0))
check=$(git --version)
if [ "$check" == "" ]; then
error=$((1))
"echo" "-e" "Error: git is missing"
fi
check=$(node -v)
if [ "$check" == "" ]; then
error=$((1))
"echo" "-e" "Error: node is missing"
fi
if [ $(($error > 0)) == 1 ]; then
"echo" "-e" "Please install above missing software"
exit 1
fi
fi
fi
fi
check=$(pm2 --version)
if [ "$check" == "" ]; then
"echo" "-e" "Installing PM2"
npm install pm2 -g
pm2 startup
fi
mkdir -p $installPath
cd $installPath
git clone https://github.com/louislam/uptime-kuma.git .
npm run setup
pm2 start server/server.js --name uptime-kuma -- --port=$port
else
defaultVolume="uptime-kuma"
check=$(docker -v)
if [ "$check" == "" ]; then
"echo" "-e" "Error: docker is not found!"
exit 1
fi
check=$(docker info)
if [[ "$check" == *"Is the docker daemon running"* ]]; then
"echo" "Error: docker is not running"
"exit" "1"
fi
if [ "$3" != "" ]; then
port="$3"
else
"read" "-p" "Expose Port [$defaultPort]: " "port"
if [ "$port" == "" ]; then
port="$defaultPort"
fi
fi
if [ "$2" != "" ]; then
volume="$2"
else
"read" "-p" "Volume Name [$defaultVolume]: " "volume"
if [ "$volume" == "" ]; then
volume="$defaultVolume"
fi
fi
"echo" "-e" "Port: $port"
"echo" "-e" "Volume: $volume"
docker volume create $volume
docker run -d --restart=always -p $port:3001 -v $volume:/app/data --name uptime-kuma louislam/uptime-kuma:1
fi
"echo" "-e" "http://localhost:$port"

View File

@@ -1,32 +0,0 @@
# Uptime-Kuma K8s Deployment
⚠ Warning: K8s deployment is provided by contributors. I have no experience with K8s and I can't fix error in the future. I only test Docker and Node.js. Use at your own risk.
## How does it work?
Kustomize is a tool which builds a complete deployment file for all config elements.
You can edit the files in the ```uptime-kuma``` folder except the ```kustomization.yml``` until you know what you're doing.
If you want to choose another namespace you can edit the ```kustomization.yml``` in the ```kubernetes```-Folder and change the ```namespace: uptime-kuma``` to something you like.
It creates a certificate with the specified Issuer and creates the Ingress for the Uptime-Kuma ClusterIP-Service.
## What do I have to edit?
You have to edit the ```ingressroute.yml``` to your needs.
This ingressroute.yml is for the [nginx-ingress-controller](https://kubernetes.github.io/ingress-nginx/) in combination with the [cert-manager](https://cert-manager.io/).
- Host
- Secrets and secret names
- (Cluster)Issuer (optional)
- The Version in the Deployment-File
- Update:
- Change to newer version and run the above commands, it will update the pods one after another
## How To use
- Install [kustomize](https://kubectl.docs.kubernetes.io/installation/kustomize/)
- Edit files mentioned above to your needs
- Run ```kustomize build > apply.yml```
- Run ```kubectl apply -f apply.yml```
Now you should see some k8s magic and Uptime-Kuma should be available at the specified address.

View File

@@ -1,10 +0,0 @@
namespace: uptime-kuma
namePrefix: uptime-kuma-
commonLabels:
app: uptime-kuma
bases:
- uptime-kuma

View File

@@ -1,45 +0,0 @@
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
component: uptime-kuma
name: deployment
spec:
selector:
matchLabels:
component: uptime-kuma
replicas: 1
strategy:
type: Recreate
template:
metadata:
labels:
component: uptime-kuma
spec:
containers:
- name: app
image: louislam/uptime-kuma:1
ports:
- containerPort: 3001
volumeMounts:
- mountPath: /app/data
name: storage
livenessProbe:
exec:
command:
- node
- extra/healthcheck.js
initialDelaySeconds: 180
periodSeconds: 60
timeoutSeconds: 30
readinessProbe:
httpGet:
path: /
port: 3001
scheme: HTTP
volumes:
- name: storage
persistentVolumeClaim:
claimName: pvc

View File

@@ -1,39 +0,0 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
cert-manager.io/cluster-issuer: letsencrypt-prod
nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
nginx.ingress.kubernetes.io/server-snippets: |
location / {
proxy_set_header Upgrade $http_upgrade;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_cache_bypass $http_upgrade;
}
name: ingress
spec:
tls:
- hosts:
- example.com
secretName: example-com-tls
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service
port:
number: 3001

View File

@@ -1,5 +0,0 @@
resources:
- deployment.yml
- service.yml
- ingressroute.yml
- pvc.yml

View File

@@ -1,10 +0,0 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 4Gi

View File

@@ -1,13 +0,0 @@
apiVersion: v1
kind: Service
metadata:
name: service
spec:
selector:
component: uptime-kuma
type: ClusterIP
ports:
- name: http
port: 3001
targetPort: 3001
protocol: TCP

14035
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,108 +0,0 @@
{
"name": "uptime-kuma",
"version": "1.7.0",
"license": "MIT",
"repository": {
"type": "git",
"url": "https://github.com/louislam/uptime-kuma.git"
},
"engines": {
"node": "14.*"
},
"scripts": {
"install-legacy": "npm install --legacy-peer-deps",
"update-legacy": "npm update --legacy-peer-deps",
"lint:js": "eslint --ext \".js,.vue\" --ignore-path .gitignore .",
"lint:style": "stylelint \"**/*.{vue,css,scss}\" --ignore-path .gitignore",
"lint": "npm run lint:js && npm run lint:style",
"dev": "vite --host",
"start": "npm run start-server",
"start-server": "node server/server.js",
"start-server-dev": "cross-env NODE_ENV=development node server/server.js",
"build": "vite build",
"tsc": "tsc",
"vite-preview-dist": "vite preview --host",
"build-docker": "npm run build-docker-debian && npm run build-docker-alpine",
"build-docker-alpine": "docker buildx build -f 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.7.0-alpine --target release . --push",
"build-docker-debian": "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma -t louislam/uptime-kuma:1 -t louislam/uptime-kuma:1.7.0 -t louislam/uptime-kuma:debian -t louislam/uptime-kuma:1-debian -t louislam/uptime-kuma:1.7.0-debian --target release . --push",
"build-docker-nightly": "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly --target nightly . --push",
"build-docker-nightly-alpine": "docker buildx build -f 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 --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain",
"setup": "git checkout 1.7.0 && npm install --legacy-peer-deps && node node_modules/esbuild/install.js && npm run build && npm prune",
"update-version": "node extra/update-version.js",
"mark-as-nightly": "node extra/mark-as-nightly.js",
"reset-password": "node extra/reset-password.js",
"compile-install-script": "@powershell -NoProfile -ExecutionPolicy Unrestricted -Command ./extra/compile-install-script.ps1",
"test-install-script-centos7": "npm run compile-install-script && docker build --progress plain -f test/test_install_script/centos7.dockerfile .",
"test-install-script-alpine3": "npm run compile-install-script && docker build --progress plain -f test/test_install_script/alpine3.dockerfile .",
"test-install-script-ubuntu": "npm run compile-install-script && docker build --progress plain -f test/test_install_script/ubuntu.dockerfile .",
"test-install-script-ubuntu1604": "npm run compile-install-script && docker build --progress plain -f test/test_install_script/ubuntu1604.dockerfile .",
"test-nodejs16": "docker build --progress plain -f test/ubuntu-nodejs16.dockerfile .",
"simple-dns-server": "node extra/simple-dns-server.js",
"update-language-files-with-base-lang": "cd extra/update-language-files && node index.js %npm_config_base_lang% && eslint ../../src/languages/**.js --fix",
"update-language-files": "cd extra/update-language-files && node index.js && eslint ../../src/languages/**.js --fix"
},
"dependencies": {
"@fortawesome/fontawesome-svg-core": "^1.2.36",
"@fortawesome/free-regular-svg-icons": "^5.15.4",
"@fortawesome/free-solid-svg-icons": "^5.15.4",
"@fortawesome/vue-fontawesome": "^3.0.0-4",
"@louislam/sqlite3": "^5.0.6",
"@popperjs/core": "^2.10.1",
"args-parser": "^1.3.0",
"axios": "^0.21.4",
"bcryptjs": "^2.4.3",
"bootstrap": "^5.1.1",
"chart.js": "^3.5.1",
"chartjs-adapter-dayjs": "^1.0.0",
"command-exists": "^1.2.9",
"compare-versions": "^3.6.0",
"dayjs": "^1.10.7",
"express": "^4.17.1",
"express-basic-auth": "^1.2.0",
"form-data": "^4.0.0",
"http-graceful-shutdown": "^3.1.4",
"jsonwebtoken": "^8.5.1",
"nodemailer": "^6.6.5",
"notp": "^2.0.3",
"password-hash": "^1.2.2",
"prom-client": "^13.2.0",
"prometheus-api-metrics": "^3.2.0",
"qrcode": "^1.4.4",
"redbean-node": "0.1.2",
"socket.io": "^4.2.0",
"socket.io-client": "^4.2.0",
"tcp-ping": "^0.1.1",
"thirty-two": "^1.0.2",
"timezones-list": "^3.0.1",
"v-pagination-3": "^0.1.6",
"vue": "next",
"vue-chart-3": "^0.5.8",
"vue-confirm-dialog": "^1.0.2",
"vue-contenteditable": "^3.0.4",
"vue-i18n": "^9.1.7",
"vue-image-crop-upload": "^3.0.3",
"vue-multiselect": "^3.0.0-alpha.2",
"vue-qrcode": "^1.0.0",
"vue-router": "^4.0.11",
"vue-toastification": "^2.0.0-rc.1",
"vuedraggable": "^4.1.0"
},
"devDependencies": {
"@babel/eslint-parser": "^7.15.7",
"@types/bootstrap": "^5.1.6",
"@vitejs/plugin-legacy": "^1.5.3",
"@vitejs/plugin-vue": "^1.9.1",
"@vue/compiler-sfc": "^3.2.16",
"core-js": "^3.18.0",
"cross-env": "^7.0.3",
"dns2": "^2.0.1",
"eslint": "^7.32.0",
"eslint-plugin-vue": "^7.18.0",
"sass": "^1.42.1",
"stylelint": "^13.13.1",
"stylelint-config-standard": "^22.0.0",
"typescript": "^4.4.3",
"vite": "^2.5.10"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 6.4 KiB

View File

@@ -1,19 +0,0 @@
{
"name": "Uptime Kuma",
"short_name": "Uptime Kuma",
"start_url": "/",
"background_color": "#fff",
"display": "standalone",
"icons": [
{
"src": "icon-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "icon-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
]
}

View File

@@ -1,51 +0,0 @@
const basicAuth = require("express-basic-auth")
const passwordHash = require("./password-hash");
const { R } = require("redbean-node");
const { setting } = require("./util-server");
const { debug } = require("../src/util");
/**
*
* @param username : string
* @param password : string
* @returns {Promise<Bean|null>}
*/
exports.login = async function (username, password) {
let user = await R.findOne("user", " username = ? AND active = 1 ", [
username,
])
if (user && passwordHash.verify(password, user.password)) {
// Upgrade the hash to bcrypt
if (passwordHash.needRehash(user.password)) {
await R.exec("UPDATE `user` SET password = ? WHERE id = ? ", [
passwordHash.generate(password),
user.id,
]);
}
return user;
}
return null;
}
function myAuthorizer(username, password, callback) {
setting("disableAuth").then((result) => {
if (result) {
callback(null, true)
} else {
exports.login(username, password).then((user) => {
callback(null, user != null)
})
}
})
}
exports.basicAuth = basicAuth({
authorizer: myAuthorizer,
authorizeAsync: true,
challenge: true,
});

View File

@@ -1,44 +0,0 @@
const { setSetting } = require("./util-server");
const axios = require("axios");
const { isDev } = require("../src/util");
exports.version = require("../package.json").version;
exports.latestVersion = null;
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);
}
// For debug
if (process.env.TEST_CHECK_VERSION === "1") {
res.data.version = "1000.0.0";
}
exports.latestVersion = res.data.version;
console.log("Latest Version: " + exports.latestVersion);
} catch (_) { }
};
check();
interval = setInterval(check, 3600 * 1000 * 48);
};
exports.enableCheckUpdate = async (value) => {
await setSetting("checkUpdate", value);
clearInterval(interval);
if (value) {
exports.startInterval();
}
};
exports.socket = null;

View File

@@ -1,88 +0,0 @@
/*
* For Client Socket
*/
const { TimeLogger } = require("../src/util");
const { R } = require("redbean-node");
const { io } = require("./server");
async function sendNotificationList(socket) {
const timeLogger = new TimeLogger();
let result = [];
let list = await R.find("notification", " user_id = ? ", [
socket.userID,
]);
for (let bean of list) {
result.push(bean.export())
}
io.to(socket.userID).emit("notificationList", result)
timeLogger.print("Send Notification List");
return list;
}
/**
* Send Heartbeat History list to socket
* @param toUser True = send to all browsers with the same user id, False = send to the current browser only
* @param overwrite Overwrite client-side's heartbeat list
*/
async function sendHeartbeatList(socket, monitorID, toUser = false, overwrite = false) {
const timeLogger = new TimeLogger();
let list = await R.getAll(`
SELECT * FROM heartbeat
WHERE monitor_id = ?
ORDER BY time DESC
LIMIT 100
`, [
monitorID,
])
let result = list.reverse();
if (toUser) {
io.to(socket.userID).emit("heartbeatList", monitorID, result, overwrite);
} else {
socket.emit("heartbeatList", monitorID, result, overwrite);
}
timeLogger.print(`[Monitor: ${monitorID}] sendHeartbeatList`);
}
/**
* Important Heart beat list (aka event list)
* @param socket
* @param monitorID
* @param toUser True = send to all browsers with the same user id, False = send to the current browser only
* @param overwrite Overwrite client-side's heartbeat list
*/
async function sendImportantHeartbeatList(socket, monitorID, toUser = false, overwrite = false) {
const timeLogger = new TimeLogger();
let list = await R.find("heartbeat", `
monitor_id = ?
AND important = 1
ORDER BY time DESC
LIMIT 500
`, [
monitorID,
])
timeLogger.print(`[Monitor: ${monitorID}] sendImportantHeartbeatList`);
if (toUser) {
io.to(socket.userID).emit("importantHeartbeatList", monitorID, list, overwrite);
} else {
socket.emit("importantHeartbeatList", monitorID, list, overwrite);
}
}
module.exports = {
sendNotificationList,
sendImportantHeartbeatList,
sendHeartbeatList,
}

View File

@@ -1,375 +0,0 @@
const fs = require("fs");
const { R } = require("redbean-node");
const { setSetting, setting } = require("./util-server");
const { debug, sleep } = require("../src/util");
const dayjs = require("dayjs");
const knex = require("knex");
/**
* Database & App Data Folder
*/
class Database {
static templatePath = "./db/kuma.db";
/**
* Data Dir (Default: ./data)
*/
static dataDir;
/**
* User Upload Dir (Default: ./data/upload)
*/
static uploadDir;
static path;
/**
* @type {boolean}
*/
static patched = false;
/**
* For Backup only
*/
static backupPath = null;
/**
* Add patch filename in key
* Values:
* true: Add it regardless of order
* false: Do nothing
* { parents: []}: Need parents before add it
*/
static patchList = {
"patch-setting-value-type.sql": true,
"patch-improve-performance.sql": true,
"patch-2fa.sql": true,
"patch-add-retry-interval-monitor.sql": true,
"patch-incident-table.sql": true,
"patch-group-table.sql": true,
}
/**
* The finally version should be 10 after merged tag feature
* @deprecated Use patchList for any new feature
*/
static latestVersion = 10;
static noReject = true;
static init(args) {
// Data Directory (must be end with "/")
Database.dataDir = process.env.DATA_DIR || args["data-dir"] || "./data/";
Database.path = Database.dataDir + "kuma.db";
if (! fs.existsSync(Database.dataDir)) {
fs.mkdirSync(Database.dataDir, { recursive: true });
}
Database.uploadDir = Database.dataDir + "upload/";
if (! fs.existsSync(Database.uploadDir)) {
fs.mkdirSync(Database.uploadDir, { recursive: true });
}
console.log(`Data Dir: ${Database.dataDir}`);
}
static async connect() {
const acquireConnectionTimeout = 120 * 1000;
const Dialect = require("knex/lib/dialects/sqlite3/index.js");
Dialect.prototype._driver = () => require("@louislam/sqlite3");
const knexInstance = knex({
client: Dialect,
connection: {
filename: Database.path,
acquireConnectionTimeout: acquireConnectionTimeout,
},
useNullAsDefault: true,
pool: {
min: 1,
max: 1,
idleTimeoutMillis: 120 * 1000,
propagateCreateError: false,
acquireTimeoutMillis: acquireConnectionTimeout,
}
});
R.setup(knexInstance);
if (process.env.SQL_LOG === "1") {
R.debug(true);
}
// Auto map the model to a bean object
R.freeze(true);
await R.autoloadModels("./server/model");
// Change to WAL
await R.exec("PRAGMA journal_mode = WAL");
await R.exec("PRAGMA cache_size = -12000");
console.log("SQLite config:");
console.log(await R.getAll("PRAGMA journal_mode"));
console.log(await R.getAll("PRAGMA cache_size"));
console.log("SQLite Version: " + await R.getCell("SELECT sqlite_version()"));
}
static async patch() {
let version = parseInt(await setting("database_version"));
if (! version) {
version = 0;
}
console.info("Your database version: " + version);
console.info("Latest database version: " + this.latestVersion);
if (version === this.latestVersion) {
console.info("Database no need to patch");
} else if (version > this.latestVersion) {
console.info("Warning: Database version is newer than expected");
} else {
console.info("Database patch is needed");
this.backup(version);
// Try catch anything here, if gone wrong, restore the backup
try {
for (let i = version + 1; i <= this.latestVersion; i++) {
const sqlFile = `./db/patch${i}.sql`;
console.info(`Patching ${sqlFile}`);
await Database.importSQLFile(sqlFile);
console.info(`Patched ${sqlFile}`);
await setSetting("database_version", i);
}
} catch (ex) {
await Database.close();
console.error(ex);
console.error("Start Uptime-Kuma failed due to patch db failed");
console.error("Please submit the bug report if you still encounter the problem after restart: https://github.com/louislam/uptime-kuma/issues");
this.restore();
process.exit(1);
}
}
await this.patch2();
}
/**
* Call it from patch() only
* @returns {Promise<void>}
*/
static async patch2() {
console.log("Database Patch 2.0 Process");
let databasePatchedFiles = await setting("databasePatchedFiles");
if (! databasePatchedFiles) {
databasePatchedFiles = {};
}
debug("Patched files:");
debug(databasePatchedFiles);
try {
for (let sqlFilename in this.patchList) {
await this.patch2Recursion(sqlFilename, databasePatchedFiles);
}
if (this.patched) {
console.log("Database Patched Successfully");
}
} catch (ex) {
await Database.close();
console.error(ex);
console.error("Start Uptime-Kuma failed due to patch db failed");
console.error("Please submit the bug report if you still encounter the problem after restart: https://github.com/louislam/uptime-kuma/issues");
this.restore();
process.exit(1);
}
await setSetting("databasePatchedFiles", databasePatchedFiles);
}
/**
* Used it patch2() only
* @param sqlFilename
* @param databasePatchedFiles
*/
static async patch2Recursion(sqlFilename, databasePatchedFiles) {
let value = this.patchList[sqlFilename];
if (! value) {
console.log(sqlFilename + " skip");
return;
}
// Check if patched
if (! databasePatchedFiles[sqlFilename]) {
console.log(sqlFilename + " is not patched");
if (value.parents) {
console.log(sqlFilename + " need parents");
for (let parentSQLFilename of value.parents) {
await this.patch2Recursion(parentSQLFilename, databasePatchedFiles);
}
}
this.backup(dayjs().format("YYYYMMDDHHmmss"));
console.log(sqlFilename + " is patching");
this.patched = true;
await this.importSQLFile("./db/" + sqlFilename);
databasePatchedFiles[sqlFilename] = true;
console.log(sqlFilename + " is patched successfully");
} else {
debug(sqlFilename + " is already patched, skip");
}
}
/**
* Sadly, multi sql statements is not supported by many sqlite libraries, I have to implement it myself
* @param filename
* @returns {Promise<void>}
*/
static async importSQLFile(filename) {
await R.getCell("SELECT 1");
let text = fs.readFileSync(filename).toString();
// Remove all comments (--)
let lines = text.split("\n");
lines = lines.filter((line) => {
return ! line.startsWith("--");
});
// Split statements by semicolon
// Filter out empty line
text = lines.join("\n");
let statements = text.split(";")
.map((statement) => {
return statement.trim();
})
.filter((statement) => {
return statement !== "";
});
for (let statement of statements) {
await R.exec(statement);
}
}
static getBetterSQLite3Database() {
return R.knex.client.acquireConnection();
}
/**
* Special handle, because tarn.js throw a promise reject that cannot be caught
* @returns {Promise<void>}
*/
static async close() {
const listener = (reason, p) => {
Database.noReject = false;
};
process.addListener("unhandledRejection", listener);
console.log("Closing DB");
while (true) {
Database.noReject = true;
await R.close();
await sleep(2000);
if (Database.noReject) {
break;
} else {
console.log("Waiting to close the db");
}
}
console.log("SQLite closed");
process.removeListener("unhandledRejection", listener);
}
/**
* One backup one time in this process.
* Reset this.backupPath if you want to backup again
* @param version
*/
static backup(version) {
if (! this.backupPath) {
console.info("Backup the db");
this.backupPath = this.dataDir + "kuma.db.bak" + version;
fs.copyFileSync(Database.path, this.backupPath);
const shmPath = Database.path + "-shm";
if (fs.existsSync(shmPath)) {
this.backupShmPath = shmPath + ".bak" + version;
fs.copyFileSync(shmPath, this.backupShmPath);
}
const walPath = Database.path + "-wal";
if (fs.existsSync(walPath)) {
this.backupWalPath = walPath + ".bak" + version;
fs.copyFileSync(walPath, this.backupWalPath);
}
}
}
/**
*
*/
static restore() {
if (this.backupPath) {
console.error("Patch db failed!!! Restoring the backup");
const shmPath = Database.path + "-shm";
const walPath = Database.path + "-wal";
// Delete patch failed db
try {
if (fs.existsSync(Database.path)) {
fs.unlinkSync(Database.path);
}
if (fs.existsSync(shmPath)) {
fs.unlinkSync(shmPath);
}
if (fs.existsSync(walPath)) {
fs.unlinkSync(walPath);
}
} catch (e) {
console.log("Restore failed, you may need to restore the backup manually");
process.exit(1);
}
// Restore backup
fs.copyFileSync(this.backupPath, Database.path);
if (this.backupShmPath) {
fs.copyFileSync(this.backupShmPath, shmPath);
}
if (this.backupWalPath) {
fs.copyFileSync(this.backupWalPath, walPath);
}
} else {
console.log("Nothing to restore");
}
}
}
module.exports = Database;

View File

@@ -1,57 +0,0 @@
/*
From https://github.com/DiegoZoracKy/image-data-uri/blob/master/lib/image-data-uri.js
Modified with 0 dependencies
*/
let fs = require("fs");
let ImageDataURI = (() => {
function decode(dataURI) {
if (!/data:image\//.test(dataURI)) {
console.log("ImageDataURI :: Error :: It seems that it is not an Image Data URI. Couldn't match \"data:image/\"");
return null;
}
let regExMatches = dataURI.match("data:(image/.*);base64,(.*)");
return {
imageType: regExMatches[1],
dataBase64: regExMatches[2],
dataBuffer: new Buffer(regExMatches[2], "base64")
};
}
function encode(data, mediaType) {
if (!data || !mediaType) {
console.log("ImageDataURI :: Error :: Missing some of the required params: data, mediaType ");
return null;
}
mediaType = (/\//.test(mediaType)) ? mediaType : "image/" + mediaType;
let dataBase64 = (Buffer.isBuffer(data)) ? data.toString("base64") : new Buffer(data).toString("base64");
let dataImgBase64 = "data:" + mediaType + ";base64," + dataBase64;
return dataImgBase64;
}
function outputFile(dataURI, filePath) {
filePath = filePath || "./";
return new Promise((resolve, reject) => {
let imageDecoded = decode(dataURI);
fs.writeFile(filePath, imageDecoded.dataBuffer, err => {
if (err) {
return reject("ImageDataURI :: Error :: " + JSON.stringify(err, null, 4));
}
resolve(filePath);
});
});
}
return {
decode: decode,
encode: encode,
outputFile: outputFile,
};
})();
module.exports = ImageDataURI;

View File

@@ -1,34 +0,0 @@
const { BeanModel } = require("redbean-node/dist/bean-model");
const { R } = require("redbean-node");
class Group extends BeanModel {
async toPublicJSON() {
let monitorBeanList = await this.getMonitorList();
let monitorList = [];
for (let bean of monitorBeanList) {
monitorList.push(await bean.toPublicJSON());
}
return {
id: this.id,
name: this.name,
weight: this.weight,
monitorList,
};
}
async getMonitorList() {
return R.convertToBeans("monitor", await R.getAll(`
SELECT monitor.* FROM monitor, monitor_group
WHERE monitor.id = monitor_group.monitor_id
AND group_id = ?
ORDER BY monitor_group.weight
`, [
this.id,
]));
}
}
module.exports = Group;

View File

@@ -1,39 +0,0 @@
const dayjs = require("dayjs");
const utc = require("dayjs/plugin/utc");
let timezone = require("dayjs/plugin/timezone");
dayjs.extend(utc);
dayjs.extend(timezone);
const { BeanModel } = require("redbean-node/dist/bean-model");
/**
* status:
* 0 = DOWN
* 1 = UP
* 2 = PENDING
*/
class Heartbeat extends BeanModel {
toPublicJSON() {
return {
status: this.status,
time: this.time,
msg: "", // Hide for public
ping: this.ping,
};
}
toJSON() {
return {
monitorID: this.monitor_id,
status: this.status,
time: this.time,
msg: this.msg,
ping: this.ping,
important: this.important,
duration: this.duration,
};
}
}
module.exports = Heartbeat;

View File

@@ -1,18 +0,0 @@
const { BeanModel } = require("redbean-node/dist/bean-model");
class Incident extends BeanModel {
toPublicJSON() {
return {
id: this.id,
style: this.style,
title: this.title,
content: this.content,
pin: this.pin,
createdDate: this.createdDate,
lastUpdatedDate: this.lastUpdatedDate,
};
}
}
module.exports = Incident;

View File

@@ -1,505 +0,0 @@
const https = require("https");
const dayjs = require("dayjs");
const utc = require("dayjs/plugin/utc");
let timezone = require("dayjs/plugin/timezone");
dayjs.extend(utc);
dayjs.extend(timezone);
const axios = require("axios");
const { Prometheus } = require("../prometheus");
const { debug, UP, DOWN, PENDING, flipStatus, TimeLogger } = require("../../src/util");
const { tcping, ping, dnsResolve, checkCertificate, checkStatusCode, getTotalClientInRoom } = require("../util-server");
const { R } = require("redbean-node");
const { BeanModel } = require("redbean-node/dist/bean-model");
const { Notification } = require("../notification");
const version = require("../../package.json").version;
/**
* status:
* 0 = DOWN
* 1 = UP
* 2 = PENDING
*/
class Monitor extends BeanModel {
/**
* Return a object that ready to parse to JSON for public
* Only show necessary data to public
*/
async toPublicJSON() {
return {
id: this.id,
name: this.name,
};
}
/**
* Return a object that ready to parse to JSON
*/
async toJSON() {
let notificationIDList = {};
let list = await R.find("monitor_notification", " monitor_id = ? ", [
this.id,
]);
for (let bean of list) {
notificationIDList[bean.notification_id] = true;
}
const tags = await R.getAll("SELECT mt.*, tag.name, tag.color FROM monitor_tag mt JOIN tag ON mt.tag_id = tag.id WHERE mt.monitor_id = ?", [this.id]);
return {
id: this.id,
name: this.name,
url: this.url,
hostname: this.hostname,
port: this.port,
maxretries: this.maxretries,
weight: this.weight,
active: this.active,
type: this.type,
interval: this.interval,
retryInterval: this.retryInterval,
keyword: this.keyword,
ignoreTls: this.getIgnoreTls(),
upsideDown: this.isUpsideDown(),
maxredirects: this.maxredirects,
accepted_statuscodes: this.getAcceptedStatuscodes(),
dns_resolve_type: this.dns_resolve_type,
dns_resolve_server: this.dns_resolve_server,
dns_last_result: this.dns_last_result,
notificationIDList,
tags: tags,
};
}
/**
* Parse to boolean
* @returns {boolean}
*/
getIgnoreTls() {
return Boolean(this.ignoreTls);
}
/**
* Parse to boolean
* @returns {boolean}
*/
isUpsideDown() {
return Boolean(this.upsideDown);
}
getAcceptedStatuscodes() {
return JSON.parse(this.accepted_statuscodes_json);
}
start(io) {
let previousBeat = null;
let retries = 0;
let prometheus = new Prometheus(this);
const beat = async () => {
// Expose here for prometheus update
// undefined if not https
let tlsInfo = undefined;
if (! previousBeat) {
previousBeat = await R.findOne("heartbeat", " monitor_id = ? ORDER BY time DESC", [
this.id,
]);
}
const isFirstBeat = !previousBeat;
let bean = R.dispense("heartbeat");
bean.monitor_id = this.id;
bean.time = R.isoDateTime(dayjs.utc());
bean.status = DOWN;
if (this.isUpsideDown()) {
bean.status = flipStatus(bean.status);
}
// Duration
if (! isFirstBeat) {
bean.duration = dayjs(bean.time).diff(dayjs(previousBeat.time), "second");
} else {
bean.duration = 0;
}
try {
if (this.type === "http" || this.type === "keyword") {
// Do not do any queries/high loading things before the "bean.ping"
let startTime = dayjs().valueOf();
let res = await axios.get(this.url, {
timeout: this.interval * 1000 * 0.8,
headers: {
"Accept": "*/*",
"User-Agent": "Uptime-Kuma/" + version,
},
httpsAgent: new https.Agent({
maxCachedSessions: 0, // Use Custom agent to disable session reuse (https://github.com/nodejs/node/issues/3940)
rejectUnauthorized: ! this.getIgnoreTls(),
}),
maxRedirects: this.maxredirects,
validateStatus: (status) => {
return checkStatusCode(status, this.getAcceptedStatuscodes());
},
});
bean.msg = `${res.status} - ${res.statusText}`;
bean.ping = dayjs().valueOf() - startTime;
// Check certificate if https is used
let certInfoStartTime = dayjs().valueOf();
if (this.getUrl()?.protocol === "https:") {
try {
tlsInfo = await this.updateTlsInfo(checkCertificate(res));
} catch (e) {
if (e.message !== "No TLS certificate in response") {
console.error(e.message);
}
}
}
debug("Cert Info Query Time: " + (dayjs().valueOf() - certInfoStartTime) + "ms");
if (this.type === "http") {
bean.status = UP;
} else {
let data = res.data;
// Convert to string for object/array
if (typeof data !== "string") {
data = JSON.stringify(data);
}
if (data.includes(this.keyword)) {
bean.msg += ", keyword is found";
bean.status = UP;
} else {
throw new Error(bean.msg + ", but keyword is not found");
}
}
} else if (this.type === "port") {
bean.ping = await tcping(this.hostname, this.port);
bean.msg = "";
bean.status = UP;
} else if (this.type === "ping") {
bean.ping = await ping(this.hostname);
bean.msg = "";
bean.status = UP;
} else if (this.type === "dns") {
let startTime = dayjs().valueOf();
let dnsMessage = "";
let dnsRes = await dnsResolve(this.hostname, this.dns_resolve_server, this.dns_resolve_type);
bean.ping = dayjs().valueOf() - startTime;
if (this.dns_resolve_type == "A" || this.dns_resolve_type == "AAAA" || this.dns_resolve_type == "TXT") {
dnsMessage += "Records: ";
dnsMessage += dnsRes.join(" | ");
} else if (this.dns_resolve_type == "CNAME" || this.dns_resolve_type == "PTR") {
dnsMessage = dnsRes[0];
} else if (this.dns_resolve_type == "CAA") {
dnsMessage = dnsRes[0].issue;
} else if (this.dns_resolve_type == "MX") {
dnsRes.forEach(record => {
dnsMessage += `Hostname: ${record.exchange} - Priority: ${record.priority} | `;
});
dnsMessage = dnsMessage.slice(0, -2);
} else if (this.dns_resolve_type == "NS") {
dnsMessage += "Servers: ";
dnsMessage += dnsRes.join(" | ");
} else if (this.dns_resolve_type == "SOA") {
dnsMessage += `NS-Name: ${dnsRes.nsname} | Hostmaster: ${dnsRes.hostmaster} | Serial: ${dnsRes.serial} | Refresh: ${dnsRes.refresh} | Retry: ${dnsRes.retry} | Expire: ${dnsRes.expire} | MinTTL: ${dnsRes.minttl}`;
} else if (this.dns_resolve_type == "SRV") {
dnsRes.forEach(record => {
dnsMessage += `Name: ${record.name} | Port: ${record.port} | Priority: ${record.priority} | Weight: ${record.weight} | `;
});
dnsMessage = dnsMessage.slice(0, -2);
}
if (this.dnsLastResult !== dnsMessage) {
R.exec("UPDATE `monitor` SET dns_last_result = ? WHERE id = ? ", [
dnsMessage,
this.id
]);
}
bean.msg = dnsMessage;
bean.status = UP;
}
if (this.isUpsideDown()) {
bean.status = flipStatus(bean.status);
if (bean.status === DOWN) {
throw new Error("Flip UP to DOWN");
}
}
retries = 0;
} catch (error) {
bean.msg = error.message;
// If UP come in here, it must be upside down mode
// Just reset the retries
if (this.isUpsideDown() && bean.status === UP) {
retries = 0;
} else if ((this.maxretries > 0) && (retries < this.maxretries)) {
retries++;
bean.status = PENDING;
}
}
// * ? -> ANY STATUS = important [isFirstBeat]
// UP -> PENDING = not important
// * UP -> DOWN = important
// UP -> UP = not important
// PENDING -> PENDING = not important
// * PENDING -> DOWN = important
// PENDING -> UP = not important
// DOWN -> PENDING = this case not exists
// DOWN -> DOWN = not important
// * DOWN -> UP = important
let isImportant = isFirstBeat ||
(previousBeat.status === UP && bean.status === DOWN) ||
(previousBeat.status === DOWN && bean.status === UP) ||
(previousBeat.status === PENDING && bean.status === DOWN);
// Mark as important if status changed, ignore pending pings,
// Don't notify if disrupted changes to up
if (isImportant) {
bean.important = true;
// Send only if the first beat is DOWN
if (!isFirstBeat || bean.status === DOWN) {
let notificationList = await R.getAll("SELECT notification.* FROM notification, monitor_notification WHERE monitor_id = ? AND monitor_notification.notification_id = notification.id ", [
this.id,
]);
let text;
if (bean.status === UP) {
text = "✅ Up";
} else {
text = "🔴 Down";
}
let msg = `[${this.name}] [${text}] ${bean.msg}`;
for (let notification of notificationList) {
try {
await Notification.send(JSON.parse(notification.config), msg, await this.toJSON(), bean.toJSON());
} catch (e) {
console.error("Cannot send notification to " + notification.name);
console.log(e);
}
}
}
} else {
bean.important = false;
}
let beatInterval = this.interval;
if (bean.status === UP) {
console.info(`Monitor #${this.id} '${this.name}': Successful Response: ${bean.ping} ms | Interval: ${beatInterval} seconds | Type: ${this.type}`);
} else if (bean.status === PENDING) {
if (this.retryInterval !== this.interval) {
beatInterval = this.retryInterval;
}
console.warn(`Monitor #${this.id} '${this.name}': Pending: ${bean.msg} | Max retries: ${this.maxretries} | Retry: ${retries} | Retry Interval: ${beatInterval} seconds | Type: ${this.type}`);
} else {
console.warn(`Monitor #${this.id} '${this.name}': Failing: ${bean.msg} | Interval: ${beatInterval} seconds | Type: ${this.type}`);
}
io.to(this.user_id).emit("heartbeat", bean.toJSON());
Monitor.sendStats(io, this.id, this.user_id);
await R.store(bean);
prometheus.update(bean, tlsInfo);
previousBeat = bean;
if (! this.isStop) {
this.heartbeatInterval = setTimeout(beat, beatInterval * 1000);
}
};
beat();
}
stop() {
clearTimeout(this.heartbeatInterval);
this.isStop = true;
}
/**
* Helper Method:
* returns URL object for further usage
* returns null if url is invalid
* @returns {null|URL}
*/
getUrl() {
try {
return new URL(this.url);
} catch (_) {
return null;
}
}
/**
* Store TLS info to database
* @param checkCertificateResult
* @returns {Promise<object>}
*/
async updateTlsInfo(checkCertificateResult) {
let tls_info_bean = await R.findOne("monitor_tls_info", "monitor_id = ?", [
this.id,
]);
if (tls_info_bean == null) {
tls_info_bean = R.dispense("monitor_tls_info");
tls_info_bean.monitor_id = this.id;
}
tls_info_bean.info_json = JSON.stringify(checkCertificateResult);
await R.store(tls_info_bean);
return checkCertificateResult;
}
static async sendStats(io, monitorID, userID) {
const hasClients = getTotalClientInRoom(io, userID) > 0;
if (hasClients) {
await Monitor.sendAvgPing(24, io, monitorID, userID);
await Monitor.sendUptime(24, io, monitorID, userID);
await Monitor.sendUptime(24 * 30, io, monitorID, userID);
await Monitor.sendCertInfo(io, monitorID, userID);
} else {
debug("No clients in the room, no need to send stats");
}
}
/**
*
* @param duration : int Hours
*/
static async sendAvgPing(duration, io, monitorID, userID) {
const timeLogger = new TimeLogger();
let avgPing = parseInt(await R.getCell(`
SELECT AVG(ping)
FROM heartbeat
WHERE time > DATETIME('now', ? || ' hours')
AND ping IS NOT NULL
AND monitor_id = ? `, [
-duration,
monitorID,
]));
timeLogger.print(`[Monitor: ${monitorID}] avgPing`);
io.to(userID).emit("avgPing", monitorID, avgPing);
}
static async sendCertInfo(io, monitorID, userID) {
let tls_info = await R.findOne("monitor_tls_info", "monitor_id = ?", [
monitorID,
]);
if (tls_info != null) {
io.to(userID).emit("certInfo", monitorID, tls_info.info_json);
}
}
/**
* Uptime with calculation
* Calculation based on:
* https://www.uptrends.com/support/kb/reporting/calculation-of-uptime-and-downtime
* @param duration : int Hours
*/
static async calcUptime(duration, monitorID) {
const timeLogger = new TimeLogger();
const startTime = R.isoDateTime(dayjs.utc().subtract(duration, "hour"));
// Handle if heartbeat duration longer than the target duration
// e.g. If the last beat's duration is bigger that the 24hrs window, it will use the duration between the (beat time - window margin) (THEN case in SQL)
let result = await R.getRow(`
SELECT
-- SUM all duration, also trim off the beat out of time window
SUM(
CASE
WHEN (JULIANDAY(\`time\`) - JULIANDAY(?)) * 86400 < duration
THEN (JULIANDAY(\`time\`) - JULIANDAY(?)) * 86400
ELSE duration
END
) AS total_duration,
-- SUM all uptime duration, also trim off the beat out of time window
SUM(
CASE
WHEN (status = 1)
THEN
CASE
WHEN (JULIANDAY(\`time\`) - JULIANDAY(?)) * 86400 < duration
THEN (JULIANDAY(\`time\`) - JULIANDAY(?)) * 86400
ELSE duration
END
END
) AS uptime_duration
FROM heartbeat
WHERE time > ?
AND monitor_id = ?
`, [
startTime, startTime, startTime, startTime, startTime,
monitorID,
]);
timeLogger.print(`[Monitor: ${monitorID}][${duration}] sendUptime`);
let totalDuration = result.total_duration;
let uptimeDuration = result.uptime_duration;
let uptime = 0;
if (totalDuration > 0) {
uptime = uptimeDuration / totalDuration;
if (uptime < 0) {
uptime = 0;
}
} else {
// Handle new monitor with only one beat, because the beat's duration = 0
let status = parseInt(await R.getCell("SELECT `status` FROM heartbeat WHERE monitor_id = ?", [ monitorID ]));
if (status === UP) {
uptime = 1;
}
}
return uptime;
}
/**
* Send Uptime
* @param duration : int Hours
*/
static async sendUptime(duration, io, monitorID, userID) {
const uptime = await this.calcUptime(duration, monitorID);
io.to(userID).emit("uptime", monitorID, duration, uptime);
}
}
module.exports = Monitor;

View File

@@ -1,13 +0,0 @@
const { BeanModel } = require("redbean-node/dist/bean-model");
class Tag extends BeanModel {
toJSON() {
return {
id: this._id,
name: this._name,
color: this._color,
};
}
}
module.exports = Tag;

View File

@@ -1,21 +0,0 @@
const { BeanModel } = require("redbean-node/dist/bean-model");
const passwordHash = require("../password-hash");
const { R } = require("redbean-node");
class User extends BeanModel {
/**
* Direct execute, no need R.store()
* @param newPassword
* @returns {Promise<void>}
*/
async resetPassword(newPassword) {
await R.exec("UPDATE `user` SET password = ? WHERE id = ? ", [
passwordHash.generate(newPassword),
this.id
]);
this.password = newPassword;
}
}
module.exports = User;

View File

@@ -1,749 +0,0 @@
let url = require("url");
let MemoryCache = require("./memory-cache");
let t = {
ms: 1,
second: 1000,
minute: 60000,
hour: 3600000,
day: 3600000 * 24,
week: 3600000 * 24 * 7,
month: 3600000 * 24 * 30,
};
let instances = [];
let matches = function (a) {
return function (b) {
return a === b;
};
};
let doesntMatch = function (a) {
return function (b) {
return !matches(a)(b);
};
};
let logDuration = function (d, prefix) {
let str = d > 1000 ? (d / 1000).toFixed(2) + "sec" : d + "ms";
return "\x1b[33m- " + (prefix ? prefix + " " : "") + str + "\x1b[0m";
};
function getSafeHeaders(res) {
return res.getHeaders ? res.getHeaders() : res._headers;
}
function ApiCache() {
let memCache = new MemoryCache();
let globalOptions = {
debug: false,
defaultDuration: 3600000,
enabled: true,
appendKey: [],
jsonp: false,
redisClient: false,
headerBlacklist: [],
statusCodes: {
include: [],
exclude: [],
},
events: {
expire: undefined,
},
headers: {
// 'cache-control': 'no-cache' // example of header overwrite
},
trackPerformance: false,
respectCacheControl: false,
};
let middlewareOptions = [];
let instance = this;
let index = null;
let timers = {};
let performanceArray = []; // for tracking cache hit rate
instances.push(this);
this.id = instances.length;
function debug(a, b, c, d) {
let arr = ["\x1b[36m[apicache]\x1b[0m", a, b, c, d].filter(function (arg) {
return arg !== undefined;
});
let debugEnv = process.env.DEBUG && process.env.DEBUG.split(",").indexOf("apicache") !== -1;
return (globalOptions.debug || debugEnv) && console.log.apply(null, arr);
}
function shouldCacheResponse(request, response, toggle) {
let opt = globalOptions;
let codes = opt.statusCodes;
if (!response) {
return false;
}
if (toggle && !toggle(request, response)) {
return false;
}
if (codes.exclude && codes.exclude.length && codes.exclude.indexOf(response.statusCode) !== -1) {
return false;
}
if (codes.include && codes.include.length && codes.include.indexOf(response.statusCode) === -1) {
return false;
}
return true;
}
function addIndexEntries(key, req) {
let groupName = req.apicacheGroup;
if (groupName) {
debug("group detected \"" + groupName + "\"");
let group = (index.groups[groupName] = index.groups[groupName] || []);
group.unshift(key);
}
index.all.unshift(key);
}
function filterBlacklistedHeaders(headers) {
return Object.keys(headers)
.filter(function (key) {
return globalOptions.headerBlacklist.indexOf(key) === -1;
})
.reduce(function (acc, header) {
acc[header] = headers[header];
return acc;
}, {});
}
function createCacheObject(status, headers, data, encoding) {
return {
status: status,
headers: filterBlacklistedHeaders(headers),
data: data,
encoding: encoding,
timestamp: new Date().getTime() / 1000, // seconds since epoch. This is used to properly decrement max-age headers in cached responses.
};
}
function cacheResponse(key, value, duration) {
let redis = globalOptions.redisClient;
let expireCallback = globalOptions.events.expire;
if (redis && redis.connected) {
try {
redis.hset(key, "response", JSON.stringify(value));
redis.hset(key, "duration", duration);
redis.expire(key, duration / 1000, expireCallback || function () {});
} catch (err) {
debug("[apicache] error in redis.hset()");
}
} else {
memCache.add(key, value, duration, expireCallback);
}
// add automatic cache clearing from duration, includes max limit on setTimeout
timers[key] = setTimeout(function () {
instance.clear(key, true);
}, Math.min(duration, 2147483647));
}
function accumulateContent(res, content) {
if (content) {
if (typeof content == "string") {
res._apicache.content = (res._apicache.content || "") + content;
} else if (Buffer.isBuffer(content)) {
let oldContent = res._apicache.content;
if (typeof oldContent === "string") {
oldContent = !Buffer.from ? new Buffer(oldContent) : Buffer.from(oldContent);
}
if (!oldContent) {
oldContent = !Buffer.alloc ? new Buffer(0) : Buffer.alloc(0);
}
res._apicache.content = Buffer.concat(
[oldContent, content],
oldContent.length + content.length
);
} else {
res._apicache.content = content;
}
}
}
function makeResponseCacheable(req, res, next, key, duration, strDuration, toggle) {
// monkeypatch res.end to create cache object
res._apicache = {
write: res.write,
writeHead: res.writeHead,
end: res.end,
cacheable: true,
content: undefined,
};
// append header overwrites if applicable
Object.keys(globalOptions.headers).forEach(function (name) {
res.setHeader(name, globalOptions.headers[name]);
});
res.writeHead = function () {
// add cache control headers
if (!globalOptions.headers["cache-control"]) {
if (shouldCacheResponse(req, res, toggle)) {
res.setHeader("cache-control", "max-age=" + (duration / 1000).toFixed(0));
} else {
res.setHeader("cache-control", "no-cache, no-store, must-revalidate");
}
}
res._apicache.headers = Object.assign({}, getSafeHeaders(res));
return res._apicache.writeHead.apply(this, arguments);
};
// patch res.write
res.write = function (content) {
accumulateContent(res, content);
return res._apicache.write.apply(this, arguments);
};
// patch res.end
res.end = function (content, encoding) {
if (shouldCacheResponse(req, res, toggle)) {
accumulateContent(res, content);
if (res._apicache.cacheable && res._apicache.content) {
addIndexEntries(key, req);
let headers = res._apicache.headers || getSafeHeaders(res);
let cacheObject = createCacheObject(
res.statusCode,
headers,
res._apicache.content,
encoding
);
cacheResponse(key, cacheObject, duration);
// display log entry
let elapsed = new Date() - req.apicacheTimer;
debug("adding cache entry for \"" + key + "\" @ " + strDuration, logDuration(elapsed));
debug("_apicache.headers: ", res._apicache.headers);
debug("res.getHeaders(): ", getSafeHeaders(res));
debug("cacheObject: ", cacheObject);
}
}
return res._apicache.end.apply(this, arguments);
};
next();
}
function sendCachedResponse(request, response, cacheObject, toggle, next, duration) {
if (toggle && !toggle(request, response)) {
return next();
}
let headers = getSafeHeaders(response);
// Modified by @louislam, removed Cache-control, since I don't need client side cache!
// Original Source: https://github.com/kwhitley/apicache/blob/0d5686cc21fad353c6dddee646288c2fca3e4f50/src/apicache.js#L254
Object.assign(headers, filterBlacklistedHeaders(cacheObject.headers || {}));
// only embed apicache headers when not in production environment
if (process.env.NODE_ENV !== "production") {
Object.assign(headers, {
"apicache-store": globalOptions.redisClient ? "redis" : "memory",
"apicache-version": "1.6.2-modified",
});
}
// unstringify buffers
let data = cacheObject.data;
if (data && data.type === "Buffer") {
data =
typeof data.data === "number" ? new Buffer.alloc(data.data) : new Buffer.from(data.data);
}
// test Etag against If-None-Match for 304
let cachedEtag = cacheObject.headers.etag;
let requestEtag = request.headers["if-none-match"];
if (requestEtag && cachedEtag === requestEtag) {
response.writeHead(304, headers);
return response.end();
}
response.writeHead(cacheObject.status || 200, headers);
return response.end(data, cacheObject.encoding);
}
function syncOptions() {
for (let i in middlewareOptions) {
Object.assign(middlewareOptions[i].options, globalOptions, middlewareOptions[i].localOptions);
}
}
this.clear = function (target, isAutomatic) {
let group = index.groups[target];
let redis = globalOptions.redisClient;
if (group) {
debug("clearing group \"" + target + "\"");
group.forEach(function (key) {
debug("clearing cached entry for \"" + key + "\"");
clearTimeout(timers[key]);
delete timers[key];
if (!globalOptions.redisClient) {
memCache.delete(key);
} else {
try {
redis.del(key);
} catch (err) {
console.log("[apicache] error in redis.del(\"" + key + "\")");
}
}
index.all = index.all.filter(doesntMatch(key));
});
delete index.groups[target];
} else if (target) {
debug("clearing " + (isAutomatic ? "expired" : "cached") + " entry for \"" + target + "\"");
clearTimeout(timers[target]);
delete timers[target];
// clear actual cached entry
if (!redis) {
memCache.delete(target);
} else {
try {
redis.del(target);
} catch (err) {
console.log("[apicache] error in redis.del(\"" + target + "\")");
}
}
// remove from global index
index.all = index.all.filter(doesntMatch(target));
// remove target from each group that it may exist in
Object.keys(index.groups).forEach(function (groupName) {
index.groups[groupName] = index.groups[groupName].filter(doesntMatch(target));
// delete group if now empty
if (!index.groups[groupName].length) {
delete index.groups[groupName];
}
});
} else {
debug("clearing entire index");
if (!redis) {
memCache.clear();
} else {
// clear redis keys one by one from internal index to prevent clearing non-apicache entries
index.all.forEach(function (key) {
clearTimeout(timers[key]);
delete timers[key];
try {
redis.del(key);
} catch (err) {
console.log("[apicache] error in redis.del(\"" + key + "\")");
}
});
}
this.resetIndex();
}
return this.getIndex();
};
function parseDuration(duration, defaultDuration) {
if (typeof duration === "number") {
return duration;
}
if (typeof duration === "string") {
let split = duration.match(/^([\d\.,]+)\s?(\w+)$/);
if (split.length === 3) {
let len = parseFloat(split[1]);
let unit = split[2].replace(/s$/i, "").toLowerCase();
if (unit === "m") {
unit = "ms";
}
return (len || 1) * (t[unit] || 0);
}
}
return defaultDuration;
}
this.getDuration = function (duration) {
return parseDuration(duration, globalOptions.defaultDuration);
};
/**
* Return cache performance statistics (hit rate). Suitable for putting into a route:
* <code>
* app.get('/api/cache/performance', (req, res) => {
* res.json(apicache.getPerformance())
* })
* </code>
*/
this.getPerformance = function () {
return performanceArray.map(function (p) {
return p.report();
});
};
this.getIndex = function (group) {
if (group) {
return index.groups[group];
} else {
return index;
}
};
this.middleware = function cache(strDuration, middlewareToggle, localOptions) {
let duration = instance.getDuration(strDuration);
let opt = {};
middlewareOptions.push({
options: opt,
});
let options = function (localOptions) {
if (localOptions) {
middlewareOptions.find(function (middleware) {
return middleware.options === opt;
}).localOptions = localOptions;
}
syncOptions();
return opt;
};
options(localOptions);
/**
* A Function for non tracking performance
*/
function NOOPCachePerformance() {
this.report = this.hit = this.miss = function () {}; // noop;
}
/**
* A function for tracking and reporting hit rate. These statistics are returned by the getPerformance() call above.
*/
function CachePerformance() {
/**
* Tracks the hit rate for the last 100 requests.
* If there have been fewer than 100 requests, the hit rate just considers the requests that have happened.
*/
this.hitsLast100 = new Uint8Array(100 / 4); // each hit is 2 bits
/**
* Tracks the hit rate for the last 1000 requests.
* If there have been fewer than 1000 requests, the hit rate just considers the requests that have happened.
*/
this.hitsLast1000 = new Uint8Array(1000 / 4); // each hit is 2 bits
/**
* Tracks the hit rate for the last 10000 requests.
* If there have been fewer than 10000 requests, the hit rate just considers the requests that have happened.
*/
this.hitsLast10000 = new Uint8Array(10000 / 4); // each hit is 2 bits
/**
* Tracks the hit rate for the last 100000 requests.
* If there have been fewer than 100000 requests, the hit rate just considers the requests that have happened.
*/
this.hitsLast100000 = new Uint8Array(100000 / 4); // each hit is 2 bits
/**
* The number of calls that have passed through the middleware since the server started.
*/
this.callCount = 0;
/**
* The total number of hits since the server started
*/
this.hitCount = 0;
/**
* The key from the last cache hit. This is useful in identifying which route these statistics apply to.
*/
this.lastCacheHit = null;
/**
* The key from the last cache miss. This is useful in identifying which route these statistics apply to.
*/
this.lastCacheMiss = null;
/**
* Return performance statistics
*/
this.report = function () {
return {
lastCacheHit: this.lastCacheHit,
lastCacheMiss: this.lastCacheMiss,
callCount: this.callCount,
hitCount: this.hitCount,
missCount: this.callCount - this.hitCount,
hitRate: this.callCount == 0 ? null : this.hitCount / this.callCount,
hitRateLast100: this.hitRate(this.hitsLast100),
hitRateLast1000: this.hitRate(this.hitsLast1000),
hitRateLast10000: this.hitRate(this.hitsLast10000),
hitRateLast100000: this.hitRate(this.hitsLast100000),
};
};
/**
* Computes a cache hit rate from an array of hits and misses.
* @param {Uint8Array} array An array representing hits and misses.
* @returns a number between 0 and 1, or null if the array has no hits or misses
*/
this.hitRate = function (array) {
let hits = 0;
let misses = 0;
for (let i = 0; i < array.length; i++) {
let n8 = array[i];
for (let j = 0; j < 4; j++) {
switch (n8 & 3) {
case 1:
hits++;
break;
case 2:
misses++;
break;
}
n8 >>= 2;
}
}
let total = hits + misses;
if (total == 0) {
return null;
}
return hits / total;
};
/**
* Record a hit or miss in the given array. It will be recorded at a position determined
* by the current value of the callCount variable.
* @param {Uint8Array} array An array representing hits and misses.
* @param {boolean} hit true for a hit, false for a miss
* Each element in the array is 8 bits, and encodes 4 hit/miss records.
* Each hit or miss is encoded as to bits as follows:
* 00 means no hit or miss has been recorded in these bits
* 01 encodes a hit
* 10 encodes a miss
*/
this.recordHitInArray = function (array, hit) {
let arrayIndex = ~~(this.callCount / 4) % array.length;
let bitOffset = (this.callCount % 4) * 2; // 2 bits per record, 4 records per uint8 array element
let clearMask = ~(3 << bitOffset);
let record = (hit ? 1 : 2) << bitOffset;
array[arrayIndex] = (array[arrayIndex] & clearMask) | record;
};
/**
* Records the hit or miss in the tracking arrays and increments the call count.
* @param {boolean} hit true records a hit, false records a miss
*/
this.recordHit = function (hit) {
this.recordHitInArray(this.hitsLast100, hit);
this.recordHitInArray(this.hitsLast1000, hit);
this.recordHitInArray(this.hitsLast10000, hit);
this.recordHitInArray(this.hitsLast100000, hit);
if (hit) {
this.hitCount++;
}
this.callCount++;
};
/**
* Records a hit event, setting lastCacheMiss to the given key
* @param {string} key The key that had the cache hit
*/
this.hit = function (key) {
this.recordHit(true);
this.lastCacheHit = key;
};
/**
* Records a miss event, setting lastCacheMiss to the given key
* @param {string} key The key that had the cache miss
*/
this.miss = function (key) {
this.recordHit(false);
this.lastCacheMiss = key;
};
}
let perf = globalOptions.trackPerformance ? new CachePerformance() : new NOOPCachePerformance();
performanceArray.push(perf);
let cache = function (req, res, next) {
function bypass() {
debug("bypass detected, skipping cache.");
return next();
}
// initial bypass chances
if (!opt.enabled) {
return bypass();
}
if (
req.headers["x-apicache-bypass"] ||
req.headers["x-apicache-force-fetch"] ||
(opt.respectCacheControl && req.headers["cache-control"] == "no-cache")
) {
return bypass();
}
// REMOVED IN 0.11.1 TO CORRECT MIDDLEWARE TOGGLE EXECUTE ORDER
// if (typeof middlewareToggle === 'function') {
// if (!middlewareToggle(req, res)) return bypass()
// } else if (middlewareToggle !== undefined && !middlewareToggle) {
// return bypass()
// }
// embed timer
req.apicacheTimer = new Date();
// In Express 4.x the url is ambigious based on where a router is mounted. originalUrl will give the full Url
let key = req.originalUrl || req.url;
// Remove querystring from key if jsonp option is enabled
if (opt.jsonp) {
key = url.parse(key).pathname;
}
// add appendKey (either custom function or response path)
if (typeof opt.appendKey === "function") {
key += "$$appendKey=" + opt.appendKey(req, res);
} else if (opt.appendKey.length > 0) {
let appendKey = req;
for (let i = 0; i < opt.appendKey.length; i++) {
appendKey = appendKey[opt.appendKey[i]];
}
key += "$$appendKey=" + appendKey;
}
// attempt cache hit
let redis = opt.redisClient;
let cached = !redis ? memCache.getValue(key) : null;
// send if cache hit from memory-cache
if (cached) {
let elapsed = new Date() - req.apicacheTimer;
debug("sending cached (memory-cache) version of", key, logDuration(elapsed));
perf.hit(key);
return sendCachedResponse(req, res, cached, middlewareToggle, next, duration);
}
// send if cache hit from redis
if (redis && redis.connected) {
try {
redis.hgetall(key, function (err, obj) {
if (!err && obj && obj.response) {
let elapsed = new Date() - req.apicacheTimer;
debug("sending cached (redis) version of", key, logDuration(elapsed));
perf.hit(key);
return sendCachedResponse(
req,
res,
JSON.parse(obj.response),
middlewareToggle,
next,
duration
);
} else {
perf.miss(key);
return makeResponseCacheable(
req,
res,
next,
key,
duration,
strDuration,
middlewareToggle
);
}
});
} catch (err) {
// bypass redis on error
perf.miss(key);
return makeResponseCacheable(req, res, next, key, duration, strDuration, middlewareToggle);
}
} else {
perf.miss(key);
return makeResponseCacheable(req, res, next, key, duration, strDuration, middlewareToggle);
}
};
cache.options = options;
return cache;
};
this.options = function (options) {
if (options) {
Object.assign(globalOptions, options);
syncOptions();
if ("defaultDuration" in options) {
// Convert the default duration to a number in milliseconds (if needed)
globalOptions.defaultDuration = parseDuration(globalOptions.defaultDuration, 3600000);
}
if (globalOptions.trackPerformance) {
debug("WARNING: using trackPerformance flag can cause high memory usage!");
}
return this;
} else {
return globalOptions;
}
};
this.resetIndex = function () {
index = {
all: [],
groups: {},
};
};
this.newInstance = function (config) {
let instance = new ApiCache();
if (config) {
instance.options(config);
}
return instance;
};
this.clone = function () {
return this.newInstance(this.options());
};
// initialize index
this.resetIndex();
}
module.exports = new ApiCache();

View File

@@ -1,14 +0,0 @@
const apicache = require("./apicache");
apicache.options({
headerBlacklist: [
"cache-control"
],
headers: {
// Disable client side cache, only server side cache.
// BUG! Not working for the second request
"cache-control": "no-cache",
},
});
module.exports = apicache;

View File

@@ -1,59 +0,0 @@
function MemoryCache() {
this.cache = {};
this.size = 0;
}
MemoryCache.prototype.add = function (key, value, time, timeoutCallback) {
let old = this.cache[key];
let instance = this;
let entry = {
value: value,
expire: time + Date.now(),
timeout: setTimeout(function () {
instance.delete(key);
return timeoutCallback && typeof timeoutCallback === "function" && timeoutCallback(value, key);
}, time)
};
this.cache[key] = entry;
this.size = Object.keys(this.cache).length;
return entry;
};
MemoryCache.prototype.delete = function (key) {
let entry = this.cache[key];
if (entry) {
clearTimeout(entry.timeout);
}
delete this.cache[key];
this.size = Object.keys(this.cache).length;
return null;
};
MemoryCache.prototype.get = function (key) {
let entry = this.cache[key];
return entry;
};
MemoryCache.prototype.getValue = function (key) {
let entry = this.get(key);
return entry && entry.value;
};
MemoryCache.prototype.clear = function () {
Object.keys(this.cache).forEach(function (key) {
this.delete(key);
}, this);
return true;
};
module.exports = MemoryCache;

View File

@@ -1,26 +0,0 @@
const NotificationProvider = require("./notification-provider");
const child_process = require("child_process");
class Apprise extends NotificationProvider {
name = "apprise";
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
let s = child_process.spawnSync("apprise", [ "-vv", "-b", msg, notification.appriseURL])
let output = (s.stdout) ? s.stdout.toString() : "ERROR: maybe apprise not found";
if (output) {
if (! output.includes("ERROR")) {
return "Sent Successfully";
}
throw new Error(output)
} else {
return "No output from apprise";
}
}
}
module.exports = Apprise;

View File

@@ -1,115 +0,0 @@
const NotificationProvider = require("./notification-provider");
const axios = require("axios");
const { DOWN, UP } = require("../../src/util");
class Discord extends NotificationProvider {
name = "discord";
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
let okMsg = "Sent Successfully. ";
try {
const discordDisplayName = notification.discordUsername || "Uptime Kuma";
// If heartbeatJSON is null, assume we're testing.
if (heartbeatJSON == null) {
let discordtestdata = {
username: discordDisplayName,
content: msg,
}
await axios.post(notification.discordWebhookUrl, discordtestdata)
return okMsg;
}
let url;
if (monitorJSON["type"] === "port") {
url = monitorJSON["hostname"];
if (monitorJSON["port"]) {
url += ":" + monitorJSON["port"];
}
} else {
url = monitorJSON["url"];
}
// If heartbeatJSON is not null, we go into the normal alerting loop.
if (heartbeatJSON["status"] == DOWN) {
let discorddowndata = {
username: discordDisplayName,
embeds: [{
title: "❌ Your service " + monitorJSON["name"] + " went down. ❌",
color: 16711680,
timestamp: heartbeatJSON["time"],
fields: [
{
name: "Service Name",
value: monitorJSON["name"],
},
{
name: "Service URL",
value: url,
},
{
name: "Time (UTC)",
value: heartbeatJSON["time"],
},
{
name: "Error",
value: heartbeatJSON["msg"],
},
],
}],
}
if (notification.discordPrefixMessage) {
discorddowndata.content = notification.discordPrefixMessage;
}
await axios.post(notification.discordWebhookUrl, discorddowndata)
return okMsg;
} else if (heartbeatJSON["status"] == UP) {
let discordupdata = {
username: discordDisplayName,
embeds: [{
title: "✅ Your service " + monitorJSON["name"] + " is up! ✅",
color: 65280,
timestamp: heartbeatJSON["time"],
fields: [
{
name: "Service Name",
value: monitorJSON["name"],
},
{
name: "Service URL",
value: url.startsWith("http") ? "[Visit Service](" + url + ")" : url,
},
{
name: "Time (UTC)",
value: heartbeatJSON["time"],
},
{
name: "Ping",
value: heartbeatJSON["ping"] + "ms",
},
],
}],
}
if (notification.discordPrefixMessage) {
discordupdata.content = notification.discordPrefixMessage;
}
await axios.post(notification.discordWebhookUrl, discordupdata)
return okMsg;
}
} catch (error) {
this.throwGeneralAxiosError(error)
}
}
}
module.exports = Discord;

View File

@@ -1,28 +0,0 @@
const NotificationProvider = require("./notification-provider");
const axios = require("axios");
class Gotify extends NotificationProvider {
name = "gotify";
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
let okMsg = "Sent Successfully. ";
try {
if (notification.gotifyserverurl && notification.gotifyserverurl.endsWith("/")) {
notification.gotifyserverurl = notification.gotifyserverurl.slice(0, -1);
}
await axios.post(`${notification.gotifyserverurl}/message?token=${notification.gotifyapplicationToken}`, {
"message": msg,
"priority": notification.gotifyPriority || 8,
"title": "Uptime-Kuma",
})
return okMsg;
} catch (error) {
this.throwGeneralAxiosError(error);
}
}
}
module.exports = Gotify;

View File

@@ -1,60 +0,0 @@
const NotificationProvider = require("./notification-provider");
const axios = require("axios");
const { DOWN, UP } = require("../../src/util");
class Line extends NotificationProvider {
name = "line";
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
let okMsg = "Sent Successfully. ";
try {
let lineAPIUrl = "https://api.line.me/v2/bot/message/push";
let config = {
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer " + notification.lineChannelAccessToken
}
};
if (heartbeatJSON == null) {
let testMessage = {
"to": notification.lineUserID,
"messages": [
{
"type": "text",
"text": "Test Successful!"
}
]
}
await axios.post(lineAPIUrl, testMessage, config)
} else if (heartbeatJSON["status"] == DOWN) {
let downMessage = {
"to": notification.lineUserID,
"messages": [
{
"type": "text",
"text": "UptimeKuma Alert: [🔴 Down]\n" + "Name: " + monitorJSON["name"] + " \n" + heartbeatJSON["msg"] + "\nTime (UTC): " + heartbeatJSON["time"]
}
]
}
await axios.post(lineAPIUrl, downMessage, config)
} else if (heartbeatJSON["status"] == UP) {
let upMessage = {
"to": notification.lineUserID,
"messages": [
{
"type": "text",
"text": "UptimeKuma Alert: [✅ Up]\n" + "Name: " + monitorJSON["name"] + " \n" + heartbeatJSON["msg"] + "\nTime (UTC): " + heartbeatJSON["time"]
}
]
}
await axios.post(lineAPIUrl, upMessage, config)
}
return okMsg;
} catch (error) {
this.throwGeneralAxiosError(error)
}
}
}
module.exports = Line;

View File

@@ -1,48 +0,0 @@
const NotificationProvider = require("./notification-provider");
const axios = require("axios");
const { DOWN, UP } = require("../../src/util");
class LunaSea extends NotificationProvider {
name = "lunasea";
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
let okMsg = "Sent Successfully. ";
let lunaseadevice = "https://notify.lunasea.app/v1/custom/device/" + notification.lunaseaDevice
try {
if (heartbeatJSON == null) {
let testdata = {
"title": "Uptime Kuma Alert",
"body": "Testing Successful.",
}
await axios.post(lunaseadevice, testdata)
return okMsg;
}
if (heartbeatJSON["status"] == DOWN) {
let downdata = {
"title": "UptimeKuma Alert: " + monitorJSON["name"],
"body": "[🔴 Down] " + heartbeatJSON["msg"] + "\nTime (UTC): " + heartbeatJSON["time"],
}
await axios.post(lunaseadevice, downdata)
return okMsg;
}
if (heartbeatJSON["status"] == UP) {
let updata = {
"title": "UptimeKuma Alert: " + monitorJSON["name"],
"body": "[✅ Up] " + heartbeatJSON["msg"] + "\nTime (UTC): " + heartbeatJSON["time"],
}
await axios.post(lunaseadevice, updata)
return okMsg;
}
} catch (error) {
this.throwGeneralAxiosError(error)
}
}
}
module.exports = LunaSea;

View File

@@ -1,123 +0,0 @@
const NotificationProvider = require("./notification-provider");
const axios = require("axios");
const { DOWN, UP } = require("../../src/util");
class Mattermost extends NotificationProvider {
name = "mattermost";
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
let okMsg = "Sent Successfully. ";
try {
const mattermostUserName = notification.mattermostusername || "Uptime Kuma";
// If heartbeatJSON is null, assume we're testing.
if (heartbeatJSON == null) {
let mattermostTestData = {
username: mattermostUserName,
text: msg,
}
await axios.post(notification.mattermostWebhookUrl, mattermostTestData)
return okMsg;
}
const mattermostChannel = notification.mattermostchannel;
const mattermostIconEmoji = notification.mattermosticonemo;
const mattermostIconUrl = notification.mattermosticonurl;
if (heartbeatJSON["status"] == DOWN) {
let mattermostdowndata = {
username: mattermostUserName,
text: "Uptime Kuma Alert",
channel: mattermostChannel,
icon_emoji: mattermostIconEmoji,
icon_url: mattermostIconUrl,
attachments: [
{
fallback:
"Your " +
monitorJSON["name"] +
" service went down.",
color: "#FF0000",
title:
"❌ " +
monitorJSON["name"] +
" service went down. ❌",
title_link: monitorJSON["url"],
fields: [
{
short: true,
title: "Service Name",
value: monitorJSON["name"],
},
{
short: true,
title: "Time (UTC)",
value: heartbeatJSON["time"],
},
{
short: false,
title: "Error",
value: heartbeatJSON["msg"],
},
],
},
],
};
await axios.post(
notification.mattermostWebhookUrl,
mattermostdowndata
);
return okMsg;
} else if (heartbeatJSON["status"] == UP) {
let mattermostupdata = {
username: mattermostUserName,
text: "Uptime Kuma Alert",
channel: mattermostChannel,
icon_emoji: mattermostIconEmoji,
icon_url: mattermostIconUrl,
attachments: [
{
fallback:
"Your " +
monitorJSON["name"] +
" service went up!",
color: "#32CD32",
title:
"✅ " +
monitorJSON["name"] +
" service went up! ✅",
title_link: monitorJSON["url"],
fields: [
{
short: true,
title: "Service Name",
value: monitorJSON["name"],
},
{
short: true,
title: "Time (UTC)",
value: heartbeatJSON["time"],
},
{
short: false,
title: "Ping",
value: heartbeatJSON["ping"] + "ms",
},
],
},
],
};
await axios.post(
notification.mattermostWebhookUrl,
mattermostupdata
);
return okMsg;
}
} catch (error) {
this.throwGeneralAxiosError(error);
}
}
}
module.exports = Mattermost;

View File

@@ -1,36 +0,0 @@
class NotificationProvider {
/**
* Notification Provider Name
* @type string
*/
name = undefined;
/**
* @param notification : BeanModel
* @param msg : string General Message
* @param monitorJSON : object Monitor details (For Up/Down only)
* @param heartbeatJSON : object Heartbeat details (For Up/Down only)
* @returns {Promise<string>} Return Successful Message
* Throw Error with fail msg
*/
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
throw new Error("Have to override Notification.send(...)");
}
throwGeneralAxiosError(error) {
let msg = "Error: " + error + " ";
if (error.response && error.response.data) {
if (typeof error.response.data === "string") {
msg += error.response.data;
} else {
msg += JSON.stringify(error.response.data)
}
}
throw new Error(msg)
}
}
module.exports = NotificationProvider;

View File

@@ -1,40 +0,0 @@
const NotificationProvider = require("./notification-provider");
const axios = require("axios");
class Octopush extends NotificationProvider {
name = "octopush";
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
let okMsg = "Sent Successfully. ";
try {
let config = {
headers: {
"api-key": notification.octopushAPIKey,
"api-login": notification.octopushLogin,
"cache-control": "no-cache"
}
};
let data = {
"recipients": [
{
"phone_number": notification.octopushPhoneNumber
}
],
//octopush not supporting non ascii char
"text": msg.replace(/[^\x00-\x7F]/g, ""),
"type": notification.octopushSMSType,
"purpose": "alert",
"sender": notification.octopushSenderName
};
await axios.post("https://api.octopush.com/v1/public/sms-campaign/send", data, config)
return okMsg;
} catch (error) {
this.throwGeneralAxiosError(error);
}
}
}
module.exports = Octopush;

Some files were not shown because too many files have changed in this diff Show More