mirror of
https://github.com/bastienwirtz/homer.git
synced 2026-01-23 18:35:03 +00:00
Compare commits
628 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6367012675 | ||
|
|
d7bee37405 | ||
|
|
4cf69b3a25 | ||
|
|
2e1c7b3d27 | ||
|
|
151c136923 | ||
|
|
2a27bee30e | ||
|
|
d1356c3e6a | ||
|
|
8d82c77630 | ||
|
|
f11c14e764 | ||
|
|
62606e0caf | ||
|
|
184c16d46c | ||
|
|
ee57fa05fb | ||
|
|
8249aa8ae4 | ||
|
|
a4ec46ee35 | ||
|
|
bac62457f1 | ||
|
|
3913c30a56 | ||
|
|
3f49479556 | ||
|
|
6aa29935f6 | ||
|
|
19c5f174e8 | ||
|
|
89a264563a | ||
|
|
d19724b896 | ||
|
|
8a598dbdc0 | ||
|
|
2f4bbee491 | ||
|
|
7bd56d941a | ||
|
|
5a816709e5 | ||
|
|
81c7496264 | ||
|
|
4904717db0 | ||
|
|
92a79ffdfb | ||
|
|
35e49e3d91 | ||
|
|
68fb183c20 | ||
|
|
9054bd8941 | ||
|
|
b821651017 | ||
|
|
5b29bc411c | ||
|
|
06b677ab76 | ||
|
|
843a814ac5 | ||
|
|
1b6c3e6213 | ||
|
|
90ba82de8f | ||
|
|
6f902b78c0 | ||
|
|
9aaef4eaef | ||
|
|
e4588bc634 | ||
|
|
61d5d0b722 | ||
|
|
63647e837a | ||
|
|
2df7d5947b | ||
|
|
8ce2daff4d | ||
|
|
1f2c2058f6 | ||
|
|
a36634c237 | ||
|
|
ee152fd202 | ||
|
|
5eaa479b3c | ||
|
|
11bd5fd9d5 | ||
|
|
da32035841 | ||
|
|
2046d8d30c | ||
|
|
308deb95e0 | ||
|
|
a941e94a3b | ||
|
|
83152453c5 | ||
|
|
b4e20fe8af | ||
|
|
a38514739d | ||
|
|
7ea9b2e882 | ||
|
|
60cc984f12 | ||
|
|
fcf730f610 | ||
|
|
c230392da8 | ||
|
|
adf671772b | ||
|
|
51b4649628 | ||
|
|
6344970eb6 | ||
|
|
3f1d8e01ad | ||
|
|
58a1a0764d | ||
|
|
105937d438 | ||
|
|
abb0cf84bb | ||
|
|
517de68e74 | ||
|
|
1afa0afd00 | ||
|
|
a5eeb1e44e | ||
|
|
acb304adec | ||
|
|
347a3d062b | ||
|
|
15f59b9e36 | ||
|
|
42f3a3ee71 | ||
|
|
ad76093a38 | ||
|
|
9e314c960b | ||
|
|
07207dca55 | ||
|
|
59b0ed7688 | ||
|
|
4684b23a8c | ||
|
|
28ad80369f | ||
|
|
9307f5a926 | ||
|
|
1f6e6e7cce | ||
|
|
cde338a48d | ||
|
|
66e7989e97 | ||
|
|
fef1e8dcbe | ||
|
|
b40d008400 | ||
|
|
f4c026fe2e | ||
|
|
1de57d9423 | ||
|
|
042e4a0529 | ||
|
|
ef95630225 | ||
|
|
68441f2b81 | ||
|
|
5de2344dc2 | ||
|
|
5976f8f561 | ||
|
|
5c4b5e805e | ||
|
|
1ecbef0aca | ||
|
|
4b63b7784f | ||
|
|
deec0aaa68 | ||
|
|
bf531404f5 | ||
|
|
fc10b5c512 | ||
|
|
04164acff3 | ||
|
|
7cc7effd2e | ||
|
|
4a05f0d113 | ||
|
|
d15ebb9d09 | ||
|
|
933e7a0991 | ||
|
|
f0cd8ce91f | ||
|
|
fcf332a31c | ||
|
|
7cb7293abf | ||
|
|
2024297f61 | ||
|
|
a63f9e2c7c | ||
|
|
3f154b07a7 | ||
|
|
6916c2fed3 | ||
|
|
e5bd328d21 | ||
|
|
2a290004b7 | ||
|
|
b11bee7d64 | ||
|
|
234e063d2e | ||
|
|
02ff6a2039 | ||
|
|
e1fdb0069b | ||
|
|
37716c8d42 | ||
|
|
50acb9957e | ||
|
|
76e6c70696 | ||
|
|
c812bda08f | ||
|
|
1b607b6357 | ||
|
|
c546fc1605 | ||
|
|
7dfb3b8faf | ||
|
|
11934c3995 | ||
|
|
60a45191b9 | ||
|
|
4bd449e036 | ||
|
|
a8f7d09bd4 | ||
|
|
2a0387f90e | ||
|
|
12a004a9e1 | ||
|
|
20fb0c2254 | ||
|
|
13fb05696a | ||
|
|
31f7cfa09f | ||
|
|
36d753df58 | ||
|
|
1c09714c43 | ||
|
|
bc0ceee894 | ||
|
|
5a1697a5e6 | ||
|
|
b3e67b5af5 | ||
|
|
cb8a1e992c | ||
|
|
f0bcd50503 | ||
|
|
1d680ab2db | ||
|
|
474dc3ae8c | ||
|
|
1cc724c800 | ||
|
|
986954953b | ||
|
|
6031d57ccb | ||
|
|
3468b9d795 | ||
|
|
45acac744a | ||
|
|
7490a1948f | ||
|
|
741e7f5a1f | ||
|
|
a421a6ba12 | ||
|
|
03cf1c2c42 | ||
|
|
66d4cc36b5 | ||
|
|
aba3b5eed7 | ||
|
|
2f1cbe7328 | ||
|
|
72a5daf705 | ||
|
|
52ac793d45 | ||
|
|
db535442d6 | ||
|
|
47a7831764 | ||
|
|
fa4c10c9a4 | ||
|
|
103168544d | ||
|
|
f150c6c037 | ||
|
|
7909bd1054 | ||
|
|
97bb74a114 | ||
|
|
cbb7977170 | ||
|
|
e58637d935 | ||
|
|
496f9083b2 | ||
|
|
a8629ba80c | ||
|
|
f431551744 | ||
|
|
8d0bc456c1 | ||
|
|
fd919076df | ||
|
|
1e7542b632 | ||
|
|
721a8c2e66 | ||
|
|
9b0e3f595e | ||
|
|
ce9a09ff81 | ||
|
|
0b95836c64 | ||
|
|
92d3d6e922 | ||
|
|
80e458fcb4 | ||
|
|
268ac05821 | ||
|
|
b8ec139112 | ||
|
|
a1c6cb7681 | ||
|
|
900bf058da | ||
|
|
3419a4b6d6 | ||
|
|
b6d9749dea | ||
|
|
29a9cd3ea5 | ||
|
|
3396257528 | ||
|
|
a40acb2fee | ||
|
|
012f472aa7 | ||
|
|
d5921d939b | ||
|
|
b7ebdcaec8 | ||
|
|
88d675d7f5 | ||
|
|
794ac79f52 | ||
|
|
37091fa3d9 | ||
|
|
a666d7aa93 | ||
|
|
f7cc9761e9 | ||
|
|
aa8be8e576 | ||
|
|
546db41ab7 | ||
|
|
1ca9a4b0eb | ||
|
|
18360e223f | ||
|
|
1febbadfba | ||
|
|
779deedecd | ||
|
|
a2866e1714 | ||
|
|
c7a6f54f35 | ||
|
|
b168430fbf | ||
|
|
95f1d94219 | ||
|
|
bbc88262ee | ||
|
|
4c26a49922 | ||
|
|
43678d09c1 | ||
|
|
58b718c2a9 | ||
|
|
cd25756fd0 | ||
|
|
0e5106c42a | ||
|
|
c6571b48b4 | ||
|
|
ea12ee520b | ||
|
|
11cdb50ea5 | ||
|
|
88585186f2 | ||
|
|
2c33b54385 | ||
|
|
842cf8ad2c | ||
|
|
0d0df3d568 | ||
|
|
08bc4f417d | ||
|
|
56a5c0c581 | ||
|
|
aac5885056 | ||
|
|
99697a6a07 | ||
|
|
b760f04962 | ||
|
|
64629742f7 | ||
|
|
f6b124767e | ||
|
|
4797047571 | ||
|
|
2389cac9b0 | ||
|
|
6c438298f2 | ||
|
|
fe25fb03a8 | ||
|
|
359f1ffb53 | ||
|
|
2b83a38fc3 | ||
|
|
4726d8dbc7 | ||
|
|
8196cf71a4 | ||
|
|
5935a62aad | ||
|
|
e23868c594 | ||
|
|
95fde896e0 | ||
|
|
e6adfd7bb7 | ||
|
|
fbc20353ef | ||
|
|
204a9538c8 | ||
|
|
6ab50f11e2 | ||
|
|
765a24e7d0 | ||
|
|
75d8afebe6 | ||
|
|
5872d5fa72 | ||
|
|
7f750127b3 | ||
|
|
8f7752a0b8 | ||
|
|
ce4d3a3dbe | ||
|
|
c53c3957d5 | ||
|
|
efc9b1e0ad | ||
|
|
04c178a51b | ||
|
|
3583c6a420 | ||
|
|
dd820b599f | ||
|
|
76224d85ec | ||
|
|
9cd822b5c4 | ||
|
|
164357c5f9 | ||
|
|
0740fb31b5 | ||
|
|
8326eba25f | ||
|
|
9c537fb926 | ||
|
|
bcebb3e67e | ||
|
|
5f5a508b6e | ||
|
|
b11faee878 | ||
|
|
49d4d742a2 | ||
|
|
a6cbd1c22d | ||
|
|
7e8cc22b0c | ||
|
|
f2f03eb3cc | ||
|
|
c0e7103c67 | ||
|
|
dad372bbe6 | ||
|
|
4d30ab4c4a | ||
|
|
ff136b6a2c | ||
|
|
de4b7e6124 | ||
|
|
ecf664d19b | ||
|
|
7569ec3d2c | ||
|
|
9b77b47022 | ||
|
|
c8470d1e75 | ||
|
|
5b11259dd7 | ||
|
|
74f6879ed0 | ||
|
|
ce2d3e945a | ||
|
|
a3c5b4ac9d | ||
|
|
86f3fbbfaf | ||
|
|
f160caecfa | ||
|
|
504efe01cb | ||
|
|
cce42cc6d1 | ||
|
|
45626232f3 | ||
|
|
6f0193fb32 | ||
|
|
2eb808385b | ||
|
|
018344d911 | ||
|
|
16d3f4f53a | ||
|
|
f682a84e9f | ||
|
|
b1fa1d585a | ||
|
|
b8e3f74e59 | ||
|
|
ce9d164dba | ||
|
|
0a0da84332 | ||
|
|
df903a2c04 | ||
|
|
acd6a8911b | ||
|
|
6cfa1643b4 | ||
|
|
f0f9f0a017 | ||
|
|
6d2d9baf35 | ||
|
|
1707f5adad | ||
|
|
d362add383 | ||
|
|
dfde8ea89d | ||
|
|
1c7451bc81 | ||
|
|
0591208096 | ||
|
|
b7cd8f9482 | ||
|
|
49c2023b8e | ||
|
|
53726ecc1a | ||
|
|
bd122e2700 | ||
|
|
71759ad6fb | ||
|
|
bad762c000 | ||
|
|
70f583c3e1 | ||
|
|
98fe0a3939 | ||
|
|
f62972f659 | ||
|
|
a8292ef757 | ||
|
|
6868a0911b | ||
|
|
c9a6495186 | ||
|
|
d141a69a7d | ||
|
|
beb5755747 | ||
|
|
b5048fc353 | ||
|
|
24b6dedbe1 | ||
|
|
d32f7f6467 | ||
|
|
f72c0bc781 | ||
|
|
bdad8933ff | ||
|
|
51ba5ff503 | ||
|
|
7edcfe0705 | ||
|
|
cfd31b86b5 | ||
|
|
ac5f04f058 | ||
|
|
5bb84dcefb | ||
|
|
de814b9e04 | ||
|
|
3ed40599e5 | ||
|
|
d7fb8f5e3d | ||
|
|
7172b6f507 | ||
|
|
4c9212c93e | ||
|
|
52a136e0de | ||
|
|
956f38a5dc | ||
|
|
0800e9ac3c | ||
|
|
81c90009b4 | ||
|
|
494529f0a9 | ||
|
|
96da0c7ce0 | ||
|
|
4fe179c533 | ||
|
|
13069da195 | ||
|
|
0a03fcd9cd | ||
|
|
73a2a4aa76 | ||
|
|
e6069776ce | ||
|
|
e274807602 | ||
|
|
10f4cca67a | ||
|
|
fdf6d4284d | ||
|
|
84930a632b | ||
|
|
db28142374 | ||
|
|
6c083d6a36 | ||
|
|
5418c6291a | ||
|
|
ae1b04d1c4 | ||
|
|
77167e24ea | ||
|
|
e9faffbb1f | ||
|
|
34259e1e94 | ||
|
|
18d9582d7b | ||
|
|
ba5b98614b | ||
|
|
204a7057e4 | ||
|
|
38c1aa3a78 | ||
|
|
9371c1537c | ||
|
|
b16b69951e | ||
|
|
e68640002a | ||
|
|
746ede73ff | ||
|
|
23990e8509 | ||
|
|
e4ec8a6aa3 | ||
|
|
f031ac440a | ||
|
|
c11c45a661 | ||
|
|
0eca982f8b | ||
|
|
a46bede230 | ||
|
|
eb03092286 | ||
|
|
9582b1871a | ||
|
|
ce391840e5 | ||
|
|
5609315fe7 | ||
|
|
4b639b1c10 | ||
|
|
d57821b5fa | ||
|
|
2f1aff4dc5 | ||
|
|
73d52dbd38 | ||
|
|
5890d41932 | ||
|
|
59994bfee8 | ||
|
|
b4207f2782 | ||
|
|
c80854cb2d | ||
|
|
cbbed6346a | ||
|
|
95c589ba71 | ||
|
|
263be7806c | ||
|
|
bb4ccfb6c7 | ||
|
|
9e57f9bd1d | ||
|
|
b5bf977402 | ||
|
|
71d929a55a | ||
|
|
1b9a3f1975 | ||
|
|
7315b9e28c | ||
|
|
a01c40d4b3 | ||
|
|
a43fe354ec | ||
|
|
1327cc0ab0 | ||
|
|
10f6f123e8 | ||
|
|
e03e759285 | ||
|
|
2b48d1c057 | ||
|
|
fb668b6a3c | ||
|
|
95249e1125 | ||
|
|
132e9a0df5 | ||
|
|
f64278d41d | ||
|
|
95d73348e5 | ||
|
|
d4001281d9 | ||
|
|
7f4130fd04 | ||
|
|
889cdc0fcc | ||
|
|
bf6b543bfb | ||
|
|
4353f5e036 | ||
|
|
9506ed53c8 | ||
|
|
98b460d6fe | ||
|
|
bf2fcc6641 | ||
|
|
2ac75c0534 | ||
|
|
766efb1a19 | ||
|
|
cab7bfd15e | ||
|
|
7e48e099aa | ||
|
|
4f56c2c11b | ||
|
|
049f85221e | ||
|
|
cd75da69f9 | ||
|
|
b6b31e440c | ||
|
|
caf5fae8a8 | ||
|
|
af0a6e89c9 | ||
|
|
9bb51bb244 | ||
|
|
e6c106eb72 | ||
|
|
6e4410d8f1 | ||
|
|
cc0bc909da | ||
|
|
4d35b1fdcc | ||
|
|
2c79b4f0f6 | ||
|
|
b2bf3901e7 | ||
|
|
f483f16561 | ||
|
|
847d1ba3e8 | ||
|
|
9c370d3c5e | ||
|
|
7341d7634b | ||
|
|
b2a4140054 | ||
|
|
9e1e82b0f3 | ||
|
|
000a46ee88 | ||
|
|
1275a8cce5 | ||
|
|
cd1fc28f51 | ||
|
|
5c42d50d47 | ||
|
|
31027f4791 | ||
|
|
abfe72b9cf | ||
|
|
6dc8fa2026 | ||
|
|
345dd6c194 | ||
|
|
585844394d | ||
|
|
a25f317bee | ||
|
|
775d0a8e86 | ||
|
|
6351bf973c | ||
|
|
4e953d7c81 | ||
|
|
e2ebf9973b | ||
|
|
a7cbcc7700 | ||
|
|
049610bc91 | ||
|
|
f398006935 | ||
|
|
db2a2af3a4 | ||
|
|
2ccadd578e | ||
|
|
120ee25bf5 | ||
|
|
1340a8e6d0 | ||
|
|
edd2c9ce2d | ||
|
|
a1a70d4a3c | ||
|
|
1acdbe4920 | ||
|
|
ba2c7c5c57 | ||
|
|
e4b077843c | ||
|
|
5cd802d157 | ||
|
|
4a526f6e7f | ||
|
|
2c52f45048 | ||
|
|
7e81828b34 | ||
|
|
78d0fc5f1b | ||
|
|
dabcc0bae1 | ||
|
|
c6ec28f1c5 | ||
|
|
9bfa95963d | ||
|
|
8b9ec8465f | ||
|
|
893690cf95 | ||
|
|
dec7e466b9 | ||
|
|
096c7eda48 | ||
|
|
d92444ec19 | ||
|
|
5fdf790e2c | ||
|
|
5afd21a84c | ||
|
|
51829a85c4 | ||
|
|
6c8f9f1c5b | ||
|
|
f7f4ebdf66 | ||
|
|
8ede30411e | ||
|
|
cb154a6818 | ||
|
|
50b3bddff1 | ||
|
|
990606a38a | ||
|
|
0aa343d744 | ||
|
|
26dbed936a | ||
|
|
68b10120c9 | ||
|
|
9f14de32fe | ||
|
|
ad8efdc799 | ||
|
|
a9cdf57043 | ||
|
|
8283b8da5a | ||
|
|
b1c8586441 | ||
|
|
9c77651692 | ||
|
|
b4a2db6e37 | ||
|
|
e6ba84d35a | ||
|
|
611fe797eb | ||
|
|
e961af8255 | ||
|
|
0121fa8036 | ||
|
|
754372579e | ||
|
|
6e6efc7d29 | ||
|
|
b7480f632e | ||
|
|
9fce0ce5a5 | ||
|
|
f2c901a1ec | ||
|
|
cf33747f42 | ||
|
|
46c9a513e5 | ||
|
|
400cdb8f6a | ||
|
|
487f954a36 | ||
|
|
446e78d2ab | ||
|
|
3668050ba3 | ||
|
|
54c19bb5f0 | ||
|
|
168f157cf9 | ||
|
|
5db2414d05 | ||
|
|
1c0bf7132a | ||
|
|
2f19540400 | ||
|
|
c72acd57d0 | ||
|
|
80ba98cf66 | ||
|
|
d31a9a79c2 | ||
|
|
277dafafa9 | ||
|
|
8d9cfa98bd | ||
|
|
7a4e78e8d0 | ||
|
|
87aadbb6df | ||
|
|
66a434e7db | ||
|
|
3acfb01d99 | ||
|
|
2fba043575 | ||
|
|
efc2bbb856 | ||
|
|
fea0f09045 | ||
|
|
0a3be103dc | ||
|
|
a25e1b1a70 | ||
|
|
cc26624f39 | ||
|
|
d7e17e6146 | ||
|
|
3faeac7e9f | ||
|
|
b64b17a4f9 | ||
|
|
270e522e0e | ||
|
|
220c60cba0 | ||
|
|
2ca4faad9c | ||
|
|
c7dc6bfd0d | ||
|
|
b2f6da0382 | ||
|
|
e58461ffe3 | ||
|
|
451b1ac624 | ||
|
|
7129af3bda | ||
|
|
1d3287dcca | ||
|
|
6173d7df60 | ||
|
|
b2a31c0701 | ||
|
|
d6d078132b | ||
|
|
e32643056e | ||
|
|
eecd0db92e | ||
|
|
d489f6ef87 | ||
|
|
b63add2f95 | ||
|
|
a6b72c97d0 | ||
|
|
4eeed6596b | ||
|
|
f11b1c9dcf | ||
|
|
fd18715085 | ||
|
|
92d5b8d424 | ||
|
|
bcec0449ec | ||
|
|
55c3ea4d92 | ||
|
|
33d60aa76a | ||
|
|
afe6d34ced | ||
|
|
1ed0a2f387 | ||
|
|
117fa7d3b9 | ||
|
|
584f2b4b32 | ||
|
|
6c834c24b6 | ||
|
|
cb325bd58a | ||
|
|
bbe7149d58 | ||
|
|
7efcd282bb | ||
|
|
addaf36c3d | ||
|
|
6b54eedae7 | ||
|
|
6dd8342bf0 | ||
|
|
4852ae6b85 | ||
|
|
2f6d9e1b09 | ||
|
|
0dc3cea15e | ||
|
|
76a46c3507 | ||
|
|
cf2fb08dc7 | ||
|
|
077be43473 | ||
|
|
ecec695272 | ||
|
|
a74fa38302 | ||
|
|
304362adfd | ||
|
|
25f99adc6c | ||
|
|
b2062fb60a | ||
|
|
4386cd094b | ||
|
|
64ac4c48d5 | ||
|
|
35926e1e6e | ||
|
|
f3b3b89b7c | ||
|
|
a6b7db5437 | ||
|
|
3a8fa151f4 | ||
|
|
92d899bd48 | ||
|
|
c06c0cdf9b | ||
|
|
73a102f3fa | ||
|
|
f9cc1d27cc | ||
|
|
f5b467f933 | ||
|
|
ded5228972 | ||
|
|
90d6bc67c0 | ||
|
|
5d642b3674 | ||
|
|
c98f88eaf2 | ||
|
|
b1ccd8d6b2 | ||
|
|
c4cae400d5 | ||
|
|
9e1b1bd1d2 | ||
|
|
c3878bca0b | ||
|
|
bebb6953cb | ||
|
|
3832025b0c | ||
|
|
68955dc1d3 | ||
|
|
f9ebff9311 | ||
|
|
24229b5411 | ||
|
|
adacb3c33f | ||
|
|
0178d73f66 | ||
|
|
a2b59fb6c1 | ||
|
|
764b470209 | ||
|
|
742ae4eb52 | ||
|
|
996011956b | ||
|
|
2428998313 | ||
|
|
7596bc527f | ||
|
|
aadd8b49cc | ||
|
|
64f189c9dc | ||
|
|
4399f5fade | ||
|
|
275a335cce | ||
|
|
b1de1f9e08 | ||
|
|
0211da26c8 | ||
|
|
b6c667a129 | ||
|
|
edc336bba6 | ||
|
|
c0044cc765 | ||
|
|
4a1e8717e9 | ||
|
|
66eace9e95 | ||
|
|
ba07da6b10 | ||
|
|
00b46a6dde | ||
|
|
8e09331379 | ||
|
|
42477020cf | ||
|
|
c6267296ec | ||
|
|
a5fe53beb2 | ||
|
|
97f0c43ccc | ||
|
|
551e32e203 | ||
|
|
fb158d4767 | ||
|
|
9e0ef05efe | ||
|
|
dfb0b14626 | ||
|
|
fd12de9ebd | ||
|
|
b79561bc9c | ||
|
|
593f8afc90 | ||
|
|
e3bd2ecc2c |
240 changed files with 20321 additions and 10274 deletions
|
|
@ -1,3 +0,0 @@
|
|||
> 1%
|
||||
last 2 versions
|
||||
not dead
|
||||
15
.eslintrc.js
15
.eslintrc.js
|
|
@ -1,15 +0,0 @@
|
|||
module.exports = {
|
||||
root: true,
|
||||
env: {
|
||||
node: true,
|
||||
},
|
||||
extends: ["plugin:vue/essential", "eslint:recommended", "@vue/prettier"],
|
||||
parserOptions: {
|
||||
parser: "babel-eslint",
|
||||
},
|
||||
rules: {
|
||||
"no-console": "off",
|
||||
"no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off",
|
||||
"vue/require-v-for-key": "off",
|
||||
},
|
||||
};
|
||||
6
.github/FUNDING.yml
vendored
Normal file
6
.github/FUNDING.yml
vendored
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
# These are supported funding model platforms
|
||||
|
||||
# These are supported funding model platforms
|
||||
|
||||
github: [bastienwirtz]
|
||||
buy_me_a_coffee: bastien
|
||||
28
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
28
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Describe the bug**
|
||||
A clear and concise description of what the bug is.
|
||||
|
||||
**Expected behavior**
|
||||
A clear and concise description of what you expected to happen.
|
||||
|
||||
**Logs & errors**
|
||||
Please include any usefull information:
|
||||
- Errors in your browser console (`ctrl+shift+i` or `F12`)
|
||||
- If applicable, your docker container logs.
|
||||
|
||||
**Screenshots**
|
||||
If applicable, add screenshots to help explain your problem.
|
||||
|
||||
**Configuration**
|
||||
If applicable, copy related homer yaml configuration here.
|
||||
```yml
|
||||
|
||||
```
|
||||
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea for this project
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Is your feature request related to a problem? Please describe.**
|
||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||
|
||||
**Describe the solution you'd like**
|
||||
A clear and concise description of what you want to happen.
|
||||
|
||||
**Describe alternatives you've considered**
|
||||
A clear and concise description of any alternative solutions or features you've considered.
|
||||
|
||||
**Additional context**
|
||||
Add any other context or screenshots about the feature request here.
|
||||
5
.github/PULL_REQUEST_TEMPLATE.md
vendored
5
.github/PULL_REQUEST_TEMPLATE.md
vendored
|
|
@ -9,10 +9,11 @@ Fixes # (issue)
|
|||
- [ ] Bug fix (non-breaking change which fixes an issue)
|
||||
- [ ] New feature (non-breaking change which adds functionality)
|
||||
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
|
||||
- [ ] Refactoring
|
||||
|
||||
## Checklist:
|
||||
|
||||
- [ ] I've read & comply with the [contributing guidelines](https://github.com/bastienwirtz/homer/blob/main/CONTRIBUTING.md)
|
||||
- [ ] I have tested my code for new features & regressions on both mobile & desktop devices, using the latest version of major browsers.
|
||||
- [ ] I have made corresponding changes the documentation (README.md).
|
||||
- [ ] I have tested my code for new features & regressions on both mobile & desktop devices, using the latest version of major browsers.
|
||||
- [ ] I have made corresponding changes to the documentation (`README.md`).
|
||||
- [ ] I've checked my modifications for any breaking changes, especially in the `config.yml` file
|
||||
|
|
|
|||
8
.github/release.yml
vendored
Normal file
8
.github/release.yml
vendored
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
changelog:
|
||||
exclude:
|
||||
authors:
|
||||
- dependabot
|
||||
categories:
|
||||
- title: Main changes
|
||||
labels:
|
||||
- "*"
|
||||
48
.github/workflows/dockerhub.yml
vendored
Normal file
48
.github/workflows/dockerhub.yml
vendored
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
# Build & publish docker images
|
||||
name: Dockerhub
|
||||
|
||||
on:
|
||||
push:
|
||||
tags: [v*]
|
||||
|
||||
jobs:
|
||||
dockerhub:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 20
|
||||
steps:
|
||||
-
|
||||
name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
-
|
||||
name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3
|
||||
-
|
||||
name: Set up Docker Buildx
|
||||
id: buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
-
|
||||
name: Login to Docker Hub
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
-
|
||||
name: Login to GHCR
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ github.token }}
|
||||
-
|
||||
name: Build and push
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
push: true
|
||||
tags: |
|
||||
b4bz/homer:latest
|
||||
b4bz/homer:${{ github.ref_name }}
|
||||
ghcr.io/${{ github.repository }}:latest
|
||||
ghcr.io/${{ github.repository }}:${{ github.ref_name }}
|
||||
platforms: linux/amd64,linux/arm/v7,linux/arm/v6,linux/arm64
|
||||
build-args: |
|
||||
VERSION_TAG=${{ github.ref_name }}
|
||||
34
.github/workflows/integration.yml
vendored
Normal file
34
.github/workflows/integration.yml
vendored
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
# This workflow will do a clean install of node dependencies, cache/restore them, build the source code and run tests across different versions of node
|
||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
|
||||
|
||||
name: Integration
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ main ]
|
||||
pull_request:
|
||||
branches: [ main ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 20
|
||||
steps:
|
||||
-
|
||||
name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
-
|
||||
name: pnpm setup
|
||||
uses: pnpm/action-setup@v4
|
||||
-
|
||||
name: Node.js setup
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 22
|
||||
cache: 'pnpm'
|
||||
-
|
||||
name: install dependencies
|
||||
run: pnpm install --frozen-lockfile
|
||||
-
|
||||
name: Check code style & potentential issues
|
||||
run: pnpm lint
|
||||
40
.github/workflows/main.yml
vendored
40
.github/workflows/main.yml
vendored
|
|
@ -1,40 +0,0 @@
|
|||
# Publish pre-build release
|
||||
name: Upload Release Asset
|
||||
|
||||
on:
|
||||
push:
|
||||
tags: [v*]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Upload Release Asset
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Build project
|
||||
run: |
|
||||
yarn install
|
||||
yarn build
|
||||
- name: Create artifact
|
||||
working-directory: "dist"
|
||||
run: zip -r ../homer.zip ./*
|
||||
- name: Create Release
|
||||
id: create_release
|
||||
uses: actions/create-release@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
tag_name: ${{ github.ref }}
|
||||
release_name: Release ${{ github.ref }}
|
||||
draft: false
|
||||
prerelease: false
|
||||
- name: Upload Release Asset
|
||||
id: upload-release-asset
|
||||
uses: actions/upload-release-asset@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
upload_url: ${{ steps.create_release.outputs.upload_url }}
|
||||
asset_path: ./homer.zip
|
||||
asset_name: homer.zip
|
||||
asset_content_type: application/zip
|
||||
43
.github/workflows/release.yml
vendored
Normal file
43
.github/workflows/release.yml
vendored
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
# Publish pre-build release
|
||||
name: Create Github release
|
||||
|
||||
on:
|
||||
push:
|
||||
tags: [v*]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Upload Release Asset
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 20
|
||||
steps:
|
||||
-
|
||||
name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
-
|
||||
name: pnpm setup
|
||||
uses: pnpm/action-setup@v4
|
||||
-
|
||||
name: Node.js setup
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 22
|
||||
cache: 'pnpm'
|
||||
-
|
||||
name: Build project
|
||||
run: |
|
||||
pnpm install --frozen-lockfile
|
||||
pnpm build
|
||||
-
|
||||
name: Create artifact
|
||||
working-directory: "dist"
|
||||
run: zip -r ../homer.zip ./*
|
||||
-
|
||||
name: Create Release
|
||||
id: create_release
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
generate_release_notes: true
|
||||
files: |
|
||||
homer.zip
|
||||
6
.gitignore
vendored
6
.gitignore
vendored
|
|
@ -23,4 +23,8 @@ yarn-error.log*
|
|||
# App configuration
|
||||
config.yml
|
||||
|
||||
.drone.yml
|
||||
.drone.yml
|
||||
|
||||
# Specific Agent file
|
||||
CLAUDE.md
|
||||
GEMINI.md
|
||||
|
|
|
|||
8
.jsconfig.json
Normal file
8
.jsconfig.json
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"paths": {
|
||||
"@/*": ["./src/*"]
|
||||
}
|
||||
},
|
||||
"exclude": ["node_modules", "dist"]
|
||||
}
|
||||
359
.schema/config-schema.json
Normal file
359
.schema/config-schema.json
Normal file
|
|
@ -0,0 +1,359 @@
|
|||
{
|
||||
"$id": "https://raw.githubusercontent.com/bastienwirtz/homer/main/.schema/config-schema.json",
|
||||
"$schema": "http://json-schema.org/draft-07/schema",
|
||||
"description": "https://github.com/bastienwirtz/homer/blob/main/docs/configuration.md",
|
||||
"examples": [],
|
||||
"title": "Homer Dashboard configuration",
|
||||
"type": "object",
|
||||
"definitions": {
|
||||
"Colors": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"light": {
|
||||
"$ref": "#/definitions/ColorSet"
|
||||
},
|
||||
"dark": {
|
||||
"$ref": "#/definitions/ColorSet"
|
||||
}
|
||||
},
|
||||
"title": "Colors"
|
||||
},
|
||||
"ColorSet": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"highlight-primary": {
|
||||
"type": "string"
|
||||
},
|
||||
"highlight-secondary": {
|
||||
"type": "string"
|
||||
},
|
||||
"highlight-hover": {
|
||||
"type": "string"
|
||||
},
|
||||
"background": {
|
||||
"type": "string"
|
||||
},
|
||||
"card-background": {
|
||||
"type": "string"
|
||||
},
|
||||
"text": {
|
||||
"type": "string"
|
||||
},
|
||||
"text-header": {
|
||||
"type": "string"
|
||||
},
|
||||
"text-title": {
|
||||
"type": "string"
|
||||
},
|
||||
"text-subtitle": {
|
||||
"type": "string"
|
||||
},
|
||||
"card-shadow": {
|
||||
"type": "string"
|
||||
},
|
||||
"link": {
|
||||
"type": "string"
|
||||
},
|
||||
"link-hover": {
|
||||
"type": "string"
|
||||
},
|
||||
"background-image": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Defaults": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"layout": {
|
||||
"enum": [
|
||||
"columns",
|
||||
"list"
|
||||
],
|
||||
"description": "Layout of the dashboard, either 'columns' or 'list'"
|
||||
},
|
||||
"colorTheme": {
|
||||
"enum": [
|
||||
"auto",
|
||||
"light",
|
||||
"dark"
|
||||
],
|
||||
"description": "One of 'auto', 'light', or 'dark'"
|
||||
}
|
||||
},
|
||||
"title": "Defaults"
|
||||
},
|
||||
"Hotkey": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"search": {
|
||||
"type": "string",
|
||||
"description": "hotkey for search, e.g. Shift"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"search"
|
||||
]
|
||||
},
|
||||
"Link": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"name": {
|
||||
"type": "string",
|
||||
"description": "Name as seen in the navbar"
|
||||
},
|
||||
"icon": {
|
||||
"type": "string",
|
||||
"description": "Fontawesome icon"
|
||||
},
|
||||
"url": {
|
||||
"type": "string",
|
||||
"description": "Url of the link. When #filename is used, it is a link to another homer page, while 'filename' is the name of the config file"
|
||||
},
|
||||
"target": {
|
||||
"type": "string",
|
||||
"description": "html tag target attribute like _blank for a new page"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"url"
|
||||
],
|
||||
"title": "Link"
|
||||
},
|
||||
"Message": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"url": {
|
||||
"type": "string",
|
||||
"format": "uri"
|
||||
},
|
||||
"mapping": {
|
||||
"$ref": "#/definitions/Mapping",
|
||||
"description": "Mapping for the content loaded from the URL"
|
||||
},
|
||||
"refreshInterval": {
|
||||
"type": "integer",
|
||||
"description": "The refresh interval in milliseconds for reloading the message url"
|
||||
},
|
||||
"style": {
|
||||
"type": "string",
|
||||
"description": "See https://bulma.io/documentation/components/message/#colors for styling options"
|
||||
},
|
||||
"title": {
|
||||
"type": "string",
|
||||
"description": "Title of the message box"
|
||||
},
|
||||
"icon": {
|
||||
"type": "string",
|
||||
"description": "Fontawesome icon for the message box"
|
||||
},
|
||||
"content": {
|
||||
"type": "string",
|
||||
"description": "HTML content for the message box"
|
||||
}
|
||||
},
|
||||
"title": "Messagebox"
|
||||
},
|
||||
"Mapping": {
|
||||
"type": "object",
|
||||
"additionalProperties": true,
|
||||
"title": "Mapping"
|
||||
},
|
||||
"Proxy": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"useCredentials": {
|
||||
"type": "boolean",
|
||||
"description": "# send cookies & authorization headers when fetching service specific data. Set to `true` if you use an authentication proxy. Can be overrided on service level. "
|
||||
},
|
||||
"headers": {
|
||||
"$ref": "#/definitions/Headers",
|
||||
"description": "send custom headers when fetching service specific data. Can also be set on a service level."
|
||||
}
|
||||
},
|
||||
"title": "Proxy"
|
||||
},
|
||||
"Headers": {
|
||||
"type": "object",
|
||||
"additionalProperties": true,
|
||||
"title": "Headers"
|
||||
},
|
||||
"Service": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"name": {
|
||||
"type": "string",
|
||||
"description": "Service name"
|
||||
},
|
||||
"icon": {
|
||||
"type": "string",
|
||||
"description": "Fontawesome icon for the service"
|
||||
},
|
||||
"logo": {
|
||||
"type": "string",
|
||||
"description": "A path to an image can also be provided. Note that icon take precedence if both icon and logo are set."
|
||||
},
|
||||
"class": {
|
||||
"type": "string",
|
||||
"description": "Optional css class to add on the service group. Example 'highlight-purple'"
|
||||
},
|
||||
"items": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/definitions/Item"
|
||||
}
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"items"
|
||||
],
|
||||
"title": "Service"
|
||||
},
|
||||
"Item": {
|
||||
"type": "object",
|
||||
"additionalProperties": true,
|
||||
"properties": {
|
||||
"name": {
|
||||
"type": "string"
|
||||
},
|
||||
"logo": {
|
||||
"type": "string",
|
||||
"description": "Path to a logo. Alternatively a fa icon can be provided"
|
||||
},
|
||||
"icon": {
|
||||
"type": "string",
|
||||
"description": "Fontawesome icon for the item, alternative for logo"
|
||||
},
|
||||
"subtitle": {
|
||||
"type": "string"
|
||||
},
|
||||
"tag": {
|
||||
"type": "string",
|
||||
"description": "Show tag"
|
||||
},
|
||||
"keywords": {
|
||||
"type": "string",
|
||||
"description": "Optional keyword used for searching purpose"
|
||||
},
|
||||
"url": {
|
||||
"type": "string",
|
||||
"description": "Url of this item"
|
||||
},
|
||||
"target": {
|
||||
"type": "string",
|
||||
"description": "html tag target attribute like _blank for a new page"
|
||||
},
|
||||
"tagstyle": {
|
||||
"type": "string",
|
||||
"description": "Styleclass for the tag"
|
||||
},
|
||||
"type": {
|
||||
"type": "string",
|
||||
"description": "Optional, loads a specific component that provides extra features. MUST MATCH a file name (without file extension) available in `src/components/services`"
|
||||
}
|
||||
},
|
||||
"title": "Item"
|
||||
}
|
||||
},
|
||||
"properties": {
|
||||
"externalConfig": {
|
||||
"type": "string",
|
||||
"description": "Use external configuration file. Using this will ignore remaining config in this file externalConfig: https://example.com/server-luci/config.yaml"
|
||||
},
|
||||
"title": {
|
||||
"type": "string",
|
||||
"description": "Title of the dashboard"
|
||||
},
|
||||
"subtitle": {
|
||||
"type": "string",
|
||||
"description": "Subtitle of the dashboard"
|
||||
},
|
||||
"documentTitle": {
|
||||
"type": "string",
|
||||
"description": "Title of the document. When not filled, title (and subtitle will be used)"
|
||||
},
|
||||
"logo": {
|
||||
"type": "string",
|
||||
"description": "Path to logo image"
|
||||
},
|
||||
"icon": {
|
||||
"type": "string",
|
||||
"description": "Dashboard icon"
|
||||
},
|
||||
"header": {
|
||||
"type": "boolean",
|
||||
"description": "Show header, default is true"
|
||||
},
|
||||
"hotkey": {
|
||||
"$ref": "#/definitions/Hotkey",
|
||||
"description": "Define hotkeys, for example for search"
|
||||
},
|
||||
"footer": {
|
||||
"anyOf": [
|
||||
{
|
||||
"type": "boolean"
|
||||
},
|
||||
{
|
||||
"type": "string"
|
||||
}
|
||||
],
|
||||
"description": "footer Line content. HTML is supported. Set false if you want to hide it."
|
||||
},
|
||||
"columns": {
|
||||
"type": "string",
|
||||
"description": "'auto' or number (must be a factor of 12: 1, 2, 3, 4, 6, 12)",
|
||||
"format": "integer"
|
||||
},
|
||||
"connectivityCheck": {
|
||||
"type": "boolean",
|
||||
"description": "# whether you want to display a message when the apps are not accessible anymore (VPN disconnected for example). You should set it to true when using an authentication proxy, it also reloads the page when a redirection is detected when checking connectivity."
|
||||
},
|
||||
"proxy": {
|
||||
"$ref": "#/definitions/Proxy",
|
||||
"description": "Optional: Proxy / hosting option"
|
||||
},
|
||||
"defaults": {
|
||||
"$ref": "#/definitions/Defaults"
|
||||
},
|
||||
"theme": {
|
||||
"type": "string",
|
||||
"description": "'default' or one of the themes available in 'src/assets/themes'"
|
||||
},
|
||||
"stylesheet": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"description": "Will load custom CSS files. Especially useful for custom icon sets. Entries are paths to the stylesheets"
|
||||
},
|
||||
"colors": {
|
||||
"$ref": "#/definitions/Colors"
|
||||
},
|
||||
"message": {
|
||||
"$ref": "#/definitions/Message",
|
||||
"description": "Messagebox"
|
||||
},
|
||||
"links": {
|
||||
"description": "Links in the navigation bar",
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/definitions/Link"
|
||||
}
|
||||
},
|
||||
"services": {
|
||||
"description": "Services",
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/definitions/Service"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
84
AGENTS.md
Normal file
84
AGENTS.md
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
# AGENTS Instructions
|
||||
|
||||
This file provides guidance to AI Agents when working with code in this repository.
|
||||
|
||||
## Development Commands
|
||||
|
||||
```bash
|
||||
pnpm install # Install dependencies (PNPM enforced via packageManager)
|
||||
pnpm dev # Start development server on http://localhost:3000
|
||||
pnpm mock # Start mock API server for testing service integrations
|
||||
pnpm build # Build for production
|
||||
pnpm preview # Preview production build
|
||||
pnpm lint # Run ESLint with auto-fix
|
||||
```
|
||||
|
||||
## Architecture Overview
|
||||
|
||||
Homer is a static Vue.js 3 PWA dashboard that loads configuration from YAML files. The architecture is service-oriented with dynamic component loading.
|
||||
|
||||
### Core Application Structure
|
||||
|
||||
- **Entry Point**: `src/main.js` mounts the Vue app
|
||||
- **Root Component**: `src/App.vue` handles layout, configuration loading, and routing
|
||||
- **Configuration System**: YAML-based with runtime merging of defaults (`src/assets/defaults.yml`) and user config (`/assets/config.yml`)
|
||||
- **Service Components**: 53 specialized integrations in `src/components/services/` that extend a Generic component pattern
|
||||
|
||||
### Service Integration Pattern
|
||||
|
||||
All service components follow this architecture:
|
||||
|
||||
- Extend `Generic.vue` using Vue slots (`<template #indicator>`, `<template #content>`, `<template #icon>`)
|
||||
- Use the `service.js` mixin (`src/mixins/service.js`) for common API functionality
|
||||
- Use a custom `fetch` method provided by the service mixin to seamlessly support proxy configuration, custom headers, and credentials.
|
||||
|
||||
### Configuration & Routing
|
||||
|
||||
- **Multi-page Support**: Hash-based routing without Vue Router
|
||||
- **Dynamic Config Loading**: External URLs supported via `config.remote_config`
|
||||
- **Theme System**: CSS layers architecture with three built-in themes in `src/assets/themes/`
|
||||
- **Asset Management**: Static files served from `/assets/` with runtime configuration merging
|
||||
|
||||
### Build System Details
|
||||
|
||||
- **Vite 7**: Modern build tool with Vue plugin
|
||||
- **PWA**: Auto-updating service worker via `vite-plugin-pwa`
|
||||
- **SCSS**: Bulma framework with modular component styling
|
||||
- **Docker**: Multi-stage build (Node.js → Alpine + Lighttpd)
|
||||
|
||||
### Mock Data Creation Pattern
|
||||
|
||||
When creating mock data for service components testing:
|
||||
|
||||
**Structure**: `dummy-data/[component-name]/[api-path]/[endpoint]`
|
||||
|
||||
**Steps**:
|
||||
|
||||
1. **Analyze component**: Read the Vue component file to identify API calls (look for `this.fetch()` calls)
|
||||
2. **Check existing mock**: If mock directory exists, read existing files to check for missing fields
|
||||
3. **Create/update structure**: `mkdir -p dummy-data/[lowercase-component-name]/` and mirror API endpoint paths
|
||||
4. **Create/update JSON files**: Write realistic mock responses matching the expected data structure
|
||||
5. **Verify fields**: Ensure all fields used in the component's computed properties and templates are included
|
||||
6. **Update existing mocks**: If mock files exist but are missing fields, add the missing fields without removing existing data
|
||||
|
||||
**Key Points**:
|
||||
|
||||
- Component directory name should be lowercase version of component name (e.g., `AdGuardHome.vue` → `adguardhome/`)
|
||||
- Directory structure mirrors API endpoints exactly
|
||||
- Files contain JSON responses (no file extension needed)
|
||||
- Mock server serves from `dummy-data/` via `pnpm mock` command
|
||||
- Each component gets isolated directory to prevent API path conflicts
|
||||
- When updating existing mocks, preserve existing data and only add missing fields required by the component
|
||||
- Always read existing mock files first to understand current structure before making changes
|
||||
|
||||
**Example**: For `AdGuardHome.vue`:
|
||||
- API calls: `/control/status`, `/control/stats`
|
||||
- Mock files: `dummy-data/adguardhome/control/status`, `dummy-data/adguardhome/control/stats`
|
||||
|
||||
### Development Notes
|
||||
|
||||
- Use `pnpm mock` to test service integrations with dummy data
|
||||
- Configuration changes require restart in development mode
|
||||
- New service components should follow the Generic component slot pattern
|
||||
- Themes use CSS custom properties for dynamic color switching
|
||||
- The app has no backend dependencies and generates static files only
|
||||
|
|
@ -6,16 +6,12 @@ First off, thank you for considering contributing to Homer!
|
|||
|
||||
### Project philosophy
|
||||
|
||||
Homer is meant to be a light and very simple dashboard that keeps all your useful utilities at hands. The few features implemented in Homer focus on
|
||||
UX and usability. If you are looking for a full featured dashboard, there is tons of great stuff out there like https://heimdall.site/, https://github.com/rmountjoy92/DashMachine or https://organizr.app/.
|
||||
Homer is meant to be a light and very simple dashboard that keeps all your useful utilities at hand. The few features implemented in Homer focus on
|
||||
UX and usability. If you are looking for a full featured dashboard, there are tons of great stuff out there like https://gethomepage.dev/, https://heimdall.site/, https://github.com/rmountjoy92/DashMachine or https://organizr.app/.
|
||||
|
||||
- Configuration is stored in a simple config file, avoiding the need for a backend/database while making possible to use versioning or [config template](https://docs.ansible.com/ansible/latest/user_guide/playbooks_templating.html).
|
||||
- Configuration is stored in a simple config file, avoiding the need for a backend/database while making it possible to use versioning or [config template](https://docs.ansible.com/ansible/latest/user_guide/playbooks_templating.html).
|
||||
- Only modern browsers are supported, feel free to use any JS features without any polyfill as soon as the latest version of the major browsers supports them.
|
||||
|
||||
### Roadmap
|
||||
|
||||
If you want to know more about the project direction or looking for something to work on, checkout the [roadmap](https://github.com/bastienwirtz/homer#Roadmap)!
|
||||
Feel free to open an issue if you have any question.
|
||||
|
||||
# Ground Rules
|
||||
|
||||
|
|
@ -37,11 +33,21 @@ For all contributions, please respect the following guidelines:
|
|||
If you want to add a feature, it's often best to talk about it before starting to work on it and submitting a pull request. It's not mandatory at all, but
|
||||
feel free to open an issue to present your idea.
|
||||
|
||||
### Working with AI Agents
|
||||
|
||||
This repository include an [`AGENTS.md`](https://github.com/bastienwirtz/homer/blob/main/AGENTS.md) instruction file for agents. It use an [open format](https://agents.md/), which most agent should natively use for context. However, for specific agent like Claude Code or Gemini, you will have to specifically ask it to read the file or create symlink:
|
||||
|
||||
```sh
|
||||
ln -s AGENTS.md CLAUDE.md
|
||||
ln -s AGENTS.md GEMINI.md
|
||||
```
|
||||
|
||||
### How to submit a contribution
|
||||
|
||||
The general process to submit a contribution is as follow:
|
||||
1. Create your own fork of the code
|
||||
2. Do the changes in your fork
|
||||
3. Make sure to fill the [pull request description](https://github.com/bastienwirtz/homer/blob/main/.github/PULL_REQUEST_TEMPLATE.md) properly.
|
||||
1. Take a look at the [development guideline](https://github.com/bastienwirtz/homer/blob/main/docs/development.md).
|
||||
2. Create your own fork of the code
|
||||
3. Do the changes in your fork
|
||||
4. Make sure to fill the [pull request description](https://github.com/bastienwirtz/homer/blob/main/.github/PULL_REQUEST_TEMPLATE.md) properly.
|
||||
|
||||
### Happy coding :metal:
|
||||
|
|
|
|||
58
Dockerfile
58
Dockerfile
|
|
@ -1,30 +1,58 @@
|
|||
# build stage
|
||||
FROM node:lts-alpine as build-stage
|
||||
FROM --platform=$BUILDPLATFORM node:22-alpine3.21 AS build-stage
|
||||
|
||||
ENV PNPM_HOME="/pnpm"
|
||||
ENV PATH="$PNPM_HOME:$PATH"
|
||||
|
||||
RUN corepack enable && corepack use pnpm@10
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY package*.json ./
|
||||
RUN yarn install --frozen-lockfile
|
||||
COPY package.json pnpm-lock.yaml ./
|
||||
RUN pnpm install --frozen-lockfile
|
||||
|
||||
COPY . .
|
||||
RUN yarn build
|
||||
RUN pnpm build
|
||||
|
||||
# production stage
|
||||
FROM alpine:3.11
|
||||
FROM alpine:3.21
|
||||
|
||||
ENV USER darkhttpd
|
||||
ENV GROUP darkhttpd
|
||||
ENV GID 911
|
||||
ENV UID 911
|
||||
ENV PORT 8080
|
||||
ARG VERSION_TAG=latest
|
||||
|
||||
RUN addgroup -S ${GROUP} -g ${GID} && adduser -D -S -u ${UID} ${USER} ${GROUP} && \
|
||||
apk add -U --no-cache su-exec darkhttpd
|
||||
LABEL \
|
||||
org.label-schema.schema-version="1.0" \
|
||||
org.label-schema.version="$VERSION_TAG" \
|
||||
org.opencontainers.image.title="Homer Image" \
|
||||
org.opencontainers.image.description="A dead simple static Home-Page for your server to keep your services on hand, from a simple yaml configuration file." \
|
||||
org.opencontainers.image.ref.name="b4bz/homer:${VERSION_TAG}" \
|
||||
org.opencontainers.image.version="$VERSION_TAG" \
|
||||
org.opencontainers.image.licenses="Apache-2.0 license" \
|
||||
org.opencontainers.image.source="https://github.com/bastienwirtz/homer" \
|
||||
org.opencontainers.image.url="https://hub.docker.com/r/b4bz/homer"
|
||||
|
||||
COPY --from=build-stage --chown=${USER}:${GROUP} /app/dist /www/
|
||||
COPY --from=build-stage --chown=${USER}:${GROUP} /app/dist/assets /www/default-assets
|
||||
ENV GID=1000 \
|
||||
UID=1000 \
|
||||
PORT=8080 \
|
||||
SUBFOLDER="/_" \
|
||||
INIT_ASSETS=1 \
|
||||
IPV6_DISABLE=0
|
||||
|
||||
RUN addgroup -S lighttpd -g ${GID} && adduser -D -S -u ${UID} lighttpd lighttpd && \
|
||||
apk add -U --no-cache tzdata lighttpd
|
||||
|
||||
WORKDIR /www
|
||||
|
||||
COPY lighttpd.conf /lighttpd.conf
|
||||
COPY lighttpd-ipv6.sh /etc/lighttpd/ipv6.sh
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
COPY --from=build-stage --chown=${UID}:${GID} /app/dist /www/
|
||||
COPY --from=build-stage --chown=${UID}:${GID} /app/dist/assets /www/default-assets
|
||||
|
||||
USER ${UID}:${GID}
|
||||
|
||||
HEALTHCHECK --start-period=10s --start-interval=1s --interval=30s --timeout=5s --retries=3 \
|
||||
CMD wget --no-verbose -Y off --tries=1 --spider http://127.0.0.1:${PORT}/ || exit 1
|
||||
|
||||
EXPOSE ${PORT}
|
||||
VOLUME /www/assets
|
||||
|
||||
ENTRYPOINT ["/bin/sh", "/entrypoint.sh"]
|
||||
|
|
|
|||
|
|
@ -1,40 +0,0 @@
|
|||
# build stage
|
||||
FROM node:lts-alpine as build-stage
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY package*.json ./
|
||||
RUN yarn install --frozen-lockfile
|
||||
|
||||
COPY . .
|
||||
RUN yarn build
|
||||
|
||||
# Multi arch build support
|
||||
FROM alpine as qemu
|
||||
|
||||
ARG QEMU_VERSION="v4.2.0-7"
|
||||
|
||||
RUN wget https://github.com/multiarch/qemu-user-static/releases/download/${QEMU_VERSION}/qemu-arm-static && chmod +x qemu-arm-static
|
||||
|
||||
# production stage
|
||||
FROM arm32v7/alpine:3.11
|
||||
|
||||
COPY --from=qemu qemu-arm-static /usr/bin/
|
||||
|
||||
ENV USER darkhttpd
|
||||
ENV GROUP darkhttpd
|
||||
ENV GID 911
|
||||
ENV UID 911
|
||||
ENV PORT 8080
|
||||
|
||||
RUN addgroup -S ${GROUP} -g ${GID} && adduser -D -S -u ${UID} ${USER} ${GROUP} && \
|
||||
apk add -U --no-cache darkhttpd su-exec && \
|
||||
rm /usr/bin/qemu-arm-static
|
||||
|
||||
COPY --from=build-stage --chown=${USER}:${GROUP} /app/dist /www/
|
||||
COPY --from=build-stage --chown=${USER}:${GROUP} /app/dist/assets /www/default-assets
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
|
||||
EXPOSE ${PORT}
|
||||
VOLUME /www/assets
|
||||
ENTRYPOINT ["/bin/sh", "/entrypoint.sh"]
|
||||
|
|
@ -1,40 +0,0 @@
|
|||
# build stage
|
||||
FROM node:lts-alpine as build-stage
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY package*.json ./
|
||||
RUN yarn install --frozen-lockfile
|
||||
|
||||
COPY . .
|
||||
RUN yarn build
|
||||
|
||||
# Multi arch build support
|
||||
FROM alpine as qemu
|
||||
|
||||
ARG QEMU_VERSION="v4.2.0-7"
|
||||
|
||||
RUN wget https://github.com/multiarch/qemu-user-static/releases/download/${QEMU_VERSION}/qemu-aarch64-static && chmod +x qemu-aarch64-static
|
||||
|
||||
# production stage
|
||||
FROM arm64v8/alpine:3.11
|
||||
|
||||
COPY --from=qemu qemu-aarch64-static /usr/bin/
|
||||
|
||||
ENV USER darkhttpd
|
||||
ENV GROUP darkhttpd
|
||||
ENV GID 911
|
||||
ENV UID 911
|
||||
ENV PORT 8080
|
||||
|
||||
RUN addgroup -S ${GROUP} -g ${GID} && adduser -D -S -u ${UID} ${USER} ${GROUP} && \
|
||||
apk add -U --no-cache darkhttpd su-exec && \
|
||||
rm /usr/bin/qemu-aarch64-static
|
||||
|
||||
COPY --from=build-stage --chown=${USER}:${GROUP} /app/dist /www/
|
||||
COPY --from=build-stage --chown=${USER}:${GROUP} /app/dist/assets /www/default-assets
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
|
||||
EXPOSE ${PORT}
|
||||
VOLUME /www/assets
|
||||
ENTRYPOINT ["/bin/sh", "/entrypoint.sh"]
|
||||
173
README.md
173
README.md
|
|
@ -1,142 +1,143 @@
|
|||
<h1 align="center">
|
||||
<img
|
||||
width="180"
|
||||
alt="Homer's donut"
|
||||
src="https://raw.githubusercontent.com//bastienwirtz/homer/main/public/logo.png">
|
||||
<img
|
||||
width="180"
|
||||
alt="Homer's donut"
|
||||
src="https://raw.githubusercontent.com//bastienwirtz/homer/main/public/logo.png">
|
||||
<br/>
|
||||
Homer
|
||||
</h1>
|
||||
|
||||
<h4 align="center">
|
||||
A dead simple static <strong>HOM</strong>epage for your serv<strong>ER</strong> to keep your services on hand, from a simple <code>yaml</code> configuration file.
|
||||
A dead simple static <strong>HOM</strong>epage for your serv<strong>ER</strong> to keep your services on hand, from a simple <code>yaml</code> configuration file.
|
||||
</h4>
|
||||
|
||||
<p align="center">
|
||||
<strong>
|
||||
<a href="https://homer-demo.netlify.app">Demo</a>
|
||||
•
|
||||
<a href="https://gitter.im/homer-dashboard/community">Chat</a>
|
||||
•
|
||||
<a href="#getting-started">Getting started</a>
|
||||
</strong>
|
||||
</p>
|
||||
<a href="https://www.buymeacoffee.com/bastien" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/default-yellow.png" alt="Buy Me A Coffee" height="41" width="174"></a>
|
||||
<p>
|
||||
<p align="center">
|
||||
<a href="https://opensource.org/licenses/Apache-2.0"><img
|
||||
alt="License: Apache 2"
|
||||
src="https://img.shields.io/badge/License-Apache%202.0-blue.svg"></a>
|
||||
<a href="https://gitter.im/homer-dashboard/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge"><img
|
||||
alt="Gitter chat"
|
||||
src="https://badges.gitter.im/homer-dashboard/community.svg"></a>
|
||||
<a href="https://opensource.org/licenses/Apache-2.0"><img
|
||||
alt="License: Apache 2"
|
||||
src="https://img.shields.io/badge/License-Apache%202.0-blue.svg"></a>
|
||||
<a href="https://github.com/bastienwirtz/homer/releases/latest/download/homer.zip"><img
|
||||
alt="Download homer static build"
|
||||
src="https://img.shields.io/badge/Download-homer.zip-orange"></a>
|
||||
<a href="https://github.com/awesome-selfhosted/awesome-selfhosted"><img
|
||||
alt="Awesome"
|
||||
src="https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg"></a>
|
||||
alt="Download homer static build"
|
||||
src="https://img.shields.io/badge/Download-homer.zip-orange"></a>
|
||||
<a href="https://twitter.com/acdlite/status/974390255393505280"><img
|
||||
alt="speed-blazing"
|
||||
src="https://img.shields.io/badge/speed-blazing%20%F0%9F%94%A5-red"></a>
|
||||
<a href="https://github.com/awesome-selfhosted/awesome-selfhosted"><img
|
||||
alt="Awesome"
|
||||
src="https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg"></a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<img src="https://raw.github.com/bastienwirtz/homer/main/docs/screenshot.png" width="100%">
|
||||
<strong>
|
||||
<a href="https://homer-demo.netlify.app">Demo</a>
|
||||
•
|
||||
<a href="https://hub.docker.com/r/b4bz/homer">Docker Hub</a>
|
||||
•
|
||||
<a href="#get-started">Get started</a>
|
||||
</strong>
|
||||
</p>
|
||||
|
||||
## Highlights
|
||||
|
||||
- ⚡️ Lightweight & Fast
|
||||
- 🥱 Low / No maintenance
|
||||
- 📄 Simple [yaml](http://yaml.org/) file configuration
|
||||
- ➕ Installable (pwa)
|
||||
- 🧠 Smart cards
|
||||
- 🔍️ Fuzzy search
|
||||
- 📂 Multi pages & item grouping
|
||||
- 🎨 Theme customization
|
||||
- ⌨️ keyboard shortcuts:
|
||||
- <kbd>/</kbd> Start searching.
|
||||
- <kbd>Escape</kbd> Stop searching.
|
||||
- <kbd>Enter</kbd> Open the first matching result (respects the bookmark's `_target` property).
|
||||
- <kbd>Alt</kbd> (or <kbd>Option</kbd>) + <kbd>Enter</kbd> Open the first matching result in a new tab.
|
||||
|
||||
## Table of Contents
|
||||
- [Features](#features)
|
||||
- [Getting started](#getting-started)
|
||||
|
||||
- [Getting started](#get-started)
|
||||
- [Kubernetes Installation](docs/kubernetes.md)
|
||||
- [Configuration](docs/configuration.md)
|
||||
- [Theming](docs/theming.md)
|
||||
- [Smart cards](docs/customservices.md)
|
||||
- [Tips & tricks](docs/tips-and-tricks.md)
|
||||
- [Roadmap](#roadmap)
|
||||
- [Development](docs/development.md)
|
||||
- [Troubleshooting](docs/troubleshooting.md)
|
||||
|
||||
## Get started
|
||||
|
||||
## Features
|
||||
- [yaml](http://yaml.org/) file configuration
|
||||
- Installable (pwa)
|
||||
- Search
|
||||
- Grouping
|
||||
- Theme customization
|
||||
- Offline heathcheck
|
||||
- keyboard shortcuts:
|
||||
- `/` Start searching.
|
||||
- `Escape` Stop searching.
|
||||
- `Enter` Open the first matching result (respects the bookmark's `_target` property).
|
||||
- `Alt`/`Option` + `Enter` Open the first matching result in a new tab.
|
||||
Homer is a full static html/js dashboard, based on a simple yaml configuration file. See [documentation](docs/configuration.md) for information about the configuration (`assets/config.yml`) options.
|
||||
|
||||
|
||||
## Getting started
|
||||
|
||||
Homer is a full static html/js dashboard, generated from the source in `/src` using webpack. It's meant to be served by an HTTP server, **it will not work if you open dist/index.html directly over file:// protocol**.
|
||||
|
||||
See [documentation](docs/configuration.md) for information about the configuration (`assets/config.yml`) options.
|
||||
It's meant to be served by an HTTP server, **it will not work if you open the index.html directly over file:// protocol**.
|
||||
|
||||
### Using docker
|
||||
|
||||
To launch container:
|
||||
The configuration directory is bind mounted to make your dashboard easy to maintain.
|
||||
|
||||
**Start the container with `docker run`**
|
||||
|
||||
```sh
|
||||
# Make sure your local config directory exists
|
||||
docker run -d \
|
||||
--name homer \
|
||||
-p 8080:8080 \
|
||||
-v </your/local/assets/>:/www/assets \
|
||||
--restart=always \
|
||||
--mount type=bind,source="/path/to/config/dir",target=/www/assets \
|
||||
--restart=unless-stopped \
|
||||
b4bz/homer:latest
|
||||
```
|
||||
|
||||
Default assets will be automatically installed in the `/www/assets` directory. Use `UID` and/or `GID` env var to change the assets owner (`docker run -e "UID=1000" -e "GID=1000" [...]`).
|
||||
> [!NOTE]
|
||||
> The container will run using a user uid and gid 1000 by default, add `--user <your-UID>:<your-GID>` to the docker command to adjust it if necessary. Make sure this match the permissions of your assets directory.
|
||||
|
||||
### Using docker-compose
|
||||
|
||||
The `docker-compose.yml` file must be edited to match your needs.
|
||||
Set the port and volume (equivalent to `-p` and `-v` arguments):
|
||||
**or `docker-compose`**
|
||||
|
||||
```yaml
|
||||
volumes:
|
||||
- /your/local/assets/:/www/assets
|
||||
ports:
|
||||
- 8080:8080
|
||||
services:
|
||||
homer:
|
||||
image: b4bz/homer
|
||||
container_name: homer
|
||||
volumes:
|
||||
- /path/to/config/dir:/www/assets # Make sure your local config directory exists
|
||||
ports:
|
||||
- 8080:8080
|
||||
user: 1000:1000 # default
|
||||
environment:
|
||||
- INIT_ASSETS=1 # default, requires the config directory to be writable for the container user (see user option)
|
||||
restart: unless-stopped
|
||||
```
|
||||
|
||||
To launch container:
|
||||
**Environment variables:**
|
||||
|
||||
```sh
|
||||
cd /path/to/docker-compose.yml
|
||||
docker-compose up -d
|
||||
```
|
||||
- **`INIT_ASSETS`** (default: `1`)
|
||||
Install example configuration file & assets (favicons, ...) to help you get started.
|
||||
|
||||
Default assets will be automatically installed in the `/www/assets` directory. Use `UID` and/or `GID` env var to change the assets owner, also in `docker-compose.yml`:
|
||||
- **`SUBFOLDER`** (default: `null`)
|
||||
If you would like to host Homer in a subfolder, (ex: *<http://my-domain/homer>*), set this to the subfolder path (ex `/homer`).
|
||||
|
||||
```yaml
|
||||
environment:
|
||||
- UID=1000
|
||||
- GID=1000
|
||||
```
|
||||
- **`PORT`** (default: `8080`)
|
||||
If you would like to change internal port of Homer from default `8080` to your port choice.
|
||||
|
||||
- **`IPV6_DISABLE`** (default: 0)
|
||||
Set to `1` to disable listening on IPv6.
|
||||
|
||||
### Using the release tarball (prebuilt, ready to use)
|
||||
|
||||
Download and extract the latest release (`homer.zip`) from the [release page](https://github.com/bastienwirtz/homer/releases), rename the `assets/config.yml.dist` file to `assets/config.yml`, and put it behind a webserver.
|
||||
Download and extract the latest release (`homer.zip`) from the [release page](https://github.com/bastienwirtz/homer/releases), rename the `assets/config.yml.dist` file to `assets/config.yml`, and put it behind a web server.
|
||||
|
||||
```sh
|
||||
wget https://github.com/bastienwirtz/homer/releases/latest/download/homer.zip
|
||||
unzip homer.zip
|
||||
unzip homer.zip -d homer
|
||||
cd homer
|
||||
cp assets/config.yml.dist assets/config.yml
|
||||
npx serve # or python -m http.server 8010 or apache, nginx ...
|
||||
pnpx http-server # or python -m http.server 8010 or any web server.
|
||||
```
|
||||
|
||||
### Build manually
|
||||
|
||||
```sh
|
||||
# Using yarn (recommended)
|
||||
yarn install
|
||||
yarn build
|
||||
|
||||
# **OR** Using npm
|
||||
npm install
|
||||
npm run build
|
||||
pnpm install
|
||||
pnpm build
|
||||
```
|
||||
|
||||
Then your dashboard is ready to use in the `/dist` directory.
|
||||
|
||||
|
||||
## Roadmap
|
||||
|
||||
- [ ] Add new themes.
|
||||
- [ ] Add support for custom service card (add custom feature to some service / app link)
|
||||
|
|
|
|||
|
|
@ -1,3 +0,0 @@
|
|||
module.exports = {
|
||||
presets: ["@vue/cli-plugin-babel/preset"],
|
||||
};
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
---
|
||||
version: "2"
|
||||
services:
|
||||
homer:
|
||||
image: b4bz/homer
|
||||
#To build from source, comment previous line and uncomment below
|
||||
#build: .
|
||||
container_name: homer
|
||||
volumes:
|
||||
- /your/local/assets/:/www/assets
|
||||
ports:
|
||||
- 8080:8080
|
||||
#environment:
|
||||
# - UID=1000
|
||||
# - GID=1000
|
||||
restart: unless-stopped
|
||||
|
|
@ -1,13 +1,20 @@
|
|||
## Configuration
|
||||
# Configuration
|
||||
|
||||
Title, icons, links, colors, and services can be configured in the `config.yml` file (located in `/assets` directory once built, or in the `public/assets` directory in development mode), using [yaml](http://yaml.org/) format.
|
||||
Homer relies on a single [yaml](http://yaml.org/) configuration file, located in the `/assets` directory.
|
||||
`.dist` sample configuration files are available to help you get started. Alternatively, the example below can be
|
||||
copied into the config file.
|
||||
|
||||
> [!NOTE]
|
||||
> On docker installations, the sample configuration is automatically installed when no configuration is found **if**
|
||||
> the configuration directory is writable to the docker user. If no configuration has been installed, check your
|
||||
> container logs and your mounted configuration directory ownership & permissions
|
||||
|
||||
```yaml
|
||||
---
|
||||
# Homepage configuration
|
||||
# See https://fontawesome.com/icons for icons options
|
||||
# See https://fontawesome.com/search for icons options
|
||||
|
||||
# Optional: Use external configuration file.
|
||||
# Optional: Use external configuration file.
|
||||
# Using this will ignore remaining config in this file
|
||||
# externalConfig: https://example.com/server-luci/config.yaml
|
||||
|
||||
|
|
@ -19,10 +26,27 @@ logo: "assets/logo.png"
|
|||
# icon: "fas fa-skull-crossbones"
|
||||
|
||||
header: true # Set to false to hide the header
|
||||
# Optional: Different hotkey for search, defaults to "/"
|
||||
# hotkey:
|
||||
# search: "Shift"
|
||||
footer: '<p>Created with <span class="has-text-danger">❤️</span> with <a href="https://bulma.io/">bulma</a>, <a href="https://vuejs.org/">vuejs</a> & <a href="https://fontawesome.com/">font awesome</a> // Fork me on <a href="https://github.com/bastienwirtz/homer"><i class="fab fa-github-alt"></i></a></p>' # set false if you want to hide it.
|
||||
|
||||
columns: "3" # "auto" or number (must be a factor of 12: 1, 2, 3, 4, 6, 12)
|
||||
connectivityCheck: true # whether you want to display a message when the apps are not accessible anymore (VPN disconnected for example)
|
||||
connectivityCheck: true # whether you want to display a message when the apps are not accessible anymore (VPN disconnected for example).
|
||||
# You should set it to true when using an authentication proxy, it also reloads the page when a redirection is detected when checking connectivity.
|
||||
|
||||
# Optional: Proxy / hosting option
|
||||
proxy:
|
||||
useCredentials: false # send cookies & authorization headers when fetching service specific data. Set to `true` if you use an authentication proxy. Can be overrided on service level.
|
||||
headers: # send custom headers when fetching service specific data. Can also be set on a service level.
|
||||
Test: "Example"
|
||||
Test1: "Example1"
|
||||
|
||||
|
||||
# Set the default layout and color scheme
|
||||
defaults:
|
||||
layout: columns # Either 'columns', or 'list'
|
||||
colorTheme: auto # One of 'auto', 'light', or 'dark'
|
||||
|
||||
# Optional theming
|
||||
theme: default # 'default' or one of the themes available in 'src/assets/themes'.
|
||||
|
|
@ -47,8 +71,9 @@ colors:
|
|||
text-title: "#303030"
|
||||
text-subtitle: "#424242"
|
||||
card-shadow: rgba(0, 0, 0, 0.1)
|
||||
link: "#3273dc"
|
||||
link-hover: "#363636"
|
||||
background-image: "assets/your/light/bg.png"
|
||||
background-image: "/assets/your/light/bg.png" # prefix with your sub subpath if any (ex: /homer/assets/...)
|
||||
dark:
|
||||
highlight-primary: "#3367d6"
|
||||
highlight-secondary: "#4285f4"
|
||||
|
|
@ -60,8 +85,9 @@ colors:
|
|||
text-title: "#fafafa"
|
||||
text-subtitle: "#f5f5f5"
|
||||
card-shadow: rgba(0, 0, 0, 0.4)
|
||||
link: "#3273dc"
|
||||
link-hover: "#ffdd57"
|
||||
background-image: "assets/your/dark/bg.png"
|
||||
background-image: "/assets/your/dark/bg.png" # prefix with your sub subpath if any (ex: /homer/assets/...)
|
||||
|
||||
# Optional message
|
||||
message:
|
||||
|
|
@ -80,6 +106,7 @@ message:
|
|||
style: "is-warning"
|
||||
title: "Optional message!"
|
||||
icon: "fa fa-exclamation-triangle"
|
||||
# The content also accepts HTML content, so you can add divs, images or whatever you want to make match your needs.
|
||||
content: "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
|
||||
|
||||
# Optional navbar
|
||||
|
|
@ -92,6 +119,11 @@ links:
|
|||
- name: "link 2"
|
||||
icon: "fas fa-book"
|
||||
url: "https://github.com/bastienwirtz/homer"
|
||||
# this will link to a second homer page that will load config from page2.yml and keep default config values as in config.yml file
|
||||
# see url field and assets/page.yml used in this example:
|
||||
- name: "Second Page"
|
||||
icon: "fas fa-file-alt"
|
||||
url: "#page2"
|
||||
|
||||
# Services
|
||||
# First level array represents a group.
|
||||
|
|
@ -99,6 +131,9 @@ links:
|
|||
services:
|
||||
- name: "Application"
|
||||
icon: "fas fa-code-branch"
|
||||
# A path to an image can also be provided. Note that icon take precedence if both icon and logo are set.
|
||||
# logo: "path/to/logo"
|
||||
# class: "highlight-purple" # Optional css class to add on the service group.
|
||||
items:
|
||||
- name: "Awesome app"
|
||||
logo: "assets/tools/sample.png"
|
||||
|
|
@ -106,6 +141,7 @@ services:
|
|||
# icon: "fab fa-jenkins"
|
||||
subtitle: "Bookmark example"
|
||||
tag: "app"
|
||||
keywords: "self hosted reddit" # optional keyword used for searching purpose
|
||||
url: "https://www.reddit.com/r/selfhosted/"
|
||||
target: "_blank" # optional html tag target attribute
|
||||
- name: "Another one"
|
||||
|
|
@ -129,6 +165,8 @@ services:
|
|||
# background: red # optional color for card to set color directly without custom stylesheet
|
||||
```
|
||||
|
||||
View **[smart cards](customservices.md)** for details about all available cards (like `PiHole`) and how to configure them.
|
||||
|
||||
If you choose to fetch message information from an endpoint, the output format should be as follows (or you can [custom map fields as shown in tips-and-tricks](./tips-and-tricks.md#mapping-fields)):
|
||||
|
||||
```json
|
||||
|
|
@ -142,21 +180,37 @@ If you choose to fetch message information from an endpoint, the output format s
|
|||
`null` value or missing keys will be ignored and value from the `config.yml` will be used if available.
|
||||
Empty values (either in `config.yml` or the endpoint data) will hide the element (ex: set `"title": ""` to hide the title bar).
|
||||
|
||||
### Style Options
|
||||
## Connectivity checks
|
||||
|
||||
Homer uses [bulma CSS](https://bulma.io/), which provides a [modifiers syntax](https://bulma.io/documentation/modifiers/syntax/). You'll notice in the config there is a `tagstyle` option. It can be set to any of the bulma modifiers. You'll probably want to use one of these 4 main colors:
|
||||
As a webapp (PWA) the dashboard can still be displayed when your homer server is offline.
|
||||
The connectivity checker periodically sends a HEAD request bypassing the PWA cache to the dashbord page to make sure it's still reachable.
|
||||
|
||||
It can be useful when you access your dashboard through a VPN or ssh tunnel for example, to know if your conection is up. It also helps when using an authentication proxy, it will reload the page if the authentication expires (when a redirect is send in response to the HEAD request).
|
||||
|
||||
## Style Options
|
||||
|
||||
Homer uses [bulma CSS](https://bulma.io/), which provides a [modifiers syntax](https://bulma.io/documentation/start/syntax/). You'll notice in the config there is a `tagstyle` option. It can be set to any of the bulma modifiers. You'll probably want to use one of these 4 main colors:
|
||||
|
||||
- `is-info` (blue)
|
||||
- `is-success` (green)
|
||||
- `is-warning` (yellow)
|
||||
- `is-danger` (red)
|
||||
|
||||
You can read the [bulma modifiers page](https://bulma.io/documentation/modifiers/syntax/) for other options regarding size, style, or state.
|
||||
You can read the [bulma modifiers page](https://bulma.io/documentation/start/syntax/) for other options regarding size, style, or state.
|
||||
|
||||
### PWA Icons
|
||||
## Theming & customization
|
||||
|
||||
In order to easily generate all required icon preset for the PWA to work, a tool like [vue-pwa-asset-generator](https://www.npmjs.com/package/vue-pwa-asset-generator) can be used:
|
||||
See `colors` settings in the configuration example above.
|
||||
Favicon and application icon (pwa) are located in the `assets/icons` directory and can be replaced by any image you want (just keep the same name & size).
|
||||
The `/assets/manifest.json` can also be edited to change the app (pwa) name, description and other settings.
|
||||
|
||||
```bash
|
||||
npx vue-pwa-asset-generator -a {your_512x512_source_png} -o {your_output_folder}
|
||||
```
|
||||
### Community theme
|
||||
|
||||
- [Catppuccin theme](https://github.com/mrpbennett/catppucin-homer) by [@mrpbenett](https://github.com/mrpbennett)
|
||||
- [DietPi theme](https://codeberg.org/Cs137/homer-theme-dietpi) by [@Cs137](https://codeberg.org/Cs137)
|
||||
- [Dracula theme](https://draculatheme.com/homer) by [@Tuetenk0pp](https://github.com/Tuetenk0pp)
|
||||
- [Homer Theme v2](https://github.com/walkxcode/homer-theme) by [@walkxcode](https://github.com/walkxcode)
|
||||
|
||||
## PWA Icons
|
||||
|
||||
See icons documentation [here](https://github.com/bastienwirtz/homer/blob/main/public/assets/icons/README.md).
|
||||
|
|
|
|||
844
docs/customservices.md
Normal file
844
docs/customservices.md
Normal file
|
|
@ -0,0 +1,844 @@
|
|||
# Smart cards
|
||||
|
||||
Smart cards provide specific integrations for external services. They display additional information and extra features beyond basic service card. Smart cards are enabled by adding a `type` key to the service item in your YAML configuration.
|
||||
|
||||
Each service integration has different requirements and may need additional configuration parameters (see card list below).
|
||||
|
||||
> [!WARNING]
|
||||
> Your `config.yml` file is exposed at `/assets/config.yml` via HTTP. Any sensitive information (like API keys)
|
||||
> in this file is visible to anyone who can access your Homer instance. Only include API keys if your Homer
|
||||
> instance is protected by authentication or access controls **or use a proxy like [`CORSair`](https://github.com/bastienwirtz/corsair)
|
||||
> to inject your credentials safely**, using environment variable on the server side.
|
||||
|
||||
Available services are located in `src/components/`:
|
||||
|
||||
- [Common options](#common-options)
|
||||
- [AdGuard Home](#adguard-home)
|
||||
- [CopyToClipboard](#copy-to-clipboard)
|
||||
- [Docuseal](#docuseal)
|
||||
- [Docker Socket Proxy](#docker-socket-proxy)
|
||||
- [Emby / Jellyfin](#emby--jellyfin)
|
||||
- [FreshRSS](#freshrss)
|
||||
- [Gatus](#gatus)
|
||||
- [Gitea / Forgejo](#gitea--forgejo)
|
||||
- [Glances](#glances)
|
||||
- [Gotify](#gotify)
|
||||
- [Healthchecks](#healthchecks)
|
||||
- [Home Assistant](#home-assistant)
|
||||
- [Immich](#immich)
|
||||
- [Jellystat](#jellystat)
|
||||
- [Lidarr, Prowlarr, Sonarr, Readarr and Radarr](#lidarr-prowlarr-sonarr-readarr-and-radarr)
|
||||
- [Linkding](#linkding)
|
||||
- [Matrix](#matrix)
|
||||
- [Mealie](#mealie)
|
||||
- [Medusa](#medusa)
|
||||
- [Miniflux](#miniflux)
|
||||
- [Nextcloud](#nextcloud)
|
||||
- [OctoPrint / Moonraker](#octoprintmoonraker)
|
||||
- [Olivetin](#olivetin)
|
||||
- [OpenHAB](#openhab)
|
||||
- [OpenWeatherMap](#openweathermap)
|
||||
- [Paperless-NGX](#paperlessng)
|
||||
- [PeaNUT](#peanut)
|
||||
- [PiAlert](#pialert)
|
||||
- [PiHole](#pihole)
|
||||
- [Ping](#ping)
|
||||
- [Plex](#plex)
|
||||
- [Portainer](#portainer)
|
||||
- [Prometheus](#prometheus)
|
||||
- [Proxmox](#proxmox)
|
||||
- [qBittorrent](#qbittorrent)
|
||||
- [rTorrent](#rtorrent)
|
||||
- [SABnzbd](#sabnzbd)
|
||||
- [Scrutiny](#scrutiny)
|
||||
- [Speedtest Tracker](#speedtesttracker)
|
||||
- [Tautulli](#tautulli)
|
||||
- [Tdarr](#tdarr)
|
||||
- [Traefik](#traefik)
|
||||
- [Transmission](#transmission)
|
||||
- [TrueNas Scale](#truenas-scale)
|
||||
- [Uptime Kuma](#uptime-kuma)
|
||||
- [Vaultwarden](#vaultwarden)
|
||||
- [Wallabag](#wallabag)
|
||||
- [What's Up Docker](#whats-up-docker)
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Smart cards that interact with external services are subject to CORS restrictions, therefore require one of the following:
|
||||
>
|
||||
> - All services hosted on the **same domain** as Homer (mydomain.tld/pihole, mydomain.tld/proxmox) to avoid cross-domain request entirely.
|
||||
> - All services configured to **accept cross-site requests** by sending the necessary CORS headers (either directly in service configuration or via proxy).
|
||||
> - **Use a proxy** to add the necessary CORS headers (lot of options, some of them described [here](https://enable-cors.org/server.html). Also check [`CORSair`](https://github.com/bastienwirtz/corsair), a light and simple solution)
|
||||
>
|
||||
> If you experience any issues, see the [troubleshooting](troubleshooting.md#my-service-card-doesnt-work-nothing-appears-or-offline-status-is-displayed-pi-hole-sonarr-ping-) page.
|
||||
|
||||
## Common options
|
||||
|
||||
```yaml
|
||||
- name: "My Service"
|
||||
type: "<type>"
|
||||
logo: "assets/tools/sample.png" # Optional
|
||||
url: https://my-service.url # Optional: Card link and API base url unless 'endpoint' is provided (see below)
|
||||
endpoint: https://my-service-api.url # Optional: alternative base URL used to fetch service data when necessary.
|
||||
useCredentials: false # Optional: Override global proxy.useCredentials configuration.
|
||||
headers: # Optional: Override global proxy.headers configuration.
|
||||
```
|
||||
|
||||
If a subtitle is provided, (using the `subtitle` configuration key), **it will override (hide)** any custom information displayed on the subtitle line by the custom integration.
|
||||
|
||||
## AdGuard Home
|
||||
|
||||
Displays AdGuard Home protection status and blocked query statistics.
|
||||
|
||||
```yaml
|
||||
- name: "AdGuard Home"
|
||||
type: "AdGuardHome"
|
||||
logo: "assets/tools/sample.png"
|
||||
url: https://my-service.url
|
||||
```
|
||||
|
||||
> **Note**: If AdGuard Home’s web user is password-protected, you must pass Authorization HTTP header along with all requests. It can be done using a proxy or adding the following to the item configuration:
|
||||
>
|
||||
> ```yaml
|
||||
> headers:
|
||||
> Authorization: "Basic <base64-encoded for username:password>"
|
||||
> ```
|
||||
|
||||
## Copy to Clipboard
|
||||
|
||||
Displays a service card with a copy button that copies the specified text to your clipboard when clicked.
|
||||
|
||||
```yaml
|
||||
- name: "Copy me!"
|
||||
type: "CopyToClipboard"
|
||||
logo: "assets/tools/sample.png"
|
||||
subtitle: "Click the copy icon to copy text"
|
||||
clipboard: "this text will be copied to your clipboard"
|
||||
url: "https://optional-link.com" # optional: opens when clicking the card (not the copy button)
|
||||
```
|
||||
|
||||
## Docker Socket Proxy
|
||||
|
||||
Displays counts of running, stopped, and error containers from Docker Socket Proxy.
|
||||
|
||||
```yaml
|
||||
- name: "Docker"
|
||||
type: "DockerSocketProxy"
|
||||
logo: "assets/tools/sample.png"
|
||||
endpoint: "https://my-service-api.url:port"
|
||||
```
|
||||
|
||||
## Docuseal
|
||||
|
||||
Displays the Docuseal version.
|
||||
|
||||
```yaml
|
||||
- name: Docuseal
|
||||
type: Docuseal
|
||||
logo: "assets/tools/sample.png"
|
||||
url: https://my-service.url
|
||||
```
|
||||
|
||||
## Emby / Jellyfin
|
||||
|
||||
Displays stats from your Emby or Jellyfin server.
|
||||
The `libraryType` configuration let you choose which stats to show.
|
||||
|
||||
```yaml
|
||||
- name: "Emby"
|
||||
type: "Emby"
|
||||
logo: "assets/tools/sample.png"
|
||||
url: https://my-service.url
|
||||
apikey: "<---insert-api-key-here--->"
|
||||
libraryType: "music" # Choose which stats to show. Can be one of: music, series or movies.
|
||||
```
|
||||
|
||||
## FreshRSS
|
||||
|
||||
Displays unread article count and total subscriptions from your FreshRSS server.
|
||||
|
||||
```yaml
|
||||
- name: "FreshRSS"
|
||||
type: "FreshRSS"
|
||||
url: https://my-service.url
|
||||
updateInterval: 5000 # (Optional) Interval (in ms) for updating the stats
|
||||
username: "<---your-username--->"
|
||||
password: "<---your-password--->"
|
||||
```
|
||||
|
||||
## Gatus
|
||||
|
||||
The Gatus service displays information about the configured services from the defined Gatus server.
|
||||
Two lines are needed in the config.yml :
|
||||
|
||||
```yaml
|
||||
type: "Gatus"
|
||||
url: "http://192.168.0.151/gatus"
|
||||
|
||||
```
|
||||
|
||||
Optionally, the results can be filtered to only include jobs in the defined groups:
|
||||
```yaml
|
||||
groups: [Services, External]
|
||||
```
|
||||
|
||||
The status can be checked regularly by defining an update Interval in ms:
|
||||
```yaml
|
||||
updateInterval: 5000
|
||||
```
|
||||
|
||||
The average times can be hidden (saves their calculation also) by setting the following:
|
||||
```yaml
|
||||
hideaverages: true
|
||||
```
|
||||
|
||||
## Gitea / Forgejo
|
||||
|
||||
Displays a Gitea / Forgejo version.
|
||||
|
||||
```yaml
|
||||
- name: Forgejo
|
||||
type: Gitea
|
||||
logo: "assets/tools/sample.png"
|
||||
url: https://my-service.url
|
||||
```
|
||||
|
||||
## Glances
|
||||
|
||||
Displays system metrics (CPU, memory, swap, load) from a Glances server.
|
||||
|
||||
```yaml
|
||||
- name: "System Metrics"
|
||||
type: "Glances"
|
||||
icon: "fa-solid fa-heart-pulse"
|
||||
url: https://my-service.url
|
||||
stats: [cpu, mem] # Options: load, cpu, mem, swap
|
||||
```
|
||||
|
||||
If you don't already have a glances server up and running, here is a sample Docker compose file to get you started:
|
||||
|
||||
```yml
|
||||
---
|
||||
services:
|
||||
glances:
|
||||
image: nicolargo/glances:latest
|
||||
container_name: glances
|
||||
environment:
|
||||
- TZ=Europe/Rome
|
||||
- GLANCES_OPT=-w
|
||||
ports:
|
||||
- 61208:61208
|
||||
restart: unless-stopped
|
||||
```
|
||||
|
||||
## Gotify
|
||||
|
||||
Displays the number of outstanding messages and system health status.
|
||||
|
||||
```yaml
|
||||
- name: "Gotify"
|
||||
type: "Gotify"
|
||||
url: https://my-service.url
|
||||
apikey: "<---insert-client-token-here--->"
|
||||
```
|
||||
|
||||
**API Token**: Use a **client token** (not an app token).
|
||||
|
||||
## Healthchecks
|
||||
|
||||
Displays status counts (up/down/grace) from your Healthchecks monitoring service.
|
||||
|
||||
```yaml
|
||||
- name: "Healthchecks"
|
||||
type: "Healthchecks"
|
||||
url: https://my-service.url
|
||||
apikey: "<---insert-api-key-here--->"
|
||||
```
|
||||
|
||||
**API Key**: Found in Healthchecks web interface under **Settings > API Access > API key (read-only)**.
|
||||
|
||||
## Home Assistant
|
||||
|
||||
Displays Home Assistant instance status, version, location, and entity count.
|
||||
|
||||
```yaml
|
||||
- name: "Home Assistant"
|
||||
type: "HomeAssistant"
|
||||
logo: "assets/tools/sample.png"
|
||||
url: https://my-service.url
|
||||
apikey: "<---insert-long-lived-access-token-here--->"
|
||||
items: [] # optional: "name", "version", "entities"
|
||||
separator: " " # optional
|
||||
```
|
||||
|
||||
**API Token**: Create a long-lived access token in Home Assistant:
|
||||
1. Go to **Profile > Security > Long-lived access tokens**
|
||||
2. Click **Create Token**
|
||||
|
||||
**CORS Configuration**: Edit Home Assistant `configuration.yml` and add Homer's IP:
|
||||
```yaml
|
||||
http:
|
||||
cors_allowed_origins:
|
||||
- "http://homer.local:8080"
|
||||
- "https://your-homer-domain.com"
|
||||
```
|
||||
|
||||
## Immich
|
||||
|
||||
Displays user count, photo/video counts, and storage usage from your Immich server.
|
||||
|
||||
```yaml
|
||||
- name: "Immich"
|
||||
type: "Immich"
|
||||
logo: "assets/tools/sample.png"
|
||||
url: https://my-service.url
|
||||
apikey: "<---insert-api-key-here--->"
|
||||
```
|
||||
|
||||
**Requirements**: Immich server version `1.118.0` or later
|
||||
**API Key**: Create an API key in Immich web interface under **Administration > API Keys**
|
||||
|
||||
## Jellystat
|
||||
|
||||
Display the number of concurrent streams on your jellyfin server.
|
||||
|
||||
```yaml
|
||||
- name: "Jellystat"
|
||||
type: "Jellystat"
|
||||
logo: "assets/tools/sample.png"
|
||||
url: https://my-service.url
|
||||
apikey: "<---insert-api-key-here--->"
|
||||
```
|
||||
|
||||
**API Key**: You can create an API key in the dashboard of you jellystat server: settings/API Keys -> Add Key
|
||||
|
||||
|
||||
## Lidarr, Prowlarr, Sonarr, Readarr and Radarr
|
||||
|
||||
Displays Activity (blue), Missing (purple) Warning (orange) or Error (red) notifications bubbles from the Lidarr, Readarr, Radarr or Sonarr application.
|
||||
Two lines are needed in the `config.yml`:
|
||||
|
||||
```yaml
|
||||
- name: "Lidarr"
|
||||
type: "Lidarr" # "Lidarr" "Prowlarr", "Radarr" or "Sonarr"
|
||||
logo: "assets/tools/sample.png"
|
||||
url: https://my-service.url
|
||||
checkInterval: 5000 # (Optional) Interval (in ms) for updating the status
|
||||
apikey: "<---insert-api-key-here--->"
|
||||
```
|
||||
|
||||
The url must be the root url of Lidarr, Prowlarr, Readarr, Radarr or Sonarr application.
|
||||
|
||||
**API Key**: The Lidarr, Prowlarr, Readarr, Radarr or Sonarr API key can be found in `Settings` > `General`. It is needed to access the API.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> **Radarr API V3 support**: If you are using an older version of Radarr or Sonarr which don't support the new V3 api endpoints, add the following line to your service config `"legacyApi: true"`
|
||||
|
||||
## Linkding
|
||||
|
||||
This integration makes it possible to query Linkding and list multiple results from Linkding.
|
||||
Linkding has to be configured with CORS enabled. Linkding does not support that, but a reverse proxy in front can fix that.
|
||||
This integration supports at max 15 results from Linkding, but you can add it multiple times to you dashboard with different queries to retrieve what you need.
|
||||
|
||||
```yaml
|
||||
- name: "Linkding"
|
||||
type: "Linkding"
|
||||
url: https://my-service.url
|
||||
token: "<---insert-api-key-here--->"
|
||||
limit: 10 # Maximum number of items returned by Linkding, minimal 1 and max 15
|
||||
query: "#ToDo #Homer" # query to do on Linkding. Use #tagname to search for tags
|
||||
```
|
||||
|
||||
## Matrix
|
||||
|
||||
Displays a Matrix version, and shows if the server is online.
|
||||
|
||||
```yaml
|
||||
- name: "Matrix - Server"
|
||||
type: "Matrix"
|
||||
logo: "assets/tools/sample.png"
|
||||
url: "http://matrix.example.com"
|
||||
```
|
||||
|
||||
## Mealie
|
||||
|
||||
Displays the number of recipes Mealie is keeping organized or the planned meal for today if one is planned.
|
||||
|
||||
```yaml
|
||||
- name: "Mealie"
|
||||
type: "Mealie"
|
||||
logo: "assets/tools/sample.png"
|
||||
url: https://my-service.url
|
||||
apikey: "<---insert-api-key-here--->"
|
||||
```
|
||||
|
||||
**API Key**: You will have to set an API key in the field `apikey` which can be created in your Mealie installation.
|
||||
The API page can be found: Click on hamburger menu -> Click on your profile -> Click on "Manage your API Tokens"
|
||||
|
||||
## Medusa
|
||||
|
||||
Displays News (grey), Warning (orange) or Error (red) notifications bubbles from the Medusa application.
|
||||
|
||||
```yaml
|
||||
- name: "Medusa"
|
||||
type: "Medusa"
|
||||
logo: "assets/tools/sample.png"
|
||||
url: https://my-service.url
|
||||
apikey: "<---insert-api-key-here--->"
|
||||
```
|
||||
|
||||
The url must be the root url of Medusa application.
|
||||
|
||||
**API Key**: The Medusa API key can be found in General configuration > Interface. It is needed to access Medusa API.
|
||||
|
||||
## Miniflux
|
||||
|
||||
Displays the number of unread articles from your Miniflux RSS reader.
|
||||
|
||||
```yaml
|
||||
- name: "Miniflux"
|
||||
type: "Miniflux"
|
||||
logo: "assets/tools/sample.png"
|
||||
url: https://my-service.url
|
||||
apikey: "<---insert-api-key-here--->"
|
||||
style: "status" # Either "status" or "counter"
|
||||
checkInterval: 60000 # Optional: Interval (in ms) for updating the unread count
|
||||
```
|
||||
|
||||
**API Key**: Generate an API key in Miniflux web interface under **Settings > API Keys > Create a new API key**
|
||||
|
||||
## Nextcloud
|
||||
|
||||
Displays Nextcloud version and shows if Nextcloud is online, offline, or in [maintenance
|
||||
mode](https://docs.nextcloud.com/server/stable/admin_manual/maintenance/upgrade.html#maintenance-mode).
|
||||
|
||||
```yaml
|
||||
- name: Nextcloud
|
||||
type: Nextcloud
|
||||
logo: assets/tools/sample.png
|
||||
url: https://my-service.url
|
||||
```
|
||||
|
||||
## OctoPrint/Moonraker
|
||||
|
||||
The OctoPrint/Moonraker service only needs an `apikey` & `endpoint` and optionally a `display` or `url` option. `url` can be used when you click on the service it will launch the `url`
|
||||
Moonraker's API mimmicks a few of OctoPrint's endpoints which makes these services compatible. See <https://moonraker.readthedocs.io/en/latest/web_api/#octoprint-api-emulation> for details.
|
||||
|
||||
```yaml
|
||||
- name: "Octoprint"
|
||||
type: "OctoPrint"
|
||||
logo: assets/tools/sample.png
|
||||
endpoint: "https://my-service-api.url:port"
|
||||
apikey: "<---insert-api-key-here--->"
|
||||
display: "text" # 'text' or 'bar'. Default to `text`.
|
||||
|
||||
```
|
||||
|
||||
## Olivetin
|
||||
|
||||
Displays a Olivetin version.
|
||||
|
||||
```yaml
|
||||
- name: Olivetin
|
||||
type: Olivetin
|
||||
logo: assets/tools/sample.png
|
||||
url: https://my-service.url
|
||||
```
|
||||
|
||||
## OpenHAB
|
||||
|
||||
Displays OpenHAB system status, things count, and items count.
|
||||
|
||||
```yaml
|
||||
- name: "OpenHAB"
|
||||
type: "OpenHAB"
|
||||
logo: "assets/tools/sample.png"
|
||||
url: https://my-service.url
|
||||
apikey: "<---insert-api-key-here--->"
|
||||
things: true # query things API for counts
|
||||
items: true # query items API for counts
|
||||
```
|
||||
|
||||
**API Token**: Create an API token following the [official OpenHAB documentation](https://www.openhab.org/docs/configuration/apitokens.html)
|
||||
|
||||
**CORS Configuration**: Edit `services/runtime.cfg` and add:
|
||||
|
||||
```ini
|
||||
org.openhab.cors:enable=true
|
||||
```
|
||||
|
||||
## OpenWeatherMap
|
||||
|
||||
Using the OpenWeatherMap service you can display weather information about a given location.
|
||||
The following configuration is available for the OpenWeatherMap service:
|
||||
|
||||
```yaml
|
||||
- name: "Weather"
|
||||
type: "OpenWeather"
|
||||
apikey: "<---insert-api-key-here--->" # Request one from https://openweathermap.org/api.
|
||||
location: "Amsterdam" # your location.
|
||||
locationId: "2759794" # Optional: Specify OpenWeatherMap city ID for better accuracy
|
||||
units: "metric" # units to display temperature. Can be one of: metric, imperial, kelvin. Defaults to kelvin.
|
||||
background: "square" # choose which type of background you want behind the image. Can be one of: square, circle, none. Defaults to none.
|
||||
|
||||
```
|
||||
|
||||
**Remarks:**
|
||||
If for some reason your city can't be found by entering the name in the `location` property, you could also try to configure the OWM city ID in the `locationId` property. To retrieve your specific City ID, go to the [OWM website](https://openweathermap.org), search for your city and retrieve the ID from the URL (for example, the City ID of Amsterdam is 2759794).
|
||||
|
||||
## Paperless-NGX
|
||||
|
||||
Displays total number of documents stored.
|
||||
|
||||
```yaml
|
||||
- name: "Paperless"
|
||||
type: "PaperlessNG"
|
||||
logo: "assets/tools/sample.png"
|
||||
url: https://my-service.url
|
||||
apikey: "<---insert-api-key-here--->"
|
||||
```
|
||||
|
||||
**API Key**: API key can be generated in Settings > Administration > Auth Tokens
|
||||
|
||||
## PeaNUT
|
||||
|
||||
Displays current status and UPS load of the UPS device.
|
||||
|
||||
```yaml
|
||||
- name: "PeaNUT"
|
||||
type: PeaNUT
|
||||
logo: "assets/tools/sample.png"
|
||||
url: https://my-service.url
|
||||
# device: "ups" # The ID of the device
|
||||
```
|
||||
|
||||
## PiAlert
|
||||
|
||||
Displays stats from your PiAlert server.
|
||||
|
||||
```yaml
|
||||
- name: "PiAlert"
|
||||
type: "PiAlert"
|
||||
logo: "assets/tools/sample.png"
|
||||
url: https://my-service.url
|
||||
updateInterval: 5000 # (Optional) Interval (in ms) for updating the stats
|
||||
```
|
||||
|
||||
## PiHole
|
||||
|
||||
Displays info about your local PiHole instance right on your Homer dashboard.
|
||||
|
||||
```yaml
|
||||
- name: "Pi-hole"
|
||||
type: "PiHole"
|
||||
logo: "assets/tools/sample.png"
|
||||
url: https://my-service.url
|
||||
# endpoint: "https://my-service-api.url" # optional, For v6 API, this is the base URL used to fetch Pi-hole data overwriting the url
|
||||
apikey: "<---insert-api-key-here--->" # optional, needed if web interface is password protected
|
||||
apiVersion: 5 # optional, defaults to 5. Use 6 if your PiHole instance uses API v6
|
||||
checkInterval: 3000 # optional, defaults to 300000. interval in ms to check Pi-hole status
|
||||
```
|
||||
|
||||
**API Key**: Required only if Pi-hole web interface is password protected. Go to **Settings > API/Web Interface > Show API token**
|
||||
|
||||
**API Versions**:
|
||||
|
||||
- **v5** (default): Uses legacy API endpoints
|
||||
- **v6**: Uses modern API with session management - set `apiVersion: 6`
|
||||
|
||||
## Ping
|
||||
|
||||
Checks if the target link is available and displays the round trip time (RTT) of the request.
|
||||
By default the HEAD method is used but it can be configured to use GET using the optional `method` property.
|
||||
Optionally, use `successCodes` to define which HTTP response status codes should be considered as available status.
|
||||
|
||||
```yaml
|
||||
- name: "Awesome app"
|
||||
type: Ping
|
||||
logo: "assets/tools/sample.png"
|
||||
url: "https://www.wikipedia.org/"
|
||||
# method: "head"
|
||||
# successCodes: [200, 418] # Optional, default to all 2xx HTTP response status codes
|
||||
# timeout: 500 # Timeout in ms before ping is aborted. Default 2000
|
||||
# subtitle: "Bookmark example" # By default, request round trip time is displayed when subtitle is not set
|
||||
# updateInterval: 5000 # (Optional) Interval (in ms) for updating ping status
|
||||
```
|
||||
|
||||
## Plex
|
||||
|
||||
Displays active streams, total movies, and total TV series from your Plex server.
|
||||
|
||||
```yaml
|
||||
- name: "Plex"
|
||||
type: "Plex"
|
||||
logo: "assets/tools/sample.png"
|
||||
url: "https://my-service.url/web"
|
||||
endpoint: "https://my-service.url"
|
||||
token: "<---insert-plex-token-here--->"
|
||||
```
|
||||
|
||||
**Plex Token**: See [How to find your Plex token](https://www.plexopedia.com/plex-media-server/general/plex-token/)
|
||||
|
||||
## Portainer
|
||||
|
||||
Displays container counts (running/dead/misc), version, and online status from your Portainer instance.
|
||||
|
||||
```yaml
|
||||
- name: "Portainer"
|
||||
type: "Portainer"
|
||||
logo: "assets/tools/sample.png"
|
||||
url: https://my-service.url
|
||||
apikey: "<---insert-api-key-here--->"
|
||||
environments: # optional: specific environments to check
|
||||
- "raspberry"
|
||||
- "local"
|
||||
```
|
||||
|
||||
**Requirements**: Portainer version 1.11 or later
|
||||
|
||||
**API Key**: Generate an access token in Portainer UI. See [Creating an Access Token](https://docs.portainer.io/api/access#creating-an-access-token)
|
||||
|
||||
## Prometheus
|
||||
|
||||
```yaml
|
||||
- name: "Prometheus"
|
||||
type: "Prometheus"
|
||||
logo: "assets/tools/sample.png"
|
||||
url: https://my-service.url
|
||||
```
|
||||
|
||||
## Proxmox
|
||||
|
||||
Displays status information of a Proxmox node (VMs running and disk, memory and cpu used).
|
||||
|
||||
```yaml
|
||||
- name: "Proxmox - Node"
|
||||
type: "Proxmox"
|
||||
logo: "assets/tools/sample.png"
|
||||
url: https://my-service.url
|
||||
node: "your-node-name"
|
||||
warning_value: 50
|
||||
danger_value: 80
|
||||
api_token: "PVEAPIToken=root@pam!your-api-token-name=your-api-token-key"
|
||||
# values below this line are optional (default value are false/empty):
|
||||
hide_decimals: true # removes decimals from stats values.
|
||||
hide: [] # hides information. Possible values are "vms", "vms_total", "lxcs", "lxcs_total", "disk", "mem" and "cpu".
|
||||
small_font_on_small_screens: true # uses small font on small screens (like mobile)
|
||||
small_font_on_desktop: true # uses small font on desktops (just in case you're showing much info)
|
||||
```
|
||||
|
||||
**API Key**: You can set it up in Proxmox under Permissions > API Tokens. You also need to know the realm the user of the API Token is assigned to (by default pam).
|
||||
|
||||
The API Token (or the user assigned to that token if not separated permissions is checked) are this:
|
||||
|
||||
| Path | Permission | Comments |
|
||||
|---------------------|------------|-------------------------------------------------------------------|
|
||||
| /nodes/\<your-node> | Sys.Audit | |
|
||||
| /vms/\<id-vm> | VM.Audit | You need to have this permission on any VM you want to be counted |
|
||||
|
||||
It is highly recommended that you create and API Token with only these permissions on a read-only mode.
|
||||
|
||||
## qBittorrent
|
||||
|
||||
Displays the global upload and download rates, as well as the number of torrents
|
||||
listed. The service communicates with the qBittorrent API interface which needs
|
||||
to be accessible from the browser. Please consult
|
||||
[the instructions](https://github.com/qbittorrent/qBittorrent/pull/12579)
|
||||
for setting up qBittorrent.
|
||||
|
||||
```yaml
|
||||
- name: "qBittorrent"
|
||||
type: "qBittorrent"
|
||||
logo: "assets/tools/sample.png"
|
||||
url: https://my-service.url # Your rTorrent web UI, f.e. ruTorrent or Flood.
|
||||
rateInterval: 2000 # Interval for updating the download and upload rates.
|
||||
torrentInterval: 5000 # Interval for updating the torrent count.
|
||||
```
|
||||
|
||||
## rTorrent
|
||||
|
||||
Displays the global upload and download rates, as well as the number of torrents
|
||||
listed in rTorrent. The service communicates with the rTorrent XML-RPC interface which needs
|
||||
to be accessible from the browser. Please consult
|
||||
[the instructions](https://github.com/rakshasa/rtorrent-doc/blob/master/RPC-Setup-XMLRPC.md)
|
||||
for setting up rTorrent.
|
||||
|
||||
```yaml
|
||||
- name: "rTorrent"
|
||||
type: "Rtorrent"
|
||||
logo: "assets/tools/sample.png"
|
||||
url: "https://my-service.url" # Your rTorrent web UI, f.e. ruTorrent or Flood.
|
||||
xmlrpc: "https://my-service.url:port" # Reverse proxy for rTorrent's XML-RPC.
|
||||
rateInterval: 5000 # Interval for updating the download and upload rates.
|
||||
torrentInterval: 60000 # Interval for updating the torrent count.
|
||||
username: "username" # Username for logging into rTorrent (if applicable).
|
||||
password: "password" # Password for logging into rTorrent (if applicable).
|
||||
```
|
||||
|
||||
## SABnzbd
|
||||
|
||||
Displays the number of currently active downloads on your SABnzbd instance.
|
||||
|
||||
```yaml
|
||||
- name: "SABnzbd"
|
||||
type: "SABnzbd"
|
||||
logo: "assets/tools/sample.png"
|
||||
url: https://my-service.url
|
||||
apikey: "<---insert-api-key-here--->"
|
||||
downloadInterval: 5000 # (Optional) Interval (in ms) for updating the download count
|
||||
```
|
||||
|
||||
**API Key**: An API key is required, and can be obtained from the "Config" > "General" section of the SABnzbd config in the web UI.
|
||||
|
||||
## Scrutiny
|
||||
|
||||
Displays info about the total number of disk passed and failed S.M.A.R.T and scrutiny checks
|
||||
|
||||
```yaml
|
||||
- name: "Scrutiny"
|
||||
type: "Scrutiny"
|
||||
logo: "assets/tools/sample.png"
|
||||
url: https://my-service.url
|
||||
updateInterval: 5000 # (Optional) Interval (in ms) for updating the status
|
||||
```
|
||||
|
||||
## SpeedtestTracker
|
||||
|
||||
Displays the download and upload speeds in Mbit/s and the ping in ms.
|
||||
|
||||
```yaml
|
||||
- name: "Speedtest Tracker"
|
||||
type: "SpeedtestTracker"
|
||||
logo: "assets/tools/sample.png"
|
||||
url: https://my-service.url
|
||||
```
|
||||
|
||||
## Tautulli
|
||||
|
||||
Displays the number of currently active streams on you Plex instance.
|
||||
|
||||
```yaml
|
||||
- name: "Tautulli"
|
||||
type: "Tautulli"
|
||||
logo: "assets/tools/sample.png"
|
||||
url: https://my-service.url
|
||||
checkInterval: 5000 # (Optional) Interval (in ms) for updating the status
|
||||
apikey: "<---insert-api-key-here--->"
|
||||
```
|
||||
|
||||
**API Key**: An API key is required, and can be obtained from the "Web Interface" section of settings on the Tautulli web UI.
|
||||
|
||||
Because the service type and link don't necessarily have to match, you could
|
||||
even make the service type Tautulli on your Plex card and provide a separate
|
||||
endpoint pointing to Tautulli!
|
||||
|
||||
```yaml
|
||||
- name: "Plex"
|
||||
type: "Tautulli"
|
||||
logo: "assets/tools/sample.png"
|
||||
url: https://my-plex.url/web # Plex
|
||||
endpoint: https://my-tautulli.url # Tautulli
|
||||
apikey: "<---insert-api-key-here--->"
|
||||
```
|
||||
|
||||
## Tdarr
|
||||
|
||||
Displays the number of currently queued items for transcoding on your Tdarr instance as well as the number of errored items.
|
||||
|
||||
```yaml
|
||||
- name: "Tdarr"
|
||||
type: "Tdarr"
|
||||
logo: "assets/tools/sample.png"
|
||||
url: https://my-service.url
|
||||
checkInterval: 5000 # (Optional) Interval (in ms) for updating the queue & error counts
|
||||
```
|
||||
|
||||
## Traefik
|
||||
|
||||
Displays Traefik.
|
||||
|
||||
```yaml
|
||||
- name: "Traefik"
|
||||
type: "Traefik"
|
||||
logo: "assets/tools/sample.png"
|
||||
url: "http://traefik.example.com"
|
||||
# basic_auth: "admin:password" # (Optional) Send Authorization header.
|
||||
```
|
||||
|
||||
**Authentication**: If BasicAuth is set, credentials will be encoded in Base64 and sent as an Authorization header (`Basic <encoded_value>`). The value must be formatted as "admin:password".
|
||||
|
||||
## Transmission
|
||||
|
||||
Displays the global upload and download rates, as well as the number of active torrents from your Transmission daemon.
|
||||
The service communicates with the Transmission RPC interface which needs to be accessible from the browser.
|
||||
|
||||
```yaml
|
||||
- name: "Transmission"
|
||||
logo: "assets/tools/sample.png"
|
||||
url: "http://192.168.1.2:9091" # Your Transmission web interface URL
|
||||
type: "Transmission"
|
||||
auth: "username:password" # Optional: HTTP Basic Auth
|
||||
interval: 5000 # Optional: Interval for refreshing data (ms)
|
||||
target: "_blank" # Optional: HTML a tag target attribute
|
||||
```
|
||||
|
||||
The service automatically handles Transmission's session management and CSRF protection.
|
||||
|
||||
## Truenas Scale
|
||||
|
||||
Displays TrueNAS version.
|
||||
|
||||
```yaml
|
||||
- name: "Truenas"
|
||||
type: "TruenasScale"
|
||||
logo: "assets/tools/sample.png"
|
||||
url: https://my-service.url
|
||||
api_token: "<---insert-api-key-here--->"
|
||||
```
|
||||
|
||||
## Uptime Kuma
|
||||
|
||||
Displays overall status, uptime percentage, and incident information from your Uptime Kuma status page.
|
||||
|
||||
```yaml
|
||||
- name: "Uptime Kuma"
|
||||
type: "UptimeKuma"
|
||||
logo: "assets/tools/sample.png"
|
||||
url: https://my-service.url
|
||||
slug: "default" # status page slug, defaults to "default"
|
||||
```
|
||||
|
||||
**Requirements**: Uptime Kuma version `1.13.1` or later (for [multiple status pages support](https://github.com/louislam/uptime-kuma/releases/tag/1.13.1))
|
||||
|
||||
## Vaultwarden
|
||||
|
||||
Displays Vaultwarden version and status.
|
||||
|
||||
```yaml
|
||||
- name: "Vaultwarden - Server"
|
||||
type: "Vaultwarden"
|
||||
logo: "assets/tools/sample.png"
|
||||
url: https://my-service.url
|
||||
```
|
||||
|
||||
## Wallabag
|
||||
|
||||
Displays Wallabag version.
|
||||
|
||||
```yaml
|
||||
- name: Wallabag
|
||||
type: Wallabag
|
||||
logo: "assets/tools/sample.png"
|
||||
url: https://my-service.url
|
||||
```
|
||||
|
||||
## What's up Docker
|
||||
|
||||
Display info about the number of container running and the number for which an update is available on your Homer dashboard.
|
||||
|
||||
```yaml
|
||||
- name: "What's Up Docker"
|
||||
type: "WUD"
|
||||
logo: "assets/tools/sample.png"
|
||||
url: https://my-service.url
|
||||
subtitle: "Docker image update notifier"
|
||||
```
|
||||
|
|
@ -1,16 +1,56 @@
|
|||
## Development
|
||||
# Development
|
||||
|
||||
If you want to contribute to Homer, please read the [contributing guidelines](https://github.com/bastienwirtz/homer/blob/main/CONTRIBUTING.md) first.
|
||||
|
||||
```sh
|
||||
# Using yarn (recommended)
|
||||
yarn install
|
||||
yarn serve
|
||||
|
||||
# **OR** Using npm
|
||||
npm install
|
||||
npm run serve
|
||||
pnpm install
|
||||
pnpm dev
|
||||
```
|
||||
|
||||
### Themes
|
||||
## Custom services
|
||||
|
||||
Custom services are small VueJs component (see `src/components/services/`) that add little features to a classic, "static", dashboard item. It should be very simple.
|
||||
A dashboard can contain a lot of items, so performance is very important.
|
||||
|
||||
The [`Generic`](https://github.com/bastienwirtz/homer/blob/main/src/components/services/Generic.vue) service provides a typical card layout which
|
||||
you can extend to add specific features. Unless you want a completely different design, extended the generic service is the recommended way. It gives you 3 [slots](https://vuejs.org/v2/guide/components-slots.html#Named-Slots) to extend: `icon`, `content` and `indicator`.
|
||||
Each one is **optional**, and will display the usual information if omitted.
|
||||
|
||||
Each service must implement the `item` [property](https://vuejs.org/v2/guide/components-props.html) and bind it the Generic component if used.
|
||||
|
||||
### Skeleton
|
||||
|
||||
```Vue
|
||||
<template>
|
||||
<Generic :item="item">
|
||||
<template #icon>
|
||||
<!-- left area containing the icon -->
|
||||
</template>
|
||||
<template #content>
|
||||
<!-- main area containing the title, subtitle, ... -->
|
||||
</template>
|
||||
<template #indicator>
|
||||
<!-- top right area, empty by default -->
|
||||
</template>
|
||||
</Generic>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Generic from "./Generic.vue";
|
||||
|
||||
export default {
|
||||
name: "MyNewService",
|
||||
props: {
|
||||
item: Object,
|
||||
},
|
||||
components: {
|
||||
Generic,
|
||||
}
|
||||
};
|
||||
</script>
|
||||
```
|
||||
|
||||
## Themes
|
||||
|
||||
Themes are meant to be simple customization (written in [scss](https://sass-lang.com/documentation/syntax)).
|
||||
To add a new theme, just add a file in the theme directory, and put all style in the `body #app.theme-<name>` scope. Then import it in the main style file.
|
||||
|
|
|
|||
83
docs/kubernetes.md
Normal file
83
docs/kubernetes.md
Normal file
|
|
@ -0,0 +1,83 @@
|
|||
# Kubernetes Installation
|
||||
|
||||
We have different solution to install Homer on Kubernetes Cluster, each solution responds to a specific need.
|
||||
|
||||
## Table of Contents
|
||||
|
||||
- [Helm Chart](#helm-chart)
|
||||
- [Controller With CRDs](#controller-crds)
|
||||
- [Controller With Ingress Annotations](#controller-annotations)
|
||||
- [Operator](#Operator)
|
||||
|
||||
## Helm Chart
|
||||
|
||||
To deploy Homer in Kubernetes
|
||||
|
||||
Thanks to [@djjudas21](https://github.com/djjudas21) [charts](https://github.com/djjudas21/charts/tree/main/charts/homer):
|
||||
|
||||
### Installation
|
||||
|
||||
```sh
|
||||
helm repo add djjudas21 https://djjudas21.github.io/charts/
|
||||
helm repo update djjudas21
|
||||
|
||||
# install with all defaults
|
||||
helm install homer djjudas21/homer
|
||||
|
||||
# install with customisations
|
||||
wget https://raw.githubusercontent.com/djjudas21/charts/main/charts/homer/values.yaml
|
||||
# edit values.yaml
|
||||
helm install homer djjudas21/homer -f values.yaml
|
||||
```
|
||||
|
||||
## Controller CRDs
|
||||
|
||||
To deploy Homer in Kubernetes with [Custom Resources Definition](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/) to dynamic declaration for Homer Service
|
||||
|
||||
Thanks to [@jplanckeel](https://github.com/jplanckeel) [homer-k8s](https://github.com/bananaops/homer-k8s/tree/main/):
|
||||
|
||||
### Installation
|
||||
|
||||
```sh
|
||||
helm repo add bananaops https://bananaops.github.io/homer-k8s/
|
||||
helm repo update bananaops
|
||||
|
||||
# install with all defaults
|
||||
helm install homer bananaops/homer-k8s
|
||||
|
||||
# install with customisations
|
||||
wget https://raw.githubusercontent.com/bananaops/homer-k8s/main/helm/homer-k8s/values.yaml
|
||||
# edit values.yaml
|
||||
helm install homer bananaops/homer-k8s -f values.yaml
|
||||
```
|
||||
|
||||
### Usage
|
||||
|
||||
- [usage](https://github.com/bananaops/homer-k8s/tree/main/?tab=readme-ov-file#crds-homerservices)
|
||||
|
||||
## Controller Annotations
|
||||
|
||||
To deploy Homer in Kubernetes with controller to check ingress annotation and modify homer configuration
|
||||
|
||||
Thanks to [@paulfantom](https://github.com/paulfantom) [homer-reloader](https://github.com/paulfantom/homer-reloader/tree/main/):
|
||||
|
||||
|
||||
## Operator
|
||||
|
||||
To deploy many Homer in Kubernetes with [Custom Resources Definition](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/)
|
||||
|
||||
Thanks to [@rajsinghtech](https://github.com/rajsinghtech) [homer-operator](https://github.com/rajsinghtech/homer-operator/tree/main/):
|
||||
|
||||
|
||||
### Installation
|
||||
|
||||
```sh
|
||||
# install with customisations
|
||||
wget https://raw.githubusercontent.com/rajsinghtech/homer-operator/main/deploy/operator.yaml
|
||||
# Apply operator file
|
||||
kubectl apply -f operator.yaml
|
||||
```
|
||||
|
||||
### Usage
|
||||
|
||||
- [usage](https://github.com/rajsinghtech/homer-operator?tab=readme-ov-file#usage)
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 50 KiB |
90
docs/theming.md
Normal file
90
docs/theming.md
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
# Theming
|
||||
|
||||
## Change theme
|
||||
|
||||
The default theme can be changed using the yaml configuration file
|
||||
|
||||
```yaml
|
||||
theme: default # 'default', 'walkxcode', or 'neon' see files in 'src/assets/themes'.
|
||||
```
|
||||
|
||||
## Colors and background customization
|
||||
|
||||
Default colors and background can be customized for each theme variant (light and dark), using either the yaml config file, or the css variables (see "Additional stylesheets" below).
|
||||
|
||||
### Available options
|
||||
|
||||
| yaml | css | description |
|
||||
| --------------------- | ----------------------- | --- |
|
||||
| `highlight-primary` | `--highlight-primary` | header background, group title icons |
|
||||
| `highlight-secondary` | `--highlight-secondary` | navbar background, default tag color |
|
||||
| `highlight-hover` | `--highlight-hover` | navbar links hover, search input background |
|
||||
| `background` | `--background` | page background color |
|
||||
| `card-background` | `--card-background` | service card background color |
|
||||
| `text` | `--text` | main text color |
|
||||
| `text-header` | `--text-header` | header text color |
|
||||
| `text-title` | `--text-title` | service card title color |
|
||||
| `text-subtitle` | `--text-subtitle` | service card subtitle color |
|
||||
| `card-shadow` | `--card-shadow` | Service card `box-shadow` |
|
||||
| `link` | `--link` | Links color (footer & message), service card icon color |
|
||||
| `link-hover` | `--link-hover` | Links hover color (footer & message), service card icon hover color |
|
||||
| `background-image` | `--background-image` | page background image url (when used in css, set `url(<image-url>)` instead of just the url. see example below)|
|
||||
|
||||
|
||||
YAML example
|
||||
|
||||
```yml
|
||||
colors:
|
||||
light:
|
||||
highlight-primary: "#3367d6"
|
||||
background-image: "assets/your/light/bg.webp"
|
||||
...
|
||||
dark:
|
||||
highlight-primary: "#3367d6"
|
||||
background-image: "assets/your/dark/bg.webp"
|
||||
...
|
||||
```
|
||||
|
||||
CSS example
|
||||
|
||||
```css
|
||||
.light {
|
||||
--highlight-primary: #3367d6;
|
||||
--background-image: url("assets/your/light/bg.webp");
|
||||
...
|
||||
}
|
||||
|
||||
.dark {
|
||||
--highlight-primary: #3367d6;
|
||||
--background-image: url("assets/your/dark/bg.webp");
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
## Additional stylesheets
|
||||
|
||||
One or more additional stylesheets can be loaded to add or override style from the current theme. Use the 'stylesheet' option in the yaml configuration file to load your own CSS file.
|
||||
|
||||
```yml
|
||||
stylesheet:
|
||||
- "assets/custom.css"
|
||||
```
|
||||
|
||||
### Customization example
|
||||
|
||||
#### Max width modification
|
||||
|
||||
```css
|
||||
body #main-section .container {
|
||||
max-width: 2000px; // adjust to your needs (eg: calc(100% - 100px), none, ...)
|
||||
}
|
||||
```
|
||||
|
||||
#### Background gradient
|
||||
|
||||
```css
|
||||
#app {
|
||||
height: 100%;
|
||||
background: linear-gradient(90deg, #5c2483, #0095db);
|
||||
}
|
||||
```
|
||||
|
|
@ -2,7 +2,15 @@
|
|||
|
||||
Here is a collection of neat tips and tricks that Homer users have come up with!
|
||||
|
||||
## Dashboard icons
|
||||
|
||||
Great source to find service icons
|
||||
|
||||
- <https://selfh.st/icons/>
|
||||
- <https://github.com/homarr-labs/dashboard-icons>
|
||||
|
||||
## Use Homer as a custom "new tab" page
|
||||
|
||||
#### `by @vosdev`
|
||||
|
||||
These extensions for [Firefox](https://addons.mozilla.org/firefox/addon/custom-new-tab-page) and [Chrome & Friends](https://chrome.google.com/webstore/detail/new-tab-changer/occbjkhimchkolibngmcefpjlbknggfh) allow you to have your homer dashboard in your new tab page, while leaving focus on the address bar meaning you can still type right away if you want to search or go to a page that is not on your homer dash.
|
||||
|
|
@ -22,11 +30,12 @@ The Firefox extension loads Homer in an iframe on your new tab page, meaning you
|
|||
```
|
||||
|
||||
## YAML Anchors
|
||||
|
||||
#### `by @JamiePhonic`
|
||||
|
||||
Since Homer is configured using YAML, it supports all of YAML's helpful features, such as anchoring!
|
||||
|
||||
For example, you can define tags and tag styles for each "item" in a service.
|
||||
For example, you can define tags and tag styles for each "item" in a service.
|
||||
Using Anchoring, you can define all your tags and their styles once like this: (for example)
|
||||
|
||||
```yaml
|
||||
|
|
@ -49,7 +58,7 @@ and then simply reference these pre-defined (anchored) tags in each item like so
|
|||
- name: "VS Code"
|
||||
logo: "/assets/vscode.png"
|
||||
subtitle: "Develop Code Anywhere, On Anything!"
|
||||
<<: *App # Reference to the predefined "App" Tag
|
||||
<<: *Apps # Reference to the predefined "App" Tag
|
||||
url: "https://vscode.example.com/"
|
||||
target: "_blank" # optional html tag target attribute
|
||||
````
|
||||
|
|
@ -69,7 +78,23 @@ Then when Homer reads your config, it will substitute your anchors automatically
|
|||
The end result is that if you want to update the name or style of any particular tag, just update it once, in the tags section!
|
||||
Great if you have a lot of services or a lot of tags!
|
||||
|
||||
## YAML auto complete with a YAML schema
|
||||
|
||||
A lot of editor support auto completion, see <https://www.schemastore.org/json/>
|
||||
The homer schema is available here: <https://raw.githubusercontent.com/bastienwirtz/homer/main/.schema/config-schema.json>
|
||||
|
||||
For example with IntelliJ you can define:
|
||||
|
||||
```yaml
|
||||
# $schema: https://raw.githubusercontent.com/bastienwirtz/homer/main/.schema/config-schema.json
|
||||
```
|
||||
With VSCode you can define it like this:
|
||||
```yaml
|
||||
# yaml-language-server: $schema=https://raw.githubusercontent.com/bastienwirtz/homer/main/.schema/config-schema.json
|
||||
```
|
||||
|
||||
## Remotely edit your config with Code Server
|
||||
|
||||
#### `by @JamiePhonic`
|
||||
|
||||
Homer doesn't yet provide a way to edit your configuration from inside Homer itself, but that doesn't mean it can't be done!
|
||||
|
|
@ -78,14 +103,17 @@ You can setup and use [Code-Server](https://github.com/cdr/code-server) to edit
|
|||
|
||||
If you're running Homer in docker, you can setup a Code-Server container and pass your homer config directory into it.
|
||||
Simply pass your homer config directory as an extra -v parameter to your code-server container:
|
||||
```
|
||||
|
||||
```sh
|
||||
-v '/your/local/homer/config-dir/':'/config/homer':'rw'
|
||||
```
|
||||
|
||||
This will map your homer config directory (For example, /docker/appdata/homer/) into code-server's `/config/` directory, in a sub folder called `homer`
|
||||
|
||||
As a bonus, Code-Server puts the "current folder" as a parameter in the URL bar, so you could add a `links:` entry in Homer that points to your code-server instance with the directory pre-filled for essentially 1 click editing!
|
||||
|
||||
For example:
|
||||
|
||||
```yml
|
||||
links:
|
||||
- name: Edit config
|
||||
|
|
@ -93,9 +121,11 @@ links:
|
|||
url: https://vscode.example.net/?folder=/config/homer
|
||||
target: "_blank" # optional html tag target attribute
|
||||
```
|
||||
|
||||
where the path after `?folder=` is the path to the folder where you mounted your homer config INSIDE the Code-Server container.
|
||||
|
||||
### Example Code-Server docker create command
|
||||
|
||||
```sh
|
||||
docker create \
|
||||
--name=code-server \
|
||||
|
|
@ -111,13 +141,13 @@ docker create \
|
|||
linuxserver/code-server
|
||||
```
|
||||
|
||||
|
||||
## Get the news headlines in Homer
|
||||
|
||||
### Mapping Fields
|
||||
|
||||
Most times, the url you're getting headlines from follows a different schema than the one expected by Homer.
|
||||
|
||||
For example, if you would like to show jokes from ChuckNorris.io, you'll find that the url https://api.chucknorris.io/jokes/random is giving you info like this:
|
||||
For example, if you would like to show jokes from ChuckNorris.io, you'll find that the url <https://api.chucknorris.io/jokes/random> is giving you info like this:
|
||||
|
||||
```json
|
||||
{
|
||||
|
|
@ -179,6 +209,38 @@ If the URL you specified returns a JSON object that defines a `title` and `conte
|
|||
|
||||
So, using [Node-Red](https://nodered.org/docs/getting-started/) and a quick flow, you can process an RSS feed to replace the message with a news item!
|
||||
|
||||
To get started, simply import [this flow](https://flows.nodered.org/flow/4b6406c9a684c26ace0430dd1826e95d) into your Node-Red instance and change the RSS feed in the "Get News RSS Feed" node to one of your choosing!
|
||||
To get started, simply import [this flow](https://flows.nodered.org/flow/4b6406c9a684c26ace0430dd1826e95d) into your Node-Red instance and change the RSS feed in the "Get News RSS Feed" node to one of your choosing!
|
||||
|
||||
So far, the flow has been tested with BBC News and Sky News, however it should be easy to modify the flow to work with other RSS feeds if they don't work out of the box!
|
||||
|
||||
## Write HTML into the dashboard
|
||||
|
||||
### Show latest camera feed
|
||||
|
||||
#### `by @matheusvellone`
|
||||
|
||||
The `message.content` config entry accepts HTML code, so you can add images.
|
||||
If you use Frigate, or have any `latest.jpg` URL for your camera, you can add it to your dashboard. You can also style the `div`/`img` tags to look nicer on your dashboard.
|
||||
|
||||
```yml
|
||||
message:
|
||||
title: Cameras
|
||||
content: >
|
||||
<div>
|
||||
<a href="http://frigate.local:5000/cameras/garage">
|
||||
<img src="http://frigate.local:5000/api/garage/latest.jpg?h=220"/>
|
||||
</a>
|
||||
<a href="http://frigate.local:5000/cameras/backyard">
|
||||
<img src="http://frigate.local:5000/api/backyard/latest.jpg?h=220"/>
|
||||
</a>
|
||||
</div>
|
||||
```
|
||||
|
||||
When using Frigate you can even add a live feed to your dashboard, like this:
|
||||
|
||||
```yml
|
||||
message:
|
||||
title: Cameras
|
||||
content: >
|
||||
<img src="http://frigate.local:5000/api/piscina"/>
|
||||
```
|
||||
61
docs/troubleshooting.md
Normal file
61
docs/troubleshooting.md
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
# Troubleshooting
|
||||
|
||||
## My docker container refuse to start / is stuck at restarting
|
||||
|
||||
You might be facing a permission issue. First of all, check your container logs (adjust the container name if necessary):
|
||||
|
||||
```sh
|
||||
$ docker logs homer
|
||||
[...]
|
||||
Assets directory not writable. Check assets directory permissions & docker user or skip default assets install by setting the INIT_ASSETS env var to 0
|
||||
```
|
||||
|
||||
In this case you need to make sure your mounted assets directory have the same GID / UID the container user have (default 1000:1000), and that the read and write permission is granted for the user or the group.
|
||||
|
||||
You can either:
|
||||
|
||||
- Update your assets directory permissions (ex: `chown -R 1000:1000 /your/assets/folder/`, `chmod -R u+rw /your/assets/folder/`)
|
||||
- Change the docker user by using the `--user` arguments with docker cli or `user: 1000:1000` with docker compose.
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> - **Do not** use env var to set the GID / UID of the user running container. Use the Docker `user` option.
|
||||
> - **Do not** use 0:0 as a user value, it would be a security risk, and it's not guaranty to work.
|
||||
|
||||
Check this [thread](https://github.com/bastienwirtz/homer/issues/459) for more information about debugging
|
||||
permission issues.
|
||||
|
||||
## My service card doesn't work, nothing appears or offline status is displayed (pi-hole, sonarr, ping, ...)
|
||||
|
||||
You might be facing a [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) (Cross Origin Request Sharing) issue.
|
||||
It happens when the targeted service is hosted on a different domain or port.
|
||||
Web browsers will not allow to fetch information from a different site without explicit permissions (the targeted service
|
||||
must include a special `Access-Control-Allow-Origin: *` HTTP headers).
|
||||
If this happens your web console (`ctrl+shift+i` or `F12`) will be filled with this kind of errors:
|
||||
|
||||
```text
|
||||
Access to fetch at 'https://<target-service>' from origin 'https://<homer>' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
|
||||
```
|
||||
|
||||
To resolve this, you can either:
|
||||
|
||||
- Host all your target service under the same domain & port.
|
||||
- Modify the target server configuration so that the response of the server included following header- `Access-Control-Allow-Origin: *` (<https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests>). It might be an option in the targeted service, otherwise depending on how the service is hosted, the proxy or web server can seamlessly add it.
|
||||
- **Use a proxy** to add the necessary CORS headers (lot of options, some of them described [here](https://enable-cors.org/server.html). Also check [`CORSair`](https://github.com/bastienwirtz/corsair), a light and simple solution)
|
||||
|
||||
## I am using an authentication proxy and homer says I am offline
|
||||
|
||||
This should be a configuration issue.
|
||||
|
||||
- Make sure the option `connectivityCheck` is set to `true` in configuration.
|
||||
- Check your proxy configuration, the expected behavior is to redirect user using a 302 to the login page when user is not authenticated.
|
||||
|
||||
## I put my API key into the OpenWeather service and it still isn't working
|
||||
|
||||
If you have just made an OpenWeatherMap account and/or a newly-made API key, there is a high chance that you need to wait for it to be activated (often a few hours). If after waiting it still doesn't work, make sure to check the location you have provided since it may be an invalid location.
|
||||
|
||||
For some basic debugging steps, you can:
|
||||
|
||||
- Check with a large city such as Amsterdam as the specified location within your configuration.
|
||||
- Make sure your web browser is running the latest version of the homer configuration after updating the location (Ctrl + Shift + R).
|
||||
- Check for errors within the browser console (Ctrl + Shift + I) relating to api.openweathermap.org
|
||||
22
dummy-data/README.md
Normal file
22
dummy-data/README.md
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
# Dummy data
|
||||
|
||||
This directory content makes possible to test custom services cards or create a demo without actually running the service.
|
||||
The principle is simple: save a sample output of the API used in the service in a static file in this directory. The path must be identical as the service endpoint to be used seamlessly.
|
||||
|
||||
## Start the mock server to expose dummy data
|
||||
|
||||
```sh
|
||||
pnpm mock
|
||||
```
|
||||
|
||||
## How to add a new services sample
|
||||
|
||||
- create a directory for your service, and any sub-folder existing in the service api path.
|
||||
- save the api output in a file named after the service endpoint.
|
||||
|
||||
Example:
|
||||
|
||||
```sh
|
||||
mkdir pihole
|
||||
curl http://my-pihole.me/admin/api.php -o pihole/api.php # /admin is omitted because for PiHole, the implementation expect it to be in the base url (`url` or `endpoint` property)
|
||||
```
|
||||
2
dummy-data/_headers
Normal file
2
dummy-data/_headers
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
/*
|
||||
Content-Type: application/json
|
||||
51
dummy-data/adguardhome/control/stats
Normal file
51
dummy-data/adguardhome/control/stats
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
{
|
||||
"time_units": "hours",
|
||||
"num_dns_queries": 28947,
|
||||
"num_blocked_filtering": 12489,
|
||||
"num_replaced_safebrowsing": 0,
|
||||
"num_replaced_safesearch": 0,
|
||||
"num_replaced_parental": 0,
|
||||
"avg_processing_time": 0.34,
|
||||
"top_queried_domains": [
|
||||
{
|
||||
"name": "example.com",
|
||||
"count": 1289
|
||||
},
|
||||
{
|
||||
"name": "api.github.com",
|
||||
"count": 892
|
||||
}
|
||||
],
|
||||
"top_clients": [
|
||||
{
|
||||
"name": "192.168.1.100",
|
||||
"count": 8945
|
||||
},
|
||||
{
|
||||
"name": "192.168.1.101",
|
||||
"count": 6234
|
||||
}
|
||||
],
|
||||
"top_blocked_domains": [
|
||||
{
|
||||
"name": "ads.google.com",
|
||||
"count": 1245
|
||||
},
|
||||
{
|
||||
"name": "tracker.example.com",
|
||||
"count": 987
|
||||
}
|
||||
],
|
||||
"dns_queries": [
|
||||
12450, 13200, 14100, 13800, 12900, 11200, 10800, 9600, 8200, 7800,
|
||||
9200, 10500, 12100, 13600, 14800, 15200, 14900, 13700, 12800, 11900,
|
||||
11200, 10800, 10200, 9800
|
||||
],
|
||||
"blocked_filtering": [
|
||||
5200, 5800, 6100, 5900, 5400, 4800, 4600, 4200, 3600, 3400,
|
||||
4000, 4500, 5200, 5800, 6300, 6500, 6300, 5800, 5400, 5100,
|
||||
4800, 4600, 4300, 4200
|
||||
],
|
||||
"replaced_safebrowsing": [],
|
||||
"replaced_parental": []
|
||||
}
|
||||
16
dummy-data/adguardhome/control/status
Normal file
16
dummy-data/adguardhome/control/status
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
{
|
||||
"protection_enabled": true,
|
||||
"version": "v0.107.48",
|
||||
"language": "en",
|
||||
"dns_address": "127.0.0.1:53",
|
||||
"dns_port": 53,
|
||||
"protection_disabled_duration": null,
|
||||
"http_port": 80,
|
||||
"https_port": 443,
|
||||
"querylog_enabled": true,
|
||||
"querylog_size": 5000,
|
||||
"querylog_size_memory": 1000,
|
||||
"querylog_interval": 2160,
|
||||
"dhcp_available": true,
|
||||
"running": true
|
||||
}
|
||||
215
dummy-data/dockersocketproxy/containers/json
Normal file
215
dummy-data/dockersocketproxy/containers/json
Normal file
|
|
@ -0,0 +1,215 @@
|
|||
[
|
||||
{
|
||||
"Id": "8dfafdbc3a40",
|
||||
"Names": ["/boring_feynman"],
|
||||
"Image": "nginx:latest",
|
||||
"ImageID": "sha256:f6d0b4767a6c",
|
||||
"Command": "/docker-entrypoint.sh nginx -g 'daemon off;'",
|
||||
"Created": 1640995200,
|
||||
"Ports": [
|
||||
{
|
||||
"IP": "0.0.0.0",
|
||||
"PrivatePort": 80,
|
||||
"PublicPort": 8080,
|
||||
"Type": "tcp"
|
||||
}
|
||||
],
|
||||
"Labels": {
|
||||
"maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
|
||||
},
|
||||
"State": "running",
|
||||
"Status": "Up 2 hours",
|
||||
"HostConfig": {
|
||||
"NetworkMode": "default"
|
||||
},
|
||||
"NetworkSettings": {
|
||||
"Networks": {
|
||||
"bridge": {
|
||||
"IPAMConfig": null,
|
||||
"Links": null,
|
||||
"Aliases": null,
|
||||
"NetworkID": "f2de39df4171",
|
||||
"EndpointID": "2cdc4edb1ded",
|
||||
"Gateway": "172.17.0.1",
|
||||
"IPAddress": "172.17.0.2",
|
||||
"IPPrefixLen": 16,
|
||||
"IPv6Gateway": "",
|
||||
"GlobalIPv6Address": "",
|
||||
"GlobalIPv6PrefixLen": 0,
|
||||
"MacAddress": "02:42:ac:11:00:02"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Mounts": []
|
||||
},
|
||||
{
|
||||
"Id": "9e87a2b84b8e",
|
||||
"Names": ["/web-app"],
|
||||
"Image": "node:16-alpine",
|
||||
"ImageID": "sha256:c85b8f829d1f",
|
||||
"Command": "npm start",
|
||||
"Created": 1640991600,
|
||||
"Ports": [
|
||||
{
|
||||
"IP": "0.0.0.0",
|
||||
"PrivatePort": 3000,
|
||||
"PublicPort": 3000,
|
||||
"Type": "tcp"
|
||||
}
|
||||
],
|
||||
"Labels": {},
|
||||
"State": "running",
|
||||
"Status": "Up 3 hours",
|
||||
"HostConfig": {
|
||||
"NetworkMode": "default"
|
||||
},
|
||||
"NetworkSettings": {
|
||||
"Networks": {
|
||||
"bridge": {
|
||||
"IPAMConfig": null,
|
||||
"Links": null,
|
||||
"Aliases": null,
|
||||
"NetworkID": "f2de39df4171",
|
||||
"EndpointID": "3edc5fdb2efe",
|
||||
"Gateway": "172.17.0.1",
|
||||
"IPAddress": "172.17.0.3",
|
||||
"IPPrefixLen": 16,
|
||||
"IPv6Gateway": "",
|
||||
"GlobalIPv6Address": "",
|
||||
"GlobalIPv6PrefixLen": 0,
|
||||
"MacAddress": "02:42:ac:11:00:03"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Mounts": [
|
||||
{
|
||||
"Type": "bind",
|
||||
"Source": "/home/user/app",
|
||||
"Destination": "/app",
|
||||
"Mode": "",
|
||||
"RW": true,
|
||||
"Propagation": "rprivate"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"Id": "7b9a3c6d2e1f",
|
||||
"Names": ["/database"],
|
||||
"Image": "postgres:13",
|
||||
"ImageID": "sha256:b4ed8d5b4f3a",
|
||||
"Command": "docker-entrypoint.sh postgres",
|
||||
"Created": 1640988000,
|
||||
"Ports": [
|
||||
{
|
||||
"IP": "127.0.0.1",
|
||||
"PrivatePort": 5432,
|
||||
"PublicPort": 5432,
|
||||
"Type": "tcp"
|
||||
}
|
||||
],
|
||||
"Labels": {},
|
||||
"State": "dead",
|
||||
"Status": "Up 4 hours",
|
||||
"HostConfig": {
|
||||
"NetworkMode": "default"
|
||||
},
|
||||
"NetworkSettings": {
|
||||
"Networks": {
|
||||
"bridge": {
|
||||
"IPAMConfig": null,
|
||||
"Links": null,
|
||||
"Aliases": null,
|
||||
"NetworkID": "f2de39df4171",
|
||||
"EndpointID": "4fdc6gdb3gfg",
|
||||
"Gateway": "172.17.0.1",
|
||||
"IPAddress": "172.17.0.4",
|
||||
"IPPrefixLen": 16,
|
||||
"IPv6Gateway": "",
|
||||
"GlobalIPv6Address": "",
|
||||
"GlobalIPv6PrefixLen": 0,
|
||||
"MacAddress": "02:42:ac:11:00:04"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Mounts": [
|
||||
{
|
||||
"Type": "volume",
|
||||
"Name": "postgres_data",
|
||||
"Source": "/var/lib/docker/volumes/postgres_data/_data",
|
||||
"Destination": "/var/lib/postgresql/data",
|
||||
"Driver": "local",
|
||||
"Mode": "rw",
|
||||
"RW": true,
|
||||
"Propagation": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"Id": "5c8d1f4e9a2b",
|
||||
"Names": ["/old-service"],
|
||||
"Image": "ubuntu:20.04",
|
||||
"ImageID": "sha256:f643c72bc252",
|
||||
"Command": "/bin/bash",
|
||||
"Created": 1640984400,
|
||||
"Ports": [],
|
||||
"Labels": {},
|
||||
"State": "exited",
|
||||
"Status": "Exited (0) 2 hours ago",
|
||||
"HostConfig": {
|
||||
"NetworkMode": "default"
|
||||
},
|
||||
"NetworkSettings": {
|
||||
"Networks": {
|
||||
"bridge": {
|
||||
"IPAMConfig": null,
|
||||
"Links": null,
|
||||
"Aliases": null,
|
||||
"NetworkID": "",
|
||||
"EndpointID": "",
|
||||
"Gateway": "",
|
||||
"IPAddress": "",
|
||||
"IPPrefixLen": 0,
|
||||
"IPv6Gateway": "",
|
||||
"GlobalIPv6Address": "",
|
||||
"GlobalIPv6PrefixLen": 0,
|
||||
"MacAddress": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Mounts": []
|
||||
},
|
||||
{
|
||||
"Id": "1a2b3c4d5e6f",
|
||||
"Names": ["/backup-job"],
|
||||
"Image": "alpine:latest",
|
||||
"ImageID": "sha256:c059bfaa849c",
|
||||
"Command": "sh -c 'sleep 3600'",
|
||||
"Created": 1640980800,
|
||||
"Ports": [],
|
||||
"Labels": {},
|
||||
"State": "exited",
|
||||
"Status": "Exited (0) 30 minutes ago",
|
||||
"HostConfig": {
|
||||
"NetworkMode": "default"
|
||||
},
|
||||
"NetworkSettings": {
|
||||
"Networks": {
|
||||
"bridge": {
|
||||
"IPAMConfig": null,
|
||||
"Links": null,
|
||||
"Aliases": null,
|
||||
"NetworkID": "",
|
||||
"EndpointID": "",
|
||||
"Gateway": "",
|
||||
"IPAddress": "",
|
||||
"IPPrefixLen": 0,
|
||||
"IPv6Gateway": "",
|
||||
"GlobalIPv6Address": "",
|
||||
"GlobalIPv6PrefixLen": 0,
|
||||
"MacAddress": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Mounts": []
|
||||
}
|
||||
]
|
||||
1
dummy-data/docuseal/version
Normal file
1
dummy-data/docuseal/version
Normal file
|
|
@ -0,0 +1 @@
|
|||
1.8.3a
|
||||
24
dummy-data/emby/System/info/public
Normal file
24
dummy-data/emby/System/info/public
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
{
|
||||
"LocalAddress": "192.168.1.100:8096",
|
||||
"ServerName": "Homer-Emby-Server",
|
||||
"Version": "4.8.8.0",
|
||||
"ProductName": "Emby Server",
|
||||
"OperatingSystem": "Linux",
|
||||
"Id": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
|
||||
"StartupWizardCompleted": true,
|
||||
"SupportsLibraryMonitor": true,
|
||||
"WebSocketPortNumber": 8096,
|
||||
"CompletedInstallations": [],
|
||||
"CanSelfRestart": true,
|
||||
"CanSelfUpdate": true,
|
||||
"CanLaunchWebBrowser": false,
|
||||
"WanAddress": "192.168.1.100:8096",
|
||||
"HasUpdateAvailable": false,
|
||||
"SupportsAutoRunAtStartup": false,
|
||||
"TranscodingTempPath": "/var/lib/emby/transcoding-temp",
|
||||
"CachePath": "/var/lib/emby/cache",
|
||||
"LogPath": "/var/log/emby",
|
||||
"InternalMetadataPath": "/var/lib/emby/metadata",
|
||||
"ItemsByNamePath": "/var/lib/emby/metadata/People",
|
||||
"ProgramDataPath": "/var/lib/emby"
|
||||
}
|
||||
12
dummy-data/emby/items/counts
Normal file
12
dummy-data/emby/items/counts
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"MovieCount": 1247,
|
||||
"SeriesCount": 89,
|
||||
"EpisodeCount": 2156,
|
||||
"ArtistCount": 234,
|
||||
"AlbumCount": 567,
|
||||
"SongCount": 8923,
|
||||
"MusicVideoCount": 42,
|
||||
"BoxSetCount": 23,
|
||||
"BookCount": 156,
|
||||
"ItemCount": 13437
|
||||
}
|
||||
3
dummy-data/freshrss/api/greader.php/accounts/ClientLogin
Normal file
3
dummy-data/freshrss/api/greader.php/accounts/ClientLogin
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
SID=username/c7fef7ce380efb8c79a0df25686a3387
|
||||
LSID=null
|
||||
Auth=username/c7fef7ce380efb8c79a0df25686a3387
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"subscriptions":[{"id":"feed/3","title":"Test News","categories":[{"id":"user/-/label/News","label":"News"}],"url":"https://www.reddit.com/r/testnews.rss","htmlUrl":"https://www.reddit.com/r/testnews","iconUrl":"http://192.168.10.165/f.php?b4a11f09"},{"id":"feed/17","title":"Announcements Latest Topics","categories":[{"id":"user/-/label/Technology","label":"Technology"}],"url":"https://forums.testsite.net/forums/forum/7-announcements.xml","htmlUrl":"https://forums.testsite.net/forum/7-announcements/","iconUrl":"http://192.168.10.165/f.php?70b5fd98"},{"id":"feed/16","title":"Blog","categories":[{"id":"user/-/label/Technology","label":"Technology"}],"url":"https://www.firewall.com/blog/rss.xml","htmlUrl":"https://www.firewall.com/blog","iconUrl":"http://192.168.20.165/f.php?0107d102"},{"id":"feed/2","title":"techsite","categories":[{"id":"user/-/label/Technology","label":"Technology"}],"url":"https://techsite.com/rss","htmlUrl":"https://techsite.com/","iconUrl":"http://192.168.10.100/f.php?69ad225d"},{"id":"feed/5","title":"Hackaday","categories":[{"id":"user/-/label/Technology","label":"Technology"}],"url":"https://hackaday.com/feed/","htmlUrl":"https://hackaday.com/","iconUrl":"http://192.168.10.15/f.php?7be93110"},{"id":"feed/7","title":"Self-Hosted Alternatives to Popular Services","categories":[{"id":"user/-/label/Technology","label":"Technology"}],"url":"https://www.reddit.com/r/selfhosted.rss","htmlUrl":"https://www.reddit.com/r/selfhosted","iconUrl":"http://192.168.10.100/f.php?87bdf454"},{"id":"feed/15","title":"UniFi Access Point/Switch/LTE | Releases | Ubiquiti Community","categories":[{"id":"user/-/label/Technology","label":"Technology"}],"url":"https://community.ui.com/rss/releases/UniFi-Access-Point-Switch-LTE/9fc3b2fa-9e73-449a-924f-470e79884470","htmlUrl":"https://community.ui.com/","iconUrl":"http://192.168.10.100/f.php?a8b7368a"},{"id":"feed/14","title":"UniFi Network Application | Releases | Ubiquiti Community","categories":[{"id":"user/-/label/Technology","label":"Technology"}],"url":"https://community.ui.com/rss/releases/UniFi-Network-Application/e6712595-81bb-4829-8e42-9e2630fabcfe","htmlUrl":"https://community.ui.com/","iconUrl":"http://192.168.10.100/f.php?87f0ed63"},{"id":"feed/1","title":"FreshRSS releases","categories":[{"id":"user/-/label/Uncategorized","label":"Uncategorized"}],"url":"https://github.com/FreshRSS/FreshRSS/releases.atom","htmlUrl":"https://github.com/FreshRSS/FreshRSS/","iconUrl":"http://192.168.10.100/f.php?261334e9"},{"id":"feed/10","title":"Hooked on Wood","categories":[{"id":"user/-/label/Videos","label":"Videos"}],"url":"https://www.youtube.com/feeds/videos.xml?channel_id=UCuvjeMfKGqSoYc32Xk5MLfQ","htmlUrl":"https://www.youtube.com/channel/UCuvjeMfKGqSoYc32Xk5MLfQ","iconUrl":"http://192.168.10.100/f.php?e6aff645"},{"id":"feed/11","title":"Jeff Geerling","categories":[{"id":"user/-/label/Videos","label":"Videos"}],"url":"https://www.youtube.com/feeds/videos.xml?channel_id=UCR-DXc1voovS8nhAvccRZhg","htmlUrl":"https://www.youtube.com/channel/UCR-DXc1voovS8nhAvccRZhg","iconUrl":"http://192.168.10.100/f.php?5b542c1f"},{"id":"feed/9","title":"Lawrence Systems","categories":[{"id":"user/-/label/Videos","label":"Videos"}],"url":"https://www.youtube.com/feeds/videos.xml?channel_id=UCHkYOD-3fZbuGhwsADBd9ZQ","htmlUrl":"https://www.youtube.com/channel/UCHkYOD-3fZbuGhwsADBd9ZQ","iconUrl":"http://192.168.10.100/f.php?3ab68f8e"},{"id":"feed/13","title":"Thunderf00t","categories":[{"id":"user/-/label/Videos","label":"Videos"}],"url":"https://www.youtube.com/feeds/videos.xml?channel_id=UCmb8hO2ilV9vRa8cilis88A","htmlUrl":"https://www.youtube.com/channel/UCmb8hO2ilV9vRa8cilis88A","iconUrl":"http://192.168.10.100/f.php?d87007ad"}]}
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"max":1070,"unreadcounts":[{"id":"feed/3","count":234,"newestItemTimestampUsec":"1690915225367106"},{"id":"user/-/label/News","count":234,"newestItemTimestampUsec":"1690915225367106"},{"id":"feed/17","count":48,"newestItemTimestampUsec":"1689390054724200"},{"id":"feed/16","count":17,"newestItemTimestampUsec":"1689796853964422"},{"id":"feed/2","count":219,"newestItemTimestampUsec":"1690916425408239"},{"id":"feed/5","count":199,"newestItemTimestampUsec":"1690915225367107"},{"id":"feed/7","count":211,"newestItemTimestampUsec":"1690916425408242"},{"id":"feed/15","count":22,"newestItemTimestampUsec":"1689663652972458"},{"id":"feed/14","count":21,"newestItemTimestampUsec":"1688368807781577"},{"id":"user/-/label/Technology","count":737,"newestItemTimestampUsec":"1690916425408242"},{"id":"feed/1","count":10,"newestItemTimestampUsec":"1687016967198678"},{"id":"user/-/label/Uncategorized","count":10,"newestItemTimestampUsec":"1687016967198678"},{"id":"feed/10","count":15,"newestItemTimestampUsec":"1688654406671211"},{"id":"feed/11","count":25,"newestItemTimestampUsec":"1690902033356786"},{"id":"feed/9","count":34,"newestItemTimestampUsec":"1690736426018726"},{"id":"feed/13","count":15,"newestItemTimestampUsec":"1690837226605329"},{"id":"user/-/label/Videos","count":89,"newestItemTimestampUsec":"1690902033356786"},{"id":"user/-/state/com.google/reading-list","count":1070,"newestItemTimestampUsec":"1690916425408242"}]}
|
||||
211
dummy-data/gatus/api/v1/endpoints/statuses
Normal file
211
dummy-data/gatus/api/v1/endpoints/statuses
Normal file
|
|
@ -0,0 +1,211 @@
|
|||
[
|
||||
{
|
||||
"name": "Gateway",
|
||||
"group": "Services",
|
||||
"key": "services_gateway",
|
||||
"results": [
|
||||
{
|
||||
"status": 200,
|
||||
"hostname": "gateway.example.com",
|
||||
"duration": 10000000,
|
||||
"conditionResults": [
|
||||
{
|
||||
"condition": "[STATUS] == 200",
|
||||
"success": true
|
||||
},
|
||||
{
|
||||
"condition": "[RESPONSE_TIME] < 500",
|
||||
"success": true
|
||||
}
|
||||
],
|
||||
"success": true,
|
||||
"timestamp": "2025-05-26T07:35:41.784208588Z"
|
||||
},
|
||||
{
|
||||
"status": 200,
|
||||
"hostname": "gateway.example.com",
|
||||
"duration": 10000000,
|
||||
"conditionResults": [
|
||||
{
|
||||
"condition": "[STATUS] == 200",
|
||||
"success": true
|
||||
},
|
||||
{
|
||||
"condition": "[RESPONSE_TIME] < 500",
|
||||
"success": true
|
||||
}
|
||||
],
|
||||
"success": true,
|
||||
"timestamp": "2025-05-26T07:40:41.804489793Z"
|
||||
},
|
||||
{
|
||||
"status": 200,
|
||||
"hostname": "gateway.example.com",
|
||||
"duration": 10000000,
|
||||
"conditionResults": [
|
||||
{
|
||||
"condition": "[STATUS] == 200",
|
||||
"success": true
|
||||
},
|
||||
{
|
||||
"condition": "[RESPONSE_TIME] < 500",
|
||||
"success": true
|
||||
}
|
||||
],
|
||||
"success": true,
|
||||
"timestamp": "2025-05-26T07:45:41.837925713Z"
|
||||
},
|
||||
{
|
||||
"status": 200,
|
||||
"hostname": "gateway.example.com",
|
||||
"duration": 10000000,
|
||||
"conditionResults": [
|
||||
{
|
||||
"condition": "[STATUS] == 200",
|
||||
"success": true
|
||||
},
|
||||
{
|
||||
"condition": "[RESPONSE_TIME] < 500",
|
||||
"success": true
|
||||
}
|
||||
],
|
||||
"success": true,
|
||||
"timestamp": "2025-05-26T07:50:41.848391366Z"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Website",
|
||||
"group": "External",
|
||||
"key": "external_website",
|
||||
"results": [
|
||||
{
|
||||
"status": 200,
|
||||
"hostname": "www.example.com",
|
||||
"duration": 10000000,
|
||||
"conditionResults": [
|
||||
{
|
||||
"condition": "[STATUS] == 200",
|
||||
"success": true
|
||||
},
|
||||
{
|
||||
"condition": "[RESPONSE_TIME] < 500",
|
||||
"success": false
|
||||
}
|
||||
],
|
||||
"success": false,
|
||||
"timestamp": "2025-05-26T07:35:41.784208588Z"
|
||||
},
|
||||
{
|
||||
"status": 200,
|
||||
"hostname": "gateway.example.com",
|
||||
"duration": 10000000,
|
||||
"conditionResults": [
|
||||
{
|
||||
"condition": "[STATUS] == 200",
|
||||
"success": false
|
||||
},
|
||||
{
|
||||
"condition": "[RESPONSE_TIME] < 500",
|
||||
"success": true
|
||||
}
|
||||
],
|
||||
"success": false,
|
||||
"timestamp": "2025-05-26T07:40:41.804489793Z"
|
||||
},
|
||||
{
|
||||
"status": 200,
|
||||
"hostname": "gateway.example.com",
|
||||
"duration": 10000000,
|
||||
"conditionResults": [
|
||||
{
|
||||
"condition": "[STATUS] == 200",
|
||||
"success": true
|
||||
},
|
||||
{
|
||||
"condition": "[RESPONSE_TIME] < 500",
|
||||
"success": true
|
||||
}
|
||||
],
|
||||
"success": true,
|
||||
"timestamp": "2025-05-26T07:45:41.837925713Z"
|
||||
},
|
||||
{
|
||||
"status": 200,
|
||||
"hostname": "gateway.example.com",
|
||||
"duration": 10000000,
|
||||
"conditionResults": [
|
||||
{
|
||||
"condition": "[STATUS] == 200",
|
||||
"success": true
|
||||
},
|
||||
{
|
||||
"condition": "[RESPONSE_TIME] < 500",
|
||||
"success": true
|
||||
}
|
||||
],
|
||||
"success": true,
|
||||
"timestamp": "2025-05-26T07:50:41.848391366Z"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "DNS",
|
||||
"group": "Services",
|
||||
"key": "services_dns",
|
||||
"results": [
|
||||
{
|
||||
"status": 200,
|
||||
"hostname": "ns1.example",
|
||||
"duration": 20000000,
|
||||
"conditionResults": [
|
||||
{
|
||||
"condition": "[STATUS] == 200",
|
||||
"success": false
|
||||
}
|
||||
],
|
||||
"success": false,
|
||||
"timestamp": "2025-05-26T07:35:41.784208588Z"
|
||||
},
|
||||
{
|
||||
"status": 200,
|
||||
"hostname": "ns1.example.com",
|
||||
"duration": 20000000,
|
||||
"conditionResults": [
|
||||
{
|
||||
"condition": "[STATUS] == 200",
|
||||
"success": false
|
||||
}
|
||||
],
|
||||
"success": false,
|
||||
"timestamp": "2025-05-26T07:40:41.804489793Z"
|
||||
},
|
||||
{
|
||||
"status": 200,
|
||||
"hostname": "ns1.example.com",
|
||||
"duration": 20000000,
|
||||
"conditionResults": [
|
||||
{
|
||||
"condition": "[STATUS] == 200",
|
||||
"success": false
|
||||
}
|
||||
],
|
||||
"success": false,
|
||||
"timestamp": "2025-05-26T07:45:41.837925713Z"
|
||||
},
|
||||
{
|
||||
"status": 200,
|
||||
"hostname": "ns1.example.com",
|
||||
"duration": 20000000,
|
||||
"conditionResults": [
|
||||
{
|
||||
"condition": "[STATUS] == 200",
|
||||
"success": false
|
||||
}
|
||||
],
|
||||
"success": false,
|
||||
"timestamp": "2025-05-26T07:50:41.848391366Z"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
11
dummy-data/gitea/swagger.v1.json
Normal file
11
dummy-data/gitea/swagger.v1.json
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"info": {
|
||||
"description": "This documentation describes the Forgejo API.",
|
||||
"title": "Forgejo API",
|
||||
"license": {
|
||||
"name": "MIT",
|
||||
"url": "http://opensource.org/licenses/MIT"
|
||||
},
|
||||
"version": "8.0.3+gitea-1.22.0"
|
||||
}
|
||||
}
|
||||
1
dummy-data/glances/api/4/quicklook
Normal file
1
dummy-data/glances/api/4/quicklook
Normal file
|
|
@ -0,0 +1 @@
|
|||
{"cpu_name":"AMD Ryzen 7 3700X 8-Core Processor","cpu_hz_current":2662987562.5,"cpu_hz":3600000000.0,"cpu":3.7,"percpu":[{"key":"cpu_number","cpu_number":0,"total":5.1,"user":3.3,"system":0.6,"idle":94.9,"nice":0.0,"iowait":0.0,"irq":0.8,"softirq":0.3,"steal":0.0,"guest":0.0,"guest_nice":0.0,"dpc":null,"interrupt":null},{"key":"cpu_number","cpu_number":1,"total":2.6,"user":2.0,"system":0.5,"idle":97.4,"nice":0.0,"iowait":0.0,"irq":0.1,"softirq":0.1,"steal":0.0,"guest":0.0,"guest_nice":0.0,"dpc":null,"interrupt":null},{"key":"cpu_number","cpu_number":2,"total":1.6,"user":1.1,"system":0.3,"idle":98.4,"nice":0.0,"iowait":0.1,"irq":0.1,"softirq":0.0,"steal":0.0,"guest":0.0,"guest_nice":0.0,"dpc":null,"interrupt":null},{"key":"cpu_number","cpu_number":3,"total":7.4,"user":6.2,"system":0.9,"idle":92.6,"nice":0.0,"iowait":0.1,"irq":0.1,"softirq":0.0,"steal":0.0,"guest":0.0,"guest_nice":0.0,"dpc":null,"interrupt":null},{"key":"cpu_number","cpu_number":4,"total":1.3,"user":0.9,"system":0.4,"idle":98.7,"nice":0.0,"iowait":0.0,"irq":0.1,"softirq":0.0,"steal":0.0,"guest":0.0,"guest_nice":0.0,"dpc":null,"interrupt":null},{"key":"cpu_number","cpu_number":5,"total":10.4,"user":8.9,"system":1.2,"idle":89.6,"nice":0.0,"iowait":0.1,"irq":0.1,"softirq":0.0,"steal":0.0,"guest":0.0,"guest_nice":0.0,"dpc":null,"interrupt":null},{"key":"cpu_number","cpu_number":6,"total":3.1,"user":2.3,"system":0.6,"idle":96.9,"nice":0.0,"iowait":0.1,"irq":0.1,"softirq":0.0,"steal":0.0,"guest":0.0,"guest_nice":0.0,"dpc":null,"interrupt":null},{"key":"cpu_number","cpu_number":7,"total":2.1,"user":1.3,"system":0.6,"idle":97.9,"nice":0.0,"iowait":0.1,"irq":0.1,"softirq":0.0,"steal":0.0,"guest":0.0,"guest_nice":0.0,"dpc":null,"interrupt":null},{"key":"cpu_number","cpu_number":8,"total":5.8,"user":4.9,"system":0.7,"idle":94.2,"nice":0.0,"iowait":0.1,"irq":0.1,"softirq":0.0,"steal":0.0,"guest":0.0,"guest_nice":0.0,"dpc":null,"interrupt":null},{"key":"cpu_number","cpu_number":9,"total":2.0,"user":1.3,"system":0.4,"idle":98.0,"nice":0.0,"iowait":0.2,"irq":0.1,"softirq":0.0,"steal":0.0,"guest":0.0,"guest_nice":0.0,"dpc":null,"interrupt":null},{"key":"cpu_number","cpu_number":10,"total":1.5,"user":0.9,"system":0.3,"idle":98.5,"nice":0.0,"iowait":0.2,"irq":0.1,"softirq":0.0,"steal":0.0,"guest":0.0,"guest_nice":0.0,"dpc":null,"interrupt":null},{"key":"cpu_number","cpu_number":11,"total":5.3,"user":4.6,"system":0.6,"idle":94.7,"nice":0.0,"iowait":0.1,"irq":0.1,"softirq":0.0,"steal":0.0,"guest":0.0,"guest_nice":0.0,"dpc":null,"interrupt":null},{"key":"cpu_number","cpu_number":12,"total":1.5,"user":1.0,"system":0.4,"idle":98.5,"nice":0.0,"iowait":0.0,"irq":0.1,"softirq":0.0,"steal":0.0,"guest":0.0,"guest_nice":0.0,"dpc":null,"interrupt":null},{"key":"cpu_number","cpu_number":13,"total":5.7,"user":4.9,"system":0.7,"idle":94.3,"nice":0.0,"iowait":0.0,"irq":0.1,"softirq":0.0,"steal":0.0,"guest":0.0,"guest_nice":0.0,"dpc":null,"interrupt":null},{"key":"cpu_number","cpu_number":14,"total":2.9,"user":2.0,"system":0.8,"idle":97.1,"nice":0.0,"iowait":0.0,"irq":0.1,"softirq":0.0,"steal":0.0,"guest":0.0,"guest_nice":0.0,"dpc":null,"interrupt":null},{"key":"cpu_number","cpu_number":15,"total":1.7,"user":1.1,"system":0.5,"idle":98.3,"nice":0.0,"iowait":0.0,"irq":0.1,"softirq":0.0,"steal":0.0,"guest":0.0,"guest_nice":0.0,"dpc":null,"interrupt":null}],"mem":59.6,"swap":0.0,"cpu_log_core":16,"cpu_phys_core":8,"load":5.7}
|
||||
4
dummy-data/gotify/health
Normal file
4
dummy-data/gotify/health
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"health": "green",
|
||||
"database": "green"
|
||||
}
|
||||
65
dummy-data/gotify/message
Normal file
65
dummy-data/gotify/message
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
{
|
||||
"messages": [
|
||||
{
|
||||
"id": 1,
|
||||
"appid": 1,
|
||||
"message": "System backup completed successfully",
|
||||
"title": "Backup Service",
|
||||
"priority": 2,
|
||||
"date": "2024-01-15T10:30:00Z"
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"appid": 2,
|
||||
"message": "Database optimization finished",
|
||||
"title": "Database Manager",
|
||||
"priority": 1,
|
||||
"date": "2024-01-15T09:15:00Z"
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"appid": 1,
|
||||
"message": "Server restart scheduled for maintenance",
|
||||
"title": "System Admin",
|
||||
"priority": 5,
|
||||
"date": "2024-01-15T08:45:00Z"
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"appid": 3,
|
||||
"message": "New user registration: john.doe@example.com",
|
||||
"title": "User Management",
|
||||
"priority": 1,
|
||||
"date": "2024-01-15T07:20:00Z"
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"appid": 2,
|
||||
"message": "Weekly report generated and sent",
|
||||
"title": "Report Generator",
|
||||
"priority": 2,
|
||||
"date": "2024-01-14T18:00:00Z"
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"appid": 4,
|
||||
"message": "Security scan completed - no threats detected",
|
||||
"title": "Security Monitor",
|
||||
"priority": 2,
|
||||
"date": "2024-01-14T16:30:00Z"
|
||||
},
|
||||
{
|
||||
"id": 7,
|
||||
"appid": 1,
|
||||
"message": "Disk usage is at 85% on /var partition",
|
||||
"title": "System Monitor",
|
||||
"priority": 4,
|
||||
"date": "2024-01-14T14:15:00Z"
|
||||
}
|
||||
],
|
||||
"paging": {
|
||||
"size": 7,
|
||||
"since": 0,
|
||||
"limit": 100
|
||||
}
|
||||
}
|
||||
95
dummy-data/healthchecks/api/v1/checks
Normal file
95
dummy-data/healthchecks/api/v1/checks
Normal file
|
|
@ -0,0 +1,95 @@
|
|||
{
|
||||
"checks": [
|
||||
{
|
||||
"name": "Database Backup",
|
||||
"tags": "backup database",
|
||||
"desc": "Daily database backup job",
|
||||
"grace": 3600,
|
||||
"n_pings": 127,
|
||||
"status": "up",
|
||||
"last_ping": "2024-01-15T10:30:00+00:00",
|
||||
"next_ping": "2024-01-16T10:30:00+00:00",
|
||||
"manual_resume": false,
|
||||
"methods": "",
|
||||
"unique_key": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
|
||||
},
|
||||
{
|
||||
"name": "Web Server Monitoring",
|
||||
"tags": "web server nginx",
|
||||
"desc": "Monitor web server health",
|
||||
"grace": 300,
|
||||
"n_pings": 2847,
|
||||
"status": "up",
|
||||
"last_ping": "2024-01-15T10:25:00+00:00",
|
||||
"next_ping": "2024-01-15T10:30:00+00:00",
|
||||
"manual_resume": false,
|
||||
"methods": "",
|
||||
"unique_key": "b2c3d4e5-f6g7-8901-bcde-f23456789012"
|
||||
},
|
||||
{
|
||||
"name": "SSL Certificate Check",
|
||||
"tags": "ssl certificate",
|
||||
"desc": "Weekly SSL certificate expiry check",
|
||||
"grace": 86400,
|
||||
"n_pings": 52,
|
||||
"status": "up",
|
||||
"last_ping": "2024-01-14T12:00:00+00:00",
|
||||
"next_ping": "2024-01-21T12:00:00+00:00",
|
||||
"manual_resume": false,
|
||||
"methods": "",
|
||||
"unique_key": "c3d4e5f6-g7h8-9012-cdef-345678901234"
|
||||
},
|
||||
{
|
||||
"name": "Log Cleanup Service",
|
||||
"tags": "cleanup logs maintenance",
|
||||
"desc": "Weekly log file cleanup",
|
||||
"grace": 7200,
|
||||
"n_pings": 15,
|
||||
"status": "grace",
|
||||
"last_ping": "2024-01-13T02:00:00+00:00",
|
||||
"next_ping": "2024-01-20T02:00:00+00:00",
|
||||
"manual_resume": false,
|
||||
"methods": "",
|
||||
"unique_key": "d4e5f6g7-h8i9-0123-defa-456789012345"
|
||||
},
|
||||
{
|
||||
"name": "Email Service",
|
||||
"tags": "email smtp",
|
||||
"desc": "Email service availability check",
|
||||
"grace": 600,
|
||||
"n_pings": 0,
|
||||
"status": "down",
|
||||
"last_ping": "2024-01-12T08:15:00+00:00",
|
||||
"next_ping": "2024-01-15T08:15:00+00:00",
|
||||
"manual_resume": false,
|
||||
"methods": "",
|
||||
"unique_key": "e5f6g7h8-i9j0-1234-efab-567890123456"
|
||||
},
|
||||
{
|
||||
"name": "API Health Check",
|
||||
"tags": "api health",
|
||||
"desc": "External API endpoint health monitoring",
|
||||
"grace": 180,
|
||||
"n_pings": 1440,
|
||||
"status": "up",
|
||||
"last_ping": "2024-01-15T10:28:00+00:00",
|
||||
"next_ping": "2024-01-15T10:30:00+00:00",
|
||||
"manual_resume": false,
|
||||
"methods": "",
|
||||
"unique_key": "f6g7h8i9-j0k1-2345-fabc-678901234567"
|
||||
},
|
||||
{
|
||||
"name": "Backup Verification",
|
||||
"tags": "backup verify",
|
||||
"desc": "Verify backup integrity",
|
||||
"grace": 1800,
|
||||
"n_pings": 45,
|
||||
"status": "grace",
|
||||
"last_ping": "2024-01-14T22:30:00+00:00",
|
||||
"next_ping": "2024-01-15T22:30:00+00:00",
|
||||
"manual_resume": false,
|
||||
"methods": "",
|
||||
"unique_key": "g7h8i9j0-k1l2-3456-gbcd-789012345678"
|
||||
}
|
||||
]
|
||||
}
|
||||
45
dummy-data/homeassistant/api/config
Normal file
45
dummy-data/homeassistant/api/config
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
{
|
||||
"location_name": "Home",
|
||||
"latitude": 40.7128,
|
||||
"longitude": -74.0060,
|
||||
"elevation": 10,
|
||||
"unit_system": {
|
||||
"length": "km",
|
||||
"mass": "kg",
|
||||
"pressure": "Pa",
|
||||
"temperature": "°C",
|
||||
"volume": "L"
|
||||
},
|
||||
"time_zone": "America/New_York",
|
||||
"components": [
|
||||
"automation",
|
||||
"climate",
|
||||
"device_tracker",
|
||||
"frontend",
|
||||
"history",
|
||||
"light",
|
||||
"logger",
|
||||
"media_player",
|
||||
"recorder",
|
||||
"script",
|
||||
"sensor",
|
||||
"switch",
|
||||
"system_health",
|
||||
"weather"
|
||||
],
|
||||
"config_dir": "/config",
|
||||
"allowlist_external_dirs": [
|
||||
"/config",
|
||||
"/share"
|
||||
],
|
||||
"allowlist_external_urls": [],
|
||||
"version": "2024.1.5",
|
||||
"config_source": "storage",
|
||||
"recovery_mode": false,
|
||||
"state": "RUNNING",
|
||||
"external_url": null,
|
||||
"internal_url": null,
|
||||
"currency": "USD",
|
||||
"country": "US",
|
||||
"language": "en"
|
||||
}
|
||||
141
dummy-data/homeassistant/api/states
Normal file
141
dummy-data/homeassistant/api/states
Normal file
|
|
@ -0,0 +1,141 @@
|
|||
[
|
||||
{
|
||||
"entity_id": "sensor.living_room_temperature",
|
||||
"state": "22.5",
|
||||
"attributes": {
|
||||
"unit_of_measurement": "°C",
|
||||
"device_class": "temperature",
|
||||
"friendly_name": "Living Room Temperature"
|
||||
},
|
||||
"last_changed": "2024-01-15T10:30:00+00:00",
|
||||
"last_updated": "2024-01-15T10:30:00+00:00",
|
||||
"context": {
|
||||
"id": "01HMV123456789",
|
||||
"parent_id": null,
|
||||
"user_id": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"entity_id": "light.bedroom_ceiling",
|
||||
"state": "on",
|
||||
"attributes": {
|
||||
"brightness": 180,
|
||||
"color_mode": "brightness",
|
||||
"supported_color_modes": ["brightness"],
|
||||
"friendly_name": "Bedroom Ceiling Light"
|
||||
},
|
||||
"last_changed": "2024-01-15T09:15:00+00:00",
|
||||
"last_updated": "2024-01-15T09:15:00+00:00",
|
||||
"context": {
|
||||
"id": "01HMV234567890",
|
||||
"parent_id": null,
|
||||
"user_id": "user123"
|
||||
}
|
||||
},
|
||||
{
|
||||
"entity_id": "switch.coffee_maker",
|
||||
"state": "off",
|
||||
"attributes": {
|
||||
"friendly_name": "Coffee Maker"
|
||||
},
|
||||
"last_changed": "2024-01-14T22:00:00+00:00",
|
||||
"last_updated": "2024-01-14T22:00:00+00:00",
|
||||
"context": {
|
||||
"id": "01HMV345678901",
|
||||
"parent_id": null,
|
||||
"user_id": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"entity_id": "climate.living_room",
|
||||
"state": "heat",
|
||||
"attributes": {
|
||||
"temperature": 21.0,
|
||||
"current_temperature": 20.5,
|
||||
"hvac_modes": ["off", "heat", "cool", "auto"],
|
||||
"min_temp": 7.0,
|
||||
"max_temp": 35.0,
|
||||
"target_temp_step": 0.5,
|
||||
"friendly_name": "Living Room Thermostat"
|
||||
},
|
||||
"last_changed": "2024-01-15T08:00:00+00:00",
|
||||
"last_updated": "2024-01-15T10:25:00+00:00",
|
||||
"context": {
|
||||
"id": "01HMV456789012",
|
||||
"parent_id": null,
|
||||
"user_id": "user123"
|
||||
}
|
||||
},
|
||||
{
|
||||
"entity_id": "sensor.front_door",
|
||||
"state": "closed",
|
||||
"attributes": {
|
||||
"device_class": "door",
|
||||
"friendly_name": "Front Door"
|
||||
},
|
||||
"last_changed": "2024-01-15T07:30:00+00:00",
|
||||
"last_updated": "2024-01-15T07:30:00+00:00",
|
||||
"context": {
|
||||
"id": "01HMV567890123",
|
||||
"parent_id": null,
|
||||
"user_id": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"entity_id": "media_player.living_room_tv",
|
||||
"state": "playing",
|
||||
"attributes": {
|
||||
"volume_level": 0.4,
|
||||
"is_volume_muted": false,
|
||||
"media_content_type": "tvshow",
|
||||
"media_title": "The Office",
|
||||
"app_name": "Netflix",
|
||||
"friendly_name": "Living Room TV"
|
||||
},
|
||||
"last_changed": "2024-01-15T10:00:00+00:00",
|
||||
"last_updated": "2024-01-15T10:20:00+00:00",
|
||||
"context": {
|
||||
"id": "01HMV678901234",
|
||||
"parent_id": null,
|
||||
"user_id": "user123"
|
||||
}
|
||||
},
|
||||
{
|
||||
"entity_id": "automation.morning_routine",
|
||||
"state": "on",
|
||||
"attributes": {
|
||||
"last_triggered": "2024-01-15T07:00:00+00:00",
|
||||
"mode": "single",
|
||||
"current": 0,
|
||||
"friendly_name": "Morning Routine"
|
||||
},
|
||||
"last_changed": "2024-01-14T07:00:00+00:00",
|
||||
"last_updated": "2024-01-15T07:00:00+00:00",
|
||||
"context": {
|
||||
"id": "01HMV789012345",
|
||||
"parent_id": null,
|
||||
"user_id": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"entity_id": "weather.home",
|
||||
"state": "partly-cloudy",
|
||||
"attributes": {
|
||||
"temperature": 18.0,
|
||||
"humidity": 65,
|
||||
"pressure": 1013.2,
|
||||
"wind_speed": 12.5,
|
||||
"wind_bearing": 225,
|
||||
"visibility": 16.0,
|
||||
"forecast": [],
|
||||
"friendly_name": "Home Weather"
|
||||
},
|
||||
"last_changed": "2024-01-15T10:00:00+00:00",
|
||||
"last_updated": "2024-01-15T10:30:00+00:00",
|
||||
"context": {
|
||||
"id": "01HMV890123456",
|
||||
"parent_id": null,
|
||||
"user_id": null
|
||||
}
|
||||
}
|
||||
]
|
||||
3
dummy-data/homeassistant/api_root
Normal file
3
dummy-data/homeassistant/api_root
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"message": "API running."
|
||||
}
|
||||
1
dummy-data/immich/api/server-info/stats
Normal file
1
dummy-data/immich/api/server-info/stats
Normal file
|
|
@ -0,0 +1 @@
|
|||
{"photos":25754,"videos":1774,"usage":123142197784,"usageByUser":[{"userId":"28eff0e8-60b3-4b4c-9236-bd48559b1400","userFirstName":"John","userLastName":"Doe","photos":14153,"videos":501,"usage":54391364678},{"userId":"f3051051-9794-3470-b253-d1d7c1d46ef3","userFirstName":"John","userLastName":"Doe","photos":0,"videos":0,"usage":0},{"userId":"940bd5e2-bf3d-33e6-86b6-b9d60a1d1e06","userFirstName":"Jane","userLastName":"Doe","photos":11601,"videos":1273,"usage":68750833106}]}
|
||||
41
dummy-data/immich/api/server/statistics
Normal file
41
dummy-data/immich/api/server/statistics
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
{
|
||||
"photos": 12847,
|
||||
"videos": 1523,
|
||||
"usage": 248576851456,
|
||||
"usageByUser": [
|
||||
{
|
||||
"userId": "user-1234-5678-9abc-def0",
|
||||
"userName": "john.doe",
|
||||
"photos": 8945,
|
||||
"videos": 892,
|
||||
"usage": 156789012345
|
||||
},
|
||||
{
|
||||
"userId": "user-2345-6789-abcd-ef01",
|
||||
"userName": "jane.smith",
|
||||
"photos": 2134,
|
||||
"videos": 423,
|
||||
"usage": 67891234567
|
||||
},
|
||||
{
|
||||
"userId": "user-3456-789a-bcde-f012",
|
||||
"userName": "family.shared",
|
||||
"photos": 1768,
|
||||
"videos": 208,
|
||||
"usage": 23896604544
|
||||
}
|
||||
],
|
||||
"usageRaw": 248576851456,
|
||||
"photosGrowth": {
|
||||
"date": "2024-01-15",
|
||||
"value": 42
|
||||
},
|
||||
"videosGrowth": {
|
||||
"date": "2024-01-15",
|
||||
"value": 7
|
||||
},
|
||||
"usageGrowth": {
|
||||
"date": "2024-01-15",
|
||||
"value": 2147483648
|
||||
}
|
||||
}
|
||||
342
dummy-data/jellystat/proxy/getSessions
Normal file
342
dummy-data/jellystat/proxy/getSessions
Normal file
|
|
@ -0,0 +1,342 @@
|
|||
[
|
||||
{
|
||||
"PlayState": {
|
||||
"CanSeek": true,
|
||||
"IsPaused": false,
|
||||
"IsMuted": false,
|
||||
"RepeatMode": "RepeatNone",
|
||||
"ShuffleMode": "Sorted",
|
||||
"VolumeLevel": 85,
|
||||
"AudioStreamIndex": 1,
|
||||
"SubtitleStreamIndex": -1,
|
||||
"MediaSourceId": "12345abcdef",
|
||||
"PlayMethod": "DirectPlay",
|
||||
"PlaySessionId": "session-1-abc123",
|
||||
"PlaylistItemId": "playlist-item-1",
|
||||
"PositionTicks": 18000000000
|
||||
},
|
||||
"AdditionalUsers": [],
|
||||
"Capabilities": {
|
||||
"PlayableMediaTypes": ["Audio", "Video"],
|
||||
"SupportedCommands": ["Play", "Pause", "Stop", "Seek"]
|
||||
},
|
||||
"RemoteEndPoint": "192.168.1.100",
|
||||
"PlayableMediaTypes": ["Audio", "Video"],
|
||||
"Id": "session-1-abc123",
|
||||
"UserId": "user123abc",
|
||||
"UserName": "john_doe",
|
||||
"Client": "Jellyfin Web",
|
||||
"LastActivityDate": "2024-01-15T10:30:00.0000000Z",
|
||||
"LastPlaybackCheckIn": "2024-01-15T10:30:00.0000000Z",
|
||||
"DeviceName": "Chrome on Desktop",
|
||||
"DeviceId": "device-desktop-chrome",
|
||||
"ApplicationVersion": "10.8.13",
|
||||
"IsActive": true,
|
||||
"SupportsMediaControl": true,
|
||||
"SupportsRemoteControl": true,
|
||||
"NowPlayingItem": {
|
||||
"Name": "The Office - S03E01 - Gay Witch Hunt",
|
||||
"OriginalTitle": "Gay Witch Hunt",
|
||||
"Id": "episode123abc",
|
||||
"Etag": "etag123",
|
||||
"SourceType": "Library",
|
||||
"PlaylistItemId": "playlist-item-1",
|
||||
"DateCreated": "2024-01-10T00:00:00.0000000Z",
|
||||
"DateLastMediaAdded": "2024-01-10T00:00:00.0000000Z",
|
||||
"ExtraType": null,
|
||||
"AirsBeforeSeasonNumber": null,
|
||||
"AirsAfterSeasonNumber": null,
|
||||
"AirsBeforeEpisodeNumber": null,
|
||||
"CanDelete": false,
|
||||
"CanDownload": false,
|
||||
"HasSubtitles": true,
|
||||
"Container": "mkv",
|
||||
"SortName": "office s03e01 gay witch hunt",
|
||||
"ForcedSortName": null,
|
||||
"Video3DFormat": null,
|
||||
"PremiereDate": "2006-09-21T00:00:00.0000000Z",
|
||||
"ExternalUrls": [],
|
||||
"MediaSources": [],
|
||||
"CriticRating": null,
|
||||
"ProductionLocations": [],
|
||||
"Path": "/media/tv/The Office/Season 03/S03E01.mkv",
|
||||
"EnableMediaSourceDisplay": true,
|
||||
"OfficialRating": "TV-14",
|
||||
"CustomRating": null,
|
||||
"ChannelId": null,
|
||||
"ChannelName": null,
|
||||
"Overview": "Michael's kiss with Oscar at the Dundies leads to sensitivity training for the office.",
|
||||
"Taglines": [],
|
||||
"Genres": ["Comedy"],
|
||||
"CommunityRating": 8.1,
|
||||
"CumulativeRunTimeTicks": 13050000000,
|
||||
"RunTimeTicks": 13050000000,
|
||||
"PlayAccess": "Full",
|
||||
"AspectRatio": "16:9",
|
||||
"ProductionYear": 2006,
|
||||
"IsPlaceHolder": false,
|
||||
"Number": null,
|
||||
"ChannelNumber": null,
|
||||
"IndexNumber": 1,
|
||||
"IndexNumberEnd": null,
|
||||
"ParentIndexNumber": 3,
|
||||
"RemoteTrailers": [],
|
||||
"ProviderIds": {},
|
||||
"IsHD": true,
|
||||
"IsFolder": false,
|
||||
"ParentId": "season3abc",
|
||||
"Type": "Episode",
|
||||
"People": [],
|
||||
"Studios": [],
|
||||
"GenreItems": [],
|
||||
"ParentLogoItemId": null,
|
||||
"ParentBackdropItemId": "series123",
|
||||
"ParentBackdropImageTags": ["backdrop1"],
|
||||
"LocalTrailerCount": 0,
|
||||
"UserData": {
|
||||
"Rating": null,
|
||||
"PlayedPercentage": 75.5,
|
||||
"UnplayedItemCount": null,
|
||||
"PlaybackPositionTicks": 18000000000,
|
||||
"PlayCount": 1,
|
||||
"IsFavorite": false,
|
||||
"Likes": null,
|
||||
"LastPlayedDate": "2024-01-15T10:30:00.0000000Z",
|
||||
"Played": false,
|
||||
"Key": "episode123abc"
|
||||
},
|
||||
"RecursiveItemCount": 0,
|
||||
"ChildCount": 0,
|
||||
"SeriesName": "The Office",
|
||||
"SeriesId": "series123",
|
||||
"SeasonId": "season3abc",
|
||||
"SpecialFeatureCount": 0,
|
||||
"DisplayPreferencesId": "episode123abc",
|
||||
"Status": null,
|
||||
"AirTime": null,
|
||||
"AirDays": [],
|
||||
"Tags": [],
|
||||
"PrimaryImageAspectRatio": 1.777777777777778,
|
||||
"Artists": [],
|
||||
"ArtistItems": [],
|
||||
"Album": null,
|
||||
"CollectionType": null,
|
||||
"DisplayOrder": null,
|
||||
"AlbumId": null,
|
||||
"AlbumPrimaryImageTag": null,
|
||||
"SeriesPrimaryImageTag": "series-primary",
|
||||
"AlbumArtist": null,
|
||||
"AlbumArtists": [],
|
||||
"SeasonName": "Season 3",
|
||||
"MediaStreams": [],
|
||||
"VideoType": "VideoFile",
|
||||
"PartCount": 1,
|
||||
"MediaSourceCount": 1,
|
||||
"ImageTags": {
|
||||
"Primary": "episode-primary"
|
||||
},
|
||||
"BackdropImageTags": [],
|
||||
"ScreenshotImageTags": [],
|
||||
"ParentLogoImageTag": null,
|
||||
"ParentArtItemId": null,
|
||||
"ParentArtImageTag": null,
|
||||
"SeriesThumbImageTag": null,
|
||||
"ImageBlurHashes": {},
|
||||
"SeriesStudio": "NBC",
|
||||
"ParentThumbItemId": null,
|
||||
"ParentThumbImageTag": null,
|
||||
"ParentPrimaryImageItemId": "series123",
|
||||
"ParentPrimaryImageTag": "series-primary",
|
||||
"Chapters": [],
|
||||
"LocationType": "FileSystem",
|
||||
"IsoType": null,
|
||||
"MediaType": "Video",
|
||||
"EndDate": null,
|
||||
"LockedFields": [],
|
||||
"TrailerCount": 0,
|
||||
"MovieCount": 0,
|
||||
"SeriesCount": 0,
|
||||
"ProgramCount": 0,
|
||||
"EpisodeCount": 0,
|
||||
"SongCount": 0,
|
||||
"AlbumCount": 0,
|
||||
"ArtistCount": 0,
|
||||
"MusicVideoCount": 0,
|
||||
"LockData": false,
|
||||
"Width": 1920,
|
||||
"Height": 1080,
|
||||
"CameraMake": null,
|
||||
"CameraModel": null,
|
||||
"Software": null,
|
||||
"ExposureTime": null,
|
||||
"FocalLength": null,
|
||||
"ImageOrientation": null,
|
||||
"Aperture": null,
|
||||
"ShutterSpeed": null,
|
||||
"Latitude": null,
|
||||
"Longitude": null,
|
||||
"Altitude": null,
|
||||
"IsoSpeedRating": null,
|
||||
"SeriesTimerId": null,
|
||||
"ProgramId": null,
|
||||
"ChannelPrimaryImageTag": null,
|
||||
"StartDate": null,
|
||||
"CompletionPercentage": null,
|
||||
"IsRepeat": null,
|
||||
"EpisodeTitle": "Gay Witch Hunt",
|
||||
"ChannelType": null,
|
||||
"Audio": null,
|
||||
"IsMovie": false,
|
||||
"IsSports": false,
|
||||
"IsNews": false,
|
||||
"IsKids": false,
|
||||
"IsPremiere": false,
|
||||
"TimerId": null,
|
||||
"NormalizationGain": null,
|
||||
"CurrentProgram": null
|
||||
},
|
||||
"FullNowPlayingItem": {},
|
||||
"NowViewingItem": null,
|
||||
"DeviceType": "Desktop",
|
||||
"NowPlayingQueue": [],
|
||||
"NowPlayingQueueFullItems": [],
|
||||
"HasCustomDeviceName": false,
|
||||
"PlaylistItemId": "playlist-item-1",
|
||||
"ServerId": "jellyfin-server-123",
|
||||
"UserPrimaryImageTag": null,
|
||||
"SupportedCommands": []
|
||||
},
|
||||
{
|
||||
"PlayState": {
|
||||
"CanSeek": true,
|
||||
"IsPaused": true,
|
||||
"IsMuted": false,
|
||||
"RepeatMode": "RepeatNone",
|
||||
"ShuffleMode": "Sorted",
|
||||
"VolumeLevel": 65,
|
||||
"AudioStreamIndex": 1,
|
||||
"SubtitleStreamIndex": 2,
|
||||
"MediaSourceId": "67890defghi",
|
||||
"PlayMethod": "DirectPlay",
|
||||
"PlaySessionId": "session-2-def456",
|
||||
"PlaylistItemId": "playlist-item-2",
|
||||
"PositionTicks": 45000000000
|
||||
},
|
||||
"AdditionalUsers": [],
|
||||
"Capabilities": {
|
||||
"PlayableMediaTypes": ["Audio", "Video"],
|
||||
"SupportedCommands": ["Play", "Pause", "Stop", "Seek"]
|
||||
},
|
||||
"RemoteEndPoint": "192.168.1.101",
|
||||
"PlayableMediaTypes": ["Audio", "Video"],
|
||||
"Id": "session-2-def456",
|
||||
"UserId": "user456def",
|
||||
"UserName": "jane_smith",
|
||||
"Client": "Jellyfin Android",
|
||||
"LastActivityDate": "2024-01-15T10:25:00.0000000Z",
|
||||
"LastPlaybackCheckIn": "2024-01-15T10:25:00.0000000Z",
|
||||
"DeviceName": "Samsung Galaxy S21",
|
||||
"DeviceId": "device-android-samsung",
|
||||
"ApplicationVersion": "2.6.2",
|
||||
"IsActive": true,
|
||||
"SupportsMediaControl": true,
|
||||
"SupportsRemoteControl": true,
|
||||
"NowPlayingItem": {
|
||||
"Name": "Inception",
|
||||
"OriginalTitle": "Inception",
|
||||
"Id": "movie456def",
|
||||
"Etag": "etag456",
|
||||
"SourceType": "Library",
|
||||
"PlaylistItemId": "playlist-item-2",
|
||||
"DateCreated": "2024-01-05T00:00:00.0000000Z",
|
||||
"DateLastMediaAdded": "2024-01-05T00:00:00.0000000Z",
|
||||
"Container": "mkv",
|
||||
"SortName": "inception",
|
||||
"PremiereDate": "2010-07-16T00:00:00.0000000Z",
|
||||
"Path": "/media/movies/Inception (2010)/Inception.mkv",
|
||||
"EnableMediaSourceDisplay": true,
|
||||
"OfficialRating": "PG-13",
|
||||
"Overview": "A thief who steals corporate secrets through the use of dream-sharing technology is given the inverse task of planting an idea into the mind of a C.E.O.",
|
||||
"Taglines": ["Your mind is the scene of the crime"],
|
||||
"Genres": ["Action", "Sci-Fi", "Thriller"],
|
||||
"CommunityRating": 8.8,
|
||||
"CumulativeRunTimeTicks": 88800000000,
|
||||
"RunTimeTicks": 88800000000,
|
||||
"PlayAccess": "Full",
|
||||
"AspectRatio": "2.40:1",
|
||||
"ProductionYear": 2010,
|
||||
"IsPlaceHolder": false,
|
||||
"IsHD": true,
|
||||
"IsFolder": false,
|
||||
"Type": "Movie",
|
||||
"LocalTrailerCount": 0,
|
||||
"UserData": {
|
||||
"PlayedPercentage": 50.6,
|
||||
"PlaybackPositionTicks": 45000000000,
|
||||
"PlayCount": 0,
|
||||
"IsFavorite": true,
|
||||
"LastPlayedDate": "2024-01-15T10:25:00.0000000Z",
|
||||
"Played": false,
|
||||
"Key": "movie456def"
|
||||
},
|
||||
"PrimaryImageAspectRatio": 0.6666666666666666,
|
||||
"VideoType": "VideoFile",
|
||||
"PartCount": 1,
|
||||
"MediaSourceCount": 1,
|
||||
"ImageTags": {
|
||||
"Primary": "movie-primary"
|
||||
},
|
||||
"BackdropImageTags": ["backdrop1", "backdrop2"],
|
||||
"LocationType": "FileSystem",
|
||||
"MediaType": "Video",
|
||||
"Width": 1920,
|
||||
"Height": 800,
|
||||
"IsMovie": true,
|
||||
"IsSports": false,
|
||||
"IsNews": false,
|
||||
"IsKids": false,
|
||||
"IsPremiere": false
|
||||
},
|
||||
"FullNowPlayingItem": {},
|
||||
"NowViewingItem": null,
|
||||
"DeviceType": "Phone",
|
||||
"NowPlayingQueue": [],
|
||||
"NowPlayingQueueFullItems": [],
|
||||
"HasCustomDeviceName": false,
|
||||
"PlaylistItemId": "playlist-item-2",
|
||||
"ServerId": "jellyfin-server-123",
|
||||
"UserPrimaryImageTag": null,
|
||||
"SupportedCommands": []
|
||||
},
|
||||
{
|
||||
"PlayState": null,
|
||||
"AdditionalUsers": [],
|
||||
"Capabilities": {
|
||||
"PlayableMediaTypes": ["Audio", "Video"],
|
||||
"SupportedCommands": ["Play", "Pause", "Stop"]
|
||||
},
|
||||
"RemoteEndPoint": "192.168.1.102",
|
||||
"PlayableMediaTypes": ["Audio", "Video"],
|
||||
"Id": "session-3-ghi789",
|
||||
"UserId": "user789ghi",
|
||||
"UserName": "family_user",
|
||||
"Client": "Jellyfin for Roku",
|
||||
"LastActivityDate": "2024-01-15T10:20:00.0000000Z",
|
||||
"LastPlaybackCheckIn": "2024-01-15T10:20:00.0000000Z",
|
||||
"DeviceName": "Roku Ultra",
|
||||
"DeviceId": "device-roku-ultra",
|
||||
"ApplicationVersion": "1.6.8",
|
||||
"IsActive": true,
|
||||
"SupportsMediaControl": true,
|
||||
"SupportsRemoteControl": true,
|
||||
"FullNowPlayingItem": {},
|
||||
"NowViewingItem": null,
|
||||
"DeviceType": "Tv",
|
||||
"NowPlayingQueue": [],
|
||||
"NowPlayingQueueFullItems": [],
|
||||
"HasCustomDeviceName": false,
|
||||
"ServerId": "jellyfin-server-123",
|
||||
"UserPrimaryImageTag": null,
|
||||
"SupportedCommands": []
|
||||
}
|
||||
]
|
||||
35
dummy-data/lidarr/api/v1/health
Normal file
35
dummy-data/lidarr/api/v1/health
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
[
|
||||
{
|
||||
"source": "IndexerStatusCheck",
|
||||
"type": "warning",
|
||||
"message": "Indexer MusicBrainzDB is unavailable due to recent indexer errors: Service temporarily unavailable",
|
||||
"wikiUrl": "https://wiki.servarr.com/lidarr/health#indexers-are-unavailable-due-to-recent-failures"
|
||||
},
|
||||
{
|
||||
"source": "ImportMechanismCheck",
|
||||
"type": "ok",
|
||||
"message": "No issues with import mechanism checks"
|
||||
},
|
||||
{
|
||||
"source": "DownloadClientStatusCheck",
|
||||
"type": "ok",
|
||||
"message": "All download clients are available"
|
||||
},
|
||||
{
|
||||
"source": "RootFolderCheck",
|
||||
"type": "error",
|
||||
"message": "Missing root folder: /music",
|
||||
"wikiUrl": "https://wiki.servarr.com/lidarr/health#missing-root-folder"
|
||||
},
|
||||
{
|
||||
"source": "UpdateCheck",
|
||||
"type": "ok",
|
||||
"message": "Update available: 1.3.6.3557 -> 2.0.7.3849"
|
||||
},
|
||||
{
|
||||
"source": "MetadataProviderCheck",
|
||||
"type": "warning",
|
||||
"message": "Metadata provider Last.fm API key is invalid or expired",
|
||||
"wikiUrl": "https://wiki.servarr.com/lidarr/health#metadata-provider-issues"
|
||||
}
|
||||
]
|
||||
7
dummy-data/lidarr/api/v1/queue/status
Normal file
7
dummy-data/lidarr/api/v1/queue/status
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"totalCount": 4,
|
||||
"count": 4,
|
||||
"unknownCount": 0,
|
||||
"errors": false,
|
||||
"warnings": false
|
||||
}
|
||||
179
dummy-data/lidarr/api/v1/wanted/missing
Normal file
179
dummy-data/lidarr/api/v1/wanted/missing
Normal file
|
|
@ -0,0 +1,179 @@
|
|||
{
|
||||
"page": 1,
|
||||
"pageSize": 20,
|
||||
"sortKey": "releaseDate",
|
||||
"sortDirection": "descending",
|
||||
"totalRecords": 7,
|
||||
"records": [
|
||||
{
|
||||
"artistId": 1,
|
||||
"albumId": 12345,
|
||||
"foreignAlbumId": "mbid-123-456-789",
|
||||
"title": "Dark Side of the Moon",
|
||||
"disambiguation": "",
|
||||
"overview": "The eighth studio album by Pink Floyd, released in 1973.",
|
||||
"artistName": "Pink Floyd",
|
||||
"foreignArtistId": "mbid-artist-123",
|
||||
"monitored": true,
|
||||
"anyReleaseOk": true,
|
||||
"profileId": 1,
|
||||
"duration": 2580000,
|
||||
"albumType": "Album",
|
||||
"secondaryTypes": [],
|
||||
"mediumCount": 1,
|
||||
"releaseDate": "1973-03-01T00:00:00Z",
|
||||
"releases": [
|
||||
{
|
||||
"id": 67890,
|
||||
"albumId": 12345,
|
||||
"foreignReleaseId": "mbid-release-123",
|
||||
"title": "Dark Side of the Moon",
|
||||
"status": "Official",
|
||||
"duration": 2580000,
|
||||
"trackCount": 10,
|
||||
"mediumCount": 1,
|
||||
"disambiguation": "",
|
||||
"country": ["US"],
|
||||
"label": ["Harvest", "Capitol"],
|
||||
"monitored": true
|
||||
}
|
||||
],
|
||||
"genres": ["Progressive Rock", "Psychedelic Rock"],
|
||||
"media": [
|
||||
{
|
||||
"mediumNumber": 1,
|
||||
"mediumName": "",
|
||||
"mediumFormat": "CD"
|
||||
}
|
||||
],
|
||||
"artist": {
|
||||
"artistName": "Pink Floyd",
|
||||
"foreignArtistId": "mbid-artist-123",
|
||||
"nameSlug": "pink-floyd",
|
||||
"overview": "English rock band formed in London in 1965.",
|
||||
"disambiguation": "",
|
||||
"links": [],
|
||||
"images": [],
|
||||
"path": "/music/Pink Floyd",
|
||||
"qualityProfileId": 1,
|
||||
"metadataProfileId": 1,
|
||||
"monitored": true,
|
||||
"monitorNewItems": "all",
|
||||
"genres": ["Progressive Rock", "Psychedelic Rock", "Art Rock"],
|
||||
"cleanName": "pinkfloyd",
|
||||
"sortName": "Pink Floyd",
|
||||
"tags": [],
|
||||
"added": "2024-01-01T00:00:00Z",
|
||||
"ratings": {
|
||||
"votes": 54321,
|
||||
"value": 9.2
|
||||
},
|
||||
"statistics": {
|
||||
"albumCount": 15,
|
||||
"trackFileCount": 142,
|
||||
"trackCount": 149,
|
||||
"totalTrackCount": 149,
|
||||
"sizeOnDisk": 7516192768,
|
||||
"percentOfTracks": 95.3
|
||||
},
|
||||
"id": 1
|
||||
},
|
||||
"images": [],
|
||||
"links": [],
|
||||
"statistics": {
|
||||
"trackFileCount": 0,
|
||||
"trackCount": 10,
|
||||
"totalTrackCount": 10,
|
||||
"sizeOnDisk": 0,
|
||||
"percentOfTracks": 0.0
|
||||
},
|
||||
"grabbed": false,
|
||||
"id": 12345
|
||||
},
|
||||
{
|
||||
"artistId": 2,
|
||||
"albumId": 23456,
|
||||
"foreignAlbumId": "mbid-234-567-890",
|
||||
"title": "OK Computer",
|
||||
"disambiguation": "",
|
||||
"overview": "The third studio album by Radiohead, released in 1997.",
|
||||
"artistName": "Radiohead",
|
||||
"foreignArtistId": "mbid-artist-234",
|
||||
"monitored": true,
|
||||
"anyReleaseOk": true,
|
||||
"profileId": 1,
|
||||
"duration": 3230000,
|
||||
"albumType": "Album",
|
||||
"secondaryTypes": [],
|
||||
"mediumCount": 1,
|
||||
"releaseDate": "1997-06-16T00:00:00Z",
|
||||
"releases": [
|
||||
{
|
||||
"id": 78901,
|
||||
"albumId": 23456,
|
||||
"foreignReleaseId": "mbid-release-234",
|
||||
"title": "OK Computer",
|
||||
"status": "Official",
|
||||
"duration": 3230000,
|
||||
"trackCount": 12,
|
||||
"mediumCount": 1,
|
||||
"disambiguation": "",
|
||||
"country": ["GB"],
|
||||
"label": ["Parlophone", "Capitol"],
|
||||
"monitored": true
|
||||
}
|
||||
],
|
||||
"genres": ["Alternative Rock", "Art Rock"],
|
||||
"media": [
|
||||
{
|
||||
"mediumNumber": 1,
|
||||
"mediumName": "",
|
||||
"mediumFormat": "CD"
|
||||
}
|
||||
],
|
||||
"artist": {
|
||||
"artistName": "Radiohead",
|
||||
"foreignArtistId": "mbid-artist-234",
|
||||
"nameSlug": "radiohead",
|
||||
"overview": "English rock band formed in Abingdon, Oxfordshire, in 1985.",
|
||||
"disambiguation": "",
|
||||
"links": [],
|
||||
"images": [],
|
||||
"path": "/music/Radiohead",
|
||||
"qualityProfileId": 1,
|
||||
"metadataProfileId": 1,
|
||||
"monitored": true,
|
||||
"monitorNewItems": "all",
|
||||
"genres": ["Alternative Rock", "Art Rock", "Electronic"],
|
||||
"cleanName": "radiohead",
|
||||
"sortName": "Radiohead",
|
||||
"tags": [],
|
||||
"added": "2024-01-01T00:00:00Z",
|
||||
"ratings": {
|
||||
"votes": 45678,
|
||||
"value": 8.9
|
||||
},
|
||||
"statistics": {
|
||||
"albumCount": 9,
|
||||
"trackFileCount": 89,
|
||||
"trackCount": 95,
|
||||
"totalTrackCount": 95,
|
||||
"sizeOnDisk": 4831838208,
|
||||
"percentOfTracks": 93.7
|
||||
},
|
||||
"id": 2
|
||||
},
|
||||
"images": [],
|
||||
"links": [],
|
||||
"statistics": {
|
||||
"trackFileCount": 0,
|
||||
"trackCount": 12,
|
||||
"totalTrackCount": 12,
|
||||
"sizeOnDisk": 0,
|
||||
"percentOfTracks": 0.0
|
||||
},
|
||||
"grabbed": false,
|
||||
"id": 23456
|
||||
}
|
||||
]
|
||||
}
|
||||
61
dummy-data/linkding/api/bookmarks
Normal file
61
dummy-data/linkding/api/bookmarks
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
{
|
||||
"count": 12,
|
||||
"next": null,
|
||||
"previous": null,
|
||||
"results": [
|
||||
{
|
||||
"id": 1,
|
||||
"url": "https://github.com/bastienwirtz/homer",
|
||||
"title": "Homer - A very simple static homepage for your server",
|
||||
"description": "A dead simple static HOMepage for your servER to keep your services on hand, from a simple yaml configuration file.",
|
||||
"notes": "",
|
||||
"website_title": "GitHub",
|
||||
"website_description": "GitHub is where over 100 million developers shape the future of software, together.",
|
||||
"web_archive_snapshot_url": "",
|
||||
"favicon_url": "https://github.githubassets.com/favicons/favicon.svg",
|
||||
"preview_image_url": "",
|
||||
"is_archived": false,
|
||||
"unread": false,
|
||||
"shared": false,
|
||||
"tag_names": ["selfhosted", "dashboard", "yaml"],
|
||||
"date_added": "2024-01-15T10:30:00.123456Z",
|
||||
"date_modified": "2024-01-15T10:30:00.123456Z"
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"url": "https://docs.docker.com/",
|
||||
"title": "Docker Documentation",
|
||||
"description": "Official Docker documentation with guides, references, and tutorials for containerization.",
|
||||
"notes": "Essential for container management",
|
||||
"website_title": "Docker Docs",
|
||||
"website_description": "Docker helps developers build, share, run, and verify applications anywhere.",
|
||||
"web_archive_snapshot_url": "",
|
||||
"favicon_url": "https://docs.docker.com/favicons/docs@2x.ico",
|
||||
"preview_image_url": "",
|
||||
"is_archived": false,
|
||||
"unread": false,
|
||||
"shared": false,
|
||||
"tag_names": ["docker", "containers", "documentation"],
|
||||
"date_added": "2024-01-14T15:20:00.123456Z",
|
||||
"date_modified": "2024-01-14T15:20:00.123456Z"
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"url": "https://nginx.org/en/docs/",
|
||||
"title": "nginx documentation",
|
||||
"description": "Official nginx web server documentation covering installation, configuration, and modules.",
|
||||
"notes": "",
|
||||
"website_title": "nginx",
|
||||
"website_description": "nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server.",
|
||||
"web_archive_snapshot_url": "",
|
||||
"favicon_url": "https://nginx.org/favicon.ico",
|
||||
"preview_image_url": "",
|
||||
"is_archived": false,
|
||||
"unread": false,
|
||||
"shared": false,
|
||||
"tag_names": ["nginx", "webserver", "proxy"],
|
||||
"date_added": "2024-01-13T09:45:00.123456Z",
|
||||
"date_modified": "2024-01-13T09:45:00.123456Z"
|
||||
}
|
||||
]
|
||||
}
|
||||
6
dummy-data/matrix/_matrix/federation/v1/version
Normal file
6
dummy-data/matrix/_matrix/federation/v1/version
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"server": {
|
||||
"name": "Synapse",
|
||||
"version": "1.99.0"
|
||||
}
|
||||
}
|
||||
18
dummy-data/mealie/api/admin/about/statistics
Normal file
18
dummy-data/mealie/api/admin/about/statistics
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"totalRecipes": 247,
|
||||
"totalUsers": 5,
|
||||
"totalGroups": 2,
|
||||
"totalCategories": 18,
|
||||
"totalTags": 42,
|
||||
"totalTools": 15,
|
||||
"totalMealPlans": 156,
|
||||
"totalShoppingLists": 28,
|
||||
"totalComments": 89,
|
||||
"lastUpdated": "2024-01-15T10:30:00Z",
|
||||
"version": "1.0.0",
|
||||
"demoStatus": false,
|
||||
"allowSignup": true,
|
||||
"defaultGroup": "Home",
|
||||
"buildVersion": "v1.0.0-1234567",
|
||||
"apiVersion": "v1"
|
||||
}
|
||||
64
dummy-data/mealie/api/groups/mealplans/today
Normal file
64
dummy-data/mealie/api/groups/mealplans/today
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
[
|
||||
{
|
||||
"id": "meal-123-abc",
|
||||
"date": "2024-01-15",
|
||||
"entryType": "dinner",
|
||||
"title": "Dinner",
|
||||
"text": "",
|
||||
"recipe": {
|
||||
"id": "recipe-456-def",
|
||||
"name": "Chicken Tikka Masala",
|
||||
"slug": "chicken-tikka-masala",
|
||||
"image": "recipe-456-def.webp",
|
||||
"description": "Creamy tomato-based curry with tender chicken pieces and aromatic spices",
|
||||
"recipeCategory": [
|
||||
{
|
||||
"id": "cat-1",
|
||||
"name": "Indian",
|
||||
"slug": "indian"
|
||||
},
|
||||
{
|
||||
"id": "cat-2",
|
||||
"name": "Main Course",
|
||||
"slug": "main-course"
|
||||
}
|
||||
],
|
||||
"tags": [
|
||||
{
|
||||
"id": "tag-1",
|
||||
"name": "Curry",
|
||||
"slug": "curry"
|
||||
},
|
||||
{
|
||||
"id": "tag-2",
|
||||
"name": "Chicken",
|
||||
"slug": "chicken"
|
||||
},
|
||||
{
|
||||
"id": "tag-3",
|
||||
"name": "Spicy",
|
||||
"slug": "spicy"
|
||||
}
|
||||
],
|
||||
"rating": 4.5,
|
||||
"totalTime": "45 minutes",
|
||||
"prepTime": "15 minutes",
|
||||
"cookTime": "30 minutes",
|
||||
"performTime": null,
|
||||
"servings": 4,
|
||||
"dateAdded": "2024-01-10T00:00:00Z",
|
||||
"dateUpdated": "2024-01-14T12:30:00Z",
|
||||
"createdBy": {
|
||||
"id": "user-789",
|
||||
"username": "chef_sarah",
|
||||
"fullName": "Sarah Mitchell"
|
||||
},
|
||||
"updateBy": {
|
||||
"id": "user-789",
|
||||
"username": "chef_sarah",
|
||||
"fullName": "Sarah Mitchell"
|
||||
}
|
||||
},
|
||||
"groupId": "group-default-123"
|
||||
}
|
||||
]
|
||||
108
dummy-data/medusa/api/v2/config
Normal file
108
dummy-data/medusa/api/v2/config
Normal file
|
|
@ -0,0 +1,108 @@
|
|||
{
|
||||
"system": {
|
||||
"news": {
|
||||
"unread": 3,
|
||||
"latest": [
|
||||
{
|
||||
"title": "Medusa v1.0.19 Released",
|
||||
"date": "2024-01-14",
|
||||
"content": "Bug fixes and performance improvements",
|
||||
"read": false
|
||||
},
|
||||
{
|
||||
"title": "New indexer support added",
|
||||
"date": "2024-01-12",
|
||||
"content": "Support for additional torrent indexers",
|
||||
"read": false
|
||||
},
|
||||
{
|
||||
"title": "Database maintenance completed",
|
||||
"date": "2024-01-10",
|
||||
"content": "Weekly database optimization finished",
|
||||
"read": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"version": {
|
||||
"version": "1.0.19",
|
||||
"branch": "master",
|
||||
"commit": "abc123def456",
|
||||
"dbVersion": 44,
|
||||
"pythonVersion": "3.11.7"
|
||||
},
|
||||
"os": {
|
||||
"platform": "Linux",
|
||||
"release": "6.5.0-15-generic",
|
||||
"version": "#15~22.04.1-Ubuntu"
|
||||
},
|
||||
"memory": {
|
||||
"used": 512.5,
|
||||
"total": 8192.0,
|
||||
"percent": 6.3
|
||||
}
|
||||
},
|
||||
"main": {
|
||||
"logs": {
|
||||
"numWarnings": 2,
|
||||
"numErrors": 1,
|
||||
"loggingLevels": [
|
||||
"DEBUG",
|
||||
"INFO",
|
||||
"WARNING",
|
||||
"ERROR"
|
||||
],
|
||||
"currentLevel": "INFO"
|
||||
},
|
||||
"general": {
|
||||
"webHost": "0.0.0.0",
|
||||
"webPort": 8081,
|
||||
"webRoot": "",
|
||||
"launchBrowser": false,
|
||||
"versionNotify": true,
|
||||
"autoUpdate": false,
|
||||
"logDir": "/app/Logs",
|
||||
"dataDir": "/app/Data",
|
||||
"configVersion": 12
|
||||
},
|
||||
"showDefaults": {
|
||||
"status": "Skipped/Wanted/Snatched/Downloaded",
|
||||
"statusAfter": "Downloaded",
|
||||
"season_folders": true,
|
||||
"anime": false,
|
||||
"scene": false,
|
||||
"archive_firstmatch": false,
|
||||
"quality_default": "Standard Definition",
|
||||
"subtitles": false,
|
||||
"flatten_folders": false,
|
||||
"indexer_default": "tvdb",
|
||||
"indexer_timeout": 20,
|
||||
"skip_removed_files": false
|
||||
}
|
||||
},
|
||||
"search": {
|
||||
"general": {
|
||||
"randomize_providers": false,
|
||||
"download_propers": true,
|
||||
"check_propers_interval": "daily",
|
||||
"propers_search_days": 2,
|
||||
"backlog_days": 7,
|
||||
"cache_trimming": false,
|
||||
"max_cache_age": 30
|
||||
},
|
||||
"nzb": {
|
||||
"nzbs": false,
|
||||
"nzbs_uid": "",
|
||||
"nzbs_hash": ""
|
||||
},
|
||||
"torrent": {
|
||||
"torrent_method": "blackhole",
|
||||
"torrent_path": "",
|
||||
"torrent_seed_time": 0,
|
||||
"torrent_paused": false,
|
||||
"torrent_high_bandwidth": false,
|
||||
"torrent_label": "",
|
||||
"torrent_label_anime": "",
|
||||
"torrent_verify_cert": false
|
||||
}
|
||||
}
|
||||
}
|
||||
36
dummy-data/miniflux/v1/entries
Normal file
36
dummy-data/miniflux/v1/entries
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
{
|
||||
"total": 42,
|
||||
"entries": [
|
||||
{
|
||||
"id": 888,
|
||||
"user_id": 1,
|
||||
"feed_id": 42,
|
||||
"title": "Example Unread Entry",
|
||||
"url": "http://example.org/article.html",
|
||||
"comments_url": "",
|
||||
"author": "John Doe",
|
||||
"content": "<p>This is an unread RSS entry</p>",
|
||||
"hash": "29f99e4074cdacca1766f47697d03c66070ef6a14770a1fd5a867483c207a1bb",
|
||||
"published_at": "2025-11-11T16:15:19Z",
|
||||
"created_at": "2025-11-11T16:15:19Z",
|
||||
"status": "unread",
|
||||
"share_code": "",
|
||||
"starred": false,
|
||||
"reading_time": 5,
|
||||
"enclosures": null,
|
||||
"feed": {
|
||||
"id": 42,
|
||||
"user_id": 1,
|
||||
"title": "Tech Blog",
|
||||
"site_url": "http://example.org",
|
||||
"feed_url": "http://example.org/feed.atom",
|
||||
"checked_at": "2025-11-11T21:06:03.133839Z",
|
||||
"category": {
|
||||
"id": 22,
|
||||
"user_id": 1,
|
||||
"title": "Technology"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
10
dummy-data/nextcloud/status.php
Normal file
10
dummy-data/nextcloud/status.php
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"installed": true,
|
||||
"maintenance": false,
|
||||
"needsDbUpgrade": false,
|
||||
"version": "28.0.2.1",
|
||||
"versionstring": "28.0.2",
|
||||
"edition": "",
|
||||
"productname": "Nextcloud",
|
||||
"extendedSupport": false
|
||||
}
|
||||
30
dummy-data/octoprint/api/job
Normal file
30
dummy-data/octoprint/api/job
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
{
|
||||
"job": {
|
||||
"averagePrintTime": 669.3131185749999,
|
||||
"estimatedPrintTime": 314.87566979223726,
|
||||
"filament": {
|
||||
"tool0": {
|
||||
"length": 134.81171000000032,
|
||||
"volume": 0.0
|
||||
}
|
||||
},
|
||||
"file": {
|
||||
"date": 1665547748,
|
||||
"display": "CE3PRO_3mmX3mm Brass insert V2.gcode",
|
||||
"name": "CE3PRO_3mmX3mm Brass insert V2.gcode",
|
||||
"origin": "local",
|
||||
"path": "MISC/CE3PRO_3mmX3mm Brass insert V2.gcode",
|
||||
"size": 129581
|
||||
},
|
||||
"lastPrintTime": 669.3131185749999,
|
||||
"user": "friendlyngeeks"
|
||||
},
|
||||
"progress": {
|
||||
"completion": 27.456185706237797,
|
||||
"filepos": 35578,
|
||||
"printTime": 460,
|
||||
"printTimeLeft": 4612,
|
||||
"printTimeLeftOrigin": "linear"
|
||||
},
|
||||
"state": "Printing"
|
||||
}
|
||||
27
dummy-data/octoprint/api/printer
Normal file
27
dummy-data/octoprint/api/printer
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
{
|
||||
"temperature": {
|
||||
"bed": {
|
||||
"actual": 20.52,
|
||||
"offset": 0,
|
||||
"target": 0.0
|
||||
},
|
||||
"tool0": {
|
||||
"actual": 20.44,
|
||||
"offset": 0,
|
||||
"target": 0.0
|
||||
}
|
||||
},
|
||||
"state": {
|
||||
"text": "Operational",
|
||||
"flags": {
|
||||
"operational": true,
|
||||
"paused": false,
|
||||
"printing": false,
|
||||
"cancelling": false,
|
||||
"pausing": false,
|
||||
"error": false,
|
||||
"ready": true,
|
||||
"closedOrError": false
|
||||
}
|
||||
}
|
||||
}
|
||||
26
dummy-data/octoprint/api/status_printer_offline-error.json
Normal file
26
dummy-data/octoprint/api/status_printer_offline-error.json
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
{
|
||||
"error": "SerialException: device reports readiness to read but returned no data (device disconnected or multiple access on port?)",
|
||||
"job": {
|
||||
"averagePrintTime": null,
|
||||
"estimatedPrintTime": null,
|
||||
"filament": null,
|
||||
"file": {
|
||||
"date": null,
|
||||
"display": null,
|
||||
"name": null,
|
||||
"origin": null,
|
||||
"path": null,
|
||||
"size": null
|
||||
},
|
||||
"lastPrintTime": null,
|
||||
"user": null
|
||||
},
|
||||
"progress": {
|
||||
"completion": null,
|
||||
"filepos": null,
|
||||
"printTime": null,
|
||||
"printTimeLeft": null,
|
||||
"printTimeLeftOrigin": null
|
||||
},
|
||||
"state": "Offline after error"
|
||||
}
|
||||
26
dummy-data/octoprint/api/status_printer_offline.json
Normal file
26
dummy-data/octoprint/api/status_printer_offline.json
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
{
|
||||
"job": {
|
||||
"estimatedPrintTime": null,
|
||||
"filament": {
|
||||
"length": null,
|
||||
"volume": null
|
||||
},
|
||||
"file": {
|
||||
"date": null,
|
||||
"name": null,
|
||||
"origin": null,
|
||||
"path": null,
|
||||
"size": null
|
||||
},
|
||||
"lastPrintTime": null,
|
||||
"user": null
|
||||
},
|
||||
"progress": {
|
||||
"completion": null,
|
||||
"filepos": null,
|
||||
"printTime": null,
|
||||
"printTimeLeft": null,
|
||||
"printTimeOrigin": null
|
||||
},
|
||||
"state": "Offline"
|
||||
}
|
||||
26
dummy-data/octoprint/api/status_printer_operational.json
Normal file
26
dummy-data/octoprint/api/status_printer_operational.json
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
{
|
||||
"job": {
|
||||
"estimatedPrintTime": null,
|
||||
"filament": {
|
||||
"length": null,
|
||||
"volume": null
|
||||
},
|
||||
"file": {
|
||||
"date": null,
|
||||
"name": null,
|
||||
"origin": null,
|
||||
"path": null,
|
||||
"size": null
|
||||
},
|
||||
"lastPrintTime": null,
|
||||
"user": null
|
||||
},
|
||||
"progress": {
|
||||
"completion": null,
|
||||
"filepos": null,
|
||||
"printTime": null,
|
||||
"printTimeLeft": null,
|
||||
"printTimeOrigin": null
|
||||
},
|
||||
"state": "Operational"
|
||||
}
|
||||
30
dummy-data/octoprint/api/status_printer_printing.json
Normal file
30
dummy-data/octoprint/api/status_printer_printing.json
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
{
|
||||
"job": {
|
||||
"averagePrintTime": 669.3131185749999,
|
||||
"estimatedPrintTime": 314.87566979223726,
|
||||
"filament": {
|
||||
"tool0": {
|
||||
"length": 134.81171000000032,
|
||||
"volume": 0.0
|
||||
}
|
||||
},
|
||||
"file": {
|
||||
"date": 1665547748,
|
||||
"display": "CE3PRO_3mmX3mm Brass insert V2.gcode",
|
||||
"name": "CE3PRO_3mmX3mm Brass insert V2.gcode",
|
||||
"origin": "local",
|
||||
"path": "MISC/CE3PRO_3mmX3mm Brass insert V2.gcode",
|
||||
"size": 129581
|
||||
},
|
||||
"lastPrintTime": 669.3131185749999,
|
||||
"user": "friendlyngeeks"
|
||||
},
|
||||
"progress": {
|
||||
"completion": 0.1551153332664511,
|
||||
"filepos": 201,
|
||||
"printTime": 0,
|
||||
"printTimeLeft": 668,
|
||||
"printTimeLeftOrigin": "average"
|
||||
},
|
||||
"state": "Printing"
|
||||
}
|
||||
30
dummy-data/octoprint/api/status_printer_printing_1of2.json
Normal file
30
dummy-data/octoprint/api/status_printer_printing_1of2.json
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
{
|
||||
"job": {
|
||||
"averagePrintTime": 669.3131185749999,
|
||||
"estimatedPrintTime": 314.87566979223726,
|
||||
"filament": {
|
||||
"tool0": {
|
||||
"length": 134.81171000000032,
|
||||
"volume": 0.0
|
||||
}
|
||||
},
|
||||
"file": {
|
||||
"date": 1665547748,
|
||||
"display": "CE3PRO_3mmX3mm Brass insert V2.gcode",
|
||||
"name": "CE3PRO_3mmX3mm Brass insert V2.gcode",
|
||||
"origin": "local",
|
||||
"path": "MISC/CE3PRO_3mmX3mm Brass insert V2.gcode",
|
||||
"size": 129581
|
||||
},
|
||||
"lastPrintTime": 669.3131185749999,
|
||||
"user": "friendlyngeeks"
|
||||
},
|
||||
"progress": {
|
||||
"completion": 0.1551153332664511,
|
||||
"filepos": 201,
|
||||
"printTime": 0,
|
||||
"printTimeLeft": 668,
|
||||
"printTimeLeftOrigin": "average"
|
||||
},
|
||||
"state": "Printing"
|
||||
}
|
||||
30
dummy-data/octoprint/api/status_printer_printing_2of2.json
Normal file
30
dummy-data/octoprint/api/status_printer_printing_2of2.json
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
{
|
||||
"job": {
|
||||
"averagePrintTime": 669.3131185749999,
|
||||
"estimatedPrintTime": 314.87566979223726,
|
||||
"filament": {
|
||||
"tool0": {
|
||||
"length": 134.81171000000032,
|
||||
"volume": 0.0
|
||||
}
|
||||
},
|
||||
"file": {
|
||||
"date": 1665547748,
|
||||
"display": "CE3PRO_3mmX3mm Brass insert V2.gcode",
|
||||
"name": "CE3PRO_3mmX3mm Brass insert V2.gcode",
|
||||
"origin": "local",
|
||||
"path": "MISC/CE3PRO_3mmX3mm Brass insert V2.gcode",
|
||||
"size": 129581
|
||||
},
|
||||
"lastPrintTime": 669.3131185749999,
|
||||
"user": "friendlyngeeks"
|
||||
},
|
||||
"progress": {
|
||||
"completion": 27.456185706237797,
|
||||
"filepos": 35578,
|
||||
"printTime": 476,
|
||||
"printTimeLeft": 1612,
|
||||
"printTimeLeftOrigin": "linear"
|
||||
},
|
||||
"state": "Printing"
|
||||
}
|
||||
30
dummy-data/octoprint/api/status_printing_completion.json
Normal file
30
dummy-data/octoprint/api/status_printing_completion.json
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
{
|
||||
"job": {
|
||||
"averagePrintTime": 698.814525153,
|
||||
"estimatedPrintTime": 314.87566979223726,
|
||||
"filament": {
|
||||
"tool0": {
|
||||
"length": 134.81171000000032,
|
||||
"volume": 0.0
|
||||
}
|
||||
},
|
||||
"file": {
|
||||
"date": 1665547748,
|
||||
"display": "CE3PRO_3mmX3mm Brass insert V2.gcode",
|
||||
"name": "CE3PRO_3mmX3mm Brass insert V2.gcode",
|
||||
"origin": "local",
|
||||
"path": "MISC/CE3PRO_3mmX3mm Brass insert V2.gcode",
|
||||
"size": 129581
|
||||
},
|
||||
"lastPrintTime": 728.315931731,
|
||||
"user": "friendlyngeeks"
|
||||
},
|
||||
"progress": {
|
||||
"completion": 100.0,
|
||||
"filepos": 129581,
|
||||
"printTime": 728,
|
||||
"printTimeLeft": 0,
|
||||
"printTimeLeftOrigin": null
|
||||
},
|
||||
"state": "Operational"
|
||||
}
|
||||
18
dummy-data/olivetin/webUiSettings.json
Normal file
18
dummy-data/olivetin/webUiSettings.json
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"Rest": "./api/",
|
||||
"ShowFooter": true,
|
||||
"ShowNavigation": true,
|
||||
"ShowNewVersions": true,
|
||||
"AvailableVersion": "none",
|
||||
"CurrentVersion": "2024.11.24",
|
||||
"PageTitle": "OliveTin",
|
||||
"SectionNavigationStyle": "sidebar",
|
||||
"DefaultIconForBack": "«",
|
||||
"SshFoundKey": "not found at /home/user/.ssh/id_rsa",
|
||||
"SshFoundConfig": "not found at /home/user/.ssh/config",
|
||||
"EnableCustomJs": false,
|
||||
"AuthLoginUrl": "",
|
||||
"AuthLocalLogin": false,
|
||||
"AuthOAuth2Providers": null,
|
||||
"AdditionalLinks": null
|
||||
}
|
||||
18
dummy-data/openHAB/rest/systeminfo
Normal file
18
dummy-data/openHAB/rest/systeminfo
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"systemInfo": {
|
||||
"configFolder": "/etc/openhab",
|
||||
"userdataFolder": "/var/lib/openhab",
|
||||
"logFolder": "/var/log/openhab",
|
||||
"javaVersion": "17.0.9",
|
||||
"javaVendor": "Azul Systems, Inc.",
|
||||
"javaVendorVersion": "Zulu17.46+19-CA",
|
||||
"osName": "Linux",
|
||||
"osVersion": "6.5.11-4-pve",
|
||||
"osArchitecture": "amd64",
|
||||
"availableProcessors": 2,
|
||||
"freeMemory": 75885968,
|
||||
"totalMemory": 494927872,
|
||||
"uptime": 2150186,
|
||||
"startLevel": 100
|
||||
}
|
||||
}
|
||||
43
dummy-data/openweather/weather
Normal file
43
dummy-data/openweather/weather
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
{
|
||||
"coord": {
|
||||
"lon": 3.0586,
|
||||
"lat": 50.633
|
||||
},
|
||||
"weather": [
|
||||
{
|
||||
"id": 800,
|
||||
"main": "Clear",
|
||||
"description": "clear sky",
|
||||
"icon": "01d"
|
||||
}
|
||||
],
|
||||
"base": "stations",
|
||||
"main": {
|
||||
"temp": 287.38,
|
||||
"feels_like": 286.76,
|
||||
"temp_min": 286.38,
|
||||
"temp_max": 287.71,
|
||||
"pressure": 1019,
|
||||
"humidity": 73
|
||||
},
|
||||
"visibility": 10000,
|
||||
"wind": {
|
||||
"speed": 3.09,
|
||||
"deg": 30
|
||||
},
|
||||
"clouds": {
|
||||
"all": 0
|
||||
},
|
||||
"dt": 1718867378,
|
||||
"sys": {
|
||||
"type": 2,
|
||||
"id": 2011132,
|
||||
"country": "FR",
|
||||
"sunrise": 1718854500,
|
||||
"sunset": 1718913826
|
||||
},
|
||||
"timezone": 7200,
|
||||
"id": 2998324,
|
||||
"name": "Lille",
|
||||
"cod": 200
|
||||
}
|
||||
88
dummy-data/paperlessng/api/documents
Normal file
88
dummy-data/paperlessng/api/documents
Normal file
|
|
@ -0,0 +1,88 @@
|
|||
{
|
||||
"count": 1847,
|
||||
"next": "http://paperless.local/api/documents/?page=2",
|
||||
"previous": null,
|
||||
"all": [1, 2, 3, 4, 5],
|
||||
"results": [
|
||||
{
|
||||
"id": 1847,
|
||||
"correspondent": 15,
|
||||
"document_type": 12,
|
||||
"storage_path": null,
|
||||
"title": "Bank Statement - January 2024",
|
||||
"content": "Monthly bank statement with account summary and transaction details",
|
||||
"tags": [8, 15, 23],
|
||||
"created": "2024-01-15T10:30:00Z",
|
||||
"created_date": "2024-01-15",
|
||||
"modified": "2024-01-15T10:30:00Z",
|
||||
"added": "2024-01-15T10:30:00Z",
|
||||
"archive_serial_number": "ASN2024001847",
|
||||
"original_file_name": "bank_statement_202401.pdf",
|
||||
"archived_file_name": "0001847.pdf"
|
||||
},
|
||||
{
|
||||
"id": 1846,
|
||||
"correspondent": 23,
|
||||
"document_type": 5,
|
||||
"storage_path": null,
|
||||
"title": "Utility Bill - Electric Company",
|
||||
"content": "Monthly electricity bill for December 2023",
|
||||
"tags": [12, 18],
|
||||
"created": "2024-01-14T16:45:00Z",
|
||||
"created_date": "2024-01-14",
|
||||
"modified": "2024-01-14T16:45:00Z",
|
||||
"added": "2024-01-14T16:45:00Z",
|
||||
"archive_serial_number": "ASN2024001846",
|
||||
"original_file_name": "electric_bill_202312.pdf",
|
||||
"archived_file_name": "0001846.pdf"
|
||||
},
|
||||
{
|
||||
"id": 1845,
|
||||
"correspondent": 7,
|
||||
"document_type": 18,
|
||||
"storage_path": null,
|
||||
"title": "Insurance Policy Renewal Notice",
|
||||
"content": "Annual home insurance policy renewal documentation",
|
||||
"tags": [5, 11, 19],
|
||||
"created": "2024-01-13T14:20:00Z",
|
||||
"created_date": "2024-01-13",
|
||||
"modified": "2024-01-13T14:20:00Z",
|
||||
"added": "2024-01-13T14:20:00Z",
|
||||
"archive_serial_number": "ASN2024001845",
|
||||
"original_file_name": "insurance_renewal_2024.pdf",
|
||||
"archived_file_name": "0001845.pdf"
|
||||
},
|
||||
{
|
||||
"id": 1844,
|
||||
"correspondent": 31,
|
||||
"document_type": 9,
|
||||
"storage_path": null,
|
||||
"title": "Tax Document - W2 Form 2023",
|
||||
"content": "Annual W2 tax form from employer",
|
||||
"tags": [2, 14, 25],
|
||||
"created": "2024-01-12T09:15:00Z",
|
||||
"created_date": "2024-01-12",
|
||||
"modified": "2024-01-12T09:15:00Z",
|
||||
"added": "2024-01-12T09:15:00Z",
|
||||
"archive_serial_number": "ASN2024001844",
|
||||
"original_file_name": "w2_form_2023.pdf",
|
||||
"archived_file_name": "0001844.pdf"
|
||||
},
|
||||
{
|
||||
"id": 1843,
|
||||
"correspondent": 42,
|
||||
"document_type": 21,
|
||||
"storage_path": null,
|
||||
"title": "Medical Records - Annual Checkup",
|
||||
"content": "Annual physical examination results and health summary",
|
||||
"tags": [6, 17, 28],
|
||||
"created": "2024-01-11T11:30:00Z",
|
||||
"created_date": "2024-01-11",
|
||||
"modified": "2024-01-11T11:30:00Z",
|
||||
"added": "2024-01-11T11:30:00Z",
|
||||
"archive_serial_number": "ASN2024001843",
|
||||
"original_file_name": "medical_checkup_2024.pdf",
|
||||
"archived_file_name": "0001843.pdf"
|
||||
}
|
||||
]
|
||||
}
|
||||
30
dummy-data/peanut/api/v1/devices/ups
Normal file
30
dummy-data/peanut/api/v1/devices/ups
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
{
|
||||
"battery.charge": 100,
|
||||
"battery.voltage": 13,
|
||||
"battery.voltage.high": 13,
|
||||
"battery.voltage.low": 10,
|
||||
"battery.voltage.nominal": 12,
|
||||
"device.type": "ups",
|
||||
"driver.flag.noscanlangid": "enabled",
|
||||
"driver.flag.novendor": "enabled",
|
||||
"driver.name": "nutdrv_qx",
|
||||
"driver.parameter.langid_fix": 1000,
|
||||
"driver.parameter.pollfreq": 30,
|
||||
"driver.parameter.pollinterval": 2,
|
||||
"driver.parameter.vendorid": 1,
|
||||
"driver.version": "2.8.0",
|
||||
"input.frequency": 50,
|
||||
"input.frequency.nominal": "0",
|
||||
"input.voltage": 228,
|
||||
"input.voltage.fault": "0.0",
|
||||
"input.voltage.nominal": "0",
|
||||
"output.voltage": 228,
|
||||
"ups.beeper.status": "disabled",
|
||||
"ups.delay.shutdown": 60,
|
||||
"ups.delay.start": "0",
|
||||
"ups.load": 50,
|
||||
"ups.productid": "0000",
|
||||
"ups.status": "OL",
|
||||
"ups.temperature": 30,
|
||||
"ups.type": "offline / line interactive"
|
||||
}
|
||||
1
dummy-data/pialert/php/server/devices.php
Normal file
1
dummy-data/pialert/php/server/devices.php
Normal file
|
|
@ -0,0 +1 @@
|
|||
[89,82,0,15,0,0]
|
||||
38
dummy-data/pihole/api.php
Normal file
38
dummy-data/pihole/api.php
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
{
|
||||
"domains_being_blocked": 152588,
|
||||
"dns_queries_today": 0,
|
||||
"ads_blocked_today": 0,
|
||||
"percent_blocked": 42,
|
||||
"unique_domains": 0,
|
||||
"queries_forwarded": 0,
|
||||
"queries_cached": 0,
|
||||
"clients_ever_seen": 0,
|
||||
"unique_clients": 0,
|
||||
"dns_queries_all_types": 0,
|
||||
"reply_UNKNOWN": 0,
|
||||
"reply_NODATA": 0,
|
||||
"reply_NXDOMAIN": 0,
|
||||
"reply_CNAME": 0,
|
||||
"reply_IP": 0,
|
||||
"reply_DOMAIN": 0,
|
||||
"reply_RRNAME": 0,
|
||||
"reply_SERVFAIL": 0,
|
||||
"reply_REFUSED": 0,
|
||||
"reply_NOTIMP": 0,
|
||||
"reply_OTHER": 0,
|
||||
"reply_DNSSEC": 0,
|
||||
"reply_NONE": 0,
|
||||
"reply_BLOB": 0,
|
||||
"dns_queries_all_replies": 0,
|
||||
"privacy_level": 0,
|
||||
"status": "enabled",
|
||||
"gravity_last_updated": {
|
||||
"file_exists": true,
|
||||
"absolute": 1665486627,
|
||||
"relative": {
|
||||
"days": 0,
|
||||
"hours": 0,
|
||||
"minutes": 22
|
||||
}
|
||||
}
|
||||
}
|
||||
12
dummy-data/plex/library/sections
Normal file
12
dummy-data/plex/library/sections
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<MediaContainer size="3" allowSync="1" art="/:/resources/show-fanart.jpg" identifier="com.plexapp.plugins.library" librarySectionID="0" mediaTagPrefix="/system/bundle/media/flags/" mediaTagVersion="1705317600" thumb="/:/resources/show.png" title1="Plex Library" viewGroup="secondary" viewMode="458752">
|
||||
<Directory allowSync="1" art="/:/resources/movie-fanart.jpg" composite="/library/sections/1/composite/1705317600" filters="1" refreshing="0" thumb="/:/resources/movie.png" key="1" type="movie" title="Movies" agent="com.plexapp.agents.themoviedb" scanner="Plex Movie" language="en-US" uuid="abcd1234-5678-90ab-cdef-123456789012" updatedAt="1705317600" createdAt="1704067200" scannedAt="1705317000" content="1" directory="1" contentChangedAt="1705316400" hidden="0">
|
||||
<Location id="1" path="/media/movies" />
|
||||
</Directory>
|
||||
<Directory allowSync="1" art="/:/resources/show-fanart.jpg" composite="/library/sections/2/composite/1705317600" filters="1" refreshing="0" thumb="/:/resources/show.png" key="2" type="show" title="TV Shows" agent="com.plexapp.agents.thetvdb" scanner="Plex TV Series" language="en-US" uuid="efgh5678-90ab-cdef-1234-567890abcdef" updatedAt="1705317600" createdAt="1704067200" scannedAt="1705317000" content="1" directory="1" contentChangedAt="1705316400" hidden="0">
|
||||
<Location id="2" path="/media/tv" />
|
||||
</Directory>
|
||||
<Directory allowSync="1" art="/:/resources/artist-fanart.jpg" composite="/library/sections/3/composite/1705317600" filters="1" refreshing="0" thumb="/:/resources/artist.png" key="3" type="artist" title="Music" agent="com.plexapp.agents.lastfm" scanner="Plex Music" language="en-US" uuid="ijkl9012-3456-789a-bcde-f0123456789a" updatedAt="1705317600" createdAt="1704067200" scannedAt="1705317000" content="1" directory="1" contentChangedAt="1705316400" hidden="0">
|
||||
<Location id="3" path="/media/music" />
|
||||
</Directory>
|
||||
</MediaContainer>
|
||||
7
dummy-data/plex/library/sections1all
Normal file
7
dummy-data/plex/library/sections1all
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<MediaContainer size="247" allowSync="1" art="/:/resources/movie-fanart.jpg" identifier="com.plexapp.plugins.library" librarySectionID="1" librarySectionTitle="Movies" librarySectionUUID="abcd1234-5678-90ab-cdef-123456789012" mediaTagPrefix="/system/bundle/media/flags/" mediaTagVersion="1705317600" mixedParents="0" nocache="1" offset="0" thumb="/:/resources/movie.png" title1="Movies" title2="All Movies" totalSize="247" viewGroup="movie" viewMode="458752">
|
||||
<Video ratingKey="1001" key="/library/metadata/1001" guid="plex://movie/5d9c086fe98e47001e0d5001" type="movie" title="Inception" titleSort="Inception" contentRating="PG-13" summary="A thief who steals corporate secrets through dream-sharing technology." rating="8.8" audienceRating="9.1" year="2010" tagline="Your mind is the scene of the crime" thumb="/library/metadata/1001/thumb/1705317600" art="/library/metadata/1001/art/1705317600" duration="8880000" originallyAvailableAt="2010-07-16" addedAt="1705144800" updatedAt="1705317600">
|
||||
<Media id="2001" duration="8880000" bitrate="12000" width="1920" height="1080" aspectRatio="1.78" audioChannels="6" audioCodec="dts" videoCodec="h264" videoResolution="1080" container="mkv" videoFrameRate="24p" audioProfile="dts" videoProfile="high" />
|
||||
</Video>
|
||||
<!-- 246 more movies would be here, showing just one for brevity -->
|
||||
</MediaContainer>
|
||||
13
dummy-data/plex/library/sections2all
Normal file
13
dummy-data/plex/library/sections2all
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<MediaContainer size="89" allowSync="1" art="/:/resources/show-fanart.jpg" identifier="com.plexapp.plugins.library" librarySectionID="2" librarySectionTitle="TV Shows" librarySectionUUID="efgh5678-90ab-cdef-1234-567890abcdef" mediaTagPrefix="/system/bundle/media/flags/" mediaTagVersion="1705317600" mixedParents="0" nocache="1" offset="0" thumb="/:/resources/show.png" title1="TV Shows" title2="All Shows" totalSize="89" viewGroup="show" viewMode="458752">
|
||||
<Directory ratingKey="2001" key="/library/metadata/2001" guid="plex://show/5d9c081fe98e47001e0c2001" type="show" title="Breaking Bad" titleSort="Breaking Bad" contentRating="TV-MA" summary="A high school chemistry teacher diagnosed with inoperable lung cancer turns to manufacturing and selling methamphetamine in order to secure his family's future." rating="9.5" year="2008" thumb="/library/metadata/2001/thumb/1705317600" art="/library/metadata/2001/art/1705317600" banner="/library/metadata/2001/banner/1705317600" duration="2820000" originallyAvailableAt="2008-01-20" leafCount="62" viewedLeafCount="62" childCount="5" addedAt="1705144800" updatedAt="1705317600">
|
||||
<Genre tag="Crime" />
|
||||
<Genre tag="Drama" />
|
||||
<Genre tag="Thriller" />
|
||||
</Directory>
|
||||
<Directory ratingKey="2002" key="/library/metadata/2002" guid="plex://show/5d9c081fe98e47001e0c2002" type="show" title="Friends" titleSort="Friends" contentRating="TV-14" summary="Follows the personal and professional lives of six twenty to thirty-something-year-old friends living in Manhattan." rating="8.9" year="1994" thumb="/library/metadata/2002/thumb/1705317600" art="/library/metadata/2002/art/1705317600" banner="/library/metadata/2002/banner/1705317600" duration="1320000" originallyAvailableAt="1994-09-22" leafCount="236" viewedLeafCount="236" childCount="10" addedAt="1705144800" updatedAt="1705317600">
|
||||
<Genre tag="Comedy" />
|
||||
<Genre tag="Romance" />
|
||||
</Directory>
|
||||
<!-- 87 more shows would be here, showing just two for brevity -->
|
||||
</MediaContainer>
|
||||
19
dummy-data/plex/status/sessions
Normal file
19
dummy-data/plex/status/sessions
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<MediaContainer size="2" allowCameraUpload="1" allowChannelAccess="1" allowMediaDeletion="1" allowSharing="1" allowSync="1" backgroundProcessing="1" certificateVersion="2" companionProxy="1" countryCode="US" diagnostics="logs,databases,streaminglogs" eventStream="1" friendlyName="Homer-Plex-Server" hubSearch="1" itemClusters="1" livenessTimeout="0" machineIdentifier="abc123def456ghi789jkl012" mediaProviders="1" multiuser="1" myPlex="1" myPlexMappingState="mapped" myPlexSigninState="ok" myPlexSubscription="1" myPlexUsername="homer@example.com" offlineTranscode="1" ownerFeatures="adaptive_bitrate,collections,content_filter,dvr,hardware_transcoding,home,loudness_analysis,music_videos,pass,photo_autotags,premium_music_metadata,session_bandwidth_restrictions,sync,trailers,webhooks" photoAutoTag="1" platform="Linux" platformVersion="6.5.0-15-generic" pluginHost="1" pushNotifications="1" readOnlyLibraries="1" requestParametersInCookie="1" streamingBrainABRVersion="3" streamingBrainVersion="2" sync="1" transcoderActiveVideoSessions="0" transcoderAudio="1" transcoderLyrics="1" transcoderPhoto="1" transcoderSubtitles="1" transcoderVideo="1" transcoderVideoBitrates="64,96,208,320,720,1500,2000,3000,4000,8000,10000,12000,20000" transcoderVideoQualities="0,1,2,3,4,5,6,7,8,9,10,11,12" transcoderVideoResolutions="128,128,160,240,320,480,768,720,720,1080,1080,1080,1080" updatedAt="1705317600" updater="1" version="1.40.1.8227-c0dd5a73e" voiceSearch="1">
|
||||
<Video sessionKey="1" key="/library/metadata/12345" parentKey="/library/metadata/12300" grandparentKey="/library/metadata/12000" guid="plex://episode/5d9c086fe98e47001e0d5c3f" parentGuid="plex://season/602e67d31d3358002d2fb2bd" grandparentGuid="plex://show/5d9c081fe98e47001e0c8382" type="episode" title="The One Where Monica Gets a Roommate" titleSort="One Where Monica Gets a Roommate, The" grandparentTitle="Friends" parentTitle="Season 1" contentRating="TV-14" summary="Monica and the gang introduce Rachel to the real world after she leaves her fiancé at the altar." index="1" parentIndex="1" lastViewedAt="1705315800" year="1994" thumb="/library/metadata/12345/thumb/1705317600" art="/library/metadata/12000/art/1705317600" parentThumb="/library/metadata/12300/thumb/1705317600" grandparentThumb="/library/metadata/12000/thumb/1705317600" grandparentArt="/library/metadata/12000/art/1705317600" duration="1380000" originallyAvailableAt="1994-09-22" addedAt="1705230400" updatedAt="1705317600" chapterSource="media" primaryExtraKey="/library/metadata/12346" ratingKey="12345" viewOffset="420000" skipCount="1">
|
||||
<Media id="67890" duration="1380000" bitrate="8137" width="1920" height="1080" aspectRatio="1.78" audioChannels="2" audioCodec="aac" videoCodec="h264" videoResolution="1080" container="mkv" videoFrameRate="24p" audioProfile="lc" videoProfile="high">
|
||||
<Part accessible="1" exists="1" id="98765" key="/library/parts/98765/1705317600/file.mkv" duration="1380000" file="/media/tv/Friends/Season 01/Friends - S01E01 - The One Where Monica Gets a Roommate.mkv" size="1398101419" audioProfile="lc" container="mkv" indexes="sd" videoProfile="high" />
|
||||
</Media>
|
||||
<User id="1" thumb="https://plex.tv/users/abc123def456/avatar?c=1705317600" title="John Doe" />
|
||||
<Player address="192.168.1.100" device="Chrome" machineIdentifier="browser-chrome-192-168-1-100" model="hosted" platform="Chrome" platformVersion="120" product="Plex Web" profile="Web" remotePublicAddress="203.0.113.1" state="playing" title="Chrome (John's Desktop)" userID="1" vendor="Google" version="4.126.1" />
|
||||
<Session id="session123abc" bandwidth="8000" location="lan" />
|
||||
</Video>
|
||||
<Video sessionKey="2" key="/library/metadata/54321" guid="plex://movie/5d9c086fe98e47001e0d5c4a" type="movie" title="The Matrix" titleSort="Matrix, The" contentRating="R" summary="A computer hacker learns from mysterious rebels about the true nature of his reality and his role in the war against its controllers." rating="8.7" year="1999" tagline="The fight for the future begins" thumb="/library/metadata/54321/thumb/1705317600" art="/library/metadata/54321/art/1705317600" duration="8160000" originallyAvailableAt="1999-03-31" addedAt="1705144800" updatedAt="1705317600" chapterSource="media" ratingKey="54321" viewOffset="2100000">
|
||||
<Media id="11223" duration="8160000" bitrate="15463" width="1920" height="816" aspectRatio="2.35" audioChannels="6" audioCodec="dts" videoCodec="h264" videoResolution="1080" container="mkv" videoFrameRate="24p" audioProfile="dts" videoProfile="high">
|
||||
<Part accessible="1" exists="1" id="33445" key="/library/parts/33445/1705317600/file.mkv" duration="8160000" file="/media/movies/The Matrix (1999)/The Matrix (1999).mkv" size="15758698701" audioProfile="dts" container="mkv" indexes="sd" videoProfile="high" />
|
||||
</Media>
|
||||
<User id="2" thumb="https://plex.tv/users/def456ghi789/avatar?c=1705317600" title="Jane Smith" />
|
||||
<Player address="192.168.1.101" device="Android" machineIdentifier="android-phone-samsung" model="SM-G991B" platform="Android" platformVersion="14" product="Plex for Android" profile="Mobile" remotePublicAddress="203.0.113.2" state="paused" title="Samsung Galaxy S21" userID="2" vendor="Samsung" version="9.8.1" />
|
||||
<Session id="session456def" bandwidth="4000" location="lan" />
|
||||
</Video>
|
||||
</MediaContainer>
|
||||
94
dummy-data/portainer/api/endpoints
Normal file
94
dummy-data/portainer/api/endpoints
Normal file
|
|
@ -0,0 +1,94 @@
|
|||
[
|
||||
{
|
||||
"Id": 1,
|
||||
"Name": "local",
|
||||
"Type": 1,
|
||||
"URL": "unix:///var/run/docker.sock",
|
||||
"GroupId": 1,
|
||||
"PublicURL": "",
|
||||
"Status": 1,
|
||||
"UserAccessPolicies": {},
|
||||
"TeamAccessPolicies": {},
|
||||
"Extensions": [],
|
||||
"TagIds": [],
|
||||
"AssociatedEndpoints": [],
|
||||
"Snapshots": [
|
||||
{
|
||||
"Time": 1705317600,
|
||||
"DockerVersion": "24.0.7",
|
||||
"Swarm": false,
|
||||
"TotalCPU": 8,
|
||||
"TotalMemory": 16777216000,
|
||||
"RunningContainerCount": 12,
|
||||
"StoppedContainerCount": 5,
|
||||
"HealthyContainerCount": 10,
|
||||
"UnhealthyContainerCount": 0,
|
||||
"VolumeCount": 25,
|
||||
"ImageCount": 47,
|
||||
"ServiceCount": 0,
|
||||
"StackCount": 0,
|
||||
"DockerRootDir": "/var/lib/docker"
|
||||
}
|
||||
],
|
||||
"Kubernetes": {
|
||||
"Snapshots": []
|
||||
},
|
||||
"Agent": {
|
||||
"NodeName": "",
|
||||
"ChecklnInterval": 5,
|
||||
"Version": ""
|
||||
},
|
||||
"Edge": {
|
||||
"AsyncMode": false,
|
||||
"PingInterval": 60,
|
||||
"CommandInterval": 5,
|
||||
"SnapshotInterval": 5
|
||||
}
|
||||
},
|
||||
{
|
||||
"Id": 2,
|
||||
"Name": "production",
|
||||
"Type": 2,
|
||||
"URL": "tcp://prod-docker:2376",
|
||||
"GroupId": 1,
|
||||
"PublicURL": "https://prod-docker.example.com",
|
||||
"Status": 1,
|
||||
"UserAccessPolicies": {},
|
||||
"TeamAccessPolicies": {},
|
||||
"Extensions": [],
|
||||
"TagIds": [],
|
||||
"AssociatedEndpoints": [],
|
||||
"Snapshots": [
|
||||
{
|
||||
"Time": 1705317600,
|
||||
"DockerVersion": "24.0.7",
|
||||
"Swarm": false,
|
||||
"TotalCPU": 16,
|
||||
"TotalMemory": 33554432000,
|
||||
"RunningContainerCount": 25,
|
||||
"StoppedContainerCount": 3,
|
||||
"HealthyContainerCount": 23,
|
||||
"UnhealthyContainerCount": 2,
|
||||
"VolumeCount": 40,
|
||||
"ImageCount": 75,
|
||||
"ServiceCount": 0,
|
||||
"StackCount": 0,
|
||||
"DockerRootDir": "/var/lib/docker"
|
||||
}
|
||||
],
|
||||
"Kubernetes": {
|
||||
"Snapshots": []
|
||||
},
|
||||
"Agent": {
|
||||
"NodeName": "",
|
||||
"ChecklnInterval": 5,
|
||||
"Version": ""
|
||||
},
|
||||
"Edge": {
|
||||
"AsyncMode": false,
|
||||
"PingInterval": 60,
|
||||
"CommandInterval": 5,
|
||||
"SnapshotInterval": 5
|
||||
}
|
||||
}
|
||||
]
|
||||
94
dummy-data/portainer/api/endpoints.backup
Normal file
94
dummy-data/portainer/api/endpoints.backup
Normal file
|
|
@ -0,0 +1,94 @@
|
|||
[
|
||||
{
|
||||
"Id": 1,
|
||||
"Name": "local",
|
||||
"Type": 1,
|
||||
"URL": "unix:///var/run/docker.sock",
|
||||
"GroupId": 1,
|
||||
"PublicURL": "",
|
||||
"Status": 1,
|
||||
"UserAccessPolicies": {},
|
||||
"TeamAccessPolicies": {},
|
||||
"Extensions": [],
|
||||
"TagIds": [],
|
||||
"AssociatedEndpoints": [],
|
||||
"Snapshots": [
|
||||
{
|
||||
"Time": 1705317600,
|
||||
"DockerVersion": "24.0.7",
|
||||
"Swarm": false,
|
||||
"TotalCPU": 8,
|
||||
"TotalMemory": 16777216000,
|
||||
"RunningContainerCount": 12,
|
||||
"StoppedContainerCount": 5,
|
||||
"HealthyContainerCount": 10,
|
||||
"UnhealthyContainerCount": 0,
|
||||
"VolumeCount": 25,
|
||||
"ImageCount": 47,
|
||||
"ServiceCount": 0,
|
||||
"StackCount": 0,
|
||||
"DockerRootDir": "/var/lib/docker"
|
||||
}
|
||||
],
|
||||
"Kubernetes": {
|
||||
"Snapshots": []
|
||||
},
|
||||
"Agent": {
|
||||
"NodeName": "",
|
||||
"ChecklnInterval": 5,
|
||||
"Version": ""
|
||||
},
|
||||
"Edge": {
|
||||
"AsyncMode": false,
|
||||
"PingInterval": 60,
|
||||
"CommandInterval": 5,
|
||||
"SnapshotInterval": 5
|
||||
}
|
||||
},
|
||||
{
|
||||
"Id": 2,
|
||||
"Name": "production",
|
||||
"Type": 2,
|
||||
"URL": "tcp://prod-docker:2376",
|
||||
"GroupId": 1,
|
||||
"PublicURL": "https://prod-docker.example.com",
|
||||
"Status": 1,
|
||||
"UserAccessPolicies": {},
|
||||
"TeamAccessPolicies": {},
|
||||
"Extensions": [],
|
||||
"TagIds": [],
|
||||
"AssociatedEndpoints": [],
|
||||
"Snapshots": [
|
||||
{
|
||||
"Time": 1705317600,
|
||||
"DockerVersion": "24.0.7",
|
||||
"Swarm": false,
|
||||
"TotalCPU": 16,
|
||||
"TotalMemory": 33554432000,
|
||||
"RunningContainerCount": 25,
|
||||
"StoppedContainerCount": 3,
|
||||
"HealthyContainerCount": 23,
|
||||
"UnhealthyContainerCount": 2,
|
||||
"VolumeCount": 40,
|
||||
"ImageCount": 75,
|
||||
"ServiceCount": 0,
|
||||
"StackCount": 0,
|
||||
"DockerRootDir": "/var/lib/docker"
|
||||
}
|
||||
],
|
||||
"Kubernetes": {
|
||||
"Snapshots": []
|
||||
},
|
||||
"Agent": {
|
||||
"NodeName": "",
|
||||
"ChecklnInterval": 5,
|
||||
"Version": ""
|
||||
},
|
||||
"Edge": {
|
||||
"AsyncMode": false,
|
||||
"PingInterval": 60,
|
||||
"CommandInterval": 5,
|
||||
"SnapshotInterval": 5
|
||||
}
|
||||
}
|
||||
]
|
||||
38
dummy-data/portainer/api/status
Normal file
38
dummy-data/portainer/api/status
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
{
|
||||
"Version": "2.19.4",
|
||||
"APIVersion": "2.19.4",
|
||||
"DatabaseVersion": "34",
|
||||
"Build": {
|
||||
"BuildNumber": "1234567890",
|
||||
"ImageTag": "2.19.4-alpine",
|
||||
"NodejsVersion": "v18.17.1",
|
||||
"YarnVersion": "1.22.19",
|
||||
"WebpackVersion": "5.88.2",
|
||||
"GoVersion": "go1.21.5"
|
||||
},
|
||||
"InstanceID": "portainer-instance-abc123def456",
|
||||
"Edition": "CE",
|
||||
"DemoEnvironment": {
|
||||
"Enabled": false,
|
||||
"URL": ""
|
||||
},
|
||||
"AnalyticsEnabled": false,
|
||||
"AuthenticationMethod": 1,
|
||||
"Users": 3,
|
||||
"ValidLicense": false,
|
||||
"LicenseInfo": {
|
||||
"Company": "",
|
||||
"CreatedAt": 0,
|
||||
"ExpiresAt": 0,
|
||||
"LicenseKey": "",
|
||||
"ProductEdition": "",
|
||||
"Seats": 0,
|
||||
"Valid": false
|
||||
},
|
||||
"RequiredPasswordLength": 12,
|
||||
"UserSessionTimeout": "8h",
|
||||
"Features": {
|
||||
"EdgeDeviceUntrustedMode": false
|
||||
},
|
||||
"EdgeAgentCheckinIntervalSeconds": 5
|
||||
}
|
||||
99
dummy-data/prometheus/api/v1/alerts
Normal file
99
dummy-data/prometheus/api/v1/alerts
Normal file
|
|
@ -0,0 +1,99 @@
|
|||
{
|
||||
"status": "success",
|
||||
"data": {
|
||||
"alerts": [
|
||||
{
|
||||
"labels": {
|
||||
"alertname": "HighCPUUsage",
|
||||
"instance": "localhost:9090",
|
||||
"job": "prometheus",
|
||||
"severity": "warning"
|
||||
},
|
||||
"annotations": {
|
||||
"description": "CPU usage is above 80% for more than 5 minutes",
|
||||
"summary": "High CPU usage detected"
|
||||
},
|
||||
"state": "firing",
|
||||
"activeAt": "2024-01-15T10:30:00.000Z",
|
||||
"value": "85.2"
|
||||
},
|
||||
{
|
||||
"labels": {
|
||||
"alertname": "HighMemoryUsage",
|
||||
"instance": "web-server-01:9090",
|
||||
"job": "node-exporter",
|
||||
"severity": "critical"
|
||||
},
|
||||
"annotations": {
|
||||
"description": "Memory usage is above 90% for more than 10 minutes",
|
||||
"summary": "Critical memory usage detected"
|
||||
},
|
||||
"state": "firing",
|
||||
"activeAt": "2024-01-15T10:25:00.000Z",
|
||||
"value": "92.8"
|
||||
},
|
||||
{
|
||||
"labels": {
|
||||
"alertname": "DiskSpaceLow",
|
||||
"instance": "db-server-01:9090",
|
||||
"job": "node-exporter",
|
||||
"severity": "warning",
|
||||
"device": "/dev/sda1"
|
||||
},
|
||||
"annotations": {
|
||||
"description": "Disk space is below 20% on {{ $labels.device }}",
|
||||
"summary": "Low disk space warning"
|
||||
},
|
||||
"state": "pending",
|
||||
"activeAt": "2024-01-15T11:00:00.000Z",
|
||||
"value": "18.5"
|
||||
},
|
||||
{
|
||||
"labels": {
|
||||
"alertname": "ServiceDown",
|
||||
"instance": "api-server-02:8080",
|
||||
"job": "api-health-check",
|
||||
"severity": "critical",
|
||||
"service": "user-api"
|
||||
},
|
||||
"annotations": {
|
||||
"description": "Service {{ $labels.service }} is not responding",
|
||||
"summary": "Service is down"
|
||||
},
|
||||
"state": "pending",
|
||||
"activeAt": "2024-01-15T11:10:00.000Z",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"labels": {
|
||||
"alertname": "DatabaseConnections",
|
||||
"instance": "db-server-01:5432",
|
||||
"job": "postgres-exporter",
|
||||
"severity": "info"
|
||||
},
|
||||
"annotations": {
|
||||
"description": "Database connection count is normal",
|
||||
"summary": "Database connections stable"
|
||||
},
|
||||
"state": "inactive",
|
||||
"activeAt": "2024-01-15T09:00:00.000Z",
|
||||
"value": "45"
|
||||
},
|
||||
{
|
||||
"labels": {
|
||||
"alertname": "HTTPResponseTime",
|
||||
"instance": "web-server-02:80",
|
||||
"job": "blackbox-exporter",
|
||||
"severity": "info"
|
||||
},
|
||||
"annotations": {
|
||||
"description": "HTTP response time is within acceptable limits",
|
||||
"summary": "Response time normal"
|
||||
},
|
||||
"state": "inactive",
|
||||
"activeAt": "2024-01-15T08:30:00.000Z",
|
||||
"value": "150"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
41
dummy-data/prowlarr/api/v1/health
Normal file
41
dummy-data/prowlarr/api/v1/health
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
[
|
||||
{
|
||||
"source": "IndexerStatusCheck",
|
||||
"type": "warning",
|
||||
"message": "Indexer 1337x has been disabled due to recent failures: Connection timeout after 30 seconds",
|
||||
"wikiUrl": "https://wiki.servarr.com/prowlarr/health#indexers-are-unavailable-due-to-recent-failures"
|
||||
},
|
||||
{
|
||||
"source": "IndexerRSSCheck",
|
||||
"type": "ok",
|
||||
"message": "All indexer RSS feeds are functioning normally"
|
||||
},
|
||||
{
|
||||
"source": "ApplicationStatusCheck",
|
||||
"type": "warning",
|
||||
"message": "Application Sonarr sync failed: Unable to connect to Sonarr at http://sonarr:8989",
|
||||
"wikiUrl": "https://wiki.servarr.com/prowlarr/health#applications-are-unavailable-due-to-recent-failures"
|
||||
},
|
||||
{
|
||||
"source": "UpdateCheck",
|
||||
"type": "ok",
|
||||
"message": "Update available: 1.11.4.4173 -> 1.12.2.4211"
|
||||
},
|
||||
{
|
||||
"source": "IndexerSearchCheck",
|
||||
"type": "error",
|
||||
"message": "Indexer TorrentLeech returned invalid search results: Malformed JSON response",
|
||||
"wikiUrl": "https://wiki.servarr.com/prowlarr/health#indexer-search-failures"
|
||||
},
|
||||
{
|
||||
"source": "ProxyCheck",
|
||||
"type": "ok",
|
||||
"message": "No proxy configuration issues detected"
|
||||
},
|
||||
{
|
||||
"source": "IndexerLongTermStatusCheck",
|
||||
"type": "warning",
|
||||
"message": "Indexer RARBG has been failing for more than 6 hours: HTTP 403 Forbidden",
|
||||
"wikiUrl": "https://wiki.servarr.com/prowlarr/health#indexers-are-unavailable-due-to-recent-failures"
|
||||
}
|
||||
]
|
||||
35
dummy-data/proxmox/api2/json/nodes/node1/lxc
Normal file
35
dummy-data/proxmox/api2/json/nodes/node1/lxc
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
{
|
||||
"data": [{
|
||||
"disk": 0,
|
||||
"mem": 983848043,
|
||||
"cpus": 2,
|
||||
"pid": 1218,
|
||||
"maxdisk": 107374182400,
|
||||
"netin": 43863882954,
|
||||
"diskread": 0,
|
||||
"diskwrite": 0,
|
||||
"name": "HAOS",
|
||||
"netout": 10426448652,
|
||||
"cpu": 0.00879886290177172,
|
||||
"uptime": 3390069,
|
||||
"status": "running",
|
||||
"maxmem": 3221225472,
|
||||
"vmid": 100
|
||||
}, {
|
||||
"cpu": 0.00219971572544293,
|
||||
"name": "debian1",
|
||||
"netout": 919020028,
|
||||
"vmid": 101,
|
||||
"maxmem": 4294967296,
|
||||
"uptime": 3390064,
|
||||
"status": "running",
|
||||
"maxdisk": 107374182400,
|
||||
"pid": 1295,
|
||||
"cpus": 2,
|
||||
"disk": 0,
|
||||
"mem": 2755160795,
|
||||
"diskread": 0,
|
||||
"diskwrite": 0,
|
||||
"netin": 5105600872
|
||||
}]
|
||||
}
|
||||
35
dummy-data/proxmox/api2/json/nodes/node1/qemu
Normal file
35
dummy-data/proxmox/api2/json/nodes/node1/qemu
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
{
|
||||
"data": [{
|
||||
"disk": 0,
|
||||
"mem": 983848043,
|
||||
"cpus": 2,
|
||||
"pid": 1218,
|
||||
"maxdisk": 107374182400,
|
||||
"netin": 43863882954,
|
||||
"diskread": 0,
|
||||
"diskwrite": 0,
|
||||
"name": "HAOS",
|
||||
"netout": 10426448652,
|
||||
"cpu": 0.00879886290177172,
|
||||
"uptime": 3390069,
|
||||
"status": "running",
|
||||
"maxmem": 3221225472,
|
||||
"vmid": 100
|
||||
}, {
|
||||
"cpu": 0.00219971572544293,
|
||||
"name": "debian1",
|
||||
"netout": 919020028,
|
||||
"vmid": 101,
|
||||
"maxmem": 4294967296,
|
||||
"uptime": 3390064,
|
||||
"status": "running",
|
||||
"maxdisk": 107374182400,
|
||||
"pid": 1295,
|
||||
"cpus": 2,
|
||||
"disk": 0,
|
||||
"mem": 2755160795,
|
||||
"diskread": 0,
|
||||
"diskwrite": 0,
|
||||
"netin": 5105600872
|
||||
}]
|
||||
}
|
||||
44
dummy-data/proxmox/api2/json/nodes/node1/status
Normal file
44
dummy-data/proxmox/api2/json/nodes/node1/status
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
{
|
||||
"data": {
|
||||
"swap": {
|
||||
"free": 8589930496,
|
||||
"total": 8589930496,
|
||||
"used": 0
|
||||
},
|
||||
"cpuinfo": {
|
||||
"model": "Intel(R) Core(TM) i7-4790 CPU @3.60GHz",
|
||||
"hvm": "1",
|
||||
"user_hz": 100,
|
||||
"sockets": 1,
|
||||
"cpus": 8,
|
||||
"flags": "fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand lahf_lm abm cpuid_fault epb invpcid_single pti tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm xsaveopt dtherm ida arat pln pts",
|
||||
"cores": 4,
|
||||
"mhz": "4000.000"
|
||||
},
|
||||
"idle": 0,
|
||||
"memory": {
|
||||
"used": 6283382784,
|
||||
"total": 12419133440,
|
||||
"free": 6135750656
|
||||
},
|
||||
"rootfs": {
|
||||
"avail": 22670036992,
|
||||
"free": 24176627712,
|
||||
"total": 29148368896,
|
||||
"used": 4971741184
|
||||
},
|
||||
"uptime": 3390081,
|
||||
"ksm": {
|
||||
"shared": 1079975936
|
||||
},
|
||||
"cpu": 0.00440286186020914,
|
||||
"kversion": "Linux 5.15.30-2-pve #1 SMP PVE 5.15.30-3 (Fri, 22 Apr 2022 18: 08: 27+0200)",
|
||||
"loadavg": [
|
||||
"0.00",
|
||||
"0.01",
|
||||
"0.04"
|
||||
],
|
||||
"pveversion": "pve-manager/7.2-3/c743d6c1",
|
||||
"wait": 0.00330214639515685
|
||||
}
|
||||
}
|
||||
53
dummy-data/qBittorrent/api/v2/torrents/info
Normal file
53
dummy-data/qBittorrent/api/v2/torrents/info
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
[
|
||||
{
|
||||
"added_on": 1666985518,
|
||||
"amount_left": 0,
|
||||
"auto_tmm": false,
|
||||
"availability": -1,
|
||||
"category": "",
|
||||
"completed": 1474873344,
|
||||
"completion_on": 1666985584,
|
||||
"content_path": "/downloads/ubuntu-22.04.1-live-server-amd64.iso",
|
||||
"dl_limit": -1,
|
||||
"dlspeed": 0,
|
||||
"download_path": "",
|
||||
"downloaded": 1513976240,
|
||||
"downloaded_session": 0,
|
||||
"eta": 8640000,
|
||||
"f_l_piece_prio": false,
|
||||
"force_start": false,
|
||||
"hash": "cf3ea75e2ebbd30e0da6e6e215e2226bf35f2e33",
|
||||
"infohash_v1": "cf3ea75e2ebbd30e0da6e6e215e2226bf35f2e33",
|
||||
"infohash_v2": "",
|
||||
"last_activity": 1666985588,
|
||||
"magnet_uri": "magnet:?xt=urn:btih:cf3ea75e2ebbd30e0da6e6e215e2226bf35f2e33&dn=ubuntu-22.04.1-live-server-amd64.iso&tr=https%3a%2f%2ftorrent.ubuntu.com%2fannounce&tr=https%3a%2f%2fipv6.torrent.ubuntu.com%2fannounce",
|
||||
"max_ratio": 0,
|
||||
"max_seeding_time": -1,
|
||||
"name": "ubuntu-22.04.1-live-server-amd64.iso",
|
||||
"num_complete": 0,
|
||||
"num_incomplete": 583,
|
||||
"num_leechs": 0,
|
||||
"num_seeds": 0,
|
||||
"priority": 0,
|
||||
"progress": 1,
|
||||
"ratio": 1.7163413343924075e-05,
|
||||
"ratio_limit": -2,
|
||||
"save_path": "/downloads/",
|
||||
"seeding_time": 4,
|
||||
"seeding_time_limit": -2,
|
||||
"seen_complete": 1666985584,
|
||||
"seq_dl": false,
|
||||
"size": 1474873344,
|
||||
"state": "pausedUP",
|
||||
"super_seeding": false,
|
||||
"tags": "",
|
||||
"time_active": 69,
|
||||
"total_size": 1474873344,
|
||||
"tracker": "",
|
||||
"trackers_count": 2,
|
||||
"up_limit": -1,
|
||||
"uploaded": 25985,
|
||||
"uploaded_session": 0,
|
||||
"upspeed": 0
|
||||
}
|
||||
]
|
||||
10
dummy-data/qBittorrent/api/v2/transfer/info
Normal file
10
dummy-data/qBittorrent/api/v2/transfer/info
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"connection_status": "connected",
|
||||
"dht_nodes": 318,
|
||||
"dl_info_data": 23481469329,
|
||||
"dl_info_speed": 1234567,
|
||||
"dl_rate_limit": 40960000,
|
||||
"up_info_data": 1788370216,
|
||||
"up_info_speed": 765432,
|
||||
"up_rate_limit": 10547200
|
||||
}
|
||||
35
dummy-data/radarr/api/v3/health
Normal file
35
dummy-data/radarr/api/v3/health
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
[
|
||||
{
|
||||
"source": "IndexerStatusCheck",
|
||||
"type": "warning",
|
||||
"message": "Indexer TorrentDay is unavailable due to recent indexer errors: HTTP 503 Service Unavailable",
|
||||
"wikiUrl": "https://wiki.servarr.com/radarr/health#indexers-are-unavailable-due-to-recent-failures"
|
||||
},
|
||||
{
|
||||
"source": "ImportMechanismCheck",
|
||||
"type": "ok",
|
||||
"message": "No issues with import mechanism checks"
|
||||
},
|
||||
{
|
||||
"source": "DownloadClientStatusCheck",
|
||||
"type": "ok",
|
||||
"message": "All download clients are available"
|
||||
},
|
||||
{
|
||||
"source": "RootFolderCheck",
|
||||
"type": "warning",
|
||||
"message": "Missing root folder: /movies",
|
||||
"wikiUrl": "https://wiki.servarr.com/radarr/health#missing-root-folder"
|
||||
},
|
||||
{
|
||||
"source": "UpdateCheck",
|
||||
"type": "ok",
|
||||
"message": "Update available: 4.7.5.7809 -> 5.0.3.8127"
|
||||
},
|
||||
{
|
||||
"source": "DiskSpaceCheck",
|
||||
"type": "error",
|
||||
"message": "Disk space is critically low on /movies: 2.1 GB remaining",
|
||||
"wikiUrl": "https://wiki.servarr.com/radarr/health#disk-space"
|
||||
}
|
||||
]
|
||||
8
dummy-data/radarr/api/v3/queue
Normal file
8
dummy-data/radarr/api/v3/queue
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"page": 1,
|
||||
"pageSize": 20,
|
||||
"sortKey": "progress",
|
||||
"sortDirection": "descending",
|
||||
"totalRecords": 2,
|
||||
"records": []
|
||||
}
|
||||
16
dummy-data/radarr/api/v3/queuedetails
Normal file
16
dummy-data/radarr/api/v3/queuedetails
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
[
|
||||
{
|
||||
"movieId": 1,
|
||||
"title": "Inception (2010)",
|
||||
"trackedDownloadStatus": "ok",
|
||||
"trackedDownloadState": "importPending",
|
||||
"id": 1
|
||||
},
|
||||
{
|
||||
"movieId": 2,
|
||||
"title": "The Matrix (1999)",
|
||||
"trackedDownloadStatus": "warning",
|
||||
"trackedDownloadState": "downloading",
|
||||
"id": 2
|
||||
}
|
||||
]
|
||||
161
dummy-data/radarr/api/v3/wanted/missing
Normal file
161
dummy-data/radarr/api/v3/wanted/missing
Normal file
|
|
@ -0,0 +1,161 @@
|
|||
{
|
||||
"page": 1,
|
||||
"pageSize": 20,
|
||||
"sortKey": "digitalRelease",
|
||||
"sortDirection": "descending",
|
||||
"totalRecords": 5,
|
||||
"records": [
|
||||
{
|
||||
"title": "Dune: Part Two",
|
||||
"originalTitle": "Dune: Part Two",
|
||||
"originalLanguage": {
|
||||
"id": 1,
|
||||
"name": "English"
|
||||
},
|
||||
"alternateTitles": [],
|
||||
"secondaryYear": null,
|
||||
"secondaryYearSourceId": 0,
|
||||
"sortTitle": "dune part two",
|
||||
"sizeOnDisk": 0,
|
||||
"status": "released",
|
||||
"overview": "Follow the mythic journey of Paul Atreides as he unites with Chani and the Fremen while on a path of revenge against the conspirators who destroyed his family.",
|
||||
"inCinemas": "2024-02-29T00:00:00Z",
|
||||
"physicalRelease": "2024-05-14T00:00:00Z",
|
||||
"digitalRelease": "2024-04-16T00:00:00Z",
|
||||
"images": [],
|
||||
"website": "",
|
||||
"remotePoster": "",
|
||||
"year": 2024,
|
||||
"hasFile": false,
|
||||
"youTubeTrailerId": "",
|
||||
"studio": "Warner Bros. Pictures",
|
||||
"path": "/movies/Dune Part Two (2024)",
|
||||
"qualityProfileId": 1,
|
||||
"monitored": true,
|
||||
"minimumAvailability": "announced",
|
||||
"isAvailable": true,
|
||||
"folderName": "Dune Part Two (2024)",
|
||||
"runtime": 166,
|
||||
"cleanTitle": "duneparttwo",
|
||||
"imdbId": "tt15239678",
|
||||
"tmdbId": 693134,
|
||||
"titleSlug": "dune-part-two-2024",
|
||||
"certification": "PG-13",
|
||||
"genres": ["Adventure", "Drama", "Science Fiction"],
|
||||
"tags": [],
|
||||
"added": "2024-01-10T00:00:00Z",
|
||||
"ratings": {
|
||||
"votes": 234567,
|
||||
"value": 8.9
|
||||
},
|
||||
"movieFile": null,
|
||||
"collection": {
|
||||
"name": "Dune Collection",
|
||||
"tmdbId": 726871,
|
||||
"images": []
|
||||
},
|
||||
"popularity": 89.245,
|
||||
"id": 3
|
||||
},
|
||||
{
|
||||
"title": "Oppenheimer",
|
||||
"originalTitle": "Oppenheimer",
|
||||
"originalLanguage": {
|
||||
"id": 1,
|
||||
"name": "English"
|
||||
},
|
||||
"alternateTitles": [],
|
||||
"secondaryYear": null,
|
||||
"secondaryYearSourceId": 0,
|
||||
"sortTitle": "oppenheimer",
|
||||
"sizeOnDisk": 0,
|
||||
"status": "released",
|
||||
"overview": "The story of J. Robert Oppenheimer's role in the development of the atomic bomb during World War II.",
|
||||
"inCinemas": "2023-07-21T00:00:00Z",
|
||||
"physicalRelease": "2023-11-21T00:00:00Z",
|
||||
"digitalRelease": "2023-10-31T00:00:00Z",
|
||||
"images": [],
|
||||
"website": "",
|
||||
"remotePoster": "",
|
||||
"year": 2023,
|
||||
"hasFile": false,
|
||||
"youTubeTrailerId": "",
|
||||
"studio": "Universal Pictures",
|
||||
"path": "/movies/Oppenheimer (2023)",
|
||||
"qualityProfileId": 1,
|
||||
"monitored": true,
|
||||
"minimumAvailability": "announced",
|
||||
"isAvailable": true,
|
||||
"folderName": "Oppenheimer (2023)",
|
||||
"runtime": 180,
|
||||
"cleanTitle": "oppenheimer",
|
||||
"imdbId": "tt15398776",
|
||||
"tmdbId": 872585,
|
||||
"titleSlug": "oppenheimer-2023",
|
||||
"certification": "R",
|
||||
"genres": ["Drama", "History"],
|
||||
"tags": [],
|
||||
"added": "2024-01-05T00:00:00Z",
|
||||
"ratings": {
|
||||
"votes": 456789,
|
||||
"value": 8.4
|
||||
},
|
||||
"movieFile": null,
|
||||
"collection": null,
|
||||
"popularity": 92.567,
|
||||
"id": 4
|
||||
},
|
||||
{
|
||||
"title": "Spider-Man: Across the Spider-Verse",
|
||||
"originalTitle": "Spider-Man: Across the Spider-Verse",
|
||||
"originalLanguage": {
|
||||
"id": 1,
|
||||
"name": "English"
|
||||
},
|
||||
"alternateTitles": [],
|
||||
"secondaryYear": null,
|
||||
"secondaryYearSourceId": 0,
|
||||
"sortTitle": "spider man across spider verse",
|
||||
"sizeOnDisk": 0,
|
||||
"status": "released",
|
||||
"overview": "After reuniting with Gwen Stacy, Brooklyn's full-time, friendly neighborhood Spider-Man is catapulted across the Multiverse, where he encounters the Spider-Society.",
|
||||
"inCinemas": "2023-06-02T00:00:00Z",
|
||||
"physicalRelease": "2023-09-05T00:00:00Z",
|
||||
"digitalRelease": "2023-08-08T00:00:00Z",
|
||||
"images": [],
|
||||
"website": "",
|
||||
"remotePoster": "",
|
||||
"year": 2023,
|
||||
"hasFile": false,
|
||||
"youTubeTrailerId": "",
|
||||
"studio": "Sony Pictures Animation",
|
||||
"path": "/movies/Spider-Man Across the Spider-Verse (2023)",
|
||||
"qualityProfileId": 2,
|
||||
"monitored": true,
|
||||
"minimumAvailability": "announced",
|
||||
"isAvailable": true,
|
||||
"folderName": "Spider-Man Across the Spider-Verse (2023)",
|
||||
"runtime": 140,
|
||||
"cleanTitle": "spidermanacrossthespiderverse",
|
||||
"imdbId": "tt9362722",
|
||||
"tmdbId": 569094,
|
||||
"titleSlug": "spider-man-across-the-spider-verse-2023",
|
||||
"certification": "PG",
|
||||
"genres": ["Animation", "Action", "Adventure"],
|
||||
"tags": [],
|
||||
"added": "2024-01-03T00:00:00Z",
|
||||
"ratings": {
|
||||
"votes": 345678,
|
||||
"value": 8.7
|
||||
},
|
||||
"movieFile": null,
|
||||
"collection": {
|
||||
"name": "Spider-Verse Collection",
|
||||
"tmdbId": 573436,
|
||||
"images": []
|
||||
},
|
||||
"popularity": 85.432,
|
||||
"id": 5
|
||||
}
|
||||
]
|
||||
}
|
||||
10
dummy-data/rtorrent/download_list
Normal file
10
dummy-data/rtorrent/download_list
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<methodResponse>
|
||||
<params>
|
||||
<param><value><array><data>
|
||||
<value><string>2BAC78C9E10D82415142E57D24601F2FD8927816</string></value>
|
||||
<value><string>8BB10DB9EA239106D4907601C342ABBA29BE4391</string></value>
|
||||
<value><string>2790CE71493BE7083929D5A1CE9CFD6B8394F224</string></value>
|
||||
</data></array></value></param>
|
||||
</params>
|
||||
</methodResponse>
|
||||
6
dummy-data/rtorrent/global_down
Normal file
6
dummy-data/rtorrent/global_down
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<methodResponse>
|
||||
<params>
|
||||
<param><value><i8>149279</i8></value></param>
|
||||
</params>
|
||||
</methodResponse>
|
||||
6
dummy-data/rtorrent/global_up
Normal file
6
dummy-data/rtorrent/global_up
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<methodResponse>
|
||||
<params>
|
||||
<param><value><i8>45616</i8></value></param>
|
||||
</params>
|
||||
</methodResponse>
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue