Compare commits
716 Commits
attributes
...
7.0.2016
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
13b10ca874 | ||
|
|
d0738ad64d | ||
|
|
a21b9ca555 | ||
|
|
f0e2910bd5 | ||
|
|
8f84027813 | ||
|
|
970b6fbb92 | ||
|
|
c8db6f237f | ||
|
|
01477fd102 | ||
|
|
0bd173dd93 | ||
|
|
87b7bbad16 | ||
|
|
2524684b1f | ||
|
|
6cc00a1e5b | ||
|
|
c2285848cd | ||
|
|
506a89aeb3 | ||
|
|
7c0221e6b8 | ||
|
|
e9d8c5b2bc | ||
|
|
8e5fc32f4d | ||
|
|
2eaeec326f | ||
|
|
c5823308af | ||
|
|
f0e255eb24 | ||
|
|
bccd2fd5d2 | ||
|
|
534c798028 | ||
|
|
2a48b585a4 | ||
|
|
8de699cb94 | ||
|
|
03ffeba683 | ||
|
|
153d55b774 | ||
|
|
1b95dfa5ed | ||
|
|
d9451af991 | ||
|
|
da375dce63 | ||
|
|
d12e2f7622 | ||
|
|
d0e9120559 | ||
|
|
d35ae2f075 | ||
|
|
92076dad8b | ||
|
|
a1ded23b46 | ||
|
|
4d618e6d93 | ||
|
|
d3e461e0bd | ||
|
|
7a94f4fcbc | ||
|
|
2758b5273b | ||
|
|
79d18ab920 | ||
|
|
13dd7c2db5 | ||
|
|
2486cd93c0 | ||
|
|
980c82ce31 | ||
|
|
1f6a4dbf40 | ||
|
|
b14f518461 | ||
|
|
70d243aa7b | ||
|
|
3f3996b155 | ||
|
|
5b3915fc65 | ||
|
|
53d33eb0fb | ||
|
|
c2722cb66a | ||
|
|
2ccc7a8061 | ||
|
|
97244b5c2c | ||
|
|
90a0988e06 | ||
|
|
a3778b8ce6 | ||
|
|
79bac7fd3f | ||
|
|
112863a52b | ||
|
|
c1150c06e0 | ||
|
|
fcfb3f7e50 | ||
|
|
7c6c5ccac1 | ||
|
|
03ad9bf349 | ||
|
|
f95ab83ae2 | ||
|
|
a25951f330 | ||
|
|
5b0f450802 | ||
|
|
be2b32822b | ||
|
|
6ebc601121 | ||
|
|
14d049bd0f | ||
|
|
47b5f44796 | ||
|
|
ec8bb3d67b | ||
|
|
71abac2c3f | ||
|
|
21a227d67a | ||
|
|
df0783e4d4 | ||
|
|
a9a14b1253 | ||
|
|
dc13aacb13 | ||
|
|
7f7d4c7388 | ||
|
|
f6642d5582 | ||
|
|
e85f216b9e | ||
|
|
04289df987 | ||
|
|
5e0bb766d6 | ||
|
|
e23c979911 | ||
|
|
cf43a3fb4e | ||
|
|
5d809015ee | ||
|
|
6b30e9aa2f | ||
|
|
29c4a43968 | ||
|
|
3a29d7b703 | ||
|
|
a4cbe21683 | ||
|
|
113a42b17f | ||
|
|
4682467bde | ||
|
|
f7c2415b63 | ||
|
|
c243409a0e | ||
|
|
b89760ab1a | ||
|
|
3acb419667 | ||
|
|
12a98bcb5f | ||
|
|
bca41d7dbc | ||
|
|
1875d97d6f | ||
|
|
b49336a224 | ||
|
|
95ac77ac4e | ||
|
|
6ef91fd1b7 | ||
|
|
e0bcfd31bf | ||
|
|
4b5cc40542 | ||
|
|
44db5b57e5 | ||
|
|
382c71be93 | ||
|
|
445a8d3f35 | ||
|
|
356bacf9a0 | ||
|
|
5a84cc1b1d | ||
|
|
2e7ea183e6 | ||
|
|
f8eaeb52a1 | ||
|
|
b23aac7b21 | ||
|
|
1ca9ecede1 | ||
|
|
39d7b76e23 | ||
|
|
bcefa8ae3a | ||
|
|
3c022e30ea | ||
|
|
1401daab06 | ||
|
|
11fd2d3c65 | ||
|
|
210420d180 | ||
|
|
d8f9e64aa4 | ||
|
|
f57596391d | ||
|
|
8282669fbd | ||
|
|
f38d8ae452 | ||
|
|
7726bad4e2 | ||
|
|
a50510819b | ||
|
|
27e9ee9721 | ||
|
|
d43765645e | ||
|
|
0c73bd8292 | ||
|
|
ad1c6152a0 | ||
|
|
9b8b1a87fe | ||
|
|
58b17bd27b | ||
|
|
e6f348ed0d | ||
|
|
dbd8ebcb35 | ||
|
|
d5c58356fc | ||
|
|
aedbda27c4 | ||
|
|
2715d544e7 | ||
|
|
41f1470685 | ||
|
|
00670b46de | ||
|
|
40ec2b54ec | ||
|
|
06303618c8 | ||
|
|
e66ac04566 | ||
|
|
65b124ca22 | ||
|
|
25ee0404ee | ||
|
|
0334117a40 | ||
|
|
5d3d19d210 | ||
|
|
ad4c29b74a | ||
|
|
74ad8fc725 | ||
|
|
fd5e7272de | ||
|
|
730d01a73f | ||
|
|
7f23c0e5a9 | ||
|
|
e2671832e8 | ||
|
|
0e7f96856c | ||
|
|
59fff01663 | ||
|
|
e8c6c3c0a7 | ||
|
|
3d00471677 | ||
|
|
692ebdb006 | ||
|
|
37ee7b25f2 | ||
|
|
2bca4963a0 | ||
|
|
efded8947f | ||
|
|
d663b0c65f | ||
|
|
9f354383f7 | ||
|
|
73be1fa956 | ||
|
|
07b10cfdf7 | ||
|
|
630f6767ab | ||
|
|
4d1c007d68 | ||
|
|
3b85e4fe99 | ||
|
|
35daff14d9 | ||
|
|
73f3ef7622 | ||
|
|
f11f1c23c5 | ||
|
|
c52501ef0e | ||
|
|
78e9ad439c | ||
|
|
e35dba93ce | ||
|
|
1991977af1 | ||
|
|
acf35e1c4c | ||
|
|
36f290edf0 | ||
|
|
1ad1aebc1b | ||
|
|
e11b781fc5 | ||
|
|
bc1ca32991 | ||
|
|
b668281ad6 | ||
|
|
2cbabe7a67 | ||
|
|
03e1545ebd | ||
|
|
2a16389a37 | ||
|
|
32a10892a4 | ||
|
|
39f0e66b35 | ||
|
|
ed7e70aa8d | ||
|
|
d1697c37df | ||
|
|
0c2774214a | ||
|
|
9bc98e0a35 | ||
|
|
20dff66769 | ||
|
|
6ac98d2531 | ||
|
|
586cbdb424 | ||
|
|
689de266a1 | ||
|
|
0015906bac | ||
|
|
5070d8137a | ||
|
|
d4d8848124 | ||
|
|
abcde37960 | ||
|
|
1fbdc19645 | ||
|
|
c17740b315 | ||
|
|
1568f5ef94 | ||
|
|
c4d7f345e2 | ||
|
|
ec0c1b102f | ||
|
|
72559f146d | ||
|
|
37829e3ef6 | ||
|
|
389397d31b | ||
|
|
6d68154855 | ||
|
|
9d50cbb889 | ||
|
|
b6932d07ac | ||
|
|
d8b1ed9516 | ||
|
|
8a0b94a18f | ||
|
|
a03524496d | ||
|
|
ebc9835374 | ||
|
|
9bfcc4f0c8 | ||
|
|
7ed0d55479 | ||
|
|
74b57c6d83 | ||
|
|
34697dd8ca | ||
|
|
c390a88866 | ||
|
|
8a5984faad | ||
|
|
80f2e12a1f | ||
|
|
5f3d208557 | ||
|
|
b2492db82a | ||
|
|
6a6fa1876d | ||
|
|
57db166e8a | ||
|
|
afdc891942 | ||
|
|
37a13ce853 | ||
|
|
8ebcb1b659 | ||
|
|
0e2e440a90 | ||
|
|
fa06d208dc | ||
|
|
69cac18ca7 | ||
|
|
40ba8bd2de | ||
|
|
a89e7db46e | ||
|
|
1f8c0e6b71 | ||
|
|
d547660284 | ||
|
|
d99f5310e7 | ||
|
|
fcc9231d1e | ||
|
|
68ea2c4e9a | ||
|
|
dfaa31ba41 | ||
|
|
1e1fe04eb0 | ||
|
|
6612e44ae5 | ||
|
|
206f0199e9 | ||
|
|
90ceb9cfc6 | ||
|
|
f503a45f3b | ||
|
|
375afe288a | ||
|
|
0e0bd71ead | ||
|
|
e3017f1680 | ||
|
|
f5c9ba7e3d | ||
|
|
ab92f256a5 | ||
|
|
af1f3a3bae | ||
|
|
a30392730e | ||
|
|
eb6c3888ad | ||
|
|
e22d39eea2 | ||
|
|
1d93fdf73b | ||
|
|
641c8de84b | ||
|
|
2fb509b98c | ||
|
|
39c7f6f2ba | ||
|
|
3f5f16cb74 | ||
|
|
038684e512 | ||
|
|
28f4f0f37c | ||
|
|
e793456980 | ||
|
|
bbff753799 | ||
|
|
5246f9f9cb | ||
|
|
fb35f23971 | ||
|
|
30db649f40 | ||
|
|
5088a14665 | ||
|
|
4f2302aa3c | ||
|
|
559c124294 | ||
|
|
b285caeea4 | ||
|
|
ed3e0e05c4 | ||
|
|
f61e44f1d7 | ||
|
|
c6e47ddc83 | ||
|
|
bc72200378 | ||
|
|
1b61d7a641 | ||
|
|
1ac7c646d5 | ||
|
|
fedb247972 | ||
|
|
4da6d9f492 | ||
|
|
899649d55e | ||
|
|
fac6e23b7e | ||
|
|
f7739ab4a8 | ||
|
|
f7c33cb799 | ||
|
|
466ebc8c41 | ||
|
|
676e2c654d | ||
|
|
ac0bafe560 | ||
|
|
5d90c2992f | ||
|
|
8e8019a9f8 | ||
|
|
267d9ccd0d | ||
|
|
8dabddd5ed | ||
|
|
c052cadc98 | ||
|
|
c893990722 | ||
|
|
1fbc80db8e | ||
|
|
1c3e184566 | ||
|
|
4335377285 | ||
|
|
4c27494b7a | ||
|
|
95f487c3d4 | ||
|
|
830393c74f | ||
|
|
393336ad60 | ||
|
|
8c8b323a14 | ||
|
|
85551a5608 | ||
|
|
ec5b1fc88d | ||
|
|
bab7f6331e | ||
|
|
592ff4efb7 | ||
|
|
3e0c5e8846 | ||
|
|
c9d5d92934 | ||
|
|
15739f99b5 | ||
|
|
8513d969db | ||
|
|
0def943102 | ||
|
|
da8fb1e032 | ||
|
|
48087e1ce4 | ||
|
|
56187ed256 | ||
|
|
80ff772e48 | ||
|
|
e82fffdc55 | ||
|
|
547beaf890 | ||
|
|
e2da673f53 | ||
|
|
32473b0d51 | ||
|
|
ed404dfdd1 | ||
|
|
57b99e2e99 | ||
|
|
34d7c9b152 | ||
|
|
87ad6dd73b | ||
|
|
c188d23e0c | ||
|
|
d7ecd18975 | ||
|
|
67d241bb5e | ||
|
|
a41bbb301a | ||
|
|
672f2ecd70 | ||
|
|
8428677714 | ||
|
|
efa0990250 | ||
|
|
c03d250a62 | ||
|
|
0c9cedafa1 | ||
|
|
39f0834cc2 | ||
|
|
151b8c2262 | ||
|
|
cdb9c0ee5a | ||
|
|
48427a341c | ||
|
|
7477aeca94 | ||
|
|
04415198fc | ||
|
|
d9cfd750a4 | ||
|
|
57e3b7ba9b | ||
|
|
95fc43f3a5 | ||
|
|
90689bfb1a | ||
|
|
c484a8484c | ||
|
|
0dbbbfda61 | ||
|
|
4278b1014c | ||
|
|
3954e7600c | ||
|
|
ea04be214f | ||
|
|
4bcd12b659 | ||
|
|
13de53166a | ||
|
|
b01e4ecbd7 | ||
|
|
61d6ca9a20 | ||
|
|
08c9fc9311 | ||
|
|
ac46ba74d0 | ||
|
|
a382a6f207 | ||
|
|
9dfb9f0dc6 | ||
|
|
7b98ccb590 | ||
|
|
0803f44407 | ||
|
|
36182cbe95 | ||
|
|
6e894d7b79 | ||
|
|
4bb0c36050 | ||
|
|
044347296c | ||
|
|
59ef638ad9 | ||
|
|
8a9902941d | ||
|
|
dd6a36df65 | ||
|
|
6c238e0e6b | ||
|
|
a61c496a78 | ||
|
|
8b2a819bd5 | ||
|
|
e3a28bf0e7 | ||
|
|
c149991884 | ||
|
|
544bb37581 | ||
|
|
5c1b8d420d | ||
|
|
d76eebceb0 | ||
|
|
993a01659b | ||
|
|
8e08dea7ec | ||
|
|
82e5977e15 | ||
|
|
53481a58eb | ||
|
|
faa225d275 | ||
|
|
263d659761 | ||
|
|
7f0535459e | ||
|
|
4901749ae6 | ||
|
|
bab36f9b86 | ||
|
|
2757bc01c7 | ||
|
|
d6affe3949 | ||
|
|
3304191b29 | ||
|
|
6a6b60afe8 | ||
|
|
400ebf994d | ||
|
|
328a5d49f4 | ||
|
|
52acb22acc | ||
|
|
08339a5247 | ||
|
|
f9bf1e45be | ||
|
|
ba59f77563 | ||
|
|
316fefbf53 | ||
|
|
ab9619ca40 | ||
|
|
735a476097 | ||
|
|
7538367b0a | ||
|
|
b73a11992c | ||
|
|
94412fb515 | ||
|
|
a3916be807 | ||
|
|
3576fdfbb5 | ||
|
|
14016d23d8 | ||
|
|
1056123d31 | ||
|
|
96a5f75731 | ||
|
|
18e8b7cb00 | ||
|
|
e64c9f6e4c | ||
|
|
5976fc22f5 | ||
|
|
750fe2867c | ||
|
|
5c89ed97e6 | ||
|
|
27090a346c | ||
|
|
d23aff2e73 | ||
|
|
f1852a95d0 | ||
|
|
6eb3b1f80d | ||
|
|
8dc65283d8 | ||
|
|
324572d37d | ||
|
|
aa764cdb14 | ||
|
|
0ca18bebd5 | ||
|
|
f742fcb3c4 | ||
|
|
0839cbe297 | ||
|
|
0914ae6bda | ||
|
|
e7dd5adb2a | ||
|
|
b85ec355f5 | ||
|
|
ec0dafb7a6 | ||
|
|
e8316078c8 | ||
|
|
0b1069f9a8 | ||
|
|
bd3959e844 | ||
|
|
bf8561a166 | ||
|
|
e92ee600c9 | ||
|
|
31fc399a5e | ||
|
|
1acfedeebb | ||
|
|
5895f515a0 | ||
|
|
2830293949 | ||
|
|
2d060e335d | ||
|
|
6b01d73903 | ||
|
|
10ebfda7d0 | ||
|
|
98c3581022 | ||
|
|
859aca85a7 | ||
|
|
b94402525e | ||
|
|
efbdc85ade | ||
|
|
efd8a0e79f | ||
|
|
6067babb9f | ||
|
|
4451b5343d | ||
|
|
6ebeef5397 | ||
|
|
56d2d348fb | ||
|
|
3a21e8df47 | ||
|
|
81ab8d135f | ||
|
|
f9c9b9addf | ||
|
|
b29a19c6e9 | ||
|
|
d1d1734183 | ||
|
|
decc09e3b9 | ||
|
|
1a3f8fca1a | ||
|
|
b5ff064a27 | ||
|
|
d91e944c2e | ||
|
|
98b8e89d71 | ||
|
|
b516a7a350 | ||
|
|
ebc1724093 | ||
|
|
0954336a69 | ||
|
|
8552556289 | ||
|
|
d329160fc0 | ||
|
|
d1af2e62bf | ||
|
|
a06e5035df | ||
|
|
b2a15ff460 | ||
|
|
eb53b5a81d | ||
|
|
363f7b81e8 | ||
|
|
4e55541026 | ||
|
|
deb0aaf35f | ||
|
|
fdcf8c66fa | ||
|
|
f9f9aa4433 | ||
|
|
5f50a11786 | ||
|
|
4648d5232a | ||
|
|
f282344c78 | ||
|
|
b12d6c713e | ||
|
|
6d6e7ce013 | ||
|
|
99aa76ea81 | ||
|
|
dbd2462958 | ||
|
|
1dbfea9051 | ||
|
|
aae6abd9d8 | ||
|
|
a15e91d4bf | ||
|
|
cb4b845caa | ||
|
|
3586895494 | ||
|
|
a20be2441e | ||
|
|
4efca8a758 | ||
|
|
4c49189315 | ||
|
|
74322a72e7 | ||
|
|
80c39d8e64 | ||
|
|
e7bbe30a88 | ||
|
|
9cf2ae4326 | ||
|
|
9b70dd2ce6 | ||
|
|
af06b616b3 | ||
|
|
4c8fb5db10 | ||
|
|
901ba63487 | ||
|
|
40a14275d2 | ||
|
|
45005c9473 | ||
|
|
1a4a2c7c93 | ||
|
|
a3a194a26a | ||
|
|
f4f9629350 | ||
|
|
98e1c3a41d | ||
|
|
6524b09b75 | ||
|
|
9a11bfbed7 | ||
|
|
0b75bced0d | ||
|
|
a4d5e089aa | ||
|
|
d15fa225f3 | ||
|
|
f12e2eebc5 | ||
|
|
5da16c2c09 | ||
|
|
6a4f9a09bd | ||
|
|
9f8632bf02 | ||
|
|
f5ddaea15c | ||
|
|
cfc0a64c23 | ||
|
|
2bddbbe2a9 | ||
|
|
972184b3f3 | ||
|
|
bde6c65538 | ||
|
|
b482a2fd6c | ||
|
|
ea7a234556 | ||
|
|
1c6ad0f67a | ||
|
|
cd53f7eb02 | ||
|
|
ae51ceeb62 | ||
|
|
7ec14d5104 | ||
|
|
5ae46e7bde | ||
|
|
999fa00e4f | ||
|
|
d767d58dde | ||
|
|
a7b14ea18a | ||
|
|
a01827fb6b | ||
|
|
b6c97b6e4f | ||
|
|
a169a0a5d3 | ||
|
|
1d595dd9d8 | ||
|
|
16a84a32f1 | ||
|
|
0c6cf62361 | ||
|
|
7bb87f58a2 | ||
|
|
7cb955e284 | ||
|
|
24c55f42a2 | ||
|
|
e1fce39fbc | ||
|
|
261299fc3a | ||
|
|
4b076a8000 | ||
|
|
633d60c0af | ||
|
|
a1e407ce15 | ||
|
|
e87e3b0724 | ||
|
|
2c3b238ef5 | ||
|
|
d8651ac951 | ||
|
|
04283133d9 | ||
|
|
d0dd20c314 | ||
|
|
a7d1ab5d71 | ||
|
|
d305c2b368 | ||
|
|
48c7fefe93 | ||
|
|
b8fcc4c40c | ||
|
|
e37271021a | ||
|
|
632ebe77e8 | ||
|
|
f296483088 | ||
|
|
7a83337391 | ||
|
|
e3c8cfd8eb | ||
|
|
6664284b37 | ||
|
|
aa2e2187f9 | ||
|
|
fa108743d4 | ||
|
|
eb2fb1c51e | ||
|
|
6a9a7bfd32 | ||
|
|
9a25f8ea00 | ||
|
|
2310ab0929 | ||
|
|
2e9cb1de23 | ||
|
|
23dc041541 | ||
|
|
16a945e142 | ||
|
|
befacef639 | ||
|
|
7c13b66c40 | ||
|
|
58c7860f9b | ||
|
|
01e5964207 | ||
|
|
d3957363c3 | ||
|
|
c255205f9c | ||
|
|
463f4c2e18 | ||
|
|
cc2e65445d | ||
|
|
78863b4700 | ||
|
|
7caf1cff35 | ||
|
|
a8cc459558 | ||
|
|
ea5fca175e | ||
|
|
af73638cb9 | ||
|
|
ad220634e5 | ||
|
|
15f3f9f6d3 | ||
|
|
0060965116 | ||
|
|
cf9bdb4eb1 | ||
|
|
aaa0a12bac | ||
|
|
5d37de0c71 | ||
|
|
f5c128fd6a | ||
|
|
075212aec8 | ||
|
|
261436e968 | ||
|
|
f4b92789e7 | ||
|
|
c76132fec0 | ||
|
|
d6d699f0b5 | ||
|
|
b1cc8098b4 | ||
|
|
e3d0ed4d48 | ||
|
|
b8da25e982 | ||
|
|
64e0d3e7fa | ||
|
|
e5dcc61f14 | ||
|
|
2be50afabc | ||
|
|
2a63edcc09 | ||
|
|
b6a331fed4 | ||
|
|
ee64fb75bc | ||
|
|
4a11a26d9e | ||
|
|
a0dd4c3847 | ||
|
|
8937839b2a | ||
|
|
0f45d050b5 | ||
|
|
4eac714258 | ||
|
|
f393a65ddc | ||
|
|
d069a141b8 | ||
|
|
59b2839067 | ||
|
|
17483bc03e | ||
|
|
4e99b45c2e | ||
|
|
d4963d3966 | ||
|
|
12bd7c995a | ||
|
|
011c91b863 | ||
|
|
5c2c40aa38 | ||
|
|
90c7f9abbf | ||
|
|
2c63122985 | ||
|
|
9856ee8557 | ||
|
|
1cb0e281ab | ||
|
|
65f01802e4 | ||
|
|
ba47793317 | ||
|
|
c6edb20fd5 | ||
|
|
be23196ad0 | ||
|
|
fab0c18b1f | ||
|
|
424f1ac9c4 | ||
|
|
92e3164071 | ||
|
|
a2ad789f5a | ||
|
|
49a2cbd579 | ||
|
|
6c08d12f4c | ||
|
|
024992c831 | ||
|
|
2aa1289705 | ||
|
|
706078e56c | ||
|
|
3353860e16 | ||
|
|
96729e6d69 | ||
|
|
cb9b763f96 | ||
|
|
8ee2d53d1a | ||
|
|
d82c54521d | ||
|
|
6446c06215 | ||
|
|
f03f4c67eb | ||
|
|
b1ab64ad83 | ||
|
|
a982fff251 | ||
|
|
fcfe8c5ba8 | ||
|
|
15f5cd540c | ||
|
|
47cfb3b165 | ||
|
|
66b1d10282 | ||
|
|
7a56f88fc0 | ||
|
|
d9569a1993 | ||
|
|
7fd912b83a | ||
|
|
80aeaf6987 | ||
|
|
05c7796f77 | ||
|
|
a75eb5821e | ||
|
|
6981cd0c85 | ||
|
|
c855540b15 | ||
|
|
38be8badc0 | ||
|
|
ab1932f499 | ||
|
|
5460dcc86f | ||
|
|
75f22b4bee | ||
|
|
6fbb5948fb | ||
|
|
8879a6763a | ||
|
|
6ed56361f4 | ||
|
|
01abbf570c | ||
|
|
44d5ca9aa6 | ||
|
|
6515de9536 | ||
|
|
439a38fbf2 | ||
|
|
eccefe30df | ||
|
|
3ad5955f89 | ||
|
|
cbca931460 | ||
|
|
e4b6daf9d8 | ||
|
|
9224748eff | ||
|
|
1cbd6fa403 | ||
|
|
da577b4906 | ||
|
|
5a1acbce2e | ||
|
|
4d5a2b24c1 | ||
|
|
b912a71df0 | ||
|
|
58332e519e | ||
|
|
2bdc0b60f9 | ||
|
|
429435cbe9 | ||
|
|
e423779da3 | ||
|
|
b44d1b94e9 | ||
|
|
6b33fb1260 | ||
|
|
b581981815 | ||
|
|
9c9195e4c1 | ||
|
|
e876e01234 | ||
|
|
b3236c046f | ||
|
|
dc15725194 | ||
|
|
407b8a4b8e | ||
|
|
9384385f66 | ||
|
|
2165db9d1f | ||
|
|
3d294af5ac | ||
|
|
d131ae2494 | ||
|
|
190be32d9c | ||
|
|
1075d70cd9 | ||
|
|
54776576a7 | ||
|
|
38006459cf | ||
|
|
30c1932ca1 | ||
|
|
54b6eb8b74 | ||
|
|
684eec0a9e | ||
|
|
cd4b9afe3e | ||
|
|
76c0ed7323 | ||
|
|
c3c7549df7 | ||
|
|
31d1850148 | ||
|
|
708280aaf9 | ||
|
|
d2ff892569 | ||
|
|
8325ba5c08 | ||
|
|
e84da1cf86 | ||
|
|
95ab4ab682 | ||
|
|
76ee8ba13e | ||
|
|
2945cb497a | ||
|
|
62444f12dc | ||
|
|
df04029668 | ||
|
|
1e637a4546 | ||
|
|
0bb9a493a7 | ||
|
|
295fa606c5 | ||
|
|
332e3b0018 | ||
|
|
084ea8baad | ||
|
|
20f718d6d9 | ||
|
|
25517d505a | ||
|
|
975c175920 | ||
|
|
18f8f787d2 | ||
|
|
56f22fea18 | ||
|
|
14b336e927 | ||
|
|
9b1470ee8a | ||
|
|
6f65c777a8 | ||
|
|
5fc3acc0ee | ||
|
|
a01616fe58 | ||
|
|
99f43bfb18 | ||
|
|
3f05c6dcc4 | ||
|
|
f5017e8c65 | ||
|
|
18af825228 | ||
|
|
3f7c2ebb43 | ||
|
|
c9406b551f | ||
|
|
27f44e9187 | ||
|
|
9cc47cd3a5 | ||
|
|
cd554565e9 | ||
|
|
f17c6aeed9 | ||
|
|
85cc4318c5 | ||
|
|
86466a503f | ||
|
|
b3eaf4aead | ||
|
|
41abb4f174 |
@@ -1,4 +1,4 @@
|
||||
name: Docker Build
|
||||
name: Build
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
@@ -25,6 +25,21 @@ jobs:
|
||||
- name: build docker image
|
||||
run: sudo docker build -f ./Accounts/Dockerfile .
|
||||
|
||||
docker-build-isolated-vm:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
CI_PIPELINE_ID: ${{github.run_number}}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Preinstall
|
||||
run: npm run prerun
|
||||
|
||||
# build image for accounts service
|
||||
- name: build docker image
|
||||
run: sudo docker build -f ./IsolatedVM/Dockerfile .
|
||||
|
||||
|
||||
docker-build-otel-collector:
|
||||
runs-on: ubuntu-latest
|
||||
@@ -148,6 +163,20 @@ jobs:
|
||||
- name: build docker image
|
||||
run: sudo docker build -f ./StatusPage/Dockerfile .
|
||||
|
||||
docker-build-infrastructure-agent:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
CI_PIPELINE_ID: ${{github.run_number}}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Preinstall
|
||||
run: npm run prerun
|
||||
|
||||
# build image for mail service
|
||||
- name: build docker image
|
||||
run: sudo docker build -f ./InfrastructureAgent/Dockerfile .
|
||||
|
||||
docker-build-test-server:
|
||||
runs-on: ubuntu-latest
|
||||
@@ -162,4 +191,4 @@ jobs:
|
||||
|
||||
# build image for mail service
|
||||
- name: build docker image
|
||||
run: sudo docker build -f ./TestServer/Dockerfile .
|
||||
run: sudo docker build -f ./TestServer/Dockerfile .
|
||||
42
.github/workflows/compile.yml
vendored
@@ -25,6 +25,19 @@ jobs:
|
||||
- run: cd CommonUI && npm install --force
|
||||
- run: cd Accounts && npm install && npm run compile && npm run dep-check
|
||||
|
||||
compile-isolated-vm:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
CI_PIPELINE_ID: ${{github.run_number}}
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: 18.3.0
|
||||
- run: cd Common && npm install
|
||||
- run: cd CommonServer && npm install
|
||||
- run: cd IsolatedVM && npm install && npm run compile && npm run dep-check
|
||||
|
||||
compile-common-server:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
@@ -77,6 +90,35 @@ jobs:
|
||||
- run: cd CommonServer && npm install
|
||||
- run: cd CommonUI && npm install --force
|
||||
- run: cd App && npm install && npm run compile && npm run dep-check
|
||||
|
||||
compile-nginx:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
CI_PIPELINE_ID: ${{github.run_number}}
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: 18.3.0
|
||||
- run: cd Common && npm install
|
||||
- run: cd Model && npm install
|
||||
- run: cd CommonServer && npm install
|
||||
- run: cd CommonUI && npm install --force
|
||||
- run: cd Nginx && npm install && npm run compile && npm run dep-check
|
||||
|
||||
compile-infrastructure-agent:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
CI_PIPELINE_ID: ${{github.run_number}}
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: 18.3.0
|
||||
- run: cd Common && npm install
|
||||
- run: cd Model && npm install
|
||||
- run: cd CommonServer && npm install
|
||||
- run: cd InfrastructureAgent && npm install && npm run compile && npm run dep-check
|
||||
|
||||
|
||||
compile-admin-dashboard:
|
||||
|
||||
171
.github/workflows/release.yml
vendored
@@ -31,7 +31,11 @@ jobs:
|
||||
- run: echo "${{needs.generate-build-number.outputs.build_number}}"
|
||||
- name: "Build Changelog"
|
||||
id: build_changelog
|
||||
uses: mikepenz/release-changelog-builder-action@v3.7.1
|
||||
uses: mikepenz/release-changelog-builder-action@v4.2.0
|
||||
with:
|
||||
configuration: "./Scripts/Release/ChangelogConfig.json"
|
||||
- run: echo "Changelog:"
|
||||
- run: echo "${{steps.build_changelog.outputs.changelog}}"
|
||||
- uses: ncipollo/release-action@v1
|
||||
with:
|
||||
tag: "7.0.${{needs.generate-build-number.outputs.build_number}}"
|
||||
@@ -147,6 +151,66 @@ jobs:
|
||||
GIT_SHA=${{ github.sha }}
|
||||
APP_VERSION=7.0.${{needs.generate-build-number.outputs.build_number}}
|
||||
|
||||
isolated-vm-docker-image-deploy:
|
||||
needs: generate-build-number
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Docker Meta
|
||||
id: meta
|
||||
uses: docker/metadata-action@v4
|
||||
with:
|
||||
images: |
|
||||
oneuptime/isolated-vm
|
||||
ghcr.io/oneuptime/isolated-vm
|
||||
tags: |
|
||||
type=raw,value=release,enable=true
|
||||
type=semver,value=7.0.${{needs.generate-build-number.outputs.build_number}},pattern={{version}},enable=true
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ github.ref }}
|
||||
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: 18.3.0
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v2
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v2
|
||||
|
||||
- name: Generate Dockerfile from Dockerfile.tpl
|
||||
run: npm run prerun
|
||||
|
||||
# Build and deploy isolated-vm.
|
||||
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v2.2.0
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_PASSWORD }}
|
||||
|
||||
- name: Login to GitHub Container Registry
|
||||
uses: docker/login-action@v2.2.0
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.repository_owner }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Build and push
|
||||
uses: docker/build-push-action@v4
|
||||
with:
|
||||
file: ./IsolatedVM/Dockerfile
|
||||
context: .
|
||||
platforms: linux/amd64,linux/arm64
|
||||
push: true
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
build-args: |
|
||||
GIT_SHA=${{ github.sha }}
|
||||
APP_VERSION=7.0.${{needs.generate-build-number.outputs.build_number}}
|
||||
|
||||
test-server-docker-image-deploy:
|
||||
needs: generate-build-number
|
||||
runs-on: ubuntu-latest
|
||||
@@ -810,3 +874,108 @@ jobs:
|
||||
build-args: |
|
||||
GIT_SHA=${{ github.sha }}
|
||||
APP_VERSION=7.0.${{needs.generate-build-number.outputs.build_number}}
|
||||
|
||||
# We dont need any of this because we are using the npm package
|
||||
# infrastructure-agent-macos-binary-release:
|
||||
# runs-on: macos-latest
|
||||
# steps:
|
||||
# - uses: actions/checkout@v2
|
||||
# - uses: actions/setup-node@v2
|
||||
# with:
|
||||
# node-version: 21.6.2
|
||||
# - run: cd InfrastructureAgent && bash Scripts/Build/Mac.sh
|
||||
|
||||
# We dont need any of this because we are using the npm package
|
||||
# infrastructure-agent-windows-binary-release:
|
||||
# runs-on: windows-latest
|
||||
# steps:
|
||||
# - uses: actions/checkout@v2
|
||||
# - uses: actions/setup-node@v2
|
||||
# with:
|
||||
# node-version: 21.6.2
|
||||
# - run: cd InfrastructureAgent && ./Scripts/Build/Windows.ps1
|
||||
|
||||
# We dont need any of this because we are using the npm package
|
||||
# infrastructure-agent-linux-binary-release:
|
||||
# runs-on: ubuntu-latest
|
||||
# steps:
|
||||
# - uses: actions/checkout@v2
|
||||
# - uses: actions/setup-node@v2
|
||||
# with:
|
||||
# node-version: 21.6.2
|
||||
# - run: cd InfrastructureAgent && bash ./Scripts/Build/Linux.sh
|
||||
|
||||
publish-npm-packages:
|
||||
runs-on: ubuntu-latest
|
||||
needs: generate-build-number
|
||||
env:
|
||||
CI_PIPELINE_ID: ${{github.run_number}}
|
||||
NPM_AUTH_TOKEN: ${{secrets.NPM_AUTH_TOKEN}}
|
||||
PACKAGE_VERSION: 7.0.${{needs.generate-build-number.outputs.build_number}}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
- name: Preinstall
|
||||
run: npm run prerun
|
||||
- name: Publish Infrastructure Agent
|
||||
run: bash ./Scripts/NPM/PublishAllPackages.sh
|
||||
|
||||
infrastructure-agent-docker-image-deploy:
|
||||
needs: generate-build-number
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Docker Meta
|
||||
id: meta
|
||||
uses: docker/metadata-action@v4
|
||||
with:
|
||||
images: |
|
||||
oneuptime/infrastructure-agent
|
||||
ghcr.io/oneuptime/infrastructure-agent
|
||||
tags: |
|
||||
type=raw,value=release,enable=true
|
||||
type=semver,value=7.0.${{needs.generate-build-number.outputs.build_number}},pattern={{version}},enable=true
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ github.ref }}
|
||||
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: 18.3.0
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v2
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v2
|
||||
|
||||
- name: Generate Dockerfile from Dockerfile.tpl
|
||||
run: npm run prerun
|
||||
|
||||
# Build and deploy infrastructure-agent.
|
||||
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v2.2.0
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_PASSWORD }}
|
||||
|
||||
- name: Login to GitHub Container Registry
|
||||
uses: docker/login-action@v2.2.0
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.repository_owner }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Build and push
|
||||
uses: docker/build-push-action@v4
|
||||
with:
|
||||
file: ./InfrastructureAgent/Dockerfile
|
||||
context: .
|
||||
platforms: linux/amd64,linux/arm64
|
||||
push: true
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
build-args: |
|
||||
GIT_SHA=${{ github.sha }}
|
||||
APP_VERSION=7.0.${{needs.generate-build-number.outputs.build_number}}
|
||||
129
.github/workflows/test-release.yaml
vendored
@@ -202,6 +202,67 @@ jobs:
|
||||
GIT_SHA=${{ github.sha }}
|
||||
APP_VERSION=7.0.${{needs.generate-build-number.outputs.build_number}}
|
||||
|
||||
isolated-vm-docker-image-deploy:
|
||||
needs: generate-build-number
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Docker Meta
|
||||
id: meta
|
||||
uses: docker/metadata-action@v4
|
||||
with:
|
||||
images: |
|
||||
oneuptime/isolated-vm
|
||||
ghcr.io/oneuptime/isolated-vm
|
||||
tags: |
|
||||
type=raw,value=test,enable=true
|
||||
type=semver,value=7.0.${{needs.generate-build-number.outputs.build_number}}-test,pattern={{version}},enable=true
|
||||
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ github.ref }}
|
||||
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: 18.3.0
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v2
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v2
|
||||
|
||||
- name: Generate Dockerfile from Dockerfile.tpl
|
||||
run: npm run prerun
|
||||
|
||||
# Build and deploy isolated-vm.
|
||||
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v2.2.0
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_PASSWORD }}
|
||||
|
||||
- name: Login to GitHub Container Registry
|
||||
uses: docker/login-action@v2.2.0
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.repository_owner }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Build and push
|
||||
uses: docker/build-push-action@v4
|
||||
with:
|
||||
file: ./IsolatedVM/Dockerfile
|
||||
context: .
|
||||
platforms: linux/amd64,linux/arm64
|
||||
push: true
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
build-args: |
|
||||
GIT_SHA=${{ github.sha }}
|
||||
APP_VERSION=7.0.${{needs.generate-build-number.outputs.build_number}}
|
||||
|
||||
status-page-docker-image-deploy:
|
||||
needs: generate-build-number
|
||||
runs-on: ubuntu-latest
|
||||
@@ -753,9 +814,73 @@ jobs:
|
||||
GIT_SHA=${{ github.sha }}
|
||||
APP_VERSION=7.0.${{needs.generate-build-number.outputs.build_number}}
|
||||
|
||||
|
||||
infrastructure-agent-docker-image-deploy:
|
||||
needs: generate-build-number
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Docker Meta
|
||||
id: meta
|
||||
uses: docker/metadata-action@v4
|
||||
with:
|
||||
images: |
|
||||
oneuptime/infrastructure
|
||||
ghcr.io/oneuptime/infrastructure
|
||||
tags: |
|
||||
type=raw,value=test,enable=true
|
||||
type=semver,value=7.0.${{needs.generate-build-number.outputs.build_number}}-test,pattern={{version}},enable=true
|
||||
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ github.ref }}
|
||||
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: 18.3.0
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v2
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v2
|
||||
|
||||
- name: Generate Dockerfile from Dockerfile.tpl
|
||||
run: npm run prerun
|
||||
|
||||
# Build and deploy infrastructure.
|
||||
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v2.2.0
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_PASSWORD }}
|
||||
|
||||
- name: Login to GitHub Container Registry
|
||||
uses: docker/login-action@v2.2.0
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.repository_owner }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Build and push
|
||||
uses: docker/build-push-action@v4
|
||||
with:
|
||||
file: ./InfrastructureAgent/Dockerfile
|
||||
context: .
|
||||
platforms: linux/amd64,linux/arm64
|
||||
push: true
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
build-args: |
|
||||
GIT_SHA=${{ github.sha }}
|
||||
APP_VERSION=7.0.${{needs.generate-build-number.outputs.build_number}}
|
||||
|
||||
|
||||
|
||||
test-helm-chart:
|
||||
runs-on: ubuntu-latest
|
||||
needs: [test-server-docker-image-deploy, test-docker-image-deploy, ingestor-docker-image-deploy, probe-docker-image-deploy, haraka-docker-image-deploy, dashboard-docker-image-deploy, admin-dashboard-docker-image-deploy, app-docker-image-deploy, accounts-docker-image-deploy, otel-collector-docker-image-deploy, status-page-docker-image-deploy, nginx-docker-image-deploy]
|
||||
needs: [ infrastructure-agent-docker-image-deploy, isolated-vm-docker-image-deploy, test-server-docker-image-deploy, test-docker-image-deploy, ingestor-docker-image-deploy, probe-docker-image-deploy, haraka-docker-image-deploy, dashboard-docker-image-deploy, admin-dashboard-docker-image-deploy, app-docker-image-deploy, accounts-docker-image-deploy, otel-collector-docker-image-deploy, status-page-docker-image-deploy, nginx-docker-image-deploy]
|
||||
env:
|
||||
CI_PIPELINE_ID: ${{github.run_number}}
|
||||
steps:
|
||||
@@ -763,4 +888,4 @@ jobs:
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: 18.3.0
|
||||
- run: cd HelmChart && cd Tests && bash index.sh
|
||||
- run: cd HelmChart && cd Tests && bash index.sh
|
||||
|
||||
2
.github/workflows/test.probe.yaml
vendored
@@ -9,7 +9,7 @@ on:
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: self-hosted # this needs to be self-hosted because ICMP checks are disbled in hosted runners
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
CI_PIPELINE_ID: ${{github.run_number}}
|
||||
steps:
|
||||
|
||||
11
.gitignore
vendored
@@ -98,4 +98,13 @@ Llama/Models/llama*
|
||||
|
||||
Llama/__pycache__/*
|
||||
|
||||
Examples/otel-dotnet/obj/*
|
||||
Examples/otel-dotnet/obj/*
|
||||
|
||||
InfrastructureAgent/sea-prep.blob
|
||||
InfrastructureAgent/InfrastructureAgent
|
||||
InfrastructureAgent/build/*
|
||||
|
||||
|
||||
InfrastructureAgent/err.log
|
||||
InfrastructureAgent/out.log
|
||||
InfrastructureAgent/daemon.pid
|
||||
42
.vscode/launch.json
vendored
@@ -83,6 +83,20 @@
|
||||
"restart": true,
|
||||
"autoAttachChildProcesses": true
|
||||
},
|
||||
{
|
||||
"address": "127.0.0.1",
|
||||
"localRoot": "${workspaceFolder}/IsolatedVM",
|
||||
"name": "Isolated VM: Debug with Docker",
|
||||
"port": 9974,
|
||||
"remoteRoot": "/usr/src/app",
|
||||
"request": "attach",
|
||||
"skipFiles": [
|
||||
"<node_internals>/**"
|
||||
],
|
||||
"type": "node",
|
||||
"restart": true,
|
||||
"autoAttachChildProcesses": true
|
||||
},
|
||||
{
|
||||
"address": "127.0.0.1",
|
||||
"localRoot": "${workspaceFolder}/Workflow",
|
||||
@@ -139,34 +153,6 @@
|
||||
"restart": true,
|
||||
"autoAttachChildProcesses": true
|
||||
},
|
||||
{
|
||||
"address": "127.0.0.1",
|
||||
"localRoot": "${workspaceFolder}/Ingestor",
|
||||
"name": "Probe API: Debug with Docker",
|
||||
"port": 9251,
|
||||
"remoteRoot": "/usr/src/app",
|
||||
"request": "attach",
|
||||
"skipFiles": [
|
||||
"<node_internals>/**"
|
||||
],
|
||||
"type": "node",
|
||||
"restart": true,
|
||||
"autoAttachChildProcesses": true
|
||||
},
|
||||
{
|
||||
"address": "127.0.0.1",
|
||||
"localRoot": "${workspaceFolder}/Identity",
|
||||
"name": "File: Debug with Docker",
|
||||
"port": 9012,
|
||||
"remoteRoot": "/usr/src/app",
|
||||
"request": "attach",
|
||||
"skipFiles": [
|
||||
"<node_internals>/**"
|
||||
],
|
||||
"type": "node",
|
||||
"restart": true,
|
||||
"autoAttachChildProcesses": true
|
||||
},
|
||||
{
|
||||
"address": "127.0.0.1",
|
||||
"localRoot": "${workspaceFolder}/HttpTestServer",
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
#
|
||||
|
||||
# Pull base image nodejs image.
|
||||
FROM node:21.6-alpine3.18
|
||||
FROM node:21.7.2-alpine3.18
|
||||
RUN mkdir /tmp/npm && chmod 2777 /tmp/npm && chown 1000:1000 /tmp/npm && npm config set cache /tmp/npm --global
|
||||
|
||||
|
||||
@@ -14,6 +14,10 @@ ENV GIT_SHA=${GIT_SHA}
|
||||
ENV APP_VERSION=${APP_VERSION}
|
||||
|
||||
|
||||
# IF APP_VERSION is not set, set it to 1.0.0
|
||||
RUN if [ -z "$APP_VERSION" ]; then export APP_VERSION=1.0.0; fi
|
||||
|
||||
|
||||
# Install bash.
|
||||
RUN apk add bash && apk add curl
|
||||
|
||||
@@ -25,6 +29,8 @@ RUN mkdir /usr/src
|
||||
|
||||
WORKDIR /usr/src/Common
|
||||
COPY ./Common/package*.json /usr/src/Common/
|
||||
# Set version in ./Common/package.json to the APP_VERSION
|
||||
RUN sed -i "s/\"version\": \".*\"/\"version\": \"$APP_VERSION\"/g" /usr/src/Common/package.json
|
||||
RUN npm install
|
||||
COPY ./Common /usr/src/Common
|
||||
|
||||
@@ -32,6 +38,8 @@ COPY ./Common /usr/src/Common
|
||||
|
||||
WORKDIR /usr/src/Model
|
||||
COPY ./Model/package*.json /usr/src/Model/
|
||||
# Set version in ./Model/package.json to the APP_VERSION
|
||||
RUN sed -i "s/\"version\": \".*\"/\"version\": \"$APP_VERSION\"/g" /usr/src/Model/package.json
|
||||
RUN npm install
|
||||
COPY ./Model /usr/src/Model
|
||||
|
||||
@@ -39,6 +47,8 @@ COPY ./Model /usr/src/Model
|
||||
|
||||
WORKDIR /usr/src/CommonServer
|
||||
COPY ./CommonServer/package*.json /usr/src/CommonServer/
|
||||
# Set version in ./CommonServer/package.json to the APP_VERSION
|
||||
RUN sed -i "s/\"version\": \".*\"/\"version\": \"$APP_VERSION\"/g" /usr/src/CommonServer/package.json
|
||||
RUN npm install
|
||||
COPY ./CommonServer /usr/src/CommonServer
|
||||
|
||||
@@ -49,6 +59,8 @@ COPY ./CommonServer /usr/src/CommonServer
|
||||
|
||||
WORKDIR /usr/src/CommonUI
|
||||
COPY ./CommonUI/package*.json /usr/src/CommonUI/
|
||||
# Set version in ./CommonUI/package.json to the APP_VERSION
|
||||
RUN sed -i "s/\"version\": \".*\"/\"version\": \"$APP_VERSION\"/g" /usr/src/CommonUI/package.json
|
||||
RUN npm install --force
|
||||
COPY ./CommonUI /usr/src/CommonUI
|
||||
|
||||
|
||||
183
Accounts/package-lock.json
generated
@@ -1,24 +1,24 @@
|
||||
{
|
||||
"name": "accounts",
|
||||
"name": "@oneuptime/accounts",
|
||||
"version": "0.1.0",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "accounts",
|
||||
"name": "@oneuptime/accounts",
|
||||
"version": "0.1.0",
|
||||
"dependencies": {
|
||||
"Common": "file:../Common",
|
||||
"CommonServer": "file:../CommonServer",
|
||||
"CommonUI": "file:../CommonUI",
|
||||
"css-loader": "^6.10.0",
|
||||
"dotenv": "^16.4.1",
|
||||
"express": "^4.18.2",
|
||||
"dotenv": "^16.4.5",
|
||||
"express": "^4.19.2",
|
||||
"file-loader": "^6.2.0",
|
||||
"Model": "file:../Model",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.1.0",
|
||||
"react-router-dom": "^6.21.3",
|
||||
"react-router-dom": "^6.22.2",
|
||||
"sass-loader": "^13.3.3",
|
||||
"style-loader": "^3.3.4",
|
||||
"ts-loader": "^9.5.1",
|
||||
@@ -265,9 +265,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@remix-run/router": {
|
||||
"version": "1.14.2",
|
||||
"resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.14.2.tgz",
|
||||
"integrity": "sha512-ACXpdMM9hmKZww21yEqWwiLws/UPLhNKvimN8RrYSqPSvB3ov7sLvAcfvaxePeLvccTQKGdkDIhLYApZVDFuKg==",
|
||||
"version": "1.15.2",
|
||||
"resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.2.tgz",
|
||||
"integrity": "sha512-+Rnav+CaoTE5QJc4Jcwh5toUpnVLKYbpU6Ys0zqbakqbaLQHeglLVHPfxOiQqdNmUy5C2lXz5dwC6tQNX2JW2Q==",
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
}
|
||||
@@ -660,12 +660,12 @@
|
||||
}
|
||||
},
|
||||
"node_modules/body-parser": {
|
||||
"version": "1.20.1",
|
||||
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
|
||||
"integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
|
||||
"version": "1.20.2",
|
||||
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
|
||||
"integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
|
||||
"dependencies": {
|
||||
"bytes": "3.1.2",
|
||||
"content-type": "~1.0.4",
|
||||
"content-type": "~1.0.5",
|
||||
"debug": "2.6.9",
|
||||
"depd": "2.0.0",
|
||||
"destroy": "1.2.0",
|
||||
@@ -673,7 +673,7 @@
|
||||
"iconv-lite": "0.4.24",
|
||||
"on-finished": "2.4.1",
|
||||
"qs": "6.11.0",
|
||||
"raw-body": "2.5.1",
|
||||
"raw-body": "2.5.2",
|
||||
"type-is": "~1.6.18",
|
||||
"unpipe": "1.0.0"
|
||||
},
|
||||
@@ -761,13 +761,18 @@
|
||||
}
|
||||
},
|
||||
"node_modules/call-bind": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz",
|
||||
"integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==",
|
||||
"version": "1.0.7",
|
||||
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
|
||||
"integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
|
||||
"dependencies": {
|
||||
"es-define-property": "^1.0.0",
|
||||
"es-errors": "^1.3.0",
|
||||
"function-bind": "^1.1.2",
|
||||
"get-intrinsic": "^1.2.1",
|
||||
"set-function-length": "^1.1.1"
|
||||
"get-intrinsic": "^1.2.4",
|
||||
"set-function-length": "^1.2.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
@@ -920,9 +925,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/cookie": {
|
||||
"version": "0.5.0",
|
||||
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
|
||||
"integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
|
||||
"version": "0.6.0",
|
||||
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
|
||||
"integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
@@ -999,16 +1004,19 @@
|
||||
}
|
||||
},
|
||||
"node_modules/define-data-property": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz",
|
||||
"integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==",
|
||||
"version": "1.1.4",
|
||||
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
|
||||
"integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
|
||||
"dependencies": {
|
||||
"get-intrinsic": "^1.2.1",
|
||||
"gopd": "^1.0.1",
|
||||
"has-property-descriptors": "^1.0.0"
|
||||
"es-define-property": "^1.0.0",
|
||||
"es-errors": "^1.3.0",
|
||||
"gopd": "^1.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/depd": {
|
||||
@@ -1038,14 +1046,14 @@
|
||||
}
|
||||
},
|
||||
"node_modules/dotenv": {
|
||||
"version": "16.4.1",
|
||||
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.1.tgz",
|
||||
"integrity": "sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==",
|
||||
"version": "16.4.5",
|
||||
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz",
|
||||
"integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==",
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/motdotla/dotenv?sponsor=1"
|
||||
"url": "https://dotenvx.com"
|
||||
}
|
||||
},
|
||||
"node_modules/ee-first": {
|
||||
@@ -1086,6 +1094,25 @@
|
||||
"node": ">=10.13.0"
|
||||
}
|
||||
},
|
||||
"node_modules/es-define-property": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
|
||||
"integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
|
||||
"dependencies": {
|
||||
"get-intrinsic": "^1.2.4"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/es-errors": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
|
||||
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/es-module-lexer": {
|
||||
"version": "1.4.1",
|
||||
"resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz",
|
||||
@@ -1160,16 +1187,16 @@
|
||||
}
|
||||
},
|
||||
"node_modules/express": {
|
||||
"version": "4.18.2",
|
||||
"resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
|
||||
"integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
|
||||
"version": "4.19.2",
|
||||
"resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz",
|
||||
"integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==",
|
||||
"dependencies": {
|
||||
"accepts": "~1.3.8",
|
||||
"array-flatten": "1.1.1",
|
||||
"body-parser": "1.20.1",
|
||||
"body-parser": "1.20.2",
|
||||
"content-disposition": "0.5.4",
|
||||
"content-type": "~1.0.4",
|
||||
"cookie": "0.5.0",
|
||||
"cookie": "0.6.0",
|
||||
"cookie-signature": "1.0.6",
|
||||
"debug": "2.6.9",
|
||||
"depd": "2.0.0",
|
||||
@@ -1322,15 +1349,19 @@
|
||||
}
|
||||
},
|
||||
"node_modules/get-intrinsic": {
|
||||
"version": "1.2.2",
|
||||
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz",
|
||||
"integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==",
|
||||
"version": "1.2.4",
|
||||
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
|
||||
"integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
|
||||
"dependencies": {
|
||||
"es-errors": "^1.3.0",
|
||||
"function-bind": "^1.1.2",
|
||||
"has-proto": "^1.0.1",
|
||||
"has-symbols": "^1.0.3",
|
||||
"hasown": "^2.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
@@ -1378,20 +1409,20 @@
|
||||
}
|
||||
},
|
||||
"node_modules/has-property-descriptors": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz",
|
||||
"integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
|
||||
"integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
|
||||
"dependencies": {
|
||||
"get-intrinsic": "^1.2.2"
|
||||
"es-define-property": "^1.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/has-proto": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
|
||||
"integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
|
||||
"integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
},
|
||||
@@ -1411,9 +1442,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/hasown": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
|
||||
"integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
|
||||
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
|
||||
"dependencies": {
|
||||
"function-bind": "^1.1.2"
|
||||
},
|
||||
@@ -2017,9 +2048,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/raw-body": {
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
|
||||
"integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
|
||||
"version": "2.5.2",
|
||||
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
|
||||
"integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
|
||||
"dependencies": {
|
||||
"bytes": "3.1.2",
|
||||
"http-errors": "2.0.0",
|
||||
@@ -2054,11 +2085,11 @@
|
||||
}
|
||||
},
|
||||
"node_modules/react-router": {
|
||||
"version": "6.21.3",
|
||||
"resolved": "https://registry.npmjs.org/react-router/-/react-router-6.21.3.tgz",
|
||||
"integrity": "sha512-a0H638ZXULv1OdkmiK6s6itNhoy33ywxmUFT/xtSoVyf9VnC7n7+VT4LjVzdIHSaF5TIh9ylUgxMXksHTgGrKg==",
|
||||
"version": "6.22.2",
|
||||
"resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.2.tgz",
|
||||
"integrity": "sha512-YD3Dzprzpcq+tBMHBS822tCjnWD3iIZbTeSXMY9LPSG541EfoBGyZ3bS25KEnaZjLcmQpw2AVLkFyfgXY8uvcw==",
|
||||
"dependencies": {
|
||||
"@remix-run/router": "1.14.2"
|
||||
"@remix-run/router": "1.15.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
@@ -2068,12 +2099,12 @@
|
||||
}
|
||||
},
|
||||
"node_modules/react-router-dom": {
|
||||
"version": "6.21.3",
|
||||
"resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.21.3.tgz",
|
||||
"integrity": "sha512-kNzubk7n4YHSrErzjLK72j0B5i969GsuCGazRl3G6j1zqZBLjuSlYBdVdkDOgzGdPIffUOc9nmgiadTEVoq91g==",
|
||||
"version": "6.22.2",
|
||||
"resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.2.tgz",
|
||||
"integrity": "sha512-WgqxD2qySEIBPZ3w0sHH+PUAiamDeszls9tzqMPBDA1YYVucTBXLU7+gtRfcSnhe92A3glPnvSxK2dhNoAVOIQ==",
|
||||
"dependencies": {
|
||||
"@remix-run/router": "1.14.2",
|
||||
"react-router": "6.21.3"
|
||||
"@remix-run/router": "1.15.2",
|
||||
"react-router": "6.22.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
@@ -2253,14 +2284,16 @@
|
||||
}
|
||||
},
|
||||
"node_modules/set-function-length": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz",
|
||||
"integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==",
|
||||
"version": "1.2.2",
|
||||
"resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
|
||||
"integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
|
||||
"dependencies": {
|
||||
"define-data-property": "^1.1.1",
|
||||
"get-intrinsic": "^1.2.1",
|
||||
"define-data-property": "^1.1.4",
|
||||
"es-errors": "^1.3.0",
|
||||
"function-bind": "^1.1.2",
|
||||
"get-intrinsic": "^1.2.4",
|
||||
"gopd": "^1.0.1",
|
||||
"has-property-descriptors": "^1.0.0"
|
||||
"has-property-descriptors": "^1.0.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
@@ -2272,13 +2305,17 @@
|
||||
"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
|
||||
},
|
||||
"node_modules/side-channel": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
|
||||
"integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
|
||||
"integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
|
||||
"dependencies": {
|
||||
"call-bind": "^1.0.0",
|
||||
"get-intrinsic": "^1.0.2",
|
||||
"object-inspect": "^1.9.0"
|
||||
"call-bind": "^1.0.7",
|
||||
"es-errors": "^1.3.0",
|
||||
"get-intrinsic": "^1.2.4",
|
||||
"object-inspect": "^1.13.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"name": "accounts",
|
||||
"name": "@oneuptime/accounts",
|
||||
"version": "0.1.0",
|
||||
"private": false,
|
||||
"scripts": {
|
||||
@@ -30,13 +30,13 @@
|
||||
"CommonServer": "file:../CommonServer",
|
||||
"CommonUI": "file:../CommonUI",
|
||||
"css-loader": "^6.10.0",
|
||||
"dotenv": "^16.4.1",
|
||||
"express": "^4.18.2",
|
||||
"dotenv": "^16.4.5",
|
||||
"express": "^4.19.2",
|
||||
"file-loader": "^6.2.0",
|
||||
"Model": "file:../Model",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.1.0",
|
||||
"react-router-dom": "^6.21.3",
|
||||
"react-router-dom": "^6.22.3",
|
||||
"sass-loader": "^13.3.3",
|
||||
"style-loader": "^3.3.4",
|
||||
"ts-loader": "^9.5.1",
|
||||
|
||||
@@ -3,7 +3,8 @@
|
||||
// these options are overrides used only by ts-node
|
||||
// same as the --compilerOptions flag and the TS_NODE_COMPILER_OPTIONS environment variable
|
||||
"compilerOptions": {
|
||||
"module": "commonjs"
|
||||
"module": "commonjs",
|
||||
"resolveJsonModule": true,
|
||||
}
|
||||
},
|
||||
"compilerOptions": {
|
||||
@@ -105,6 +106,7 @@
|
||||
|
||||
/* Completeness */
|
||||
// "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */
|
||||
"skipLibCheck": true /* Skip type checking all .d.ts files. */
|
||||
"skipLibCheck": true, /* Skip type checking all .d.ts files. */
|
||||
"resolveJsonModule": true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
#
|
||||
|
||||
# Pull base image nodejs image.
|
||||
FROM node:21.6-alpine3.18
|
||||
FROM node:21.7.2-alpine3.18
|
||||
RUN mkdir /tmp/npm && chmod 2777 /tmp/npm && chown 1000:1000 /tmp/npm && npm config set cache /tmp/npm --global
|
||||
|
||||
|
||||
@@ -14,6 +14,10 @@ ENV GIT_SHA=${GIT_SHA}
|
||||
ENV APP_VERSION=${APP_VERSION}
|
||||
|
||||
|
||||
# IF APP_VERSION is not set, set it to 1.0.0
|
||||
RUN if [ -z "$APP_VERSION" ]; then export APP_VERSION=1.0.0; fi
|
||||
|
||||
|
||||
# Install bash.
|
||||
RUN apk add bash && apk add curl
|
||||
|
||||
@@ -25,12 +29,16 @@ RUN mkdir /usr/src
|
||||
|
||||
WORKDIR /usr/src/Common
|
||||
COPY ./Common/package*.json /usr/src/Common/
|
||||
# Set version in ./Common/package.json to the APP_VERSION
|
||||
RUN sed -i "s/\"version\": \".*\"/\"version\": \"$APP_VERSION\"/g" /usr/src/Common/package.json
|
||||
RUN npm install
|
||||
COPY ./Common /usr/src/Common
|
||||
|
||||
|
||||
WORKDIR /usr/src/Model
|
||||
COPY ./Model/package*.json /usr/src/Model/
|
||||
# Set version in ./Model/package.json to the APP_VERSION
|
||||
RUN sed -i "s/\"version\": \".*\"/\"version\": \"$APP_VERSION\"/g" /usr/src/Model/package.json
|
||||
RUN npm install
|
||||
COPY ./Model /usr/src/Model
|
||||
|
||||
@@ -38,6 +46,8 @@ COPY ./Model /usr/src/Model
|
||||
|
||||
WORKDIR /usr/src/CommonServer
|
||||
COPY ./CommonServer/package*.json /usr/src/CommonServer/
|
||||
# Set version in ./CommonServer/package.json to the APP_VERSION
|
||||
RUN sed -i "s/\"version\": \".*\"/\"version\": \"$APP_VERSION\"/g" /usr/src/CommonServer/package.json
|
||||
RUN npm install
|
||||
COPY ./CommonServer /usr/src/CommonServer
|
||||
|
||||
@@ -48,6 +58,8 @@ COPY ./CommonServer /usr/src/CommonServer
|
||||
|
||||
WORKDIR /usr/src/CommonUI
|
||||
COPY ./CommonUI/package*.json /usr/src/CommonUI/
|
||||
# Set version in ./CommonUI/package.json to the APP_VERSION
|
||||
RUN sed -i "s/\"version\": \".*\"/\"version\": \"$APP_VERSION\"/g" /usr/src/CommonUI/package.json
|
||||
RUN npm install --force
|
||||
COPY ./CommonUI /usr/src/CommonUI
|
||||
|
||||
|
||||
40
AdminDashboard/package-lock.json
generated
@@ -1,22 +1,22 @@
|
||||
{
|
||||
"name": "admin-dashboard",
|
||||
"name": "@oneuptime/admin-dashboard",
|
||||
"version": "0.1.0",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "admin-dashboard",
|
||||
"name": "@oneuptime/admin-dashboard",
|
||||
"version": "0.1.0",
|
||||
"dependencies": {
|
||||
"Common": "file:../Common",
|
||||
"CommonServer": "file:../CommonServer",
|
||||
"CommonUI": "file:../CommonUI",
|
||||
"dotenv": "^16.4.1",
|
||||
"dotenv": "^16.4.5",
|
||||
"file-loader": "^6.2.0",
|
||||
"Model": "file:../Model",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.1.0",
|
||||
"react-router-dom": "^6.21.3",
|
||||
"react-router-dom": "^6.22.2",
|
||||
"style-loader": "^3.3.4"
|
||||
},
|
||||
"devDependencies": {
|
||||
@@ -4009,9 +4009,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@remix-run/router": {
|
||||
"version": "1.14.2",
|
||||
"resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.14.2.tgz",
|
||||
"integrity": "sha512-ACXpdMM9hmKZww21yEqWwiLws/UPLhNKvimN8RrYSqPSvB3ov7sLvAcfvaxePeLvccTQKGdkDIhLYApZVDFuKg==",
|
||||
"version": "1.15.2",
|
||||
"resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.2.tgz",
|
||||
"integrity": "sha512-+Rnav+CaoTE5QJc4Jcwh5toUpnVLKYbpU6Ys0zqbakqbaLQHeglLVHPfxOiQqdNmUy5C2lXz5dwC6tQNX2JW2Q==",
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
}
|
||||
@@ -7915,14 +7915,14 @@
|
||||
}
|
||||
},
|
||||
"node_modules/dotenv": {
|
||||
"version": "16.4.1",
|
||||
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.1.tgz",
|
||||
"integrity": "sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==",
|
||||
"version": "16.4.5",
|
||||
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz",
|
||||
"integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==",
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/motdotla/dotenv?sponsor=1"
|
||||
"url": "https://dotenvx.com"
|
||||
}
|
||||
},
|
||||
"node_modules/dotenv-expand": {
|
||||
@@ -16936,11 +16936,11 @@
|
||||
}
|
||||
},
|
||||
"node_modules/react-router": {
|
||||
"version": "6.21.3",
|
||||
"resolved": "https://registry.npmjs.org/react-router/-/react-router-6.21.3.tgz",
|
||||
"integrity": "sha512-a0H638ZXULv1OdkmiK6s6itNhoy33ywxmUFT/xtSoVyf9VnC7n7+VT4LjVzdIHSaF5TIh9ylUgxMXksHTgGrKg==",
|
||||
"version": "6.22.2",
|
||||
"resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.2.tgz",
|
||||
"integrity": "sha512-YD3Dzprzpcq+tBMHBS822tCjnWD3iIZbTeSXMY9LPSG541EfoBGyZ3bS25KEnaZjLcmQpw2AVLkFyfgXY8uvcw==",
|
||||
"dependencies": {
|
||||
"@remix-run/router": "1.14.2"
|
||||
"@remix-run/router": "1.15.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
@@ -16950,12 +16950,12 @@
|
||||
}
|
||||
},
|
||||
"node_modules/react-router-dom": {
|
||||
"version": "6.21.3",
|
||||
"resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.21.3.tgz",
|
||||
"integrity": "sha512-kNzubk7n4YHSrErzjLK72j0B5i969GsuCGazRl3G6j1zqZBLjuSlYBdVdkDOgzGdPIffUOc9nmgiadTEVoq91g==",
|
||||
"version": "6.22.2",
|
||||
"resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.2.tgz",
|
||||
"integrity": "sha512-WgqxD2qySEIBPZ3w0sHH+PUAiamDeszls9tzqMPBDA1YYVucTBXLU7+gtRfcSnhe92A3glPnvSxK2dhNoAVOIQ==",
|
||||
"dependencies": {
|
||||
"@remix-run/router": "1.14.2",
|
||||
"react-router": "6.21.3"
|
||||
"@remix-run/router": "1.15.2",
|
||||
"react-router": "6.22.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
{
|
||||
"name": "admin-dashboard",
|
||||
"name": "@oneuptime/admin-dashboard",
|
||||
"version": "0.1.0",
|
||||
"private": false,
|
||||
"dependencies": {
|
||||
"Common": "file:../Common",
|
||||
"CommonServer": "file:../CommonServer",
|
||||
"CommonUI": "file:../CommonUI",
|
||||
"dotenv": "^16.4.1",
|
||||
"dotenv": "^16.4.5",
|
||||
"file-loader": "^6.2.0",
|
||||
"Model": "file:../Model",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.1.0",
|
||||
"react-router-dom": "^6.21.3",
|
||||
"react-router-dom": "^6.22.3",
|
||||
"style-loader": "^3.3.4"
|
||||
},
|
||||
"scripts": {
|
||||
|
||||
@@ -19,7 +19,7 @@ import Users from './Pages/Users/Index';
|
||||
import Logout from './Pages/Logout/Logout';
|
||||
|
||||
// Settings Pages.
|
||||
import SettingsEmail from './Pages/Settings/SMTP/Index';
|
||||
import SettingsEmail from './Pages/Settings/Email/Index';
|
||||
import SettingsCallSMS from './Pages/Settings/CallSMS/Index';
|
||||
import SettingsProbes from './Pages/Settings/Probes/Index';
|
||||
import SettingsAuthentication from './Pages/Settings/Authentication/Index';
|
||||
|
||||
@@ -41,7 +41,7 @@ const DashboardProjectPicker: FunctionComponent<ComponentProps> = (
|
||||
return (
|
||||
<Toggle
|
||||
title="Yearly Plan"
|
||||
initialValue={isSubscriptionPlanYearly}
|
||||
value={isSubscriptionPlanYearly}
|
||||
description="(Save 20%)"
|
||||
onChange={(value: boolean) => {
|
||||
setIsSubscriptionPlanYearly(value);
|
||||
|
||||
@@ -164,7 +164,7 @@ const Projects: FunctionComponent = (): ReactElement => {
|
||||
return (
|
||||
<Toggle
|
||||
title="Yearly Plan"
|
||||
initialValue={isSubscriptionPlanYearly}
|
||||
value={isSubscriptionPlanYearly}
|
||||
description="(Save 20%)"
|
||||
onChange={(value: boolean) => {
|
||||
setIsSubscriptionPlanYearly(value);
|
||||
@@ -222,16 +222,30 @@ const Projects: FunctionComponent = (): ReactElement => {
|
||||
noItemsMessage={'No projects found.'}
|
||||
formFields={fields}
|
||||
showRefreshButton={true}
|
||||
showFilterButton={true}
|
||||
viewPageRoute={Navigation.getCurrentRoute()}
|
||||
columns={[
|
||||
filters={[
|
||||
{
|
||||
field: {
|
||||
name: true,
|
||||
},
|
||||
title: 'Name',
|
||||
type: FieldType.Text,
|
||||
},
|
||||
{
|
||||
field: {
|
||||
createdAt: true,
|
||||
},
|
||||
title: 'Created At',
|
||||
type: FieldType.DateTime,
|
||||
},
|
||||
]}
|
||||
columns={[
|
||||
{
|
||||
field: {
|
||||
name: true,
|
||||
},
|
||||
title: 'Name',
|
||||
type: FieldType.Text,
|
||||
isFilterable: true,
|
||||
},
|
||||
{
|
||||
field: {
|
||||
@@ -239,7 +253,6 @@ const Projects: FunctionComponent = (): ReactElement => {
|
||||
},
|
||||
title: 'Created At',
|
||||
type: FieldType.DateTime,
|
||||
isFilterable: true,
|
||||
},
|
||||
]}
|
||||
/>
|
||||
|
||||
@@ -15,7 +15,7 @@ import ErrorMessage from 'CommonUI/src/Components/ErrorMessage/ErrorMessage';
|
||||
import { JSONObject } from 'Common/Types/JSON';
|
||||
import DropdownUtil from 'CommonUI/src/Utils/Dropdown';
|
||||
import Pill from 'CommonUI/src/Components/Pill/Pill';
|
||||
import { Green, Red } from 'Common/Types/BrandColors';
|
||||
import { Green500, Red500 } from 'Common/Types/BrandColors';
|
||||
import { PromiseVoidFunction } from 'Common/Types/FunctionTypes';
|
||||
|
||||
const Settings: FunctionComponent = (): ReactElement => {
|
||||
@@ -89,6 +89,42 @@ const Settings: FunctionComponent = (): ReactElement => {
|
||||
>
|
||||
{/* Project Settings View */}
|
||||
|
||||
<CardModelDetail
|
||||
name="Admin Notification Email"
|
||||
cardProps={{
|
||||
title: 'Admin Notification Email',
|
||||
description:
|
||||
'Enter the email address where you would like to receive admin-level notifications.',
|
||||
}}
|
||||
isEditable={true}
|
||||
editButtonText="Edit Email"
|
||||
formFields={[
|
||||
{
|
||||
field: {
|
||||
adminNotificationEmail: true,
|
||||
},
|
||||
title: 'Admin Notification Email',
|
||||
fieldType: FormFieldSchemaType.Email,
|
||||
required: false,
|
||||
},
|
||||
]}
|
||||
modelDetailProps={{
|
||||
modelType: GlobalConfig,
|
||||
id: 'model-detail-global-config',
|
||||
fields: [
|
||||
{
|
||||
field: {
|
||||
adminNotificationEmail: true,
|
||||
},
|
||||
title: 'Admin Notification Email',
|
||||
fieldType: FieldType.Email,
|
||||
placeholder: 'None',
|
||||
},
|
||||
],
|
||||
modelId: ObjectID.getZeroObjectID(),
|
||||
}}
|
||||
/>
|
||||
|
||||
<CardModelDetail
|
||||
name="Internal SMTP Settings"
|
||||
cardProps={{
|
||||
@@ -183,7 +219,8 @@ const Settings: FunctionComponent = (): ReactElement => {
|
||||
title: 'Use SSL / TLS',
|
||||
stepId: 'server-info',
|
||||
fieldType: FormFieldSchemaType.Toggle,
|
||||
description: 'Make email communication secure?',
|
||||
description:
|
||||
'If you use port 465, please enable this. Do not enable this if you use port 587.',
|
||||
},
|
||||
{
|
||||
field: {
|
||||
@@ -348,28 +385,28 @@ const Settings: FunctionComponent = (): ReactElement => {
|
||||
return (
|
||||
<Pill
|
||||
text="Enabled"
|
||||
color={Green}
|
||||
color={Green500}
|
||||
/>
|
||||
);
|
||||
} else if (!item['sendgridApiKey']) {
|
||||
return (
|
||||
<Pill
|
||||
text="Not Enabled. Please add the API key."
|
||||
color={Red}
|
||||
color={Red500}
|
||||
/>
|
||||
);
|
||||
} else if (!item['sendgridFromEmail']) {
|
||||
return (
|
||||
<Pill
|
||||
text="Not Enabled. Please add the From Email."
|
||||
color={Red}
|
||||
color={Red500}
|
||||
/>
|
||||
);
|
||||
} else if (!item['sendgridFromName']) {
|
||||
return (
|
||||
<Pill
|
||||
text="Not Enabled. Please add the From Name."
|
||||
color={Red}
|
||||
color={Red500}
|
||||
/>
|
||||
);
|
||||
}
|
||||
@@ -9,12 +9,11 @@ import Probe from 'Model/Models/Probe';
|
||||
import FieldType from 'CommonUI/src/Components/Types/FieldType';
|
||||
import { JSONObject } from 'Common/Types/JSON';
|
||||
import OneUptimeDate from 'Common/Types/Date';
|
||||
import { Green, Red } from 'Common/Types/BrandColors';
|
||||
import { Green500, Red500 } from 'Common/Types/BrandColors';
|
||||
import Statusbubble from 'CommonUI/src/Components/StatusBubble/StatusBubble';
|
||||
import ProbeElement from 'CommonUI/src/Components/Probe/Probe';
|
||||
import IsNull from 'Common/Types/BaseDatabase/IsNull';
|
||||
import Banner from 'CommonUI/src/Components/Banner/Banner';
|
||||
import URL from 'Common/Types/API/URL';
|
||||
import FormFieldSchemaType from 'CommonUI/src/Components/Forms/Types/FormFieldSchemaType';
|
||||
import { ButtonStyleType } from 'CommonUI/src/Components/Button/Button';
|
||||
import ConfirmModal from 'CommonUI/src/Components/Modal/ConfirmModal';
|
||||
@@ -57,9 +56,7 @@ const Settings: FunctionComponent = (): ReactElement => {
|
||||
openInNewTab={true}
|
||||
title="Need help with setting up Global Probes?"
|
||||
description="Here is a guide which will help you get set up"
|
||||
link={URL.fromString(
|
||||
'https://github.com/OneUptime/oneuptime/blob/master/Docs/Probe/CustomProbe.md'
|
||||
)}
|
||||
link={Route.fromString('/docs/probe/custom-probe')}
|
||||
/>
|
||||
|
||||
<ModelTable<Probe>
|
||||
@@ -81,7 +78,6 @@ const Settings: FunctionComponent = (): ReactElement => {
|
||||
modelAPI={AdminModelAPI}
|
||||
noItemsMessage={'No probes found.'}
|
||||
showRefreshButton={true}
|
||||
showFilterButton={true}
|
||||
onBeforeCreate={(item: Probe) => {
|
||||
item.isGlobalProbe = true;
|
||||
return Promise.resolve(item);
|
||||
@@ -146,6 +142,22 @@ const Settings: FunctionComponent = (): ReactElement => {
|
||||
},
|
||||
},
|
||||
]}
|
||||
filters={[
|
||||
{
|
||||
field: {
|
||||
name: true,
|
||||
},
|
||||
title: 'Name',
|
||||
type: FieldType.Text,
|
||||
},
|
||||
{
|
||||
field: {
|
||||
description: true,
|
||||
},
|
||||
title: 'Description',
|
||||
type: FieldType.Text,
|
||||
},
|
||||
]}
|
||||
columns={[
|
||||
{
|
||||
field: {
|
||||
@@ -153,7 +165,7 @@ const Settings: FunctionComponent = (): ReactElement => {
|
||||
},
|
||||
title: 'Name',
|
||||
type: FieldType.Text,
|
||||
isFilterable: true,
|
||||
|
||||
getElement: (item: JSONObject): ReactElement => {
|
||||
return <ProbeElement probe={item} />;
|
||||
},
|
||||
@@ -164,7 +176,6 @@ const Settings: FunctionComponent = (): ReactElement => {
|
||||
},
|
||||
title: 'Description',
|
||||
type: FieldType.Text,
|
||||
isFilterable: true,
|
||||
},
|
||||
{
|
||||
field: {
|
||||
@@ -172,7 +183,6 @@ const Settings: FunctionComponent = (): ReactElement => {
|
||||
},
|
||||
title: 'Status',
|
||||
type: FieldType.Text,
|
||||
isFilterable: false,
|
||||
getElement: (item: JSONObject): ReactElement => {
|
||||
if (
|
||||
item &&
|
||||
@@ -187,7 +197,7 @@ const Settings: FunctionComponent = (): ReactElement => {
|
||||
return (
|
||||
<Statusbubble
|
||||
text={'Connected'}
|
||||
color={Green}
|
||||
color={Green500}
|
||||
shouldAnimate={true}
|
||||
/>
|
||||
);
|
||||
@@ -196,7 +206,7 @@ const Settings: FunctionComponent = (): ReactElement => {
|
||||
return (
|
||||
<Statusbubble
|
||||
text={'Disconnected'}
|
||||
color={Red}
|
||||
color={Red500}
|
||||
shouldAnimate={false}
|
||||
/>
|
||||
);
|
||||
|
||||
@@ -72,16 +72,37 @@ const Users: FunctionComponent = (): ReactElement => {
|
||||
},
|
||||
]}
|
||||
showRefreshButton={true}
|
||||
showFilterButton={true}
|
||||
viewPageRoute={Navigation.getCurrentRoute()}
|
||||
columns={[
|
||||
filters={[
|
||||
{
|
||||
field: {
|
||||
name: true,
|
||||
},
|
||||
title: 'Full Name',
|
||||
type: FieldType.Text,
|
||||
},
|
||||
{
|
||||
field: {
|
||||
email: true,
|
||||
},
|
||||
title: 'Email',
|
||||
type: FieldType.Email,
|
||||
},
|
||||
{
|
||||
field: {
|
||||
createdAt: true,
|
||||
},
|
||||
title: 'Created At',
|
||||
type: FieldType.DateTime,
|
||||
},
|
||||
]}
|
||||
columns={[
|
||||
{
|
||||
field: {
|
||||
name: true,
|
||||
},
|
||||
title: 'Full Name',
|
||||
type: FieldType.Text,
|
||||
isFilterable: true,
|
||||
},
|
||||
{
|
||||
field: {
|
||||
@@ -89,7 +110,6 @@ const Users: FunctionComponent = (): ReactElement => {
|
||||
},
|
||||
title: 'Email',
|
||||
type: FieldType.Email,
|
||||
isFilterable: true,
|
||||
},
|
||||
{
|
||||
field: {
|
||||
@@ -97,7 +117,6 @@ const Users: FunctionComponent = (): ReactElement => {
|
||||
},
|
||||
title: 'Created At',
|
||||
type: FieldType.DateTime,
|
||||
isFilterable: true,
|
||||
},
|
||||
]}
|
||||
/>
|
||||
|
||||
@@ -3,7 +3,8 @@
|
||||
// these options are overrides used only by ts-node
|
||||
// same as the --compilerOptions flag and the TS_NODE_COMPILER_OPTIONS environment variable
|
||||
"compilerOptions": {
|
||||
"module": "commonjs"
|
||||
"module": "commonjs",
|
||||
"resolveJsonModule": true,
|
||||
}
|
||||
},
|
||||
"compilerOptions": {
|
||||
@@ -105,6 +106,7 @@
|
||||
|
||||
/* Completeness */
|
||||
// "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */
|
||||
"skipLibCheck": true /* Skip type checking all .d.ts files. */
|
||||
"skipLibCheck": true, /* Skip type checking all .d.ts files. */
|
||||
"resolveJsonModule": true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,6 +14,10 @@ ENV GIT_SHA=${GIT_SHA}
|
||||
ENV APP_VERSION=${APP_VERSION}
|
||||
|
||||
|
||||
# IF APP_VERSION is not set, set it to 1.0.0
|
||||
RUN if [ -z "$APP_VERSION" ]; then export APP_VERSION=1.0.0; fi
|
||||
|
||||
|
||||
# Install bash.
|
||||
RUN apk add bash && apk add curl
|
||||
|
||||
@@ -29,12 +33,16 @@ RUN mkdir /usr/src
|
||||
|
||||
WORKDIR /usr/src/Common
|
||||
COPY ./Common/package*.json /usr/src/Common/
|
||||
# Set version in ./Common/package.json to the APP_VERSION
|
||||
RUN sed -i "s/\"version\": \".*\"/\"version\": \"$APP_VERSION\"/g" /usr/src/Common/package.json
|
||||
RUN npm install
|
||||
COPY ./Common /usr/src/Common
|
||||
|
||||
|
||||
WORKDIR /usr/src/Model
|
||||
COPY ./Model/package*.json /usr/src/Model/
|
||||
# Set version in ./Model/package.json to the APP_VERSION
|
||||
RUN sed -i "s/\"version\": \".*\"/\"version\": \"$APP_VERSION\"/g" /usr/src/Model/package.json
|
||||
RUN npm install
|
||||
COPY ./Model /usr/src/Model
|
||||
|
||||
@@ -42,6 +50,8 @@ COPY ./Model /usr/src/Model
|
||||
|
||||
WORKDIR /usr/src/CommonServer
|
||||
COPY ./CommonServer/package*.json /usr/src/CommonServer/
|
||||
# Set version in ./CommonServer/package.json to the APP_VERSION
|
||||
RUN sed -i "s/\"version\": \".*\"/\"version\": \"$APP_VERSION\"/g" /usr/src/CommonServer/package.json
|
||||
RUN npm install
|
||||
COPY ./CommonServer /usr/src/CommonServer
|
||||
|
||||
@@ -53,6 +63,8 @@ WORKDIR /usr/src/app
|
||||
|
||||
# Install app dependencies
|
||||
COPY ./App/package*.json /usr/src/app/
|
||||
# Set version in ./App/package.json to the APP_VERSION
|
||||
RUN sed -i "s/\"version\": \".*\"/\"version\": \"$APP_VERSION\"/g" /usr/src/app/package.json
|
||||
RUN npm install
|
||||
|
||||
# Expose ports.
|
||||
|
||||
@@ -18,7 +18,7 @@ export default class ServiceHandler {
|
||||
|
||||
pageData.featuredResources = FeaturedResources;
|
||||
pageTitle = 'Introduction';
|
||||
pageDescription = 'API Documentation for OneUptime';
|
||||
pageDescription = 'API Reference for OneUptime';
|
||||
|
||||
return res.render(`${ViewsPath}/pages/index`, {
|
||||
page: page,
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
<h1 class="font-bold text-xl">API Documentation</h1>
|
||||
<h1 class="font-bold text-xl">API Reference</h1>
|
||||
<p class="lead">Use the OneUptime API to access any resource in your projects, create automated
|
||||
workflows, and more
|
||||
and
|
||||
|
||||
@@ -426,15 +426,20 @@ import LogService, {
|
||||
LogService as LogServiceType,
|
||||
} from 'CommonServer/Services/LogService';
|
||||
|
||||
import MonitorMetricsByMinute from 'Model/AnalyticsModels/MonitorMetricsByMinute';
|
||||
import MonitorMetricsByMinuteService, {
|
||||
MonitorMetricsByMinuteService as MonitorMetricsByMinuteServiceType,
|
||||
} from 'CommonServer/Services/MonitorMetricsByMinuteService';
|
||||
|
||||
import Span from 'Model/AnalyticsModels/Span';
|
||||
import SpanService, {
|
||||
SpanService as SpanServiceType,
|
||||
} from 'CommonServer/Services/SpanService';
|
||||
|
||||
import UsageBilling from 'Model/Models/UsageBilling';
|
||||
import UsageBillingService, {
|
||||
Service as UsageBillingServiceType,
|
||||
} from 'CommonServer/Services/UsageBillingService';
|
||||
import TelemetryUsageBilling from 'Model/Models/TelemetryUsageBilling';
|
||||
import TelemetryUsageBillingService, {
|
||||
Service as TelemetryUsageBillingServiceType,
|
||||
} from 'CommonServer/Services/TelemetryUsageBillingService';
|
||||
import BaseAPI from 'CommonServer/API/BaseAPI';
|
||||
import BaseAnalyticsAPI from 'CommonServer/API/BaseAnalyticsAPI';
|
||||
|
||||
@@ -458,6 +463,14 @@ app.use(
|
||||
new BaseAnalyticsAPI<Log, LogServiceType>(Log, LogService).getRouter()
|
||||
);
|
||||
|
||||
app.use(
|
||||
`/${APP_NAME.toLocaleLowerCase()}`,
|
||||
new BaseAnalyticsAPI<
|
||||
MonitorMetricsByMinute,
|
||||
MonitorMetricsByMinuteServiceType
|
||||
>(MonitorMetricsByMinute, MonitorMetricsByMinuteService).getRouter()
|
||||
);
|
||||
|
||||
app.use(
|
||||
`/${APP_NAME.toLocaleLowerCase()}`,
|
||||
new BaseAnalyticsAPI<Span, SpanServiceType>(Span, SpanService).getRouter()
|
||||
@@ -465,9 +478,9 @@ app.use(
|
||||
|
||||
app.use(
|
||||
`/${APP_NAME.toLocaleLowerCase()}`,
|
||||
new BaseAPI<UsageBilling, UsageBillingServiceType>(
|
||||
UsageBilling,
|
||||
UsageBillingService
|
||||
new BaseAPI<TelemetryUsageBilling, TelemetryUsageBillingServiceType>(
|
||||
TelemetryUsageBilling,
|
||||
TelemetryUsageBillingService
|
||||
).getRouter()
|
||||
);
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Development
|
||||
# Local Development
|
||||
|
||||
For local development you need to use docker-compose.dev.yml file.
|
||||
|
||||
49
App/FeatureSet/Docs/Content/introduction/getting-started.md
Normal file
@@ -0,0 +1,49 @@
|
||||
### OneUptime: The Complete Open-Source Observability Platform
|
||||
|
||||
OneUptime is a comprehensive solution for monitoring and managing your online services. Whether you need to check the availability of your website, dashboard, API, or any other online resource, OneUptime can alert your team when downtime happens and keep your customers informed with a status page. OneUptime also helps you handle incidents, set up on-call rotations, run tests, secure your services, analyze logs, track performance, and debug errors.
|
||||
|
||||
OneUptime replaces multiple tools with one integrated platform:
|
||||
|
||||
|
||||
##### Uptime Monitoring
|
||||
|
||||
Monitor the availability and response time of your online services from multiple locations around the world. Get notified via email, SMS, Slack, or other channels when something goes wrong. Replace tools like Pingdom.
|
||||
|
||||
|
||||
##### Status Pages
|
||||
|
||||
Communicate with your customers and stakeholders during downtime or maintenance. Create a custom-branded status page that shows the current status and history of your services. Replace tools like StatusPage.io.
|
||||
|
||||
|
||||
##### Incident Management
|
||||
|
||||
Manage incidents from start to finish with a collaborative workflow. Create incident reports, assign tasks, update stakeholders, and document resolutions. Replace tools like Incident.io.
|
||||
|
||||
|
||||
##### On Call and Alerts
|
||||
|
||||
Schedule on-call shifts for your team and define escalation policies. Ensure that the right person is notified at the right time when an incident occurs. Replace tools like PagerDuty.
|
||||
|
||||
|
||||
##### Logs Management
|
||||
|
||||
Collect, store, and analyze logs from your online services. Search, filter, and visualize log data to gain insights and troubleshoot issues. Replace tools like Loggly.
|
||||
|
||||
|
||||
##### Workflows
|
||||
|
||||
Integrate OneUptime with your existing tools and automate your workflows. Integrate with tools like Slack, Jira, GitHub, and 5000+ more.
|
||||
|
||||
|
||||
##### Application Performance Monitoring
|
||||
|
||||
Measure and optimize the performance of your online apps and services. Track key metrics such as traces, response time, throughput, error rate, and user satisfaction. Replace tools like NewRelic and DataDog.
|
||||
|
||||
##### Error Tracking
|
||||
|
||||
Detect and diagnose errors in your online services. Get detailed error reports with stack traces, context, and user feedback. Replace tools like Sentry.
|
||||
|
||||
##### Reliability Autopilot
|
||||
|
||||
Scan your code and fix performance issues and errors automatically. Get recommendations for improving the reliability of your online services.
|
||||
|
||||
@@ -5,5 +5,7 @@ Please whitelist the following IP's in your firewall to allow our probes to moni
|
||||
- 51.159.99.250
|
||||
- 62.210.173.51
|
||||
- 51.159.101.36
|
||||
- 172.174.206.132
|
||||
- 57.151.99.117
|
||||
|
||||
These IP's can change, we will let you know in advance if this happens.
|
||||
@@ -36,13 +36,13 @@ You can find the full list of supported sources [here](https://www.fluentd.org/d
|
||||
|
||||
On the telemetry service page, click on "Create Telemetry Service" button.
|
||||
|
||||

|
||||

|
||||
|
||||
Once you create a telemetry service, click on "View Service" and you will be redirected to the telemetry service page.
|
||||
|
||||
Click on View Service Token and copy the token. You will need this token to configure the telemetry service. **Please keep this token safe.**
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
## Configuration
|
||||
@@ -8,13 +8,13 @@ After you sign up to OneUptime and create a project. Click on more in the Naviga
|
||||
|
||||
On the telemetry service page, click on "Create Telemetry Service" button.
|
||||
|
||||

|
||||

|
||||
|
||||
Once you create a telemetry service, click on "View Service" and you will be redirected to the telemetry service page.
|
||||
|
||||
Click on View Service Token and copy the token. You will need this token to configure the telemetry service. Please keep this token safe.
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
### Step 2 - Configure the telemetry service in your application.
|
||||
@@ -5,18 +5,78 @@ import Express, {
|
||||
ExpressStatic,
|
||||
ExpressApplication,
|
||||
} from 'CommonServer/Utils/Express';
|
||||
import { StaticPath, ViewsPath } from './Utils/Config';
|
||||
import { ContentPath, StaticPath, ViewsPath } from './Utils/Config';
|
||||
import DocsNav, { NavGroup, NavLink } from './Utils/Nav';
|
||||
import LocalFile from 'CommonServer/Utils/LocalFile';
|
||||
import DocsRender from './Utils/Render';
|
||||
import logger from 'CommonServer/Utils/Logger';
|
||||
|
||||
const app: ExpressApplication = Express.getExpressApp();
|
||||
|
||||
app.get('/docs', (_req: ExpressRequest, res: ExpressResponse) => {
|
||||
res.render(`${ViewsPath}/index`, {
|
||||
support: false,
|
||||
footerCards: true,
|
||||
cta: true,
|
||||
blackLogo: false,
|
||||
requestDemoCta: false,
|
||||
});
|
||||
res.redirect('/docs/introduction/getting-started');
|
||||
});
|
||||
|
||||
app.get(
|
||||
'/docs/:categorypath/:pagepath',
|
||||
async (_req: ExpressRequest, res: ExpressResponse) => {
|
||||
try {
|
||||
const fullPath: string =
|
||||
`${_req.params['categorypath']}/${_req.params['pagepath']}`.toLowerCase();
|
||||
|
||||
// read file from Content folder.
|
||||
let contentInMarkdown: string = await LocalFile.read(
|
||||
`${ContentPath}/${fullPath}.md`
|
||||
);
|
||||
|
||||
// remove first line from content because we dont want to show title in content. Title is already in nav.
|
||||
|
||||
contentInMarkdown = contentInMarkdown
|
||||
.split('\n')
|
||||
.slice(1)
|
||||
.join('\n');
|
||||
|
||||
const renderedContent: string = await DocsRender.render(
|
||||
contentInMarkdown
|
||||
);
|
||||
|
||||
const currentCategory: NavGroup | undefined = DocsNav.find(
|
||||
(category: NavGroup) => {
|
||||
return category.links.find((link: NavLink) => {
|
||||
return link.url.toLocaleLowerCase().includes(fullPath);
|
||||
});
|
||||
}
|
||||
);
|
||||
|
||||
const currrentNavLink: NavLink | undefined =
|
||||
currentCategory?.links.find((link: NavLink) => {
|
||||
return link.url.toLocaleLowerCase().includes(fullPath);
|
||||
});
|
||||
|
||||
if (!currentCategory || !currrentNavLink) {
|
||||
// render not found.
|
||||
|
||||
res.status(404);
|
||||
return res.render(`${ViewsPath}/NotFound`, {
|
||||
nav: DocsNav,
|
||||
});
|
||||
}
|
||||
|
||||
res.render(`${ViewsPath}/Index`, {
|
||||
nav: DocsNav,
|
||||
content: renderedContent,
|
||||
category: currentCategory,
|
||||
link: currrentNavLink,
|
||||
githubPath: fullPath,
|
||||
});
|
||||
} catch (err) {
|
||||
logger.error(err);
|
||||
res.status(500);
|
||||
return res.render(`${ViewsPath}/ServerError`, {
|
||||
nav: DocsNav,
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
app.use('/docs/static', ExpressStatic(StaticPath));
|
||||
|
||||
3178
App/FeatureSet/Docs/Static/css/style.css
Normal file
BIN
App/FeatureSet/Docs/Static/fonts/f1.woff2
Normal file
BIN
App/FeatureSet/Docs/Static/fonts/f2.woff2
Normal file
|
Before Width: | Height: | Size: 129 KiB After Width: | Height: | Size: 129 KiB |
|
Before Width: | Height: | Size: 174 KiB After Width: | Height: | Size: 174 KiB |
@@ -0,0 +1,54 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Check if this is debian based
|
||||
|
||||
# Check if system supports apt-get
|
||||
|
||||
if [ -x "$(command -v apt-get)" ]; then
|
||||
# Update apt-get
|
||||
sudo apt-get update
|
||||
# Install build-essential
|
||||
sudo apt-get install build-essential -y
|
||||
fi
|
||||
|
||||
# Check if system supports yum
|
||||
if [ -x "$(command -v yum)" ]; then
|
||||
# Update yum
|
||||
sudo yum update
|
||||
# Install build-essential
|
||||
sudo yum install gcc-c++ make -y
|
||||
fi
|
||||
|
||||
# Check if system supports apk
|
||||
if [ -x "$(command -v apk)" ]; then
|
||||
# Update apk
|
||||
sudo apk update
|
||||
# Install build-essential
|
||||
sudo apk add build-base
|
||||
fi
|
||||
|
||||
|
||||
# Install NVM
|
||||
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
|
||||
|
||||
# Export to path
|
||||
export NVM_DIR="$HOME/.nvm"
|
||||
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
|
||||
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
|
||||
|
||||
|
||||
# Refresh bash
|
||||
source ~/.bashrc
|
||||
|
||||
# Install latest Node.js via NVM
|
||||
nvm install node
|
||||
|
||||
# Make this nodejs version the default
|
||||
nvm alias default node
|
||||
|
||||
# Use the default version
|
||||
nvm use default
|
||||
|
||||
# Now install
|
||||
npm install -g tsx
|
||||
npm install -g @oneuptime/infrastructure-agent
|
||||
@@ -1,2 +1,3 @@
|
||||
export const ViewsPath: string = '/usr/src/app/FeatureSet/Docs/Views';
|
||||
export const StaticPath: string = '/usr/src/app/FeatureSet/Docs/Static';
|
||||
export const ContentPath: string = '/usr/src/app/FeatureSet/Docs/Content';
|
||||
|
||||
63
App/FeatureSet/Docs/Utils/Nav.ts
Normal file
@@ -0,0 +1,63 @@
|
||||
export interface NavLink {
|
||||
title: string;
|
||||
url: string;
|
||||
}
|
||||
|
||||
export interface NavGroup {
|
||||
title: string;
|
||||
links: NavLink[];
|
||||
}
|
||||
|
||||
const DocsNav: NavGroup[] = [
|
||||
{
|
||||
title: 'Introduction',
|
||||
links: [
|
||||
{
|
||||
title: 'Getting Started',
|
||||
url: '/docs/introduction/getting-started',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Installation',
|
||||
links: [
|
||||
{
|
||||
title: 'Local Development',
|
||||
url: '/docs/installation/local-development',
|
||||
},
|
||||
{
|
||||
title: 'Docker Compose',
|
||||
url: '/docs/installation/docker-compose',
|
||||
},
|
||||
{
|
||||
title: 'Kubernetes and Helm',
|
||||
url: 'https://artifacthub.io/packages/helm/oneuptime/oneuptime',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Monitor',
|
||||
links: [
|
||||
{
|
||||
title: 'JavaScript Expressions',
|
||||
url: '/docs/monitor/javascript-expression',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Probe',
|
||||
links: [
|
||||
{ title: 'Custom Probes', url: '/docs/probe/custom-probe' },
|
||||
{ title: 'IP Addresses', url: '/docs/probe/ip-address' },
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Telemetry',
|
||||
links: [
|
||||
{ title: 'OpenTelemetry', url: '/docs/telemetry/open-telemetry' },
|
||||
{ title: 'Fluentd', url: '/docs/telemetry/fluentd' },
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
export default DocsNav;
|
||||
50
App/FeatureSet/Docs/Utils/Render.ts
Normal file
@@ -0,0 +1,50 @@
|
||||
import { Renderer, marked } from 'marked';
|
||||
|
||||
export default class DocsRender {
|
||||
public static async render(markdownContent: string): Promise<string> {
|
||||
const renderer: Renderer = this.getBlogRenderer();
|
||||
|
||||
return await marked(markdownContent, {
|
||||
renderer: renderer,
|
||||
});
|
||||
}
|
||||
|
||||
private static getBlogRenderer(): Renderer {
|
||||
const renderer: Renderer = new Renderer();
|
||||
|
||||
renderer.paragraph = function (text) {
|
||||
return `<p class="mt-2 mb-2 leading-8 text-gray-600">${text}</p>`;
|
||||
};
|
||||
|
||||
renderer.blockquote = function (quote) {
|
||||
return `<blockquote class="p-4 pt-1 pb-1 my-4 border-s-4 border-indigo-500">
|
||||
<div class="leading-8 text-gray-600">${quote}</div>
|
||||
</blockquote>`;
|
||||
};
|
||||
|
||||
renderer.image = function (href, _title, text) {
|
||||
return `<img src="${href}" alt="${text}" class="rounded-md shadow-md" />`;
|
||||
};
|
||||
|
||||
renderer.code = function (code, language) {
|
||||
return `<pre class="language-${language} rounded-md"><code class="language-${language} rounded-md">${code}</code></pre>`;
|
||||
};
|
||||
|
||||
renderer.heading = function (text, level) {
|
||||
if (level === 1) {
|
||||
return `<h1 class="my-5 mt-8 text-4xl font-bold tracking-tight text-gray-800">${text}</h1>`;
|
||||
} else if (level === 2) {
|
||||
return `<h2 class="my-5 mt-8 text-3xl font-bold tracking-tight text-gray-800">${text}</h2>`;
|
||||
} else if (level === 3) {
|
||||
return `<h3 class="my-5 mt-8 text-2xl font-bold tracking-tight text-gray-800">${text}</h3>`;
|
||||
} else if (level === 4) {
|
||||
return `<h4 class="my-5 mt-8 text-xl font-bold tracking-tight text-gray-800">${text}</h4>`;
|
||||
} else if (level === 5) {
|
||||
return `<h5 class="my-5 mt-8 text-lg font-bold tracking-tight text-gray-800">${text}</h5>`;
|
||||
}
|
||||
return `<h6 class="my-5 tracking-tight font-bold text-gray-800">${text}</h6>`;
|
||||
};
|
||||
|
||||
return renderer;
|
||||
}
|
||||
}
|
||||
34
App/FeatureSet/Docs/Views/Index.ejs
Normal file
@@ -0,0 +1,34 @@
|
||||
<html lang="en" class="h-full antialiased __variable_e66fe9 __variable_b436a8 light nbuofyfqi idc0_350"
|
||||
style="color-scheme: light;">
|
||||
|
||||
<head>
|
||||
<%- include('./Partials/Head.ejs') %>
|
||||
</head>
|
||||
|
||||
<body class="flex min-h-full bg-white dark:bg-slate-900">
|
||||
|
||||
<div class="flex w-full flex-col">
|
||||
<%- include('./Partials/Header.ejs') %>
|
||||
|
||||
<div class="relative mx-auto flex w-full max-w-8xl flex-auto justify-center sm:px-2 lg:px-8 xl:px-12">
|
||||
<div class="hidden lg:relative lg:block lg:flex-none">
|
||||
<div class="absolute inset-y-0 right-0 w-[50vw] bg-slate-50 dark:hidden"></div>
|
||||
<div
|
||||
class="absolute bottom-0 right-0 top-16 hidden h-12 w-px bg-gradient-to-t from-slate-800 dark:block">
|
||||
</div>
|
||||
<div class="absolute bottom-0 right-0 top-28 hidden w-px bg-slate-800 dark:block"></div>
|
||||
<div
|
||||
class="sticky top-[4.75rem] -ml-0.5 h-[calc(100vh-4.75rem)] w-64 overflow-y-auto overflow-x-hidden py-16 pl-0.5 pr-8 xl:w-72 xl:pr-16">
|
||||
<%- include('./Partials/Nav.ejs') %>
|
||||
</div>
|
||||
</div>
|
||||
<div class="min-w-0 max-w-2xl flex-auto px-4 py-16 lg:max-w-none lg:pl-8 lg:pr-0 xl:px-16">
|
||||
<%- include('./Partials/Content.ejs', { category: category, link: link, content: content }) %>
|
||||
<%- include('./Partials/OpenSourceCommitment.ejs', { githubPath: githubPath }) %>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
11
App/FeatureSet/Docs/Views/Partials/Content.ejs
Normal file
@@ -0,0 +1,11 @@
|
||||
<article>
|
||||
<header class="mb-9 space-y-1">
|
||||
<p class="text-base font-bold text-sky-500"><%- category.title %></p>
|
||||
<h1 class="font-bold text-3xl tracking-tight text-slate-900 dark:text-white"><%- link.title %>
|
||||
</h1>
|
||||
</header>
|
||||
<div
|
||||
class="prose prose-slate max-w-none dark:prose-invert dark:text-slate-400 prose-headings:scroll-mt-28 prose-headings:font-display prose-headings:font-normal lg:prose-headings:scroll-mt-[8.5rem] prose-lead:text-slate-500 dark:prose-lead:text-slate-400 prose-a:font-semibold dark:prose-a:text-sky-400 prose-a:no-underline prose-a:shadow-[inset_0_-2px_0_0_var(--tw-prose-background,#fff),inset_0_calc(-1*(var(--tw-prose-underline-size,4px)+2px))_0_0_var(--tw-prose-underline,theme(colors.sky.300))] hover:prose-a:[--tw-prose-underline-size:6px] dark:[--tw-prose-background:theme(colors.slate.900)] dark:prose-a:shadow-[inset_0_calc(-1*var(--tw-prose-underline-size,2px))_0_0_var(--tw-prose-underline,theme(colors.sky.800))] dark:hover:prose-a:[--tw-prose-underline-size:6px] prose-pre:rounded-xl prose-pre:bg-slate-900 prose-pre:shadow-lg dark:prose-pre:bg-slate-800/60 dark:prose-pre:shadow-none dark:prose-pre:ring-1 dark:prose-pre:ring-slate-300/10 dark:prose-hr:border-slate-800">
|
||||
<%- content %>
|
||||
</div>
|
||||
</article>
|
||||
15
App/FeatureSet/Docs/Views/Partials/Head.ejs
Normal file
@@ -0,0 +1,15 @@
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link rel="preload" href="/docs/static/fonts/f1.woff2" as="font" crossorigin="" type="font/woff2">
|
||||
<link rel="preload" href="/docs/static/fonts/f2.woff2" as="font" crossorigin="" type="font/woff2">
|
||||
<link rel="stylesheet" href="/docs/static/css/style.css" crossorigin="" data-precedence="next">
|
||||
<title>OneUptime Documentation</title>
|
||||
<meta name="description"
|
||||
content="Cache every single thing your app could ever do ahead of time, so your code never even has to run at all.">
|
||||
<link rel="icon" href="/favicon.ico" type="image/x-icon" sizes="16x16">
|
||||
<meta name="next-size-adjust">
|
||||
<link rel="stylesheet" href="/docs/static/css/style.css" crossorigin="" data-precedence="next" />
|
||||
<script src="https://cdn.tailwindcss.com"></script>
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/a11y-dark.min.css">
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
|
||||
<script>hljs.highlightAll();</script>
|
||||
17
App/FeatureSet/Docs/Views/Partials/Header.ejs
Normal file
@@ -0,0 +1,17 @@
|
||||
<header
|
||||
class="sticky top-0 z-50 flex flex-none flex-wrap items-center justify-between bg-white px-4 py-5 shadow-md shadow-slate-900/5 transition duration-500 sm:px-6 lg:px-8 dark:shadow-none dark:bg-slate-900/95 dark:backdrop-blur dark:[@supports(backdrop-filter:blur(0))]:bg-slate-900/75">
|
||||
|
||||
<div class="relative flex flex-grow basis-0 items-center"><a aria-label="Home page" href="/">
|
||||
<img class="h-8 w-auto" src="/img/3-transparent.svg" alt="">
|
||||
</a></div>
|
||||
|
||||
<div class="relative flex basis-0 justify-end gap-6 sm:gap-8 md:flex-grow">
|
||||
<a class="group" aria-label="GitHub" target="_blank" href="https://github.com/oneuptime/oneuptime"><svg
|
||||
aria-hidden="true" viewBox="0 0 16 16"
|
||||
class="h-6 w-6 fill-slate-400 group-hover:fill-slate-500 dark:group-hover:fill-slate-300">
|
||||
<path
|
||||
d="M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z">
|
||||
</path>
|
||||
</svg></a>
|
||||
</div>
|
||||
</header>
|
||||
33
App/FeatureSet/Docs/Views/Partials/Nav.ejs
Normal file
@@ -0,0 +1,33 @@
|
||||
<nav class="text-base lg:text-sm">
|
||||
<ul role="list" class="space-y-9">
|
||||
<% for(var i=0; i<nav.length; i++) {%>
|
||||
<li>
|
||||
<h2 class="font-display font-medium text-slate-900 dark:text-white"><%- nav[i].title -%>
|
||||
</h2>
|
||||
|
||||
<ul role="list"
|
||||
class="mt-2 space-y-2 border-l-2 border-slate-100 lg:mt-4 lg:space-y-4 lg:border-slate-200 dark:border-slate-800">
|
||||
<% if(nav[i].links.length> 0) { %>
|
||||
<% for(var j=0; j<nav[i].links.length; j++) {%>
|
||||
<% if(link.url===nav[i].links[j].url) { %>
|
||||
<li class="relative"><a
|
||||
class="block w-full pl-3.5 before:pointer-events-none before:absolute before:-left-1 before:top-1/2 before:h-1.5 before:w-1.5 before:-translate-y-1/2 before:rounded-full font-semibold text-sky-500 before:bg-sky-500"
|
||||
href="<%- nav[i].links[j].url -%>"><%-
|
||||
nav[i].links[j].title -%></a>
|
||||
</li>
|
||||
<% } else { %>
|
||||
<li class="relative"><a
|
||||
class="block w-full pl-3.5 before:pointer-events-none before:absolute before:-left-1 before:top-1/2 before:h-1.5 before:w-1.5 before:-translate-y-1/2 before:rounded-full text-slate-500 before:hidden before:bg-slate-300 hover:text-slate-600 hover:before:block dark:text-slate-400 dark:before:bg-slate-700 dark:hover:text-slate-300"
|
||||
href="<%- nav[i].links[j].url -%>"><%-
|
||||
nav[i].links[j].title -%></a></li>
|
||||
|
||||
<% } %>
|
||||
<% } %>
|
||||
<% } %>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
<% } %>
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
22
App/FeatureSet/Docs/Views/Partials/OpenSourceCommitment.ejs
Normal file
@@ -0,0 +1,22 @@
|
||||
<div class=" font-medium leading-6 text-gray-900 mt-24">Our Commitment to Open Source
|
||||
</div>
|
||||
|
||||
<div class="mt-2 text-gray-900">
|
||||
<ul role="list" class="divide-y divide-gray-100 rounded-md border border-gray-200">
|
||||
<li class="items-center justify-between py-4 pl-4 pr-5 leading-6">
|
||||
<div class="items-center">
|
||||
|
||||
<div class="p-1 space-y-2">
|
||||
|
||||
|
||||
|
||||
<div>Everything we do at OneUptime is 100% open-source. You can contribute and improve this post here <a class="underline"
|
||||
target="_blank"
|
||||
href="https://github.com/OneUptime/oneuptime/tree/master/App/FeatureSet/Docs/Content/<%- githubPath -%>.md">here.</a></div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
13
App/FeatureSet/Docs/Views/Partials/Pagination.ejs
Normal file
@@ -0,0 +1,13 @@
|
||||
<dl class="mt-12 flex border-t border-slate-200 pt-6 dark:border-slate-800">
|
||||
<div class="ml-auto text-right">
|
||||
<dt class="font-display text-sm font-medium text-slate-900 dark:text-white">Next</dt>
|
||||
<dd class="mt-1"><a
|
||||
class="flex items-center gap-x-1 text-base font-semibold text-slate-500 hover:text-slate-600 dark:text-slate-400 dark:hover:text-slate-300"
|
||||
href="/docs/installation">Installation<svg viewBox="0 0 16 16" aria-hidden="true"
|
||||
class="h-4 w-4 flex-none fill-current">
|
||||
<path
|
||||
d="m9.182 13.423-1.17-1.16 3.505-3.505H3V7.065h8.517l-3.506-3.5L9.181 2.4l5.512 5.511-5.511 5.512Z">
|
||||
</path>
|
||||
</svg></a></dd>
|
||||
</div>
|
||||
</dl>
|
||||
0
App/FeatureSet/Docs/Views/ServerError.ejs
Normal file
89
App/FeatureSet/Home/API/BlogAPI.ts
Normal file
@@ -0,0 +1,89 @@
|
||||
import Express, {
|
||||
ExpressApplication,
|
||||
ExpressRequest,
|
||||
ExpressResponse,
|
||||
} from 'CommonServer/Utils/Express';
|
||||
import BlogPostUtil, { BlogPost, BlogPostHeader } from '../Utils/BlogPost';
|
||||
import { ViewsPath } from '../Utils/Config';
|
||||
import logger from 'CommonServer/Utils/Logger';
|
||||
import ServerErrorUtil from '../Utils/ServerError';
|
||||
import NotFoundUtil from '../Utils/NotFound';
|
||||
import Text from 'Common/Types/Text';
|
||||
|
||||
const app: ExpressApplication = Express.getExpressApp();
|
||||
|
||||
app.get(
|
||||
'/blog/post/:file',
|
||||
async (req: ExpressRequest, res: ExpressResponse) => {
|
||||
try {
|
||||
const fileName: string = req.params['file'] as string;
|
||||
|
||||
const blogPost: BlogPost | null = await BlogPostUtil.getBlogPost(
|
||||
fileName
|
||||
);
|
||||
|
||||
if (!blogPost) {
|
||||
return NotFoundUtil.renderNotFound(res);
|
||||
}
|
||||
|
||||
res.render(`${ViewsPath}/Blog/Post`, {
|
||||
support: false,
|
||||
footerCards: true,
|
||||
cta: true,
|
||||
blackLogo: false,
|
||||
requestDemoCta: false,
|
||||
blogPost: blogPost,
|
||||
});
|
||||
} catch (e) {
|
||||
logger.error(e);
|
||||
return ServerErrorUtil.renderServerError(res);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
// List all blog posts with tag
|
||||
|
||||
app.get(
|
||||
'/blog/tag/:tagName',
|
||||
async (req: ExpressRequest, res: ExpressResponse) => {
|
||||
try {
|
||||
const tagName: string = req.params['tagName'] as string;
|
||||
|
||||
const blogPosts: Array<BlogPostHeader> =
|
||||
await BlogPostUtil.getBlogPostList(tagName);
|
||||
|
||||
res.render(`${ViewsPath}/Blog/ListByTag`, {
|
||||
support: false,
|
||||
footerCards: true,
|
||||
cta: true,
|
||||
blackLogo: false,
|
||||
requestDemoCta: false,
|
||||
blogPosts: blogPosts,
|
||||
tagName: Text.fromDashesToPascalCase(tagName),
|
||||
});
|
||||
} catch (e) {
|
||||
logger.error(e);
|
||||
return ServerErrorUtil.renderServerError(res);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
// main blog page
|
||||
app.get('/blog', async (_req: ExpressRequest, res: ExpressResponse) => {
|
||||
try {
|
||||
const blogPosts: Array<BlogPostHeader> =
|
||||
await BlogPostUtil.getBlogPostList();
|
||||
|
||||
res.render(`${ViewsPath}/Blog/List`, {
|
||||
support: false,
|
||||
footerCards: true,
|
||||
cta: true,
|
||||
blackLogo: false,
|
||||
requestDemoCta: false,
|
||||
blogPosts: blogPosts,
|
||||
});
|
||||
} catch (e) {
|
||||
logger.error(e);
|
||||
return ServerErrorUtil.renderServerError(res);
|
||||
}
|
||||
});
|
||||
@@ -16,6 +16,11 @@ import { JSONObject } from 'Common/Types/JSON';
|
||||
import HTTPResponse from 'Common/Types/API/HTTPResponse';
|
||||
import HTTPErrorResponse from 'Common/Types/API/HTTPErrorResponse';
|
||||
import { StaticPath, ViewsPath } from './Utils/Config';
|
||||
import NotFoundUtil from './Utils/NotFound';
|
||||
import ServerErrorUtil from './Utils/ServerError';
|
||||
|
||||
// improt API
|
||||
import './API/BlogAPI';
|
||||
|
||||
const app: ExpressApplication = Express.getExpressApp();
|
||||
|
||||
@@ -30,6 +35,16 @@ app.get('/', (_req: ExpressRequest, res: ExpressResponse) => {
|
||||
});
|
||||
});
|
||||
|
||||
app.get(
|
||||
'/infrastructure-agent/install.sh',
|
||||
(_req: ExpressRequest, res: ExpressResponse) => {
|
||||
// fetch the file from https://raw.githubusercontent.com/oneuptime/infrastructure-agent/release/Scripts/Install/Linux.sh and send it as response
|
||||
res.redirect(
|
||||
'https://raw.githubusercontent.com/OneUptime/oneuptime/release/InfrastructureAgent/Scripts/Install/Linux.sh'
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
app.get('/support', async (_req: ExpressRequest, res: ExpressResponse) => {
|
||||
res.render(`${ViewsPath}/support`);
|
||||
});
|
||||
@@ -221,6 +236,15 @@ app.get('/pricing', (_req: ExpressRequest, res: ExpressResponse) => {
|
||||
enterprise: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'VM or Server Monitoring',
|
||||
plans: {
|
||||
free: true,
|
||||
growth: true,
|
||||
scale: true,
|
||||
enterprise: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'Container Monitoring',
|
||||
plans: {
|
||||
@@ -231,15 +255,6 @@ app.get('/pricing', (_req: ExpressRequest, res: ExpressResponse) => {
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
name: 'VM or Server Monitoring',
|
||||
plans: {
|
||||
free: 'Coming Soon',
|
||||
growth: 'Coming Soon',
|
||||
scale: 'Coming Soon',
|
||||
enterprise: 'Coming Soon',
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'Network Monitoring',
|
||||
plans: {
|
||||
@@ -873,25 +888,17 @@ app.get('/compare/:product', (req: ExpressRequest, res: ExpressResponse) => {
|
||||
);
|
||||
|
||||
if (!productConfig) {
|
||||
res.status(404);
|
||||
res.render(`${ViewsPath}/not-found.ejs`, {
|
||||
footerCards: false,
|
||||
support: false,
|
||||
cta: false,
|
||||
blackLogo: false,
|
||||
requestDemoCta: false,
|
||||
});
|
||||
} else {
|
||||
res.render(`${ViewsPath}/product-compare.ejs`, {
|
||||
support: false,
|
||||
footerCards: true,
|
||||
cta: true,
|
||||
blackLogo: false,
|
||||
requestDemoCta: false,
|
||||
productConfig,
|
||||
onlyShowCompareTable: false,
|
||||
});
|
||||
return NotFoundUtil.renderNotFound(res);
|
||||
}
|
||||
res.render(`${ViewsPath}/product-compare.ejs`, {
|
||||
support: false,
|
||||
footerCards: true,
|
||||
cta: true,
|
||||
blackLogo: false,
|
||||
requestDemoCta: false,
|
||||
productConfig,
|
||||
onlyShowCompareTable: false,
|
||||
});
|
||||
});
|
||||
|
||||
// Generate sitemap
|
||||
@@ -975,12 +982,9 @@ app.use(
|
||||
);
|
||||
|
||||
app.get('/*', (_req: ExpressRequest, res: ExpressResponse) => {
|
||||
res.status(404);
|
||||
res.render(`${ViewsPath}/not-found.ejs`, {
|
||||
footerCards: false,
|
||||
support: false,
|
||||
cta: false,
|
||||
blackLogo: false,
|
||||
requestDemoCta: false,
|
||||
});
|
||||
return NotFoundUtil.renderNotFound(res);
|
||||
});
|
||||
|
||||
app.get('/server-error', (_req: ExpressRequest, res: ExpressResponse) => {
|
||||
return ServerErrorUtil.renderServerError(res);
|
||||
});
|
||||
|
||||
489
App/FeatureSet/Home/Utils/BlogPost.ts
Normal file
@@ -0,0 +1,489 @@
|
||||
import HTTPResponse from 'Common/Types/API/HTTPResponse';
|
||||
import API from 'Common/Utils/API';
|
||||
import URL from 'Common/Types/API/URL';
|
||||
import { marked, Renderer } from 'marked';
|
||||
import { JSONArray, JSONObject, JSONObjectOrArray } from 'Common/Types/JSON';
|
||||
import BaseModel from 'Common/Models/BaseModel';
|
||||
import AnalyticsBaseModel from 'Common/AnalyticsModels/BaseModel';
|
||||
import LocalCache from 'CommonServer/Infrastructure/LocalCache';
|
||||
import JSONFunctions from 'Common/Types/JSONFunctions';
|
||||
import HTTPErrorResponse from 'Common/Types/API/HTTPErrorResponse';
|
||||
import OneUptimeDate from 'Common/Types/Date';
|
||||
import BadDataException from 'Common/Types/Exception/BadDataException';
|
||||
import Text from 'Common/Types/Text';
|
||||
|
||||
export interface BlogPostAuthor {
|
||||
username: string;
|
||||
githubUrl: string;
|
||||
profileImageUrl: string;
|
||||
name: string;
|
||||
}
|
||||
|
||||
export interface BlogPostBaseProps {
|
||||
title: string;
|
||||
description: string;
|
||||
|
||||
formattedPostDate: string;
|
||||
fileName: string;
|
||||
tags: string[];
|
||||
postDate: string;
|
||||
blogUrl: string;
|
||||
}
|
||||
|
||||
export interface BlogPostHeader extends BlogPostBaseProps {
|
||||
authorGitHubUsername: string;
|
||||
}
|
||||
|
||||
export interface BlogPost extends BlogPostBaseProps {
|
||||
htmlBody: string;
|
||||
markdownBody: string;
|
||||
socialMediaImageUrl: string;
|
||||
author: BlogPostAuthor | null;
|
||||
}
|
||||
|
||||
const GitHubRawUrl: string =
|
||||
'https://raw.githubusercontent.com/oneuptime/blog/master';
|
||||
|
||||
export default class BlogPostUtil {
|
||||
public static async getBlogPostList(
|
||||
tagName?: string | undefined
|
||||
): Promise<BlogPostHeader[]> {
|
||||
const fileUrl: URL = URL.fromString(`${GitHubRawUrl}/Blogs.json`);
|
||||
|
||||
const fileData:
|
||||
| HTTPResponse<
|
||||
| JSONObjectOrArray
|
||||
| BaseModel
|
||||
| BaseModel[]
|
||||
| AnalyticsBaseModel
|
||||
| AnalyticsBaseModel[]
|
||||
>
|
||||
| HTTPErrorResponse = await API.get(fileUrl);
|
||||
|
||||
if (fileData.isFailure()) {
|
||||
throw fileData as HTTPErrorResponse;
|
||||
}
|
||||
|
||||
let jsonContent: string | JSONArray =
|
||||
(fileData.data as string | JSONArray) || [];
|
||||
|
||||
if (typeof jsonContent === 'string') {
|
||||
jsonContent = JSONFunctions.parseJSONArray(jsonContent);
|
||||
}
|
||||
|
||||
const blogs: Array<JSONObject> = JSONFunctions.deserializeArray(
|
||||
jsonContent as Array<JSONObject>
|
||||
).reverse(); // reverse so new content comes first
|
||||
|
||||
const resultList: Array<BlogPostHeader> = [];
|
||||
|
||||
for (const blog of blogs) {
|
||||
const fileName: string = blog['post'] as string;
|
||||
const formattedPostDate: string =
|
||||
this.getFormattedPostDateFromFileName(fileName);
|
||||
const postDate: string = this.getPostDateFromFileName(fileName);
|
||||
|
||||
resultList.push({
|
||||
title: blog['title'] as string,
|
||||
description: blog['description'] as string,
|
||||
fileName,
|
||||
formattedPostDate,
|
||||
postDate,
|
||||
tags: blog['tags'] as string[],
|
||||
authorGitHubUsername: blog['authorGitHubUsername'] as string,
|
||||
blogUrl: `/blog/post/${fileName}`,
|
||||
});
|
||||
}
|
||||
|
||||
if (tagName) {
|
||||
return resultList.filter((blog: BlogPostHeader) => {
|
||||
return blog.tags
|
||||
.map((item: string) => {
|
||||
return Text.replaceAll(item.toLowerCase(), ' ', '-');
|
||||
})
|
||||
.includes(tagName);
|
||||
});
|
||||
}
|
||||
|
||||
return resultList;
|
||||
}
|
||||
|
||||
public static async getBlogPost(
|
||||
fileName: string
|
||||
): Promise<BlogPost | null> {
|
||||
let blogPost: BlogPost | null = this.getBlogPostFromCache(fileName);
|
||||
|
||||
// if (blogPost) {
|
||||
// return Promise.resolve(blogPost);
|
||||
// }
|
||||
|
||||
blogPost = await this.getBlogPostFromGitHub(fileName);
|
||||
|
||||
// save this to cache
|
||||
LocalCache.setJSON(
|
||||
'blog',
|
||||
fileName,
|
||||
JSONFunctions.serialize(blogPost as any)
|
||||
);
|
||||
|
||||
return blogPost;
|
||||
}
|
||||
|
||||
public static async getNameOfGitHubUser(username: string): Promise<string> {
|
||||
const fileUrl: URL = URL.fromString(
|
||||
`https://api.github.com/users/${username}`
|
||||
);
|
||||
|
||||
const fileData:
|
||||
| HTTPResponse<
|
||||
| JSONObjectOrArray
|
||||
| BaseModel
|
||||
| BaseModel[]
|
||||
| AnalyticsBaseModel
|
||||
| AnalyticsBaseModel[]
|
||||
>
|
||||
| HTTPErrorResponse = await API.get(fileUrl);
|
||||
|
||||
if (fileData.isFailure()) {
|
||||
throw fileData as HTTPErrorResponse;
|
||||
}
|
||||
|
||||
const name: string =
|
||||
(fileData.data as JSONObject)?.['name']?.toString() || '';
|
||||
return name;
|
||||
}
|
||||
|
||||
public static async getGitHubMarkdownFileContent(
|
||||
githubPath: string
|
||||
): Promise<string | null> {
|
||||
const fileUrl: URL = URL.fromString(`${GitHubRawUrl}/${githubPath}`);
|
||||
|
||||
const fileData:
|
||||
| HTTPResponse<
|
||||
| JSONObjectOrArray
|
||||
| BaseModel
|
||||
| BaseModel[]
|
||||
| AnalyticsBaseModel
|
||||
| AnalyticsBaseModel[]
|
||||
>
|
||||
| HTTPErrorResponse = await API.get(fileUrl);
|
||||
|
||||
if (fileData.isFailure()) {
|
||||
if ((fileData as HTTPErrorResponse).statusCode === 404) {
|
||||
return null;
|
||||
}
|
||||
|
||||
throw fileData as HTTPErrorResponse;
|
||||
}
|
||||
|
||||
const markdownContent: string =
|
||||
(fileData.data as JSONObject)?.['data']?.toString() || '';
|
||||
return markdownContent;
|
||||
}
|
||||
|
||||
public static async getTags(): Promise<string[]> {
|
||||
// check if tags are in cache
|
||||
let tags: string[] = LocalCache.getJSON(
|
||||
'blog-tags',
|
||||
'tags'
|
||||
) as string[];
|
||||
|
||||
if (tags && tags.length > 0) {
|
||||
return tags;
|
||||
}
|
||||
|
||||
tags = await this.getAllTagsFromGitHub();
|
||||
|
||||
// save this to cache
|
||||
|
||||
LocalCache.setJSON(
|
||||
'blog-tags',
|
||||
'tags',
|
||||
JSONFunctions.serialize(tags as any)
|
||||
);
|
||||
|
||||
return tags;
|
||||
}
|
||||
|
||||
public static async getAllTagsFromGitHub(): Promise<string[]> {
|
||||
const tagsMarkdownContent: string | null =
|
||||
await this.getGitHubMarkdownFileContent('Tags.md');
|
||||
|
||||
if (!tagsMarkdownContent) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const tags: Array<string> = tagsMarkdownContent
|
||||
.split('\n')
|
||||
.map((tag: string) => {
|
||||
return tag.trim();
|
||||
})
|
||||
.filter((tag: string) => {
|
||||
return tag.startsWith('-');
|
||||
})
|
||||
.map((tag: string) => {
|
||||
return tag.replace('-', '').trim();
|
||||
});
|
||||
|
||||
return tags;
|
||||
}
|
||||
|
||||
public static async getBlogPostFromGitHub(
|
||||
fileName: string
|
||||
): Promise<BlogPost | null> {
|
||||
const fileUrl: URL = URL.fromString(
|
||||
`${GitHubRawUrl}/posts/${fileName}/README.md`
|
||||
);
|
||||
|
||||
const postDate: string = this.getPostDateFromFileName(fileName);
|
||||
const formattedPostDate: string =
|
||||
this.getFormattedPostDateFromFileName(fileName);
|
||||
|
||||
const fileData:
|
||||
| HTTPResponse<
|
||||
| JSONObjectOrArray
|
||||
| BaseModel
|
||||
| BaseModel[]
|
||||
| AnalyticsBaseModel
|
||||
| AnalyticsBaseModel[]
|
||||
>
|
||||
| HTTPErrorResponse = await API.get(fileUrl);
|
||||
|
||||
if (fileData.isFailure()) {
|
||||
if ((fileData as HTTPErrorResponse).statusCode === 404) {
|
||||
return null;
|
||||
}
|
||||
|
||||
throw fileData as HTTPErrorResponse;
|
||||
}
|
||||
|
||||
let markdownContent: string =
|
||||
(fileData.data as JSONObject)?.['data']?.toString() || '';
|
||||
|
||||
const blogPostAuthor: BlogPostAuthor | null =
|
||||
await this.getAuthorFromFileContent(markdownContent);
|
||||
|
||||
const title: string = this.getTitleFromFileContent(markdownContent);
|
||||
const description: string =
|
||||
this.getDescriptionFromFileContent(markdownContent);
|
||||
const tags: Array<string> =
|
||||
this.getTagsFromFileContent(markdownContent);
|
||||
|
||||
markdownContent = this.getPostFromMarkdown(markdownContent);
|
||||
|
||||
const renderer: Renderer = this.getBlogRenderer();
|
||||
|
||||
const htmlBody: string = await marked(markdownContent, {
|
||||
renderer: renderer,
|
||||
});
|
||||
|
||||
const blogPost: BlogPost = {
|
||||
title,
|
||||
description,
|
||||
author: blogPostAuthor,
|
||||
htmlBody,
|
||||
markdownBody: markdownContent,
|
||||
fileName,
|
||||
tags,
|
||||
postDate,
|
||||
formattedPostDate,
|
||||
socialMediaImageUrl: `${GitHubRawUrl}/posts/${fileName}/social-media.png`,
|
||||
blogUrl: `https://oneuptime.com/blog/post/${fileName}`, // this has to be oneuptime.com because its used in twitter cards and faceboomk cards. Please dont change this.
|
||||
};
|
||||
|
||||
return blogPost;
|
||||
}
|
||||
|
||||
private static getPostDateFromFileName(fileName: string): string {
|
||||
const year: string | undefined = fileName.split('-')[0];
|
||||
const month: string | undefined = fileName.split('-')[1];
|
||||
const day: string | undefined = fileName.split('-')[2];
|
||||
|
||||
if (!year || !month || !day) {
|
||||
throw new BadDataException('Invalid file name');
|
||||
}
|
||||
|
||||
return `${year}-${month}-${day}`;
|
||||
}
|
||||
|
||||
private static getFormattedPostDateFromFileName(fileName: string): string {
|
||||
// file name is of the format YYYY-MM-DD-Title.md
|
||||
const year: string | undefined = fileName.split('-')[0];
|
||||
const month: string | undefined = fileName.split('-')[1];
|
||||
const day: string | undefined = fileName.split('-')[2];
|
||||
|
||||
if (!year || !month || !day) {
|
||||
throw new BadDataException('Invalid file name');
|
||||
}
|
||||
|
||||
const date: Date = OneUptimeDate.getDateFromYYYYMMDD(year, month, day);
|
||||
return OneUptimeDate.getDateAsLocalFormattedString(date, true);
|
||||
}
|
||||
|
||||
private static getBlogRenderer(): Renderer {
|
||||
const renderer: Renderer = new Renderer();
|
||||
|
||||
renderer.paragraph = function (text) {
|
||||
return `<p class="mt-2 mb-2 leading-8 text-gray-600">${text}</p>`;
|
||||
};
|
||||
|
||||
renderer.blockquote = function (quote) {
|
||||
return `<blockquote class="p-4 pt-1 pb-1 my-4 border-s-4 border-indigo-500">
|
||||
<div class="leading-8 text-gray-600">${quote}</div>
|
||||
</blockquote>`;
|
||||
};
|
||||
|
||||
renderer.code = function (code, language) {
|
||||
return `<pre class="language-${language} rounded-md"><code class="language-${language} rounded-md">${code}</code></pre>`;
|
||||
};
|
||||
|
||||
renderer.heading = function (text, level) {
|
||||
if (level === 1) {
|
||||
return `<h1 class="my-5 mt-8 text-4xl font-bold tracking-tight text-gray-800">${text}</h1>`;
|
||||
} else if (level === 2) {
|
||||
return `<h2 class="my-5 mt-8 text-3xl font-bold tracking-tight text-gray-800">${text}</h2>`;
|
||||
} else if (level === 3) {
|
||||
return `<h3 class="my-5 mt-8 text-2xl font-bold tracking-tight text-gray-800">${text}</h3>`;
|
||||
} else if (level === 4) {
|
||||
return `<h4 class="my-5 mt-8 text-xl font-bold tracking-tight text-gray-800">${text}</h4>`;
|
||||
} else if (level === 5) {
|
||||
return `<h5 class="my-5 mt-8 text-lg font-bold tracking-tight text-gray-800">${text}</h5>`;
|
||||
}
|
||||
return `<h6 class="my-5 tracking-tight font-bold text-gray-800">${text}</h6>`;
|
||||
};
|
||||
|
||||
return renderer;
|
||||
}
|
||||
|
||||
private static getPostFromMarkdown(markdownContent: string): string {
|
||||
const authorLine: string | undefined = markdownContent
|
||||
.split('\n')
|
||||
.find((line: string) => {
|
||||
return line.startsWith('Author:');
|
||||
});
|
||||
const titleLine: string | undefined = markdownContent
|
||||
.split('\n')
|
||||
.find((line: string) => {
|
||||
return line.startsWith('#');
|
||||
});
|
||||
const descriptionLine: string | undefined =
|
||||
markdownContent.split('\n').find((line: string) => {
|
||||
return line.startsWith('Description:');
|
||||
}) || '';
|
||||
|
||||
const tagsLine: string | undefined =
|
||||
markdownContent.split('\n').find((line: string) => {
|
||||
return line.startsWith('Tags:');
|
||||
}) || '';
|
||||
|
||||
if (!authorLine && !titleLine && !descriptionLine && !tagsLine) {
|
||||
return markdownContent;
|
||||
}
|
||||
|
||||
const lines: string[] = markdownContent.split('\n');
|
||||
|
||||
if (authorLine) {
|
||||
const authorLineIndex: number = lines.indexOf(authorLine);
|
||||
lines.splice(authorLineIndex, 1);
|
||||
}
|
||||
|
||||
if (titleLine) {
|
||||
const titleLineIndex: number = lines.indexOf(titleLine);
|
||||
lines.splice(titleLineIndex, 1);
|
||||
}
|
||||
|
||||
if (descriptionLine) {
|
||||
const descriptionLineIndex: number = lines.indexOf(descriptionLine);
|
||||
lines.splice(descriptionLineIndex, 1);
|
||||
}
|
||||
|
||||
if (tagsLine) {
|
||||
const tagsLineIndex: number = lines.indexOf(tagsLine);
|
||||
lines.splice(tagsLineIndex, 1);
|
||||
}
|
||||
|
||||
return lines.join('\n').trim();
|
||||
}
|
||||
|
||||
public static getBlogPostFromCache(fileName: string): BlogPost | null {
|
||||
const blogPost: BlogPost | null = LocalCache.getJSON(
|
||||
'blog',
|
||||
fileName
|
||||
) as BlogPost | null;
|
||||
return blogPost;
|
||||
}
|
||||
|
||||
public static getTitleFromFileContent(fileContent: string): string {
|
||||
// title is the first line that stars with "#"
|
||||
|
||||
const titleLine: string =
|
||||
fileContent
|
||||
.split('\n')
|
||||
.find((line: string) => {
|
||||
return line.startsWith('#');
|
||||
})
|
||||
?.replace('#', '') || 'OneUptime Blog';
|
||||
|
||||
return titleLine;
|
||||
}
|
||||
|
||||
public static getTagsFromFileContent(fileContent: string): string[] {
|
||||
// tags is the first line that starts with "Tags:"
|
||||
|
||||
const tagsLine: string | undefined =
|
||||
fileContent
|
||||
.split('\n')
|
||||
.find((line: string) => {
|
||||
return line.startsWith('Tags:');
|
||||
})
|
||||
?.replace('Tags:', '') || '';
|
||||
|
||||
return tagsLine.split(',').map((tag: string) => {
|
||||
return tag.trim();
|
||||
});
|
||||
}
|
||||
|
||||
public static getDescriptionFromFileContent(fileContent: string): string {
|
||||
// description is the first line that starts with ">"
|
||||
|
||||
const descriptionLine: string | undefined =
|
||||
fileContent
|
||||
.split('\n')
|
||||
.find((line: string) => {
|
||||
return line.startsWith('Description:');
|
||||
})
|
||||
?.replace('Description:', '') || '';
|
||||
|
||||
return descriptionLine;
|
||||
}
|
||||
|
||||
public static async getAuthorFromFileContent(
|
||||
fileContent: string
|
||||
): Promise<BlogPostAuthor | null> {
|
||||
// author line is in this format: Author: [username](githubUrl)
|
||||
|
||||
const authorLine: string | undefined = fileContent
|
||||
.split('\n')
|
||||
.find((line: string) => {
|
||||
return line.startsWith('Author:');
|
||||
});
|
||||
const authorUsername: string | undefined = authorLine
|
||||
?.split('[')[1]
|
||||
?.split(']')[0];
|
||||
const authorGitHubUrl: string | undefined = authorLine
|
||||
?.split('(')[1]
|
||||
?.split(')')[0];
|
||||
const authorProfileImageUrl: string = `https://avatars.githubusercontent.com/${authorUsername}`;
|
||||
|
||||
if (!authorUsername || !authorGitHubUrl) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return {
|
||||
username: authorUsername,
|
||||
githubUrl: authorGitHubUrl,
|
||||
profileImageUrl: authorProfileImageUrl,
|
||||
name: await this.getNameOfGitHubUser(authorUsername),
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -1,2 +1,2 @@
|
||||
export const ViewsPath: string = '/usr/src/app/FeatureSet/Home/views';
|
||||
export const ViewsPath: string = '/usr/src/app/FeatureSet/Home/Views';
|
||||
export const StaticPath: string = '/usr/src/app/FeatureSet/Home/Static';
|
||||
|
||||
15
App/FeatureSet/Home/Utils/NotFound.ts
Normal file
@@ -0,0 +1,15 @@
|
||||
import { ExpressResponse } from 'CommonServer/Utils/Express';
|
||||
import { ViewsPath } from './Config';
|
||||
|
||||
export default class NotFoundUtil {
|
||||
public static renderNotFound(res: ExpressResponse): void {
|
||||
res.status(404);
|
||||
res.render(`${ViewsPath}/not-found.ejs`, {
|
||||
footerCards: false,
|
||||
support: false,
|
||||
cta: false,
|
||||
blackLogo: false,
|
||||
requestDemoCta: false,
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -58,7 +58,7 @@ export default (product: string): Product => {
|
||||
{
|
||||
question:
|
||||
'Do I need to buy a monitoring solution to monitor my resources?',
|
||||
answer: 'PagerDuty needs a seperate monitoring solution that you need to buy which then sends data to PagerDuty for on-call and incident management. OneUptime has a built in monitoring solution as well. You use one product, your team has one dashboard, save time, simplify ops.',
|
||||
answer: 'PagerDuty needs a separate monitoring solution that you need to buy which then sends data to PagerDuty for on-call and incident management. OneUptime has a built in monitoring solution as well. You use one product, your team has one dashboard, save time, simplify ops.',
|
||||
},
|
||||
{
|
||||
question:
|
||||
@@ -215,7 +215,7 @@ export default (product: string): Product => {
|
||||
{
|
||||
question:
|
||||
'Do I need to buy a monitoring solution to monitor my resources?',
|
||||
answer: 'StatusPage.io needs a seperate monitoring solution that you need to buy which then sends data to StatusPage.io. OneUptime has a built in monitoring solution as well. You use one product, your team has one dashboard, save time, simplify ops.',
|
||||
answer: 'StatusPage.io needs a separate monitoring solution that you need to buy which then sends data to StatusPage.io. OneUptime has a built in monitoring solution as well. You use one product, your team has one dashboard, save time, simplify ops.',
|
||||
},
|
||||
{
|
||||
question:
|
||||
|
||||
15
App/FeatureSet/Home/Utils/ServerError.ts
Normal file
@@ -0,0 +1,15 @@
|
||||
import { ExpressResponse } from 'CommonServer/Utils/Express';
|
||||
import { ViewsPath } from './Config';
|
||||
|
||||
export default class ServerErrorUtil {
|
||||
public static renderServerError(res: ExpressResponse): void {
|
||||
res.status(500);
|
||||
res.render(`${ViewsPath}/server-error.ejs`, {
|
||||
footerCards: false,
|
||||
support: false,
|
||||
cta: false,
|
||||
blackLogo: false,
|
||||
requestDemoCta: false,
|
||||
});
|
||||
}
|
||||
}
|
||||
60
App/FeatureSet/Home/Views/Blog/List.ejs
Normal file
@@ -0,0 +1,60 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" id="home">
|
||||
|
||||
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
|
||||
|
||||
<head>
|
||||
<title>
|
||||
OneUptime Blog - Latest posts on Observability, Monitoring, Reliability and more.
|
||||
</title>
|
||||
<meta name="description" content="Learn more about Observability, Monitoring, Reliability and more.">
|
||||
<%- include('../head') -%>
|
||||
|
||||
|
||||
</head>
|
||||
|
||||
|
||||
<body>
|
||||
<%- include('../nav') -%>
|
||||
|
||||
<div class="relative isolate overflow-hidden bg-white">
|
||||
<div class="py-24 sm:py-32">
|
||||
|
||||
<%- include('./Partials/BlogTitleAndDescription', { title: 'Engineering Uptime - Blog by OneUptime', description: 'Latest posts on Observability, Monitoring, Reliability and more.' }) -%>
|
||||
|
||||
<div class="mx-auto max-w-7xl px-6 lg:px-8">
|
||||
|
||||
<div>
|
||||
|
||||
<% if(blogPosts.length> 0){ %>
|
||||
<ul role="list" class="divide-y divide-gray-100 list-none">
|
||||
|
||||
<% for(var i=0; i<blogPosts.length; i++) {%>
|
||||
|
||||
|
||||
|
||||
<%- include('./Partials/ListItem', { blogPost: blogPosts[i] }) -%>
|
||||
|
||||
<% } %>
|
||||
|
||||
</ul>
|
||||
<% } %>
|
||||
|
||||
<%- include('./Partials/OpenSourceCommitment', {blogPost: null}) -%>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<%- include('./Partials/BlogCta') -%>
|
||||
<%- include('../footer') -%>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
59
App/FeatureSet/Home/Views/Blog/ListByTag.ejs
Normal file
@@ -0,0 +1,59 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" id="home">
|
||||
|
||||
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
|
||||
|
||||
<head>
|
||||
<title>
|
||||
OneUptime Blog - Latest posts on Observability, Monitoring, Reliability and more.
|
||||
</title>
|
||||
<meta name="description" content="Learn more about Observability, Monitoring, Reliability and more.">
|
||||
<%- include('../head') -%>
|
||||
|
||||
|
||||
</head>
|
||||
|
||||
|
||||
<body>
|
||||
<%- include('../nav') -%>
|
||||
|
||||
<div class="relative isolate overflow-hidden bg-white">
|
||||
<div class="py-24 sm:py-32">
|
||||
|
||||
<%- include('./Partials/BlogTitleAndDescription', { title: 'Latest posts on '+tagName, description: 'Here are some of the latest posts on '+tagName }) -%>
|
||||
|
||||
<div class="mx-auto max-w-7xl px-6 lg:px-8">
|
||||
|
||||
<div>
|
||||
|
||||
<% if(blogPosts.length> 0){ %>
|
||||
<ul role="list" class="divide-y divide-gray-100 list-none">
|
||||
|
||||
<% for(var i=0; i<blogPosts.length; i++) {%>
|
||||
|
||||
|
||||
|
||||
<%- include('./Partials/ListItem', { blogPost: blogPosts[i] }) -%>
|
||||
|
||||
<% } %>
|
||||
|
||||
</ul>
|
||||
<% } %>
|
||||
|
||||
</div>
|
||||
<%- include('./Partials/OpenSourceCommitment', {blogPost: null}) -%>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<%- include('./Partials/BlogCta') -%>
|
||||
<%- include('../footer') -%>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
16
App/FeatureSet/Home/Views/Blog/Partials/BlogCta.ejs
Normal file
@@ -0,0 +1,16 @@
|
||||
|
||||
<div class="border-t border-gray-900/10 pt-8"></div>
|
||||
<div class="relative isolate overflow-hidden bg-white">
|
||||
<div class="py-16">
|
||||
<div class="mx-auto max-w-8xl px-6 lg:px-8">
|
||||
<div class="mx-auto max-w-4xl text-center">
|
||||
<h1 class="text-3xl font-bold tracking-tight text-gray-900">OneUptime is open source observability platform.</h1>
|
||||
<p class="mt-6 text-lg leading-8 text-gray-600">Monitor, Observe, Debug, Resolve. Everything you need to build reliable software in one open source platform. Get started for free today.</p>
|
||||
<div class="mt-10 flex items-center justify-center gap-x-6">
|
||||
<a href="/accounts/register" class="rounded-md bg-indigo-600 px-3.5 py-2.5 text-sm font-semibold text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600">Get started</a>
|
||||
<a href="/enterprise/demo" class="text-sm font-semibold leading-6 text-gray-900">Request Demo <span aria-hidden="true">→</span></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,10 @@
|
||||
<div class="mb-24">
|
||||
<div class="mx-auto flex justify-center text-center ">
|
||||
<h1 class="max-w-2xl text-center text-4xl font-bold tracking-tight text-gray-900">
|
||||
<%= title %>
|
||||
</h1>
|
||||
</div>
|
||||
<p class="text-xl text-center leading-8 text-gray-600 mt-8">
|
||||
<%= description %>
|
||||
</p>
|
||||
</div>
|
||||
33
App/FeatureSet/Home/Views/Blog/Partials/ListItem.ejs
Normal file
@@ -0,0 +1,33 @@
|
||||
<li class="py-5">
|
||||
<div class="min-w-0">
|
||||
<a href="<%= blogPost.blogUrl %>">
|
||||
|
||||
<div class="min-w-0 flex-auto">
|
||||
<p class="font-semibold text-2xl leading-6 text-gray-900">
|
||||
<%= blogPost.title %>
|
||||
</p>
|
||||
<p class="mt-2 leading-5 text-gray-600">
|
||||
<%= blogPost.description %>
|
||||
</p>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
<div class="-mt-5">
|
||||
<%- include('./Tags', { blogPost: blogPost }) -%>
|
||||
</div>
|
||||
<div class="mt-5">
|
||||
<div class="">
|
||||
|
||||
<a href="https://github.com/<%- blogPost.authorGitHubUsername -%>" target="_blank">
|
||||
<div class="flex items-center gap-x-6">
|
||||
<p class="text-sm font-medium leading-7 tracking-tight text-gray-600">
|
||||
<span class="text-gray-500">By</span> @<%- blogPost.authorGitHubUsername -%> <span
|
||||
class="text-gray-500"> on
|
||||
<%- blogPost.formattedPostDate -%></span>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</li>
|
||||
@@ -0,0 +1,29 @@
|
||||
<div class=" font-medium leading-6 text-gray-900 mt-24">Our Commitment to Open Source
|
||||
</div>
|
||||
|
||||
<div class="mt-2 text-gray-900">
|
||||
<ul role="list" class="divide-y divide-gray-100 rounded-md border border-gray-200">
|
||||
<li class="items-center justify-between py-4 pl-4 pr-5 leading-6">
|
||||
<div class="items-center">
|
||||
|
||||
<div class="p-1 space-y-2">
|
||||
|
||||
|
||||
|
||||
<div>Everything we do at OneUptime is 100% open-source. You can contribute by writing a post just like this.
|
||||
Please check contributing guidelines <a class="underline"
|
||||
target="_blank"
|
||||
href="https://github.com/oneuptime/blog">here.</a></div>
|
||||
|
||||
<% if(blogPost){%>
|
||||
|
||||
<div>If you wish to contribute to this post, you can make edits and improve it <a
|
||||
class="underline" target="_blank"
|
||||
href="https://github.com/oneuptime/blog/tree/master/posts/<%- blogPost.fileName -%>">here</a>.</div>
|
||||
<% } %>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
22
App/FeatureSet/Home/Views/Blog/Partials/Tags.ejs
Normal file
@@ -0,0 +1,22 @@
|
||||
<% if(blogPost.tags.length> 0){ %>
|
||||
<div class="flex mt-10">
|
||||
<div class="space-x-1">
|
||||
<!-- Loop over blogPost.tags and show them here-->
|
||||
<% for(var i=0; i<blogPost.tags.length; i++) {%>
|
||||
<a href="/blog/tag/<%- blogPost.tags[i].replaceAll(' ','-').toLowerCase() -%>">
|
||||
<div
|
||||
class="relative inline-flex items-center rounded-full border border-gray-300 px-3 py-0.5 text-sm">
|
||||
<div class="absolute flex flex-shrink-0 items-center justify-center">
|
||||
<div class="h-1.5 w-1.5 rounded-full bg-indigo-500" aria-hidden="true">
|
||||
</div>
|
||||
</div>
|
||||
<div class="ml-3.5 font-medium text-gray-900">
|
||||
<%- blogPost.tags[i] -%>
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
|
||||
<% } %>
|
||||
</div>
|
||||
</div>
|
||||
<% } %>
|
||||
125
App/FeatureSet/Home/Views/Blog/Post.ejs
Normal file
@@ -0,0 +1,125 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" id="home">
|
||||
|
||||
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
|
||||
|
||||
<head>
|
||||
<title>
|
||||
<%= blogPost.title %>
|
||||
</title>
|
||||
<meta name="description" content="<%= blogPost.description %>">
|
||||
<%- include('../head-basic') -%>
|
||||
<link rel="canonical" href="https://oneuptime.com/blog/post/<%= blogPost.fileName %>" />
|
||||
<meta property="og:site_name" content="OneUptime | One Complete Observability platform.">
|
||||
<meta property="og:type" content="article">
|
||||
<meta property="og:title" content="<%= blogPost.title %>">
|
||||
<meta property="og:description" content="<%= blogPost.description %>">
|
||||
<meta property="og:url" content="<%= blogPost.blogUrl %>">
|
||||
<meta property="og:image" content="<%= blogPost.socialMediaImageUrl %>">
|
||||
<meta property="article:published_time" content="<%- blogPost.postDate -%>T00:00:00.000Z">
|
||||
<meta property="article:modified_time" content="<%- blogPost.postDate -%>T00:00:00.000Z">
|
||||
<meta property="article:publisher" content="https://www.facebook.com/OneUptime">
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:title" content="<%= blogPost.title %>">
|
||||
<meta name="twitter:description" content="<%= blogPost.description %>">
|
||||
<meta name="twitter:url" content="<%= blogPost.blogUrl %>">
|
||||
<meta name="twitter:image" content="<%= blogPost.socialMediaImageUrl %>">
|
||||
<meta name="twitter:label1" content="Written by">
|
||||
<meta name="twitter:data1" content="<%= blogPost.author.name %>">
|
||||
<meta name="twitter:site" content="@OneUptimeHQ">
|
||||
<meta property="og:image:width" content="1280">
|
||||
<meta property="og:image:height" content="720">
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Article",
|
||||
"publisher": {
|
||||
"@type": "Organization",
|
||||
"name": "OneUptime",
|
||||
"url": "https://oneuptime.com/",
|
||||
"logo": {
|
||||
"@type": "ImageObject",
|
||||
"url": "https://oneuptime.com/img/OneUptimePNG/1.png",
|
||||
"width": 60,
|
||||
"height": 60
|
||||
}
|
||||
},
|
||||
"author": {
|
||||
"@type": "Person",
|
||||
"name": "<%= blogPost.author.name %>",
|
||||
"url": "<%= blogPost.author.githubUrl %>",
|
||||
"sameAs": []
|
||||
},
|
||||
"headline": "<%= blogPost.title %>",
|
||||
"url": "<%= blogPost.blogUrl %>",
|
||||
"datePublished": "<%- blogPost.postDate -%>T00:00:00.000Z",
|
||||
"dateModified": "<%- blogPost.postDate -%>T00:00:00.000Z",
|
||||
"description": "<%- blogPost.description -%>",
|
||||
"mainEntityOfPage": "<%= blogPost.blogUrl %>"
|
||||
}
|
||||
</script>
|
||||
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/a11y-dark.min.css">
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
|
||||
<script>hljs.highlightAll();</script>
|
||||
|
||||
</head>
|
||||
|
||||
|
||||
<body>
|
||||
<%- include('../nav') -%>
|
||||
|
||||
<div class="relative isolate overflow-hidden bg-white">
|
||||
<div class="py-24 sm:py-32">
|
||||
<div class="mx-auto max-w-7xl px-6 lg:px-8">
|
||||
|
||||
<%- include('./Partials/BlogTitleAndDescription', { title: blogPost.title , description:
|
||||
blogPost.description }) -%>
|
||||
|
||||
|
||||
<div class="blog-body">
|
||||
<%- blogPost.htmlBody -%>
|
||||
</div>
|
||||
|
||||
<%- include('./Partials/Tags', { blogPost: blogPost }) -%>
|
||||
|
||||
<div class="bg-white my-10 mt-20">
|
||||
<div class="">
|
||||
<ul role="list" class="">
|
||||
<li>
|
||||
<a href="<%- blogPost.author.githubUrl -%>" target="_blank">
|
||||
<div class="flex items-center gap-x-6">
|
||||
<img class="h-12 w-12 rounded-full"
|
||||
src="<%- blogPost.author.profileImageUrl -%>" alt="">
|
||||
<div class="-ml-4">
|
||||
<h3
|
||||
class="text-base font-medium leading-7 tracking-tight text-gray-600">
|
||||
<span class="text-gray-500">By</span> <%-
|
||||
blogPost.author.name -%> <span class="text-gray-500"> on
|
||||
<%- blogPost.formattedPostDate -%></span>
|
||||
</h3>
|
||||
<p class="text-sm font-medium leading-6 text-indigo-500 -mt-1">
|
||||
@<%- blogPost.author.username -%></p>
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<%- include('./Partials/OpenSourceCommitment', { blogPost: blogPost }) -%>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<%- include('./Partials/BlogCta') -%>
|
||||
<%- include('../footer') -%>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
Before Width: | Height: | Size: 231 B After Width: | Height: | Size: 231 B |
|
Before Width: | Height: | Size: 392 B After Width: | Height: | Size: 392 B |
@@ -34,7 +34,7 @@
|
||||
class="relative -m-2 rounded-xl bg-gray-900/5 p-2 ring-1 ring-inset ring-gray-900/10 lg:-m-4 lg:rounded-2xl lg:p-4">
|
||||
<img src="/img/apm-3.png" alt="App screenshot" width="2432" height="1442"
|
||||
class="rounded-md shadow-2xl ring-1 ring-gray-900/10">
|
||||
<!-- <%- include('./partials/watch-demo.ejs', {videoId: "F6BNipy5VCk" }) -%> -->
|
||||
<!-- <%- include('./Partials/watch-demo.ejs', {videoId: "F6BNipy5VCk" }) -%> -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -399,7 +399,7 @@
|
||||
<%- include('features-table') -%>
|
||||
<%- include('cta') -%>
|
||||
<%- include('footer') -%>
|
||||
<%- include('./partials/video-script') -%>
|
||||
<%- include('./Partials/video-script') -%>
|
||||
|
||||
</body>
|
||||
|
||||
@@ -266,7 +266,7 @@
|
||||
|
||||
|
||||
|
||||
<%- include('./partials/security') -%>
|
||||
<%- include('./Partials/security') -%>
|
||||
|
||||
<%- include('testimonials') -%>
|
||||
<div class="mt-24">
|
||||
@@ -30,49 +30,49 @@
|
||||
<ul role="list" class="mt-6 space-y-4">
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
<span class="text-sm text-gray-500"> Unlimited Public Status Pages</span>
|
||||
</li>
|
||||
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
<span class="text-sm text-gray-500">Unlimited Private Status Pages</span>
|
||||
</li>
|
||||
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
<span class="text-sm text-gray-500">Unlimited Subscribers</span>
|
||||
</li>
|
||||
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
<span class="text-sm text-gray-500">Custom Domain Support</span>
|
||||
</li>
|
||||
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
<span class="text-sm text-gray-500">Custom Branding</span>
|
||||
</li>
|
||||
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
<span class="text-sm text-gray-500">Post Announcements</span>
|
||||
</li>
|
||||
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
<span class="text-sm text-gray-500">Post Incidents</span>
|
||||
</li>
|
||||
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
<span class="text-sm text-gray-500">Scheduled Maintenance</span>
|
||||
</li>
|
||||
</ul>
|
||||
@@ -80,7 +80,7 @@
|
||||
<ul role="list" class="mt-6 space-y-4">
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<%- include('./partials/comingsoon-icon') %>
|
||||
<%- include('./Partials/comingsoon-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/comingsoon-icon') %>
|
||||
<%- include('./Partials/comingsoon-icon') %>
|
||||
|
||||
|
||||
<span class="text-sm text-gray-500">SLA Certificates</span>
|
||||
@@ -97,7 +97,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/comingsoon-icon') %>
|
||||
<%- include('./Partials/comingsoon-icon') %>
|
||||
|
||||
|
||||
<span class="text-sm text-gray-500">RSS Feeds</span>
|
||||
@@ -134,55 +134,55 @@
|
||||
<ul role="list" class="mt-6 space-y-4">
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
<span class="text-sm text-gray-500">Integrates with monitoring tool</span>
|
||||
</li>
|
||||
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
<span class="text-sm text-gray-500">Show Incident on Status Page</span>
|
||||
</li>
|
||||
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
<span class="text-sm text-gray-500">See Root Cause</span>
|
||||
</li>
|
||||
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
<span class="text-sm text-gray-500">Custom Incident States</span>
|
||||
</li>
|
||||
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
<span class="text-sm text-gray-500">Custom Incident Severity</span>
|
||||
</li>
|
||||
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
<span class="text-sm text-gray-500">Post Public Postmortem</span>
|
||||
</li>
|
||||
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
<span class="text-sm text-gray-500">Private Postmortem Notes</span>
|
||||
</li>
|
||||
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
<span class="text-sm text-gray-500">Integrate with Slack</span>
|
||||
</li>
|
||||
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
<span class="text-sm text-gray-500">5000+ integrations</span>
|
||||
</li>
|
||||
|
||||
@@ -190,7 +190,7 @@
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -199,7 +199,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
|
||||
|
||||
<span class="text-sm text-gray-500">Active Monitoring</span>
|
||||
@@ -207,7 +207,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
|
||||
|
||||
<span class="text-sm text-gray-500">On-Call Rotation</span>
|
||||
@@ -215,7 +215,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
|
||||
|
||||
<span class="text-sm text-gray-500">Call & SMS Alerts</span>
|
||||
@@ -253,13 +253,13 @@
|
||||
<h3 class="text-sm font-medium text-gray-900">What's included</h3>
|
||||
<ul role="list" class="mt-6 space-y-4">
|
||||
<li class="flex space-x-3">
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
<span class="text-sm text-gray-500"> Static Monitors </span>
|
||||
</li>
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -270,7 +270,7 @@
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -279,7 +279,7 @@
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -289,7 +289,7 @@
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -298,7 +298,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -307,13 +307,22 @@
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
|
||||
|
||||
|
||||
<span class="text-sm text-gray-500">On-Call and Alerts</span>
|
||||
</li>
|
||||
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
|
||||
|
||||
|
||||
<span class="text-sm text-gray-500">Monitor VM's & Servers</span>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -324,18 +333,11 @@
|
||||
|
||||
|
||||
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<%- include('./partials/comingsoon-icon') %>
|
||||
|
||||
|
||||
|
||||
<span class="text-sm text-gray-500">Monitor VM's & Servers</span>
|
||||
</li>
|
||||
|
||||
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<%- include('./partials/comingsoon-icon') %>
|
||||
<%- include('./Partials/comingsoon-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -344,7 +346,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<%- include('./partials/comingsoon-icon') %>
|
||||
<%- include('./Partials/comingsoon-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -353,7 +355,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<%- include('./partials/comingsoon-icon') %>
|
||||
<%- include('./Partials/comingsoon-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -398,7 +400,7 @@
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -408,7 +410,7 @@
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -418,7 +420,7 @@
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -428,7 +430,7 @@
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -437,7 +439,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -447,7 +449,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -455,7 +457,7 @@
|
||||
</li>
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -463,7 +465,7 @@
|
||||
</li>
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -474,7 +476,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<%- include('./partials/comingsoon-icon') %>
|
||||
<%- include('./Partials/comingsoon-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -487,7 +489,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<%- include('./partials/comingsoon-icon') %>
|
||||
<%- include('./Partials/comingsoon-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -498,7 +500,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<%- include('./partials/comingsoon-icon') %>
|
||||
<%- include('./Partials/comingsoon-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -553,7 +555,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
|
||||
|
||||
<span class="text-sm text-gray-500">Ingest with OpenTelemetry</span>
|
||||
@@ -561,7 +563,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
|
||||
|
||||
<span class="text-sm text-gray-500">Ingest with Fluentd</span>
|
||||
@@ -569,7 +571,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
|
||||
|
||||
<span class="text-sm text-gray-500">Ingest +1000 Sources</span>
|
||||
@@ -578,7 +580,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -587,7 +589,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -596,7 +598,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
|
||||
|
||||
<span class="text-sm text-gray-500">Custom Queries</span>
|
||||
@@ -605,7 +607,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
|
||||
|
||||
<span class="text-sm text-gray-500">Security and Compliance</span>
|
||||
@@ -613,7 +615,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
|
||||
|
||||
<span class="text-sm text-gray-500">Advanced Workflows</span>
|
||||
@@ -621,7 +623,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
|
||||
|
||||
<span class="text-sm text-gray-500">Integrate with Slack / Teams</span>
|
||||
@@ -634,7 +636,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/comingsoon-icon') %>
|
||||
<%- include('./Partials/comingsoon-icon') %>
|
||||
|
||||
|
||||
<span class="text-sm text-gray-500">Alerting</span>
|
||||
@@ -643,7 +645,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/comingsoon-icon') %>
|
||||
<%- include('./Partials/comingsoon-icon') %>
|
||||
|
||||
|
||||
<span class="text-sm text-gray-500">Export to Data Warehouse</span>
|
||||
@@ -684,14 +686,14 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
|
||||
|
||||
<span class="text-sm text-gray-500">Ingest with OpenTelemetry</span>
|
||||
</li>
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
|
||||
|
||||
<span class="text-sm text-gray-500">APM with OpenTelemetry</span>
|
||||
@@ -700,7 +702,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
|
||||
|
||||
<span class="text-sm text-gray-500">Cross Microservice Visibility</span>
|
||||
@@ -708,7 +710,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
|
||||
|
||||
<span class="text-sm text-gray-500">Distributed Tracing</span>
|
||||
@@ -716,7 +718,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
|
||||
|
||||
<span class="text-sm text-gray-500">Deployment Tracking</span>
|
||||
@@ -724,7 +726,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
|
||||
|
||||
<span class="text-sm text-gray-500">Frontend Monitoring</span>
|
||||
@@ -732,7 +734,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
|
||||
|
||||
<span class="text-sm text-gray-500">Backend Monitoring</span>
|
||||
@@ -740,7 +742,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
|
||||
|
||||
<span class="text-sm text-gray-500">Query Monitoring</span>
|
||||
@@ -748,7 +750,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
|
||||
|
||||
<span class="text-sm text-gray-500">Code Level Tracing</span>
|
||||
@@ -759,7 +761,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/tick-icon') %>
|
||||
<%- include('./Partials/tick-icon') %>
|
||||
|
||||
|
||||
<span class="text-sm text-gray-500">Integrate with Slack / Teams</span>
|
||||
@@ -772,7 +774,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
<!-- Heroicon name: mini/check -->
|
||||
<%- include('./partials/comingsoon-icon') %>
|
||||
<%- include('./Partials/comingsoon-icon') %>
|
||||
|
||||
|
||||
<span class="text-sm text-gray-500">Advanced Workflows</span>
|
||||
@@ -811,7 +813,7 @@
|
||||
<ul role="list" class="mt-6 space-y-4">
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<%- include('./partials/comingsoon-icon') %>
|
||||
<%- include('./Partials/comingsoon-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -819,7 +821,7 @@
|
||||
</li>
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<%- include('./partials/comingsoon-icon') %>
|
||||
<%- include('./Partials/comingsoon-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -828,7 +830,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<%- include('./partials/comingsoon-icon') %>
|
||||
<%- include('./Partials/comingsoon-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -837,7 +839,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<%- include('./partials/comingsoon-icon') %>
|
||||
<%- include('./Partials/comingsoon-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -846,7 +848,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<%- include('./partials/comingsoon-icon') %>
|
||||
<%- include('./Partials/comingsoon-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -855,7 +857,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<%- include('./partials/comingsoon-icon') %>
|
||||
<%- include('./Partials/comingsoon-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -864,7 +866,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<%- include('./partials/comingsoon-icon') %>
|
||||
<%- include('./Partials/comingsoon-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -873,7 +875,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<%- include('./partials/comingsoon-icon') %>
|
||||
<%- include('./Partials/comingsoon-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -882,7 +884,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<%- include('./partials/comingsoon-icon') %>
|
||||
<%- include('./Partials/comingsoon-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -891,7 +893,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<%- include('./partials/comingsoon-icon') %>
|
||||
<%- include('./Partials/comingsoon-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -900,7 +902,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<%- include('./partials/comingsoon-icon') %>
|
||||
<%- include('./Partials/comingsoon-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -944,7 +946,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<%- include('./partials/comingsoon-icon') %>
|
||||
<%- include('./Partials/comingsoon-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -953,7 +955,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<%- include('./partials/comingsoon-icon') %>
|
||||
<%- include('./Partials/comingsoon-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -962,7 +964,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<%- include('./partials/comingsoon-icon') %>
|
||||
<%- include('./Partials/comingsoon-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -973,7 +975,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<%- include('./partials/comingsoon-icon') %>
|
||||
<%- include('./Partials/comingsoon-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -982,7 +984,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<%- include('./partials/comingsoon-icon') %>
|
||||
<%- include('./Partials/comingsoon-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -991,7 +993,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<%- include('./partials/comingsoon-icon') %>
|
||||
<%- include('./Partials/comingsoon-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -1001,7 +1003,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<%- include('./partials/comingsoon-icon') %>
|
||||
<%- include('./Partials/comingsoon-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -1010,7 +1012,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<%- include('./partials/comingsoon-icon') %>
|
||||
<%- include('./Partials/comingsoon-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -1019,7 +1021,7 @@
|
||||
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<%- include('./partials/comingsoon-icon') %>
|
||||
<%- include('./Partials/comingsoon-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -1027,7 +1029,7 @@
|
||||
</li>
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<%- include('./partials/comingsoon-icon') %>
|
||||
<%- include('./Partials/comingsoon-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -1035,7 +1037,7 @@
|
||||
</li>
|
||||
<li class="flex space-x-3">
|
||||
|
||||
<%- include('./partials/comingsoon-icon') %>
|
||||
<%- include('./Partials/comingsoon-icon') %>
|
||||
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<div class="xl:grid xl:grid-cols-3 xl:gap-8">
|
||||
<div class="space-y-8">
|
||||
<img class="h-20 -ml-2 -mb-5 -mt-5" src="/img/logo-gray.svg" alt="OneUptime">
|
||||
<p class="text-sm leading-6 text-gray-600">OneUptime is the complete open-source observability platform.</p>
|
||||
<p class="text-sm leading-6 text-gray-600">OneUptime is the complete observability platform. OneUptime is open-source and always will be.</p>
|
||||
<div class="flex space-x-6">
|
||||
|
||||
<a href="https://twitter.com/oneuptimehq" target="_blank" class="text-gray-400 hover:text-gray-500">
|
||||
@@ -97,7 +97,12 @@
|
||||
<ul role="list" class="mt-6 space-y-4">
|
||||
|
||||
<li>
|
||||
<a href="/reference" class="text-sm leading-6 text-gray-600 hover:text-gray-900">API Documentation</a>
|
||||
<a href="/docs" class="text-sm leading-6 text-gray-600 hover:text-gray-900">Docs</a>
|
||||
</li>
|
||||
|
||||
|
||||
<li>
|
||||
<a href="/reference" class="text-sm leading-6 text-gray-600 hover:text-gray-900">API Reference</a>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
@@ -113,7 +118,7 @@
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a href="https://blog.oneuptime.com" target="_blank" class="text-sm leading-6 text-gray-600 hover:text-gray-900">Blog</a>
|
||||
<a href="/blog" target="_blank" class="text-sm leading-6 text-gray-600 hover:text-gray-900">Blog</a>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
@@ -33,6 +33,29 @@
|
||||
top: 0;
|
||||
width: auto;
|
||||
}
|
||||
|
||||
/*Chrome*/
|
||||
@media screen and (-webkit-min-device-pixel-ratio:0) {
|
||||
input[type='range']::-webkit-slider-thumb {
|
||||
width: 20px;
|
||||
-webkit-appearance: none;
|
||||
border-radius: 50%;
|
||||
height: 20px;
|
||||
cursor: pointer;
|
||||
background: #4b5563;
|
||||
}
|
||||
}
|
||||
|
||||
/*Firefox*/
|
||||
input[type='range']::-moz-range-thumb {
|
||||
width: 16px;
|
||||
-webkit-appearance: none;
|
||||
border-radius: 50%;
|
||||
height: 16px;
|
||||
cursor: pointer;
|
||||
background: #4b5563;
|
||||
border-color: #4b5563;
|
||||
}
|
||||
</style>
|
||||
<script src="https://cdn.tailwindcss.com"></script>
|
||||
|
||||
@@ -55,15 +78,15 @@
|
||||
</style>
|
||||
|
||||
<script>
|
||||
!function(t,e){var o,n,p,r;e.__SV||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(".");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement("script")).type="text/javascript",p.async=!0,p.src=s.api_host+"/static/array.js",(r=t.getElementsByTagName("script")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a="posthog",u.people=u.people||[],u.toString=function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e},u.people.toString=function(){return u.toString(1)+".people (stub)"},o="capture identify alias people.set people.set_once set_config register register_once unregister opt_out_capturing has_opted_out_capturing opt_in_capturing reset isFeatureEnabled onFeatureFlags getFeatureFlag getFeatureFlagPayload reloadFeatureFlags group updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures getActiveMatchingSurveys getSurveys".split(" "),n=0;n<o.length;n++)g(u,o[n]);e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[]);
|
||||
posthog.init('phc_lrbfSHsDc1YOhfbabPI8ncLCKz8eqeGdmu0O6IRKaz1',{api_host:'https://eu.posthog.com', autocapture: false})
|
||||
!function (t, e) { var o, n, p, r; e.__SV || (window.posthog = e, e._i = [], e.init = function (i, s, a) { function g(t, e) { var o = e.split("."); 2 == o.length && (t = t[o[0]], e = o[1]), t[e] = function () { t.push([e].concat(Array.prototype.slice.call(arguments, 0))) } } (p = t.createElement("script")).type = "text/javascript", p.async = !0, p.src = s.api_host + "/static/array.js", (r = t.getElementsByTagName("script")[0]).parentNode.insertBefore(p, r); var u = e; for (void 0 !== a ? u = e[a] = [] : a = "posthog", u.people = u.people || [], u.toString = function (t) { var e = "posthog"; return "posthog" !== a && (e += "." + a), t || (e += " (stub)"), e }, u.people.toString = function () { return u.toString(1) + ".people (stub)" }, o = "capture identify alias people.set people.set_once set_config register register_once unregister opt_out_capturing has_opted_out_capturing opt_in_capturing reset isFeatureEnabled onFeatureFlags getFeatureFlag getFeatureFlagPayload reloadFeatureFlags group updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures getActiveMatchingSurveys getSurveys".split(" "), n = 0; n < o.length; n++)g(u, o[n]); e._i.push([i, s, a]) }, e.__SV = 1) }(document, window.posthog || []);
|
||||
posthog.init('phc_lrbfSHsDc1YOhfbabPI8ncLCKz8eqeGdmu0O6IRKaz1', { api_host: 'https://eu.posthog.com', autocapture: false })
|
||||
</script>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
//check if utm_source is present in the URL and save it to localstorage.
|
||||
|
||||
if(posthog){
|
||||
if (posthog) {
|
||||
posthog.capture('home/page_view', {
|
||||
'page': {
|
||||
'path': window.location.pathname,
|
||||
@@ -117,36 +140,4 @@
|
||||
<link rel="icon" href="/img/ou-wb.svg">
|
||||
<link rel="image_src" type="image/png" href="/img/hou-wb.svg">
|
||||
<link rel="canonical" href="/">
|
||||
<link rel="manifest" href="/manifest.json">
|
||||
<meta property="og:title" content="OneUptime - One Complete Observability platform.">
|
||||
<meta property="og:url" content="https://oneuptime.com">
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:description"
|
||||
content="OneUptime monitors websites, API's, and servers and alerts your team if something goes wrong. It also keeps your customers updated about any downtime. ">
|
||||
<meta property="og:image" content="https://oneuptime.com/img/hou-wb.svg">
|
||||
|
||||
<meta name="twitter:card" content="summary">
|
||||
<meta name="theme-color" content="#000000">
|
||||
<meta name="twitter:image" content="/img/ou-wb.svg">
|
||||
<meta name="twitter:site" content="@oneuptimeinc">
|
||||
<meta name="twitter:title" content="OneUptime - One Complete Observability platform.">
|
||||
<meta name="twitter:description"
|
||||
content="OneUptime monitors websites, API's, and servers and alerts your team if something goes wrong. It also keeps your customers updated about any downtime.">
|
||||
|
||||
|
||||
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "http://schema.org",
|
||||
"@type": "Corporation",
|
||||
"name": "OneUptime",
|
||||
"url": "https://www.oneuptime.com",
|
||||
"logo": "https://oneuptime.com/img/ou-bb.svg",
|
||||
"sameAs": [
|
||||
"https://www.facebook.com/oneuptimeinc",
|
||||
"https://twitter.com/OneUptimeInc",
|
||||
"https://www.linkedin.com/company/oneuptime"
|
||||
],
|
||||
"description": "OneUptime monitors websites, API's, and servers and alerts your team if something goes wrong. It also keeps your customers updated about any downtime."
|
||||
}
|
||||
</script>
|
||||
<link rel="manifest" href="/manifest.json">
|
||||
32
App/FeatureSet/Home/Views/head-social.ejs
Normal file
@@ -0,0 +1,32 @@
|
||||
<meta property="og:title" content="OneUptime - One Complete Observability platform.">
|
||||
<meta property="og:url" content="https://oneuptime.com">
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:description"
|
||||
content="OneUptime monitors websites, API's, and servers and alerts your team if something goes wrong. It also keeps your customers updated about any downtime. ">
|
||||
<meta property="og:image" content="https://oneuptime.com/img/hou-wb.svg">
|
||||
|
||||
<meta name="twitter:card" content="summary">
|
||||
<meta name="theme-color" content="#000000">
|
||||
<meta name="twitter:image" content="/img/ou-wb.svg">
|
||||
<meta name="twitter:site" content="@oneuptimeinc">
|
||||
<meta name="twitter:title" content="OneUptime - One Complete Observability platform.">
|
||||
<meta name="twitter:description"
|
||||
content="OneUptime monitors websites, API's, and servers and alerts your team if something goes wrong. It also keeps your customers updated about any downtime.">
|
||||
|
||||
|
||||
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "http://schema.org",
|
||||
"@type": "Corporation",
|
||||
"name": "OneUptime",
|
||||
"url": "https://www.oneuptime.com",
|
||||
"logo": "https://oneuptime.com/img/ou-bb.svg",
|
||||
"sameAs": [
|
||||
"https://www.facebook.com/oneuptimeinc",
|
||||
"https://twitter.com/OneUptimeInc",
|
||||
"https://www.linkedin.com/company/oneuptime"
|
||||
],
|
||||
"description": "OneUptime monitors websites, API's, and servers and alerts your team if something goes wrong. It also keeps your customers updated about any downtime."
|
||||
}
|
||||
</script>
|
||||
2
App/FeatureSet/Home/Views/head.ejs
Normal file
@@ -0,0 +1,2 @@
|
||||
<%- include('./head-basic') -%>
|
||||
<%- include('./head-social') -%>
|
||||
@@ -34,7 +34,7 @@
|
||||
class="relative -m-2 rounded-xl bg-gray-900/5 p-2 ring-1 ring-inset ring-gray-900/10 lg:-m-4 lg:rounded-2xl lg:p-4">
|
||||
<img src="/img/incidents.png" alt="App screenshot" width="2432" height="1442"
|
||||
class="rounded-md shadow-2xl ring-1 ring-gray-900/10">
|
||||
<%- include('./partials/watch-demo.ejs', {videoId: "_fQ_F4EisBQ"}) -%>
|
||||
<%- include('./Partials/watch-demo.ejs', {videoId: "_fQ_F4EisBQ"}) -%>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -310,7 +310,7 @@
|
||||
<%- include('features-table') -%>
|
||||
<%- include('cta') -%>
|
||||
<%- include('footer') -%>
|
||||
<%- include('./partials/video-script') -%>
|
||||
<%- include('./Partials/video-script') -%>
|
||||
|
||||
|
||||
</body>
|
||||
@@ -39,7 +39,7 @@
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
<h1 class="text-4xl font-bold tracking-tight text-gray-900 sm:text-6xl">How engineers build reliable software.</h1>
|
||||
<h1 class="text-4xl font-bold tracking-tight text-gray-900 sm:text-6xl">Build reliable software.</h1>
|
||||
<p class="mt-6 text-xl sm:text-2xl leading-8 text-gray-600">Monitor, Observe, Debug, Resolve. Everything you need to build reliable software in one open source platform.</p>
|
||||
<div class="mt-10 flex items-center justify-center gap-x-6">
|
||||
<a href="/accounts/register" class="rounded-md bg-indigo-600 px-3.5 py-2.5 text-sm font-semibold text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600">Get started</a>
|
||||
@@ -60,7 +60,7 @@
|
||||
|
||||
<%- include('logo-roll') -%>
|
||||
|
||||
<%- include('./partials/product-tabs') -%>
|
||||
<%- include('./Partials/product-tabs') -%>
|
||||
|
||||
<%- include('testimonials') -%>
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
<%- include('cta') -%>
|
||||
<%- include('footer') -%>
|
||||
|
||||
<%- include('./partials/video-script') -%>
|
||||
<%- include('./Partials/video-script') -%>
|
||||
|
||||
|
||||
</body>
|
||||