Compare commits
1498 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1f92f0593f | ||
|
|
783a12b444 | ||
|
|
a48a06e680 | ||
|
|
9a2c56a5dc | ||
|
|
83a8546521 | ||
|
|
e881ec6cb5 | ||
|
|
ce336311b1 | ||
|
|
da138c5b54 | ||
|
|
69f5cd47ad | ||
|
|
638885466e | ||
|
|
523fe30452 | ||
|
|
cd78714da9 | ||
|
|
2982c146a4 | ||
|
|
989cc7de58 | ||
|
|
677224f8de | ||
|
|
8da6d33c61 | ||
|
|
9be9e3963a | ||
|
|
1d3a4af259 | ||
|
|
1251a89a9b | ||
|
|
274eaa9208 | ||
|
|
3236402d2b | ||
|
|
c86c69158a | ||
|
|
ed3d143b8a | ||
|
|
136032f920 | ||
|
|
150e9bf53f | ||
|
|
a3d92d6a73 | ||
|
|
d3a48ae0e0 | ||
|
|
4aa7e7602b | ||
|
|
d63c610cf5 | ||
|
|
0a31b0fc1c | ||
|
|
3737543766 | ||
|
|
85547277d1 | ||
|
|
8e962abc16 | ||
|
|
31a7559b86 | ||
|
|
b59921b843 | ||
|
|
95c126f2c6 | ||
|
|
c8425acd34 | ||
|
|
7ea9c00c18 | ||
|
|
3651585271 | ||
|
|
22732e33e5 | ||
|
|
9caf72aae7 | ||
|
|
5a73166d70 | ||
|
|
5b23f7d13a | ||
|
|
26ae001b5a | ||
|
|
59e5c0306f | ||
|
|
baedc001d9 | ||
|
|
6469aa2350 | ||
|
|
d4765c1e7f | ||
|
|
4bba516fdf | ||
|
|
ddde9992c5 | ||
|
|
c81612e39b | ||
|
|
993739ab8e | ||
|
|
20a84da5dc | ||
|
|
6a7532b5b7 | ||
|
|
714936a2e9 | ||
|
|
d2a40ddf33 | ||
|
|
eba30108f6 | ||
|
|
995c8a481e | ||
|
|
5b5121a609 | ||
|
|
c008cc92c2 | ||
|
|
858ccd72de | ||
|
|
a87935875d | ||
|
|
cc240f4f87 | ||
|
|
47c401145d | ||
|
|
76d46ec1ba | ||
|
|
fbc099d198 | ||
|
|
3de04bdb22 | ||
|
|
c042c245a3 | ||
|
|
68ff84c85a | ||
|
|
dfe7b0d60b | ||
|
|
afdca50bd2 | ||
|
|
cb2b28ca4b | ||
|
|
b7fb086476 | ||
|
|
2bf423132d | ||
|
|
84f57bb0a1 | ||
|
|
5043b9cd30 | ||
|
|
051f439434 | ||
|
|
dbadcd8f7a | ||
|
|
042a381b66 | ||
|
|
9b95ac3c91 | ||
|
|
0a08b8fb9b | ||
|
|
b70e179ff9 | ||
|
|
5fbb444d5f | ||
|
|
477d249da8 | ||
|
|
f12dd52208 | ||
|
|
452304b471 | ||
|
|
18cd1f961f | ||
|
|
6a5836f096 | ||
|
|
7dffe393ab | ||
|
|
fdbb8d8b35 | ||
|
|
2b92c98975 | ||
|
|
39f416c6a9 | ||
|
|
34903d528c | ||
|
|
230f1f77f9 | ||
|
|
f1dc67f206 | ||
|
|
53d1a57f3d | ||
|
|
e71af87b90 | ||
|
|
8f78184323 | ||
|
|
f861eb4bd9 | ||
|
|
a74aa5412c | ||
|
|
06772713ce | ||
|
|
4a8b7377a8 | ||
|
|
5f8b96704b | ||
|
|
d512ae7e22 | ||
|
|
11eaf9eb8e | ||
|
|
ef70e9317d | ||
|
|
f67e2c5a45 | ||
|
|
ce8259b031 | ||
|
|
d4aa866e5b | ||
|
|
6989ce8311 | ||
|
|
5875b1b264 | ||
|
|
fca7fcbad2 | ||
|
|
bbad5a7866 | ||
|
|
08153f9f54 | ||
|
|
81e51d2877 | ||
|
|
030f05b24b | ||
|
|
49b6ef2bde | ||
|
|
29bc596090 | ||
|
|
4f301856fb | ||
|
|
1cc4ae5c03 | ||
|
|
4fa51821ef | ||
|
|
4bafe6bfe7 | ||
|
|
184aa5eca6 | ||
|
|
a9df79642d | ||
|
|
e23e25890a | ||
|
|
28bd849af7 | ||
|
|
918585c3e2 | ||
|
|
0906420584 | ||
|
|
18bd9c856d | ||
|
|
93379145ac | ||
|
|
9c81d34d66 | ||
|
|
b51fcdb342 | ||
|
|
db2501633d | ||
|
|
5cd940f3cc | ||
|
|
1bc19e7857 | ||
|
|
83e3800ddf | ||
|
|
34ef216f3f | ||
|
|
2e014a5883 | ||
|
|
46a57c1cf2 | ||
|
|
78527cb375 | ||
|
|
508f687491 | ||
|
|
9a8ea9e1fe | ||
|
|
b1ae5f700e | ||
|
|
f0a67d9a29 | ||
|
|
5d113ea280 | ||
|
|
d45ae5fab9 | ||
|
|
02249d20c2 | ||
|
|
cefa0d8fde | ||
|
|
4933b4f60d | ||
|
|
55174476e8 | ||
|
|
a60053e6c4 | ||
|
|
6756838d5f | ||
|
|
74fe7a7a28 | ||
|
|
5812a6bd97 | ||
|
|
824f4b8acc | ||
|
|
a6ea9ac333 | ||
|
|
a87bda7810 | ||
|
|
a8f00f5242 | ||
|
|
6268db182e | ||
|
|
6f077f1c5e | ||
|
|
ff21033b0c | ||
|
|
6fdf1dfaa8 | ||
|
|
f1e0b9236c | ||
|
|
4da75134ed | ||
|
|
957ba4e058 | ||
|
|
732ef95bd9 | ||
|
|
37d728cc83 | ||
|
|
7fb8a18a1e | ||
|
|
0dc16977a5 | ||
|
|
ffc9387edb | ||
|
|
b911e8b56f | ||
|
|
52ca28d0ec | ||
|
|
684ce37f4d | ||
|
|
5bae5bf04d | ||
|
|
c701f723cf | ||
|
|
33da630db5 | ||
|
|
e57af4ae10 | ||
|
|
c7992260f0 | ||
|
|
6717bcf8b4 | ||
|
|
60bca7412c | ||
|
|
bd280d171b | ||
|
|
0089d396c4 | ||
|
|
c4669ca516 | ||
|
|
35e8c76120 | ||
|
|
6d6750c665 | ||
|
|
209119f14c | ||
|
|
a99555c1d0 | ||
|
|
e208693806 | ||
|
|
514d4a145d | ||
|
|
c1d0299c40 | ||
|
|
b4a8d47636 | ||
|
|
a68f8424f5 | ||
|
|
eba4dd3b9d | ||
|
|
745adb3a95 | ||
|
|
c83b04dfc0 | ||
|
|
a3948430ed | ||
|
|
108803ae2a | ||
|
|
b9a5b5ed09 | ||
|
|
159ba4b1c3 | ||
|
|
0a929a93a3 | ||
|
|
e9100fce91 | ||
|
|
082077ec9d | ||
|
|
e13a4afdde | ||
|
|
f20c209c94 | ||
|
|
f9c9f23b0c | ||
|
|
19e65e0d08 | ||
|
|
b6b697cabd | ||
|
|
fd3f8f317a | ||
|
|
553fa98e61 | ||
|
|
199b711324 | ||
|
|
976634a908 | ||
|
|
217020154b | ||
|
|
51e96c0ccf | ||
|
|
d6af6af0b6 | ||
|
|
fc38f7ab29 | ||
|
|
deee511f86 | ||
|
|
48ca5352c9 | ||
|
|
e2da8338e0 | ||
|
|
cca8be09cb | ||
|
|
9bdd6a442e | ||
|
|
15605e3f09 | ||
|
|
dfcb899013 | ||
|
|
5522abdfb6 | ||
|
|
312e2c8297 | ||
|
|
7f46fafbb9 | ||
|
|
5a8a378a2e | ||
|
|
fe63c03372 | ||
|
|
c88cd3c05e | ||
|
|
eadfa4a10f | ||
|
|
5aefd0962f | ||
|
|
da7c111438 | ||
|
|
669d311b0c | ||
|
|
228c51299b | ||
|
|
57975f3030 | ||
|
|
f4e737b4a1 | ||
|
|
a933406ef8 | ||
|
|
a30d6f6f7b | ||
|
|
34074b1c92 | ||
|
|
f7ab929bcb | ||
|
|
21dcde44a1 | ||
|
|
ccf0970226 | ||
|
|
221c13d92f | ||
|
|
4486d4b49d | ||
|
|
1ee17463c2 | ||
|
|
687c7587df | ||
|
|
6484ed5976 | ||
|
|
8ee28767fc | ||
|
|
a2cfe8391e | ||
|
|
de2a632a4e | ||
|
|
f06dff7bb7 | ||
|
|
7634062a85 | ||
|
|
a0efd01d43 | ||
|
|
c9d1a12299 | ||
|
|
c6b945775a | ||
|
|
6e6f435abc | ||
|
|
12d531c258 | ||
|
|
de344ccea9 | ||
|
|
b05152abb1 | ||
|
|
d2e7615345 | ||
|
|
404d73ebf7 | ||
|
|
5a563b3875 | ||
|
|
e3e890f0a1 | ||
|
|
a1e8ffc367 | ||
|
|
811d940f2b | ||
|
|
d2441ba86a | ||
|
|
a3ca74ab46 | ||
|
|
102bd5deee | ||
|
|
f3d24a62f5 | ||
|
|
3edd2b8ea2 | ||
|
|
30378d299e | ||
|
|
0437b63870 | ||
|
|
27037c6f50 | ||
|
|
e900a7b07e | ||
|
|
173727c155 | ||
|
|
c7b25ce21e | ||
|
|
d7cdd6a30b | ||
|
|
e1b4d76133 | ||
|
|
2a1f73345c | ||
|
|
e9aef74815 | ||
|
|
b146a7e1e2 | ||
|
|
351aa47e47 | ||
|
|
6753eeb822 | ||
|
|
82b292fce1 | ||
|
|
2b3a4393f3 | ||
|
|
2f660dd992 | ||
|
|
a3e7491d05 | ||
|
|
d7f785b374 | ||
|
|
fe0042d466 | ||
|
|
30f3897a80 | ||
|
|
786e6cae9b | ||
|
|
9d7a5abfd5 | ||
|
|
45b9caf231 | ||
|
|
04bf4914e7 | ||
|
|
a0eb68782a | ||
|
|
545749a057 | ||
|
|
4316ffb27f | ||
|
|
704ae1cbe4 | ||
|
|
82c79c6591 | ||
|
|
67eaada59b | ||
|
|
1984baf041 | ||
|
|
3cdb1c3253 | ||
|
|
50b21667bb | ||
|
|
694acafe21 | ||
|
|
886a48cd75 | ||
|
|
4b350125c3 | ||
|
|
c5409e726d | ||
|
|
a95e773cb0 | ||
|
|
1bf45b22f3 | ||
|
|
231507dd76 | ||
|
|
a36813da39 | ||
|
|
ce30bffb6a | ||
|
|
080eb1b369 | ||
|
|
20584d0a98 | ||
|
|
6dd0570b2d | ||
|
|
3c4f5efa05 | ||
|
|
7f851fdd10 | ||
|
|
314ccc7a23 | ||
|
|
bb92c564d6 | ||
|
|
df2d7bebab | ||
|
|
ff582e5dcb | ||
|
|
d63b6d8ea8 | ||
|
|
8ad2111e45 | ||
|
|
504a290f67 | ||
|
|
b23c2c1933 | ||
|
|
cd4dfb1707 | ||
|
|
f76c9f1d68 | ||
|
|
5dcdeab21c | ||
|
|
17871f62f5 | ||
|
|
7a81742a19 | ||
|
|
69d1e4e491 | ||
|
|
c8dc3abab6 | ||
|
|
8abec93aad | ||
|
|
37191b971b | ||
|
|
8495d5b165 | ||
|
|
2f15fe68d0 | ||
|
|
2d28ecc990 | ||
|
|
390d4e7522 | ||
|
|
f07d5f798c | ||
|
|
c6c2dbd061 | ||
|
|
f4a4b3c252 | ||
|
|
4f0be52fe9 | ||
|
|
5eb4365a59 | ||
|
|
388a856a42 | ||
|
|
832276e80e | ||
|
|
b60be13ab9 | ||
|
|
521d47f41c | ||
|
|
ce6cefdc1d | ||
|
|
982bb557a3 | ||
|
|
c37c5f9347 | ||
|
|
6428944908 | ||
|
|
242c1b9410 | ||
|
|
6ca364dc95 | ||
|
|
90800e539d | ||
|
|
5c8155b0d7 | ||
|
|
04e8c03482 | ||
|
|
173db1876d | ||
|
|
67a81a97db | ||
|
|
58e57492e2 | ||
|
|
33fa6cfafe | ||
|
|
534318f74c | ||
|
|
6f12863863 | ||
|
|
ea8c8ffee2 | ||
|
|
e991bcd394 | ||
|
|
b135063f5e | ||
|
|
ae11d5d84f | ||
|
|
2c019e12d6 | ||
|
|
780bfd6292 | ||
|
|
f776630b09 | ||
|
|
493711cf7b | ||
|
|
bb76d51655 | ||
|
|
9c7cdaff39 | ||
|
|
dca6d3363f | ||
|
|
41512fccb5 | ||
|
|
70355b2193 | ||
|
|
0b2408ae09 | ||
|
|
3d90a8b44b | ||
|
|
fc969e5042 | ||
|
|
4a47009aec | ||
|
|
1ad761f217 | ||
|
|
0da6112913 | ||
|
|
66f0368183 | ||
|
|
53ef4a0579 | ||
|
|
181193bdf8 | ||
|
|
925fbd8ad3 | ||
|
|
dda5b66a98 | ||
|
|
9a2268bac6 | ||
|
|
9e2876c638 | ||
|
|
b7bd877629 | ||
|
|
a2e562a675 | ||
|
|
503b5b0b35 | ||
|
|
3d6fa44897 | ||
|
|
a957db7def | ||
|
|
2ad693a498 | ||
|
|
6273af503b | ||
|
|
92ffce1b3b | ||
|
|
7ba9065fb7 | ||
|
|
2e481e2103 | ||
|
|
2c4560d13a | ||
|
|
9d334e23c8 | ||
|
|
4aa09b7e95 | ||
|
|
4d716bbcaf | ||
|
|
d97850aaad | ||
|
|
ac3c088492 | ||
|
|
5b3a236194 | ||
|
|
4072ebc5a5 | ||
|
|
3a5cfc6585 | ||
|
|
6e250d6f34 | ||
|
|
dff3ba5397 | ||
|
|
171be4b767 | ||
|
|
a9144a9340 | ||
|
|
70f130569b | ||
|
|
5ab0e5207b | ||
|
|
01ab01d159 | ||
|
|
b9fec7d445 | ||
|
|
ea9c74ea11 | ||
|
|
7690572c7b | ||
|
|
9d841043f4 | ||
|
|
30acb3eff3 | ||
|
|
6cb6d63516 | ||
|
|
ac3771ad7b | ||
|
|
c6a1992a87 | ||
|
|
1c5aec9bb6 | ||
|
|
743d06b88e | ||
|
|
77b2239987 | ||
|
|
cfe44569d9 | ||
|
|
395c1909eb | ||
|
|
ce42acfe2f | ||
|
|
0e5a55f586 | ||
|
|
e5197e6a59 | ||
|
|
36a50de485 | ||
|
|
b9a226f59c | ||
|
|
31aef6f3d9 | ||
|
|
fb4d4e4e8d | ||
|
|
0c2b54d833 | ||
|
|
87a273c092 | ||
|
|
5d4c0cf293 | ||
|
|
6f94d20ab4 | ||
|
|
367d8253a4 | ||
|
|
fe0b34a6e4 | ||
|
|
f8dfa0d7f0 | ||
|
|
a41bee0d44 | ||
|
|
6bcef9e24c | ||
|
|
0a98be4553 | ||
|
|
d60cd2ed8d | ||
|
|
b8fab01c0b | ||
|
|
62cb758db5 | ||
|
|
24024cc7f2 | ||
|
|
f3f4f23718 | ||
|
|
2b5e2094fa | ||
|
|
1d50e2ce9a | ||
|
|
4945725702 | ||
|
|
4e036315ba | ||
|
|
a7655b6348 | ||
|
|
a6be5fa380 | ||
|
|
b770b88834 | ||
|
|
32e40f3342 | ||
|
|
6c43a19fa1 | ||
|
|
4006c69f5b | ||
|
|
a6c7fbc1ef | ||
|
|
76090c8485 | ||
|
|
17103f3f5b | ||
|
|
c1b3bc4337 | ||
|
|
76008aa92b | ||
|
|
690c627f81 | ||
|
|
7d7fe6016b | ||
|
|
b44347311f | ||
|
|
b49d021daf | ||
|
|
141c27cda7 | ||
|
|
4a30e327a3 | ||
|
|
c777a774f7 | ||
|
|
a3f364e67d | ||
|
|
47e46a3a30 | ||
|
|
9b8263b8ec | ||
|
|
4c67ee2902 | ||
|
|
3c015d297b | ||
|
|
331ce51085 | ||
|
|
10a3898775 | ||
|
|
d05c0023cd | ||
|
|
f35f6debaf | ||
|
|
9dd6654a5c | ||
|
|
5c499c87ab | ||
|
|
735d6484e2 | ||
|
|
12230bd9e7 | ||
|
|
4cc9b2234c | ||
|
|
12cf0ff94b | ||
|
|
25c2f8fa90 | ||
|
|
54a374a83d | ||
|
|
f28df6aa9a | ||
|
|
36a613b6fe | ||
|
|
06373bcc47 | ||
|
|
4164b98967 | ||
|
|
f408aab5d3 | ||
|
|
a553976869 | ||
|
|
13cbce6ba2 | ||
|
|
6ea84fcf38 | ||
|
|
2c5b08e0fe | ||
|
|
6cb6d8139f | ||
|
|
831ebfd1a9 | ||
|
|
5efbdd4913 | ||
|
|
3c63388c6e | ||
|
|
aa2d46e805 | ||
|
|
50d13e97ee | ||
|
|
0bd535543f | ||
|
|
197d11bb57 | ||
|
|
a0a6886744 | ||
|
|
4a25da9ad6 | ||
|
|
9c7045986e | ||
|
|
c3704718a1 | ||
|
|
a93e031f95 | ||
|
|
5b36ac1bad | ||
|
|
b269c7ce6d | ||
|
|
bf6353482e | ||
|
|
86b5368e96 | ||
|
|
3d4308026d | ||
|
|
ed043ccd43 | ||
|
|
dc52a8ce5e | ||
|
|
39c16c3d29 | ||
|
|
3ede6219ef | ||
|
|
7b2c0d63f3 | ||
|
|
3120949a7e | ||
|
|
391c074ef9 | ||
|
|
7b2ce22bca | ||
|
|
89cfb1ae5d | ||
|
|
8cfd5c6d73 | ||
|
|
e35fbe659e | ||
|
|
a851327554 | ||
|
|
78d636f0a0 | ||
|
|
405f3e4c1f | ||
|
|
f36d9e7851 | ||
|
|
52de93e412 | ||
|
|
305be41c46 | ||
|
|
ab91776aa9 | ||
|
|
faf2b1195b | ||
|
|
8558c5e3dd | ||
|
|
a34167d274 | ||
|
|
63f3a9e158 | ||
|
|
c3689cb265 | ||
|
|
d5c8669dd8 | ||
|
|
65a0e789e7 | ||
|
|
0fc1f1b92f | ||
|
|
7ed51b6da3 | ||
|
|
e9f8de9be8 | ||
|
|
21a38bb438 | ||
|
|
6617e54256 | ||
|
|
da3692265a | ||
|
|
408237740f | ||
|
|
bdde789305 | ||
|
|
9f845c733d | ||
|
|
d992a7f413 | ||
|
|
c97ca80563 | ||
|
|
01b5534915 | ||
|
|
5f348a56be | ||
|
|
18a514b340 | ||
|
|
2b7a3accca | ||
|
|
3c685a69e4 | ||
|
|
090fb6ad77 | ||
|
|
e544b8994e | ||
|
|
30b67e879a | ||
|
|
a87d2053c4 | ||
|
|
c8dbc1aa3e | ||
|
|
d3d0484b7f | ||
|
|
5ca76285a1 | ||
|
|
77c1bcab29 | ||
|
|
bb6615f7cf | ||
|
|
bc4852f369 | ||
|
|
a6b8a980fd | ||
|
|
62f2c22695 | ||
|
|
7c0c5cf5ef | ||
|
|
6bb8a932aa | ||
|
|
5b546cf4dd | ||
|
|
0e8f31bddd | ||
|
|
1651361b7f | ||
|
|
4e3f602098 | ||
|
|
7f402d4987 | ||
|
|
91132cc3e8 | ||
|
|
1becb3f889 | ||
|
|
9fa0acff3e | ||
|
|
27cdd467f5 | ||
|
|
8d2d68c192 | ||
|
|
624e2a3a2c | ||
|
|
de349014d5 | ||
|
|
0fcc8d2a82 | ||
|
|
c94ffbf91f | ||
|
|
bc6fde5936 | ||
|
|
d5c90a742b | ||
|
|
fc9d6f796e | ||
|
|
96e0394724 | ||
|
|
693f29bb82 | ||
|
|
35db402376 | ||
|
|
1958b70dee | ||
|
|
e7ad853678 | ||
|
|
c14fad680d | ||
|
|
a2738111b5 | ||
|
|
016a1bb2e4 | ||
|
|
77c11e3fed | ||
|
|
5f2ddcd2c4 | ||
|
|
565260ee14 | ||
|
|
371587c62d | ||
|
|
1bb1a8f628 | ||
|
|
ba7e31b972 | ||
|
|
8211e22d86 | ||
|
|
79012ec681 | ||
|
|
ad61b155b8 | ||
|
|
eb3bbfb025 | ||
|
|
981c964ba9 | ||
|
|
78627f7b51 | ||
|
|
106795e1be | ||
|
|
eb0282dbde | ||
|
|
3b74f735a1 | ||
|
|
9b3801ba6e | ||
|
|
f6a1da99a6 | ||
|
|
0673375734 | ||
|
|
455230c111 | ||
|
|
8d3252f2cf | ||
|
|
ff13582044 | ||
|
|
b4abec77fd | ||
|
|
5cfe3e9dd1 | ||
|
|
79e201bd81 | ||
|
|
aba42a1aa1 | ||
|
|
516c5b41ea | ||
|
|
f34221d3f7 | ||
|
|
aee541b6dc | ||
|
|
ab2e827270 | ||
|
|
52ccbb3938 | ||
|
|
9b7caef6d3 | ||
|
|
06a0f30ae7 | ||
|
|
a9c577a5a3 | ||
|
|
713a8f2f97 | ||
|
|
24fb17ab12 | ||
|
|
b00a1bcdc8 | ||
|
|
cdd710455f | ||
|
|
5ccc094ad1 | ||
|
|
8d2aa51f2b | ||
|
|
4bd5d82da3 | ||
|
|
8adb05100b | ||
|
|
dfe4149ebc | ||
|
|
4a04725aaf | ||
|
|
c06905bfd0 | ||
|
|
5255882898 | ||
|
|
1def2de8bb | ||
|
|
fa0d525aeb | ||
|
|
8dbb6d4dd3 | ||
|
|
4ddad33128 | ||
|
|
e08f1afded | ||
|
|
6c3421f941 | ||
|
|
b5227a6a8c | ||
|
|
b567dab4b4 | ||
|
|
02cf4711a4 | ||
|
|
b1b12d1906 | ||
|
|
a52e110ef4 | ||
|
|
558c731c6b | ||
|
|
b6f9467fc1 | ||
|
|
608cc78966 | ||
|
|
4e21f669f6 | ||
|
|
0f6d545e1a | ||
|
|
107c6c3995 | ||
|
|
e82f3d0ea9 | ||
|
|
4d73395eae | ||
|
|
88129e9c25 | ||
|
|
21d81cbb7e | ||
|
|
e8fa3b5e9a | ||
|
|
cfde1b6ece | ||
|
|
480b27fea7 | ||
|
|
3623d871f8 | ||
|
|
3677316ff5 | ||
|
|
a98630e2c4 | ||
|
|
7ae0f9a7c6 | ||
|
|
1b778943eb | ||
|
|
d1873ebd24 | ||
|
|
bc4009bd8b | ||
|
|
64764a253b | ||
|
|
74de892859 | ||
|
|
9f80f05ef6 | ||
|
|
e97367a0a0 | ||
|
|
198aec0a0b | ||
|
|
6c3f819804 | ||
|
|
d4463c0009 | ||
|
|
07f8ce3de5 | ||
|
|
ce5552c913 | ||
|
|
6ccc591bbf | ||
|
|
d51bd43941 | ||
|
|
a973265795 | ||
|
|
7c898379e8 | ||
|
|
b62b6b9ee7 | ||
|
|
8130504430 | ||
|
|
d4c9a5bb26 | ||
|
|
b249c0205f | ||
|
|
93c4b9a9e3 | ||
|
|
daa5ca29f9 | ||
|
|
470b4155f7 | ||
|
|
b2cbb1a388 | ||
|
|
d92a95af6f | ||
|
|
7ce09af5a8 | ||
|
|
6d295c056b | ||
|
|
01e5bf2119 | ||
|
|
e4b4b72656 | ||
|
|
a41c3e64d0 | ||
|
|
be3b4f2275 | ||
|
|
c8f39033dd | ||
|
|
abb52b093a | ||
|
|
7614ec25c3 | ||
|
|
b71de91d37 | ||
|
|
d1afdbd7f5 | ||
|
|
261c1d94c9 | ||
|
|
d14834d517 | ||
|
|
9519dfaf0a | ||
|
|
c955b04b48 | ||
|
|
caf74f9962 | ||
|
|
9ae2dc3037 | ||
|
|
73cf109c72 | ||
|
|
d6736d6539 | ||
|
|
71272c982e | ||
|
|
74bf117fe3 | ||
|
|
edb48135d6 | ||
|
|
d57e356425 | ||
|
|
a14a9d4601 | ||
|
|
5bb7418de5 | ||
|
|
73669aa61b | ||
|
|
6b585a9fcf | ||
|
|
9254703855 | ||
|
|
0282344793 | ||
|
|
558beae12f | ||
|
|
30c8f5cfdf | ||
|
|
76b8bbd65c | ||
|
|
b21ee50908 | ||
|
|
9b2fecdfcb | ||
|
|
1d09f662aa | ||
|
|
932150c72f | ||
|
|
865da09c24 | ||
|
|
db8d88affc | ||
|
|
d9eec612d8 | ||
|
|
d24d84c834 | ||
|
|
d5f74eb4bf | ||
|
|
ffa850b081 | ||
|
|
f1fb7a5a78 | ||
|
|
6460e433a5 | ||
|
|
9404b2c718 | ||
|
|
e755bf6bd0 | ||
|
|
2b82503b6c | ||
|
|
0331d20a42 | ||
|
|
a545e0fb91 | ||
|
|
a83ca7dcde | ||
|
|
0277f808c3 | ||
|
|
7b6df42997 | ||
|
|
ed56b3f319 | ||
|
|
5502eafc04 | ||
|
|
0190f4550d | ||
|
|
fec5364e37 | ||
|
|
be4ac56f0b | ||
|
|
7310f7d25f | ||
|
|
04792bc749 | ||
|
|
db30f5b92c | ||
|
|
7d18a51d02 | ||
|
|
121d6eafab | ||
|
|
f8907b97ae | ||
|
|
6efa12b5f0 | ||
|
|
f1e8beb659 | ||
|
|
0004dbd826 | ||
|
|
f07b964129 | ||
|
|
936980d67a | ||
|
|
7a499da903 | ||
|
|
0bed8b2025 | ||
|
|
3e4c9cdc3d | ||
|
|
65cd15aba5 | ||
|
|
3ef12cfe12 | ||
|
|
d281a2ee98 | ||
|
|
9e576f1498 | ||
|
|
f074794009 | ||
|
|
d994f4ec89 | ||
|
|
048b27a89b | ||
|
|
4b2c5f2816 | ||
|
|
14c366bddd | ||
|
|
165c40506d | ||
|
|
d7de49d743 | ||
|
|
cdb88ff941 | ||
|
|
bd4b7b8c13 | ||
|
|
a287b87a4a | ||
|
|
d1ad3ed162 | ||
|
|
73589623d4 | ||
|
|
42688ad2c7 | ||
|
|
6aff6dbedc | ||
|
|
cdb882806c | ||
|
|
f650915832 | ||
|
|
da0314a180 | ||
|
|
093c03091e | ||
|
|
889853961d | ||
|
|
cf057505ec | ||
|
|
5b1b36eecc | ||
|
|
d081ccb9ad | ||
|
|
04b3fa394d | ||
|
|
4817c0c267 | ||
|
|
306151db65 | ||
|
|
2c3930bfb5 | ||
|
|
f18d2fdfbd | ||
|
|
f5d11cfd36 | ||
|
|
bbcbda74a9 | ||
|
|
2615f8e0ae | ||
|
|
0455db61af | ||
|
|
9f7c41919d | ||
|
|
050ed8f877 | ||
|
|
5039287d18 | ||
|
|
5177851fca | ||
|
|
2f2fdfb438 | ||
|
|
44119422f6 | ||
|
|
da57166fe7 | ||
|
|
6cbf5028c9 | ||
|
|
fb0274c2e9 | ||
|
|
cee306ec95 | ||
|
|
5ee740bd67 | ||
|
|
4d6b120864 | ||
|
|
5d5e69537d | ||
|
|
e9904ababf | ||
|
|
f3082c5c7d | ||
|
|
c0b836f2a4 | ||
|
|
863cff1dfc | ||
|
|
02227e0a44 | ||
|
|
d851f3bb21 | ||
|
|
a6c273e26a | ||
|
|
9722d6fb4d | ||
|
|
34ea8c0661 | ||
|
|
c3e1345851 | ||
|
|
0a64ab0c84 | ||
|
|
37c5378e4b | ||
|
|
e5e1f5c406 | ||
|
|
58de4aaa6c | ||
|
|
f0a343dfc9 | ||
|
|
7235b5b17a | ||
|
|
39b8eb355b | ||
|
|
8ce0de5068 | ||
|
|
a3bb08768f | ||
|
|
9657d8acd5 | ||
|
|
6ae89140a9 | ||
|
|
70c942e4cb | ||
|
|
2035b20690 | ||
|
|
b4c6896850 | ||
|
|
994c9ede5c | ||
|
|
65d0b31a1a | ||
|
|
6b8d94b6b5 | ||
|
|
a75d19fd78 | ||
|
|
46696af756 | ||
|
|
f391002c99 | ||
|
|
bb0bcabb2e | ||
|
|
db396b6b10 | ||
|
|
ccbf208ff0 | ||
|
|
d62acf29be | ||
|
|
46475f3a93 | ||
|
|
38638551dc | ||
|
|
1bb84e3b0f | ||
|
|
68bd2c06c8 | ||
|
|
ae1083b090 | ||
|
|
16804972e5 | ||
|
|
00260f975a | ||
|
|
2c5ef6a73b | ||
|
|
80a4369845 | ||
|
|
f93d935175 | ||
|
|
ac2116b44f | ||
|
|
38c6a0741b | ||
|
|
117e049f66 | ||
|
|
d9c0d8d021 | ||
|
|
a8d94a0a36 | ||
|
|
df890b8c0a | ||
|
|
fff6e6c077 | ||
|
|
40056ab151 | ||
|
|
7f5e76796d | ||
|
|
1391a3d022 | ||
|
|
82c2079074 | ||
|
|
d07cdee144 | ||
|
|
d2408ebe4b | ||
|
|
3047002558 | ||
|
|
35d505e9b1 | ||
|
|
961b8024ab | ||
|
|
061ae1ae6c | ||
|
|
8d0ea0e2a9 | ||
|
|
386fddc050 | ||
|
|
630548e022 | ||
|
|
0b673b7c1a | ||
|
|
ca1809c476 | ||
|
|
9fcbdb43e6 | ||
|
|
ddfd9fb286 | ||
|
|
71757d0cce | ||
|
|
129fd1336c | ||
|
|
f24daa2b34 | ||
|
|
2aa594b686 | ||
|
|
130b51e109 | ||
|
|
837b589270 | ||
|
|
6c1909e627 | ||
|
|
3b95b8d8c8 | ||
|
|
2b9de2405e | ||
|
|
fb7292f710 | ||
|
|
e448ce4b00 | ||
|
|
99c2bc11cb | ||
|
|
f8186e68e4 | ||
|
|
4b1f5881e3 | ||
|
|
672b726e6b | ||
|
|
0575cd475c | ||
|
|
f61d0f5f8d | ||
|
|
93c10da760 | ||
|
|
5008b5e7a4 | ||
|
|
96529ae6bc | ||
|
|
56a234baf6 | ||
|
|
fc70a34e7d | ||
|
|
d100d41ce6 | ||
|
|
9de710bfd8 | ||
|
|
8e5af7f05c | ||
|
|
07a0f55a95 | ||
|
|
ebfe7c3a93 | ||
|
|
07b7b3acec | ||
|
|
e1aaf82602 | ||
|
|
b19d489a4c | ||
|
|
f84d9ed7d4 | ||
|
|
588ad4313a | ||
|
|
5e873cad3f | ||
|
|
d13347fd4e | ||
|
|
3d2e909237 | ||
|
|
b4192137de | ||
|
|
cb0b8869e2 | ||
|
|
698dab032f | ||
|
|
2db3d1405b | ||
|
|
b4c188e797 | ||
|
|
cf12c8575d | ||
|
|
0c3d9f335c | ||
|
|
ed23e388f9 | ||
|
|
6f0a259268 | ||
|
|
e273c830b4 | ||
|
|
e045081346 | ||
|
|
951e4cb61a | ||
|
|
4c2e81a29d | ||
|
|
9461e9d574 | ||
|
|
1038cc7ccf | ||
|
|
e4e1f2e32e | ||
|
|
5c4e1a4bb8 | ||
|
|
76e3bc28e5 | ||
|
|
79d13274b5 | ||
|
|
5cac368926 | ||
|
|
b45a351eff | ||
|
|
0f3ec55f21 | ||
|
|
3b01a42b15 | ||
|
|
c165648d5b | ||
|
|
c312828c79 | ||
|
|
ed76afbce8 | ||
|
|
d8562e2990 | ||
|
|
454deaf069 | ||
|
|
47c7e84d25 | ||
|
|
a0052f88f4 | ||
|
|
c99c06c0bb | ||
|
|
326395730e | ||
|
|
d7f6bdf417 | ||
|
|
d507f0807f | ||
|
|
a45a1bdb18 | ||
|
|
76aa8f4f54 | ||
|
|
20dc69c034 | ||
|
|
45438cd402 | ||
|
|
c47f1fe4b5 | ||
|
|
48b2e951cd | ||
|
|
ef0ac587a1 | ||
|
|
15781e6ea4 | ||
|
|
a79e110aa3 | ||
|
|
d4aa3e4e07 | ||
|
|
52f5e9af96 | ||
|
|
49f9fa0f1b | ||
|
|
c56edfdc65 | ||
|
|
a15469698c | ||
|
|
5cc2fac8bc | ||
|
|
44ed1f3e4f | ||
|
|
4a633afdf6 | ||
|
|
b557f04c10 | ||
|
|
356d7c4982 | ||
|
|
d136893035 | ||
|
|
cd814759dd | ||
|
|
3990c1a4ad | ||
|
|
18e0e2a8ff | ||
|
|
3766fe222a | ||
|
|
e528c006d7 | ||
|
|
2d946af30d | ||
|
|
94a2d33d1f | ||
|
|
d82ef117ea | ||
|
|
2c9dbccea5 | ||
|
|
4bd0fea528 | ||
|
|
b7077f8409 | ||
|
|
1634510070 | ||
|
|
6658c05e5a | ||
|
|
e6e7a5abd3 | ||
|
|
1f2d40d8e2 | ||
|
|
a7c1baa2cb | ||
|
|
fe821e9ba9 | ||
|
|
6bf13c99a3 | ||
|
|
1364e68ffc | ||
|
|
ae9be8a543 | ||
|
|
24ff188d0a | ||
|
|
739b95888b | ||
|
|
b40cafc65a | ||
|
|
94763fb267 | ||
|
|
00de143d47 | ||
|
|
525249c61b | ||
|
|
8e91f1dafe | ||
|
|
05c3a081a2 | ||
|
|
0469cb36c2 | ||
|
|
572e6c439d | ||
|
|
d7c1c2d389 | ||
|
|
ec34339e16 | ||
|
|
c7f7aa3eba | ||
|
|
d430b5f328 | ||
|
|
be39dd5d89 | ||
|
|
d35667fab2 | ||
|
|
40e212f776 | ||
|
|
49b7ef484f | ||
|
|
d5c5c4e9b6 | ||
|
|
c1b8af911f | ||
|
|
e831ea0acc | ||
|
|
d2ee80f8de | ||
|
|
312176f0c8 | ||
|
|
0e5cc323a4 | ||
|
|
210670c24f | ||
|
|
7d6d848e73 | ||
|
|
44ce5bff38 | ||
|
|
64a9766d56 | ||
|
|
2c3945a47a | ||
|
|
a6fe435b07 | ||
|
|
99006fceaa | ||
|
|
630a9c40c5 | ||
|
|
24d15a0d7c | ||
|
|
e789c95984 | ||
|
|
d7fc83d175 | ||
|
|
82a971ea1a | ||
|
|
da99809739 | ||
|
|
550f1e0d60 | ||
|
|
121477612f | ||
|
|
cf54eb777c | ||
|
|
356e1cd6f6 | ||
|
|
201afa79db | ||
|
|
24e645b029 | ||
|
|
4ce21e6542 | ||
|
|
b7d6302c77 | ||
|
|
e78c92e073 | ||
|
|
3eaec40368 | ||
|
|
ecbecd3980 | ||
|
|
9204111f6c | ||
|
|
1c3f6cd957 | ||
|
|
e24a523e92 | ||
|
|
39c2502107 | ||
|
|
751f4461d2 | ||
|
|
b61d9323ab | ||
|
|
40dfbd6689 | ||
|
|
b66898ef25 | ||
|
|
6f146f88e4 | ||
|
|
0ca3f7ea77 | ||
|
|
8a82f8f35f | ||
|
|
031d9e4593 | ||
|
|
ad7b3243fb | ||
|
|
37a7f8a7b6 | ||
|
|
fb80379d25 | ||
|
|
3be402d04e | ||
|
|
402b7e7a1b | ||
|
|
59eeedf54f | ||
|
|
2709e97087 | ||
|
|
3bd83c561c | ||
|
|
fec7d6db58 | ||
|
|
dad965589c | ||
|
|
2a2d716537 | ||
|
|
678b7bf041 | ||
|
|
8b06b37610 | ||
|
|
21d8c376f7 | ||
|
|
e82d9d7f62 | ||
|
|
be596d2ba7 | ||
|
|
ddee6690e1 | ||
|
|
c092abf5f0 | ||
|
|
2fa16f252d | ||
|
|
b6df54c4c0 | ||
|
|
fdafbb9aaa | ||
|
|
2a908347a5 | ||
|
|
d088637c56 | ||
|
|
44c42c862c | ||
|
|
496d63f2f0 | ||
|
|
310ca2aa2f | ||
|
|
a14dcdcb38 | ||
|
|
249111caf4 | ||
|
|
55532a26de | ||
|
|
e46f08161f | ||
|
|
f2e736f0d7 | ||
|
|
ff97e36c2b | ||
|
|
4b6bebb07a | ||
|
|
aa4e7dcb11 | ||
|
|
0fdc68a0b1 | ||
|
|
71b75b9f1d | ||
|
|
5fd0284f41 | ||
|
|
ff141209e8 | ||
|
|
6c4e191f23 | ||
|
|
d7507ad25e | ||
|
|
ba46cd3bb8 | ||
|
|
66edda6427 | ||
|
|
a447663ca8 | ||
|
|
98530fcab0 | ||
|
|
20c66cde3b | ||
|
|
90906d35f8 | ||
|
|
e1c678673f | ||
|
|
5c12723bfb | ||
|
|
1febf0ab7e | ||
|
|
ffc99250fb | ||
|
|
1682ca1754 | ||
|
|
758f587a82 | ||
|
|
3ac7745827 | ||
|
|
29318e973d | ||
|
|
692bd20baf | ||
|
|
a9fe3beeb4 | ||
|
|
953c3d3025 | ||
|
|
5c904eade2 | ||
|
|
7e07ae1444 | ||
|
|
c46a89d8ce | ||
|
|
5fa7bb36ef | ||
|
|
fec62eb64e | ||
|
|
6608af4f22 | ||
|
|
93a5e5b261 | ||
|
|
8d485f04cf | ||
|
|
eb646b3b7d | ||
|
|
7075cdc2c4 | ||
|
|
dfa35773ea | ||
|
|
f0008231ae | ||
|
|
44cf10ce59 | ||
|
|
b6fc200579 | ||
|
|
3e6637d630 | ||
|
|
cad98e07ea | ||
|
|
9a4d0442fe | ||
|
|
e5afc8ac30 | ||
|
|
11d2ab6bac | ||
|
|
e931044b54 | ||
|
|
6e3c63b92e | ||
|
|
351d93f802 | ||
|
|
8fefdbdced | ||
|
|
1e74fcf3e6 | ||
|
|
732be5155e | ||
|
|
4d94205f79 | ||
|
|
1aabf30326 | ||
|
|
becf83ee91 | ||
|
|
957e2db310 | ||
|
|
b75d0e5645 | ||
|
|
29934366bc | ||
|
|
e664a546d4 | ||
|
|
e10d46c9fd | ||
|
|
1c1e9c5df2 | ||
|
|
405a6f4ce2 | ||
|
|
0a4e9ce47e | ||
|
|
8aaa94af62 | ||
|
|
91c1908693 | ||
|
|
d95b5dc52f | ||
|
|
4929fcdb0f | ||
|
|
7a6d3cd044 | ||
|
|
7dedf19ad6 | ||
|
|
8135af7a72 | ||
|
|
fbb9a6b18e | ||
|
|
0c72c689f1 | ||
|
|
41712c14a2 | ||
|
|
33b997d550 | ||
|
|
d846b9eb05 | ||
|
|
2a67d7ae60 | ||
|
|
ad669614c5 | ||
|
|
b58f7e717f | ||
|
|
5b83ec912b | ||
|
|
8d11d98a48 | ||
|
|
c8c5127df9 | ||
|
|
e8aed345cb | ||
|
|
82b373778c | ||
|
|
a1f2b78b98 | ||
|
|
9684918fb1 | ||
|
|
6495ec039d | ||
|
|
d642c780e1 | ||
|
|
62c4ba70bf | ||
|
|
aaa3a21d28 | ||
|
|
468e2cfa35 | ||
|
|
c7d543468f | ||
|
|
e209187a97 | ||
|
|
ae627c7102 | ||
|
|
93ea2e3f9e | ||
|
|
d005440f4e | ||
|
|
69ae7fbe0f | ||
|
|
664c3bfc6a | ||
|
|
5df976dc91 | ||
|
|
0c9d8951f0 | ||
|
|
920b5b85df | ||
|
|
a749b034a7 | ||
|
|
5d441e38df | ||
|
|
6a7bedbd4b | ||
|
|
a13e15f46c | ||
|
|
a0f1fa3de6 | ||
|
|
ac9e748933 | ||
|
|
c8258e9c2b | ||
|
|
efd2d83c4b | ||
|
|
9dc634e1d4 | ||
|
|
508acb19dc | ||
|
|
cfe8167c0e | ||
|
|
de7a622c34 | ||
|
|
24bb8264c8 | ||
|
|
c5c5780a36 | ||
|
|
26c71a6efb | ||
|
|
b428aacae2 | ||
|
|
8c2711e093 | ||
|
|
9f11a7525f | ||
|
|
d7e64a1e5d | ||
|
|
d34b97d0c9 | ||
|
|
9c19b63f9c | ||
|
|
cb3e4f3deb | ||
|
|
cc499e6daf | ||
|
|
dacecd5ab8 | ||
|
|
7926b375a2 | ||
|
|
78e674c659 | ||
|
|
a010fdffc9 | ||
|
|
a6a2f2aa24 | ||
|
|
70394be570 | ||
|
|
2560dd117c | ||
|
|
0862e8def7 | ||
|
|
50d4a1dda9 | ||
|
|
b40c26af2e | ||
|
|
cf160274ed | ||
|
|
1cc8c973ca | ||
|
|
fd54eedf9b | ||
|
|
7fe277a15a | ||
|
|
f35afe85d4 | ||
|
|
6a0905b09d | ||
|
|
59eb02b693 | ||
|
|
f7347b1c6a | ||
|
|
9fd696f526 | ||
|
|
970d320600 | ||
|
|
bbcf94d146 | ||
|
|
24026949b7 | ||
|
|
62f4d419cc | ||
|
|
8e49f25cdb | ||
|
|
8c3190ce46 | ||
|
|
fadaf615cf | ||
|
|
e40dbfcf8e | ||
|
|
4c32eb38be | ||
|
|
0205136e18 | ||
|
|
78d87ee9c8 | ||
|
|
c14ef20aec | ||
|
|
604417058d | ||
|
|
83c2c5fc88 | ||
|
|
64168ea643 | ||
|
|
488e47ab9e | ||
|
|
a953430fd8 | ||
|
|
ab53ed10d7 | ||
|
|
11dcb63c3a | ||
|
|
7032615db2 | ||
|
|
6dcf79e89d | ||
|
|
87e29fc776 | ||
|
|
72d538009b | ||
|
|
be1912e4f5 | ||
|
|
81b5430da9 | ||
|
|
953277c196 | ||
|
|
e71b792c61 | ||
|
|
ddfd2fb79a | ||
|
|
f4a8ab3a4f | ||
|
|
b4d3e5da4b | ||
|
|
5b6fc2b0ce | ||
|
|
1d4aa2bbc1 | ||
|
|
6602aa4e57 | ||
|
|
d008baa70a | ||
|
|
618f67459b | ||
|
|
7ef0971b0e | ||
|
|
b20646ac94 | ||
|
|
6d6065f5e7 | ||
|
|
7ff242449b | ||
|
|
37184e0810 | ||
|
|
dabb0c07fa | ||
|
|
f2ce3b378c | ||
|
|
63354b8c63 | ||
|
|
c959311cee | ||
|
|
918458d902 | ||
|
|
625563e31b | ||
|
|
224431faae | ||
|
|
b470da97ef | ||
|
|
4fe6b23916 | ||
|
|
252dd4eaba | ||
|
|
f86e08334c | ||
|
|
20114f7fc6 | ||
|
|
d5f7371df0 | ||
|
|
480cc367a1 | ||
|
|
c83e999291 | ||
|
|
3dbdff1dfe | ||
|
|
1f64b54b78 | ||
|
|
628eabdf36 | ||
|
|
8b01ef9c98 | ||
|
|
110aaac93b | ||
|
|
91f2d2604b | ||
|
|
dec926226e | ||
|
|
ce91327038 | ||
|
|
41bddf4030 | ||
|
|
7bea53a53c | ||
|
|
954a9b793a | ||
|
|
3515e9f95c | ||
|
|
dc16d64c3d | ||
|
|
345dbb1053 | ||
|
|
acd343d62e | ||
|
|
42ae5aaf1b | ||
|
|
3d79a94185 | ||
|
|
389a953fdb | ||
|
|
53dc255c97 | ||
|
|
e956dba46a | ||
|
|
ad58b3903f | ||
|
|
810277d5ae | ||
|
|
333857c05f | ||
|
|
0eef8c0547 | ||
|
|
44d8f461c0 | ||
|
|
b8c8776630 | ||
|
|
cb6d32d724 | ||
|
|
b21f34fb1c | ||
|
|
d074d8a990 | ||
|
|
6096b14a24 | ||
|
|
4830d6cc19 | ||
|
|
4bd08c635e | ||
|
|
1f21a27c3d | ||
|
|
deecb435ec | ||
|
|
bc02338427 | ||
|
|
cd1680ab61 | ||
|
|
cab0ea61c5 | ||
|
|
2243a81d4e | ||
|
|
6031161b66 | ||
|
|
2579a83905 | ||
|
|
da6596b5f1 | ||
|
|
ff21d9f63c | ||
|
|
5e220212f7 | ||
|
|
366450037b | ||
|
|
ed36105550 | ||
|
|
4ff6abcd88 | ||
|
|
655979bcd2 | ||
|
|
c1193fb18d | ||
|
|
345bb1ae58 | ||
|
|
d597ca7a38 | ||
|
|
9cc32adae5 | ||
|
|
b838ff145c | ||
|
|
24559e7947 | ||
|
|
c7f95d64d0 | ||
|
|
538da52e49 | ||
|
|
b675381718 | ||
|
|
993c70b4aa | ||
|
|
41bc9949f1 | ||
|
|
bc3fd7f55b | ||
|
|
fc9bea12d3 | ||
|
|
2e351b7cd1 | ||
|
|
f6ab508e3f | ||
|
|
28c5215145 | ||
|
|
459d661070 | ||
|
|
6cf1dfff95 | ||
|
|
c1cfb21123 | ||
|
|
3ec1a426c3 | ||
|
|
88fb76a302 | ||
|
|
3fef97795e | ||
|
|
5876c6765c | ||
|
|
2b2c4060dd | ||
|
|
456f91c93c | ||
|
|
fe0859a9b3 | ||
|
|
e974356a27 | ||
|
|
47b01972af | ||
|
|
1a6fab3932 | ||
|
|
d4e4fcfb59 | ||
|
|
e9e880370b | ||
|
|
9e6213731c | ||
|
|
296e770d37 | ||
|
|
79433df2cc | ||
|
|
e899e36dcb | ||
|
|
3346db43c4 | ||
|
|
21322f9143 | ||
|
|
4922f41366 | ||
|
|
4786235953 | ||
|
|
6443a4ee2d | ||
|
|
579e04099b | ||
|
|
835b4ac039 | ||
|
|
2f566f8e30 | ||
|
|
2ed068b28f | ||
|
|
1101c74816 | ||
|
|
063172ef0f | ||
|
|
310f88c990 | ||
|
|
7baffc5a31 | ||
|
|
6d8da5d6b1 | ||
|
|
ff2e71f6e8 | ||
|
|
787b0fd38b | ||
|
|
4333b2e559 | ||
|
|
dd347fe58c | ||
|
|
87e3ce13da | ||
|
|
dc98389b2c | ||
|
|
2367f00eeb | ||
|
|
6e1dbba6a7 | ||
|
|
340e8fb90b | ||
|
|
9d885f5aa5 | ||
|
|
a73df29d2d | ||
|
|
f3c9f7d260 | ||
|
|
1874fe1671 | ||
|
|
10281213bf | ||
|
|
957d840da5 | ||
|
|
3fe45c27f6 | ||
|
|
baa5377121 | ||
|
|
4080df3576 | ||
|
|
a396111cce | ||
|
|
6947a87148 | ||
|
|
fd819dd373 | ||
|
|
63f4080b4c | ||
|
|
213f62cd51 | ||
|
|
b08b4da132 | ||
|
|
d6a573bd3e | ||
|
|
917732a00e | ||
|
|
8013e296a2 | ||
|
|
2d317ddeb5 | ||
|
|
830c36f74a | ||
|
|
d819271976 | ||
|
|
994d3a1631 | ||
|
|
3996a3ee14 | ||
|
|
7f30bdda4a | ||
|
|
1ec71dcc19 | ||
|
|
7049ebf04b | ||
|
|
c4b7d34908 | ||
|
|
53d7aeb3e5 | ||
|
|
3cca9d92a4 | ||
|
|
8be26bc7e8 | ||
|
|
a00762c005 | ||
|
|
e9960d3403 | ||
|
|
57a489ce7e | ||
|
|
ce3c3be210 | ||
|
|
5e6de1b229 | ||
|
|
f8bd7fb2b9 | ||
|
|
6da9e5b5a5 | ||
|
|
5a2102bb09 | ||
|
|
8ffe760dd6 | ||
|
|
9c02502f4e | ||
|
|
ec0b7c721d | ||
|
|
54a56aaec0 | ||
|
|
75c86a5211 | ||
|
|
074244846f | ||
|
|
8a422cb19e | ||
|
|
d88d6fb1ee | ||
|
|
2bb51142de | ||
|
|
23c2a87fdb | ||
|
|
6d5504b7d7 | ||
|
|
191a5d68f7 | ||
|
|
83119931bc | ||
|
|
cc0c1a5223 | ||
|
|
9b25c918a8 | ||
|
|
655d4cc242 | ||
|
|
fca34d288a | ||
|
|
f89d7e11f8 | ||
|
|
6c988027a5 | ||
|
|
e24122b355 | ||
|
|
f4d212c0e3 | ||
|
|
96a65b85e6 | ||
|
|
041377383d | ||
|
|
8e26c651a8 | ||
|
|
86b7168a31 | ||
|
|
a67ad5a501 | ||
|
|
1564c88244 | ||
|
|
dcae6b0688 | ||
|
|
6fc8d4087f | ||
|
|
e29ba6455e | ||
|
|
40618cfda4 | ||
|
|
a8b44941a0 | ||
|
|
3b3f7f308f | ||
|
|
cb0e6532bf | ||
|
|
c7e066392f | ||
|
|
f033697579 | ||
|
|
d00a317202 | ||
|
|
a5f3d48a71 | ||
|
|
5021e8ed35 | ||
|
|
afaaa1b346 | ||
|
|
dfb02dfdbc | ||
|
|
69907232a5 | ||
|
|
c1658d68e1 | ||
|
|
d704dfa8b6 | ||
|
|
bef6c56aeb | ||
|
|
21fdb3d02c | ||
|
|
696da5dbec | ||
|
|
3e24277b93 | ||
|
|
1632bdec39 | ||
|
|
7f39accf4b | ||
|
|
9cefe5d3a3 | ||
|
|
8c676c9e16 | ||
|
|
72eff50db9 | ||
|
|
e2352100f8 | ||
|
|
c1c5197d0e | ||
|
|
0a53602701 | ||
|
|
3b368949ba | ||
|
|
f57d91123e | ||
|
|
ed5e548257 | ||
|
|
6eaf155b64 | ||
|
|
68b9dcd943 | ||
|
|
9b6ce9e1f6 | ||
|
|
1fd93e6f49 | ||
|
|
b1adcf673f | ||
|
|
05e01286d4 | ||
|
|
458fea369c | ||
|
|
c061426846 | ||
|
|
b0b35c0f1c | ||
|
|
0d2bbce8d7 | ||
|
|
fc298918b2 | ||
|
|
62cfce4ba1 | ||
|
|
dc5bcbe9b2 | ||
|
|
d89e9fb36d | ||
|
|
34e0fc56be | ||
|
|
8e14e323a7 | ||
|
|
21044fb1c2 | ||
|
|
e490baae28 | ||
|
|
2be508ef2f | ||
|
|
59ad092a9f | ||
|
|
0cdd8ca6b2 |
@@ -7,3 +7,7 @@ npm-debug.log
|
||||
.github
|
||||
LICENSE
|
||||
docs/
|
||||
*.sqlite
|
||||
*.env
|
||||
.env
|
||||
.next/standalone/.env
|
||||
@@ -1,8 +0,0 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
end_of_line = lf
|
||||
indent_size = 2
|
||||
indent_style = space
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
19
.env.example
Normal file
19
.env.example
Normal file
@@ -0,0 +1,19 @@
|
||||
DATABASE_URL="file:./database/db.sqlite"
|
||||
|
||||
# Next Auth
|
||||
# You can generate a new secret on the command line with:
|
||||
# openssl rand -base64 32
|
||||
# https://next-auth.js.org/configuration/options#secret
|
||||
AUTH_TRUST_HOST="true"
|
||||
NEXTAUTH_SECRET="anything"
|
||||
|
||||
# Disable analytics
|
||||
NEXT_PUBLIC_DISABLE_ANALYTICS="true"
|
||||
|
||||
DEFAULT_COLOR_SCHEME="light"
|
||||
|
||||
# Unraid API Configuration
|
||||
UNRAID_HOST=192.168.10.20
|
||||
UNRAID_API_KEY=your-api-key-here
|
||||
UNRAID_USE_SSL=false
|
||||
UNRAID_PORT=80
|
||||
@@ -1,2 +0,0 @@
|
||||
*.js
|
||||
nodes_modules/
|
||||
43
.eslintrc.js
43
.eslintrc.js
@@ -1,43 +0,0 @@
|
||||
module.exports = {
|
||||
extends: [
|
||||
'mantine',
|
||||
'plugin:@next/next/recommended',
|
||||
'eslint:recommended',
|
||||
'plugin:@typescript-eslint/eslint-recommended',
|
||||
'plugin:@typescript-eslint/recommended',
|
||||
'plugin:vitest/recommended',
|
||||
],
|
||||
plugins: ['testing-library', 'react-hooks', 'react', 'unused-imports', 'vitest'],
|
||||
overrides: [
|
||||
{
|
||||
files: ['**/?(*.)+(spec|test).[jt]s?(x)'],
|
||||
extends: ['plugin:testing-library/react'],
|
||||
},
|
||||
],
|
||||
parserOptions: {
|
||||
project: './tsconfig.json',
|
||||
},
|
||||
rules: {
|
||||
'import/no-cycle': 'off',
|
||||
'react/react-in-jsx-scope': 'off',
|
||||
'react/no-children-prop': 'off',
|
||||
'unused-imports/no-unused-imports': 'warn',
|
||||
'@typescript-eslint/no-unused-vars': 'off',
|
||||
'@typescript-eslint/no-unused-imports': 'off',
|
||||
'@typescript-eslint/no-unused-expressions': 'off',
|
||||
'@typescript-eslint/no-explicit-any': 'off',
|
||||
'@typescript-eslint/no-shadow': 'off',
|
||||
'@typescript-eslint/no-use-before-define': 'off',
|
||||
'@typescript-eslint/no-non-null-assertion': 'off',
|
||||
'no-continue': 'off',
|
||||
'linebreak-style': 0,
|
||||
'import/extensions': 'off',
|
||||
'vitest/max-nested-describe': [
|
||||
'error',
|
||||
{
|
||||
max: 3,
|
||||
},
|
||||
],
|
||||
'testing-library/no-node-access': ['error', { allowContainerFirstChild: true }],
|
||||
},
|
||||
};
|
||||
2
.github/FUNDING.yml
vendored
2
.github/FUNDING.yml
vendored
@@ -2,7 +2,7 @@
|
||||
|
||||
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
||||
patreon: # Replace with a single Patreon username
|
||||
open_collective: # Replace with a single Open Collective username
|
||||
open_collective: homarr
|
||||
ko_fi: ajnart
|
||||
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
||||
|
||||
7
.github/ISSUE_TEMPLATE/bug.yml
vendored
7
.github/ISSUE_TEMPLATE/bug.yml
vendored
@@ -3,6 +3,11 @@ description: Report something that's broken, or not working like intented!
|
||||
title: '<title>'
|
||||
labels: ['🐛 Bug']
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
> [!WARNING]
|
||||
> If you want to report a bug for 1.0, please open it on the new [repository](https://github.com/homarr-labs/homarr/issues/new/choose).
|
||||
- type: dropdown
|
||||
id: environment
|
||||
attributes:
|
||||
@@ -35,7 +40,7 @@ body:
|
||||
label: Logs
|
||||
description: Provide your Homarr logs so we can investigate what's going on
|
||||
validations:
|
||||
required: true
|
||||
required: false
|
||||
- type: textarea
|
||||
id: context
|
||||
attributes:
|
||||
|
||||
13
.github/ISSUE_TEMPLATE/feature-request.yml
vendored
13
.github/ISSUE_TEMPLATE/feature-request.yml
vendored
@@ -3,6 +3,11 @@ description: Request a feature to help improve Homarr!
|
||||
title: '<title>'
|
||||
labels: ['✨ Feature']
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
> [!WARNING]
|
||||
> If you want to request a feature for 1.0, please open it on the new [repository](https://github.com/homarr-labs/homarr/issues/new/choose).
|
||||
- type: textarea
|
||||
id: feature
|
||||
attributes:
|
||||
@@ -22,3 +27,11 @@ body:
|
||||
- High (App breaking feature)
|
||||
validations:
|
||||
required: true
|
||||
- type: checkboxes
|
||||
id: idiot-check
|
||||
attributes:
|
||||
label: Please tick the boxes
|
||||
description: Before submitting, please ensure that
|
||||
options:
|
||||
- label: You are **NOT** using a version superior to v1. if that is the case, please fill this issue on the new repository.
|
||||
required: true
|
||||
|
||||
5
.github/ISSUE_TEMPLATE/idea.yml
vendored
5
.github/ISSUE_TEMPLATE/idea.yml
vendored
@@ -3,6 +3,11 @@ description: Tell us your idea! We may implement it.
|
||||
title: '<title>'
|
||||
labels: ['🤔 Idea']
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
> [!WARNING]
|
||||
> If you have an idea for 1.0, please open it on the new [repository](https://github.com/homarr-labs/homarr/issues/new/choose).
|
||||
- type: textarea
|
||||
id: feature
|
||||
attributes:
|
||||
|
||||
5
.github/ISSUE_TEMPLATE/module.yml
vendored
5
.github/ISSUE_TEMPLATE/module.yml
vendored
@@ -2,6 +2,11 @@ name: 🏗️ Module request
|
||||
description: Request for a module to be added / an integration with you favourite service !
|
||||
title: '<title>'
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
> [!WARNING]
|
||||
> If you want to request a new integration for 1.0, please open it on the new [repository](https://github.com/homarr-labs/homarr/issues/new/choose).
|
||||
- type: textarea
|
||||
id: name
|
||||
attributes:
|
||||
|
||||
21
.github/renovate.json
vendored
Normal file
21
.github/renovate.json
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
||||
"extends": [
|
||||
"config:base"
|
||||
],
|
||||
"commitMessagePrefix": "⬆️",
|
||||
"dependencyDashboard": true,
|
||||
"prCreation": "approval",
|
||||
"lockFileMaintenance": {
|
||||
"automerge": false
|
||||
},
|
||||
"minor": {
|
||||
"automerge": false
|
||||
},
|
||||
"patch": {
|
||||
"automerge": false
|
||||
},
|
||||
"pin": {
|
||||
"automerge": false
|
||||
}
|
||||
}
|
||||
8
.github/workflows/docker.yml
vendored
8
.github/workflows/docker.yml
vendored
@@ -6,9 +6,6 @@ name: Master CI
|
||||
on:
|
||||
push:
|
||||
branches: [master]
|
||||
paths-ignore:
|
||||
- '.github/**'
|
||||
- '**.md'
|
||||
tags:
|
||||
- v*
|
||||
|
||||
@@ -63,9 +60,9 @@ jobs:
|
||||
restore-keys: |
|
||||
${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json') }}-
|
||||
|
||||
- run: yarn install --immutable
|
||||
- run: yarn install
|
||||
|
||||
- run: yarn build
|
||||
- run: yarn turbo build
|
||||
|
||||
- name: Docker meta
|
||||
id: meta
|
||||
@@ -101,3 +98,4 @@ jobs:
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
network: host
|
||||
|
||||
106
.github/workflows/docker_dev.yml
vendored
106
.github/workflows/docker_dev.yml
vendored
@@ -41,6 +41,7 @@ jobs:
|
||||
permissions:
|
||||
packages: write
|
||||
contents: read
|
||||
pull-requests: write
|
||||
steps:
|
||||
|
||||
- name: Setup
|
||||
@@ -70,11 +71,15 @@ jobs:
|
||||
path: .next/cache
|
||||
key: ${{ runner.os }}-build-${{ env.cache-name }}
|
||||
|
||||
- run: yarn install --immutable
|
||||
- run: yarn install
|
||||
|
||||
- run: yarn turbo build
|
||||
|
||||
- run: yarn test:run
|
||||
- run: yarn test:coverage
|
||||
|
||||
- name: Report coverage
|
||||
if: always()
|
||||
uses: davelosert/vitest-coverage-report-action@v2
|
||||
|
||||
- name: Docker meta
|
||||
if: github.event_name != 'pull_request'
|
||||
@@ -86,7 +91,7 @@ jobs:
|
||||
# generate Docker tags based on the following events/attributes
|
||||
tags: |
|
||||
type=ref,event=pr
|
||||
type=raw,value=${{ github.event.inputs.tag }}, prefix=test-,enable=${{ github.event.inputs.tag != '' }}
|
||||
type=raw,value=${{ github.event.inputs.tag }},enable=${{ github.event.inputs.tag != '' }}
|
||||
tpye=raw,value=dev,priority=1,enable=${{ github.event.inputs.tag == '' }}
|
||||
|
||||
- name: Set up QEMU
|
||||
@@ -107,102 +112,11 @@ jobs:
|
||||
if: github.event_name != 'pull_request'
|
||||
uses: docker/build-push-action@v4
|
||||
with:
|
||||
platforms: linux/amd64,linux/arm64,linux/arm/v7
|
||||
platforms: linux/amd64,linux/arm64
|
||||
context: .
|
||||
push: ${{ github.event_name != 'pull_request' }}
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
|
||||
analyze:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Install Node.js
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 18
|
||||
|
||||
- name: Get yarn cache directory path
|
||||
id: yarn-cache-dir-path
|
||||
run: echo "::set-output name=dir::$(yarn config get cacheFolder)"
|
||||
|
||||
- uses: actions/cache@v3
|
||||
id: yarn-cache
|
||||
with:
|
||||
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
|
||||
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-yarn-
|
||||
|
||||
- name: Restore next build
|
||||
uses: actions/cache@v3
|
||||
id: restore-build-cache
|
||||
env:
|
||||
cache-name: cache-next-build
|
||||
with:
|
||||
# if you use a custom build directory, replace all instances of `.next` in this file with your build directory
|
||||
# ex: if your app builds to `dist`, replace `.next` with `dist`
|
||||
path: .next/cache
|
||||
# change this if you prefer a more strict cache
|
||||
key: ${{ runner.os }}-build-${{ env.cache-name }}
|
||||
|
||||
- run: yarn install
|
||||
|
||||
- name: Build next.js app
|
||||
# change this if your site requires a custom build command
|
||||
run: yarn turbo build
|
||||
|
||||
# Here's the first place where next-bundle-analysis' own script is used
|
||||
# This step pulls the raw bundle stats for the current bundle
|
||||
- name: Analyze bundle
|
||||
run: npx -p nextjs-bundle-analysis report
|
||||
|
||||
- name: Upload bundle
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: bundle
|
||||
path: .next/analyze/__bundle_analysis.json
|
||||
|
||||
- name: Download base branch bundle stats
|
||||
uses: dawidd6/action-download-artifact@v2
|
||||
continue-on-error: true
|
||||
if: success() && github.event.number
|
||||
with:
|
||||
workflow: nextjs_bundle_analysis.yml
|
||||
branch: ${{ github.event.pull_request.base.ref }}
|
||||
path: .next/analyze/base
|
||||
|
||||
# And here's the second place - this runs after we have both the current and
|
||||
# base branch bundle stats, and will compare them to determine what changed.
|
||||
# There are two configurable arguments that come from package.json:
|
||||
#
|
||||
# - budget: optional, set a budget (bytes) against which size changes are measured
|
||||
# it's set to 350kb here by default, as informed by the following piece:
|
||||
# https://infrequently.org/2021/03/the-performance-inequality-gap/
|
||||
#
|
||||
# - red-status-percentage: sets the percent size increase where you get a red
|
||||
# status indicator, defaults to 20%
|
||||
#
|
||||
# Either of these arguments can be changed or removed by editing the `nextBundleAnalysis`
|
||||
# entry in your package.json file.
|
||||
- name: Compare with base branch bundle
|
||||
if: success() && github.event.number
|
||||
run: ls -laR .next/analyze/base && npx -p nextjs-bundle-analysis compare
|
||||
|
||||
- name: Get Comment Body
|
||||
id: get-comment-body
|
||||
if: success() && github.event.number
|
||||
# https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#multiline-strings
|
||||
run: |
|
||||
echo "body<<EOF" >> $GITHUB_OUTPUT
|
||||
echo "$(cat .next/analyze/__bundle_analysis_comment.txt)" >> $GITHUB_OUTPUT
|
||||
echo EOF >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Comment
|
||||
uses: marocchino/sticky-pull-request-comment@v2
|
||||
with:
|
||||
header: next-touched-pages
|
||||
message: ${{ steps.get-comment-body.outputs.body }}
|
||||
network: host
|
||||
|
||||
16
.github/workflows/greetings.yml
vendored
Normal file
16
.github/workflows/greetings.yml
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
name: Greetings
|
||||
|
||||
on: [pull_request_target, issues]
|
||||
|
||||
jobs:
|
||||
greeting:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
issues: write
|
||||
pull-requests: write
|
||||
steps:
|
||||
- uses: actions/first-interaction@v1
|
||||
with:
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
issue-message: "Hi 👋. Thank you for submitting your first issue to Homarr. Please ensure that you've opened this issue on the correct repository. Homarr v1 has been moved to github.com/homarr-labs/homarr "
|
||||
pr-message: "Hi 👋. Thank you for making your first contribution to Homarr. Please ensure that you've completed all the points in the TODO checklist. We'll review your changes shortly."
|
||||
28
.github/workflows/stale.yml
vendored
Normal file
28
.github/workflows/stale.yml
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
# This workflow warns and then closes issues and PRs that have had no activity for a specified amount of time.
|
||||
#
|
||||
# You can adjust the behavior by modifying this file.
|
||||
# For more information, see:
|
||||
# https://github.com/actions/stale
|
||||
name: Mark stale issues and pull requests
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: '18 17 * * *'
|
||||
|
||||
jobs:
|
||||
stale:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
issues: write
|
||||
pull-requests: write
|
||||
|
||||
steps:
|
||||
- uses: actions/stale@v5
|
||||
with:
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
stale-issue-message: "Hello 👋, this issue has been open for 60 days without activity. We mark issues to help prioritise and close dead issues. Can you confirm that this issue is still relevant on the latest version? I'll remove the stale label as soon as there is further activity on this issue. Thank you 🙏"
|
||||
stale-pr-message: 'Hello 👋, this PR has gone stale. Please reply to mark it as active.'
|
||||
stale-issue-label: 'Stale'
|
||||
stale-pr-label: 'Stale'
|
||||
days-before-close: -1
|
||||
12
.gitignore
vendored
12
.gitignore
vendored
@@ -4,6 +4,7 @@
|
||||
/node_modules
|
||||
/.pnp
|
||||
.pnp.js
|
||||
/cli/node_modules/
|
||||
|
||||
# testing
|
||||
/coverage
|
||||
@@ -49,10 +50,19 @@ data/configs
|
||||
!.yarn/releases
|
||||
!.yarn/sdks
|
||||
!.yarn/versions
|
||||
/cli/.yarn/
|
||||
|
||||
#envfiles
|
||||
.env
|
||||
|
||||
#Languages other than 'en'
|
||||
public/locales/*
|
||||
!public/locales/en
|
||||
!public/locales/en
|
||||
|
||||
#database
|
||||
sqlite.db
|
||||
database/*.sqlite
|
||||
WILL_BE_OVERWRITTEN.sqlite
|
||||
|
||||
# IDE
|
||||
.idea/*
|
||||
@@ -1,9 +0,0 @@
|
||||
{
|
||||
"printWidth": 100,
|
||||
"tabWidth": 2,
|
||||
"parser": "typescript",
|
||||
"singleQuote": true,
|
||||
"trailingComma": "es5",
|
||||
"useTabs": false,
|
||||
"endOfLine": "lf"
|
||||
}
|
||||
21
.vscode/settings.json
vendored
Normal file
21
.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"i18n-ally.localesPaths": "public/locales",
|
||||
"i18n-ally.enabledFrameworks": [
|
||||
"react-i18next"
|
||||
],
|
||||
"i18n-ally.namespace": true,
|
||||
"i18n-ally.pathMatcher": "{locale}/{namespaces}.json",
|
||||
"i18n-ally.keystyle": "nested",
|
||||
"i18n-ally.keysInUse": [
|
||||
"modules.**",
|
||||
"layout.manage.navigation.**",
|
||||
],
|
||||
"editor.codeActionsOnSave": {
|
||||
"source.organizeImports": "explicit"
|
||||
},
|
||||
"typescript.tsdk": "node_modules/typescript/lib",
|
||||
"explorer.fileNesting.patterns": {
|
||||
"package.json": "pnpm-lock.yaml, yarn.lock, package-lock.json",
|
||||
"*.tsx": "${capture}.module.css"
|
||||
},
|
||||
}
|
||||
53
Dockerfile
53
Dockerfile
@@ -1,21 +1,64 @@
|
||||
FROM node:20-alpine
|
||||
FROM node:20.2.0-slim
|
||||
WORKDIR /app
|
||||
|
||||
# Define node.js environment variables
|
||||
ARG PORT=7575
|
||||
|
||||
ENV NEXT_TELEMETRY_DISABLED 1
|
||||
ENV NODE_ENV production
|
||||
ENV NODE_OPTIONS '--no-experimental-fetch'
|
||||
|
||||
COPY next.config.js ./
|
||||
COPY public ./public
|
||||
COPY package.json ./package.json
|
||||
|
||||
COPY package.json ./temp_package.json
|
||||
COPY yarn.lock ./temp_yarn.lock
|
||||
# Automatically leverage output traces to reduce image size
|
||||
# https://nextjs.org/docs/advanced-features/output-file-tracing
|
||||
COPY .next/standalone ./
|
||||
COPY .next/static ./.next/static
|
||||
COPY ./scripts/run.sh ./scripts/run.sh
|
||||
RUN chmod +x ./scripts/run.sh
|
||||
COPY ./drizzle ./drizzle
|
||||
|
||||
EXPOSE 7575
|
||||
COPY ./drizzle/migrate ./migrate
|
||||
COPY ./tsconfig.json ./migrate/tsconfig.json
|
||||
COPY ./cli ./cli
|
||||
|
||||
RUN mkdir /data
|
||||
|
||||
# Install dependencies
|
||||
RUN apt update && apt install -y openssl wget
|
||||
|
||||
# Move node_modules to temp location to avoid overwriting
|
||||
RUN mv node_modules _node_modules
|
||||
RUN rm package.json
|
||||
# Install dependencies for migration
|
||||
RUN cp ./migrate/package.json ./package.json
|
||||
RUN yarn
|
||||
# Copy better_sqlite3 build for current platform
|
||||
RUN cp /app/node_modules/better-sqlite3/build/Release/better_sqlite3.node /app/_node_modules/better-sqlite3/build/Release/better_sqlite3.node
|
||||
# Copy node_modules for migration to migrate folder for migration script
|
||||
RUN mv node_modules ./migrate/node_modules
|
||||
|
||||
# Copy temp node_modules of app to app folder
|
||||
RUN mv _node_modules node_modules
|
||||
|
||||
RUN echo '#!/bin/bash\nnode /app/cli/cli.js "$@"' > /usr/bin/homarr
|
||||
RUN chmod +x /usr/bin/homarr
|
||||
RUN cd /app/cli && yarn --immutable
|
||||
|
||||
# Expose the default application port
|
||||
EXPOSE $PORT
|
||||
ENV PORT=${PORT}
|
||||
|
||||
ENV DATABASE_URL "file:/data/db.sqlite"
|
||||
ENV AUTH_TRUST_HOST="true"
|
||||
ENV PORT 7575
|
||||
ENV NEXTAUTH_SECRET NOT_IN_USE_BECAUSE_JWTS_ARE_UNUSED
|
||||
|
||||
CMD ["node", "server.js"]
|
||||
HEALTHCHECK --interval=10s --timeout=5s --start-period=5s --retries=3 \
|
||||
CMD wget --no-verbose --tries=1 --spider http://localhost:${PORT} || exit 1
|
||||
|
||||
VOLUME [ "/app/data/configs" ]
|
||||
VOLUME [ "/data" ]
|
||||
ENTRYPOINT ["sh", "./scripts/run.sh"]
|
||||
105
Dockerfile.unraid
Normal file
105
Dockerfile.unraid
Normal file
@@ -0,0 +1,105 @@
|
||||
# Multi-stage Dockerfile for Homarr Unraid UI
|
||||
# Builds entirely inside Docker to avoid native module issues
|
||||
|
||||
# Build stage
|
||||
FROM node:20.2.0-slim AS builder
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# Install build dependencies
|
||||
RUN apt-get update && apt-get install -y \
|
||||
python3 \
|
||||
make \
|
||||
g++ \
|
||||
git \
|
||||
openssl \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Copy package files
|
||||
COPY package.json yarn.lock ./
|
||||
COPY .yarnrc.yml ./
|
||||
COPY .yarn ./.yarn
|
||||
|
||||
# Install dependencies
|
||||
RUN yarn install --immutable
|
||||
|
||||
# Copy source code
|
||||
COPY . .
|
||||
|
||||
# Build the application
|
||||
ENV SKIP_ENV_VALIDATION=1
|
||||
ENV NEXTAUTH_SECRET=build-time-secret
|
||||
ENV DATABASE_URL=file:build.sqlite
|
||||
RUN yarn build
|
||||
|
||||
# Production stage
|
||||
FROM node:20.2.0-slim
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# Define node.js environment variables
|
||||
ARG PORT=7575
|
||||
|
||||
ENV NEXT_TELEMETRY_DISABLED=1
|
||||
ENV NODE_ENV=production
|
||||
ENV NODE_OPTIONS='--no-experimental-fetch'
|
||||
|
||||
# Copy built application from builder
|
||||
COPY --from=builder /app/next.config.js ./
|
||||
COPY --from=builder /app/public ./public
|
||||
COPY --from=builder /app/package.json ./temp_package.json
|
||||
COPY --from=builder /app/yarn.lock ./temp_yarn.lock
|
||||
COPY --from=builder /app/.next/standalone ./
|
||||
COPY --from=builder /app/.next/static ./.next/static
|
||||
COPY --from=builder /app/scripts/run.sh ./scripts/run.sh
|
||||
COPY --from=builder /app/drizzle ./drizzle
|
||||
COPY --from=builder /app/drizzle/migrate ./migrate
|
||||
COPY --from=builder /app/tsconfig.json ./migrate/tsconfig.json
|
||||
COPY --from=builder /app/cli ./cli
|
||||
|
||||
RUN chmod +x ./scripts/run.sh
|
||||
RUN mkdir -p /data
|
||||
|
||||
# Install runtime dependencies
|
||||
RUN apt-get update && apt-get install -y openssl wget && rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Move node_modules to temp location to avoid overwriting
|
||||
RUN mv node_modules _node_modules
|
||||
RUN rm package.json
|
||||
|
||||
# Install dependencies for migration
|
||||
RUN cp ./migrate/package.json ./package.json
|
||||
RUN yarn install --production=false
|
||||
|
||||
# Copy better_sqlite3 build for current platform
|
||||
RUN cp /app/node_modules/better-sqlite3/build/Release/better_sqlite3.node /app/_node_modules/better-sqlite3/build/Release/better_sqlite3.node || true
|
||||
|
||||
# Copy node_modules for migration to migrate folder
|
||||
RUN mv node_modules ./migrate/node_modules
|
||||
|
||||
# Restore app node_modules
|
||||
RUN mv _node_modules node_modules
|
||||
|
||||
# Setup CLI
|
||||
RUN echo '#!/bin/bash\nnode /app/cli/cli.js "$@"' > /usr/bin/homarr
|
||||
RUN chmod +x /usr/bin/homarr
|
||||
RUN cd /app/cli && yarn install --production || true
|
||||
|
||||
# Expose the default application port
|
||||
EXPOSE $PORT
|
||||
ENV PORT=${PORT}
|
||||
|
||||
# Environment defaults
|
||||
ENV DATABASE_URL="file:/data/db.sqlite"
|
||||
ENV AUTH_TRUST_HOST="true"
|
||||
ENV PORT=7575
|
||||
ENV NEXTAUTH_SECRET=NOT_IN_USE_BECAUSE_JWTS_ARE_UNUSED
|
||||
|
||||
# Health check
|
||||
HEALTHCHECK --interval=10s --timeout=5s --start-period=5s --retries=3 \
|
||||
CMD wget --no-verbose --tries=1 --spider http://localhost:${PORT} || exit 1
|
||||
|
||||
VOLUME [ "/app/data/configs" ]
|
||||
VOLUME [ "/data" ]
|
||||
|
||||
ENTRYPOINT ["sh", "./scripts/run.sh"]
|
||||
85
README.md
85
README.md
@@ -1,6 +1,5 @@
|
||||
|
||||
<!-- Project Title -->
|
||||

|
||||
[](https://homarr.dev/)
|
||||
|
||||
<!-- Badges -->
|
||||
<p align="center">
|
||||
@@ -11,7 +10,7 @@
|
||||
<a href="https://github.com/ajnart/homarr/actions/workflows/docker.yml">
|
||||
<img title="Docker CI Status" src="https://github.com/ajnart/homarr/actions/workflows/docker.yml/badge.svg" alt="CI Status">
|
||||
</a>
|
||||
<a href=https://crowdin.com/project/homarr>
|
||||
<a href=https://translate.homarr.dev/>
|
||||
<img title="Translations" src="https://badges.crowdin.net/homarr/localized.svg" />
|
||||
</a>
|
||||
<a href="https://discord.gg/aCsmEV5RgA">
|
||||
@@ -25,10 +24,10 @@
|
||||
<strong>Demo ✨</strong>
|
||||
</a>
|
||||
•
|
||||
<a href="https://homarr.dev/docs/introduction/installation">
|
||||
<a href="https://homarr.dev/docs/getting-started/">
|
||||
<strong>Install 💻</strong>
|
||||
</a> •
|
||||
<a href="https://crowdin.com/project/homarr">
|
||||
<a href="https://translate.homarr.dev/">
|
||||
<strong>Translations 🈺</strong>
|
||||
</a> •
|
||||
<a href="https://discord.com/invite/aCsmEV5RgA">
|
||||
@@ -41,7 +40,14 @@ Simplify the management of your server with Homarr - a sleek, modern dashboard t
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||

|
||||
|
||||
> [!IMPORTANT]
|
||||
> # The Homarr repository has been moved to [HomarrLabs](https://github.com/homarr-labs/homarr)
|
||||
> # Please create issues related to 1.0 there. This repository will be archived once the 1.0 is fully polished.
|
||||
> # 1.0 is a complete rewrite and to migrate you have to change your compose file. Please follow the [Migration Guide](https://homarr.dev/blog/2025/01/19/migration-guide-1.0) and read the [Breaking Changes](https://homarr.dev/blog/2024/09/23/version-1.0#breaking-changes)
|
||||
|
||||
|
||||
[](https://homarr.dev/)
|
||||
|
||||
- 🖌️ Highly customizable with an extensive drag and drop grid system
|
||||
- ✨ Integrates seamlessly with your favorite self-hosted applications
|
||||
@@ -53,59 +59,71 @@ Simplify the management of your server with Homarr - a sleek, modern dashboard t
|
||||
- 🦞 Comprehensive built-in icon picker with over 7000 icons
|
||||
- 🐳 Easy deployment with Docker, unRAID, and Synology
|
||||
- 🚀 Compatible with any major consumer hardware (x86, Raspberry Pi, old laptops, ...)
|
||||
- 💵 Free and Open-Source - your data stays on your device. No telemetry data.
|
||||
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||

|
||||
[](https://homarr.dev/docs/category/widgets)
|
||||
|
||||
Homarr has a [built-in collection of widgets and integrations](https://homarr.dev/docs/integrations/), that connect to your applications and enable you to control them directly from the dashboard.
|
||||
Each widget and integration has a comprehensive documentation for your comfort.
|
||||
Homarr will integrate with the following applications of yours:
|
||||
Homarr has a [built-in collection of widgets and integrations](https://homarr.dev/docs/category/integrations), that connect to your applications and enable you to control them directly from the dashboard.
|
||||
Each widget and integration has a comprehensive documentation
|
||||
Homarr will integrate with the following applications:
|
||||
|
||||
- 📥 Torrent clients
|
||||
- [Deluge](https://homarr.dev/docs/integrations/#deluge)
|
||||
- [Transmission](https://homarr.dev/docs/integrations/#transmission)
|
||||
- [qBittorent](https://homarr.dev/docs/integrations/#qbittorrent-integration)
|
||||
- 📥 Usenet clients
|
||||
- [SABnzbd](https://homarr.dev/docs/integrations/#sabnzbd)
|
||||
- [NZBGet](https://homarr.dev/docs/integrations/#nzbget)
|
||||
- 📚 Media collection managers
|
||||
- [Sonarr](https://homarr.dev/docs/integrations/#sonarr)
|
||||
- [Radarr](https://homarr.dev/docs/integrations/#radarr)
|
||||
- [Lidarr](https://homarr.dev/docs/integrations/#lidarr)
|
||||
- [Readarr](https://homarr.dev/docs/integrations/#readarr)
|
||||
- 🎞️ Media request managers
|
||||
- [Overseerr](https://homarr.dev/docs/integrations/#overseerr--jellyseerr)
|
||||
- [Jellyseerr](https://homarr.dev/docs/integrations/#overseerr--jellyseerr)
|
||||
- 🔌 [Dash.](https://homarr.dev/docs/integrations/#dash)
|
||||
- 🐳 [Docker](https://homarr.dev/docs/integrations/#docker)
|
||||
📥 Torrent clients
|
||||
- [Deluge](https://homarr.dev/docs/integrations/torrent#deluge)
|
||||
- [Transmission](https://homarr.dev/docs/integrations/torrent#transmission)
|
||||
- [qBittorent](https://homarr.dev/docs/integrations/torrent#qbittorrent-integration)
|
||||
|
||||
📥 Usenet clients
|
||||
- [SABnzbd](https://homarr.dev/docs/integrations/usenet#sabnzbd)
|
||||
- [NZBGet](https://homarr.dev/docs/integrations/usenet#nzbget)
|
||||
|
||||
📺 Media servers
|
||||
- [Plex](https://homarr.dev/docs/integrations/media-server/#plex)
|
||||
- [Jellyfin](https://homarr.dev/docs/integrations/media-server#jellyfin-and-emby)
|
||||
|
||||
📚 Media collection managers
|
||||
- [Sonarr](https://homarr.dev/docs/integrations/servarr#sonarr)
|
||||
- [Radarr](https://homarr.dev/docs/integrations/servarr#radarr)
|
||||
- [Lidarr](https://homarr.dev/docs/integrations/servarr#lidarr)
|
||||
- [Readarr](https://homarr.dev/docs/integrations/servarr#readarr)
|
||||
|
||||
🎞️ Media request managers
|
||||
- [Overseerr](https://homarr.dev/docs/integrations/media-requester)
|
||||
- [Jellyseerr](https://homarr.dev/docs/integrations/media-requester)
|
||||
|
||||
🚫 DNS ad-blockers
|
||||
- [Pihole](https://homarr.dev/docs/integrations/dns#pihole)
|
||||
- [AdGuard Home](https://homarr.dev/docs/integrations/dns#adguard-home)
|
||||
|
||||
Other integrations
|
||||
- [🔌 Dash.](https://homarr.dev/docs/integrations/hardware)
|
||||
- [🐳 Docker](https://homarr.dev/docs/integrations/containers)
|
||||
|
||||
We're constantly adding new integrations and widgets, which will enhance your experience even further.
|
||||
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||

|
||||
[](https://demo.homarr.dev/)
|
||||
|
||||
https://user-images.githubusercontent.com/30572287/217098893-5880e7de-13d0-42c5-b505-f7921593396f.mp4
|
||||
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||

|
||||
[](https://homarr.dev/docs/category/installation-1)
|
||||
|
||||
Since we are updating Homarr very frequently, we recommend reading our official installation guides:
|
||||
|
||||
<a href="https://homarr.dev/docs/introduction/installation">
|
||||
<a href="https://homarr.dev/docs/category/installation-1">
|
||||
<img src="docs/installation-button.png" width="200" />
|
||||
</a>
|
||||
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||

|
||||
[](https://github.com/ajnart/homarr/blob/dev/CONTRIBUTING.md)
|
||||
Homarr is maintained by motivated developers in their free-time.
|
||||
We work for fun and learning on this project.
|
||||
|
||||
@@ -121,3 +139,6 @@ You can also support us by helping with [translating the entire project](https:/
|
||||
**Please read our [Contribution Guidelines](/CONTRIBUTING.md)**
|
||||
|
||||
All contributions, regardless of their size or scope, are welcome and highly appreciated! Thank you ❤️
|
||||
|
||||

|
||||
[](https://argos-ci.com?utm_source=%5Bhomarr%5D&utm_campaign=oss)
|
||||
|
||||
18
SECURITY.md
Normal file
18
SECURITY.md
Normal file
@@ -0,0 +1,18 @@
|
||||
# Security Policy
|
||||
|
||||
## Supported Versions
|
||||
Only the following versions will receive updates, that include improvements to the security:
|
||||
|
||||
| Version | Supported |
|
||||
| ------- | ------------------ |
|
||||
| 0.13 | :white_check_mark: |
|
||||
| <=0.12 | :x: |
|
||||
|
||||
## Reporting a Vulnerability
|
||||
We take security issues very seriously.
|
||||
When you found a security issue, please ask yourself the following question:
|
||||
|
||||
**Would this be publicly disclosed, could it cause any problems or harm to any Homarr instances or individuals?**
|
||||
|
||||
If the answer to that question is yes, please contact us immideatly using [this link](https://homarr.dev/docs/community/get-in-touch). E-Mail is preferred, but you can write ``manicraft1001`` or ``ajnart`` on Discord as well.
|
||||
If the answer is no, please create a public visible issue: [Vulnerability](https://github.com/ajnart/homarr/issues/new?assignees=&labels=%F0%9F%90%9B+Bug&projects=&template=bug.yml&title=)
|
||||
@@ -1,44 +0,0 @@
|
||||
import { defineConfig } from 'checkly'
|
||||
|
||||
/**
|
||||
* See https://www.checklyhq.com/docs/cli/project-structure/
|
||||
*/
|
||||
const config = defineConfig({
|
||||
/* A human friendly name for your project */
|
||||
projectName: 'homarr',
|
||||
/** A logical ID that needs to be unique across your Checkly account,
|
||||
* See https://www.checklyhq.com/docs/cli/constructs/ to learn more about logical IDs.
|
||||
*/
|
||||
logicalId: 'homarr',
|
||||
/* An optional URL to your Git repo */
|
||||
repoUrl: 'https://github.com/checkly/checkly-cli',
|
||||
/* Sets default values for Checks */
|
||||
checks: {
|
||||
/* A default for how often your Check should run in minutes */
|
||||
frequency: 10,
|
||||
/* Checkly data centers to run your Checks as monitors */
|
||||
locations: ['us-east-1', 'eu-west-1'],
|
||||
/* An optional array of tags to organize your Checks */
|
||||
tags: ['mac'],
|
||||
/** The Checkly Runtime identifier, determining npm packages and the Node.js version available at runtime.
|
||||
* See https://www.checklyhq.com/docs/cli/npm-packages/
|
||||
*/
|
||||
runtimeId: '2023.02',
|
||||
/* A glob pattern that matches the Checks inside your repo, see https://www.checklyhq.com/docs/cli/using-check-test-match/ */
|
||||
checkMatch: '**/__checks__/**/*.check.ts',
|
||||
browserChecks: {
|
||||
/* A glob pattern matches any Playwright .spec.ts files and automagically creates a Browser Check. This way, you
|
||||
* can just write native Playwright code. See https://www.checklyhq.com/docs/cli/using-check-test-match/
|
||||
* */
|
||||
testMatch: '**/__checks__/**/*.spec.ts',
|
||||
},
|
||||
},
|
||||
cli: {
|
||||
/* The default datacenter location to use when running npx checkly test */
|
||||
runLocation: 'eu-west-1',
|
||||
/* An array of default reporters to use when a reporter is not specified with the "--reporter" flag */
|
||||
reporters: ['list'],
|
||||
},
|
||||
})
|
||||
|
||||
export default config
|
||||
30
cli/cli.js
Normal file
30
cli/cli.js
Normal file
@@ -0,0 +1,30 @@
|
||||
import yargs from 'yargs';
|
||||
|
||||
import { resetPasswordForOwner } from './commands/reset-owner-password.js';
|
||||
import { resetPasswordForUsername } from './commands/reset-password.js';
|
||||
|
||||
yargs(process.argv.slice(2))
|
||||
.scriptName('homarr')
|
||||
.usage('$0 <cmd> [args]')
|
||||
.command('reset-owner-password', 'Resets the current owner password without UI access', async () => {
|
||||
await resetPasswordForOwner();
|
||||
})
|
||||
.command(
|
||||
'reset-password',
|
||||
'Reset the password of a specific user without UI access',
|
||||
(yargs) => {
|
||||
yargs.option('username', {
|
||||
type: 'string',
|
||||
describe: 'Username of user',
|
||||
demandOption: true
|
||||
});
|
||||
},
|
||||
async (argv) => {
|
||||
await resetPasswordForUsername(argv.username);
|
||||
}
|
||||
)
|
||||
.version(false)
|
||||
.showHelpOnFail(true)
|
||||
.alias('h', 'help')
|
||||
.demandCommand()
|
||||
.help().argv;
|
||||
55
cli/commands/reset-owner-password.js
Normal file
55
cli/commands/reset-owner-password.js
Normal file
@@ -0,0 +1,55 @@
|
||||
import bcrypt from 'bcryptjs';
|
||||
|
||||
import Database from 'better-sqlite3';
|
||||
|
||||
import boxen from 'boxen';
|
||||
|
||||
import chalk from 'chalk';
|
||||
|
||||
import Consola from 'consola';
|
||||
|
||||
import crypto from 'crypto';
|
||||
|
||||
import { sql } from 'drizzle-orm';
|
||||
import { drizzle } from 'drizzle-orm/better-sqlite3';
|
||||
|
||||
export async function resetPasswordForOwner() {
|
||||
if (!process.env.DATABASE_URL) {
|
||||
Consola.error('Unable to connect to database due to missing database URL environment variable');
|
||||
return;
|
||||
}
|
||||
|
||||
Consola.info('Connecting to the database...');
|
||||
const sqlite = new Database(process.env.DATABASE_URL.replace('file:', ''));
|
||||
const db = drizzle(sqlite);
|
||||
|
||||
Consola.info('Connected to the database ' + chalk.green('✓'));
|
||||
Consola.info('Generating new random password...');
|
||||
|
||||
const newPassword = crypto.randomUUID();
|
||||
const salt = bcrypt.genSaltSync(10);
|
||||
const hashedPassword = bcrypt.hashSync(newPassword, salt);
|
||||
|
||||
try {
|
||||
await db.transaction((tx) => {
|
||||
tx.run(
|
||||
sql`DELETE FROM session WHERE userId = (SELECT id FROM user WHERE is_owner = 1 LIMIT 1)`
|
||||
);
|
||||
tx.run(sql`UPDATE user SET password = ${hashedPassword} WHERE is_owner = 1 LIMIT 1;`);
|
||||
});
|
||||
console.log(
|
||||
boxen(`New owner password is '${chalk.red(newPassword)}'. You can now log in with this password.\nExising sessions have been destroyed and need to login again with the new passowrd.`, {
|
||||
dimBorder: true,
|
||||
borderStyle: 'round',
|
||||
padding: {
|
||||
left: 1,
|
||||
right: 1
|
||||
}
|
||||
})
|
||||
);
|
||||
} catch (err) {
|
||||
Consola.error('Failed to update password', err);
|
||||
} finally {
|
||||
Consola.info('Command has completed');
|
||||
}
|
||||
}
|
||||
56
cli/commands/reset-password.js
Normal file
56
cli/commands/reset-password.js
Normal file
@@ -0,0 +1,56 @@
|
||||
import bcrypt from 'bcryptjs';
|
||||
|
||||
import Database from 'better-sqlite3';
|
||||
|
||||
import Consola from 'consola';
|
||||
|
||||
import crypto from 'crypto';
|
||||
|
||||
import boxen from 'boxen';
|
||||
|
||||
import chalk from 'chalk';
|
||||
|
||||
import { sql } from 'drizzle-orm';
|
||||
import { drizzle } from 'drizzle-orm/better-sqlite3';
|
||||
|
||||
export async function resetPasswordForUsername(username) {
|
||||
if (!process.env.DATABASE_URL) {
|
||||
Consola.error('Unable to connect to database due to missing database URL environment variable');
|
||||
return;
|
||||
}
|
||||
|
||||
Consola.info('Connecting to the database...');
|
||||
const sqlite = new Database(process.env.DATABASE_URL.replace('file:', ''));
|
||||
const db = drizzle(sqlite);
|
||||
|
||||
Consola.info('Generating new random password...');
|
||||
|
||||
const newPassword = crypto.randomUUID();
|
||||
const salt = bcrypt.genSaltSync(10);
|
||||
const hashedPassword = bcrypt.hashSync(newPassword, salt);
|
||||
|
||||
Consola.info(`Updating password for user '${username}'`);
|
||||
|
||||
try {
|
||||
await db.transaction((tx) => {
|
||||
tx.run(
|
||||
sql`DELETE FROM session WHERE userId = (SELECT id FROM user WHERE name = ${username} LIMIT 1)`
|
||||
);
|
||||
tx.run(sql`UPDATE user SET password = ${hashedPassword} WHERE id = (SELECT id FROM user WHERE name = ${username} LIMIT 1) LIMIT 1`);
|
||||
});
|
||||
console.log(
|
||||
boxen(`New password for '${username}' is '${chalk.red(newPassword)}'. You can now log in with this password.\nExising sessions have been destroyed and need to login again with the new passowrd.`, {
|
||||
dimBorder: true,
|
||||
borderStyle: 'round',
|
||||
padding: {
|
||||
left: 1,
|
||||
right: 1
|
||||
}
|
||||
})
|
||||
);
|
||||
} catch (err) {
|
||||
Consola.error('Failed to update password', err);
|
||||
} finally {
|
||||
Consola.info('Command has completed');
|
||||
}
|
||||
}
|
||||
12
cli/package.json
Normal file
12
cli/package.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"bcryptjs": "^2.4.3",
|
||||
"better-sqlite3": "^8.6.0",
|
||||
"boxen": "^7.1.1",
|
||||
"chalk": "^5.3.0",
|
||||
"consola": "^3.0.0",
|
||||
"drizzle-orm": "^0.28.6",
|
||||
"yargs": "^17.7.2"
|
||||
},
|
||||
"type": "module"
|
||||
}
|
||||
1371
cli/yarn.lock
Normal file
1371
cli/yarn.lock
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,3 +1,5 @@
|
||||
project_id: "534422"
|
||||
api_token_env: "CROWDIN_PERSONAL_TOKEN"
|
||||
files:
|
||||
- source: /public/locales/en/**/*.json
|
||||
translation: /public/locales/%two_letters_code%/**/%original_file_name%
|
||||
|
||||
@@ -1,389 +1,513 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"configProperties": {
|
||||
"name": "default"
|
||||
},
|
||||
"categories": [
|
||||
{
|
||||
"id": "47af36c0-47c1-4e5b-bfc7-ad645ee6a33f",
|
||||
"position": 1,
|
||||
"name": "Welcome to Homarr 🎉",
|
||||
"type": "category"
|
||||
}
|
||||
],
|
||||
"wrappers": [
|
||||
{
|
||||
"id": "default",
|
||||
"position": 0
|
||||
},
|
||||
{
|
||||
"id": "47af36c0-47c1-4e5b-bfc7-ad645ee6a326",
|
||||
"position": 1
|
||||
}
|
||||
],
|
||||
"apps": [
|
||||
{
|
||||
"id": "47af36c0-47c1-4e5b-bfc7-ad645ee6a337",
|
||||
"name": "Discord",
|
||||
"url": "https://discord.com/invite/aCsmEV5RgA",
|
||||
"behaviour": {
|
||||
"onClickUrl": "https://discord.com/invite/aCsmEV5RgA",
|
||||
"isOpeningNewTab": true,
|
||||
"externalUrl": "https://discord.com/invite/aCsmEV5RgA"
|
||||
},
|
||||
"network": {
|
||||
"enabledStatusChecker": false,
|
||||
"statusCodes": [
|
||||
"200"
|
||||
]
|
||||
},
|
||||
"appearance": {
|
||||
"iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/discord.png"
|
||||
},
|
||||
"integration": {
|
||||
"type": null,
|
||||
"properties": []
|
||||
},
|
||||
"area": {
|
||||
"type": "category",
|
||||
"properties": {
|
||||
"id": "47af36c0-47c1-4e5b-bfc7-ad645ee6a33f"
|
||||
}
|
||||
},
|
||||
"shape": {
|
||||
"md": {
|
||||
"location": {
|
||||
"x": 3,
|
||||
"y": 1
|
||||
},
|
||||
"size": {
|
||||
"width": 3,
|
||||
"height": 1
|
||||
}
|
||||
},
|
||||
"sm": {
|
||||
"location": {
|
||||
"x": 2,
|
||||
"y": 1
|
||||
},
|
||||
"size": {
|
||||
"width": 1,
|
||||
"height": 1
|
||||
}
|
||||
},
|
||||
"lg": {
|
||||
"location": {
|
||||
"x": 2,
|
||||
"y": 1
|
||||
},
|
||||
"size": {
|
||||
"width": 1,
|
||||
"height": 1
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "47af36c0-47c1-4e5b-bfc7-ad645ee6a990",
|
||||
"name": "Donate",
|
||||
"url": "https://ko-fi.com/ajnart",
|
||||
"behaviour": {
|
||||
"onClickUrl": "https://ko-fi.com/ajnart",
|
||||
"externalUrl": "https://ko-fi.com/ajnart",
|
||||
"isOpeningNewTab": true
|
||||
},
|
||||
"network": {
|
||||
"enabledStatusChecker": false,
|
||||
"statusCodes": [
|
||||
"200"
|
||||
]
|
||||
},
|
||||
"appearance": {
|
||||
"iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/ko-fi.png"
|
||||
},
|
||||
"integration": {
|
||||
"type": null,
|
||||
"properties": []
|
||||
},
|
||||
"area": {
|
||||
"type": "category",
|
||||
"properties": {
|
||||
"id": "47af36c0-47c1-4e5b-bfc7-ad645ee6a33f"
|
||||
}
|
||||
},
|
||||
"shape": {
|
||||
"md": {
|
||||
"location": {
|
||||
"x": 2,
|
||||
"y": 1
|
||||
},
|
||||
"size": {
|
||||
"width": 1,
|
||||
"height": 1
|
||||
}
|
||||
},
|
||||
"sm": {
|
||||
"location": {
|
||||
"x": 2,
|
||||
"y": 2
|
||||
},
|
||||
"size": {
|
||||
"width": 1,
|
||||
"height": 1
|
||||
}
|
||||
},
|
||||
"lg": {
|
||||
"location": {
|
||||
"x": 3,
|
||||
"y": 1
|
||||
},
|
||||
"size": {
|
||||
"width": 1,
|
||||
"height": 1
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "47af36c0-47c1-4e5b-bfc7-ad645ee6a330",
|
||||
"name": "Contribute",
|
||||
"url": "https://github.com/ajnart/homarr",
|
||||
"behaviour": {
|
||||
"onClickUrl": "https://github.com/ajnart/homarr",
|
||||
"externalUrl": "https://github.com/ajnart/homarr",
|
||||
"isOpeningNewTab": true
|
||||
},
|
||||
"network": {
|
||||
"enabledStatusChecker": false,
|
||||
"statusCodes": []
|
||||
},
|
||||
"appearance": {
|
||||
"iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/github.png"
|
||||
},
|
||||
"integration": {
|
||||
"type": null,
|
||||
"properties": []
|
||||
},
|
||||
"area": {
|
||||
"type": "category",
|
||||
"properties": {
|
||||
"id": "47af36c0-47c1-4e5b-bfc7-ad645ee6a33f"
|
||||
}
|
||||
},
|
||||
"shape": {
|
||||
"md": {
|
||||
"location": {
|
||||
"x": 2,
|
||||
"y": 0
|
||||
},
|
||||
"size": {
|
||||
"width": 2,
|
||||
"height": 1
|
||||
}
|
||||
},
|
||||
"sm": {
|
||||
"location": {
|
||||
"x": 0,
|
||||
"y": 2
|
||||
},
|
||||
"size": {
|
||||
"width": 2,
|
||||
"height": 1
|
||||
}
|
||||
},
|
||||
"lg": {
|
||||
"location": {
|
||||
"x": 4,
|
||||
"y": 0
|
||||
},
|
||||
"size": {
|
||||
"width": 2,
|
||||
"height": 2
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "5df743d9-5cb1-457c-85d2-64ff86855652",
|
||||
"name": "Documentation",
|
||||
"url": "https://homarr.dev",
|
||||
"behaviour": {
|
||||
"onClickUrl": "https://homarr.dev",
|
||||
"externalUrl": "https://homarr.dev",
|
||||
"isOpeningNewTab": true
|
||||
},
|
||||
"network": {
|
||||
"enabledStatusChecker": false,
|
||||
"statusCodes": [
|
||||
"200"
|
||||
]
|
||||
},
|
||||
"appearance": {
|
||||
"iconUrl": "/imgs/logo/logo.png"
|
||||
},
|
||||
"integration": {
|
||||
"type": null,
|
||||
"properties": []
|
||||
},
|
||||
"area": {
|
||||
"type": "category",
|
||||
"properties": {
|
||||
"id": "47af36c0-47c1-4e5b-bfc7-ad645ee6a33f"
|
||||
}
|
||||
},
|
||||
"shape": {
|
||||
"md": {
|
||||
"location": {
|
||||
"x": 0,
|
||||
"y": 1
|
||||
},
|
||||
"size": {
|
||||
"width": 2,
|
||||
"height": 1
|
||||
}
|
||||
},
|
||||
"sm": {
|
||||
"location": {
|
||||
"x": 0,
|
||||
"y": 0
|
||||
},
|
||||
"size": {
|
||||
"width": 1,
|
||||
"height": 1
|
||||
}
|
||||
},
|
||||
"lg": {
|
||||
"location": {
|
||||
"x": 0,
|
||||
"y": 1
|
||||
},
|
||||
"size": {
|
||||
"width": 2,
|
||||
"height": 1
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"widgets": [
|
||||
{
|
||||
"id": "971aa859-8570-49a1-8d34-dd5c7b3638d1",
|
||||
"type": "date",
|
||||
"properties": {
|
||||
"display24HourFormat": true
|
||||
},
|
||||
"area": {
|
||||
"type": "category",
|
||||
"properties": {
|
||||
"id": "47af36c0-47c1-4e5b-bfc7-ad645ee6a33f"
|
||||
}
|
||||
},
|
||||
"shape": {
|
||||
"sm": {
|
||||
"location": {
|
||||
"x": 0,
|
||||
"y": 1
|
||||
},
|
||||
"size": {
|
||||
"width": 2,
|
||||
"height": 1
|
||||
}
|
||||
},
|
||||
"md": {
|
||||
"location": {
|
||||
"x": 4,
|
||||
"y": 0
|
||||
},
|
||||
"size": {
|
||||
"width": 2,
|
||||
"height": 1
|
||||
}
|
||||
},
|
||||
"lg": {
|
||||
"location": {
|
||||
"x": 2,
|
||||
"y": 0
|
||||
},
|
||||
"size": {
|
||||
"width": 2,
|
||||
"height": 1
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "e3004052-6b83-480e-b458-56e8ccdca5f0",
|
||||
"type": "weather",
|
||||
"properties": {
|
||||
"displayInFahrenheit": false,
|
||||
"location": "Paris"
|
||||
},
|
||||
"area": {
|
||||
"type": "category",
|
||||
"properties": {
|
||||
"id": "47af36c0-47c1-4e5b-bfc7-ad645ee6a33f"
|
||||
}
|
||||
},
|
||||
"shape": {
|
||||
"md": {
|
||||
"location": {
|
||||
"x": 0,
|
||||
"y": 0
|
||||
},
|
||||
"size": {
|
||||
"width": 2,
|
||||
"height": 1
|
||||
}
|
||||
},
|
||||
"sm": {
|
||||
"location": {
|
||||
"x": 1,
|
||||
"y": 0
|
||||
},
|
||||
"size": {
|
||||
"width": 2,
|
||||
"height": 1
|
||||
}
|
||||
},
|
||||
"lg": {
|
||||
"location": {
|
||||
"x": 0,
|
||||
"y": 0
|
||||
},
|
||||
"size": {
|
||||
"width": 2,
|
||||
"height": 1
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"settings": {
|
||||
"common": {
|
||||
"searchEngine": {
|
||||
"type": "google",
|
||||
"properties": {}
|
||||
}
|
||||
},
|
||||
"customization": {
|
||||
"layout": {
|
||||
"enabledLeftSidebar": false,
|
||||
"enabledRightSidebar": false,
|
||||
"enabledDocker": false,
|
||||
"enabledPing": false,
|
||||
"enabledSearchbar": true
|
||||
},
|
||||
"pageTitle": "Homarr v0.12 ⭐️",
|
||||
"logoImageUrl": "/imgs/logo/logo.png",
|
||||
"faviconUrl": "/imgs/favicon/favicon-squared.png",
|
||||
"backgroundImageUrl": "",
|
||||
"customCss": "",
|
||||
"colors": {
|
||||
"primary": "red",
|
||||
"secondary": "yellow",
|
||||
"shade": 7
|
||||
},
|
||||
"appOpacity": 100
|
||||
}
|
||||
"schemaVersion": 1,
|
||||
"configProperties": {
|
||||
"name": "default"
|
||||
},
|
||||
"categories": [],
|
||||
"wrappers": [
|
||||
{
|
||||
"id": "default",
|
||||
"position": 0
|
||||
}
|
||||
],
|
||||
"apps": [
|
||||
{
|
||||
"id": "5df743d9-5cb1-457c-85d2-64ff86855652",
|
||||
"name": "Documentation",
|
||||
"url": "https://homarr.dev",
|
||||
"behaviour": {
|
||||
"onClickUrl": "https://homarr.dev",
|
||||
"externalUrl": "https://homarr.dev",
|
||||
"isOpeningNewTab": true
|
||||
},
|
||||
"network": {
|
||||
"enabledStatusChecker": false,
|
||||
"statusCodes": [
|
||||
"200"
|
||||
]
|
||||
},
|
||||
"appearance": {
|
||||
"iconUrl": "/imgs/logo/logo.png",
|
||||
"appNameStatus": "normal",
|
||||
"positionAppName": "column",
|
||||
"lineClampAppName": 1
|
||||
},
|
||||
"integration": {
|
||||
"type": null,
|
||||
"properties": []
|
||||
},
|
||||
"area": {
|
||||
"type": "wrapper",
|
||||
"properties": {
|
||||
"id": "default"
|
||||
}
|
||||
},
|
||||
"shape": {
|
||||
"md": {
|
||||
"location": {
|
||||
"x": 5,
|
||||
"y": 1
|
||||
},
|
||||
"size": {
|
||||
"width": 1,
|
||||
"height": 1
|
||||
}
|
||||
},
|
||||
"sm": {
|
||||
"location": {
|
||||
"x": 0,
|
||||
"y": 1
|
||||
},
|
||||
"size": {
|
||||
"width": 1,
|
||||
"height": 2
|
||||
}
|
||||
},
|
||||
"lg": {
|
||||
"location": {
|
||||
"x": 6,
|
||||
"y": 1
|
||||
},
|
||||
"size": {
|
||||
"width": 2,
|
||||
"height": 2
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "47af36c0-47c1-4e5b-bfc7-ad645ee6a337",
|
||||
"name": "Discord",
|
||||
"url": "https://discord.com/invite/aCsmEV5RgA",
|
||||
"behaviour": {
|
||||
"onClickUrl": "https://discord.com/invite/aCsmEV5RgA",
|
||||
"isOpeningNewTab": true,
|
||||
"externalUrl": "https://discord.com/invite/aCsmEV5RgA",
|
||||
"tooltipDescription": "Join our Discord server! We're waiting for your ideas and feedback. "
|
||||
},
|
||||
"network": {
|
||||
"enabledStatusChecker": false,
|
||||
"statusCodes": [
|
||||
"200"
|
||||
]
|
||||
},
|
||||
"appearance": {
|
||||
"iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/discord.png",
|
||||
"appNameStatus": "normal",
|
||||
"positionAppName": "row-reverse",
|
||||
"lineClampAppName": 1
|
||||
},
|
||||
"integration": {
|
||||
"type": null,
|
||||
"properties": []
|
||||
},
|
||||
"area": {
|
||||
"type": "wrapper",
|
||||
"properties": {
|
||||
"id": "default"
|
||||
}
|
||||
},
|
||||
"shape": {
|
||||
"md": {
|
||||
"location": {
|
||||
"x": 3,
|
||||
"y": 1
|
||||
},
|
||||
"size": {
|
||||
"width": 1,
|
||||
"height": 1
|
||||
}
|
||||
},
|
||||
"sm": {
|
||||
"location": {
|
||||
"x": 1,
|
||||
"y": 4
|
||||
},
|
||||
"size": {
|
||||
"width": 1,
|
||||
"height": 1
|
||||
}
|
||||
},
|
||||
"lg": {
|
||||
"location": {
|
||||
"x": 4,
|
||||
"y": 0
|
||||
},
|
||||
"size": {
|
||||
"width": 2,
|
||||
"height": 1
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "47af36c0-47c1-4e5b-bfc7-ad645ee6a330",
|
||||
"name": "Contribute",
|
||||
"url": "https://github.com/ajnart/homarr",
|
||||
"behaviour": {
|
||||
"onClickUrl": "https://github.com/ajnart/homarr",
|
||||
"externalUrl": "https://github.com/ajnart/homarr",
|
||||
"isOpeningNewTab": true,
|
||||
"tooltipDescription": ""
|
||||
},
|
||||
"network": {
|
||||
"enabledStatusChecker": false,
|
||||
"statusCodes": []
|
||||
},
|
||||
"appearance": {
|
||||
"iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/github.png",
|
||||
"appNameStatus": "normal",
|
||||
"positionAppName": "row-reverse",
|
||||
"lineClampAppName": 2
|
||||
},
|
||||
"integration": {
|
||||
"type": null,
|
||||
"properties": []
|
||||
},
|
||||
"area": {
|
||||
"type": "wrapper",
|
||||
"properties": {
|
||||
"id": "default"
|
||||
}
|
||||
},
|
||||
"shape": {
|
||||
"md": {
|
||||
"location": {
|
||||
"x": 3,
|
||||
"y": 2
|
||||
},
|
||||
"size": {
|
||||
"width": 2,
|
||||
"height": 1
|
||||
}
|
||||
},
|
||||
"sm": {
|
||||
"location": {
|
||||
"x": 1,
|
||||
"y": 3
|
||||
},
|
||||
"size": {
|
||||
"width": 2,
|
||||
"height": 1
|
||||
}
|
||||
},
|
||||
"lg": {
|
||||
"location": {
|
||||
"x": 2,
|
||||
"y": 0
|
||||
},
|
||||
"size": {
|
||||
"width": 2,
|
||||
"height": 1
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "47af36c0-47c1-4e5b-bfc7-ad645ee6a990",
|
||||
"name": "Donate",
|
||||
"url": "https://ko-fi.com/ajnart",
|
||||
"behaviour": {
|
||||
"onClickUrl": "https://ko-fi.com/ajnart",
|
||||
"externalUrl": "https://ko-fi.com/ajnart",
|
||||
"isOpeningNewTab": true,
|
||||
"tooltipDescription": "Please consider making a donation"
|
||||
},
|
||||
"network": {
|
||||
"enabledStatusChecker": false,
|
||||
"statusCodes": [
|
||||
"200"
|
||||
]
|
||||
},
|
||||
"appearance": {
|
||||
"iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/ko-fi.png",
|
||||
"appNameStatus": "normal",
|
||||
"positionAppName": "row-reverse",
|
||||
"lineClampAppName": 1
|
||||
},
|
||||
"integration": {
|
||||
"type": null,
|
||||
"properties": []
|
||||
},
|
||||
"area": {
|
||||
"type": "wrapper",
|
||||
"properties": {
|
||||
"id": "default"
|
||||
}
|
||||
},
|
||||
"shape": {
|
||||
"md": {
|
||||
"location": {
|
||||
"x": 4,
|
||||
"y": 1
|
||||
},
|
||||
"size": {
|
||||
"width": 1,
|
||||
"height": 1
|
||||
}
|
||||
},
|
||||
"sm": {
|
||||
"location": {
|
||||
"x": 2,
|
||||
"y": 4
|
||||
},
|
||||
"size": {
|
||||
"width": 1,
|
||||
"height": 1
|
||||
}
|
||||
},
|
||||
"lg": {
|
||||
"location": {
|
||||
"x": 6,
|
||||
"y": 0
|
||||
},
|
||||
"size": {
|
||||
"width": 2,
|
||||
"height": 1
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"widgets": [
|
||||
{
|
||||
"id": "e3004052-6b83-480e-b458-56e8ccdca5f0",
|
||||
"type": "weather",
|
||||
"properties": {
|
||||
"displayInFahrenheit": false,
|
||||
"location": {
|
||||
"name": "Paris",
|
||||
"latitude": 48.85341,
|
||||
"longitude": 2.3488
|
||||
},
|
||||
"displayCityName": true
|
||||
},
|
||||
"area": {
|
||||
"type": "wrapper",
|
||||
"properties": {
|
||||
"id": "default"
|
||||
}
|
||||
},
|
||||
"shape": {
|
||||
"md": {
|
||||
"location": {
|
||||
"x": 5,
|
||||
"y": 0
|
||||
},
|
||||
"size": {
|
||||
"width": 1,
|
||||
"height": 1
|
||||
}
|
||||
},
|
||||
"sm": {
|
||||
"location": {
|
||||
"x": 2,
|
||||
"y": 0
|
||||
},
|
||||
"size": {
|
||||
"width": 1,
|
||||
"height": 1
|
||||
}
|
||||
},
|
||||
"lg": {
|
||||
"location": {
|
||||
"x": 0,
|
||||
"y": 0
|
||||
},
|
||||
"size": {
|
||||
"width": 2,
|
||||
"height": 1
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "971aa859-8570-49a1-8d34-dd5c7b3638d1",
|
||||
"type": "date",
|
||||
"properties": {
|
||||
"display24HourFormat": true,
|
||||
"dateFormat": "hide",
|
||||
"enableTimezone": false,
|
||||
"timezoneLocation": {
|
||||
"name": "Paris",
|
||||
"latitude": 48.85341,
|
||||
"longitude": 2.3488
|
||||
},
|
||||
"titleState": "city"
|
||||
},
|
||||
"area": {
|
||||
"type": "wrapper",
|
||||
"properties": {
|
||||
"id": "default"
|
||||
}
|
||||
},
|
||||
"shape": {
|
||||
"sm": {
|
||||
"location": {
|
||||
"x": 1,
|
||||
"y": 0
|
||||
},
|
||||
"size": {
|
||||
"width": 1,
|
||||
"height": 1
|
||||
}
|
||||
},
|
||||
"md": {
|
||||
"location": {
|
||||
"x": 4,
|
||||
"y": 0
|
||||
},
|
||||
"size": {
|
||||
"width": 1,
|
||||
"height": 1
|
||||
}
|
||||
},
|
||||
"lg": {
|
||||
"location": {
|
||||
"x": 8,
|
||||
"y": 0
|
||||
},
|
||||
"size": {
|
||||
"width": 2,
|
||||
"height": 1
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "f252768d-9e69-491b-b6b4-8cad04fa30e8",
|
||||
"type": "date",
|
||||
"properties": {
|
||||
"display24HourFormat": true,
|
||||
"dateFormat": "hide",
|
||||
"enableTimezone": true,
|
||||
"timezoneLocation": {
|
||||
"name": "Tokyo",
|
||||
"latitude": 35.6895,
|
||||
"longitude": 139.69171
|
||||
},
|
||||
"titleState": "city"
|
||||
},
|
||||
"area": {
|
||||
"type": "wrapper",
|
||||
"properties": {
|
||||
"id": "default"
|
||||
}
|
||||
},
|
||||
"shape": {
|
||||
"sm": {
|
||||
"location": {
|
||||
"x": 0,
|
||||
"y": 0
|
||||
},
|
||||
"size": {
|
||||
"width": 1,
|
||||
"height": 1
|
||||
}
|
||||
},
|
||||
"md": {
|
||||
"location": {
|
||||
"x": 3,
|
||||
"y": 0
|
||||
},
|
||||
"size": {
|
||||
"width": 1,
|
||||
"height": 1
|
||||
}
|
||||
},
|
||||
"lg": {
|
||||
"location": {
|
||||
"x": 8,
|
||||
"y": 1
|
||||
},
|
||||
"size": {
|
||||
"width": 2,
|
||||
"height": 1
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "86b1921f-efa7-410f-92dd-79553bf3264d",
|
||||
"type": "notebook",
|
||||
"properties": {
|
||||
"showToolbar": true,
|
||||
"content": "<h2><strong>Welcome to Homarr 🚀👋</strong></h2><p>We're glad that you're here! Homarr is a <em>modern </em>and <em>easy to use</em> dashboard that helps you to <strong>organize and manage</strong> your home network from one place. Control is <strong>at your fingertips</strong>.</p><p>We recommend you to read the <a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://homarr.dev/docs/getting-started/after-the-installation\">getting started guide</a> first. To edit this board you must enter the edit mode - only administrators can do this. Adding an app is the first step you should take. You can do this by clicking the <code>Add tile</code> button at the top right and select <code>App</code>. After you provided an internal URL, external URL and selected an icon you can drag it around when holding down the left mouse button. Make it bigger or smaller using the drag icon at the bottom right. When you're happy with it's position, you <strong>must exit edit mode to save your board</strong>. Adding widgets works the same way but may require additional configuration - read the documentation for more information.</p><p>To remove this widget, you must log in to your administrator account and click on the menu to delete it.</p><p><strong><u>Your TODO list:</u></strong></p><ul data-type=\"taskList\"><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p>Read the <a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://homarr.dev\">documentation</a></p></div></li><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p>Add your <em>first app</em></p></div></li><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p><em>Resize </em>and <em>drag</em> your app to a different position</p></div></li><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p>Add the <em>clock widget</em> to your dashboard</p></div></li><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p>Create a <em>new user</em></p></div></li></ul>"
|
||||
},
|
||||
"area": {
|
||||
"type": "wrapper",
|
||||
"properties": {
|
||||
"id": "default"
|
||||
}
|
||||
},
|
||||
"shape": {
|
||||
"sm": {
|
||||
"location": {
|
||||
"x": 0,
|
||||
"y": 0
|
||||
},
|
||||
"size": {
|
||||
"width": 3,
|
||||
"height": 2
|
||||
}
|
||||
},
|
||||
"md": {
|
||||
"location": {
|
||||
"x": 0,
|
||||
"y": 0
|
||||
},
|
||||
"size": {
|
||||
"width": 3,
|
||||
"height": 4
|
||||
}
|
||||
},
|
||||
"lg": {
|
||||
"location": {
|
||||
"x": 0,
|
||||
"y": 1
|
||||
},
|
||||
"size": {
|
||||
"width": 6,
|
||||
"height": 3
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"settings": {
|
||||
"common": {
|
||||
"searchEngine": {
|
||||
"type": "google",
|
||||
"properties": {}
|
||||
}
|
||||
},
|
||||
"customization": {
|
||||
"layout": {
|
||||
"enabledLeftSidebar": false,
|
||||
"enabledRightSidebar": false,
|
||||
"enabledDocker": false,
|
||||
"enabledPing": false,
|
||||
"enabledSearchbar": true
|
||||
},
|
||||
"pageTitle": "Homarr ⭐️",
|
||||
"logoImageUrl": "/imgs/logo/logo.png",
|
||||
"faviconUrl": "/imgs/favicon/favicon-squared.png",
|
||||
"backgroundImageUrl": "",
|
||||
"customCss": "",
|
||||
"colors": {
|
||||
"primary": "red",
|
||||
"secondary": "yellow",
|
||||
"shade": 7
|
||||
},
|
||||
"appOpacity": 100,
|
||||
"gridstack": {
|
||||
"columnCountSmall": 3,
|
||||
"columnCountMedium": 6,
|
||||
"columnCountLarge": 10
|
||||
}
|
||||
},
|
||||
"access": {
|
||||
"allowGuests": false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,2 +1,4 @@
|
||||
export const REPO_URL = 'ajnart/homarr';
|
||||
export const ICON_PICKER_SLICE_LIMIT = 36;
|
||||
export const COOKIE_LOCALE_KEY = 'config-locale';
|
||||
export const COOKIE_COLOR_SCHEME_KEY = 'color-scheme';
|
||||
|
||||
2828
data/crowdin-report.json
Normal file
2828
data/crowdin-report.json
Normal file
File diff suppressed because it is too large
Load Diff
513
data/default.json
Normal file
513
data/default.json
Normal file
@@ -0,0 +1,513 @@
|
||||
{
|
||||
"schemaVersion": 2,
|
||||
"configProperties": {
|
||||
"name": "default"
|
||||
},
|
||||
"categories": [],
|
||||
"wrappers": [
|
||||
{
|
||||
"id": "default",
|
||||
"position": 0
|
||||
}
|
||||
],
|
||||
"apps": [
|
||||
{
|
||||
"id": "5df743d9-5cb1-457c-85d2-64ff86855652",
|
||||
"name": "Documentation",
|
||||
"url": "https://homarr.dev",
|
||||
"behaviour": {
|
||||
"onClickUrl": "https://homarr.dev",
|
||||
"externalUrl": "https://homarr.dev",
|
||||
"isOpeningNewTab": true
|
||||
},
|
||||
"network": {
|
||||
"enabledStatusChecker": false,
|
||||
"statusCodes": [
|
||||
"200"
|
||||
]
|
||||
},
|
||||
"appearance": {
|
||||
"iconUrl": "/imgs/logo/logo.png",
|
||||
"appNameStatus": "normal",
|
||||
"positionAppName": "column",
|
||||
"lineClampAppName": 1
|
||||
},
|
||||
"integration": {
|
||||
"type": null,
|
||||
"properties": []
|
||||
},
|
||||
"area": {
|
||||
"type": "wrapper",
|
||||
"properties": {
|
||||
"id": "default"
|
||||
}
|
||||
},
|
||||
"shape": {
|
||||
"md": {
|
||||
"location": {
|
||||
"x": 5,
|
||||
"y": 1
|
||||
},
|
||||
"size": {
|
||||
"width": 1,
|
||||
"height": 1
|
||||
}
|
||||
},
|
||||
"sm": {
|
||||
"location": {
|
||||
"x": 0,
|
||||
"y": 1
|
||||
},
|
||||
"size": {
|
||||
"width": 1,
|
||||
"height": 2
|
||||
}
|
||||
},
|
||||
"lg": {
|
||||
"location": {
|
||||
"x": 6,
|
||||
"y": 1
|
||||
},
|
||||
"size": {
|
||||
"width": 2,
|
||||
"height": 2
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "47af36c0-47c1-4e5b-bfc7-ad645ee6a337",
|
||||
"name": "Discord",
|
||||
"url": "https://discord.com/invite/aCsmEV5RgA",
|
||||
"behaviour": {
|
||||
"onClickUrl": "https://discord.com/invite/aCsmEV5RgA",
|
||||
"isOpeningNewTab": true,
|
||||
"externalUrl": "https://discord.com/invite/aCsmEV5RgA",
|
||||
"tooltipDescription": "Join our Discord server! We're waiting for your ideas and feedback. "
|
||||
},
|
||||
"network": {
|
||||
"enabledStatusChecker": false,
|
||||
"statusCodes": [
|
||||
"200"
|
||||
]
|
||||
},
|
||||
"appearance": {
|
||||
"iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/discord.png",
|
||||
"appNameStatus": "normal",
|
||||
"positionAppName": "row-reverse",
|
||||
"lineClampAppName": 1
|
||||
},
|
||||
"integration": {
|
||||
"type": null,
|
||||
"properties": []
|
||||
},
|
||||
"area": {
|
||||
"type": "wrapper",
|
||||
"properties": {
|
||||
"id": "default"
|
||||
}
|
||||
},
|
||||
"shape": {
|
||||
"md": {
|
||||
"location": {
|
||||
"x": 3,
|
||||
"y": 1
|
||||
},
|
||||
"size": {
|
||||
"width": 1,
|
||||
"height": 1
|
||||
}
|
||||
},
|
||||
"sm": {
|
||||
"location": {
|
||||
"x": 1,
|
||||
"y": 4
|
||||
},
|
||||
"size": {
|
||||
"width": 1,
|
||||
"height": 1
|
||||
}
|
||||
},
|
||||
"lg": {
|
||||
"location": {
|
||||
"x": 4,
|
||||
"y": 0
|
||||
},
|
||||
"size": {
|
||||
"width": 2,
|
||||
"height": 1
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "47af36c0-47c1-4e5b-bfc7-ad645ee6a330",
|
||||
"name": "Contribute",
|
||||
"url": "https://github.com/ajnart/homarr",
|
||||
"behaviour": {
|
||||
"onClickUrl": "https://github.com/ajnart/homarr",
|
||||
"externalUrl": "https://github.com/ajnart/homarr",
|
||||
"isOpeningNewTab": true,
|
||||
"tooltipDescription": ""
|
||||
},
|
||||
"network": {
|
||||
"enabledStatusChecker": false,
|
||||
"statusCodes": []
|
||||
},
|
||||
"appearance": {
|
||||
"iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/github.png",
|
||||
"appNameStatus": "normal",
|
||||
"positionAppName": "row-reverse",
|
||||
"lineClampAppName": 2
|
||||
},
|
||||
"integration": {
|
||||
"type": null,
|
||||
"properties": []
|
||||
},
|
||||
"area": {
|
||||
"type": "wrapper",
|
||||
"properties": {
|
||||
"id": "default"
|
||||
}
|
||||
},
|
||||
"shape": {
|
||||
"md": {
|
||||
"location": {
|
||||
"x": 3,
|
||||
"y": 2
|
||||
},
|
||||
"size": {
|
||||
"width": 2,
|
||||
"height": 1
|
||||
}
|
||||
},
|
||||
"sm": {
|
||||
"location": {
|
||||
"x": 1,
|
||||
"y": 3
|
||||
},
|
||||
"size": {
|
||||
"width": 2,
|
||||
"height": 1
|
||||
}
|
||||
},
|
||||
"lg": {
|
||||
"location": {
|
||||
"x": 2,
|
||||
"y": 0
|
||||
},
|
||||
"size": {
|
||||
"width": 2,
|
||||
"height": 1
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "47af36c0-47c1-4e5b-bfc7-ad645ee6a990",
|
||||
"name": "Donate",
|
||||
"url": "https://ko-fi.com/ajnart",
|
||||
"behaviour": {
|
||||
"onClickUrl": "https://ko-fi.com/ajnart",
|
||||
"externalUrl": "https://ko-fi.com/ajnart",
|
||||
"isOpeningNewTab": true,
|
||||
"tooltipDescription": "Please consider making a donation"
|
||||
},
|
||||
"network": {
|
||||
"enabledStatusChecker": false,
|
||||
"statusCodes": [
|
||||
"200"
|
||||
]
|
||||
},
|
||||
"appearance": {
|
||||
"iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/ko-fi.png",
|
||||
"appNameStatus": "normal",
|
||||
"positionAppName": "row-reverse",
|
||||
"lineClampAppName": 1
|
||||
},
|
||||
"integration": {
|
||||
"type": null,
|
||||
"properties": []
|
||||
},
|
||||
"area": {
|
||||
"type": "wrapper",
|
||||
"properties": {
|
||||
"id": "default"
|
||||
}
|
||||
},
|
||||
"shape": {
|
||||
"md": {
|
||||
"location": {
|
||||
"x": 4,
|
||||
"y": 1
|
||||
},
|
||||
"size": {
|
||||
"width": 1,
|
||||
"height": 1
|
||||
}
|
||||
},
|
||||
"sm": {
|
||||
"location": {
|
||||
"x": 2,
|
||||
"y": 4
|
||||
},
|
||||
"size": {
|
||||
"width": 1,
|
||||
"height": 1
|
||||
}
|
||||
},
|
||||
"lg": {
|
||||
"location": {
|
||||
"x": 6,
|
||||
"y": 0
|
||||
},
|
||||
"size": {
|
||||
"width": 2,
|
||||
"height": 1
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"widgets": [
|
||||
{
|
||||
"id": "e3004052-6b83-480e-b458-56e8ccdca5f0",
|
||||
"type": "weather",
|
||||
"properties": {
|
||||
"displayInFahrenheit": false,
|
||||
"location": {
|
||||
"name": "Paris",
|
||||
"latitude": 48.85341,
|
||||
"longitude": 2.3488
|
||||
},
|
||||
"displayCityName": true
|
||||
},
|
||||
"area": {
|
||||
"type": "wrapper",
|
||||
"properties": {
|
||||
"id": "default"
|
||||
}
|
||||
},
|
||||
"shape": {
|
||||
"md": {
|
||||
"location": {
|
||||
"x": 5,
|
||||
"y": 0
|
||||
},
|
||||
"size": {
|
||||
"width": 1,
|
||||
"height": 1
|
||||
}
|
||||
},
|
||||
"sm": {
|
||||
"location": {
|
||||
"x": 2,
|
||||
"y": 0
|
||||
},
|
||||
"size": {
|
||||
"width": 1,
|
||||
"height": 1
|
||||
}
|
||||
},
|
||||
"lg": {
|
||||
"location": {
|
||||
"x": 0,
|
||||
"y": 0
|
||||
},
|
||||
"size": {
|
||||
"width": 2,
|
||||
"height": 1
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "971aa859-8570-49a1-8d34-dd5c7b3638d1",
|
||||
"type": "date",
|
||||
"properties": {
|
||||
"display24HourFormat": true,
|
||||
"dateFormat": "hide",
|
||||
"enableTimezone": false,
|
||||
"timezoneLocation": {
|
||||
"name": "Paris",
|
||||
"latitude": 48.85341,
|
||||
"longitude": 2.3488
|
||||
},
|
||||
"titleState": "city"
|
||||
},
|
||||
"area": {
|
||||
"type": "wrapper",
|
||||
"properties": {
|
||||
"id": "default"
|
||||
}
|
||||
},
|
||||
"shape": {
|
||||
"sm": {
|
||||
"location": {
|
||||
"x": 1,
|
||||
"y": 0
|
||||
},
|
||||
"size": {
|
||||
"width": 1,
|
||||
"height": 1
|
||||
}
|
||||
},
|
||||
"md": {
|
||||
"location": {
|
||||
"x": 4,
|
||||
"y": 0
|
||||
},
|
||||
"size": {
|
||||
"width": 1,
|
||||
"height": 1
|
||||
}
|
||||
},
|
||||
"lg": {
|
||||
"location": {
|
||||
"x": 8,
|
||||
"y": 0
|
||||
},
|
||||
"size": {
|
||||
"width": 2,
|
||||
"height": 1
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "f252768d-9e69-491b-b6b4-8cad04fa30e8",
|
||||
"type": "date",
|
||||
"properties": {
|
||||
"display24HourFormat": true,
|
||||
"dateFormat": "hide",
|
||||
"enableTimezone": true,
|
||||
"timezoneLocation": {
|
||||
"name": "Tokyo",
|
||||
"latitude": 35.6895,
|
||||
"longitude": 139.69171
|
||||
},
|
||||
"titleState": "city"
|
||||
},
|
||||
"area": {
|
||||
"type": "wrapper",
|
||||
"properties": {
|
||||
"id": "default"
|
||||
}
|
||||
},
|
||||
"shape": {
|
||||
"sm": {
|
||||
"location": {
|
||||
"x": 0,
|
||||
"y": 0
|
||||
},
|
||||
"size": {
|
||||
"width": 1,
|
||||
"height": 1
|
||||
}
|
||||
},
|
||||
"md": {
|
||||
"location": {
|
||||
"x": 3,
|
||||
"y": 0
|
||||
},
|
||||
"size": {
|
||||
"width": 1,
|
||||
"height": 1
|
||||
}
|
||||
},
|
||||
"lg": {
|
||||
"location": {
|
||||
"x": 8,
|
||||
"y": 1
|
||||
},
|
||||
"size": {
|
||||
"width": 2,
|
||||
"height": 1
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "86b1921f-efa7-410f-92dd-79553bf3264d",
|
||||
"type": "notebook",
|
||||
"properties": {
|
||||
"showToolbar": true,
|
||||
"content": "<h2><strong>Welcome to Homarr 🚀👋</strong></h2><p>We're glad that you're here! Homarr is a <em>modern </em>and <em>easy to use</em> dashboard that helps you to <strong>organize and manage</strong> your home network from one place. Control is <strong>at your fingertips</strong>.</p><p>We recommend you to read the <a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://homarr.dev/docs/getting-started/after-the-installation\">getting started guide</a> first. To edit this board you must enter the edit mode - only administrators can do this. Adding an app is the first step you should take. You can do this by clicking the <code>Add tile</code> button at the top right and select <code>App</code>. After you provided an internal URL, external URL and selected an icon you can drag it around when holding down the left mouse button. Make it bigger or smaller using the drag icon at the bottom right. When you're happy with it's position, you <strong>must exit edit mode to save your board</strong>. Adding widgets works the same way but may require additional configuration - read the documentation for more information.</p><p>To remove this widget, you must log in to your administrator account and click on the menu to delete it.</p><p><strong><u>Your TODO list:</u></strong></p><ul data-type=\"taskList\"><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p>Read the <a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://homarr.dev\">documentation</a></p></div></li><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p>Add your <em>first app</em></p></div></li><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p><em>Resize </em>and <em>drag</em> your app to a different position</p></div></li><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p>Add the <em>clock widget</em> to your dashboard</p></div></li><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p>Create a <em>new user</em></p></div></li></ul>"
|
||||
},
|
||||
"area": {
|
||||
"type": "wrapper",
|
||||
"properties": {
|
||||
"id": "default"
|
||||
}
|
||||
},
|
||||
"shape": {
|
||||
"sm": {
|
||||
"location": {
|
||||
"x": 0,
|
||||
"y": 0
|
||||
},
|
||||
"size": {
|
||||
"width": 3,
|
||||
"height": 2
|
||||
}
|
||||
},
|
||||
"md": {
|
||||
"location": {
|
||||
"x": 0,
|
||||
"y": 0
|
||||
},
|
||||
"size": {
|
||||
"width": 3,
|
||||
"height": 4
|
||||
}
|
||||
},
|
||||
"lg": {
|
||||
"location": {
|
||||
"x": 0,
|
||||
"y": 1
|
||||
},
|
||||
"size": {
|
||||
"width": 6,
|
||||
"height": 3
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"settings": {
|
||||
"common": {
|
||||
"searchEngine": {
|
||||
"type": "google",
|
||||
"properties": {}
|
||||
}
|
||||
},
|
||||
"customization": {
|
||||
"layout": {
|
||||
"enabledLeftSidebar": false,
|
||||
"enabledRightSidebar": false,
|
||||
"enabledDocker": false,
|
||||
"enabledPing": false,
|
||||
"enabledSearchbar": true
|
||||
},
|
||||
"pageTitle": "Homarr ⭐️",
|
||||
"logoImageUrl": "/imgs/logo/logo.png",
|
||||
"faviconUrl": "/imgs/favicon/favicon-squared.png",
|
||||
"backgroundImageUrl": "",
|
||||
"customCss": "",
|
||||
"colors": {
|
||||
"primary": "red",
|
||||
"secondary": "yellow",
|
||||
"shade": 7
|
||||
},
|
||||
"appOpacity": 100,
|
||||
"gridstack": {
|
||||
"columnCountSmall": 3,
|
||||
"columnCountMedium": 6,
|
||||
"columnCountLarge": 10
|
||||
}
|
||||
},
|
||||
"access": {
|
||||
"allowGuests": false
|
||||
}
|
||||
}
|
||||
}
|
||||
0
database/.gitkeep
Normal file
0
database/.gitkeep
Normal file
42
docker-compose.unraid.yml
Normal file
42
docker-compose.unraid.yml
Normal file
@@ -0,0 +1,42 @@
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
unmarr:
|
||||
image: git.xtrm-lab.org/jazzymc/homarr:latest
|
||||
container_name: unmarr
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
# Unraid API Configuration
|
||||
- UNRAID_HOST=192.168.10.20
|
||||
- UNRAID_API_KEY=${UNRAID_API_KEY}
|
||||
- UNRAID_USE_SSL=false
|
||||
- UNRAID_PORT=80
|
||||
# App Configuration
|
||||
- TZ=Europe/Sofia
|
||||
- DATABASE_URL=file:/data/db.sqlite
|
||||
- AUTH_TRUST_HOST=true
|
||||
- NEXTAUTH_URL=https://unmarr.xtrm-lab.org
|
||||
- NEXTAUTH_SECRET=${NEXTAUTH_SECRET:-changeme}
|
||||
volumes:
|
||||
- /mnt/user/appdata/unmarr/data:/data
|
||||
- /mnt/user/appdata/unmarr/configs:/app/data/configs
|
||||
networks:
|
||||
dockerproxy:
|
||||
ipv4_address: 172.18.0.5
|
||||
labels:
|
||||
# Traefik
|
||||
- "traefik.enable=true"
|
||||
- "traefik.constraint=valid"
|
||||
- "traefik.http.routers.unmarr.rule=Host(`unmarr.xtrm-lab.org`)"
|
||||
- "traefik.http.routers.unmarr.entrypoints=https"
|
||||
- "traefik.http.routers.unmarr.tls=true"
|
||||
- "traefik.http.routers.unmarr.tls.certresolver=cloudflare"
|
||||
- "traefik.http.services.unmarr.loadbalancer.server.port=7575"
|
||||
# Unraid
|
||||
- "net.unraid.docker.managed=true"
|
||||
- "net.unraid.docker.icon=https://homarr.dev/img/logo.png"
|
||||
- "net.unraid.docker.webui=https://unmarr.xtrm-lab.org"
|
||||
|
||||
networks:
|
||||
dockerproxy:
|
||||
external: true
|
||||
148
docs/unraid-ui-project/README.md
Normal file
148
docs/unraid-ui-project/README.md
Normal file
@@ -0,0 +1,148 @@
|
||||
# Unraid Custom UI Project
|
||||
|
||||
This project transforms the Homarr fork into a custom Unraid management UI with an Orchis GTK theme.
|
||||
|
||||
## Project Goals
|
||||
|
||||
1. **Step 1**: Recreate all current Unraid WebGUI pages using Homarr as a base, with data from the Unraid GraphQL API
|
||||
2. **Step 2**: Apply a custom theme based on the Orchis GTK theme
|
||||
|
||||
## Project Resources
|
||||
|
||||
| Document | Description |
|
||||
|----------|-------------|
|
||||
| [WEBGUI-COMPLETE-INVENTORY.md](./WEBGUI-COMPLETE-INVENTORY.md) | Complete inventory of ~100 Unraid WebGUI pages |
|
||||
| [unraid-api-research.md](./unraid-api-research.md) | Unraid GraphQL API documentation |
|
||||
| [homarr-architecture.md](./homarr-architecture.md) | Homarr codebase architecture |
|
||||
| [orchis-design-system.ts](./orchis-design-system.ts) | Orchis theme design tokens (TypeScript) |
|
||||
|
||||
## Unraid Server Connection
|
||||
|
||||
- **GraphQL Endpoint**: `http://192.168.10.20/graphql`
|
||||
- **Auth**: `x-api-key` header
|
||||
- **Socket**: `/var/run/unraid-api.sock`
|
||||
|
||||
## Implementation Plan
|
||||
|
||||
### Phase 1: Foundation Setup
|
||||
- [ ] Create Unraid GraphQL client integration
|
||||
- [ ] Set up API authentication layer
|
||||
- [ ] Configure environment variables for Unraid connection
|
||||
- [ ] Create base types for Unraid data models
|
||||
|
||||
### Phase 2: Core Pages (Priority Order)
|
||||
1. **Dashboard** - System overview with real-time metrics
|
||||
- System info, CPU/RAM usage, array status
|
||||
- Docker/VM summaries, network, UPS
|
||||
|
||||
2. **Array Management** (Main)
|
||||
- Array devices, pool devices, boot device
|
||||
- Parity check, array operations
|
||||
|
||||
3. **Docker Management**
|
||||
- Container list, start/stop/restart
|
||||
- Container details, logs
|
||||
|
||||
4. **VM Management**
|
||||
- VM list, power controls
|
||||
- VM details, console access
|
||||
|
||||
5. **Shares**
|
||||
- User shares, disk shares
|
||||
- Share settings, SMB/NFS security
|
||||
|
||||
### Phase 3: Orchis Theme Integration
|
||||
- [ ] Copy design tokens to `src/styles/`
|
||||
- [ ] Create Mantine theme override with Orchis values
|
||||
- [ ] Implement light/dark mode with Orchis palettes
|
||||
- [ ] Replace default components with Orchis-styled versions
|
||||
|
||||
### Phase 4: Settings & Tools
|
||||
- Settings pages (identification, disk, network, etc.)
|
||||
- Tools pages (syslog, diagnostics, system devices)
|
||||
- User management
|
||||
- Notifications system
|
||||
|
||||
### Phase 5: Real-time Features
|
||||
- GraphQL subscriptions for CPU/memory metrics
|
||||
- Nchan integration for legacy real-time features
|
||||
- WebSocket connections for live updates
|
||||
|
||||
## Key Technical Decisions
|
||||
|
||||
### Homarr Stack
|
||||
- Next.js 13 (Pages Router in this version)
|
||||
- Mantine UI v6
|
||||
- tRPC for type-safe API
|
||||
- Zustand for state management
|
||||
- React Query for server state
|
||||
|
||||
### Data Sources
|
||||
| Feature | Source |
|
||||
|---------|--------|
|
||||
| System info, array, shares | Unraid GraphQL API |
|
||||
| Docker containers | Unraid GraphQL API |
|
||||
| VMs | Unraid GraphQL API |
|
||||
| Real-time CPU/RAM | GraphQL Subscriptions |
|
||||
| Real-time disk I/O | Nchan WebSocket (`/sub/diskload`) |
|
||||
| Legacy features | PHP endpoints where needed |
|
||||
|
||||
### API Gaps (Require Legacy Endpoints)
|
||||
- Docker create/delete/restart/logs
|
||||
- VM create/delete
|
||||
- Share CRUD, User CRUD
|
||||
- System reboot/shutdown
|
||||
- Mover operations
|
||||
|
||||
## Directory Structure (New Files)
|
||||
|
||||
```
|
||||
src/
|
||||
├── lib/
|
||||
│ └── unraid/
|
||||
│ ├── client.ts # GraphQL client
|
||||
│ ├── types.ts # TypeScript types
|
||||
│ └── queries/ # GraphQL queries
|
||||
├── pages/
|
||||
│ └── unraid/
|
||||
│ ├── dashboard.tsx # Dashboard page
|
||||
│ ├── array/ # Array pages
|
||||
│ ├── docker/ # Docker pages
|
||||
│ ├── vms/ # VM pages
|
||||
│ ├── shares/ # Share pages
|
||||
│ ├── settings/ # Settings pages
|
||||
│ └── tools/ # Tools pages
|
||||
├── components/
|
||||
│ └── unraid/
|
||||
│ ├── Dashboard/ # Dashboard components
|
||||
│ ├── Array/ # Array components
|
||||
│ ├── Docker/ # Docker components
|
||||
│ └── ...
|
||||
└── styles/
|
||||
└── orchis/
|
||||
├── theme.ts # Mantine theme config
|
||||
├── variables.css # CSS custom properties
|
||||
└── components.css # Component overrides
|
||||
```
|
||||
|
||||
## Getting Started
|
||||
|
||||
```bash
|
||||
# Install dependencies
|
||||
yarn install
|
||||
|
||||
# Set up environment
|
||||
cp .env.example .env.local
|
||||
# Edit .env.local with your Unraid API key
|
||||
|
||||
# Run development server
|
||||
yarn dev
|
||||
```
|
||||
|
||||
## Environment Variables
|
||||
|
||||
```env
|
||||
UNRAID_HOST=192.168.10.20
|
||||
UNRAID_API_KEY=your-api-key-here
|
||||
UNRAID_USE_SSL=false
|
||||
```
|
||||
1505
docs/unraid-ui-project/WEBGUI-COMPLETE-INVENTORY.md
Normal file
1505
docs/unraid-ui-project/WEBGUI-COMPLETE-INVENTORY.md
Normal file
File diff suppressed because it is too large
Load Diff
60
docs/unraid-ui-project/homarr-architecture.md
Normal file
60
docs/unraid-ui-project/homarr-architecture.md
Normal file
@@ -0,0 +1,60 @@
|
||||
# Homarr Architecture
|
||||
|
||||
## Tech Stack
|
||||
- Next.js 13+ (App Router), React 18, TypeScript
|
||||
- Mantine UI (component library)
|
||||
- Zustand (client state), React Query (server state)
|
||||
- Prisma ORM (SQLite default / PostgreSQL)
|
||||
- Turbo monorepo, pnpm workspaces
|
||||
|
||||
## Project Structure
|
||||
```
|
||||
homarr/
|
||||
├── apps/web/src/ # Main Next.js app
|
||||
│ ├── app/ # App Router pages
|
||||
│ ├── components/ # React components
|
||||
│ ├── modules/ # Widgets & integrations
|
||||
│ ├── stores/ # Zustand stores
|
||||
│ └── styles/ # Themes & global CSS
|
||||
├── packages/
|
||||
│ ├── api-client/ # API client lib
|
||||
│ ├── common/ # Shared types/utils
|
||||
│ ├── definitions/ # Widget/integration defs
|
||||
│ ├── auth/ # Auth logic
|
||||
│ └── ui/ # Shared UI components
|
||||
├── prisma/ # DB schema & migrations
|
||||
└── turbo.json
|
||||
```
|
||||
|
||||
## Widget System
|
||||
Each widget in `apps/web/src/modules/`:
|
||||
- `definition.ts` - Metadata + Zod config schema
|
||||
- `component.tsx` - React component
|
||||
- `settings.tsx` - Config panel
|
||||
- `server-actions.ts` - Backend operations
|
||||
- Registered in module index, auto-discovered
|
||||
|
||||
## Integration System
|
||||
External service connectors with:
|
||||
- API client abstraction, credential management
|
||||
- URL/hostname config, SSL handling
|
||||
- Error handling, retry, rate limiting, caching
|
||||
|
||||
## Theming
|
||||
- CSS variables + Mantine theming + Tailwind
|
||||
- Light/dark mode, custom color palettes, accent colors
|
||||
- Wallpaper/background, font size, border radius customization
|
||||
- Theme persisted in database
|
||||
|
||||
## Adding New Pages
|
||||
1. Create in `apps/web/src/app/(group)/page-name/page.tsx`
|
||||
2. Use Mantine UI components
|
||||
3. Add API routes in `src/app/api/`
|
||||
4. Create Zustand store or use React Query
|
||||
5. Update navigation config
|
||||
|
||||
## Key Patterns
|
||||
- Server Components by default, `'use client'` for interactive
|
||||
- TRPC for type-safe RPC
|
||||
- Zod schemas for validation
|
||||
- Prisma for DB operations
|
||||
1329
docs/unraid-ui-project/orchis-design-system.ts
Normal file
1329
docs/unraid-ui-project/orchis-design-system.ts
Normal file
File diff suppressed because it is too large
Load Diff
81
docs/unraid-ui-project/unraid-api-research.md
Normal file
81
docs/unraid-ui-project/unraid-api-research.md
Normal file
@@ -0,0 +1,81 @@
|
||||
# Unraid API Research (Live from XTRM-Unraid v7.2.3)
|
||||
|
||||
## API: unraid-api v4.29.2 (NestJS + Apollo GraphQL)
|
||||
|
||||
### Connection
|
||||
- HTTP: `http://192.168.10.20/graphql`
|
||||
- WebSocket: `ws://192.168.10.20/graphql` (graphql-ws protocol)
|
||||
- Unix socket: `/var/run/unraid-api.sock`
|
||||
- Auth: `x-api-key` header
|
||||
|
||||
### GraphQL Queries
|
||||
| Query | Description |
|
||||
|-------|-------------|
|
||||
| `info` | System info (cpu, memory, os, baseboard, devices, display, versions) |
|
||||
| `array` | Array state, capacity, disks, parities, caches, parity check status |
|
||||
| `disks` / `disk(id)` | Physical disks with SMART status, temp, serial |
|
||||
| `docker` | Containers (id, names, state, status, image, ports, autoStart) + networks |
|
||||
| `vms` | VMs (id, name, state) |
|
||||
| `shares` | Shares (name, free, used, size, include, exclude, cache, color) |
|
||||
| `notifications` | Notifications (title, subject, description, importance, type, timestamp) |
|
||||
| `vars` | Server variables (version, name, timezone, network, SMB/NFS settings) |
|
||||
| `services` | Running services (name, online, uptime, version) |
|
||||
| `flash` | Flash drive (guid, vendor, product) |
|
||||
| `registration` | License (type, state, keyFile, expiration) |
|
||||
| `network` | Network info (accessUrls) |
|
||||
| `server` | Server details (owner, guid, wanip, lanip, localurl, remoteurl) |
|
||||
| `connect` | Connect status (dynamicRemoteAccess, settings) |
|
||||
| `plugins` | Installed plugins (name, version) |
|
||||
| `logFiles` / `logFile(path)` | Log file listing and content |
|
||||
| `upsDevices` / `upsConfiguration` | UPS monitoring |
|
||||
| `apiKeys` | API key management |
|
||||
| `customization` | Theme + activation code |
|
||||
| `me` / `owner` | Current user / server owner |
|
||||
|
||||
### GraphQL Mutations
|
||||
| Mutation | Description |
|
||||
|----------|-------------|
|
||||
| `array.setState` | Start/stop array |
|
||||
| `array.addDiskToArray` / `removeDiskFromArray` | Disk management |
|
||||
| `array.mountArrayDisk` / `unmountArrayDisk` | Mount/unmount |
|
||||
| `docker.start(id)` / `docker.stop(id)` | Container start/stop |
|
||||
| `vm.start/stop/pause/resume/forceStop/reboot/reset(id)` | VM power management |
|
||||
| `parityCheck.start/pause/resume/cancel` | Parity check control |
|
||||
| `notification.create/delete/archive/unread` | Notification CRUD |
|
||||
| `apiKey.create/update/delete` | API key management |
|
||||
| `customization.setTheme` | Theme switching |
|
||||
| `connectSignIn/SignOut` | Unraid Connect |
|
||||
| `setupRemoteAccess` | Remote access config |
|
||||
|
||||
### GraphQL Subscriptions (Real-time)
|
||||
- `systemMetricsCpu` / `systemMetricsCpuTelemetry` / `systemMetricsMemory`
|
||||
- `arraySubscription` / `parityHistorySubscription`
|
||||
- `notificationAdded` / `notificationsOverview`
|
||||
- `logFile` (live log streaming)
|
||||
- `upsUpdates`
|
||||
- `ownerSubscription` / `serversSubscription`
|
||||
|
||||
### Enums
|
||||
- ArrayState: STARTED, STOPPED, NEW_ARRAY, RECON_DISK, DISABLE_DISK, etc.
|
||||
- ArrayDiskStatus: DISK_NP, DISK_OK, DISK_INVALID, DISK_WRONG, DISK_DSBL, etc.
|
||||
- ArrayDiskType: DATA, PARITY, FLASH, CACHE
|
||||
- ContainerState: RUNNING, EXITED
|
||||
- VmState: NOSTATE, RUNNING, IDLE, PAUSED, SHUTDOWN, SHUTOFF, CRASHED, PMSUSPENDED
|
||||
- DiskFsType: XFS, BTRFS, VFAT, ZFS, EXT4, NTFS
|
||||
- DiskInterfaceType: SAS, SATA, USB, PCIE, UNKNOWN
|
||||
- ThemeName: azure, black, gray, white
|
||||
|
||||
### Legacy PHP/Nchan Endpoints
|
||||
- Nchan WebSocket channels: `/sub/var`, `/sub/docker`, `/sub/update1-3`, `/sub/diskload`, etc.
|
||||
- PHP includes: DashboardApps.php, Control.php, SmartInfo.php, Syslog.php, etc.
|
||||
- State INI files at `/var/local/emhttp/`: var.ini, disks.ini, shares.ini, etc.
|
||||
- Legacy control: POST to `/update.htm` for commands
|
||||
|
||||
### NOT Available via GraphQL
|
||||
- Docker create/delete/restart/logs
|
||||
- VM create/delete
|
||||
- Share CRUD, User CRUD
|
||||
- Detailed SMART attributes
|
||||
- Disk format/clear, spin up/down
|
||||
- System reboot/shutdown
|
||||
- Mover operations
|
||||
11
drizzle.config.ts
Normal file
11
drizzle.config.ts
Normal file
@@ -0,0 +1,11 @@
|
||||
import 'dotenv';
|
||||
import { type Config } from 'drizzle-kit';
|
||||
|
||||
export default {
|
||||
schema: './src/server/db/schema.ts',
|
||||
driver: 'better-sqlite',
|
||||
out: './drizzle',
|
||||
dbCredentials: {
|
||||
url: process.env.DATABASE_URL!,
|
||||
},
|
||||
} satisfies Config;
|
||||
69
drizzle/0000_supreme_the_captain.sql
Normal file
69
drizzle/0000_supreme_the_captain.sql
Normal file
@@ -0,0 +1,69 @@
|
||||
CREATE TABLE `account` (
|
||||
`userId` text NOT NULL,
|
||||
`type` text NOT NULL,
|
||||
`provider` text NOT NULL,
|
||||
`providerAccountId` text NOT NULL,
|
||||
`refresh_token` text,
|
||||
`access_token` text,
|
||||
`expires_at` integer,
|
||||
`token_type` text,
|
||||
`scope` text,
|
||||
`id_token` text,
|
||||
`session_state` text,
|
||||
PRIMARY KEY(`provider`, `providerAccountId`),
|
||||
FOREIGN KEY (`userId`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade
|
||||
);
|
||||
--> statement-breakpoint
|
||||
CREATE TABLE `invite` (
|
||||
`id` text PRIMARY KEY NOT NULL,
|
||||
`token` text NOT NULL,
|
||||
`expires` integer NOT NULL,
|
||||
`created_by_id` text NOT NULL,
|
||||
FOREIGN KEY (`created_by_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade
|
||||
);
|
||||
--> statement-breakpoint
|
||||
CREATE TABLE `session` (
|
||||
`sessionToken` text PRIMARY KEY NOT NULL,
|
||||
`userId` text NOT NULL,
|
||||
`expires` integer NOT NULL,
|
||||
FOREIGN KEY (`userId`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade
|
||||
);
|
||||
--> statement-breakpoint
|
||||
CREATE TABLE `user_setting` (
|
||||
`id` text PRIMARY KEY NOT NULL,
|
||||
`user_id` text NOT NULL,
|
||||
`color_scheme` text DEFAULT 'environment' NOT NULL,
|
||||
`language` text DEFAULT 'en' NOT NULL,
|
||||
`default_board` text DEFAULT 'default' NOT NULL,
|
||||
`first_day_of_week` text DEFAULT 'monday' NOT NULL,
|
||||
`search_template` text DEFAULT 'https://google.com/search?q=%s' NOT NULL,
|
||||
`open_search_in_new_tab` integer DEFAULT true NOT NULL,
|
||||
`disable_ping_pulse` integer DEFAULT false NOT NULL,
|
||||
`replace_ping_with_icons` integer DEFAULT false NOT NULL,
|
||||
`use_debug_language` integer DEFAULT false NOT NULL,
|
||||
`auto_focus_search` integer DEFAULT false NOT NULL,
|
||||
FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade
|
||||
);
|
||||
--> statement-breakpoint
|
||||
CREATE TABLE `user` (
|
||||
`id` text PRIMARY KEY NOT NULL,
|
||||
`name` text,
|
||||
`email` text,
|
||||
`emailVerified` integer,
|
||||
`image` text,
|
||||
`password` text,
|
||||
`salt` text,
|
||||
`is_admin` integer DEFAULT false NOT NULL,
|
||||
`is_owner` integer DEFAULT false NOT NULL
|
||||
);
|
||||
--> statement-breakpoint
|
||||
CREATE TABLE `verificationToken` (
|
||||
`identifier` text NOT NULL,
|
||||
`token` text NOT NULL,
|
||||
`expires` integer NOT NULL,
|
||||
PRIMARY KEY(`identifier`, `token`)
|
||||
);
|
||||
--> statement-breakpoint
|
||||
CREATE INDEX `userId_idx` ON `account` (`userId`);--> statement-breakpoint
|
||||
CREATE UNIQUE INDEX `invite_token_unique` ON `invite` (`token`);--> statement-breakpoint
|
||||
CREATE INDEX `user_id_idx` ON `session` (`userId`);
|
||||
10
drizzle/0001_brave_mimic.sql
Normal file
10
drizzle/0001_brave_mimic.sql
Normal file
@@ -0,0 +1,10 @@
|
||||
CREATE TABLE `migrate_token` (
|
||||
`id` text PRIMARY KEY NOT NULL,
|
||||
`token` text NOT NULL,
|
||||
`boards` integer NOT NULL,
|
||||
`users` integer NOT NULL,
|
||||
`integrations` integer NOT NULL,
|
||||
`expires` integer NOT NULL
|
||||
);
|
||||
--> statement-breakpoint
|
||||
CREATE UNIQUE INDEX `migrate_token_token_unique` ON `migrate_token` (`token`);
|
||||
468
drizzle/meta/0000_snapshot.json
Normal file
468
drizzle/meta/0000_snapshot.json
Normal file
@@ -0,0 +1,468 @@
|
||||
{
|
||||
"version": "5",
|
||||
"dialect": "sqlite",
|
||||
"id": "32c1bc91-e69f-4e1d-b53c-9c43f2e6c9d3",
|
||||
"prevId": "00000000-0000-0000-0000-000000000000",
|
||||
"tables": {
|
||||
"account": {
|
||||
"name": "account",
|
||||
"columns": {
|
||||
"userId": {
|
||||
"name": "userId",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"type": {
|
||||
"name": "type",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"provider": {
|
||||
"name": "provider",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"providerAccountId": {
|
||||
"name": "providerAccountId",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"refresh_token": {
|
||||
"name": "refresh_token",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"access_token": {
|
||||
"name": "access_token",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"expires_at": {
|
||||
"name": "expires_at",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"token_type": {
|
||||
"name": "token_type",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"scope": {
|
||||
"name": "scope",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"id_token": {
|
||||
"name": "id_token",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"session_state": {
|
||||
"name": "session_state",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {
|
||||
"userId_idx": {
|
||||
"name": "userId_idx",
|
||||
"columns": [
|
||||
"userId"
|
||||
],
|
||||
"isUnique": false
|
||||
}
|
||||
},
|
||||
"foreignKeys": {
|
||||
"account_userId_user_id_fk": {
|
||||
"name": "account_userId_user_id_fk",
|
||||
"tableFrom": "account",
|
||||
"tableTo": "user",
|
||||
"columnsFrom": [
|
||||
"userId"
|
||||
],
|
||||
"columnsTo": [
|
||||
"id"
|
||||
],
|
||||
"onDelete": "cascade",
|
||||
"onUpdate": "no action"
|
||||
}
|
||||
},
|
||||
"compositePrimaryKeys": {
|
||||
"account_provider_providerAccountId_pk": {
|
||||
"columns": [
|
||||
"provider",
|
||||
"providerAccountId"
|
||||
]
|
||||
}
|
||||
},
|
||||
"uniqueConstraints": {}
|
||||
},
|
||||
"invite": {
|
||||
"name": "invite",
|
||||
"columns": {
|
||||
"id": {
|
||||
"name": "id",
|
||||
"type": "text",
|
||||
"primaryKey": true,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"token": {
|
||||
"name": "token",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"expires": {
|
||||
"name": "expires",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"created_by_id": {
|
||||
"name": "created_by_id",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {
|
||||
"invite_token_unique": {
|
||||
"name": "invite_token_unique",
|
||||
"columns": [
|
||||
"token"
|
||||
],
|
||||
"isUnique": true
|
||||
}
|
||||
},
|
||||
"foreignKeys": {
|
||||
"invite_created_by_id_user_id_fk": {
|
||||
"name": "invite_created_by_id_user_id_fk",
|
||||
"tableFrom": "invite",
|
||||
"tableTo": "user",
|
||||
"columnsFrom": [
|
||||
"created_by_id"
|
||||
],
|
||||
"columnsTo": [
|
||||
"id"
|
||||
],
|
||||
"onDelete": "cascade",
|
||||
"onUpdate": "no action"
|
||||
}
|
||||
},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {}
|
||||
},
|
||||
"session": {
|
||||
"name": "session",
|
||||
"columns": {
|
||||
"sessionToken": {
|
||||
"name": "sessionToken",
|
||||
"type": "text",
|
||||
"primaryKey": true,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"userId": {
|
||||
"name": "userId",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"expires": {
|
||||
"name": "expires",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {
|
||||
"user_id_idx": {
|
||||
"name": "user_id_idx",
|
||||
"columns": [
|
||||
"userId"
|
||||
],
|
||||
"isUnique": false
|
||||
}
|
||||
},
|
||||
"foreignKeys": {
|
||||
"session_userId_user_id_fk": {
|
||||
"name": "session_userId_user_id_fk",
|
||||
"tableFrom": "session",
|
||||
"tableTo": "user",
|
||||
"columnsFrom": [
|
||||
"userId"
|
||||
],
|
||||
"columnsTo": [
|
||||
"id"
|
||||
],
|
||||
"onDelete": "cascade",
|
||||
"onUpdate": "no action"
|
||||
}
|
||||
},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {}
|
||||
},
|
||||
"user_setting": {
|
||||
"name": "user_setting",
|
||||
"columns": {
|
||||
"id": {
|
||||
"name": "id",
|
||||
"type": "text",
|
||||
"primaryKey": true,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"user_id": {
|
||||
"name": "user_id",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"color_scheme": {
|
||||
"name": "color_scheme",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": "'environment'"
|
||||
},
|
||||
"language": {
|
||||
"name": "language",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": "'en'"
|
||||
},
|
||||
"default_board": {
|
||||
"name": "default_board",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": "'default'"
|
||||
},
|
||||
"first_day_of_week": {
|
||||
"name": "first_day_of_week",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": "'monday'"
|
||||
},
|
||||
"search_template": {
|
||||
"name": "search_template",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": "'https://google.com/search?q=%s'"
|
||||
},
|
||||
"open_search_in_new_tab": {
|
||||
"name": "open_search_in_new_tab",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": true
|
||||
},
|
||||
"disable_ping_pulse": {
|
||||
"name": "disable_ping_pulse",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": false
|
||||
},
|
||||
"replace_ping_with_icons": {
|
||||
"name": "replace_ping_with_icons",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": false
|
||||
},
|
||||
"use_debug_language": {
|
||||
"name": "use_debug_language",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": false
|
||||
},
|
||||
"auto_focus_search": {
|
||||
"name": "auto_focus_search",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {
|
||||
"user_setting_user_id_user_id_fk": {
|
||||
"name": "user_setting_user_id_user_id_fk",
|
||||
"tableFrom": "user_setting",
|
||||
"tableTo": "user",
|
||||
"columnsFrom": [
|
||||
"user_id"
|
||||
],
|
||||
"columnsTo": [
|
||||
"id"
|
||||
],
|
||||
"onDelete": "cascade",
|
||||
"onUpdate": "no action"
|
||||
}
|
||||
},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {}
|
||||
},
|
||||
"user": {
|
||||
"name": "user",
|
||||
"columns": {
|
||||
"id": {
|
||||
"name": "id",
|
||||
"type": "text",
|
||||
"primaryKey": true,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"name": {
|
||||
"name": "name",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"email": {
|
||||
"name": "email",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"emailVerified": {
|
||||
"name": "emailVerified",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"image": {
|
||||
"name": "image",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"password": {
|
||||
"name": "password",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"salt": {
|
||||
"name": "salt",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"is_admin": {
|
||||
"name": "is_admin",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": false
|
||||
},
|
||||
"is_owner": {
|
||||
"name": "is_owner",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {}
|
||||
},
|
||||
"verificationToken": {
|
||||
"name": "verificationToken",
|
||||
"columns": {
|
||||
"identifier": {
|
||||
"name": "identifier",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"token": {
|
||||
"name": "token",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"expires": {
|
||||
"name": "expires",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {},
|
||||
"compositePrimaryKeys": {
|
||||
"verificationToken_identifier_token_pk": {
|
||||
"columns": [
|
||||
"identifier",
|
||||
"token"
|
||||
]
|
||||
}
|
||||
},
|
||||
"uniqueConstraints": {}
|
||||
}
|
||||
},
|
||||
"enums": {},
|
||||
"_meta": {
|
||||
"schemas": {},
|
||||
"tables": {},
|
||||
"columns": {}
|
||||
}
|
||||
}
|
||||
527
drizzle/meta/0001_snapshot.json
Normal file
527
drizzle/meta/0001_snapshot.json
Normal file
@@ -0,0 +1,527 @@
|
||||
{
|
||||
"version": "5",
|
||||
"dialect": "sqlite",
|
||||
"id": "9c8971c9-6d33-4d14-b318-b19ff9fbb88f",
|
||||
"prevId": "32c1bc91-e69f-4e1d-b53c-9c43f2e6c9d3",
|
||||
"tables": {
|
||||
"account": {
|
||||
"name": "account",
|
||||
"columns": {
|
||||
"userId": {
|
||||
"name": "userId",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"type": {
|
||||
"name": "type",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"provider": {
|
||||
"name": "provider",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"providerAccountId": {
|
||||
"name": "providerAccountId",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"refresh_token": {
|
||||
"name": "refresh_token",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"access_token": {
|
||||
"name": "access_token",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"expires_at": {
|
||||
"name": "expires_at",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"token_type": {
|
||||
"name": "token_type",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"scope": {
|
||||
"name": "scope",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"id_token": {
|
||||
"name": "id_token",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"session_state": {
|
||||
"name": "session_state",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {
|
||||
"userId_idx": {
|
||||
"name": "userId_idx",
|
||||
"columns": [
|
||||
"userId"
|
||||
],
|
||||
"isUnique": false
|
||||
}
|
||||
},
|
||||
"foreignKeys": {
|
||||
"account_userId_user_id_fk": {
|
||||
"name": "account_userId_user_id_fk",
|
||||
"tableFrom": "account",
|
||||
"tableTo": "user",
|
||||
"columnsFrom": [
|
||||
"userId"
|
||||
],
|
||||
"columnsTo": [
|
||||
"id"
|
||||
],
|
||||
"onDelete": "cascade",
|
||||
"onUpdate": "no action"
|
||||
}
|
||||
},
|
||||
"compositePrimaryKeys": {
|
||||
"account_provider_providerAccountId_pk": {
|
||||
"columns": [
|
||||
"provider",
|
||||
"providerAccountId"
|
||||
]
|
||||
}
|
||||
},
|
||||
"uniqueConstraints": {}
|
||||
},
|
||||
"invite": {
|
||||
"name": "invite",
|
||||
"columns": {
|
||||
"id": {
|
||||
"name": "id",
|
||||
"type": "text",
|
||||
"primaryKey": true,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"token": {
|
||||
"name": "token",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"expires": {
|
||||
"name": "expires",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"created_by_id": {
|
||||
"name": "created_by_id",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {
|
||||
"invite_token_unique": {
|
||||
"name": "invite_token_unique",
|
||||
"columns": [
|
||||
"token"
|
||||
],
|
||||
"isUnique": true
|
||||
}
|
||||
},
|
||||
"foreignKeys": {
|
||||
"invite_created_by_id_user_id_fk": {
|
||||
"name": "invite_created_by_id_user_id_fk",
|
||||
"tableFrom": "invite",
|
||||
"tableTo": "user",
|
||||
"columnsFrom": [
|
||||
"created_by_id"
|
||||
],
|
||||
"columnsTo": [
|
||||
"id"
|
||||
],
|
||||
"onDelete": "cascade",
|
||||
"onUpdate": "no action"
|
||||
}
|
||||
},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {}
|
||||
},
|
||||
"migrate_token": {
|
||||
"name": "migrate_token",
|
||||
"columns": {
|
||||
"id": {
|
||||
"name": "id",
|
||||
"type": "text",
|
||||
"primaryKey": true,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"token": {
|
||||
"name": "token",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"boards": {
|
||||
"name": "boards",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"users": {
|
||||
"name": "users",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"integrations": {
|
||||
"name": "integrations",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"expires": {
|
||||
"name": "expires",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {
|
||||
"migrate_token_token_unique": {
|
||||
"name": "migrate_token_token_unique",
|
||||
"columns": [
|
||||
"token"
|
||||
],
|
||||
"isUnique": true
|
||||
}
|
||||
},
|
||||
"foreignKeys": {},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {}
|
||||
},
|
||||
"session": {
|
||||
"name": "session",
|
||||
"columns": {
|
||||
"sessionToken": {
|
||||
"name": "sessionToken",
|
||||
"type": "text",
|
||||
"primaryKey": true,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"userId": {
|
||||
"name": "userId",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"expires": {
|
||||
"name": "expires",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {
|
||||
"user_id_idx": {
|
||||
"name": "user_id_idx",
|
||||
"columns": [
|
||||
"userId"
|
||||
],
|
||||
"isUnique": false
|
||||
}
|
||||
},
|
||||
"foreignKeys": {
|
||||
"session_userId_user_id_fk": {
|
||||
"name": "session_userId_user_id_fk",
|
||||
"tableFrom": "session",
|
||||
"tableTo": "user",
|
||||
"columnsFrom": [
|
||||
"userId"
|
||||
],
|
||||
"columnsTo": [
|
||||
"id"
|
||||
],
|
||||
"onDelete": "cascade",
|
||||
"onUpdate": "no action"
|
||||
}
|
||||
},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {}
|
||||
},
|
||||
"user_setting": {
|
||||
"name": "user_setting",
|
||||
"columns": {
|
||||
"id": {
|
||||
"name": "id",
|
||||
"type": "text",
|
||||
"primaryKey": true,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"user_id": {
|
||||
"name": "user_id",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"color_scheme": {
|
||||
"name": "color_scheme",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": "'environment'"
|
||||
},
|
||||
"language": {
|
||||
"name": "language",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": "'en'"
|
||||
},
|
||||
"default_board": {
|
||||
"name": "default_board",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": "'default'"
|
||||
},
|
||||
"first_day_of_week": {
|
||||
"name": "first_day_of_week",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": "'monday'"
|
||||
},
|
||||
"search_template": {
|
||||
"name": "search_template",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": "'https://google.com/search?q=%s'"
|
||||
},
|
||||
"open_search_in_new_tab": {
|
||||
"name": "open_search_in_new_tab",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": true
|
||||
},
|
||||
"disable_ping_pulse": {
|
||||
"name": "disable_ping_pulse",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": false
|
||||
},
|
||||
"replace_ping_with_icons": {
|
||||
"name": "replace_ping_with_icons",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": false
|
||||
},
|
||||
"use_debug_language": {
|
||||
"name": "use_debug_language",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": false
|
||||
},
|
||||
"auto_focus_search": {
|
||||
"name": "auto_focus_search",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {
|
||||
"user_setting_user_id_user_id_fk": {
|
||||
"name": "user_setting_user_id_user_id_fk",
|
||||
"tableFrom": "user_setting",
|
||||
"tableTo": "user",
|
||||
"columnsFrom": [
|
||||
"user_id"
|
||||
],
|
||||
"columnsTo": [
|
||||
"id"
|
||||
],
|
||||
"onDelete": "cascade",
|
||||
"onUpdate": "no action"
|
||||
}
|
||||
},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {}
|
||||
},
|
||||
"user": {
|
||||
"name": "user",
|
||||
"columns": {
|
||||
"id": {
|
||||
"name": "id",
|
||||
"type": "text",
|
||||
"primaryKey": true,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"name": {
|
||||
"name": "name",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"email": {
|
||||
"name": "email",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"emailVerified": {
|
||||
"name": "emailVerified",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"image": {
|
||||
"name": "image",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"password": {
|
||||
"name": "password",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"salt": {
|
||||
"name": "salt",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"is_admin": {
|
||||
"name": "is_admin",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": false
|
||||
},
|
||||
"is_owner": {
|
||||
"name": "is_owner",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {}
|
||||
},
|
||||
"verificationToken": {
|
||||
"name": "verificationToken",
|
||||
"columns": {
|
||||
"identifier": {
|
||||
"name": "identifier",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"token": {
|
||||
"name": "token",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"expires": {
|
||||
"name": "expires",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {},
|
||||
"compositePrimaryKeys": {
|
||||
"verificationToken_identifier_token_pk": {
|
||||
"columns": [
|
||||
"identifier",
|
||||
"token"
|
||||
]
|
||||
}
|
||||
},
|
||||
"uniqueConstraints": {}
|
||||
}
|
||||
},
|
||||
"enums": {},
|
||||
"_meta": {
|
||||
"schemas": {},
|
||||
"tables": {},
|
||||
"columns": {}
|
||||
}
|
||||
}
|
||||
20
drizzle/meta/_journal.json
Normal file
20
drizzle/meta/_journal.json
Normal file
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"version": "5",
|
||||
"dialect": "sqlite",
|
||||
"entries": [
|
||||
{
|
||||
"idx": 0,
|
||||
"version": "5",
|
||||
"when": 1695874816934,
|
||||
"tag": "0000_supreme_the_captain",
|
||||
"breakpoints": true
|
||||
},
|
||||
{
|
||||
"idx": 1,
|
||||
"version": "5",
|
||||
"when": 1730643218521,
|
||||
"tag": "0001_brave_mimic",
|
||||
"breakpoints": true
|
||||
}
|
||||
]
|
||||
}
|
||||
20
drizzle/migrate/migrate.ts
Normal file
20
drizzle/migrate/migrate.ts
Normal file
@@ -0,0 +1,20 @@
|
||||
// This file is used to migrate the database to the current version
|
||||
// It is run when the docker container starts
|
||||
const Database = require('better-sqlite3');
|
||||
const path = require('path');
|
||||
const dotenv = require('dotenv');
|
||||
const { drizzle } = require('drizzle-orm/better-sqlite3');
|
||||
const { migrate } = require('drizzle-orm/better-sqlite3/migrator');
|
||||
|
||||
const migrationsFolder = process.argv[2] ?? '../drizzle';
|
||||
|
||||
dotenv.config({ path: path.join(__dirname, '/../.env') });
|
||||
const sqlite = new Database(process.env.DATABASE_URL!.replace('file:', ''));
|
||||
|
||||
const db = drizzle(sqlite);
|
||||
|
||||
const migrateDatabase = async () => {
|
||||
await migrate(db, { migrationsFolder });
|
||||
};
|
||||
|
||||
migrateDatabase();
|
||||
15
drizzle/migrate/package.json
Normal file
15
drizzle/migrate/package.json
Normal file
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"license": "MIT",
|
||||
"description": "This package.json is used for the migration script the dependencies are only installed within the Dockerfile.",
|
||||
"scripts": {
|
||||
"db:migrate": "tsx ./migrate.ts"
|
||||
},
|
||||
"dependencies": {
|
||||
"@types/better-sqlite3": "^7.6.7",
|
||||
"better-sqlite3": "8.6.0",
|
||||
"drizzle-orm": "^0.28.6",
|
||||
"dotenv": "^16.3.1",
|
||||
"tsx": "4.19.1",
|
||||
"typescript": "^5.2.2"
|
||||
}
|
||||
}
|
||||
@@ -5,33 +5,41 @@ module.exports = {
|
||||
i18n: {
|
||||
defaultLocale: 'en',
|
||||
locales: [
|
||||
'en',
|
||||
'ar',
|
||||
'cn',
|
||||
'cr',
|
||||
'cs',
|
||||
'da',
|
||||
'he',
|
||||
'de',
|
||||
'el',
|
||||
'en',
|
||||
'es',
|
||||
'fr',
|
||||
'he',
|
||||
'hr',
|
||||
'hu',
|
||||
'it',
|
||||
'ja',
|
||||
'ko',
|
||||
'lol',
|
||||
'lv',
|
||||
'nl',
|
||||
'no',
|
||||
'pl',
|
||||
'pt',
|
||||
'ru',
|
||||
'sk',
|
||||
'sl',
|
||||
'sv',
|
||||
'vi',
|
||||
'uk',
|
||||
'zh',
|
||||
'el',
|
||||
'sk',
|
||||
'no',
|
||||
'tr',
|
||||
'lv'
|
||||
'tw',
|
||||
'uk',
|
||||
'vi',
|
||||
'et',
|
||||
'lt',
|
||||
'ro'
|
||||
],
|
||||
|
||||
localeDetection: true,
|
||||
localeDetection: false,
|
||||
},
|
||||
returnEmptyString: false,
|
||||
appendNamespaceToCIMode: true,
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
require('./src/env');
|
||||
const { i18n } = require('./next-i18next.config');
|
||||
|
||||
const withBundleAnalyzer = require('@next/bundle-analyzer')({
|
||||
@@ -5,6 +6,14 @@ const withBundleAnalyzer = require('@next/bundle-analyzer')({
|
||||
});
|
||||
|
||||
module.exports = withBundleAnalyzer({
|
||||
eslint: {
|
||||
ignoreDuringBuilds: true,
|
||||
},
|
||||
webpack: (config) => {
|
||||
// for dynamic loading of auth providers
|
||||
config.experiments = { ...config.experiments, topLevelAwait: true };
|
||||
return config;
|
||||
},
|
||||
images: {
|
||||
domains: ['cdn.jsdelivr.net'],
|
||||
},
|
||||
@@ -12,4 +21,14 @@ module.exports = withBundleAnalyzer({
|
||||
output: 'standalone',
|
||||
i18n,
|
||||
transpilePackages: ['@jellyfin/sdk'],
|
||||
redirects: async () => [
|
||||
{
|
||||
source: '/',
|
||||
destination: '/unraid',
|
||||
permanent: false,
|
||||
},
|
||||
],
|
||||
env: {
|
||||
NEXTAUTH_URL_INTERNAL: process.env.NEXTAUTH_URL_INTERNAL || process.env.HOSTNAME || 'http://localhost:3000'
|
||||
},
|
||||
});
|
||||
|
||||
218
package.json
218
package.json
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "homarr",
|
||||
"version": "0.12.3",
|
||||
"version": "0.16.0",
|
||||
"description": "Homarr - A homepage for your server.",
|
||||
"license": "MIT",
|
||||
"repository": {
|
||||
@@ -9,19 +9,24 @@
|
||||
},
|
||||
"scripts": {
|
||||
"dev": "next dev",
|
||||
"build": "next build",
|
||||
"build": "NEXTAUTH_SECRET=WILL_BE_OVERWRITTEN next build",
|
||||
"analyze": "ANALYZE=true next build",
|
||||
"turbo": "turbo run build",
|
||||
"turbo": "DATABASE_URL=file:WILL_BE_OVERWRITTEN.sqlite turbo build",
|
||||
"start": "next start",
|
||||
"typecheck": "tsc --noEmit",
|
||||
"export": "next build && next export",
|
||||
"lint": "next lint",
|
||||
"prettier:check": "prettier --check \"**/*.{ts,tsx}\"",
|
||||
"prettier:write": "prettier --write \"**/*.{ts,tsx}\"",
|
||||
"test": "vitest",
|
||||
"test:ui": "vitest --ui",
|
||||
"test:run": "vitest run",
|
||||
"test:coverage": "vitest run --coverage"
|
||||
"test": "SKIP_ENV_VALIDATION=1 vitest",
|
||||
"test:docker": "yarn run turbo build && yarn test:run && docker build . -t homarr:local-dev && docker run -p 7575:7575 --name homarr-dev homarr:local-dev",
|
||||
"test:ui": "SKIP_ENV_VALIDATION=1 vitest --ui",
|
||||
"test:run": "SKIP_ENV_VALIDATION=1 vitest run",
|
||||
"test:coverage": "SKIP_ENV_VALIDATION=1 vitest run --coverage",
|
||||
"docker:build": "turbo build && docker build . -t homarr:local-dev",
|
||||
"docker:start": "docker run -p 7575:7575 --name homarr-development homarr:local-dev",
|
||||
"db:migrate": "dotenv tsx drizzle/migrate/migrate.ts ./drizzle",
|
||||
"db:add": "drizzle-kit generate:sqlite --config ./drizzle.config.ts"
|
||||
},
|
||||
"dependencies": {
|
||||
"@ctrl/deluge": "^4.1.0",
|
||||
@@ -33,34 +38,68 @@
|
||||
"@jellyfin/sdk": "^0.8.0",
|
||||
"@mantine/core": "^6.0.0",
|
||||
"@mantine/dates": "^6.0.0",
|
||||
"@mantine/dropzone": "^6.0.0",
|
||||
"@mantine/form": "^6.0.0",
|
||||
"@mantine/hooks": "^6.0.0",
|
||||
"@mantine/modals": "^6.0.0",
|
||||
"@mantine/next": "^6.0.0",
|
||||
"@mantine/notifications": "^6.0.0",
|
||||
"@mantine/prism": "^6.0.19",
|
||||
"@mantine/tiptap": "^6.0.17",
|
||||
"@nivo/core": "^0.83.0",
|
||||
"@nivo/line": "^0.83.0",
|
||||
"@react-native-async-storage/async-storage": "^1.18.1",
|
||||
"@tabler/icons-react": "^2.18.0",
|
||||
"@tanstack/query-async-storage-persister": "^4.27.1",
|
||||
"@tanstack/query-sync-storage-persister": "^4.27.1",
|
||||
"@t3-oss/env-nextjs": "^0.7.1",
|
||||
"@tabler/icons-react": "^2.20.0",
|
||||
"@tanstack/react-query": "^4.2.1",
|
||||
"@tanstack/react-query-devtools": "^4.24.4",
|
||||
"@tanstack/react-query-persist-client": "^4.28.0",
|
||||
"@tiptap/extension-color": "^2.1.12",
|
||||
"@tiptap/extension-highlight": "^2.1.12",
|
||||
"@tiptap/extension-image": "^2.1.12",
|
||||
"@tiptap/extension-link": "^2.1.12",
|
||||
"@tiptap/extension-table": "^2.1.12",
|
||||
"@tiptap/extension-table-cell": "^2.1.12",
|
||||
"@tiptap/extension-table-header": "^2.1.12",
|
||||
"@tiptap/extension-table-row": "^2.1.12",
|
||||
"@tiptap/extension-task-item": "^2.1.12",
|
||||
"@tiptap/extension-task-list": "^2.1.12",
|
||||
"@tiptap/extension-text-align": "^2.1.12",
|
||||
"@tiptap/extension-text-style": "^2.1.12",
|
||||
"@tiptap/extension-underline": "^2.1.12",
|
||||
"@tiptap/pm": "^2.1.12",
|
||||
"@tiptap/react": "^2.1.12",
|
||||
"@tiptap/starter-kit": "^2.1.12",
|
||||
"@trpc/client": "^10.37.1",
|
||||
"@trpc/next": "^10.37.1",
|
||||
"@trpc/react-query": "^10.37.1",
|
||||
"@trpc/server": "^10.37.1",
|
||||
"@types/bcryptjs": "^2.4.2",
|
||||
"@vitejs/plugin-react": "^4.0.0",
|
||||
"adm-zip": "^0.5.15",
|
||||
"axios": "^1.0.0",
|
||||
"bcryptjs": "^2.4.3",
|
||||
"better-sqlite3": "^8.6.0",
|
||||
"consola": "^3.0.0",
|
||||
"cookies": "^0.8.0",
|
||||
"cookies-next": "^2.1.1",
|
||||
"dayjs": "^1.11.7",
|
||||
"dockerode": "^3.3.2",
|
||||
"dotenv": "^16.3.1",
|
||||
"drizzle-kit": "^0.19.13",
|
||||
"drizzle-orm": "^0.28.6",
|
||||
"drizzle-zod": "^0.5.1",
|
||||
"fily-publish-gridstack": "^0.0.13",
|
||||
"flag-icons": "^6.9.2",
|
||||
"framer-motion": "^10.0.0",
|
||||
"generate-password": "^1.7.0",
|
||||
"html-entities": "^2.3.3",
|
||||
"i18next": "^22.5.1",
|
||||
"immer": "^10.0.2",
|
||||
"js-file-download": "^0.4.12",
|
||||
"next": "^13.4.2",
|
||||
"next-i18next": "^13.0.0",
|
||||
"ldapjs": "^3.0.5",
|
||||
"mantine-react-table": "^1.3.4",
|
||||
"next": "13.4.12",
|
||||
"next-auth": "^4.23.0",
|
||||
"next-i18next": "^14.0.0",
|
||||
"nextjs-cors": "^2.2.0",
|
||||
"nzbget-api": "^0.0.3",
|
||||
"prismjs": "^1.29.0",
|
||||
"react": "^18.2.0",
|
||||
@@ -69,79 +108,140 @@
|
||||
"react-simple-code-editor": "^0.13.1",
|
||||
"rss-parser": "^3.12.0",
|
||||
"sabnzbd-api": "^1.5.0",
|
||||
"swagger-ui-react": "^5.11.0",
|
||||
"tldts": "^6.1.18",
|
||||
"trpc-openapi": "^1.2.0",
|
||||
"uuid": "^9.0.0",
|
||||
"xml-js": "^1.6.11",
|
||||
"xss": "^1.0.14",
|
||||
"yarn": "^1.22.19",
|
||||
"zod": "^3.21.4",
|
||||
"zustand": "^4.3.7"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@next/bundle-analyzer": "^13.0.0",
|
||||
"@next/eslint-plugin-next": "^13.0.0",
|
||||
"@testing-library/jest-dom": "^5.16.5",
|
||||
"@next/eslint-plugin-next": "^13.4.5",
|
||||
"@testing-library/react": "^14.0.0",
|
||||
"@trivago/prettier-plugin-sort-imports": "^4.2.0",
|
||||
"@types/adm-zip": "^0.5.5",
|
||||
"@types/better-sqlite3": "^7.6.5",
|
||||
"@types/cookies": "^0.7.7",
|
||||
"@types/dockerode": "^3.3.9",
|
||||
"@types/node": "18.16.17",
|
||||
"@types/ldapjs": "^3.0.2",
|
||||
"@types/node": "^20.6.0",
|
||||
"@types/prismjs": "^1.26.0",
|
||||
"@types/react": "17.0.60",
|
||||
"@types/react": "^18.2.11",
|
||||
"@types/swagger-ui-react": "^4.18.3",
|
||||
"@types/umami": "^0.1.4",
|
||||
"@types/uuid": "^9.0.0",
|
||||
"@types/video.js": "^7.3.51",
|
||||
"@typescript-eslint/eslint-plugin": "^5.30.7",
|
||||
"@typescript-eslint/parser": "^5.30.7",
|
||||
"@vitest/coverage-c8": "^0.32.0",
|
||||
"@vitest/ui": "^0.32.0",
|
||||
"checkly": "latest",
|
||||
"eslint": "^8.20.0",
|
||||
"eslint-config-airbnb": "^19.0.4",
|
||||
"eslint-config-airbnb-typescript": "^17.0.0",
|
||||
"eslint-config-mantine": "^2.0.0",
|
||||
"eslint-plugin-import": "^2.26.0",
|
||||
"eslint-plugin-jsx-a11y": "^6.6.1",
|
||||
"eslint-plugin-react": "^7.30.1",
|
||||
"@typescript-eslint/eslint-plugin": "^6.0.0",
|
||||
"@typescript-eslint/parser": "^6.0.0",
|
||||
"@vitest/coverage-c8": "^0.33.0",
|
||||
"@vitest/coverage-v8": "^0.34.5",
|
||||
"@vitest/ui": "^0.34.4",
|
||||
"dotenv-cli": "^7.3.0",
|
||||
"eslint": "^8.0.1",
|
||||
"eslint-config-next": "^13.4.5",
|
||||
"eslint-plugin-promise": "^6.0.0",
|
||||
"eslint-plugin-react": "latest",
|
||||
"eslint-plugin-react-hooks": "^4.6.0",
|
||||
"eslint-plugin-testing-library": "^5.5.1",
|
||||
"eslint-plugin-unused-imports": "^2.0.0",
|
||||
"eslint-plugin-unused-imports": "^3.0.0",
|
||||
"eslint-plugin-vitest": "^0.2.0",
|
||||
"happy-dom": "^9.0.0",
|
||||
"happy-dom": "^10.0.0",
|
||||
"node-mocks-http": "^1.12.2",
|
||||
"prettier": "^2.7.1",
|
||||
"prettier": "^3.0.0",
|
||||
"sass": "^1.56.1",
|
||||
"ts-node": "latest",
|
||||
"turbo": "latest",
|
||||
"typescript": "^5.0.4",
|
||||
"tsx": "4.19.1",
|
||||
"turbo": "^1.10.12",
|
||||
"typescript": "5.1.6",
|
||||
"video.js": "^8.0.3",
|
||||
"vitest": "^0.32.0",
|
||||
"vite-tsconfig-paths": "^4.2.0",
|
||||
"vitest": "^0.33.0",
|
||||
"vitest-fetch-mock": "^0.2.2"
|
||||
},
|
||||
"resolutions": {
|
||||
"@types/react": "17.0.60",
|
||||
"@types/react-dom": "17.0.20"
|
||||
},
|
||||
"packageManager": "yarn@3.6.0",
|
||||
"nextBundleAnalysis": {
|
||||
"budget": null,
|
||||
"budgetPercentIncreaseRed": 20,
|
||||
"minimumChangeThreshold": 0,
|
||||
"showDetails": true
|
||||
},
|
||||
"renovate": {
|
||||
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
||||
"extends": [
|
||||
"config:base"
|
||||
"prettier": {
|
||||
"printWidth": 100,
|
||||
"tabWidth": 2,
|
||||
"parser": "typescript",
|
||||
"singleQuote": true,
|
||||
"trailingComma": "es5",
|
||||
"useTabs": false,
|
||||
"endOfLine": "lf",
|
||||
"importOrder": [
|
||||
"^@core/(.*)$",
|
||||
"^@server/(.*)$",
|
||||
"^@ui/(.*)$",
|
||||
"^[./]"
|
||||
],
|
||||
"commitMessagePrefix": "⬆️",
|
||||
"lockFileMaintenance": {
|
||||
"automerge": true
|
||||
"importOrderSeparation": true,
|
||||
"plugins": [
|
||||
"@trivago/prettier-plugin-sort-imports"
|
||||
],
|
||||
"importOrderSortSpecifiers": true
|
||||
},
|
||||
"eslintConfig": {
|
||||
"extends": [
|
||||
"next",
|
||||
"eslint:recommended",
|
||||
"plugin:@next/next/recommended",
|
||||
"plugin:react-hooks/recommended",
|
||||
"plugin:react/recommended",
|
||||
"plugin:@typescript-eslint/recommended",
|
||||
"plugin:vitest/recommended"
|
||||
],
|
||||
"plugins": [
|
||||
"testing-library",
|
||||
"unused-imports",
|
||||
"react",
|
||||
"vitest"
|
||||
],
|
||||
"overrides": [
|
||||
{
|
||||
"files": [
|
||||
"**/?(*.)+(spec|test).[jt]s?(x)"
|
||||
],
|
||||
"extends": [
|
||||
"plugin:testing-library/react"
|
||||
]
|
||||
}
|
||||
],
|
||||
"parser": "@typescript-eslint/parser",
|
||||
"parserOptions": {
|
||||
"project": "./tsconfig.json"
|
||||
},
|
||||
"minor": {
|
||||
"automerge": true
|
||||
},
|
||||
"patch": {
|
||||
"automerge": true
|
||||
},
|
||||
"pin": {
|
||||
"automerge": true
|
||||
"rules": {
|
||||
"import/no-cycle": "off",
|
||||
"react/react-in-jsx-scope": "off",
|
||||
"react/no-children-prop": "off",
|
||||
"@typescript-eslint/no-unused-vars": "off",
|
||||
"@typescript-eslint/no-unused-imports": "off",
|
||||
"@typescript-eslint/no-unused-expressions": "off",
|
||||
"@typescript-eslint/no-explicit-any": "off",
|
||||
"@typescript-eslint/no-shadow": "off",
|
||||
"@typescript-eslint/no-use-before-define": "off",
|
||||
"@typescript-eslint/no-non-null-assertion": "off",
|
||||
"no-continue": "off",
|
||||
"linebreak-style": 0,
|
||||
"import/extensions": "off",
|
||||
"vitest/max-nested-describe": [
|
||||
"error",
|
||||
{
|
||||
"max": 3
|
||||
}
|
||||
],
|
||||
"testing-library/no-node-access": [
|
||||
"error",
|
||||
{
|
||||
"allowContainerFirstChild": true
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
BIN
public/PoetsenOne-Regular.ttf
Normal file
BIN
public/PoetsenOne-Regular.ttf
Normal file
Binary file not shown.
BIN
public/imgs/2340450-2.png
Normal file
BIN
public/imgs/2340450-2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 188 KiB |
1
public/imgs/app-icons/truenas.svg
Normal file
1
public/imgs/app-icons/truenas.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg viewBox="0 0 90 90" xmlns="http://www.w3.org/2000/svg"><g fill="none"><path fill="#31BEEC" d="M90 38.197v19.137L48.942 80.999V61.864z"/><path d="M41.086 61.863V81L0 57.333V38.197l18.566 10.687c.02.016.043.03.067.04l22.453 12.94Z" fill="#0095D5"/><path fill="#AEADAE" d="m61.621 45.506-16.607 9.576-16.622-9.576 16.622-9.575z"/><path fill="#0095D5" d="M86.086 31.416 69.464 40.99 48.942 29.15V10z"/><path fill="#31BEEC" d="M41.086 10v19.15l-20.55 11.827-16.621-9.561z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 484 B |
1
public/imgs/app-icons/unraid-alt.svg
Normal file
1
public/imgs/app-icons/unraid-alt.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><defs><linearGradient id="a" x1="100%" x2="0" y1="0" y2="100%" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ff8d30"/><stop offset="1" stop-color="#e32929"/></linearGradient></defs><circle cx="50%" cy="50%" r="50%" fill="url(#a)"/><path fill="#fff" d="M246.6 200.8h18.7v110.6h-18.7zm-182.3 0H83v110.7H64.3zm91.1 123.9h18.7V367h-18.7zm-45.7-47.5h18.7v68.5h-18.7zm91.2 0h18.6v68.4h-18.6zm228.2-76.5h18.7v110.7h-18.7zM338 145.5h18.7v42.3H338zm45.7 21.2h18.7v68.2h-18.7zm-91.5 0h18.7v68.1h-18.7z"/></svg>
|
||||
|
After Width: | Height: | Size: 577 B |
35
public/locales/cn/authentication/invite.json
Normal file
35
public/locales/cn/authentication/invite.json
Normal file
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"metaTitle": "创建账号",
|
||||
"title": "创建账号",
|
||||
"text": "请在下面定义您的凭据",
|
||||
"form": {
|
||||
"fields": {
|
||||
"username": {
|
||||
"label": "用户名"
|
||||
},
|
||||
"password": {
|
||||
"label": "密码"
|
||||
},
|
||||
"passwordConfirmation": {
|
||||
"label": "确认密码"
|
||||
}
|
||||
},
|
||||
"buttons": {
|
||||
"submit": "创建账号"
|
||||
}
|
||||
},
|
||||
"notifications": {
|
||||
"loading": {
|
||||
"title": "正在创建账号...",
|
||||
"text": "请稍等"
|
||||
},
|
||||
"success": {
|
||||
"title": "账号已创建",
|
||||
"text": "您的账号创建成功"
|
||||
},
|
||||
"error": {
|
||||
"title": "错误",
|
||||
"text": "出错了,出现以下错误: {{error}}"
|
||||
}
|
||||
}
|
||||
}
|
||||
24
public/locales/cn/authentication/login.json
Normal file
24
public/locales/cn/authentication/login.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"metaTitle": "登录",
|
||||
"title": "欢迎回来!",
|
||||
"text": "请确认您的凭证",
|
||||
"form": {
|
||||
"fields": {
|
||||
"username": {
|
||||
"label": "用户名"
|
||||
},
|
||||
"password": {
|
||||
"label": "密码"
|
||||
}
|
||||
},
|
||||
"buttons": {
|
||||
"submit": "登录"
|
||||
},
|
||||
"afterLoginRedirection": "登录后,您将被重定向到 {{url}}",
|
||||
"providersEmpty": {
|
||||
"title": "验证提供程序错误",
|
||||
"message": "服务提供商未设置,请检查您的日志获取更多信息。"
|
||||
}
|
||||
},
|
||||
"alert": "您的凭据不正确或此账户不存在。请重试。"
|
||||
}
|
||||
5
public/locales/cn/boards/common.json
Normal file
5
public/locales/cn/boards/common.json
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"header": {
|
||||
"customize": "自定义面板"
|
||||
}
|
||||
}
|
||||
29
public/locales/cn/boards/customize.json
Normal file
29
public/locales/cn/boards/customize.json
Normal file
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"metaTitle": "自定义 {{name}} 面板",
|
||||
"pageTitle": "自定义 {{name}} 面板",
|
||||
"backToBoard": "返回面板",
|
||||
"settings": {
|
||||
"appearance": {
|
||||
"primaryColor": "主体色",
|
||||
"secondaryColor": "辅助色"
|
||||
}
|
||||
},
|
||||
"save": {
|
||||
"button": "保存更改",
|
||||
"note": "小心,您有未保存的更改!"
|
||||
},
|
||||
"notifications": {
|
||||
"pending": {
|
||||
"title": "自定义保存中",
|
||||
"message": "请稍候,我们正在保存您的自定义"
|
||||
},
|
||||
"success": {
|
||||
"title": "已保存自定义",
|
||||
"message": "您的自定义已成功保存"
|
||||
},
|
||||
"error": {
|
||||
"title": "错误",
|
||||
"message": "无法保存更改"
|
||||
}
|
||||
}
|
||||
}
|
||||
59
public/locales/cn/common.json
Normal file
59
public/locales/cn/common.json
Normal file
@@ -0,0 +1,59 @@
|
||||
{
|
||||
"save": "保存",
|
||||
"apply": "应用",
|
||||
"insert": "插入",
|
||||
"about": "关于",
|
||||
"cancel": "取消",
|
||||
"close": "关闭",
|
||||
"back": "返回",
|
||||
"delete": "删除",
|
||||
"ok": "确定",
|
||||
"edit": "编辑",
|
||||
"next": "下一步",
|
||||
"previous": "上一步",
|
||||
"confirm": "确认",
|
||||
"enabled": "已启用",
|
||||
"duplicate": "复制",
|
||||
"disabled": "已禁用",
|
||||
"enableAll": "全部启用",
|
||||
"disableAll": "全部禁用",
|
||||
"setTimer": "设置计时器",
|
||||
"version": "版本",
|
||||
"changePosition": "换位",
|
||||
"remove": "删除",
|
||||
"removeConfirm": "你确定要删除 {{item}} 吗?",
|
||||
"createItem": "创建{{item}}",
|
||||
"sections": {
|
||||
"settings": "设置",
|
||||
"dangerZone": "危险"
|
||||
},
|
||||
"secrets": {
|
||||
"apiKey": "API密钥",
|
||||
"username": "用户名",
|
||||
"password": "密码"
|
||||
},
|
||||
"tip": "提示: ",
|
||||
"time": {
|
||||
"seconds": "秒",
|
||||
"minutes": "分钟",
|
||||
"hours": "小时"
|
||||
},
|
||||
"loading": "正在加载...",
|
||||
"breakPoints": {
|
||||
"small": "小",
|
||||
"medium": "中",
|
||||
"large": "大"
|
||||
},
|
||||
"seeMore": "查看更多...",
|
||||
"position": {
|
||||
"left": "左边",
|
||||
"center": "居中",
|
||||
"right": "右边"
|
||||
},
|
||||
"attributes": {
|
||||
"width": "宽度",
|
||||
"height": "高度"
|
||||
},
|
||||
"public": "公开",
|
||||
"restricted": "限制"
|
||||
}
|
||||
25
public/locales/cn/layout/common.json
Normal file
25
public/locales/cn/layout/common.json
Normal file
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"modals": {
|
||||
"blockedPopups": {
|
||||
"title": "阻止弹出窗口",
|
||||
"text": "您的浏览器阻止了 Homarr 访问其 API。最常见的原因是广告拦截器或权限被拒绝。Homarr 无法自动请求权限。",
|
||||
"list": {
|
||||
"browserPermission": "点击链接旁的图标并检查权限,允许弹出窗口",
|
||||
"adBlockers": "禁用浏览器中的广告拦截器和安全工具",
|
||||
"otherBrowser": "尝试使用其它的浏览器"
|
||||
}
|
||||
}
|
||||
},
|
||||
"actions": {
|
||||
"category": {
|
||||
"openAllInNewTab": "在新标签页中打开全部内容"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"moveUp": "上移",
|
||||
"moveDown": "下移",
|
||||
"addCategory": "{{location}}添加分类",
|
||||
"addAbove": "在上方",
|
||||
"addBelow": "在下方"
|
||||
}
|
||||
}
|
||||
26
public/locales/cn/layout/element-selector/selector.json
Normal file
26
public/locales/cn/layout/element-selector/selector.json
Normal file
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"modal": {
|
||||
"title": "添加新磁贴",
|
||||
"text": "磁贴是 Homarr 的主要组成元素。它们被用来显示你的应用程序和其他信息。您可以根据需要增加任意数量的磁贴。"
|
||||
},
|
||||
"widgetDescription": "组件与您的应用交互,为您提供更多的应用程序控制。它们在使用前通常需要额外的配置。",
|
||||
"goBack": "上一步",
|
||||
"actionIcon": {
|
||||
"tooltip": "添加磁贴"
|
||||
},
|
||||
"apps": "应用",
|
||||
"app": {
|
||||
"defaultName": "您的应用"
|
||||
},
|
||||
"widgets": "组件",
|
||||
"categories": "分类",
|
||||
"category": {
|
||||
"newName": "新分类名称",
|
||||
"defaultName": "新建分类",
|
||||
"created": {
|
||||
"title": "分类已创建",
|
||||
"message": "已创建分类\"{{name}}\""
|
||||
}
|
||||
},
|
||||
"importFromDocker": "从 docker 导入"
|
||||
}
|
||||
5
public/locales/cn/layout/errors/access-denied.json
Normal file
5
public/locales/cn/layout/errors/access-denied.json
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"title": "拒绝访问",
|
||||
"text": "您没有足够的权限访问此页面。如果你相信, 这不是有意的, 请联系您的系统管理员。",
|
||||
"switchAccount": "切换到其他账户"
|
||||
}
|
||||
5
public/locales/cn/layout/errors/not-found.json
Normal file
5
public/locales/cn/layout/errors/not-found.json
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"title": "无法找到页面",
|
||||
"text": "找不到该页面。该页面的 URL 可能已过期、URL 无效或您现在没有访问该资源所需的权限。",
|
||||
"button": "返回首页"
|
||||
}
|
||||
27
public/locales/cn/layout/header.json
Normal file
27
public/locales/cn/layout/header.json
Normal file
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"search": {
|
||||
"label": "搜索",
|
||||
"engines": {
|
||||
"web": "在网上搜索 {{query}}",
|
||||
"youtube": "在 YouTube 上搜索 {{query}}",
|
||||
"torrent": "搜索 {{query}} Torrents",
|
||||
"movie": "在 {{app}} 上搜索 {{query}}"
|
||||
}
|
||||
},
|
||||
"actions": {
|
||||
"avatar": {
|
||||
"switchTheme": "切换主题",
|
||||
"preferences": "用户选项",
|
||||
"defaultBoard": "默认面板",
|
||||
"manage": "管理中心",
|
||||
"logout": "注销 {{username}}",
|
||||
"login": "登录"
|
||||
}
|
||||
},
|
||||
"modals": {
|
||||
"movie": {
|
||||
"title": "",
|
||||
"topResults": "最高 {{count}} 结果为 <b>{{search}}</b>。"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"description": "在编辑模式下,您可以调整磁贴和配置应用。在退出编辑模式之前不会保存更改。",
|
||||
"button": {
|
||||
"disabled": "进入编辑模式",
|
||||
"enabled": "退出并保存"
|
||||
},
|
||||
"popover": {
|
||||
"title": "启用 <1>{{size}}</1> 尺寸编辑模式",
|
||||
"text": "现在您可以调整和配置您的应用了,在退出编辑模式之前<strong>不会保存</strong>更改 。"
|
||||
},
|
||||
"unloadEvent": "退出编辑模式以保存更改"
|
||||
}
|
||||
37
public/locales/cn/layout/manage.json
Normal file
37
public/locales/cn/layout/manage.json
Normal file
@@ -0,0 +1,37 @@
|
||||
{
|
||||
"navigation": {
|
||||
"home": {
|
||||
"title": "首页"
|
||||
},
|
||||
"boards": {
|
||||
"title": "面板"
|
||||
},
|
||||
"users": {
|
||||
"title": "用户",
|
||||
"items": {
|
||||
"manage": "管理",
|
||||
"invites": "邀请"
|
||||
}
|
||||
},
|
||||
"help": {
|
||||
"title": "帮助",
|
||||
"items": {
|
||||
"documentation": "文档",
|
||||
"report": "报告问题 / bug",
|
||||
"discord": "Discord 社区",
|
||||
"contribute": "贡献"
|
||||
}
|
||||
},
|
||||
"tools": {
|
||||
"title": "工具",
|
||||
"items": {
|
||||
"docker": "Docker",
|
||||
"api": "API",
|
||||
"migrate": "迁移到 1.0"
|
||||
}
|
||||
},
|
||||
"about": {
|
||||
"title": "关于"
|
||||
}
|
||||
}
|
||||
}
|
||||
3
public/locales/cn/layout/mobile/drawer.json
Normal file
3
public/locales/cn/layout/mobile/drawer.json
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"title": "{{position}} 侧边栏"
|
||||
}
|
||||
30
public/locales/cn/layout/modals/about.json
Normal file
30
public/locales/cn/layout/modals/about.json
Normal file
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"description": "Homarr是一个 <strong>顺滑</strong> <strong>现代化</strong> 的面板,它能将您所有的应用和服务汇于指尖。有了 Homarr,您可以在一个页面中访问和控制一切。Homarr 与您添加的应用无缝交互,为您提供有价值的信息并由您完全控制。安装 Homarr 轻松简单,并且 Homarr 支持多种部署方式。",
|
||||
"addToDashboard": "添加至面板",
|
||||
"tip": "Mod 指的是您的修饰键,它是 Ctrl 或 Command/Super/Windows 键",
|
||||
"key": "快捷键",
|
||||
"action": "操作",
|
||||
"keybinds": "热键绑定",
|
||||
"translators": "翻译者 ({{count}})",
|
||||
"translatorsDescription": "感谢这些人,Homarr 现已支持 {{languages}} 种语言!想要帮助将 Homarr 翻译成您的语言吗?请阅读<a>此处</a>了解如何执行此操作 。",
|
||||
"contributors": "贡献者 ({{count}})",
|
||||
"contributorsDescription": "这些人构建了让 homarr 工作的代码!想帮助建造 Homarr 吗?请阅读<a>此处</a>了解如何操作",
|
||||
"actions": {
|
||||
"toggleTheme": "切换 白天/夜晚 模式",
|
||||
"focusSearchBar": "前往搜索栏",
|
||||
"openDocker": "打开 docker 组件",
|
||||
"toggleEdit": "切换编辑模式"
|
||||
},
|
||||
"metrics": {
|
||||
"configurationSchemaVersion": "配置模式版本",
|
||||
"version": "当前版本",
|
||||
"nodeEnvironment": "节点环境",
|
||||
"i18n": "I18n 翻译空间已加载",
|
||||
"locales": "I18n 本地语言已配置",
|
||||
"experimental_disableEditMode": "<b>实验性</b>: 关闭编辑模式"
|
||||
},
|
||||
"version": {
|
||||
"new": "新: {{newVersion}}",
|
||||
"dropdown": "版本 {{newVersion}} 可用!当前版本为 {{currentVersion}}"
|
||||
}
|
||||
}
|
||||
129
public/locales/cn/layout/modals/add-app.json
Normal file
129
public/locales/cn/layout/modals/add-app.json
Normal file
@@ -0,0 +1,129 @@
|
||||
{
|
||||
"tabs": {
|
||||
"general": "通用",
|
||||
"behaviour": "行为",
|
||||
"network": "网络",
|
||||
"appearance": "外观",
|
||||
"integration": "集成"
|
||||
},
|
||||
"general": {
|
||||
"appname": {
|
||||
"label": "应用名称",
|
||||
"description": "用于在面板上显示。"
|
||||
},
|
||||
"internalAddress": {
|
||||
"label": "内部地址",
|
||||
"description": "应用的内部IP地址。",
|
||||
"troubleshoot": {
|
||||
"label": "遇到问题了?",
|
||||
"header": "下面是一些常见的错误和解决方法:",
|
||||
"lines": {
|
||||
"nothingAfterPort": "在大多数情况下(不是所有情况),您不应该在端口之后输入任何路径。(即使是 pihole 的 '/admin' 或 plex 的 '/web')",
|
||||
"protocolCheck": "一定要确保URL前面是http或https,并确保你使用的是正确的URL。",
|
||||
"preferIP": "建议使用要与之通信的机器或容器的直接 Ip 地址。",
|
||||
"enablePings": "通过开启ping检查IP是否正确。 自定义面板 -> 布局 -> 启用 ping。应用磁贴上会出现一个红色或绿色的小泡泡,鼠标悬停在此就会显示相应代码(在大多数的情况下,绿色泡泡的代码为200)。",
|
||||
"wget": "为了确保homarr可以与其他应用程序通信,请使用wget/curl/ping应用程序的IP:port。",
|
||||
"iframe": "在使用 iframe 时,应始终使用与 Homarr 相同的协议 (http/s)。",
|
||||
"clearCache": "有些信息是在缓存中注册的,因此除非您在Homarr的一般选项中清除缓存,否则集成可能无法工作。"
|
||||
},
|
||||
"footer": "更多故障排除,请联系我们的{{discord}}。"
|
||||
}
|
||||
},
|
||||
"externalAddress": {
|
||||
"label": "外部地址",
|
||||
"description": "点击应用时打开的网址。",
|
||||
"tooltip": "您可以使用几个变量来创建动态地址:<br><br><b>[homarr_base]</b>: 不包括端口和路径的完整地址。<i>(例如:'https://subdomain.homarr.dev')</i><br><b>[homarr_hostname]</b>: 完整的基本网址,包括当前的子域。<i>(例如:'</i><b>subdomain</b>.homarr<i>.dev')</i><br><b>[homarr_domain]</b>: 域名,已过滤子域。<i>(例如:\"homarr.dev\")</i><br><b>[homarr_protocol]</b>:<i>http/https</i><br><br>这些变量都取决于当前网址。"
|
||||
}
|
||||
},
|
||||
"behaviour": {
|
||||
"isOpeningNewTab": {
|
||||
"label": "在新标签页中打开",
|
||||
"description": "在新标签页中打开应用,而不是当前标签页。"
|
||||
},
|
||||
"tooltipDescription": {
|
||||
"label": "应用描述",
|
||||
"description": "将鼠标悬停在应用上时,将显示您输入的文本。\n它可以为用户提供更多关于应用的详细信息,留空以隐藏。"
|
||||
},
|
||||
"customProtocolWarning": "使用非标准协议。这可能需要预先安装应用程序,并可能带来安全风险。确保您的地址安全可靠。"
|
||||
},
|
||||
"network": {
|
||||
"statusChecker": {
|
||||
"label": "状态检测",
|
||||
"description": "使用简单的HTTP(S) 请求检查您的应用是否在线。"
|
||||
},
|
||||
"statusCodes": {
|
||||
"label": "HTTP状态码",
|
||||
"description": "被视为在线的 HTTP 状态码。"
|
||||
}
|
||||
},
|
||||
"appearance": {
|
||||
"icon": {
|
||||
"label": "应用图标",
|
||||
"description": "输入以搜索图标,也可以粘贴自定义图标的网址。",
|
||||
"autocomplete": {
|
||||
"title": "未找到结果",
|
||||
"text": "尝试使用一个更具体的搜索词。如果您找不到您想要的图标,可以在上方粘贴图片的网址,以获得一个自定义图标。"
|
||||
},
|
||||
"noItems": {
|
||||
"title": "正在加载外部图标",
|
||||
"text": "这可能需要几秒钟"
|
||||
}
|
||||
},
|
||||
"appNameFontSize": {
|
||||
"label": "应用名称大小",
|
||||
"description": "设置应用名称在磁贴上显示时的字体大小。"
|
||||
},
|
||||
"appNameStatus": {
|
||||
"label": "应用名称状态",
|
||||
"description": "如果您想要显示标题,请选择显示的位置。",
|
||||
"dropdown": {
|
||||
"normal": "仅在磁贴上显示标题",
|
||||
"hover": "仅在悬停时显示标题",
|
||||
"hidden": "完全不显示"
|
||||
}
|
||||
},
|
||||
"positionAppName": {
|
||||
"label": "应用名称位置",
|
||||
"description": "应用名称相对于图标的位置。",
|
||||
"dropdown": {
|
||||
"top": "上边",
|
||||
"right": "右边",
|
||||
"bottom": "下边",
|
||||
"left": "左边"
|
||||
}
|
||||
},
|
||||
"lineClampAppName": {
|
||||
"label": "应用名称行数",
|
||||
"description": "定义标题最多能容纳多少行。设置为 0 表示无限制。"
|
||||
}
|
||||
},
|
||||
"integration": {
|
||||
"type": {
|
||||
"label": "集成配置",
|
||||
"description": "集成配置将用于连接到您的应用。",
|
||||
"placeholder": "选择一个集成",
|
||||
"defined": "已定义",
|
||||
"undefined": "未定义",
|
||||
"public": "公开",
|
||||
"private": "私有",
|
||||
"explanationPrivate": "私有密钥仅会被发送到服务器一次。一旦您的浏览器刷新了页面,它将永远不会再次发送。",
|
||||
"explanationPublic": "公开的密钥将始终发送给客户端,并且可以通过API访问。它不应该包含任何机密值,如用户名、密码、令牌、证书等!"
|
||||
},
|
||||
"secrets": {
|
||||
"description": "输入值并点击保存以更新密钥。使用清除按钮以删除密钥。",
|
||||
"warning": "您的凭据作为集成的访问权限,您应该<strong>永远不</strong>与任何人共享它们。Homarr 团队永远不会索要证书。确保<strong>安全地存储和管理您的秘钥</strong>。",
|
||||
"clear": "清除密钥",
|
||||
"save": "保存密钥",
|
||||
"update": "更新密钥"
|
||||
}
|
||||
},
|
||||
"validation": {
|
||||
"popover": "您的表单包含无效数据,因此它不能被保存。请解决所有问题,并再次点击此按钮以保存您的更改。",
|
||||
"name": "名称为必填项",
|
||||
"noUrl": "地址为必填项",
|
||||
"invalidUrl": "不是有效的地址",
|
||||
"noIconUrl": "此字段为必填",
|
||||
"noExternalUri": "外部地址为必填项",
|
||||
"invalidExternalUri": "无效的外部地址"
|
||||
}
|
||||
}
|
||||
8
public/locales/cn/layout/modals/change-position.json
Normal file
8
public/locales/cn/layout/modals/change-position.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"xPosition": "X轴位置",
|
||||
"width": "宽度",
|
||||
"height": "高度",
|
||||
"yPosition": "Y轴位置",
|
||||
"zeroOrHigher": "0 或更高",
|
||||
"betweenXandY": "在 {{min}} 和 {{max}} 之间"
|
||||
}
|
||||
57
public/locales/cn/manage/boards.json
Normal file
57
public/locales/cn/manage/boards.json
Normal file
@@ -0,0 +1,57 @@
|
||||
{
|
||||
"metaTitle": "面板",
|
||||
"pageTitle": "面板",
|
||||
"cards": {
|
||||
"statistics": {
|
||||
"apps": "应用",
|
||||
"widgets": "组件",
|
||||
"categories": "分类"
|
||||
},
|
||||
"buttons": {
|
||||
"view": "查看面板"
|
||||
},
|
||||
"menu": {
|
||||
"setAsDefault": "设置为默认",
|
||||
"delete": {
|
||||
"label": "永久删除",
|
||||
"disabled": "删除功能被禁用,因为较旧的 Homarr 组件不允许删除默认配置。将来可能会删除。"
|
||||
},
|
||||
"duplicate": "复制",
|
||||
"rename": {
|
||||
"label": "重命名",
|
||||
"modal": {
|
||||
"title": "重命名面板 {{name}}",
|
||||
"fields": {
|
||||
"name": {
|
||||
"label": "新名称",
|
||||
"placeholder": "新面板名称"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"badges": {
|
||||
"fileSystem": "文件系统",
|
||||
"default": "默认"
|
||||
}
|
||||
},
|
||||
"buttons": {
|
||||
"create": "创建新面板"
|
||||
},
|
||||
"modals": {
|
||||
"delete": {
|
||||
"title": "删除面板",
|
||||
"text": "你确定要删除这个面板吗? 此操作无法撤消,您的数据将永久丢失。"
|
||||
},
|
||||
"create": {
|
||||
"title": "创建面板",
|
||||
"text": "面板创建成功后,不能修改名称。",
|
||||
"form": {
|
||||
"name": {
|
||||
"label": "名称"
|
||||
},
|
||||
"submit": "创建"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
23
public/locales/cn/manage/index.json
Normal file
23
public/locales/cn/manage/index.json
Normal file
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"metaTitle": "管理中心",
|
||||
"hero": {
|
||||
"title": "欢迎回来,{{username}}!",
|
||||
"fallbackUsername": "匿名",
|
||||
"subtitle": "欢迎来到您的应用程序中心。组织、优化和征服!"
|
||||
},
|
||||
"quickActions": {
|
||||
"title": "快捷操作",
|
||||
"boards": {
|
||||
"title": "您的面板",
|
||||
"subtitle": "创建和管理您的面板"
|
||||
},
|
||||
"inviteUsers": {
|
||||
"title": "邀请新用户",
|
||||
"subtitle": "创建并发送注册邀请"
|
||||
},
|
||||
"manageUsers": {
|
||||
"title": "管理用户",
|
||||
"subtitle": "删除和管理您的用户"
|
||||
}
|
||||
}
|
||||
}
|
||||
33
public/locales/cn/manage/migrate.json
Normal file
33
public/locales/cn/manage/migrate.json
Normal file
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"metaTitle": "迁移到 1.0",
|
||||
"pageTitle": "迁移面板、组件和用户",
|
||||
"description": "将您的面板和用户导出到 ZIP 压缩包,以便在 1.0.0 版本之后将其迁移到 Homarr",
|
||||
"securityNote": {
|
||||
"title": "安全说明",
|
||||
"text": "导出用户和组件时,它还会打开一个带有加密密钥的窗口。此密钥是将数据导入 Homarr 所必需的。请妥善保管,不要与任何人分享。"
|
||||
},
|
||||
"form": {
|
||||
"label": "选择要导出的所有内容",
|
||||
"option": {
|
||||
"boards": {
|
||||
"label": "导出面板"
|
||||
},
|
||||
"integrations": {
|
||||
"label": "导出组件",
|
||||
"description": "这将包括用于组件的加密凭据。仅在导出面板时可用"
|
||||
},
|
||||
"users": {
|
||||
"label": "导出用户",
|
||||
"description": "这只会导出凭据用户,密码 hash 和 salt 已加密"
|
||||
}
|
||||
}
|
||||
},
|
||||
"action": {
|
||||
"export": "导出数据"
|
||||
},
|
||||
"modal": {
|
||||
"title": "加密密钥",
|
||||
"description": "您的数据已导出。请妥善保管此密钥,不要与任何人共享。您需要此密钥才能将数据导入 Homarr。",
|
||||
"copyDismiss": "复制并关闭"
|
||||
}
|
||||
}
|
||||
44
public/locales/cn/manage/users.json
Normal file
44
public/locales/cn/manage/users.json
Normal file
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"metaTitle": "用户",
|
||||
"pageTitle": "管理用户",
|
||||
"buttons": {
|
||||
"create": "创建"
|
||||
},
|
||||
"filter": {
|
||||
"roles": {
|
||||
"all": "全部",
|
||||
"normal": "普通",
|
||||
"admin": "管理员",
|
||||
"owner": "所有者"
|
||||
}
|
||||
},
|
||||
"table": {
|
||||
"header": {
|
||||
"user": "用户",
|
||||
"email": "邮箱"
|
||||
}
|
||||
},
|
||||
"tooltips": {
|
||||
"deleteUser": "删除用户",
|
||||
"demoteAdmin": "撤销管理员",
|
||||
"promoteToAdmin": "提升为管理员"
|
||||
},
|
||||
"modals": {
|
||||
"delete": {
|
||||
"title": "删除用户 {{name}}",
|
||||
"text": "您确定要删除用户 {{name}} 吗?这将删除与该账户相关的数据,但不会删除该用户创建的任何仪表盘。"
|
||||
},
|
||||
"change-role": {
|
||||
"promote": {
|
||||
"title": "将用户 {{name}} 提升为管理员",
|
||||
"text": "您确定要将用户{{name}} 提升为管理员吗? 这将允许用户访问Homarr实例上的所有资源。"
|
||||
},
|
||||
"demote": {
|
||||
"title": "将用户 {{name}} 降级为用户",
|
||||
"text": "您确定要将用户{{name}} 降级为用户吗? 这将删除用户对Homarr实例上所有资源的访问权限。"
|
||||
},
|
||||
"confirm": "确认"
|
||||
}
|
||||
},
|
||||
"searchDoesntMatch": "您的搜索与任何条目都不匹配。请调整您的过滤器。"
|
||||
}
|
||||
52
public/locales/cn/manage/users/create.json
Normal file
52
public/locales/cn/manage/users/create.json
Normal file
@@ -0,0 +1,52 @@
|
||||
{
|
||||
"metaTitle": "创建用户",
|
||||
"steps": {
|
||||
"account": {
|
||||
"title": "第一步",
|
||||
"text": "创建账号",
|
||||
"username": {
|
||||
"label": "用户名"
|
||||
},
|
||||
"email": {
|
||||
"label": "邮箱"
|
||||
}
|
||||
},
|
||||
"security": {
|
||||
"title": "第二步",
|
||||
"text": "密码",
|
||||
"password": {
|
||||
"label": "密码"
|
||||
}
|
||||
},
|
||||
"finish": {
|
||||
"title": "确认",
|
||||
"text": "保存到数据库",
|
||||
"card": {
|
||||
"title": "检查您的输入",
|
||||
"text": "将数据提交到数据库后,用户就可以登录了。您确定要将该用户存储在数据库中并激活登录吗?"
|
||||
},
|
||||
"table": {
|
||||
"header": {
|
||||
"property": "属性",
|
||||
"value": "参数值",
|
||||
"username": "用户名",
|
||||
"email": "邮箱",
|
||||
"password": "密码"
|
||||
},
|
||||
"notSet": "未设置",
|
||||
"valid": "有效"
|
||||
},
|
||||
"failed": "用户创建失败: {{error}}"
|
||||
},
|
||||
"completed": {
|
||||
"alert": {
|
||||
"title": "用户已创建",
|
||||
"text": "用户已在数据库中创建。他现在可以登录了。"
|
||||
}
|
||||
}
|
||||
},
|
||||
"buttons": {
|
||||
"generateRandomPassword": "随机生成",
|
||||
"createAnother": "创建另一个"
|
||||
}
|
||||
}
|
||||
55
public/locales/cn/manage/users/edit.json
Normal file
55
public/locales/cn/manage/users/edit.json
Normal file
@@ -0,0 +1,55 @@
|
||||
{
|
||||
"metaTitle": "用户 {{username}}",
|
||||
"back": "返回用户管理",
|
||||
"sections": {
|
||||
"general": {
|
||||
"title": "通用",
|
||||
"inputs": {
|
||||
"username": {
|
||||
"label": "用户名"
|
||||
},
|
||||
"eMail": {
|
||||
"label": "邮箱"
|
||||
}
|
||||
}
|
||||
},
|
||||
"security": {
|
||||
"title": "安全",
|
||||
"inputs": {
|
||||
"password": {
|
||||
"label": "新密码"
|
||||
},
|
||||
"terminateExistingSessions": {
|
||||
"label": "终止现有会话",
|
||||
"description": "强制用户在其设备上重新登录"
|
||||
},
|
||||
"confirm": {
|
||||
"label": "确认",
|
||||
"description": "密码将被更新。该操作不可撤销。"
|
||||
}
|
||||
}
|
||||
},
|
||||
"roles": {
|
||||
"title": "角色",
|
||||
"currentRole": "当前角色: ",
|
||||
"badges": {
|
||||
"owner": "所有者",
|
||||
"admin": "管理员",
|
||||
"normal": "普通"
|
||||
}
|
||||
},
|
||||
"deletion": {
|
||||
"title": "删除账号",
|
||||
"inputs": {
|
||||
"confirmUsername": {
|
||||
"label": "确认用户名",
|
||||
"description": "输入用户名以确认删除"
|
||||
},
|
||||
"confirm": {
|
||||
"label": "永久删除",
|
||||
"description": "我知道此操作是永久性的,所有帐户数据都将丢失。"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
48
public/locales/cn/manage/users/invites.json
Normal file
48
public/locales/cn/manage/users/invites.json
Normal file
@@ -0,0 +1,48 @@
|
||||
{
|
||||
"metaTitle": "用户邀请",
|
||||
"pageTitle": "管理用户邀请",
|
||||
"description": "使用邀请功能,可以邀请用户访问 Homarr 实例。邀请只在一定的时间范围内有效,并且只能使用一次。过期时间必须在创建后5分钟到12个月之间。",
|
||||
"button": {
|
||||
"createInvite": "创建邀请",
|
||||
"deleteInvite": "删除邀请"
|
||||
},
|
||||
"table": {
|
||||
"header": {
|
||||
"id": "ID",
|
||||
"creator": "创建者",
|
||||
"expires": "有效期",
|
||||
"action": "操作"
|
||||
},
|
||||
"data": {
|
||||
"expiresAt": "过期 {{at}}",
|
||||
"expiresIn": "{{in}}"
|
||||
}
|
||||
},
|
||||
"modals": {
|
||||
"create": {
|
||||
"title": "创建邀请",
|
||||
"description": "过期后,邀请会失效,被邀请的收件人将无法创建账号。",
|
||||
"form": {
|
||||
"expires": "过期时间",
|
||||
"submit": "创建"
|
||||
}
|
||||
},
|
||||
"copy": {
|
||||
"title": "复制邀请信息",
|
||||
"description": "您的邀请已生成。在此模式关闭后,<b>您将无法再复制此链接</b>。如果你不想再邀请这个人,你可以随时删除这个邀请。",
|
||||
"invitationLink": "邀请链接",
|
||||
"details": {
|
||||
"id": "ID",
|
||||
"token": "Token"
|
||||
},
|
||||
"button": {
|
||||
"close": "复制并关闭"
|
||||
}
|
||||
},
|
||||
"delete": {
|
||||
"title": "删除邀请",
|
||||
"description": "你确定要删除这个邀请吗? 使用此链接的用户将不能再使用该链接创建账号。"
|
||||
}
|
||||
},
|
||||
"noInvites": "还没有邀请。"
|
||||
}
|
||||
43
public/locales/cn/modules/bookmark.json
Normal file
43
public/locales/cn/modules/bookmark.json
Normal file
@@ -0,0 +1,43 @@
|
||||
{
|
||||
"descriptor": {
|
||||
"name": "书签",
|
||||
"description": "显示字符或链接的静态列表",
|
||||
"settings": {
|
||||
"title": "书签设置",
|
||||
"name": {
|
||||
"label": "组件标题",
|
||||
"info": "留空以隐藏标题。"
|
||||
},
|
||||
"items": {
|
||||
"label": "项目"
|
||||
},
|
||||
"layout": {
|
||||
"label": "显示布局",
|
||||
"data": {
|
||||
"autoGrid": "自动网格",
|
||||
"horizontal": "横向",
|
||||
"vertical": "垂直"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"card": {
|
||||
"noneFound": {
|
||||
"title": "书签列表为空",
|
||||
"text": "在编辑模式下为该列表添加新项目"
|
||||
}
|
||||
},
|
||||
"item": {
|
||||
"validation": {
|
||||
"length": "长度必须在 {{shortest}} 和 {{longest}} 之间",
|
||||
"invalidLink": "无效链接",
|
||||
"errorMsg": "由于存在验证错误,未保存。请调整您的输入"
|
||||
},
|
||||
"name": "名称",
|
||||
"url": "网址",
|
||||
"newTab": "在新标签页中打开",
|
||||
"hideHostname": "隐藏域名",
|
||||
"hideIcon": "隐藏图标",
|
||||
"delete": "删除"
|
||||
}
|
||||
}
|
||||
33
public/locales/cn/modules/calendar.json
Normal file
33
public/locales/cn/modules/calendar.json
Normal file
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"descriptor": {
|
||||
"name": "日历",
|
||||
"description": "在日历中显示来自支持集成中的即将发布的版本。",
|
||||
"settings": {
|
||||
"title": "日历组件设置",
|
||||
"radarrReleaseType": {
|
||||
"label": "Radarr发布类型",
|
||||
"data": {
|
||||
"inCinemas": "影院放映",
|
||||
"physicalRelease": "实体",
|
||||
"digitalRelease": "数字"
|
||||
}
|
||||
},
|
||||
"hideWeekDays": {
|
||||
"label": "隐藏星期"
|
||||
},
|
||||
"showUnmonitored": {
|
||||
"label": "显示未监视项目"
|
||||
},
|
||||
"fontSize": {
|
||||
"label": "字体大小",
|
||||
"data": {
|
||||
"xs": "超小号",
|
||||
"sm": "小号",
|
||||
"md": "中号",
|
||||
"lg": "大号",
|
||||
"xl": "超大号"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
6
public/locales/cn/modules/common-media-cards.json
Normal file
6
public/locales/cn/modules/common-media-cards.json
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"buttons": {
|
||||
"play": "开始",
|
||||
"request": "请求"
|
||||
}
|
||||
}
|
||||
10
public/locales/cn/modules/common.json
Normal file
10
public/locales/cn/modules/common.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"settings": {
|
||||
"label": "设置"
|
||||
},
|
||||
"errors": {
|
||||
"unmappedOptions": {
|
||||
"text": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
118
public/locales/cn/modules/dashdot.json
Normal file
118
public/locales/cn/modules/dashdot.json
Normal file
@@ -0,0 +1,118 @@
|
||||
{
|
||||
"descriptor": {
|
||||
"name": "Dash.",
|
||||
"description": "在 Homarr 中显示一个外部 Dash. 的图表。",
|
||||
"settings": {
|
||||
"title": "Dash. 组件设置",
|
||||
"dashName": {
|
||||
"label": "Dash. 名称"
|
||||
},
|
||||
"url": {
|
||||
"label": "Dash. 网址"
|
||||
},
|
||||
"usePercentages": {
|
||||
"label": "显示百分比"
|
||||
},
|
||||
"columns": {
|
||||
"label": "显示的列"
|
||||
},
|
||||
"graphHeight": {
|
||||
"label": "图表高度"
|
||||
},
|
||||
"graphsOrder": {
|
||||
"label": "图表(顺序)",
|
||||
"storage": {
|
||||
"label": "存储",
|
||||
"enabled": {
|
||||
"label": "在组件中显示"
|
||||
},
|
||||
"span": {
|
||||
"label": "列宽度"
|
||||
},
|
||||
"compactView": {
|
||||
"label": "显示为文本(紧凑型)"
|
||||
},
|
||||
"multiView": {
|
||||
"label": "显示为多驱动视图"
|
||||
}
|
||||
},
|
||||
"network": {
|
||||
"label": "网络",
|
||||
"enabled": {
|
||||
"label": "在组件中显示"
|
||||
},
|
||||
"span": {
|
||||
"label": "列宽度"
|
||||
},
|
||||
"compactView": {
|
||||
"label": "显示为文本(紧凑型)"
|
||||
}
|
||||
},
|
||||
"cpu": {
|
||||
"label": "CPU",
|
||||
"enabled": {
|
||||
"label": "在组件中显示"
|
||||
},
|
||||
"span": {
|
||||
"label": "列宽度"
|
||||
},
|
||||
"multiView": {
|
||||
"label": "显示为多核心视图"
|
||||
}
|
||||
},
|
||||
"ram": {
|
||||
"label": "内存",
|
||||
"enabled": {
|
||||
"label": "在组件中显示"
|
||||
},
|
||||
"span": {
|
||||
"label": "列宽度"
|
||||
}
|
||||
},
|
||||
"gpu": {
|
||||
"label": "GPU",
|
||||
"enabled": {
|
||||
"label": "在组件中显示"
|
||||
},
|
||||
"span": {
|
||||
"label": "列宽度"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"card": {
|
||||
"title": "Dash.",
|
||||
"errors": {
|
||||
"noService": "未找到 Dash. 服务。请在集成中将其添加到您的 Homarr 面板或在模块选项中设置 Dash. 网址",
|
||||
"noInformation": "无法从 Dash. 获取信息。- 你运行的是最新版本吗?",
|
||||
"protocolDowngrade": {
|
||||
"title": "检测到协议降级",
|
||||
"text": "与 Dash. 实例的连接使用的是HTTP。这是一个安全风险,因为HTTP是未加密的,攻击者可能会滥用此连接。确保 Dash. 使用的是HTTPS,或者将Homarr降级为HTTP(不推荐)。"
|
||||
}
|
||||
},
|
||||
"graphs": {
|
||||
"storage": {
|
||||
"title": "存储",
|
||||
"label": "存储:"
|
||||
},
|
||||
"network": {
|
||||
"title": "网络",
|
||||
"label": "网络:",
|
||||
"metrics": {
|
||||
"download": "下载",
|
||||
"upload": "上传"
|
||||
}
|
||||
},
|
||||
"cpu": {
|
||||
"title": "CPU"
|
||||
},
|
||||
"ram": {
|
||||
"title": "内存"
|
||||
},
|
||||
"gpu": {
|
||||
"title": "GPU"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
34
public/locales/cn/modules/date.json
Normal file
34
public/locales/cn/modules/date.json
Normal file
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"descriptor": {
|
||||
"name": "日期和时间",
|
||||
"description": "显示当前的日期和时间。",
|
||||
"settings": {
|
||||
"title": "日期和时间组件设置",
|
||||
"timezone": {
|
||||
"label": "时区",
|
||||
"info": "选择您所在时区的名称,在此找到您所在的时区: "
|
||||
},
|
||||
"customTitle": {
|
||||
"label": "城市名称或自定义标题"
|
||||
},
|
||||
"display24HourFormat": {
|
||||
"label": "全时显示(24 小时)"
|
||||
},
|
||||
"dateFormat": {
|
||||
"label": "日期格式",
|
||||
"data": {
|
||||
"hide": "隐藏日期"
|
||||
}
|
||||
},
|
||||
"titleState": {
|
||||
"label": "时钟标题",
|
||||
"info": "自定义标题和时区代码可以显示在 widget 上。<br/>您还可以单独显示城市、不显示、<br/>,甚至在同时选择了城市和时区但未提供标题时单独显示时区。",
|
||||
"data": {
|
||||
"both": "标题和时区",
|
||||
"city": "仅标题",
|
||||
"none": "不显示"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
35
public/locales/cn/modules/dlspeed.json
Normal file
35
public/locales/cn/modules/dlspeed.json
Normal file
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"descriptor": {
|
||||
"name": "下载速度",
|
||||
"description": "显示集成中支持的下载和上传速度。"
|
||||
},
|
||||
"card": {
|
||||
"table": {
|
||||
"header": {
|
||||
"name": "名称",
|
||||
"size": "大小",
|
||||
"download": "下载",
|
||||
"upload": "上传",
|
||||
"estimatedTimeOfArrival": "剩余时间",
|
||||
"progress": "进度"
|
||||
},
|
||||
"body": {
|
||||
"nothingFound": "没有找到种子"
|
||||
}
|
||||
},
|
||||
"lineChart": {
|
||||
"title": "当前下载速度",
|
||||
"download": "下载:{{download}}",
|
||||
"upload": "上传: {{upload}}",
|
||||
"timeSpan": "{{seconds}} 秒前",
|
||||
"totalDownload": "下载: {{download}}/秒",
|
||||
"totalUpload": "上传: {{upload}}/秒"
|
||||
},
|
||||
"errors": {
|
||||
"noDownloadClients": {
|
||||
"title": "没有找到支持的下载客户端!",
|
||||
"text": "添加下载服务以查看您当前的下载情况"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
25
public/locales/cn/modules/dns-hole-controls.json
Normal file
25
public/locales/cn/modules/dns-hole-controls.json
Normal file
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"descriptor": {
|
||||
"name": "DNS漏洞控制",
|
||||
"description": "从您的面板控制 PiHole 或 AdGuard",
|
||||
"settings": {
|
||||
"title": "DNS 漏洞控制设置",
|
||||
"showToggleAllButtons": {
|
||||
"label": "显示 \"启用/禁用全部 \"按钮"
|
||||
}
|
||||
},
|
||||
"errors": {
|
||||
"general": {
|
||||
"title": "无法找到 DNS 漏洞",
|
||||
"text": "到DNS漏洞的连接有问题。请验证您的配置/集成设置。"
|
||||
}
|
||||
}
|
||||
},
|
||||
"durationModal": {
|
||||
"title": "设置禁用时长",
|
||||
"hours": "时",
|
||||
"minutes": "分",
|
||||
"unlimited": "留空表示无限制",
|
||||
"set": "设置"
|
||||
}
|
||||
}
|
||||
28
public/locales/cn/modules/dns-hole-summary.json
Normal file
28
public/locales/cn/modules/dns-hole-summary.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"descriptor": {
|
||||
"name": "DNS漏洞统计",
|
||||
"description": "显示来自 PiHole 或 AdGuard 的重要数据",
|
||||
"settings": {
|
||||
"title": "DNS漏洞统计设置",
|
||||
"usePiHoleColors": {
|
||||
"label": "使用 PiHole 的颜色"
|
||||
},
|
||||
"layout": {
|
||||
"label": "显示布局",
|
||||
"data": {
|
||||
"grid": "2 x 2",
|
||||
"row": "横向",
|
||||
"column": "垂直"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"card": {
|
||||
"metrics": {
|
||||
"domainsOnAdlist": "广告列表中的域名",
|
||||
"queriesToday": "今日查询",
|
||||
"queriesBlockedTodayPercentage": "今日屏蔽",
|
||||
"queriesBlockedToday": "今日屏蔽"
|
||||
}
|
||||
}
|
||||
}
|
||||
83
public/locales/cn/modules/docker.json
Normal file
83
public/locales/cn/modules/docker.json
Normal file
@@ -0,0 +1,83 @@
|
||||
{
|
||||
"descriptor": {
|
||||
"name": "Docker",
|
||||
"description": "允许您轻松查看和管理所有的Docker容器。"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "按容器或镜像名称搜索"
|
||||
},
|
||||
"table": {
|
||||
"header": {
|
||||
"name": "名称",
|
||||
"image": "镜像",
|
||||
"ports": "端口",
|
||||
"state": "状态"
|
||||
},
|
||||
"body": {
|
||||
"portCollapse": "{{ports}} 更多"
|
||||
},
|
||||
"states": {
|
||||
"running": "运行中",
|
||||
"created": "已创建",
|
||||
"stopped": "已停止",
|
||||
"unknown": "未知"
|
||||
}
|
||||
},
|
||||
"actionBar": {
|
||||
"addService": {
|
||||
"title": "添加应用",
|
||||
"message": "添加应用到 Homarr"
|
||||
},
|
||||
"restart": {
|
||||
"title": "重启"
|
||||
},
|
||||
"stop": {
|
||||
"title": "停止"
|
||||
},
|
||||
"start": {
|
||||
"title": "开始"
|
||||
},
|
||||
"refreshData": {
|
||||
"title": "刷新"
|
||||
},
|
||||
"remove": {
|
||||
"title": "删除"
|
||||
},
|
||||
"addToHomarr": {
|
||||
"title": "添加到 Homarr"
|
||||
}
|
||||
},
|
||||
"actions": {
|
||||
"start": {
|
||||
"start": "正在启动...",
|
||||
"end": "已启动"
|
||||
},
|
||||
"stop": {
|
||||
"start": "正在停止",
|
||||
"end": "已停止"
|
||||
},
|
||||
"restart": {
|
||||
"start": "正在重启",
|
||||
"end": "已重启"
|
||||
},
|
||||
"remove": {
|
||||
"start": "删除中",
|
||||
"end": "已删除"
|
||||
}
|
||||
},
|
||||
"errors": {
|
||||
"integrationFailed": {
|
||||
"title": "Docker 集成失败",
|
||||
"message": "你是不是忘了挂载docker socket?"
|
||||
},
|
||||
"unknownError": {
|
||||
"title": "出现了一个错误"
|
||||
},
|
||||
"oneServiceAtATime": {
|
||||
"title": "请每次只添加一个应用程序或服务!"
|
||||
}
|
||||
},
|
||||
"actionIcon": {
|
||||
"tooltip": "Docker"
|
||||
}
|
||||
}
|
||||
141
public/locales/cn/modules/health-monitoring.json
Normal file
141
public/locales/cn/modules/health-monitoring.json
Normal file
@@ -0,0 +1,141 @@
|
||||
{
|
||||
"descriptor": {
|
||||
"name": "系统健康监测",
|
||||
"description": "显示系统运行状况和状态的信息。",
|
||||
"settings": {
|
||||
"title": "系统健康监测设置",
|
||||
"fahrenheit": {
|
||||
"label": "CPU 温度(华氏度)"
|
||||
},
|
||||
"cpu": {
|
||||
"label": "显示CPU信息",
|
||||
"load": "平均负载",
|
||||
"minute": "{{minute}} 分钟",
|
||||
"minutes": "{{minutes}} 分钟"
|
||||
},
|
||||
"memory": {
|
||||
"label": "显示内存信息"
|
||||
},
|
||||
"fileSystem": {
|
||||
"label": "显示文件系统信息"
|
||||
},
|
||||
"node": {
|
||||
"label": "按节点名称过滤",
|
||||
"info": "输入您的 Proxmox 节点名称以仅显示该节点的指标。默认情况下,显示整个集群。"
|
||||
},
|
||||
"defaultViewState": {
|
||||
"label": "默认打开的部分",
|
||||
"data": {
|
||||
"none": "不显示",
|
||||
"node": "节点",
|
||||
"vm": "虚拟机",
|
||||
"lxc": "LXCs",
|
||||
"storage": "存储"
|
||||
}
|
||||
},
|
||||
"defaultTabState": {
|
||||
"label": "默认打开选项卡",
|
||||
"info": "默认打开选项卡。仅当多个集成可用时才使用。",
|
||||
"data": {
|
||||
"system": "系统",
|
||||
"cluster": "集群"
|
||||
}
|
||||
},
|
||||
"summary": {
|
||||
"label": "显示摘要部分"
|
||||
},
|
||||
"showNode": {
|
||||
"label": "显示节点部分"
|
||||
},
|
||||
"showVM": {
|
||||
"label": "显示虚拟机部分"
|
||||
},
|
||||
"showLXCs": {
|
||||
"label": "显示 LXC 部分"
|
||||
},
|
||||
"showStorage": {
|
||||
"label": "显示存储部分"
|
||||
},
|
||||
"sectionIndicatorColor": {
|
||||
"label": "要求部分状态指示器为“OK”",
|
||||
"info": "全部 \"要求所有项目都在线,指标才会变为绿色。任意 \"要求至少有一个项目在线。",
|
||||
"data": {
|
||||
"any": "任意活动",
|
||||
"all": "全部活动"
|
||||
}
|
||||
},
|
||||
"ignoreCert": {
|
||||
"label": "忽略证书错误",
|
||||
"info": "如果启用,小工具在访问 Proxmox API 时将忽略证书错误。这在通过 HTTPS 访问 Proxmox 时很有帮助。"
|
||||
}
|
||||
}
|
||||
},
|
||||
"cpu": {
|
||||
"label": "CPU",
|
||||
"load": "平均负载",
|
||||
"minute": "{{minute}} 分钟"
|
||||
},
|
||||
"memory": {
|
||||
"label": "内存",
|
||||
"totalMem": "内存总量: {{total}}GB",
|
||||
"available": "可用: {{available}}GB - {{percentage}}%"
|
||||
},
|
||||
"fileSystem": {
|
||||
"label": "文件系统",
|
||||
"available": "可用: {{available}} - {{percentage}}%"
|
||||
},
|
||||
"info": {
|
||||
"uptime": "运行时间",
|
||||
"uptimeFormat": "{{days}} 天, {{hours}} 小时, {{minutes}} 分钟",
|
||||
"updates": "可用更新",
|
||||
"reboot": "重启"
|
||||
},
|
||||
"errors": {
|
||||
"general": {
|
||||
"title": "无法找到您的系统。",
|
||||
"text": "连接到您的系统时出现问题。请验证您的配置/集成。"
|
||||
}
|
||||
},
|
||||
"headings": {
|
||||
"system": "系统",
|
||||
"cluster": "集群"
|
||||
},
|
||||
"cluster": {
|
||||
"summary": {
|
||||
"cpu": "CPU",
|
||||
"ram": "内存"
|
||||
},
|
||||
"accordion": {
|
||||
"title": {
|
||||
"nodes": "节点",
|
||||
"vms": "虚拟机",
|
||||
"lxcs": "LXCs",
|
||||
"storage": "存储"
|
||||
}
|
||||
},
|
||||
"table": {
|
||||
"header": {
|
||||
"name": "名称",
|
||||
"cpu": "CPU",
|
||||
"ram": "内存",
|
||||
"node": "节点"
|
||||
}
|
||||
},
|
||||
"popover": {
|
||||
"node": "节点",
|
||||
"vmid": "VMID",
|
||||
"details": "详情",
|
||||
"cores": "核心 - {{maxCpu}}",
|
||||
"memSize": "内存 - {{maxMem}}",
|
||||
"memRatio": "内存 - {{usedMem}} / {{maxMem}}",
|
||||
"diskSize": "磁盘 - {{maxDisk}}",
|
||||
"diskRatio": "磁盘 - {{usedDisk}} / {{maxDisk}}",
|
||||
"uptime": "运行时间 - {{uptime}}",
|
||||
"plugin": "插件",
|
||||
"ha": "状态 - {{haState}}",
|
||||
"sharedStorage": "共享存储",
|
||||
"localStorage": "本地存储",
|
||||
"na": "不可用"
|
||||
}
|
||||
}
|
||||
}
|
||||
45
public/locales/cn/modules/iframe.json
Normal file
45
public/locales/cn/modules/iframe.json
Normal file
@@ -0,0 +1,45 @@
|
||||
{
|
||||
"descriptor": {
|
||||
"name": "iFrame",
|
||||
"description": "嵌入互联网上的任何内容。某些网站可能限制访问。",
|
||||
"settings": {
|
||||
"title": "iFrame设置",
|
||||
"embedUrl": {
|
||||
"label": "嵌入地址"
|
||||
},
|
||||
"allowFullScreen": {
|
||||
"label": "允许全屏"
|
||||
},
|
||||
"allowTransparency": {
|
||||
"label": "允许透明"
|
||||
},
|
||||
"allowScrolling": {
|
||||
"label": "允许滚动"
|
||||
},
|
||||
"allowPayment": {
|
||||
"label": "允许支付"
|
||||
},
|
||||
"allowAutoPlay": {
|
||||
"label": "允许自动播放"
|
||||
},
|
||||
"allowMicrophone": {
|
||||
"label": "允许麦克风"
|
||||
},
|
||||
"allowCamera": {
|
||||
"label": "允许摄像头"
|
||||
},
|
||||
"allowGeolocation": {
|
||||
"label": "允许地理位置"
|
||||
}
|
||||
}
|
||||
},
|
||||
"card": {
|
||||
"errors": {
|
||||
"noUrl": {
|
||||
"title": "无效链接",
|
||||
"text": "确保您在组件配置中输入了一个有效的地址"
|
||||
},
|
||||
"browserSupport": "您的浏览器不支持 iframe。请更新您的浏览器。"
|
||||
}
|
||||
}
|
||||
}
|
||||
22
public/locales/cn/modules/indexer-manager.json
Normal file
22
public/locales/cn/modules/indexer-manager.json
Normal file
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"descriptor": {
|
||||
"name": "索引器管理状态",
|
||||
"description": "有关索引器的状态",
|
||||
"settings": {
|
||||
"title": "索引器管理状态",
|
||||
"openIndexerSiteInNewTab": {
|
||||
"label": "在新选项卡中打开索引器站点"
|
||||
}
|
||||
}
|
||||
},
|
||||
"indexersStatus": {
|
||||
"title": "索引器管理",
|
||||
"testAllButton": "测试全部"
|
||||
},
|
||||
"errors": {
|
||||
"general": {
|
||||
"title": "无法找到索引管理器",
|
||||
"text": "连接索引管理器时出现问题。请验证您的配置/集成。"
|
||||
}
|
||||
}
|
||||
}
|
||||
35
public/locales/cn/modules/media-requests-list.json
Normal file
35
public/locales/cn/modules/media-requests-list.json
Normal file
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"descriptor": {
|
||||
"name": "媒体请求",
|
||||
"description": "查看 Overr 或 Jellyseerr 实例中的所有媒体请求列表",
|
||||
"settings": {
|
||||
"title": "媒体请求列表",
|
||||
"replaceLinksWithExternalHost": {
|
||||
"label": "使用外部地址替换链接"
|
||||
},
|
||||
"openInNewTab": {
|
||||
"label": "在新标签页中打开链接"
|
||||
}
|
||||
}
|
||||
},
|
||||
"noRequests": "未找到请求。请确保您已正确配置您的应用。",
|
||||
"state": {
|
||||
"approved": "已批准",
|
||||
"pendingApproval": "待批准",
|
||||
"declined": "已拒绝",
|
||||
"available": "可用",
|
||||
"partial": "部分"
|
||||
},
|
||||
"tooltips": {
|
||||
"approve": "批准请求",
|
||||
"decline": "拒绝请求",
|
||||
"approving": "正在批准请求..."
|
||||
},
|
||||
"mutation": {
|
||||
"approving": "正在批准",
|
||||
"declining": "拒绝中",
|
||||
"request": "请求...",
|
||||
"approved": "请求被批准!",
|
||||
"declined": "请求被拒绝!"
|
||||
}
|
||||
}
|
||||
27
public/locales/cn/modules/media-requests-stats.json
Normal file
27
public/locales/cn/modules/media-requests-stats.json
Normal file
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"descriptor": {
|
||||
"name": "媒体请求状态",
|
||||
"description": "您的媒体请求统计",
|
||||
"settings": {
|
||||
"title": "媒体请求状态",
|
||||
"replaceLinksWithExternalHost": {
|
||||
"label": "使用外部地址替换链接"
|
||||
},
|
||||
"openInNewTab": {
|
||||
"label": "在新标签页中打开链接"
|
||||
}
|
||||
}
|
||||
},
|
||||
"mediaStats": {
|
||||
"title": "媒体统计",
|
||||
"pending": "等待批准",
|
||||
"tvRequests": "电视请求",
|
||||
"movieRequests": "电影请求",
|
||||
"approved": "已经批准",
|
||||
"totalRequests": "请求总计"
|
||||
},
|
||||
"userStats": {
|
||||
"title": "用户排行",
|
||||
"requests": "请求: {{number}}"
|
||||
}
|
||||
}
|
||||
25
public/locales/cn/modules/media-server.json
Normal file
25
public/locales/cn/modules/media-server.json
Normal file
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"descriptor": {
|
||||
"name": "媒体服务",
|
||||
"description": "与您的 Jellyfin 或 Plex 媒体服务交互",
|
||||
"settings": {
|
||||
"title": "媒体服务组件设置"
|
||||
}
|
||||
},
|
||||
"loading": "正在载入流",
|
||||
"card": {
|
||||
"table": {
|
||||
"header": {
|
||||
"session": "会话",
|
||||
"user": "用户",
|
||||
"currentlyPlaying": "正在播放"
|
||||
}
|
||||
},
|
||||
"errors": {
|
||||
"general": {
|
||||
"title": "无法加载内容",
|
||||
"text": "无法从服务器检索信息。请检查日志获取更多详细信息"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
96
public/locales/cn/modules/media-transcoding.json
Normal file
96
public/locales/cn/modules/media-transcoding.json
Normal file
@@ -0,0 +1,96 @@
|
||||
{
|
||||
"descriptor": {
|
||||
"name": "媒体转码",
|
||||
"description": "显示有关媒体转码的信息",
|
||||
"settings": {
|
||||
"title": "媒体转码设置",
|
||||
"appId": {
|
||||
"label": "选择一个应用"
|
||||
},
|
||||
"defaultView": {
|
||||
"label": "默认视图",
|
||||
"data": {
|
||||
"workers": "工作种",
|
||||
"queue": "队列",
|
||||
"statistics": "统计"
|
||||
}
|
||||
},
|
||||
"showHealthCheck": {
|
||||
"label": "显示健康检查指示器"
|
||||
},
|
||||
"showHealthChecksInQueue": {
|
||||
"label": "在队列中显示健康检查"
|
||||
},
|
||||
"queuePageSize": {
|
||||
"label": "队列:每页项目数"
|
||||
},
|
||||
"showAppIcon": {
|
||||
"label": "在右下角显示应用程序图标"
|
||||
}
|
||||
}
|
||||
},
|
||||
"noAppSelected": "请在小组件设置中选择一个应用程序",
|
||||
"views": {
|
||||
"workers": {
|
||||
"table": {
|
||||
"header": {
|
||||
"name": "文件",
|
||||
"eta": "剩余时间",
|
||||
"progress": "进度"
|
||||
},
|
||||
"empty": "空",
|
||||
"tooltip": {
|
||||
"transcode": "转码",
|
||||
"healthCheck": "健康检查"
|
||||
}
|
||||
}
|
||||
},
|
||||
"queue": {
|
||||
"table": {
|
||||
"header": {
|
||||
"name": "文件",
|
||||
"size": "大小"
|
||||
},
|
||||
"footer": {
|
||||
"currentIndex": "{{start}}-{{end}} 共 {{total}}"
|
||||
},
|
||||
"empty": "空",
|
||||
"tooltip": {
|
||||
"transcode": "转码",
|
||||
"healthCheck": "健康检查"
|
||||
}
|
||||
}
|
||||
},
|
||||
"statistics": {
|
||||
"empty": "空",
|
||||
"box": {
|
||||
"transcodes": "转码: {{value}}",
|
||||
"healthChecks": "健康检查: {{value}}",
|
||||
"files": "文件: {{value}}",
|
||||
"spaceSaved": "已保存: {{value}}"
|
||||
},
|
||||
"pies": {
|
||||
"transcodes": "转码",
|
||||
"healthChecks": "健康检查",
|
||||
"videoCodecs": "编码",
|
||||
"videoContainers": "容器",
|
||||
"videoResolutions": "分辨率"
|
||||
}
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
"title": "错误",
|
||||
"message": "从 Tdarr 获取数据时发生错误。"
|
||||
},
|
||||
"tabs": {
|
||||
"workers": "工作种",
|
||||
"queue": "队列",
|
||||
"statistics": "统计"
|
||||
},
|
||||
"healthCheckStatus": {
|
||||
"title": "健康检查",
|
||||
"queued": "排队中",
|
||||
"healthy": "健康",
|
||||
"unhealthy": "不良"
|
||||
}
|
||||
}
|
||||
59
public/locales/cn/modules/notebook.json
Normal file
59
public/locales/cn/modules/notebook.json
Normal file
@@ -0,0 +1,59 @@
|
||||
{
|
||||
"descriptor": {
|
||||
"name": "笔记本",
|
||||
"description": "一个基于 Markdown 的交互式组件,供您写下笔记!",
|
||||
"settings": {
|
||||
"title": "笔记本组件设置",
|
||||
"showToolbar": {
|
||||
"label": "显示帮助您写下 Markdown 的工具栏"
|
||||
},
|
||||
"allowReadOnlyCheck": {
|
||||
"label": "允许在只读模式中检查"
|
||||
},
|
||||
"content": {
|
||||
"label": "笔记本的内容"
|
||||
}
|
||||
}
|
||||
},
|
||||
"card": {
|
||||
"controls": {
|
||||
"bold": "粗体",
|
||||
"italic": "斜体",
|
||||
"strikethrough": "删除线",
|
||||
"underline": "下划线",
|
||||
"colorText": "文字颜色",
|
||||
"colorHighlight": "彩色高亮文本",
|
||||
"code": "代码",
|
||||
"clear": "清除格式",
|
||||
"heading": "标题 {{level}}",
|
||||
"align": "对齐文本: {{position}}",
|
||||
"blockquote": "引用",
|
||||
"horizontalLine": "横线",
|
||||
"bulletList": "符号列表",
|
||||
"orderedList": "顺序列表",
|
||||
"checkList": "检查列表",
|
||||
"increaseIndent": "增加缩进",
|
||||
"decreaseIndent": "减小缩进",
|
||||
"link": "链接",
|
||||
"unlink": "删除链接",
|
||||
"image": "嵌入图片",
|
||||
"addTable": "添加表格",
|
||||
"deleteTable": "删除表格",
|
||||
"colorCell": "单元格颜色",
|
||||
"mergeCell": "切换单元格合并",
|
||||
"addColumnLeft": "在前面添加列",
|
||||
"addColumnRight": "在后面添加列",
|
||||
"deleteColumn": "删除整列",
|
||||
"addRowTop": "在前面添加行",
|
||||
"addRowBelow": "在后面添加行",
|
||||
"deleteRow": "删除整行"
|
||||
},
|
||||
"modals": {
|
||||
"clearColor": "清除颜色",
|
||||
"source": "来源",
|
||||
"widthPlaceholder": "百分比或像素值",
|
||||
"columns": "列数",
|
||||
"rows": "行数"
|
||||
}
|
||||
}
|
||||
}
|
||||
30
public/locales/cn/modules/overseerr.json
Normal file
30
public/locales/cn/modules/overseerr.json
Normal file
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"descriptor": {
|
||||
"name": "Overseerr",
|
||||
"description": "允许您从Overseerr 或 Jellyseerr 搜索和添加媒体。"
|
||||
},
|
||||
"popup": {
|
||||
"item": {
|
||||
"buttons": {
|
||||
"askFor": "请求 {{title}}",
|
||||
"cancel": "取消",
|
||||
"request": "请求"
|
||||
},
|
||||
"alerts": {
|
||||
"automaticApproval": {
|
||||
"title": "使用 API key",
|
||||
"text": "此请求将被自动批准"
|
||||
}
|
||||
}
|
||||
},
|
||||
"seasonSelector": {
|
||||
"caption": "勾选您想要下载的季",
|
||||
"table": {
|
||||
"header": {
|
||||
"season": "季",
|
||||
"numberOfEpisodes": "集数"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
11
public/locales/cn/modules/ping.json
Normal file
11
public/locales/cn/modules/ping.json
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"descriptor": {
|
||||
"name": "Ping",
|
||||
"description": "根据设定的URL的HTTP响应代码,显示一个状态指示器。"
|
||||
},
|
||||
"states": {
|
||||
"online": "在线 {{response}}",
|
||||
"offline": "离线 {{response}}",
|
||||
"loading": "正在加载..."
|
||||
}
|
||||
}
|
||||
40
public/locales/cn/modules/rss.json
Normal file
40
public/locales/cn/modules/rss.json
Normal file
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"descriptor": {
|
||||
"name": "RSS 组件",
|
||||
"description": "RSS 组件允许您在面板上显示 RSS 源。",
|
||||
"settings": {
|
||||
"title": "RSS 组件设置",
|
||||
"rssFeedUrl": {
|
||||
"label": "RSS 订阅地址",
|
||||
"description": "您想要显示的 RSS 订阅的地址。"
|
||||
},
|
||||
"refreshInterval": {
|
||||
"label": "刷新间隔(分钟)"
|
||||
},
|
||||
"dangerousAllowSanitizedItemContent": {
|
||||
"label": "允许 HTML 格式化(危险)",
|
||||
"info": "允许从外部进行HTML格式化可能是危险的。<br/>请确保订阅来自信任的来源。"
|
||||
},
|
||||
"textLinesClamp": {
|
||||
"label": "文字线条"
|
||||
},
|
||||
"sortByPublishDateAscending": {
|
||||
"label": "按发布日期排序(升序)"
|
||||
},
|
||||
"sortPostsWithoutPublishDateToTheTop": {
|
||||
"label": "将没有发布日期的文章置顶"
|
||||
},
|
||||
"maximumAmountOfPosts": {
|
||||
"label": "最大文章数量"
|
||||
}
|
||||
},
|
||||
"card": {
|
||||
"errors": {
|
||||
"general": {
|
||||
"title": "无法获取 RSS 订阅",
|
||||
"text": "在获取 RSS 订阅时出现了问题。确保使用有效的 URL 正确配置了 RSS 订阅。URL 应与官方规范匹配。更新 RSS 订阅后,您可能需要刷新面板。"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
30
public/locales/cn/modules/search.json
Normal file
30
public/locales/cn/modules/search.json
Normal file
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"descriptor": {
|
||||
"name": "搜索栏",
|
||||
"description": "一个搜索栏,允许你搜索你的自定义搜索引擎、YouTube和支持的集成。"
|
||||
},
|
||||
"input": {
|
||||
"placeholder": "在网上搜索..."
|
||||
},
|
||||
"switched-to": "切换到",
|
||||
"searchEngines": {
|
||||
"search": {
|
||||
"name": "网页",
|
||||
"description": "搜索..."
|
||||
},
|
||||
"youtube": {
|
||||
"name": "Youtube",
|
||||
"description": "在 Youtube 上搜索"
|
||||
},
|
||||
"torrents": {
|
||||
"name": "Torrents",
|
||||
"description": "搜索 Torrents"
|
||||
},
|
||||
"overseerr": {
|
||||
"name": "Overseerr",
|
||||
"description": "在 Overseer 上搜索电影和电视剧。"
|
||||
}
|
||||
},
|
||||
"tip": "您可以使用以下快捷键选择搜索栏 ",
|
||||
"switchedSearchEngine": "改用 {{searchEngine}} 进行搜索"
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user