Compare commits
562 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
996de036e8 | ||
|
|
10d8559ccc | ||
|
|
1e20f3e72c | ||
|
|
1b77917335 | ||
|
|
667feb4d10 | ||
|
|
0e325d8ea4 | ||
|
|
772026a17f | ||
|
|
4d88d1394d | ||
|
|
8fea366703 | ||
|
|
e2197049d6 | ||
|
|
7d44e8e7cf | ||
|
|
e00a547d6f | ||
|
|
cea9b1e23f | ||
|
|
4800d3ff10 | ||
|
|
9c6686376e | ||
|
|
53bfb3b255 | ||
|
|
e70ade555f | ||
|
|
9ad6379425 | ||
|
|
3890c5006a | ||
|
|
31b7a07078 | ||
|
|
9fc0254cf8 | ||
|
|
3e728b314b | ||
|
|
877ec0060d | ||
|
|
c1f27c64b6 | ||
|
|
042c5c091c | ||
|
|
6e843cfe66 | ||
|
|
cbc93e78be | ||
|
|
1e585b78ad | ||
|
|
d7bd5a6d79 | ||
|
|
d453d24ccb | ||
|
|
15c37eb1d9 | ||
|
|
4e00947322 | ||
|
|
ac13e546b7 | ||
|
|
9b32b0ec15 | ||
|
|
894b57937b | ||
|
|
434a41a08a | ||
|
|
99d7768d1c | ||
|
|
d4fa31098d | ||
|
|
68bffe725f | ||
|
|
8a0ec73ca7 | ||
|
|
f738cd2726 | ||
|
|
6641e263de | ||
|
|
78f8f08fe2 | ||
|
|
a7a1fbb27f | ||
|
|
da87c76207 | ||
|
|
7d5b955526 | ||
|
|
dcf124e17b | ||
|
|
97b884d9c4 | ||
|
|
f3ff209389 | ||
|
|
d947ed5c53 | ||
|
|
4ec76d35e0 | ||
|
|
629b93f7e3 | ||
|
|
e1bc9b2f34 | ||
|
|
5387ec4e9d | ||
|
|
459450a87e | ||
|
|
ef741e319b | ||
|
|
cab60c1f4c | ||
|
|
f9c0ff68f7 | ||
|
|
247110ecf5 | ||
|
|
df108e75dc | ||
|
|
cbbe542906 | ||
|
|
806db58be6 | ||
|
|
4a4bf2e33c | ||
|
|
951aa74510 | ||
|
|
2d36386507 | ||
|
|
b7d40c5b61 | ||
|
|
2576b541b0 | ||
|
|
ab74915c0b | ||
|
|
f094880851 | ||
|
|
e3d14fe7b8 | ||
|
|
a03047693f | ||
|
|
9ee4d249ee | ||
|
|
29c931a301 | ||
|
|
4dc2c29d86 | ||
|
|
535ca07400 | ||
|
|
52a4e5a09d | ||
|
|
4ba9aa70f8 | ||
|
|
3ce134304d | ||
|
|
3e50636c04 | ||
|
|
8e93475042 | ||
|
|
1ace681a39 | ||
|
|
02b40459ca | ||
|
|
a4ab101b83 | ||
|
|
b205e01620 | ||
|
|
d145e09afa | ||
|
|
14fb8cd5e7 | ||
|
|
cda3010569 | ||
|
|
bc2e43b1e3 | ||
|
|
c0820d7fc6 | ||
|
|
b916de9182 | ||
|
|
92e7092e0c | ||
|
|
b70869ad10 | ||
|
|
0a03002b7d | ||
|
|
6092c40dad | ||
|
|
1389f80cae | ||
|
|
b7f79c856c | ||
|
|
60af9e7bda | ||
|
|
69f44134d0 | ||
|
|
03ac6ec5ec | ||
|
|
ac1e0e1dc1 | ||
|
|
616c245f43 | ||
|
|
89843461fc | ||
|
|
c33eb5bede | ||
|
|
37fbc500a0 | ||
|
|
126e083e12 | ||
|
|
f45f0f41ac | ||
|
|
190bbef978 | ||
|
|
fc9b4fd525 | ||
|
|
5416d9402a | ||
|
|
6cff61f18d | ||
|
|
de47432a27 | ||
|
|
56b70fd4fa | ||
|
|
b9335f2210 | ||
|
|
eec6c52815 | ||
|
|
e0a2716222 | ||
|
|
349ca5951c | ||
|
|
e80585ed3c | ||
|
|
dd32bf4627 | ||
|
|
0bd3fa7102 | ||
|
|
d4e22d4830 | ||
|
|
87ce18f087 | ||
|
|
62774ab042 | ||
|
|
a772052845 | ||
|
|
fecc761eeb | ||
|
|
6fb1e93423 | ||
|
|
593a571725 | ||
|
|
3dffc3339c | ||
|
|
a5b1c47785 | ||
|
|
b229387b78 | ||
|
|
3db6ccda2d | ||
|
|
05181ad9b2 | ||
|
|
21f9320cef | ||
|
|
0f7c2214f0 | ||
|
|
34308491c6 | ||
|
|
45579d6df3 | ||
|
|
50b4cb972f | ||
|
|
b61e892b67 | ||
|
|
f7954a994b | ||
|
|
e07a0b0cca | ||
|
|
befa9a5c25 | ||
|
|
1543d57f7b | ||
|
|
431d275ff6 | ||
|
|
726a45aabb | ||
|
|
a4202850f6 | ||
|
|
1cfe3445f6 | ||
|
|
0090b87c48 | ||
|
|
26476df490 | ||
|
|
95590bd889 | ||
|
|
413e198dff | ||
|
|
b6ae17aad1 | ||
|
|
40b6699d04 | ||
|
|
77ecf62ec5 | ||
|
|
26086acf8d | ||
|
|
e4ead1d97e | ||
|
|
13788c92df | ||
|
|
b5ef8f23ea | ||
|
|
1ce1e00f9c | ||
|
|
2efdd288eb | ||
|
|
f69189043f | ||
|
|
b8d1d2b4b7 | ||
|
|
60f454d930 | ||
|
|
379d51d557 | ||
|
|
6d75bebe84 | ||
|
|
87e25b213b | ||
|
|
60241df28c | ||
|
|
ef65d80a5b | ||
|
|
a21ce4c5c1 | ||
|
|
88a6c22c40 | ||
|
|
b1b5da858a | ||
|
|
675a387b02 | ||
|
|
17d6c2f57e | ||
|
|
12372f826e | ||
|
|
459b483a8e | ||
|
|
28216c28e0 | ||
|
|
d633415531 | ||
|
|
5335d82f61 | ||
|
|
c2bad0b0a9 | ||
|
|
85f842587b | ||
|
|
a680efad94 | ||
|
|
00a5ef480e | ||
|
|
a56f174be8 | ||
|
|
bb007b69f1 | ||
|
|
773e3e1ac2 | ||
|
|
454fd11c0d | ||
|
|
0f76b21dc6 | ||
|
|
2d7fc6eb07 | ||
|
|
ca48c6fcbd | ||
|
|
39eef6623a | ||
|
|
a6d8107a97 | ||
|
|
7a3addc00f | ||
|
|
c270716deb | ||
|
|
99fd2e0f72 | ||
|
|
2145730a49 | ||
|
|
4e58a3e77b | ||
|
|
70f4634098 | ||
|
|
cb3e83c296 | ||
|
|
a62c3f6cd8 | ||
|
|
bcb7f6b3ac | ||
|
|
3e0b4caa6b | ||
|
|
97037033ae | ||
|
|
2501702f6e | ||
|
|
e8dc034b40 | ||
|
|
bdd0baa84e | ||
|
|
877c6706c4 | ||
|
|
197eaf38dd | ||
|
|
e96a8e1f6c | ||
|
|
8e4e95597a | ||
|
|
146055541f | ||
|
|
f8c2a7bc79 | ||
|
|
67bff29e3f | ||
|
|
9f98271e2a | ||
|
|
db5542de00 | ||
|
|
d59c2d3e02 | ||
|
|
0686f9d001 | ||
|
|
015561d973 | ||
|
|
12b66baebe | ||
|
|
8cc114bbf4 | ||
|
|
413d0009c4 | ||
|
|
e8035718b9 | ||
|
|
8d58d1604f | ||
|
|
60a7113023 | ||
|
|
6d219e70b4 | ||
|
|
bede08c00c | ||
|
|
4741b9310c | ||
|
|
98fe877830 | ||
|
|
bb9b0f1623 | ||
|
|
f1eae498b9 | ||
|
|
86817db14c | ||
|
|
cb511413e9 | ||
|
|
12e3dbe9f4 | ||
|
|
0bb22d0c52 | ||
|
|
e22ae2819f | ||
|
|
b90aa79795 | ||
|
|
fc23f94ed1 | ||
|
|
baced8f780 | ||
|
|
b30691595d | ||
|
|
100ed67c53 | ||
|
|
2b36eb3f1f | ||
|
|
ff13552c96 | ||
|
|
80e8dc94fb | ||
|
|
864fecaaff | ||
|
|
439c73c89f | ||
|
|
ce89f1dd9d | ||
|
|
b6668c6811 | ||
|
|
5dff4cd65a | ||
|
|
37fd064fa4 | ||
|
|
d16cfb8b4e | ||
|
|
2db28a3119 | ||
|
|
535c6ab96b | ||
|
|
c372da6971 | ||
|
|
2b59c32ad6 | ||
|
|
15c1c95bc0 | ||
|
|
85922be11e | ||
|
|
0514ee464a | ||
|
|
63b9ba38cb | ||
|
|
b75d1db867 | ||
|
|
531bb954d6 | ||
|
|
c5649b80e9 | ||
|
|
090fc87859 | ||
|
|
5a3f81e250 | ||
|
|
c542e5b2c1 | ||
|
|
d8d55d7d94 | ||
|
|
33b4343dd4 | ||
|
|
92c430a817 | ||
|
|
7051aeda83 | ||
|
|
78ea929c93 | ||
|
|
bfcccd0139 | ||
|
|
17c3605794 | ||
|
|
d2da68bc6c | ||
|
|
55bcadedff | ||
|
|
264cb754cd | ||
|
|
12e25d04d3 | ||
|
|
9547c3baec | ||
|
|
66dac6ff6d | ||
|
|
4990d4043a | ||
|
|
80fe545626 | ||
|
|
d3d1de6964 | ||
|
|
2f450e7026 | ||
|
|
3aa038ce05 | ||
|
|
254d45f747 | ||
|
|
a02e1e8a99 | ||
|
|
da22108ffd | ||
|
|
89aeb0b007 | ||
|
|
23f7a84649 | ||
|
|
b32852cf3c | ||
|
|
2d9b90e48c | ||
|
|
f0f87dbb11 | ||
|
|
77af028107 | ||
|
|
14c02b1c34 | ||
|
|
0b1af9db48 | ||
|
|
bb3d3d7ef3 | ||
|
|
f49ba2fb2d | ||
|
|
e1e6452b3a | ||
|
|
768d746cbf | ||
|
|
d4ac785b1b | ||
|
|
89adda8adf | ||
|
|
5c19c03a62 | ||
|
|
ef851d005f | ||
|
|
f4285a7531 | ||
|
|
7aba2af0f7 | ||
|
|
7b5055c02c | ||
|
|
86dd435903 | ||
|
|
66d12bef13 | ||
|
|
cc736b2209 | ||
|
|
34887272ed | ||
|
|
8e01d342a8 | ||
|
|
462d9dbff2 | ||
|
|
6db97b0f7f | ||
|
|
4474cccf30 | ||
|
|
17fa29c54f | ||
|
|
86adcbd8dd | ||
|
|
d2b68fbd58 | ||
|
|
abb1730a88 | ||
|
|
19b24d96a8 | ||
|
|
c558491bc8 | ||
|
|
2337be155c | ||
|
|
c3b04f60d5 | ||
|
|
aa6ed69015 | ||
|
|
1acc60f95c | ||
|
|
c5717814eb | ||
|
|
843a1df862 | ||
|
|
e7d16478b3 | ||
|
|
d4509691bc | ||
|
|
e84133ddd7 | ||
|
|
2070a17835 | ||
|
|
a1721def37 | ||
|
|
c92340649e | ||
|
|
a768d01dbe | ||
|
|
c3b199361c | ||
|
|
4b919f8a9b | ||
|
|
5a88beaf64 | ||
|
|
e151729cd8 | ||
|
|
be9a996928 | ||
|
|
9b60229f14 | ||
|
|
07dbcccc83 | ||
|
|
eea193ae5c | ||
|
|
72d2f1bb74 | ||
|
|
b97ba745a5 | ||
|
|
46e1c2027e | ||
|
|
bb9bced18b | ||
|
|
c5f4f17449 | ||
|
|
b9902e3fa0 | ||
|
|
93c2c77f6b | ||
|
|
d6af666230 | ||
|
|
beb262871e | ||
|
|
a7c15ce36f | ||
|
|
2f86b16491 | ||
|
|
eb62c7c53c | ||
|
|
bfba50aa8e | ||
|
|
b4bf81fe3c | ||
|
|
80eaea069e | ||
|
|
5854db4205 | ||
|
|
c3aa2b5282 | ||
|
|
d92ae25700 | ||
|
|
3fb87fa9b8 | ||
|
|
b5415ca5b9 | ||
|
|
749f3b21da | ||
|
|
e970fc69c1 | ||
|
|
a9c46c362d | ||
|
|
c6f72ad84a | ||
|
|
31bf46a406 | ||
|
|
83059bc536 | ||
|
|
a327bf2349 | ||
|
|
21eb2a604d | ||
|
|
db9d7e362d | ||
|
|
85de40d950 | ||
|
|
fd421cda15 | ||
|
|
98b3fda407 | ||
|
|
27f10d76db | ||
|
|
29626ebb06 | ||
|
|
f9f365aa3a | ||
|
|
292a46f402 | ||
|
|
f766e990b9 | ||
|
|
25ba708a9f | ||
|
|
0813b796ab | ||
|
|
1f6b433148 | ||
|
|
99643acddf | ||
|
|
9d683dcbf0 | ||
|
|
3416615d30 | ||
|
|
db63362327 | ||
|
|
9e6fb17d93 | ||
|
|
4594c99b57 | ||
|
|
f77c192e66 | ||
|
|
ca96e0c1de | ||
|
|
1bbb91b3fe | ||
|
|
d58cde69f6 | ||
|
|
f68d65264c | ||
|
|
27bbdef6df | ||
|
|
94307da70b | ||
|
|
d34c4b55f5 | ||
|
|
915a5dfd38 | ||
|
|
be513a0952 | ||
|
|
2ce3b29ad2 | ||
|
|
a138602670 | ||
|
|
ecef01b034 | ||
|
|
f295958c44 | ||
|
|
382f8f3ec0 | ||
|
|
1e72debe5f | ||
|
|
54a00ee099 | ||
|
|
fa6d1925b7 | ||
|
|
931915f366 | ||
|
|
ff2be31df4 | ||
|
|
f1867d3cc0 | ||
|
|
d043c21264 | ||
|
|
7f011878b4 | ||
|
|
6a6fcd4be9 | ||
|
|
b711f77cf7 | ||
|
|
c1f23d2fce | ||
|
|
23576873de | ||
|
|
3c9e5bd369 | ||
|
|
c456bd6bd6 | ||
|
|
133718972d | ||
|
|
a82d10a0c8 | ||
|
|
f353780ad4 | ||
|
|
88498d3887 | ||
|
|
25e774ca79 | ||
|
|
75f65de8f6 | ||
|
|
27a8c8fa56 | ||
|
|
f98441644b | ||
|
|
ca0ec003e7 | ||
|
|
6f94ac8764 | ||
|
|
edf2eb8c98 | ||
|
|
6623127702 | ||
|
|
ae8357fa6e | ||
|
|
5214583ad0 | ||
|
|
77236779c8 | ||
|
|
bbb9ce7272 | ||
|
|
4ea77a1015 | ||
|
|
91e4cfe14d | ||
|
|
e1a95405c1 | ||
|
|
5b11c0af34 | ||
|
|
4d851b6e86 | ||
|
|
7f45c29931 | ||
|
|
a6381a4a7e | ||
|
|
743b5340f8 | ||
|
|
0a56db5397 | ||
|
|
016b6dff09 | ||
|
|
b66ce53669 | ||
|
|
a32e76935e | ||
|
|
c1c75f78ba | ||
|
|
ee735fe342 | ||
|
|
49eb262465 | ||
|
|
6fa782d6a8 | ||
|
|
2e38a33fa7 | ||
|
|
c6ab08f7f0 | ||
|
|
a1bf7a6931 | ||
|
|
31b40e60f6 | ||
|
|
18e2338735 | ||
|
|
fd45aa6bd1 | ||
|
|
5f6aadcb95 | ||
|
|
d77045bee1 | ||
|
|
b97c48bc35 | ||
|
|
7cde9fea34 | ||
|
|
e2e581de59 | ||
|
|
492bddd192 | ||
|
|
6547452d1d | ||
|
|
61127b046b | ||
|
|
ecacd145e0 | ||
|
|
a9548fe8f4 | ||
|
|
e219296d15 | ||
|
|
c24d169511 | ||
|
|
a3e703aa8e | ||
|
|
c4d7e4907a | ||
|
|
62779c1668 | ||
|
|
041e5d8c28 | ||
|
|
07391dd4d1 | ||
|
|
5d26f8a607 | ||
|
|
8656606d46 | ||
|
|
60fc852255 | ||
|
|
12d07fd301 | ||
|
|
b6ac9ff909 | ||
|
|
f94ef50b99 | ||
|
|
0618aaa93e | ||
|
|
594beeb5b0 | ||
|
|
2636d54cc9 | ||
|
|
99a2153e9a | ||
|
|
dcf1107dae | ||
|
|
b213fa1e18 | ||
|
|
6268584741 | ||
|
|
b2e5597e49 | ||
|
|
ee3e45a56e | ||
|
|
b55b7f7778 | ||
|
|
762c6789b1 | ||
|
|
2ca71efa29 | ||
|
|
a6960a804f | ||
|
|
e3f6609b52 | ||
|
|
e7fbc5c690 | ||
|
|
6dd18dfca2 | ||
|
|
129c6d71de | ||
|
|
ae68f8cddb | ||
|
|
fa48ec83b2 | ||
|
|
2981a677a5 | ||
|
|
8371218c73 | ||
|
|
828f25de37 | ||
|
|
c93c041858 | ||
|
|
1eed8e5313 | ||
|
|
c2368e1af2 | ||
|
|
2de5c8fef5 | ||
|
|
b1892d8c32 | ||
|
|
8a76fc8e34 | ||
|
|
0229ad6a76 | ||
|
|
02bdbb3dc1 | ||
|
|
f62f628805 | ||
|
|
4471e316ff | ||
|
|
98ed7d1190 | ||
|
|
59a52c652b | ||
|
|
f304cbc74f | ||
|
|
e8845d90e3 | ||
|
|
6f937fbe00 | ||
|
|
631883a0d8 | ||
|
|
3f11b0024c | ||
|
|
3c5531dcd1 | ||
|
|
147016278a | ||
|
|
1f6bb48463 | ||
|
|
a6a2ee232a | ||
|
|
1ed49c3340 | ||
|
|
aef7f785ef | ||
|
|
427e46a702 | ||
|
|
da12eb65a0 | ||
|
|
08e6bc6c27 | ||
|
|
4886e97f2c | ||
|
|
0d79fcf8a5 | ||
|
|
777b2a1319 | ||
|
|
2caec6a8a9 | ||
|
|
472932806d | ||
|
|
70651b75f7 | ||
|
|
5600d26d5e | ||
|
|
124e86e407 | ||
|
|
0abc2584bd | ||
|
|
502d34e460 | ||
|
|
02923fa64c | ||
|
|
dbb750d306 | ||
|
|
0a8df26914 | ||
|
|
4fdfb6ecc1 | ||
|
|
d25a80dd48 | ||
|
|
47762390d4 | ||
|
|
e290451040 | ||
|
|
453f15c8d9 | ||
|
|
5a029afb52 | ||
|
|
e818c701b8 | ||
|
|
19da2ec829 | ||
|
|
69caa99c90 | ||
|
|
2d350ae7f2 | ||
|
|
821ed3433b | ||
|
|
756d640d06 | ||
|
|
27dfe6219a | ||
|
|
4aa34f66dc | ||
|
|
4813d49e42 | ||
|
|
c0836acc5e | ||
|
|
cdf1bb9529 | ||
|
|
8f893c36d7 | ||
|
|
c9cd395313 | ||
|
|
18f6e4d268 | ||
|
|
0523c1933e | ||
|
|
8eb08143be | ||
|
|
b0c52b53c9 | ||
|
|
d25de1147c | ||
|
|
8588ba5772 | ||
|
|
efa49a5b25 | ||
|
|
88568e8435 | ||
|
|
deb055b9bc | ||
|
|
6be38b9f58 |
36
.devcontainer/devcontainer.json
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
|
||||
// README at: https://github.com/devcontainers/templates/tree/main/src/javascript-node
|
||||
{
|
||||
"name": "Dashy",
|
||||
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
|
||||
"image": "mcr.microsoft.com/devcontainers/javascript-node:1-18-bullseye",
|
||||
"customizations": {
|
||||
"vscode": {
|
||||
"extensions": [
|
||||
"Vue.volar",
|
||||
"dbaeumer.vscode-eslint",
|
||||
"ms-azuretools.vscode-docker",
|
||||
"ms-edgedevtools.vscode-edge-devtools",
|
||||
"firefox-devtools.vscode-firefox-debug",
|
||||
"aaravb.chrome-extension-developer-tools"
|
||||
]
|
||||
}
|
||||
},
|
||||
|
||||
// Features to add to the dev container. More info: https://containers.dev/features.
|
||||
"features": {
|
||||
"ghcr.io/devcontainers/features/github-cli:1": {}
|
||||
},
|
||||
|
||||
// Use 'forwardPorts' to make a list of ports inside the container available locally.
|
||||
// "forwardPorts": [],
|
||||
|
||||
// Use 'postCreateCommand' to run commands after the container is created.
|
||||
"postCreateCommand": "yarn install --ignore-engines --immutable --no-cache --network-timeout 300000 --network-concurrency 1"
|
||||
|
||||
// Configure tool-specific properties.
|
||||
// "customizations": {},
|
||||
|
||||
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
|
||||
// "remoteUser": "root"
|
||||
}
|
||||
32
.env
|
|
@ -24,9 +24,35 @@
|
|||
# Defaults to true
|
||||
# REDIRECT_HTTPS=true
|
||||
|
||||
# The path to the user data directory
|
||||
# USER_DATA_DIR=user-data
|
||||
|
||||
# Enable HTTP basic auth to protect your *.yml config files
|
||||
# ENABLE_HTTP_AUTH=true
|
||||
|
||||
# Enable basic HTTP auth to protect your *.yml config files
|
||||
# BASIC_AUTH_USERNAME
|
||||
# BASIC_AUTH_PASSWORD
|
||||
|
||||
# If you'd like frontend to automatically authenticate when basic auth enabled, set credentials here too
|
||||
# VUE_APP_BASIC_AUTH_USERNAME
|
||||
# VUE_APP_BASIC_AUTH_PASSWORD
|
||||
|
||||
# Override where the path to the configuration file is, can be a remote URL
|
||||
# VUE_APP_CONFIG_PATH=/conf.yml
|
||||
|
||||
# Usually the same as BASE_URL, but accessible in frontend
|
||||
# VUE_APP_DOMAIN=https://dashy.to
|
||||
|
||||
# Override the page title for the frontend app
|
||||
# VUE_APP_TITLE=''
|
||||
|
||||
# Set the default view to load on startup (can be `minimal`, `workspace` or `home`)
|
||||
# VUE_APP_STARTING_VIEW=home
|
||||
|
||||
# Set the Vue app routing mode (can be 'hash', 'history' or 'abstract')
|
||||
# VUE_APP_ROUTING_MODE=history
|
||||
|
||||
# Should enable SRI for build script and link resources
|
||||
# INTEGRITY=true
|
||||
|
||||
|
|
@ -37,4 +63,8 @@
|
|||
# VUE_APP_VERSION=2.0.0
|
||||
|
||||
# Directory for conf.yml backups
|
||||
# BACKUP_DIR=./public/
|
||||
# BACKUP_DIR=./user-data/config-backups
|
||||
|
||||
# Setup any other user defined vars by prepending VUE_APP_ to the var name
|
||||
# VUE_APP_pihole_ip=http://your.pihole.ip
|
||||
# VUE_APP_pihole_key=your_pihole_secret_key
|
||||
|
|
|
|||
22
.github/AUTHORS.txt
vendored
|
|
@ -94,6 +94,7 @@ Brendan O'Leary <boleary@gitlab.com> - 2 commits
|
|||
CHAIYEON CHO <stoutcho21@gmail.com> - 2 commits
|
||||
Dan Gilbert <ddg@daentech.co.uk> - 2 commits
|
||||
Denis Savosin <dsavosin@at-consulting.ru> - 2 commits
|
||||
Mihai <31653632+z3r0l1nk@users.noreply.github.com> - 2 commits
|
||||
Ruben Silva <rubensilva945@gmail.com> - 2 commits
|
||||
Tammes Burghard <kde@kuchenmampfer.de> - 2 commits
|
||||
Thomas Dissert <dissertthomas@gmail.com> - 2 commits
|
||||
|
|
@ -108,6 +109,7 @@ patrickheeney <patrickheeney@gmail.com> - 2 commits
|
|||
rokiden <cheto@bk.ru> - 2 commits
|
||||
root <root@dashy-dev.alayham.com> - 2 commits
|
||||
rtm516 <rtm516@users.noreply.github.com> - 2 commits
|
||||
z3r0l1nk <stroescu.mihai@gmail.com> - 2 commits
|
||||
zcq100 <m@zcq100.com> - 2 commits
|
||||
ᗪєνιη ᗷυнʟ <onedr0p@users.noreply.github.com> - 2 commits
|
||||
Alucarddelta <dreyer.brent@gmail.com> - 3 commits
|
||||
|
|
@ -132,17 +134,19 @@ Alicie <gh@d0h.co> - 5 commits
|
|||
Benjamin Montgomery <bmontgom@montynet.org> - 5 commits
|
||||
Chris Nielsen <nielsen.chris@gmail.com> - 5 commits
|
||||
UrekD <urek.denis@gmail.com> - 5 commits
|
||||
dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - 5 commits
|
||||
Erik Vroon <erik.vroon22@gmail.com> - 6 commits
|
||||
Jammo2k5 <jammo2k5@hotmail.co.uk> - 6 commits
|
||||
Leonardo Covarrubias <leos@leocov.com> - 6 commits
|
||||
Magnus Sundström <kmvsundstrom@gmail.com> - 6 commits
|
||||
dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - 6 commits
|
||||
kristian <kristianbrasel@gmail.com> - 6 commits
|
||||
liss-bot <liss-bot@users.noreply.github.com> - 6 commits
|
||||
Josua Blejeru <josua@blejeru.com> - 8 commits
|
||||
Tobias <96661824+CrazyWolf13@users.noreply.github.com> - 8 commits
|
||||
Tobias <tobias.meier109@gmail.com> - 8 commits
|
||||
Jimmeh <jimmeh@gmail.com> - 9 commits
|
||||
Kashif Sohail <kashif.ezone@gmail.com> - 9 commits
|
||||
Liss-Bot <liss-bot@d0h.co> - 11 commits
|
||||
Tobias <96661824+CrazyWolf13@users.noreply.github.com> - 12 commits
|
||||
Alejandro Pinar Ruiz <alejandropinarruiz@gmail.com> - 14 commits
|
||||
Alicia Sykes <=> - 16 commits
|
||||
github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> - 16 commits
|
||||
|
|
@ -150,14 +154,14 @@ snyk-bot <snyk-bot@users.noreply.github.com> - 18 commits
|
|||
Matthias Bilger <matthias@bilger.info> - 19 commits
|
||||
aterox <church.kennetha@gmail.com> - 19 commits
|
||||
EVOTk <45015615+EVOTk@users.noreply.github.com> - 24 commits
|
||||
snyk-bot <snyk-bot@snyk.io> - 24 commits
|
||||
Marcell Fülöp <marekful@protonmail.com> - 27 commits
|
||||
Alicia Sykes <alicia@futr.ai> - 28 commits
|
||||
Lissy93 <gh@d0h.co> - 78 commits
|
||||
snyk-bot <snyk-bot@snyk.io> - 83 commits
|
||||
repo-visualizer <repo-visualizer@users.noreply.github.com> - 127 commits
|
||||
Lissy93 <Lissy93@users.noreply.github.com> - 219 commits
|
||||
Alicia Bot <87835202+liss-bot@users.noreply.github.com> - 231 commits
|
||||
liss-bot <liss-bot@d0h.co> - 232 commits
|
||||
Alicia Sykes <alicia@omg.lol> - 412 commits
|
||||
Alicia Sykes <gh@d0h.co> - 440 commits
|
||||
repo-visualizer <repo-visualizer@users.noreply.github.com> - 128 commits
|
||||
Lissy93 <Lissy93@users.noreply.github.com> - 222 commits
|
||||
Alicia Bot <87835202+liss-bot@users.noreply.github.com> - 240 commits
|
||||
liss-bot <liss-bot@d0h.co> - 244 commits
|
||||
Alicia Sykes <gh@d0h.co> - 439 commits
|
||||
Alicia Sykes <alicia@omg.lol> - 471 commits
|
||||
Alicia Sykes <sykes.alicia@gmail.com> - 1488 commits
|
||||
2
.github/ISSUE_TEMPLATE/bug.yml
vendored
|
|
@ -3,7 +3,7 @@ description: Report something that's not working the way it's (probably) intende
|
|||
title: '[BUG] <title>'
|
||||
labels: ['🐛 Bug']
|
||||
assignees:
|
||||
- lissy93
|
||||
- Lissy93
|
||||
body:
|
||||
- type: dropdown
|
||||
id: environment
|
||||
|
|
|
|||
2
.github/ISSUE_TEMPLATE/feature-request.yml
vendored
|
|
@ -2,6 +2,8 @@ name: Feature Request ✨
|
|||
description: Suggest an idea for future development of Dashy
|
||||
title: '[FEATURE_REQUEST] <title>'
|
||||
labels: ['🦄 Feature Request']
|
||||
assignees:
|
||||
- Lissy93
|
||||
|
||||
body:
|
||||
|
||||
|
|
|
|||
2
.github/ISSUE_TEMPLATE/question.yml
vendored
|
|
@ -2,6 +2,8 @@ name: Question 🤷♂️
|
|||
description: Got a question about Dashy, deployment, development or usage?
|
||||
title: '[QUESTION] <title>'
|
||||
labels: ['🤷♂️ Question']
|
||||
assignees:
|
||||
- Lissy93
|
||||
|
||||
body:
|
||||
# Filed 1 - Intro Text
|
||||
|
|
|
|||
2
.github/ISSUE_TEMPLATE/showcase-addition.yml
vendored
|
|
@ -2,6 +2,8 @@ name: Add your Dashboard to the Showcase 🌟
|
|||
description: Share a screenshot of your dashboard to the Readme showcase!
|
||||
title: '[SHOWCASE] <title>'
|
||||
labels: ['💯 Showcase']
|
||||
assignees:
|
||||
- lissy93
|
||||
|
||||
body:
|
||||
# 1 - Title
|
||||
|
|
|
|||
12
.github/dependabot.yml
vendored
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
# To get started with Dependabot version updates, you'll need to specify which
|
||||
# package ecosystems to update and where the package manifests are located.
|
||||
# Please see the documentation for more information:
|
||||
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
||||
# https://containers.dev/guide/dependabot
|
||||
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: "devcontainers"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: weekly
|
||||
7
.github/pull_request_template.md
vendored
|
|
@ -1,4 +1,7 @@
|
|||
*Thank you for contributing to Dashy! So that your PR can be handled effectively, please populate the following fields (delete sections that are not applicable)*
|
||||
<!--
|
||||
Thank you for contributing to Dashy!
|
||||
So that your PR can be handled effectively, please populate the following fields
|
||||
-->
|
||||
|
||||
**Category**:
|
||||
> One of: Bugfix / Feature / Code style update / Refactoring Only / Build related changes / Documentation / Other (please specify)
|
||||
|
|
@ -20,5 +23,5 @@
|
|||
- [ ] There are no (new) build warnings or errors
|
||||
- [ ] _(If a new config option is added)_ Attribute is outlined in the schema and documented
|
||||
- [ ] _(If a new dependency is added)_ Package is essential, and has been checked out for security or performance
|
||||
- [ ] Bumps version, if new feature added
|
||||
- [ ] _(If significant change)_ Bumps version in package.json
|
||||
|
||||
|
|
|
|||
27
.github/workflows/add-comment-from-tag.yml
vendored
|
|
@ -1,27 +0,0 @@
|
|||
# Based on a label applied to an issue, the bot will add a comment with some additional info
|
||||
name: 🎯 Auto-Reply to Labeled Tickets
|
||||
on:
|
||||
issues:
|
||||
types:
|
||||
- labeled
|
||||
- unlabeled
|
||||
pull_request_target:
|
||||
types:
|
||||
- labeled
|
||||
- unlabeled
|
||||
permissions:
|
||||
contents: read
|
||||
issues: write
|
||||
pull-requests: write
|
||||
|
||||
jobs:
|
||||
comment:
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
- name: Label Commenter
|
||||
uses: peaceiris/actions-label-commenter@v1
|
||||
with:
|
||||
config_file: .github/issue-auto-comments.yml
|
||||
github_token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
43
.github/workflows/auto-tag-pr.yml
vendored
|
|
@ -1,43 +0,0 @@
|
|||
# Creates a new tag, whenever the app version (in package.json) is updated in master
|
||||
# And marks any relevant issues as fixed
|
||||
name: 🏗️ Release Tag new Versions
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
jobs:
|
||||
tag-pre-release:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
outputs:
|
||||
tag: ${{ steps.autotag.outputs.tagname }}
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: butlerlogic/action-autotag@stable
|
||||
id: autotag
|
||||
with:
|
||||
GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
strategy: package
|
||||
commit_message_template: "🔖 {{number}} {{message}} (by {{author}})\nSHA: {{sha}}\n."
|
||||
github-release:
|
||||
runs-on: ubuntu-latest
|
||||
needs: tag-pre-release
|
||||
if: ${{ needs.tag-pre-release.outputs.tag }}
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: ncipollo/release-action@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
tag: ${{ needs.tag-pre-release.outputs.tag }}
|
||||
bodyFile: ".github/LATEST_CHANGELOG.md"
|
||||
mark-issue-fixed:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Label Fixed Issues
|
||||
uses: gh-bot/fix-labeler@master
|
||||
with:
|
||||
token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
label: '✅ Fixed'
|
||||
14
.github/workflows/broadcast-message.yml
vendored
|
|
@ -1,14 +0,0 @@
|
|||
# Updates multiple issues with a certain tag, with a comment containing a given message
|
||||
name: 🎯 Broadcast Message across Issues
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
message: { required: false }
|
||||
labels: { required: false }
|
||||
jobs:
|
||||
broadcast:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: jenschelkopf/broadcast-action@master
|
||||
with:
|
||||
token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
18
.github/workflows/build-docs-site.yml
vendored
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
# Builds and published Dashy's documentation website
|
||||
name: 📝 Build Docs Site
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
branches: [ WEBSITE/docs-site-source ]
|
||||
jobs:
|
||||
deploy:
|
||||
runs-on: ubuntu-latest
|
||||
if: github.ref == 'refs/heads/WEBSITE/docs-site-source'
|
||||
steps:
|
||||
- uses: actions/checkout@master
|
||||
- uses: redkubes/docusaurus-deploy-action@v1
|
||||
with:
|
||||
source-folder: ./
|
||||
git-user: ${{ github.actor }}
|
||||
git-password: ${{ secrets.GITHUB_TOKEN }}
|
||||
deployment-branch: gh-pages
|
||||
21
.github/workflows/close-incomplete-issues.yml
vendored
|
|
@ -1,21 +0,0 @@
|
|||
# Close any issue that does not match any of the issue templates
|
||||
name: 🎯 Close Incomplete Issues
|
||||
on:
|
||||
issues:
|
||||
types: [opened, edited]
|
||||
jobs:
|
||||
auto_close_issues:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v1
|
||||
- name: Automatically close issues that don't follow the issue template
|
||||
uses: lucasbento/auto-close-issues@v1.0.2
|
||||
with:
|
||||
github-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
closed-issues-label: '🙁 Auto-Closed'
|
||||
issue-close-message: |
|
||||
Hello @${issue.user.login} 👋
|
||||
Unfortunately your issue does not follow the format outlined in the template, and has therefore been auto-closed.
|
||||
To ensure that all relevant info is included, please either update or recreate your issue, and complete the sub-headings provided.
|
||||
Thank you :)
|
||||
55
.github/workflows/create-tag-for-version.yml
vendored
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
# When Dashy's version in package.json is updated
|
||||
# this workflow will create a new tag
|
||||
# And then publish it to the repository
|
||||
name: 🏗️ Tag on Version Change
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
paths:
|
||||
- 'package.json'
|
||||
|
||||
jobs:
|
||||
tag-if-version-updated:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Check Out Repository 🛎️
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Set Up Python 🐍
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: '3.x'
|
||||
|
||||
- name: Extract Version from package.json 🔢
|
||||
id: package_version
|
||||
run: |
|
||||
import json
|
||||
with open('package.json', 'r') as f:
|
||||
version = json.load(f)['version']
|
||||
print(f"::set-output name=VERSION::{version}")
|
||||
shell: python
|
||||
|
||||
- name: Get Latest Tag 🏷️
|
||||
id: latest_tag
|
||||
run: |
|
||||
git fetch --tags
|
||||
latest_tag=$(git describe --tags `git rev-list --tags --max-count=1` 2>/dev/null)
|
||||
echo "::set-output name=TAG::${latest_tag:-0}"
|
||||
|
||||
- name: Create and Push Tag ⤴️
|
||||
if: steps.package_version.outputs.VERSION != steps.latest_tag.outputs.TAG && steps.latest_tag.outputs.TAG != '0'
|
||||
run: |
|
||||
git config --local user.email "liss-bot@d0h.co"
|
||||
git config --local user.name "Liss-Bot"
|
||||
git tag -a ${{ steps.package_version.outputs.VERSION }} -m "Release v${{ steps.package_version.outputs.VERSION }}"
|
||||
git push origin ${{ steps.package_version.outputs.VERSION }}
|
||||
env:
|
||||
GIT_AUTHOR_NAME: Liss-Bot
|
||||
GIT_AUTHOR_EMAIL: liss-bot@d0h.co
|
||||
GIT_COMMITTER_NAME: Liss-Bot
|
||||
GIT_COMMITTER_EMAIL: liss-bot@d0h.co
|
||||
GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
|
|
@ -15,4 +15,3 @@ jobs:
|
|||
collapsibleThreshold: '25'
|
||||
failOnDowngrade: 'false'
|
||||
path: 'yarn.lock'
|
||||
updateComment: 'true'
|
||||
|
|
|
|||
67
.github/workflows/docker-build-publish.yml
vendored
|
|
@ -1,16 +1,24 @@
|
|||
# Scans, builds and releases a multi-architecture docker image
|
||||
name: 🐳 Build + Publish Multi-Platform Image
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
branches: ['master']
|
||||
tags: [v*]
|
||||
tags: ['*.*']
|
||||
paths:
|
||||
- '**.js'
|
||||
- 'src/**'
|
||||
- 'public/**'
|
||||
- 'services/**'
|
||||
- '.github/workflows/docker-build-publish.yml'
|
||||
- 'Dockerfile'
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
packages: write
|
||||
|
||||
env:
|
||||
DH_IMAGE: ${{ secrets.DOCKER_REPO }}
|
||||
|
|
@ -24,18 +32,12 @@ jobs:
|
|||
|
||||
steps:
|
||||
- name: 🛎️ Checkout Repo
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: 🔖 Get App Version
|
||||
uses: tyankatsu0105/read-package-version-actions@v1
|
||||
id: package-version
|
||||
|
||||
# - name: ✨ Validate Dockerfile
|
||||
# uses: ghe-actions/dockerfile-validator@v1
|
||||
# with:
|
||||
# dockerfile: 'Dockerfile'
|
||||
# lint: 'hadolint'
|
||||
|
||||
- name: 🗂️ Make Docker Meta
|
||||
id: meta
|
||||
uses: docker/metadata-action@v3
|
||||
|
|
@ -43,10 +45,13 @@ jobs:
|
|||
images: |
|
||||
${{ env.DH_IMAGE }}
|
||||
ghcr.io/${{ env.GH_IMAGE }}
|
||||
# ${{ secrets.ACR_SERVER }}/${{ secrets.ACR_USERNAME }}
|
||||
tags: |
|
||||
type=ref,event=tag,prefix=release-,suffix={{tag}}
|
||||
type=semver,pattern={{raw}},value=${{ steps.package-version.outputs.version }}
|
||||
type=ref,event=tag
|
||||
type=semver,pattern={{version}},enable=false
|
||||
type=semver,pattern={{major}}.x
|
||||
type=raw,value=latest
|
||||
flavor: |
|
||||
latest=false
|
||||
labels: |
|
||||
maintainer=Lissy93
|
||||
org.opencontainers.image.title=Dashy
|
||||
|
|
@ -57,35 +62,41 @@ jobs:
|
|||
|
||||
- name: 🔧 Set up QEMU
|
||||
uses: docker/setup-qemu-action@v1
|
||||
with:
|
||||
platforms: linux/amd64,linux/arm64,linux/arm/v7
|
||||
|
||||
- name: 🔧 Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v1
|
||||
uses: docker/setup-buildx-action@v2
|
||||
with:
|
||||
use-buildkit: true
|
||||
buildkit-daemon-opts: "--oci-worker-no-process-sandbox"
|
||||
|
||||
- name: 👀 Inspect builder
|
||||
run: |
|
||||
echo "Name: ${{ steps.buildx.outputs.name }}"
|
||||
echo "Endpoint: ${{ steps.buildx.outputs.endpoint }}"
|
||||
echo "Status: ${{ steps.buildx.outputs.status }}"
|
||||
echo "Flags: ${{ steps.buildx.outputs.flags }}"
|
||||
echo "Platforms: ${{ steps.buildx.outputs.platforms }}"
|
||||
|
||||
- name: 🔑 Login to DockerHub
|
||||
uses: docker/login-action@v1
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
username: ${{ secrets.DOCKER_USERNAME }}
|
||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||
|
||||
- name: 🔑 Login to GitHub Container Registry
|
||||
uses: docker/login-action@v1
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.repository_owner }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
# - name: 🔑 Login to Azure Container Registry
|
||||
# uses: docker/login-action@v1
|
||||
# with:
|
||||
# registry: ${{ secrets.ACR_SERVER }}
|
||||
# username: ${{ secrets.ACR_USERNAME }}
|
||||
# password: ${{ secrets.ACR_PASSWORD }}
|
||||
|
||||
- name: 🚦 Check Registry Status
|
||||
uses: crazy-max/ghaction-docker-status@v1
|
||||
|
||||
- name: ⚒️ Build and push
|
||||
uses: docker/build-push-action@v2
|
||||
uses: docker/build-push-action@v3
|
||||
with:
|
||||
context: .
|
||||
file: ./Dockerfile
|
||||
|
|
@ -93,13 +104,3 @@ jobs:
|
|||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
push: true
|
||||
|
||||
# - name: 💬 Set Docker Hub Description
|
||||
# uses: peter-evans/dockerhub-description@v2
|
||||
# with:
|
||||
# repository: lissy93/dashy
|
||||
# readme-filepath: ./docker/docker-readme.md
|
||||
# short-description: Dashy - A self-hosted start page for your server
|
||||
# username: ${{ secrets.DOCKER_USERNAME }}
|
||||
# password: ${{ secrets.DOCKER_USER_PASS }}
|
||||
|
||||
|
|
|
|||
63
.github/workflows/docker-publish.yml
vendored
|
|
@ -1,63 +0,0 @@
|
|||
# Builds a Docker image from with latest tag when master branch is updated
|
||||
# The publishes it to GitHub container registry as a package
|
||||
name: 🏗️ Build + Publish Docker Image to GHCR
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
branches: ['master']
|
||||
tags: [v*]
|
||||
env:
|
||||
REGISTRY: ghcr.io
|
||||
IMAGE_NAME: dashy
|
||||
jobs:
|
||||
build-and-push-image:
|
||||
runs-on: ubuntu-latest
|
||||
if: "!contains(github.event.head_commit.message, '[ci-skip]')"
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
steps:
|
||||
# Fetch the code
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Prepare
|
||||
id: prep
|
||||
run: echo ::set-output name=version::${GITHUB_REF##*/}
|
||||
|
||||
# Use QEMU for multi-architecture builds
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v1
|
||||
with:
|
||||
platforms: all
|
||||
|
||||
# # Use Moby BuildKit
|
||||
# - name: Set up Docker Buildx
|
||||
# id: buildx
|
||||
# uses: docker/setup-buildx-action@v1
|
||||
# with:
|
||||
# install: true
|
||||
# version: latest
|
||||
# driver-opts: image=moby/buildkit:master
|
||||
|
||||
# Login into GH container registry
|
||||
- name: Log in to registry
|
||||
run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin
|
||||
|
||||
# Build the image from default Dockerfile
|
||||
- name: Build image
|
||||
run: docker build . --file docker/Dockerfile-multi-arch --tag $IMAGE_NAME --label "runnumber=${GITHUB_RUN_ID}"
|
||||
|
||||
# Push build image
|
||||
- name: Push image
|
||||
run: |
|
||||
IMAGE_ID=ghcr.io/${{ github.repository_owner }}/$IMAGE_NAME
|
||||
IMAGE_ID=$(echo $IMAGE_ID | tr '[A-Z]' '[a-z]')
|
||||
VERSION=$(echo "${{ github.ref }}" | sed -e 's,.*/\(.*\),\1,')
|
||||
[[ "${{ github.ref }}" == "refs/tags/"* ]] && VERSION=$(echo $VERSION | sed -e 's/^v//')
|
||||
[ "$VERSION" == "master" ] && VERSION=latest
|
||||
echo IMAGE_ID=$IMAGE_ID
|
||||
echo VERSION=$VERSION
|
||||
docker tag $IMAGE_NAME $IMAGE_ID:$VERSION
|
||||
docker push $IMAGE_ID:$VERSION
|
||||
|
||||
43
.github/workflows/domain-expirey-check.yml
vendored
|
|
@ -1,43 +0,0 @@
|
|||
name: 📕 Check Docs Domain Expiry
|
||||
on:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
- cron: '0 1 * * 0' # At 01:00 on Sunday.
|
||||
jobs:
|
||||
check-domain:
|
||||
runs-on: ubuntu-latest
|
||||
name: Check domain
|
||||
strategy:
|
||||
matrix:
|
||||
domain:
|
||||
- https://dashy.to
|
||||
steps:
|
||||
- name: Check domain SSL and registry expire date
|
||||
id: check-domain
|
||||
uses: codex-team/action-check-domain@v1
|
||||
with:
|
||||
url: ${{ matrix.domain }}
|
||||
- name: Raise issue if domain expiring soon
|
||||
if: ${{ steps.check-domain.outputs.paid-till-days-left && steps.check-domain.outputs.paid-till-days-left < 30 }}
|
||||
uses: rishabhgupta/git-action-issue@v2
|
||||
with:
|
||||
token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
assignees: Lissy93
|
||||
title: '[WEBSITE] Domain Expiring Soon'
|
||||
body: >
|
||||
**Priority Notice**
|
||||
Domain, ${{ matrix.domain }} will expire in ${{ steps.check-domain.outputs.paid-till-days-left }} days.
|
||||
@Lissy93 - Please take action immediately to prevent any downtime
|
||||
|
||||
- name: Raise issue if SSL Cert expiring soon
|
||||
if: ${{ steps.check-domain.outputs.ssl-expire-days-left && steps.check-domain.outputs.ssl-expire-days-left < 14 }}
|
||||
uses: rishabhgupta/git-action-issue@v2
|
||||
with:
|
||||
token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
assignees: Lissy93
|
||||
title: '[WEBSITE] SSL Cert Expiring Soon'
|
||||
body: >
|
||||
**Priority Notice**
|
||||
The SSL Certificate for ${{ matrix.domain }} will expire in ${{ steps.check-domain.outputs.ssl-expire-days-left }} days, on ${{ steps.check-domain.outputs.ssl-expire-date }}.
|
||||
@Lissy93 - Please take action immediately to prevent any downtime
|
||||
|
||||
36
.github/workflows/draft-release.yml
vendored
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
name: 🏗️ Draft New Release
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- '^[0-9]+\.[0-9]+\.[0-9]+$'
|
||||
- '**'
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
tag:
|
||||
description: 'Tag to draft a release for (must already exist)'
|
||||
required: true
|
||||
|
||||
jobs:
|
||||
create-draft-release:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout code 🛎️
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0 # We need all history for generating release notes
|
||||
|
||||
- name: Create Draft Release 📝
|
||||
id: create_release
|
||||
uses: actions/create-release@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
tag_name: ${{ github.event.inputs.tag || github.ref_name }}
|
||||
release_name: Release ${{ github.event.inputs.tag || github.ref_name }}
|
||||
draft: true
|
||||
prerelease: false
|
||||
generate_release_notes: true
|
||||
|
||||
- name: Output new release URL ↗️
|
||||
run: 'echo "Draft release URL: ${{ steps.create_release.outputs.html_url }}"'
|
||||
83
.github/workflows/generate-credits.yml
vendored
|
|
@ -1,83 +0,0 @@
|
|||
# Inserts list of contributors and community members into ./docs/credits.md
|
||||
# Also generates an SVG showing all contributors, which is embedded into readme
|
||||
name: 📊 Generate Contributor Credits
|
||||
on:
|
||||
workflow_dispatch: # Manual dispatch
|
||||
schedule:
|
||||
- cron: '0 1 * * 0' # At 01:00 on Sunday.
|
||||
jobs:
|
||||
# Job #1 - Generate an embedded SVG asset, showing all contributors
|
||||
generate-contributors:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: bubkoo/contributors-list@v1
|
||||
with:
|
||||
GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
svgPath: docs/assets/CONTRIBUTORS.svg
|
||||
affiliation: all
|
||||
includeBots: false
|
||||
excludeUsers: BeginCI snyk-bot
|
||||
avatarSize: 96
|
||||
userNameHeight: 20
|
||||
svgWidth: 830
|
||||
commitMessage: ':blue_heart: Updates contributor SVG'
|
||||
# Job #2 - Fetches sponsors and inserts into readme and credits page
|
||||
insert-sponsors:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout 🛎️
|
||||
uses: actions/checkout@v2
|
||||
- name: Generate Sponsors in Readme 💖
|
||||
uses: JamesIves/github-sponsors-readme-action@1.0.5
|
||||
with:
|
||||
token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
file: 'README.md'
|
||||
- name: Generate Sponsors in Credits 💖
|
||||
uses: JamesIves/github-sponsors-readme-action@1.0.5
|
||||
with:
|
||||
token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
file: 'docs/credits.md'
|
||||
# Job #3 - Update the Credits page
|
||||
insert-credits:
|
||||
runs-on: ubuntu-latest
|
||||
name: Inserts contributors into credits.md
|
||||
steps:
|
||||
- name: Contributer List - Credits Page
|
||||
uses: akhilmhdh/contributors-readme-action@v2.3.6
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
image_size: 80
|
||||
readme_path: docs/credits.md
|
||||
columns_per_row: 6
|
||||
commit_message: ':purple_heart: Updates contributors list'
|
||||
collaborators: all
|
||||
committer_username: liss-bot
|
||||
committer_email: liss-bot@d0h.co
|
||||
- name: Sponsors List - Readme
|
||||
uses: akhilmhdh/contributors-readme-action@v2.2
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
image_size: 80
|
||||
readme_path: README.md
|
||||
columns_per_row: 6
|
||||
commit_message: ':yellow_heart: Updates sponsors table'
|
||||
committer_username: liss-bot
|
||||
committer_email: liss-bot@d0h.co
|
||||
|
||||
make-author-list:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout 🛎️
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- uses: wow-actions/update-authors@v1.1.4
|
||||
with:
|
||||
GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
sort: commits
|
||||
bots: true
|
||||
path: .github/AUTHORS.txt
|
||||
commit: ':blue_heart: Makes author list'
|
||||
template: '{{name}} <{{email}}> - {{commits}} commits'
|
||||
22
.github/workflows/new-issues-check.yml
vendored
|
|
@ -1,22 +0,0 @@
|
|||
name: ⭐ Hello non-Stargazers
|
||||
on:
|
||||
issues:
|
||||
types: [opened, reopened]
|
||||
jobs:
|
||||
check-user:
|
||||
if: >
|
||||
${{
|
||||
! contains( github.event.issue.labels.*.name, '📌 Keep Open') &&
|
||||
! contains( github.event.issue.labels.*.name, '🌈 Feedback') &&
|
||||
! contains( github.event.issue.labels.*.name, '💯 Showcase') &&
|
||||
github.event.comment.author_association != 'CONTRIBUTOR'
|
||||
}}
|
||||
runs-on: ubuntu-latest
|
||||
name: Add comment to issues opened by non-stargazers
|
||||
steps:
|
||||
- name: comment
|
||||
uses: qxip/please-star-light@v4
|
||||
with:
|
||||
token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
autoclose: false
|
||||
message: "If you're enjoying Dashy, consider dropping us a ⭐<br>_<sub>🤖 I'm a bot, and this message was automated</sub>_"
|
||||
19
.github/workflows/release-commenter.yml
vendored
|
|
@ -1,19 +0,0 @@
|
|||
# Adds a comment to all issues & PRs that were fixed on a new release
|
||||
name: 💡 Update Issue after Release
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
jobs:
|
||||
release:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: apexskier/github-release-commenter@v1
|
||||
with:
|
||||
GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
label-template: 🛩️ Released {release_tag}, 🔨 Fixed
|
||||
comment-template: |
|
||||
**The fix for this issue has now been released in {release_name} ✨**
|
||||
|
||||
If you haven't done so already, please [update your instance](https://github.com/Lissy93/dashy/blob/master/docs/management.md#updating) to `{release_tag}` or later. See {release_link} for full info.
|
||||
|
||||
Feel free to reach out if you need any more support. If you are enjoying Dashy, consider [supporting the project](https://github.com/Lissy93/dashy/blob/master/docs/contributing.md#contributing).
|
||||
58
.github/workflows/update-docs-site.yml
vendored
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
name: 📝 Update Documentation
|
||||
|
||||
# This will run whenever the /docs directory in master branch is updated,
|
||||
# or if the workflow is manually dispatched, plus a sync check on Sun at 03:30 UTC
|
||||
on:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
- cron: '30 3 * * 0'
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
paths:
|
||||
- 'docs/**'
|
||||
|
||||
|
||||
# Jobs to be run:
|
||||
# 1. Checkout master branch
|
||||
# 2. Checkout website source code branch
|
||||
# 3. Install Python
|
||||
# 4. Copy /docs from master to website branch
|
||||
# 5. Run the script which processes documentation
|
||||
# 6. Commit and push updated docs to the website source code branch
|
||||
jobs:
|
||||
update-docs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout master branch 🛎️
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
path: 'master-docs'
|
||||
|
||||
- name: Checkout WEBSITE/docs-site-source branch 🛎️
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
ref: 'WEBSITE/docs-site-source'
|
||||
path: 'website-docs'
|
||||
|
||||
- name: Install Python 🐍
|
||||
uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: '3.x'
|
||||
|
||||
- name: Run script to update documentation 🪄
|
||||
working-directory: website-docs
|
||||
run: |
|
||||
cp -r ../master-docs/docs ./
|
||||
python ./do-markdown-magic.py
|
||||
|
||||
- name: Commit changes 🚀
|
||||
run: |
|
||||
cd website-docs
|
||||
git config --local user.email "liss-bot@d0h.co"
|
||||
git config --local user.name "Liss-Bot"
|
||||
git add docs
|
||||
git commit -m "Update documentation" || echo "No changes to commit"
|
||||
git push
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
1
.gitignore
vendored
|
|
@ -13,7 +13,6 @@ yarn-error.log*
|
|||
|
||||
# Editor directories and files
|
||||
.idea
|
||||
.vscode
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
|
|
|
|||
65
.vscode/launch.json
vendored
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
{
|
||||
// Use IntelliSense to learn about possible attributes.
|
||||
// Hover to view descriptions of existing attributes.
|
||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"type": "msedge",
|
||||
"request": "launch",
|
||||
"name": "dashy: edge",
|
||||
"url": "http://localhost:8080",
|
||||
"webRoot": "${workspaceFolder}",
|
||||
"breakOnLoad": true,
|
||||
"pathMapping": {
|
||||
"/_karma_webpack_": "${workspaceFolder}"
|
||||
},
|
||||
"sourceMapPathOverrides": {
|
||||
"webpack:/*": "${webRoot}/*",
|
||||
"/./*": "${webRoot}/*",
|
||||
"/src/*": "${webRoot}/*",
|
||||
"/*": "*",
|
||||
"/./~/*": "${webRoot}/node_modules/*"
|
||||
},
|
||||
"preLaunchTask": "dashy start"
|
||||
},
|
||||
{
|
||||
"type": "chrome",
|
||||
"request": "launch",
|
||||
"name": "dashy: chrome",
|
||||
"url": "http://localhost:8080",
|
||||
"webRoot": "${workspaceFolder}",
|
||||
"breakOnLoad": true,
|
||||
"pathMapping": {
|
||||
"/_karma_webpack_": "${workspaceFolder}"
|
||||
},
|
||||
"sourceMapPathOverrides": {
|
||||
"webpack:/*": "${webRoot}/*",
|
||||
"/./*": "${webRoot}/*",
|
||||
"/src/*": "${webRoot}/*",
|
||||
"/*": "*",
|
||||
"/./~/*": "${webRoot}/node_modules/*"
|
||||
},
|
||||
"preLaunchTask": "dashy start"
|
||||
},
|
||||
{
|
||||
"type": "firefox",
|
||||
"request": "launch",
|
||||
"name": "dashy: firefox",
|
||||
"url": "http://localhost:8080",
|
||||
"webRoot": "${workspaceFolder}",
|
||||
"breakOnLoad": true,
|
||||
"pathMapping": {
|
||||
"/_karma_webpack_": "${workspaceFolder}"
|
||||
},
|
||||
"sourceMapPathOverrides": {
|
||||
"webpack:/*": "${webRoot}/*",
|
||||
"/./*": "${webRoot}/*",
|
||||
"/src/*": "${webRoot}/*",
|
||||
"/*": "*",
|
||||
"/./~/*": "${webRoot}/node_modules/*"
|
||||
},
|
||||
"preLaunchTask": "dashy start"
|
||||
}
|
||||
]
|
||||
}
|
||||
21
.vscode/tasks.json
vendored
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
{
|
||||
"version": "2.0.0",
|
||||
"tasks": [
|
||||
{
|
||||
"label": "dashy start",
|
||||
"type": "npm",
|
||||
"script": "dev",
|
||||
"isBackground": true,
|
||||
"problemMatcher": [
|
||||
{
|
||||
"base": "$tsc-watch",
|
||||
"background": {
|
||||
"activeOnStart": true,
|
||||
"beginsPattern": "Starting development server",
|
||||
"endsPattern": "Compiled successfully"
|
||||
}
|
||||
}
|
||||
],
|
||||
}
|
||||
]
|
||||
}
|
||||
1
.yarnrc.yml
Normal file
|
|
@ -0,0 +1 @@
|
|||
nodeLinker: node-modules
|
||||
12
Dockerfile
|
|
@ -1,4 +1,4 @@
|
|||
FROM node:20.11.1-alpine AS BUILD_IMAGE
|
||||
FROM node:18.19.1-alpine AS BUILD_IMAGE
|
||||
|
||||
# Set the platform to build image for
|
||||
ARG TARGETPLATFORM
|
||||
|
|
@ -16,19 +16,19 @@ WORKDIR /app
|
|||
|
||||
# Install app dependencies
|
||||
COPY package.json yarn.lock ./
|
||||
RUN yarn install --ignore-engines --frozen-lockfile --network-timeout 1000000
|
||||
RUN yarn install --ignore-engines --immutable --no-cache --network-timeout 300000 --network-concurrency 1
|
||||
|
||||
# Copy over all project files and folders to the working directory
|
||||
COPY . ./
|
||||
|
||||
# Build initial app for production
|
||||
RUN NODE_OPTIONS=--openssl-legacy-provider yarn build --mode production
|
||||
RUN yarn build --mode production --no-clean
|
||||
|
||||
# Production stage
|
||||
FROM node:20.11.1-alpine
|
||||
FROM node:20.11.1-alpine3.19
|
||||
|
||||
# Define some ENV Vars
|
||||
ENV PORT=80 \
|
||||
ENV PORT=8080 \
|
||||
DIRECTORY=/app \
|
||||
IS_DOCKER=true
|
||||
|
||||
|
|
@ -40,8 +40,6 @@ RUN apk add --no-cache tzdata
|
|||
|
||||
# Copy built application from build phase
|
||||
COPY --from=BUILD_IMAGE /app ./
|
||||
# Ensure only one version of conf.yml exists
|
||||
RUN rm dist/conf.yml
|
||||
|
||||
# Finally, run start command to serve up the built application
|
||||
CMD [ "yarn", "build-and-start" ]
|
||||
|
|
|
|||
265
README.md
|
|
@ -6,27 +6,31 @@
|
|||
<img width="120" src="https://i.ibb.co/yhbt6CY/dashy.png" />
|
||||
<br/>
|
||||
<b><a href="./docs/showcase.md">User Showcase</a></b> | <b><a href="https://demo.dashy.to">Live Demo</a></b> | <b><a href="./docs/quick-start.md">Getting Started</a></b> | <b><a href="https://dashy.to/docs">Documentation</a></b> | <b><a href="https://github.com/Lissy93/dashy">GitHub</a></b>
|
||||
<br/><br/>
|
||||
<a href="https://github.com/awesome-selfhosted/awesome-selfhosted#personal-dashboards">
|
||||
<img src="https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg" alt="Awesome Self-Hosted">
|
||||
</a>
|
||||
<a href="./LICENSE">
|
||||
<img src="https://img.shields.io/badge/License-MIT-0aa8d2?logo=opensourceinitiative&logoColor=fff" alt="License MIT">
|
||||
</a>
|
||||
<a href="./.github/CHANGELOG.md">
|
||||
<img src="https://img.shields.io/github/package-json/v/lissy93/dashy?logo=azurepipelines&color=0aa8d2" alt="Current Version">
|
||||
</a>
|
||||
<a href="https://hub.docker.com/r/lissy93/dashy">
|
||||
<img src="https://img.shields.io/docker/pulls/lissy93/dashy?logo=docker&color=0aa8d2&logoColor=fff" alt="Docker Pulls">
|
||||
</a>
|
||||
<a href="http://as93.link/dashy-build-status">
|
||||
<img src="https://badgen.net/github/status/lissy93/dashy?icon=github" alt="GitHub Status">
|
||||
</a>
|
||||
<a href="https://snyk.io/test/github/lissy93/dashy">
|
||||
<img src="https://snyk.io/test/github/lissy93/dashy/badge.svg" alt="Known Vulnerabilities">
|
||||
</p>
|
||||
|
||||
---
|
||||
|
||||
<p align="center">
|
||||
<sup>Dashy is kindly sponsored by <a href="https://www.lambdatest.com/?utm_source=dashy&utm_medium=sponsor">LambdaTest</a> - Browser Testing</sup><br>
|
||||
<a href="https://www.lambdatest.com/?utm_source=dashy&utm_medium=sponsor" target="_blank">
|
||||
<img src="https://www.lambdatest.com/blue-logo.png" width="400" alt="LambdaTest" />
|
||||
</a>
|
||||
</p>
|
||||
|
||||
|
||||
<p align="center">
|
||||
<br>
|
||||
<sup>Dashy is kindly sponsored by <a href="https://umbrel.com?ref=dashy">Umbrel</a> - the personal home cloud and OS for self-hosting</sup><br>
|
||||
<a href="https://umbrel.com?ref=dashy">
|
||||
<img width="400" src="https://github.com/Lissy93/dashy/blob/WEBSITE/docs-site-source/static/umbrel-banner.jpg?raw=true" />
|
||||
</a>
|
||||
</p>
|
||||
|
||||
|
||||
> [!NOTE]
|
||||
> Version [3.0.0](https://github.com/Lissy93/dashy/releases/tag/3.0.0) has been released, and requires some changes to your setup, see [#1529](https://github.com/Lissy93/dashy/discussions/1529) for details.
|
||||
|
||||
|
||||
<details>
|
||||
<summary><b>Table of Contents</b></summary>
|
||||
<p>
|
||||
|
|
@ -95,7 +99,7 @@
|
|||
|
||||
**Screenshots**: Checkout the [Showcase](./docs/showcase.md), to see example dashboards from the community
|
||||
|
||||
**Spin up your own demo**: [](https://labs.play-with-docker.com/?stack=https://raw.githubusercontent.com/Lissy93/dashy/master/docker-compose.yml) or [`docker run -p 8080:80 lissy93/dashy`](./docs/quick-start.md)
|
||||
**Spin up your own demo**: [](https://labs.play-with-docker.com/?stack=https://raw.githubusercontent.com/Lissy93/dashy/master/docker-compose.yml) or [`docker run -p 8080:8080 lissy93/dashy`](./docs/quick-start.md)
|
||||
|
||||
|
||||
<p align="center">
|
||||
|
|
@ -116,15 +120,15 @@
|
|||
You will need [Docker](https://docs.docker.com/get-docker/) installed on your system
|
||||
|
||||
```
|
||||
docker run -p 8080:80 lissy93/dashy
|
||||
docker run -p 8080:8080 lissy93/dashy
|
||||
```
|
||||
|
||||
Or
|
||||
|
||||
```docker
|
||||
docker run -d \
|
||||
-p 4000:80 \
|
||||
-v /root/my-local-conf.yml:/app/public/conf.yml \
|
||||
-p 4000:8080 \
|
||||
-v /root/my-local-conf.yml:/app/user-data/conf.yml \
|
||||
--name my-dashboard \
|
||||
--restart=always \
|
||||
lissy93/dashy:latest
|
||||
|
|
@ -140,7 +144,7 @@ See also: [examples with Docker Compose](./docs/deployment.md#using-docker-compo
|
|||
You will need [git](https://git-scm.com/downloads), the latest or LTS version of [Node.js](https://nodejs.org/) and _(optionally)_ [Yarn](https://yarnpkg.com/) installed on your system.
|
||||
|
||||
- Clone the Repo: `git clone https://github.com/Lissy93/dashy.git` and `cd dashy`
|
||||
- Configuration: Fill in your settings in `./public/conf.yml`
|
||||
- Configuration: Fill in your settings in `./user-data/conf.yml`
|
||||
- Install dependencies: `yarn`
|
||||
- Build: `yarn build`
|
||||
- Run: `yarn start`
|
||||
|
|
@ -169,7 +173,7 @@ Dashy supports **1-Click deployments** on several popular cloud platforms. To sp
|
|||
|
||||
> For full configuration documentation, see: [**Configuring**](./docs/configuring.md)
|
||||
|
||||
Dashy is configured through a YAML file, located at `./public/conf.yml`. In addition, you can find a complete list of available options in the [Configuring Docs](./docs/configuring.md). The config can also be edited and saved directly through the UI.
|
||||
Dashy is configured through a YAML file, located at `./user-data/conf.yml`. In addition, you can find a complete list of available options in the [Configuring Docs](./docs/configuring.md). The config can also be edited and saved directly through the UI.
|
||||
|
||||
**[⬆️ Back to Top](#dashy)**
|
||||
|
||||
|
|
@ -205,7 +209,7 @@ Both sections and items can have an icon associated with them, defined under the
|
|||
|
||||
The following icon types are supported:
|
||||
- **Favicon** - Automatically fetch an apps icon from its Favicon or logo image
|
||||
- **Icon Packs** - Use any icon from [font-awesome], [simple-icons] or [material icons]
|
||||
- **Icon Packs** - Use any icon from [font-awesome], [simple-icons], [selfh.st/icons], or [material icons]
|
||||
- **Emoji** - Any valid emoji can be used as an icon
|
||||
- **Generative** - Unique, auto-generated images for easily identifying services
|
||||
- **URL** - Pass the URL of any valid image in to have it fetched and rendered
|
||||
|
|
@ -216,6 +220,7 @@ The following icon types are supported:
|
|||
[font-awesome]: https://fontawesome.com/icons
|
||||
[simple-icons]: https://simpleicons.org/
|
||||
[material icons]: https://github.com/Templarian/MaterialDesign
|
||||
[selfh.st/icons]: https://selfh.st/icons
|
||||
[dashboard-icons]: https://github.com/WalkxCode/dashboard-icons
|
||||
|
||||
|
||||
|
|
@ -248,7 +253,7 @@ Status indicators can be globally enabled by setting `appConfig.statusCheck: tru
|
|||
|
||||
> For full widget documentation, see: [**Widgets**](./docs/widgets.md)
|
||||
|
||||
You can display dynamic content from services in the form of widgets. There are several pre-built widgets availible for showing useful info, and integrations with commonly self-hosted services, but you can also easily create your own for almost any app.
|
||||
You can display dynamic content from services in the form of widgets. There are several pre-built widgets available for showing useful info, and integrations with commonly self-hosted services, but you can also easily create your own for almost any app.
|
||||
|
||||
|
||||
<p align="center">
|
||||
|
|
@ -417,6 +422,7 @@ Dashy supports multiple languages and locales. When available, your language sho
|
|||
- 🇩🇪 **German**: `de` - Contributed by **[@Niklashere](https://github.com/Niklashere)**
|
||||
- 🇬🇷 **Greek**: `el` - Contributed by **[@aviolaris](https://github.com/aviolaris)**
|
||||
- 🇮🇳 **Hindi**: `hi` - _Auto-generated_
|
||||
- 🇭🇺 **Hungarian**: `hu` - Contributed by **[@apgyorfi](https://github.com/apgyorfi)**
|
||||
- 🇮🇹 **Italian**: `it` - Contributed by **[@alexdelprete](https://github.com/alexdelprete)**
|
||||
- 🇯🇵 **Japanese**: `ja` - _Auto-generated_
|
||||
- 🇰🇷 **Korean**: `ko` - Contributed by **[@boggy-cs](https://github.com/boggy-cs)**
|
||||
|
|
@ -424,13 +430,14 @@ Dashy supports multiple languages and locales. When available, your language sho
|
|||
- 🇵🇱 **Polish**: `pl` - Contributed by **[@skaarj1989](https://github.com/skaarj1989)**
|
||||
- 🇵🇹 **Portuguese**: `pt` - Contributed by **[@LeoColman](https://github.com/LeoColman)**
|
||||
- 🛰️ **Galician**: `gl` - Contributed by **[@pvillaverde](https://github.com/pvillaverde)**
|
||||
- 🇷🇺 **Russian**: `ru` - _Auto-generated_
|
||||
- 🇷🇺 **Russian**: `ru` -Contributed by **[@sasetz](https://github.com/sasetz)**
|
||||
- 🇸🇰 **Slovak**: `sk` - Contributed by **[@Smexhy](https://github.com/Smexhy)**
|
||||
- 🇸🇮 **Slovenian**: `sl` - Contributed by **[@UrekD](https://github.com/UrekD)**
|
||||
- 🇪🇸 **Spanish**: `es` - Contributed by **[@lu4t](https://github.com/lu4t)**
|
||||
- 🇸🇪 **Swedish**: `sv` - Contributed by **[@BOZG](https://github.com/BOZG)**
|
||||
- 🇹🇼 **Traditional Chinese**: `zh-TW` - Contributed by **[@stanly0726](https://github.com/stanly0726)**
|
||||
- 🇹🇷 **Turkish**: `tr` - Contributed by **[@imsakg](https://github.com/imsakg)**
|
||||
- 🇺🇦 **Ukrainian**: `uk` - Contributed by **[@allozavrr](https://github.com/allozavrr)**
|
||||
- 🏴☠️ **Pirate**: `pirate` - Contributed by **[@Lissy93](https://github.com/lissy93)**
|
||||
|
||||
#### Add your Language
|
||||
|
|
@ -529,178 +536,11 @@ Thank you so much to everyone who has helped with Dashy so far; every contributi
|
|||
#### Sponsors
|
||||
|
||||
Huge thanks to the sponsors helping to support Dashy's development!
|
||||
<!-- readme: sponsors -start -->
|
||||
<table>
|
||||
<tr>
|
||||
<td align="center">
|
||||
<a href="https://github.com/koconder">
|
||||
<img src="https://avatars.githubusercontent.com/u/25068?u=582657b23622aaa3dfe68bd028a780f272f456fa&v=4" width="80;" alt="koconder"/>
|
||||
<br />
|
||||
<sub><b>Vincent Koc</b></sub>
|
||||
</a>
|
||||
</td>
|
||||
<td align="center">
|
||||
<a href="https://github.com/peng1can">
|
||||
<img src="https://avatars.githubusercontent.com/u/225854?v=4" width="80;" alt="peng1can"/>
|
||||
<br />
|
||||
<sub><b>Peng1can</b></sub>
|
||||
</a>
|
||||
</td>
|
||||
<td align="center">
|
||||
<a href="https://github.com/alydemah">
|
||||
<img src="https://avatars.githubusercontent.com/u/652035?u=ac2c04e474da37bfeafcfa25076cc1800997aedb&v=4" width="80;" alt="alydemah"/>
|
||||
<br />
|
||||
<sub><b>Aly Mohamed</b></sub>
|
||||
</a>
|
||||
</td>
|
||||
<td align="center">
|
||||
<a href="https://github.com/bgadrian">
|
||||
<img src="https://avatars.githubusercontent.com/u/830001?v=4" width="80;" alt="bgadrian"/>
|
||||
<br />
|
||||
<sub><b>B.G.Adrian</b></sub>
|
||||
</a>
|
||||
</td>
|
||||
<td align="center">
|
||||
<a href="https://github.com/tbjers">
|
||||
<img src="https://avatars.githubusercontent.com/u/1117052?u=539d96d5e581b3139c75713ce35b89a36626404c&v=4" width="80;" alt="tbjers"/>
|
||||
<br />
|
||||
<sub><b>Torgny Bjers</b></sub>
|
||||
</a>
|
||||
</td>
|
||||
<td align="center">
|
||||
<a href="https://github.com/emlazzarin">
|
||||
<img src="https://avatars.githubusercontent.com/u/1141361?u=714e3487a3f2e0df721b01a0133945f075d3ff68&v=4" width="80;" alt="emlazzarin"/>
|
||||
<br />
|
||||
<sub><b>Eddy Lazzarin</b></sub>
|
||||
</a>
|
||||
</td></tr>
|
||||
<tr>
|
||||
<td align="center">
|
||||
<a href="https://github.com/AnandChowdhary">
|
||||
<img src="https://avatars.githubusercontent.com/u/2841780?u=747e554b3a7f12eb20b7910e1c87d817844f714f&v=4" width="80;" alt="AnandChowdhary"/>
|
||||
<br />
|
||||
<sub><b>Anand Chowdhary</b></sub>
|
||||
</a>
|
||||
</td>
|
||||
<td align="center">
|
||||
<a href="https://github.com/shrippen">
|
||||
<img src="https://avatars.githubusercontent.com/u/2873570?v=4" width="80;" alt="shrippen"/>
|
||||
<br />
|
||||
<sub><b>Shrippen</b></sub>
|
||||
</a>
|
||||
</td>
|
||||
<td align="center">
|
||||
<a href="https://github.com/bile0026">
|
||||
<img src="https://avatars.githubusercontent.com/u/5022496?u=aec96ad173c0ea9baaba93807efa8a848af6595c&v=4" width="80;" alt="bile0026"/>
|
||||
<br />
|
||||
<sub><b>Zach Biles</b></sub>
|
||||
</a>
|
||||
</td>
|
||||
<td align="center">
|
||||
<a href="https://github.com/UlisesGascon">
|
||||
<img src="https://avatars.githubusercontent.com/u/5110813?u=3c41facd8aa26154b9451de237c34b0f78d672a5&v=4" width="80;" alt="UlisesGascon"/>
|
||||
<br />
|
||||
<sub><b>Ulises Gascón</b></sub>
|
||||
</a>
|
||||
</td>
|
||||
<td align="center">
|
||||
<a href="https://github.com/digitalarche">
|
||||
<img src="https://avatars.githubusercontent.com/u/6546135?u=d033c9c16e8367987aec3f9ff5922bc67dd1eedf&v=4" width="80;" alt="digitalarche"/>
|
||||
<br />
|
||||
<sub><b>Digital Archeology</b></sub>
|
||||
</a>
|
||||
</td>
|
||||
<td align="center">
|
||||
<a href="https://github.com/InDieTasten">
|
||||
<img src="https://avatars.githubusercontent.com/u/7047377?v=4" width="80;" alt="InDieTasten"/>
|
||||
<br />
|
||||
<sub><b>InDieTasten</b></sub>
|
||||
</a>
|
||||
</td></tr>
|
||||
<tr>
|
||||
<td align="center">
|
||||
<a href="https://github.com/bmcgonag">
|
||||
<img src="https://avatars.githubusercontent.com/u/7346620?u=2a0f9284f3e12ac1cc15288c254d1ec68a5081e8&v=4" width="80;" alt="bmcgonag"/>
|
||||
<br />
|
||||
<sub><b>Brian McGonagill</b></sub>
|
||||
</a>
|
||||
</td>
|
||||
<td align="center">
|
||||
<a href="https://github.com/vlad-timofeev">
|
||||
<img src="https://avatars.githubusercontent.com/u/11474041?u=eee43705b54d2ec9f51fc4fcce5ad18dd17c87e4&v=4" width="80;" alt="vlad-timofeev"/>
|
||||
<br />
|
||||
<sub><b>Vlad Timofeev</b></sub>
|
||||
</a>
|
||||
</td>
|
||||
<td align="center">
|
||||
<a href="https://github.com/helixzz">
|
||||
<img src="https://avatars.githubusercontent.com/u/12218889?u=d06d0c103dfbdb99450623064f7da3c5a3675fb6&v=4" width="80;" alt="helixzz"/>
|
||||
<br />
|
||||
<sub><b>HeliXZz</b></sub>
|
||||
</a>
|
||||
</td>
|
||||
<td align="center">
|
||||
<a href="https://github.com/undefined">
|
||||
<img src="" width="80;" alt="undefined"/>
|
||||
<br />
|
||||
<sub><b>Undefined</b></sub>
|
||||
</a>
|
||||
</td>
|
||||
<td align="center">
|
||||
<a href="https://github.com/Bastii717">
|
||||
<img src="https://avatars.githubusercontent.com/u/53431819?u=604977bed6ad6875ada890d0d3765a4cacc2fa14&v=4" width="80;" alt="Bastii717"/>
|
||||
<br />
|
||||
<sub><b>Bastii717</b></sub>
|
||||
</a>
|
||||
</td>
|
||||
<td align="center">
|
||||
<a href="https://github.com/frankdez93">
|
||||
<img src="https://avatars.githubusercontent.com/u/87549420?v=4" width="80;" alt="frankdez93"/>
|
||||
<br />
|
||||
<sub><b>Frankdez93</b></sub>
|
||||
</a>
|
||||
</td></tr>
|
||||
<tr>
|
||||
<td align="center">
|
||||
<a href="https://github.com/ratty222">
|
||||
<img src="https://avatars.githubusercontent.com/u/92832598?u=137b65530cbd5f5af9c24cde51baa6cc77cc934b&v=4" width="80;" alt="ratty222"/>
|
||||
<br />
|
||||
<sub><b>Ratty222</b></sub>
|
||||
</a>
|
||||
</td>
|
||||
<td align="center">
|
||||
<a href="https://github.com/hernanpopper">
|
||||
<img src="https://avatars.githubusercontent.com/u/104868017?v=4" width="80;" alt="hernanpopper"/>
|
||||
<br />
|
||||
<sub><b>Hernanpopper</b></sub>
|
||||
</a>
|
||||
</td>
|
||||
<td align="center">
|
||||
<a href="https://github.com/NixyJuppie">
|
||||
<img src="https://avatars.githubusercontent.com/u/138570196?u=b102c222487905728b858704962d32759df29ebe&v=4" width="80;" alt="NixyJuppie"/>
|
||||
<br />
|
||||
<sub><b>Nixy</b></sub>
|
||||
</a>
|
||||
</td>
|
||||
<td align="center">
|
||||
<a href="https://github.com/nrvo">
|
||||
<img src="https://avatars.githubusercontent.com/u/151435968?u=e1dcb307fd0efdc45cddbe9490a7b956e4da6835&v=4" width="80;" alt="nrvo"/>
|
||||
<br />
|
||||
<sub><b>Nrvo</b></sub>
|
||||
</a>
|
||||
</td>
|
||||
<td align="center">
|
||||
<a href="https://github.com/mezza93">
|
||||
<img src="https://avatars.githubusercontent.com/u/153599966?v=4" width="80;" alt="mezza93"/>
|
||||
<br />
|
||||
<sub><b>mezza93</b></sub>
|
||||
</a>
|
||||
</td></tr>
|
||||
</table>
|
||||
<!-- readme: sponsors -end -->
|
||||
|
||||

|
||||
|
||||
#### Contributors
|
||||
[](./docs/credits.md)
|
||||
[](./docs/credits.md)
|
||||
|
||||
#### Stats
|
||||
[](https://github.com/Lissy93/dashy/blob/master/docs/credits.md)
|
||||
|
|
@ -843,16 +683,25 @@ For more info, see TLDR Legal's [Explanation of MIT](https://tldrlegal.com/licen
|
|||
|
||||
---
|
||||
|
||||
|
||||
<!-- License + Copyright -->
|
||||
<p align="center">
|
||||
<br>
|
||||
<a href="https://dashboard.trackgit.com/token/ks0bx7bb14lsvbwoc3ik">
|
||||
<img src="https://us-central1-trackgit-analytics.cloudfunctions.net/token/ping/ks0bx7bb14lsvbwoc3ik?style=flat-square" />
|
||||
</a>
|
||||
<br><br>
|
||||
<a href="https://github.com/Lissy93/dashy">
|
||||
<img src="https://github.githubassets.com/images/icons/emoji/octocat.png" />
|
||||
</a>
|
||||
<br><br>
|
||||
<i>Thank you for Visiting</i>
|
||||
<i>© <a href="https://aliciasykes.com">Alicia Sykes</a> 2024</i><br>
|
||||
<i>Licensed under <a href="https://gist.github.com/Lissy93/143d2ee01ccc5c052a17">MIT</a></i><br>
|
||||
<a href="https://github.com/lissy93"><img src="https://i.ibb.co/4KtpYxb/octocat-clean-mini.png" /></a><br>
|
||||
<sup>Thanks for visiting :)</sup>
|
||||
</p>
|
||||
|
||||
<!-- Dinosaurs are Awesome -->
|
||||
<!--
|
||||
. - ~ ~ ~ - .
|
||||
.. _ .-~ ~-.
|
||||
//| \ `..~ `.
|
||||
|| | } } / \ \
|
||||
(\ \\ \~^..' | } \
|
||||
\`.-~ o / } | / \
|
||||
(__ | / | / `.
|
||||
`- - ~ ~ -._| /_ - ~ ~ ^| /- _ `.
|
||||
| / | / ~-. ~- _
|
||||
|_____| |_____| ~ - . _ _~_-_
|
||||
-->
|
||||
|
||||
|
|
|
|||
|
|
@ -12,21 +12,17 @@ services:
|
|||
# To build from source, replace 'image: lissy93/dashy' with 'build: .'
|
||||
# build: .
|
||||
|
||||
# Or, to use a Dockerfile for your archtecture, uncomment the following
|
||||
# context: .
|
||||
# dockerfile: ./docker/Dockerfile-arm32v7
|
||||
|
||||
# You can also use an image with a different tag, or pull from a different registry, e.g:
|
||||
# image: ghcr.io/lissy93/dashy or image: lissy93/dashy:arm64v8
|
||||
# image: ghcr.io/lissy93/dashy or image: lissy93/dashy:3.0.0
|
||||
|
||||
# Pass in your config file below, by specifying the path on your host machine
|
||||
# volumes:
|
||||
# - /path/to/my-config.yml:/app/public/conf.yml
|
||||
# - /path/to/item-icons:/app/public/item-icons
|
||||
# - /path/to/my-config.yml:/app/user-data/conf.yml
|
||||
# - /path/to/item-icons:/app/user-data/item-icons/
|
||||
|
||||
# Set port that web service will be served on. Keep container port as 80
|
||||
# Set port that web service will be served on. Keep container port as 8080
|
||||
ports:
|
||||
- 4000:80
|
||||
- 4000:8080
|
||||
|
||||
# Set any environmental variables
|
||||
environment:
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@
|
|||
|
||||
**Screenshots**: Checkout the [Showcase](https://github.com/Lissy93/dashy/blob/master/docs/showcase.md), to see example dashboards from the community
|
||||
|
||||
**Spin up your own demo**: [](https://labs.play-with-docker.com/?stack=https://raw.githubusercontent.com/Lissy93/dashy/master/docker-compose.yml) or [`docker run -p 8080:80 lissy93/dashy`](./docs/quick-start.md)
|
||||
**Spin up your own demo**: [](https://labs.play-with-docker.com/?stack=https://raw.githubusercontent.com/Lissy93/dashy/master/docker-compose.yml) or [`docker run -p 8080:8080 lissy93/dashy`](./docs/quick-start.md)
|
||||
|
||||
|
||||
<p align="center">
|
||||
|
|
@ -69,7 +69,7 @@
|
|||
|
||||
## Getting Started 🛫
|
||||
|
||||
To deploy Dashy with Docker, just run `docker run -p 8080:80 lissy93/dashy`, then open `http://localhost:8080`
|
||||
To deploy Dashy with Docker, just run `docker run -p 8080:8080 lissy93/dashy`, then open `http://localhost:8080`
|
||||
|
||||
For full list of options and a Docker compose file, see the [Deployment Docs](https://github.com/Lissy93/dashy/blob/master/docs/deployment.md).
|
||||
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 29 MiB After Width: | Height: | Size: 39 MiB |
|
|
@ -6,11 +6,17 @@
|
|||
- [Logging In and Out](#logging-in-and-out)
|
||||
- [Guest Access](#enabling-guest-access)
|
||||
- [Per-User Access](#granular-access)
|
||||
- [Using Environment Variables for Passwords](#using-environment-variables-for-passwords)
|
||||
- [Adding HTTP Auth to Configuration](#adding-http-auth-to-configuration)
|
||||
- [Security Considerations](#security)
|
||||
- [HTTP Auth](#http-auth)
|
||||
- [Keycloak Auth](#keycloak)
|
||||
- [Deploying Keycloak](#1-deploy-keycloak)
|
||||
- [Setting up Keycloak](#2-setup-keycloak-users)
|
||||
- [Configuring Dashy for Keycloak](#3-enable-keycloak-in-dashy-config-file)
|
||||
- [Toubleshooting Keycloak](#troubleshooting-keycloak)
|
||||
- [OIDC Auth](#oidc)
|
||||
- [authentik](#authentik)
|
||||
- [Alternative Authentication Methods](#alternative-authentication-methods)
|
||||
- [VPN](#vpn)
|
||||
- [IP-Based Access](#ip-based-access)
|
||||
|
|
@ -20,7 +26,7 @@
|
|||
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Dashy's built-in auth is not indented to protect a publicly hosted instance against unauthorized access. Instead you should use an auth provider compatible with your reverse proxy, or access Dashy via your VPN.
|
||||
> Dashy's built-in auth is not indented to protect a publicly hosted instance against unauthorized access. Instead you should use an auth provider compatible with your reverse proxy, or access Dashy via your VPN, or implement your own SSO logic.
|
||||
>
|
||||
> In cases where Dashy is only accessibly within your home network, and you just want to add a login page, then the built-in auth may be sufficient, but keep in mind that configuration can still be accessed.
|
||||
|
||||
|
|
@ -28,6 +34,11 @@
|
|||
|
||||
Dashy has a basic login page included, and frontend authentication. You can enable this by adding users to the `auth` section under `appConfig` in your `conf.yml`. If this section is not specified, then no authentication will be required to access the app, and the homepage will resolve to your dashboard.
|
||||
|
||||
> [!NOTE]
|
||||
> Since the auth is initiated in the main app entry point (for security), a rebuild is required to apply changes to the auth configuration.
|
||||
> You can trigger a rebuild through the UI, under Config --> Rebuild, or by running `yarn build` in the root directory.
|
||||
|
||||
|
||||
### Setting Up Authentication
|
||||
|
||||
The `auth` property takes an array of users. Each user needs to include a username, hash and optional user type (`admin` or `normal`). The hash property is a [SHA-256 Hash](https://en.wikipedia.org/wiki/SHA-2) of your desired password.
|
||||
|
|
@ -110,6 +121,27 @@ You can also prevent any user from writing changes to disk, using `preventWriteT
|
|||
|
||||
To disable all UI config features, including View Config, set `disableConfiguration`. Alternatively you can disable UI config features for all non admin users by setting `disableConfigurationForNonAdmin` to true.
|
||||
|
||||
### Using Environment Variables for Passwords
|
||||
|
||||
If you don't want to hash your password, you can instead leave out the `hash` attribute, and replace it with `password` which should have the value of an environmental variable name you wish to use.
|
||||
|
||||
Note that env var must begin with `VUE_APP_`, and you must set this variable before building the app.
|
||||
|
||||
For example:
|
||||
|
||||
```yaml
|
||||
auth:
|
||||
users:
|
||||
- user: bob
|
||||
password: VUE_APP_BOB
|
||||
```
|
||||
|
||||
Just be sure to set `VUE_APP_BOB='my super secret password'` before build-time.
|
||||
|
||||
### Adding HTTP Auth to Configuration
|
||||
|
||||
If you'd also like to prevent direct visit access to your configuration file, you can set the `ENABLE_HTTP_AUTH` environmental variable.
|
||||
|
||||
### Security
|
||||
|
||||
With basic auth, all logic is happening on the client-side, which could mean a skilled user could manipulate the code to view parts of your configuration, including the hash. If the SHA-256 hash is of a common password, it may be possible to determine it, using a lookup table, in order to find the original password. Which can be used to manually generate the auth token, that can then be inserted into session storage, to become a valid logged in user. Therefore, you should always use a long, strong and unique password, and if you instance contains security-critical info and/ or is exposed directly to the internet, and alternative authentication method may be better. The purpose of the login page is merely to prevent immediate unauthorized access to your homepage.
|
||||
|
|
@ -118,6 +150,16 @@ With basic auth, all logic is happening on the client-side, which could mean a s
|
|||
|
||||
---
|
||||
|
||||
## HTTP Auth
|
||||
|
||||
If you'd like to protect all your config files from direct access, you can set the `BASIC_AUTH_USERNAME` and `BASIC_AUTH_PASSWORD` environmental variables. You'll then be prompted to enter these credentials when visiting Dashy.
|
||||
|
||||
Then, if you'd like your frontend to automatically log you in, without prompting you for credentials (insecure, so only use on a trusted environment), then also specify `VUE_APP_BASIC_AUTH_USERNAME` and `VUE_APP_BASIC_AUTH_PASSWORD`. This is useful for when you're hosting Dashy on a private server, and just want to use auth for user management and to prevent direct access to your config files, while still allowing the frontend to access them. Note that a rebuild is required for these changes to take effect.
|
||||
|
||||
**[⬆️ Back to Top](#authentication)**
|
||||
|
||||
---
|
||||
|
||||
## Keycloak
|
||||
|
||||
Dashy also supports using a [Keycloak](https://www.keycloak.org/) authentication server. The setup for this is a bit more involved, but it gives you greater security overall, useful for if your instance is exposed to the internet.
|
||||
|
|
@ -214,6 +256,246 @@ From within the Keycloak console, you can then configure things like time-outs,
|
|||
|
||||
---
|
||||
|
||||
### Troubleshooting Keycloak
|
||||
|
||||
If you encounter issues with your Keycloak setup, follow these steps to troubleshoot and resolve common problems.
|
||||
|
||||
1. Client Authentication Issue
|
||||
Problem: Redirect loop, if client authentication is enabled.
|
||||
Solution: Switch off "client authentication" in "TC clients" -> "Advanced" settings.
|
||||
|
||||
2. Double URL
|
||||
Problem: If you get redirected to "https://dashy.my.domain/#iss=https://keycloak.my.domain/realms/my-realm"
|
||||
Solution: Make sure to turn on "Exclude Issuer From Authentication Response" in "TC clients" -> "Advanced" -> "OpenID Connect Compatibility Modes"
|
||||
|
||||
3. Problems with mutiple Dashy Pages
|
||||
Problem: Refreshing or logging out of dashy results in an "invalid_redirect_uri" error.
|
||||
Solution: In "TC clients" -> "Access settings" -> "Root URL" https://dashy.my.domain/, valid redirect URIs must be /*
|
||||
|
||||
---
|
||||
|
||||
## OIDC
|
||||
|
||||
Dashy also supports using a general [OIDC compatible](https://openid.net/connect/) authentication server. In order to use it, the authentication section needs to be configured:
|
||||
|
||||
```yaml
|
||||
appConfig:
|
||||
auth:
|
||||
enableOidc: true
|
||||
oidc:
|
||||
clientId: [registered client id]
|
||||
endpoint: [OIDC endpoint]
|
||||
scope: [The scope(s) to request from the OIDC provider]
|
||||
adminGroup: admin
|
||||
```
|
||||
|
||||
Because Dashy is a SPA, a [public client](https://datatracker.ietf.org/doc/html/rfc6749#section-2.1) registration with PKCE is needed.
|
||||
|
||||
An example for Authelia is shared below, but other OIDC systems can be used:
|
||||
|
||||
```yaml
|
||||
identity_providers:
|
||||
oidc:
|
||||
clients:
|
||||
- client_id: dashy
|
||||
client_name: dashy
|
||||
public: true
|
||||
authorization_policy: 'one_factor'
|
||||
require_pkce: true
|
||||
pkce_challenge_method: 'S256'
|
||||
redirect_uris:
|
||||
- https://dashy.local # should point to your dashy endpoint
|
||||
grant_types:
|
||||
- authorization_code
|
||||
scopes:
|
||||
- 'openid'
|
||||
- 'profile'
|
||||
- 'roles'
|
||||
- 'email'
|
||||
- 'groups'
|
||||
```
|
||||
|
||||
Groups and roles will be populated and available for controlling display similar to [Keycloak](#Keycloak) above.
|
||||
|
||||
---
|
||||
|
||||
### authentik
|
||||
|
||||
This documentation is specific to `authentik`, however it may be useful in getting other idP's working with `Dashy`.
|
||||
|
||||
This guide will only walk through the following:
|
||||
* Creating and configuring an OIDC provider
|
||||
* Creating and configuring an application
|
||||
* Assigning groups
|
||||
* Configuring `Dashy` to use the OIDC client
|
||||
* Show quick examples of how to hide/show `pages`, `items`, and `sections` using OIDC groups
|
||||
|
||||
This guide assumes the following:
|
||||
* You have a working instance of `authentik` terminated with SSL
|
||||
* You have a working instance of `Dashy` terminated with SSL
|
||||
* Users and groups are provisioned
|
||||
* You are familiar with how `authentik` works in case you need to do further troubleshooting that is outside the scope of this guide.
|
||||
|
||||
>[!TIP]
|
||||
>It it recommended that you create groups specific for `Dashy`. Groups will allow you to display content based on group membership as well as limiting user access to `Dashy`. If you do not need this functionality, then you can forgo creating specific groups.
|
||||
|
||||
>[!TIP]
|
||||
>You can use the application wizard to create the provider and application at one time. This is the recommended route, but only the manual process will be outlined in this guide.
|
||||
|
||||

|
||||
|
||||
#### 1. Create an OIDC provider
|
||||
|
||||
Login to the admin console for `authentik`. Go to `Applications` > `Providers`. Click `Create`.
|
||||
|
||||

|
||||
|
||||
A dialog box will pop-up, select the `OAuth2/OpenID Provider`. Click `Next`.
|
||||
|
||||

|
||||
|
||||
On the next page of the wizard, set the `Name`, `Authentication flow`, and `Authorization flow`. See example below. Using the `default-provider-authorization-implicit-consent` authorization flow on internal services and `default-provider-authorization-explicit-consent` on external services is a common practice. However, it is fully up to you on how you would like to configure this option. `Implicit` will login directly without user consent, `explicit` will ask if the user approves the service being logged into with their user credentials.
|
||||
|
||||

|
||||
|
||||
Scroll down and configure the `Protocol settings`. Set the `Client type` to `Public`. Add the `Redirect URIs/Origins (RegEx)`. If the site is hosted at `dashy.lan.domain.com`, then you would enter as the example below.
|
||||
|
||||
>[!NOTE]
|
||||
>If you have an internal and external domain for `Dashy`, enter both URI's. Enter each URI on a new line.
|
||||
|
||||

|
||||
|
||||
Scroll down to set the `Signing Key`. It is recommended to use the built in `authentik Self-signed Certificate` here unless you have special needs for your own custom cert.
|
||||
|
||||

|
||||
|
||||
Expand `Advanced protocol settings` then verify the `Scopes` are set to what is highlighted in `white` below. Set the `Subject mode` to `Based on the Users's Email`.
|
||||
|
||||

|
||||
|
||||
Lastly, toggle `Include claims in id_token` to on. Click `Finish` to complete creating the provider.
|
||||
|
||||

|
||||
|
||||
Grab the generated `Client ID` and `OpenID Configuration Issuer` URL by clicking the newly created provider as this will use this later when `Dashy` is configured to use the OIDC auth mechanism. In this tutorial, what was generated is used below. Obviously adjust the `Client ID` that was generated and use your domain here for the `issuer`.
|
||||
```
|
||||
Client ID: pzN9DCMLqHTTatgtYFg50cl0jn1NmCyBC3wreX15
|
||||
OpenID Configuration Issuer: https://auth.domain.com/application/o/dashy/
|
||||
```
|
||||
|
||||
#### 2. Create an application
|
||||
|
||||
Make sure you are still in the `authentik` admin console then go to `Applications` > `Applications`. Click `Create`.
|
||||
|
||||

|
||||
|
||||
Next, it is required to give a user facing `Name`, `Slug` and assign the newly created provider. Use the example below if you have been following the guide. If you have used your own naming, then adjust accordingly. Click `Create` once you are done.
|
||||
|
||||

|
||||
|
||||
>[!TIP]
|
||||
>Open the application in a new tab from the `authentik` user portal and upload a custom icon. You can also enter a user facing `Description` that the user would see.
|
||||
|
||||

|
||||
|
||||
#### 3. *(Optional)* Limiting access via `authentik` with groups
|
||||
|
||||
If you would like to deny `Dashy` access from specific users who are not within `authentik` based groups, you bind them to the application you just created now. `authentik` will deny access to those who are not members of this group or groups. If you want to allow everyone access from your `authentik` instance, skip this step.
|
||||
|
||||
Make sure you are still in the `authentik` admin console then go to `Applications` > `Applications`. Click the newly created `Dashy` application.
|
||||
|
||||

|
||||
|
||||
Click the `Policy/Group/User Bindings` tab at the top, then click `Bind existing policy`. This assumes you have already created the groups you want to use for `Dashy` and populated users in those groups.
|
||||
|
||||

|
||||
|
||||
Click `Group` for the binding type. Under `Group` select the appropriate group you would like to bind. Make sure `Enabled` is toggeled on. Click `Create`.
|
||||
|
||||

|
||||
|
||||
`Dashy` will now be scoped only to users within the assigned groups you have bound the application to. Keep adding groups if you would like to adjust the dashboard visibilty based on group membership.
|
||||
|
||||
#### 4. Configure `Dashy` to use OIDC client
|
||||
|
||||
>[!IMPORTANT]
|
||||
>It is highly recommended to edit your `conf.yml` directly for this step.
|
||||
|
||||
>[!CAUTION]
|
||||
>Do not make the same mistake many have made here by including the fully qualified address for the `OpenID Configuration URL`. `Dashy` will append the `.well-known` configuration automatically. If the `.well-known` URI is included the app will get redirect loops and `400` errors.
|
||||
|
||||
Enter the `Client ID` in the `clientId` field and `OpenID Configuration Issuer` in the `endpoint` field.
|
||||
|
||||
Below is how to configure the `auth` section in the yaml syntax. Once this is enabled, when an attempt to access `Dashy` is made it will now redirect you to the `authentik` login page moving forward.
|
||||
|
||||
```
|
||||
appConfig:
|
||||
theme: glass
|
||||
layout: auto
|
||||
iconSize: medium
|
||||
auth:
|
||||
enableOidc: true
|
||||
oidc:
|
||||
clientId: pzN9DCMLqHTTatgtYFg50cl0jn1NmCyBC3wreX15
|
||||
endpoint: https://auth.domain.com/application/o/dashy/
|
||||
```
|
||||
|
||||
#### 5. *(OPTIONAL)* Example snippets for dashboard visibility
|
||||
|
||||
Using the `hideForKeycloakUsers` configuration option is needed to use the `authentik` groups that were created previously.
|
||||
|
||||
Adjusting `pages` visibility:
|
||||
```
|
||||
pages:
|
||||
- name: App Management
|
||||
path: appmgmt.yml
|
||||
displayData:
|
||||
hideForKeycloakUsers:
|
||||
groups:
|
||||
- Dashy Users
|
||||
- name: Network Management
|
||||
path: network.yml
|
||||
displayData:
|
||||
hideForKeycloakUsers:
|
||||
groups:
|
||||
- Dashy Users
|
||||
```
|
||||
|
||||
Adjusting `items` visibility:
|
||||
```
|
||||
items:
|
||||
- title: Authentik Admin
|
||||
icon: authentik.svg
|
||||
url: https://auth.domain.com/if/admin/
|
||||
target: newtab
|
||||
id: 0_1472_authentikadmin
|
||||
displayData:
|
||||
hideForKeycloakUsers:
|
||||
groups:
|
||||
- Dashy Users
|
||||
- title: Authentik User
|
||||
icon: authentik-light.png
|
||||
url: https://auth.domain.com/if/user/
|
||||
target: newtab
|
||||
id: 1_1472_authentikuser
|
||||
```
|
||||
|
||||
Adjusting `sections` visibility:
|
||||
```
|
||||
sections:
|
||||
- name: Authentication
|
||||
displayData:
|
||||
sortBy: default
|
||||
rows: 2
|
||||
cols: 1
|
||||
collapsed: false
|
||||
hideForGuests: false
|
||||
hideForKeycloakUsers:
|
||||
groups:
|
||||
- Dashy Users
|
||||
```
|
||||
---
|
||||
|
||||
## Alternative Authentication Methods
|
||||
|
||||
If you are self-hosting Dashy, and require secure authentication to prevent unauthorized access, then you can either use Keycloak, or one of the following options:
|
||||
|
|
@ -263,7 +545,7 @@ In NGINX you can specify [control access](https://docs.nginx.com/nginx/admin-gui
|
|||
|
||||
```text
|
||||
server {
|
||||
listen 80;
|
||||
listen 8080;
|
||||
server_name www.dashy.example.com;
|
||||
location / {
|
||||
root /path/to/dashy/;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,7 @@
|
|||
# Cloud Backup and Restore
|
||||
|
||||
Beyond the cloud backup/restore service, there are several other self-hosted options you can use to backup Dashy, and any other Docker container data. These are outlined in the Management docs, at: [Docker Backup Options](/docs/management.md#backing-up).
|
||||
|
||||
Dashy has a built-in feature for securely backing up your config to a hosted cloud service, and then restoring it on another instance. This feature is totally optional, and if you do not enable it, then Dashy will not make any external network requests.
|
||||
|
||||
This is useful not only for backing up your configuration off-site, but it also enables Dashy to be used without having write a YAML config file, and makes it possible to use a public hosted instance, without the need to self-host.
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# Configuring
|
||||
|
||||
All app configuration is specified in [`/public/conf.yml`](https://github.com/Lissy93/dashy/blob/master/public/conf.yml) which is in [YAML Format](https://yaml.org/) format. If you're using Docker, this file can be passed in as a volume. Changes can either be made directly to this file, or done [through the UI](#editing-config-through-the-ui). From the UI you can also export, backup, reset, validate and download your configuration file.
|
||||
All app configuration is specified in [`/user-data/conf.yml`](https://github.com/Lissy93/dashy/blob/master/user-data/conf.yml) which is in [YAML Format](https://yaml.org/) format. If you're using Docker, this file can be passed in as a volume. Changes can either be made directly to this file, or done [through the UI](#editing-config-through-the-ui). From the UI you can also export, backup, reset, validate and download your configuration file.
|
||||
|
||||
## There are three ways to edit the config
|
||||
|
||||
|
|
@ -36,6 +36,7 @@ The following file provides a reference of all supported configuration options.
|
|||
- [`auth`](#appconfigauth-optional) - Built-in authentication setup
|
||||
- [`users`](#appconfigauthusers-optional) - List or users (for simple auth)
|
||||
- [`keycloak`](#appconfigauthkeycloak-optional) - Auth config for Keycloak
|
||||
- [`headerAuth`](#appconfigauthheaderauth-optional) - Auth config for HeaderAuth
|
||||
- [**`sections`**](#section) - List of sections
|
||||
- [`displayData`](#sectiondisplaydata-optional) - Section display settings
|
||||
- [`show/hideForKeycloakUsers`](#sectiondisplaydatahideforkeycloakusers-sectiondisplaydatashowforkeycloakusers-itemdisplaydatahideforkeycloakusers-and-itemdisplaydatashowforkeycloakusers) - Set user controls
|
||||
|
|
@ -92,7 +93,9 @@ The following file provides a reference of all supported configuration options.
|
|||
**Field** | **Type** | **Required**| **Description**
|
||||
--- | --- | --- | ---
|
||||
**`name`** | `string` | Required | A unique name for that page
|
||||
**`path`** | `string` | Required | The path (local or remote) to the config file to use.<br>For files located within `/public`, you only need to specify filename, for externally hosted files you must include the full URL
|
||||
**`path`** | `string` | Required | The path (local or remote) to the config file to use.<br>For files located within `/user-data`, you only need to specify filename, for externally hosted files you must include the full URL
|
||||
|
||||
For more info, see the[Multi-Page docs](/docs/pages-and-sections.md#multi-page-support)
|
||||
|
||||
**[⬆️ Back to Top](#configuring)**
|
||||
|
||||
|
|
@ -101,7 +104,7 @@ The following file provides a reference of all supported configuration options.
|
|||
**Field** | **Type** | **Required**| **Description**
|
||||
--- | --- | --- | ---
|
||||
**`language`** | `string` | _Optional_ | The 2 (or 4-digit) [ISO 639-1 code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) for your language, e.g. `en` or `en-GB`. This must be a language that the app has already been [translated](https://github.com/Lissy93/dashy/tree/master/src/assets/locales) into. If your language is unavailable, Dashy will fallback to English. By default Dashy will attempt to auto-detect your language, although this may not work on some privacy browsers.
|
||||
**`startingView`** | `enum` | _Optional_ | Which page to load by default, and on the base page or domain root. You can still switch to different views from within the UI. Can be either `default`, `minimal` or `workspace`. Defaults to `default`
|
||||
~~**`startingView`**~~ | `enum` | _Optional_ | Which page to load by default, and on the base page or domain root. You can still switch to different views from within the UI. Can be either `default`, `minimal` or `workspace`. Defaults to `default`. NOTE: This has been replaced by an environmental variable: `VUE_APP_STARTING_VIEW` in V3 onwards
|
||||
**`defaultOpeningMethod`** | `enum` | _Optional_ | The default opening method for items, if no `target` is specified for a given item. Can be either `newtab`, `sametab`, `modal`, `workspace`, `clipboard`, `top` or `parent`. Defaults to `newtab`
|
||||
**`statusCheck`** | `boolean` | _Optional_ | When set to `true`, Dashy will ping each of your services and display their status as a dot next to each item. This can be overridden by setting `statusCheck` under each item. Defaults to `false`
|
||||
**`statusCheckInterval`** | `number` | _Optional_ | The number of seconds between checks. If set to `0` then service will only be checked on initial page load, which is usually the desired functionality. If value is less than `10` you may experience a hit in performance. Defaults to `0`
|
||||
|
|
@ -142,11 +145,23 @@ The following file provides a reference of all supported configuration options.
|
|||
|
||||
## `appConfig.auth` _(optional)_
|
||||
|
||||
> [!NOTE]
|
||||
> Since the auth is initiated in the main app entry point (for security), a rebuild is required to apply changes to the auth configuration.
|
||||
> You can trigger a rebuild through the UI, under Config --> Rebuild, or by running `yarn build` in the root directory.
|
||||
|
||||
> [!WARNING]
|
||||
> Built-in auth should **not be used** for security-critical applications, or if your Dashy instance is publicly accessible.
|
||||
> For these, it is recommended to use an [alternate authentication method](/docs/authentication.md#alternative-authentication-methods).
|
||||
|
||||
**Field** | **Type** | **Required**| **Description**
|
||||
--- | --- | --- | ---
|
||||
**`users`** | `array` | _Optional_ | An array of objects containing usernames and hashed passwords. If this is not provided, then authentication will be off by default, and you will not need any credentials to access the app. See [`appConfig.auth.users`](#appconfigauthusers-optional). <br>**Note** this method of authentication is handled on the client side, so for security critical situations, it is recommended to use an [alternate authentication method](/docs/authentication.md#alternative-authentication-methods).
|
||||
**`enableKeycloak`** | `boolean` | _Optional_ | If set to `true`, then authentication using Keycloak will be enabled. Note that you need to have an instance running, and have also configured `auth.keycloak`. Defaults to `false`
|
||||
**`keycloak`** | `object` | _Optional_ | Config options to point Dashy to your Keycloak server. Requires `enableKeycloak: true`. See [`auth.keycloak`](#appconfigauthkeycloak-optional) for more info
|
||||
**`enableHeaderAuth`** | `boolean` | _Optional_ | If set to `true`, then authentication using HeaderAuth will be enabled. Note that you need to have your web server/reverse proxy running, and have also configured `auth.headerAuth`. Defaults to `false`
|
||||
**`headerAuth`** | `object` | _Optional_ | Config options to point Dashy to your headers for authentication. Requires `enableHeaderAuth: true`. See [`auth.headerAuth`](#appconfigauthheaderauth-optional) for more info
|
||||
**`enableOidc`** | `boolean` | _Optional_ | If set to `true`, then authentication using OIDC will be enabled. Note that you need to have a configured OIDC server and configure it with `auth.oidc`. Defaults to `false`
|
||||
**`oidc`** | `object` | _Optional_ | Config options to point Dash to your OIDC configuration. Request `enableOidc: true`. See [`auth.oidc`](#appconfigauthoidc-optional) for more info
|
||||
**`enableGuestAccess`** | `boolean` | _Optional_ | When set to `true`, an unauthenticated user will be able to access the dashboard, with read-only access, without having to login. Requires `auth.users` to be configured. Defaults to `false`.
|
||||
|
||||
For more info, see the **[Authentication Docs](/docs/authentication.md)**
|
||||
|
|
@ -174,6 +189,27 @@ For more info, see the **[Authentication Docs](/docs/authentication.md)**
|
|||
|
||||
**[⬆️ Back to Top](#configuring)**
|
||||
|
||||
## `appConfig.auth.headerAuth` _(optional)_
|
||||
|
||||
**Field** | **Type** | **Required**| **Description**
|
||||
--- | --- | --- | ---
|
||||
**`userHeader`** | `string` | _Optional_ | The Header name which contains username (default: REMOTE_USER). Case insensitive
|
||||
**`proxyWhitelist`** | `array` | Required | An array of Upstream proxy servers to expect authencticated requests from
|
||||
|
||||
**[⬆️ Back to Top](#configuring)**
|
||||
|
||||
## `appConfig.auth.oidc` _(optional)_
|
||||
|
||||
**Field** | **Type** | **Required**| **Description**
|
||||
--- | --- | --- | ---
|
||||
**`clientId`** | `string` | Required | The client id registered in the OIDC server
|
||||
**`endpoint`** | `string` | Required | The URL of the OIDC server that should be used.
|
||||
**`adminRole`** | `string` | _Optional_ | The role that will be considered as admin.
|
||||
**`adminGroup`** | `string` | _Optional_ | The group that will be considered as admin.
|
||||
**`scope`** | `string` | Required | The scope(s) to request from the OIDC provider
|
||||
|
||||
**[⬆️ Back to Top](#configuring)**
|
||||
|
||||
## `appConfig.webSearch` _(optional)_
|
||||
|
||||
**Field** | **Type** | **Required**| **Description**
|
||||
|
|
@ -288,7 +324,7 @@ For more info, see the **[Authentication Docs](/docs/authentication.md)**
|
|||
|
||||
**Field** | **Type** | **Required**| **Description**
|
||||
--- | --- | --- | ---
|
||||
**`icon`** | `string` | _Optional_ | The icon for a given item or section. <br>See [Icon Docs](/docs/icons.md) for all available supported icon types, including: auto-fetched favicons, generative icons, emoji icons, home-lab service logos, font-awesome, simple-icons, material icons, and icons specified by URL
|
||||
**`icon`** | `string` | _Optional_ | The icon for a given item or section. <br>See [Icon Docs](/docs/icons.md) for all available supported icon types, including: auto-fetched favicons, generative icons, emoji icons, home-lab service logos, font-awesome, simple-icons, material icons, selfh.st icons, and icons specified by URL
|
||||
|
||||
**[⬆️ Back to Top](#configuring)**
|
||||
|
||||
|
|
|
|||
|
|
@ -130,7 +130,7 @@ If you like, you could also consider [subscribing to my mailing list](https://no
|
|||
|
||||
For a full list of Dashy's contributors, see the [Credits Page](/docs/credits.md)
|
||||
|
||||
[](/docs/credits.md)
|
||||
[](https://github.com/Lissy93/dashy/blob/master/docs/credits.md)
|
||||
|
||||
### Star-Gazers Over Time
|
||||
|
||||
|
|
|
|||
1184
docs/credits.md
|
|
@ -7,7 +7,7 @@ Welcome to Dashy, so glad you're here :) Deployment is super easy, and there are
|
|||
If you want to skip the fuss, and [get straight down to it](/docs/quick-start.md), then you can spin up a new instance of Dashy by running:
|
||||
|
||||
```bash
|
||||
docker run -p 8080:80 lissy93/dashy
|
||||
docker run -p 8080:8080 lissy93/dashy
|
||||
```
|
||||
|
||||
See [Management Docs](/docs/management.md) for info about securing, monitoring, updating, health checks, auto starting, web server configuration, etc
|
||||
|
|
@ -67,8 +67,8 @@ Dashy has a built container image hosted on [Docker Hub](https://hub.docker.com/
|
|||
|
||||
```bash
|
||||
docker run -d \
|
||||
-p 8080:80 \
|
||||
-v /root/my-local-conf.yml:/app/public/conf.yml \
|
||||
-p 8080:8080 \
|
||||
-v /root/my-local-conf.yml:/app/user-data/conf.yml \
|
||||
--name my-dashboard \
|
||||
--restart=always \
|
||||
lissy93/dashy:latest
|
||||
|
|
@ -110,9 +110,9 @@ services:
|
|||
container_name: Dashy
|
||||
# Pass in your config file below, by specifying the path on your host machine
|
||||
# volumes:
|
||||
# - /root/my-config.yml:/app/public/conf.yml
|
||||
# - /root/my-config.yml:/app/user-data/conf.yml
|
||||
ports:
|
||||
- 4000:80
|
||||
- 8080:8080
|
||||
# Set any environmental variables
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
|
|
@ -166,8 +166,8 @@ Installing dashy is really simply and fast:
|
|||
|
||||
```bash
|
||||
docker run -d \
|
||||
-p 4000:80 \
|
||||
-v /volume1/docker/dashy/my-local-conf.yml:/app/public/conf.yml \
|
||||
-p 4000:8080 \
|
||||
-v /volume1/docker/dashy/my-local-conf.yml:/app/user-data/conf.yml \
|
||||
--name dashy \
|
||||
--restart=always \
|
||||
lissy93/dashy:latest
|
||||
|
|
@ -182,7 +182,7 @@ dashy should be up within 1-2min after you've started the install task procedure
|
|||
If you do not want to use Docker, you can run Dashy directly on your host system. For this, you will need both [git](https://git-scm.com/downloads) and the latest or LTS version of [Node.js](https://nodejs.org/) installed, and optionally [yarn](https://yarnpkg.com/)
|
||||
|
||||
1. Get Code: `git clone https://github.com/Lissy93/dashy.git` and `cd dashy`
|
||||
2. Configuration: Fill in you're settings in `./public/conf.yml`
|
||||
2. Configuration: Fill in your settings in `./user-data/conf.yml`
|
||||
3. Install dependencies: `yarn`
|
||||
4. Build: `yarn build`
|
||||
5. Run: `yarn start`
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ Dashy should now be being served on <http://localhost:8080/>. Hot reload is enab
|
|||
|
||||
#### Utils and Checks
|
||||
|
||||
- **`yarn validate-config`** - If you have quite a long configuration file, you may wish to check that it's all good to go, before deploying the app. This can be done with `yarn validate-config` or `docker exec -it [container-id] yarn validate-config`. Your config file needs to be in `/public/conf.yml` (or within your Docker container at `/app/public/conf.yml`). This will first check that your YAML is valid, and then validates it against Dashy's [schema](https://github.com/Lissy93/dashy/blob/master/src/utils/ConfigSchema.js).
|
||||
- **`yarn validate-config`** - If you have quite a long configuration file, you may wish to check that it's all good to go, before deploying the app. This can be done with `yarn validate-config` or `docker exec -it [container-id] yarn validate-config`. Your config file needs to be in `/user-data/conf.yml` (or within your Docker container at `/app/user-data/conf.yml`). This will first check that your YAML is valid, and then validates it against Dashy's [schema](https://github.com/Lissy93/dashy/blob/master/src/utils/ConfigSchema.js).
|
||||
- **`yarn health-check`** - Checks that the application is up and running on it's specified port, and outputs current status and response times. Useful for integrating into your monitoring service, if you need to maintain high system availability
|
||||
|
||||
#### Alternate Start Commands
|
||||
|
|
|
|||
|
|
@ -104,7 +104,7 @@ If you are not comfortable with making pull requests, or do not want to modify t
|
|||
|
||||
This section is for, adding a new setting to the config file.
|
||||
|
||||
All of the users config is specified in `./public/conf.yml` - see [Configuring Docs](./configuring.md) for info.
|
||||
All of the users config is specified in `./user-data/conf.yml` - see [Configuring Docs](./configuring.md) for info.
|
||||
It's important to first ensure that there isn't a similar option already available, the new option is definitely necessary, and most importantly that it is fully backwards compatible.
|
||||
|
||||
Next choose the appropriate section to place it under
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ Both sections and items can have an icon, which is specified using the `icon` at
|
|||
- [Simple Icons](#simple-icons)
|
||||
- [Generative Icons](#generative-icons)
|
||||
- [Emoji Icons](#emoji-icons)
|
||||
- [selfh.st Icons](#selfhst-icons)
|
||||
- [Home-Lab Icons](#home-lab-icons)
|
||||
- [Material Icons](#material-design-icons)
|
||||
- [Icons by URL](#icons-by-url)
|
||||
|
|
@ -63,7 +64,7 @@ Font-Awesome has a wide variety of free icons, but you can also use their pro ic
|
|||
|
||||
## Simple Icons
|
||||
|
||||
[SimpleIcons.org](https://simpleicons.org/) is a collection of 2000+ high quality, free and open source brand and logo SVG icons. Usage of which is very similar to font-awesome icons. First find the glyph you want to use on the [website](https://simpleicons.org/), then just set your icon the the simple icon slug, prefixed with `si-`.
|
||||
[SimpleIcons.org](https://simpleicons.org/) is a collection of 2000+ high quality, free and open source brand and logo SVG icons. Usage of which is very similar to font-awesome icons. First find the glyph you want to use on the [website](https://simpleicons.org/), then just set your icon to the simple icon slug, prefixed with `si-`.
|
||||
|
||||
<p align="center">
|
||||
<img width="580" src="https://i.ibb.co/MVhkXfC/simple-icons-example.png" />
|
||||
|
|
@ -109,9 +110,21 @@ For example, these will all render the same rocket (🚀) emoji: `icon: ':rocket
|
|||
|
||||
---
|
||||
|
||||
## selfh.st Icons
|
||||
|
||||
The [selfh.st](https://selfh.st/) project provides a set of icons, originally for self-hosted services, but now expanded to include a wide variety of services. These icons can be used by specifying the icon name (without extension and with all spaces replaced with -) preceded by `sh-`. See https://selfh.st/icons/ for a full list of all available icons. For example, the Home Assistant icon is `sh-home-assistant`.
|
||||
|
||||
Note: These icons are fetched from the jsdelivr CDN, so if you require offline access, the [Local Icons](#local-icons) method may be a better option for you.
|
||||
|
||||
<p align="center">
|
||||
<img width="580" src="https://i.ibb.co/pfy09LH/Screenshot-from-2025-01-08-22-04-21.png" />
|
||||
</p>
|
||||
|
||||
---
|
||||
|
||||
## Home-Lab Icons
|
||||
|
||||
The [dashboard-icons](https://github.com/walkxcode/Dashboard-Icons) repo by [@WalkxCode](https://github.com/WalkxCode) provides a comprehensive collection of 360+ high-quality PNG icons for commonly self-hosted services. Dashy natively supports these icons, and you can use them just by specifying the icon name (without extension) preceded by `hl-`. See [here](https://github.com/walkxcode/Dashboard-Icons/tree/main/png) for a full list of all available icons. Note that these are fetched and cached strait from GitHub, so if you require offline access, the [Local Icons](#local-icons) method may be a better option for you.
|
||||
The [dashboard-icons](https://github.com/walkxcode/Dashboard-Icons) repo by [@WalkxCode](https://github.com/WalkxCode) provides a comprehensive collection of 360+ high-quality PNG icons for commonly self-hosted services. Dashy natively supports these icons, and you can use them just by specifying the icon name (without extension) preceded by `hl-`. See [here](https://github.com/walkxcode/Dashboard-Icons/tree/main/png) for a full list of all available icons. Note that these are fetched and cached straight from GitHub, so if you require offline access, the [Local Icons](#local-icons) method may be a better option for you.
|
||||
|
||||
For example:
|
||||
|
||||
|
|
@ -167,7 +180,7 @@ You can also set an icon by passing in a valid URL pointing to the icons locatio
|
|||
|
||||
## Local Icons
|
||||
|
||||
You may also want to store your icons locally, bundled within Dashy so that there is no reliance on outside services. This can be done by putting the icons within Dashy's `./public/item-icons/` directory. If you are using Docker, then the easiest option is to map a volume from your host system, for example: `-v /local/image/directory:/app/public/item-icons/`. To reference an icon stored locally, just specify it's name and extension. For example, if my icon was stored in `/app/public/item-icons/maltrail.png`, then I would just set `icon: maltrail.png`.
|
||||
You may also want to store your icons locally, bundled within Dashy so that there is no reliance on outside services. This can be done by putting the icons within Dashy's `./user-data/item-icons/` directory. If you are using Docker, then the easiest option is to map a volume from your host system, for example: `-v /local/image/directory:/app/user-data/item-icons/`. To reference an icon stored locally, just specify it's name and extension. For example, if my icon was stored in `/app/user-data/item-icons/maltrail.png`, then I would just set `icon: maltrail.png`.
|
||||
|
||||
You can also use sub-folders within the `item-icons` directory to keep things organized. You would then specify an icon with it's folder name slash image name. For example: `networking/monit.png`
|
||||
|
||||
|
|
@ -187,7 +200,7 @@ If you don't wish for a given item or section to have an icon, just leave out th
|
|||
|
||||
## Icon Collections and Resources
|
||||
|
||||
The following websites provide good-quality, free icon sets. To use any of these icons, either copy the link to the raw icon (it should end in `.svg` or `.png`) and paste it as your `icon`, or download and save the icons in `/public/item-icons` / mapped Docker volume. Full credit to the authors, please see the licenses for each service for usage and copyright information.
|
||||
The following websites provide good-quality, free icon sets. To use any of these icons, either copy the link to the raw icon (it should end in `.svg` or `.png`) and paste it as your `icon`, or download and save the icons in `/user-data/item-icons` / mapped Docker volume. Full credit to the authors, please see the licenses for each service for usage and copyright information.
|
||||
|
||||
- [Icons for Self-Hosted Apps](https://thehomelab.wiki/books/helpful-tools-resources/page/icons-for-self-hosted-dashboards) - 350+ high-quality icons for commonly self-hosted services
|
||||
- [SVG Box](https://svgbox.net/iconsets/) - Cryptocurrency, social media apps and flag icons
|
||||
|
|
|
|||
|
|
@ -30,11 +30,11 @@ _The following article is a primer on managing self-hosted apps. It covers every
|
|||
|
||||
Although not essential, you will most likely want to provide several assets to your running app.
|
||||
|
||||
This is easy to do using [Docker Volumes](https://docs.docker.com/storage/volumes/), which lets you share a file or directory between your host system, and the container. Volumes are specified in the Docker run command, or Docker compose file, using the `--volume` or `-v` flags. The value of which consists of the path to the file / directory on your host system, followed by the destination path within the container. Fields are separated by a colon (`:`), and must be in the correct order. For example: `-v ~/alicia/my-local-conf.yml:/app/public/conf.yml`
|
||||
This is easy to do using [Docker Volumes](https://docs.docker.com/storage/volumes/), which lets you share a file or directory between your host system, and the container. Volumes are specified in the Docker run command, or Docker compose file, using the `--volume` or `-v` flags. The value of which consists of the path to the file / directory on your host system, followed by the destination path within the container. Fields are separated by a colon (`:`), and must be in the correct order. For example: `-v ~/alicia/my-local-conf.yml:/app/user-data/conf.yml`
|
||||
|
||||
In Dashy, commonly configured resources include:
|
||||
|
||||
- `./public/conf.yml` - Your main application config file
|
||||
- `./user-data/conf.yml` - Your main application config file
|
||||
- `./public/item-icons` - A directory containing your own icons. This allows for offline access, and better performance than fetching from a CDN
|
||||
- Also within `./public` you'll find standard website assets, including `favicon.ico`, `manifest.json`, `robots.txt`, etc. There's no need to pass these in, but you can do so if you wish
|
||||
- `/src/styles/user-defined-themes.scss` - A stylesheet for applying custom CSS to your app. You can also write your own themes here.
|
||||
|
|
@ -197,7 +197,9 @@ docker run --rm -v some_volume:/volume -v /tmp:/backup alpine sh -c "rm -rf /vol
|
|||
|
||||
### Dashy-Specific Backup
|
||||
|
||||
Since Dashy is open source, and freely available, providing you're configuration data is passed in as volumes, there shouldn't be any need to backup the main container. Your main config file, and any assets you're using should be kept backed up, preferably in at least two places, and you should ensure that you can easily restore from backup, if needed.
|
||||
All configuration and dashboard settings are stored in your `user-data/conf.yml` file. If you provide additional assets (like icons, fonts, themes, etc), these will also live in the `user-data` directory. So to backup all Dashy data, this is the only directory you need to backup.
|
||||
|
||||
Since Dashy is open source, there shouldn't be any need to backup the main container.
|
||||
|
||||
Dashy also has a built-in cloud backup feature, which is free for personal users, and will let you make and restore fully encrypted backups of your config directly through the UI. To learn more, see the [Cloud Backup Docs](/docs/backup-restore.md)
|
||||
|
||||
|
|
@ -238,7 +240,7 @@ Once you've generated your SSL cert, you'll need to pass it to Dashy. This can b
|
|||
|
||||
```bash
|
||||
docker run -d \
|
||||
-p 8080:80 \
|
||||
-p 8080:8080 \
|
||||
-v ~/my-private-key.key:/etc/ssl/certs/dashy-priv.key:ro \
|
||||
-v ~/my-public-key.pem:/etc/ssl/certs/dashy-pub.pem:ro \
|
||||
lissy93/dashy:latest
|
||||
|
|
@ -276,9 +278,9 @@ services:
|
|||
container_name: Dashy
|
||||
image: lissy93/dashy
|
||||
volumes:
|
||||
- /root/my-config.yml:/app/public/conf.yml
|
||||
- /root/my-config.yml:/app/user-data/conf.yml
|
||||
ports:
|
||||
- 4000:80
|
||||
- 4000:8080
|
||||
environment:
|
||||
- BASE_URL=/my-dashboard
|
||||
restart: unless-stopped
|
||||
|
|
@ -550,7 +552,7 @@ upstream dashy {
|
|||
}
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
listen 8080;
|
||||
server_name dashy.mydomain.com;
|
||||
|
||||
# Setup SSL
|
||||
|
|
@ -577,7 +579,7 @@ Similarly, a basic `Caddyfile` might look like:
|
|||
|
||||
```text
|
||||
dashy.example.com {
|
||||
reverse_proxy / nginx:80
|
||||
reverse_proxy / nginx:8080
|
||||
}
|
||||
```
|
||||
|
||||
|
|
@ -614,7 +616,7 @@ To prevent known container escape vulnerabilities, which typically end in escala
|
|||
Docker enables you to limit resource consumption (CPU, memory, disk) on a per-container basis. This not only enhances system performance, but also prevents a compromised container from consuming a large amount of resources, in order to disrupt service or perform malicious activities. To learn more, see the [Resource Constraints Docs](https://docs.docker.com/config/containers/resource_constraints/)
|
||||
|
||||
For example, to run Dashy with max of 1GB ram, and max of 50% of 1 CP core:
|
||||
`docker run -d -p 8080:80 --cpus=".5" --memory="1024m" lissy93/dashy:latest`
|
||||
`docker run -d -p 8080:8080 --cpus=".5" --memory="1024m" lissy93/dashy:latest`
|
||||
|
||||
### Don't Run as Root
|
||||
|
||||
|
|
@ -629,7 +631,7 @@ One of the best ways to prevent privilege escalation attacks, is to configure th
|
|||
You can specify a user, using the [`--user` param](https://docs.docker.com/engine/reference/run/#user), and should include the user ID (`UID`), which can be found by running `id -u`, and the and the group ID (`GID`), using `id -g`.
|
||||
|
||||
With Docker run, you specify it like:
|
||||
`docker run --user 1000:1000 -p 8080:80 lissy93/dashy`
|
||||
`docker run --user 1000:1000 -p 8080:8080 lissy93/dashy`
|
||||
|
||||
Of if you're using Docker-compose, you could use an environmental variable
|
||||
|
||||
|
|
@ -639,7 +641,7 @@ services:
|
|||
dashy:
|
||||
image: lissy93/dashy
|
||||
user: ${CURRENT_UID}
|
||||
ports: [ 4000:80 ]
|
||||
ports: [ 4000:8080 ]
|
||||
```
|
||||
|
||||
And then to set the variable, and start the container, run: `CURRENT_UID=$(id -u):$(id -g) docker-compose up`
|
||||
|
|
@ -659,7 +661,7 @@ version: "3.8"
|
|||
services:
|
||||
dashy:
|
||||
image: lissy93/dashy
|
||||
ports: [ 4000:80 ]
|
||||
ports: [ 4000:8080 ]
|
||||
cap_drop:
|
||||
- ALL
|
||||
cap_add:
|
||||
|
|
@ -675,7 +677,7 @@ services:
|
|||
To prevent processes inside the container from getting additional privileges, pass in the `--security-opt=no-new-privileges:true` option to the Docker run command (see [docs](https://docs.docker.com/engine/reference/run/#security-configuration)).
|
||||
|
||||
Run Command:
|
||||
`docker run --security-opt=no-new-privileges:true -p 8080:80 lissy93/dashy`
|
||||
`docker run --security-opt=no-new-privileges:true -p 8080:8080 lissy93/dashy`
|
||||
|
||||
Docker Compose
|
||||
|
||||
|
|
@ -701,14 +703,14 @@ You can specify that a specific volume should be read-only by appending `:ro` to
|
|||
|
||||
```bash
|
||||
docker run -d \
|
||||
-p 8080:80 \
|
||||
-v ~/dashy-conf.yml:/app/public/conf.yml \
|
||||
-p 8080:8080 \
|
||||
-v ~/dashy-conf.yml:/app/user-data/conf.yml \
|
||||
-v ~/dashy-icons:/app/public/item-icons:ro \
|
||||
-v ~/dashy-theme.scss:/app/src/styles/user-defined-themes.scss:ro \
|
||||
lissy93/dashy:latest
|
||||
```
|
||||
|
||||
You can also prevent a container from writing any changes to volumes on your host's disk, using the `--read-only` flag. Although, for Dashy, you will not be able to write config changes to disk, when edited through the UI with this method. You could make this work, by specifying the config directory as a temp write location, with `--tmpfs /app/public/conf.yml` - but that this will not write the volume back to your host.
|
||||
You can also prevent a container from writing any changes to volumes on your host's disk, using the `--read-only` flag. Although, for Dashy, you will not be able to write config changes to disk, when edited through the UI with this method. You could make this work, by specifying the config directory as a temp write location, with `--tmpfs /app/user-data/conf.yml` - but that this will not write the volume back to your host.
|
||||
|
||||
### Set the Logging Level
|
||||
|
||||
|
|
@ -778,8 +780,8 @@ Create a new file in `/etc/nginx/sites-enabled/dashy`
|
|||
|
||||
```text
|
||||
server {
|
||||
listen 80;
|
||||
listen [::]:80;
|
||||
listen 8080;
|
||||
listen [::]:8080;
|
||||
|
||||
root /var/www/dashy/html;
|
||||
index index.html;
|
||||
|
|
@ -898,7 +900,7 @@ Similar to above, you'll first need to fork and clone Dashy to your local system
|
|||
|
||||
Then, either use Dashy's default [`Dockerfile`](https://github.com/Lissy93/dashy/blob/master/Dockerfile) as is, or modify it according to your needs.
|
||||
|
||||
To build and deploy locally, first build the app with: `docker build -t dashy .`, and then start the app with `docker run -p 8080:80 --name my-dashboard dashy`. Or modify the `docker-compose.yml` file, replacing `image: lissy93/dashy` with `build: .` and run `docker compose up`.
|
||||
To build and deploy locally, first build the app with: `docker build -t dashy .`, and then start the app with `docker run -p 8080:8080 --name my-dashboard dashy`. Or modify the `docker-compose.yml` file, replacing `image: lissy93/dashy` with `build: .` and run `docker compose up`.
|
||||
|
||||
Your container should now be running, and will appear in the list when you run `docker container ls –a`. If you'd like to enter the container, run `docker exec -it [container-id] /bin/ash`.
|
||||
|
||||
|
|
|
|||
|
|
@ -8,9 +8,9 @@ You can edit additional pages using the interactive editor, exactly the same was
|
|||
|
||||
### Using Local Sub-Pages
|
||||
|
||||
To get started, create a new `.yml` config file for your sub-page, placing it within `/app/public`. Then within your primary `conf.yml`, choose a name, and specify the path to the new file.
|
||||
To get started, create a new `.yml` config file for your sub-page, placing it within `/app/user-data`. Then within your primary `conf.yml`, choose a name, and specify the path to the new file.
|
||||
|
||||
For example:
|
||||
This is an example. Make sure to add this to the topmost line above appConfig:, or anywhere else appropriately, to match the yml syntax.
|
||||
|
||||
```yaml
|
||||
pages:
|
||||
|
|
@ -20,7 +20,17 @@ pages:
|
|||
path: 'work.yml'
|
||||
```
|
||||
|
||||
If you're sub-page is located within `/app/public`, then you only need to specify the filename, but if it's anywhere else, then the full path is required.
|
||||
The next step is to create the new page, if you mounted `/app/user-data` in the docker command and not a volume, you can simply create the new page into that folder on the host.
|
||||
|
||||
If you mounted `/app/user-data/conf.yml` in docker, you can either switch to the volume or create another bind mount to your new additional page.
|
||||
|
||||
If you're sub-page is located within `/app/user-data`, then you only need to specify the filename, but if it's anywhere else, then the full path is required.
|
||||
|
||||
A default template a page can be found here: [https://github.com/lissy93/dashy/blob/master/user-data/conf.yml](https://github.com/lissy93/dashy/blob/master/user-data/conf.yml) Keep in mind the appConfig cannot be used on subpages and should be removed, for further info see [Restrictions](#restrictions)
|
||||
|
||||
The last very important step is to rebuild dashy, this can be easily done through to UI, by opening the settings menu on the top right, navigato to update config and then recompile application.
|
||||
|
||||
Now if you reload the page, on the top right there should be a new button to navigate to the new page. 🎉
|
||||
|
||||
### Using Remote Sub-Pages
|
||||
|
||||
|
|
@ -71,7 +81,7 @@ A normal section will contain zero or more items, for example:
|
|||
url: http://stackoverflow.com/
|
||||
```
|
||||
|
||||
But items can also be grouped together, referred to as sub-items. This is useful for a group of less frequently used items, which you don't want to take up too much space, or for action buttons (_coming soon_).
|
||||
But items can also be grouped together, referred to as sub-items. This is useful for a group of less frequently used items, which you don't want to take up too much space.
|
||||
|
||||
Item groups may also have an optional title.
|
||||
|
||||
|
|
|
|||
|
|
@ -118,9 +118,10 @@ Dashy supports [Widgets](/docs/widgets.md) for displaying dynamic content. Below
|
|||
- [OWM Privacy Policy](https://openweather.co.uk/privacy-policy)
|
||||
- **[RSS Feed](/docs/widgets.md#rss-feed)**: `https://api.rss2json.com/v1/api.json`
|
||||
- [Rss2Json Privacy Policy](https://rss2json.com/privacy-policy)
|
||||
- **[IP Address](/docs/widgets.md#public-ip)**: `https://ipapi.co/json` or `http://ip-api.com/json`
|
||||
- **[IP Address](/docs/widgets.md#public-ip)**: `https://ipapi.co/json` or `http://ip-api.com/json` or `https://api.ip2location.io/`
|
||||
- [IPGeoLocation Privacy Policy](https://ipgeolocation.io/privacy.html)
|
||||
- [IP-API Privacy Policy](https://ip-api.com/docs/legal)
|
||||
- [IP2Location.io Privacy Policy](https://ip2location.io/privacy-policy)
|
||||
- **[IP Blacklist](/docs/widgets.md#ip-blacklist)**: `https://api.blacklistchecker.com`
|
||||
- [Blacklist Checker Privacy Policy](https://blacklistchecker.com/privacy)
|
||||
- **[Domain Monitor](/docs/widgets.md#domain-monitor)**: `http://api.whoapi.com`
|
||||
|
|
@ -131,8 +132,8 @@ Dashy supports [Widgets](/docs/widgets.md) for displaying dynamic content. Below
|
|||
- [BlockCypher Privacy Policy](https://www.blockcypher.com/privacy.html)
|
||||
- **[Code::Stats](/docs/widgets.md#code-stats)**: `https://codestats.net`
|
||||
- [Code::Stats Privacy Policy](https://codestats.net/tos#privacy)
|
||||
- **[AnonAddy](/docs/widgets.md#anonaddy)**: `https://app.anonaddy.com`
|
||||
- [AnonAddy Privacy Policy](https://anonaddy.com/privacy/)
|
||||
- **[addy.io](/docs/widgets.md#addyio)**: `https://app.addy.io`
|
||||
- [addy.io Privacy Policy](https://addy.io/privacy/)
|
||||
- **[Vulnerability Feed](/docs/widgets.md#vulnerability-feed)**: `https://www.cvedetails.com`
|
||||
- [CVE Details Privacy Policy](https://www.cvedetails.com/privacy.php)
|
||||
- **[Exchange Rate](/docs/widgets.md#exchange-rates)**: `https://v6.exchangerate-api.com`
|
||||
|
|
@ -192,7 +193,7 @@ The following section outlines all data that is stored in the browsers, as cooki
|
|||
> [Local storage](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage) is persisted between sessions, and only deleted when manually removed
|
||||
|
||||
- `LANGUAGE` - The locale to show app text in
|
||||
- `HIDE_WELCOME_BANNER` - Set to true once user dismissed welcome message, so that it's not shown again
|
||||
- `HIDE_INFO_NOTIFICATION` - Set to true once user dismissed welcome message, so that it's not shown again
|
||||
- `LAYOUT_ORIENTATION` - Preferred section layout, either horizontal, vertical or auto
|
||||
- `COLLAPSE_STATE` - Remembers which sections are collapsed
|
||||
- `ICON_SIZE` - Size of items, either small, medium or large
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
Welcome to Dashy! So glad you're here 😊 In a couple of minutes, you'll have your new dashboard up and running 🚀
|
||||
|
||||
**TLDR;** Run `docker run -p 8080:80 lissy93/dashy`, then open `http://localhost:8080`
|
||||
**TLDR;** Run `docker run -p 8080:8080 lissy93/dashy`, then open `http://localhost:8080`
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -19,8 +19,8 @@ To pull the latest image, and build and start the app run:
|
|||
|
||||
```bash
|
||||
docker run -d \
|
||||
-p 8080:80 \
|
||||
-v ~/my-conf.yml:/app/public/conf.yml \
|
||||
-p 8080:8080 \
|
||||
-v ~/my-conf.yml:/app/user-data/conf.yml \
|
||||
--name my-dashboard \
|
||||
--restart=always \
|
||||
lissy93/dashy:latest
|
||||
|
|
@ -32,15 +32,41 @@ Your dashboard should now be up and running at `http://localhost:8080` (or your
|
|||
|
||||
---
|
||||
|
||||
## 3. Configure
|
||||
## 3. User Data Directory
|
||||
|
||||
Your config file should be placed inside `user-data/` (in Docker, that's `/app/user-data/`).
|
||||
|
||||
This directory can also contain some optional assets you wish to use within your dashboard, like icons, fonts, styles, scripts, etc.
|
||||
|
||||
Any files placed here will be served up to the root of the domain, and override the contents of `public/`.
|
||||
For example, if you had `user-data/favicon.ico` this would be accessible at `http://my-dashy-instance.local/favicon.ico`
|
||||
|
||||
Example Files in `user-data`:
|
||||
- `conf.yml` - This is the only file that is compulsory, it's your main Dashy config
|
||||
- `**.yml` - Include more config files, if you'd like to have multiple pages, see [Multi-page support](/docs/pages-and-sections.md#multi-page-support) for docs
|
||||
- `favicon.ico` - The default favicon, shown in the browser's tab title
|
||||
- `initialization.html` - Static HTML page displayed before the app has finished compiling, see [`public/initialization.html`](https://github.com/Lissy93/dashy/blob/master/public/initialization.html)
|
||||
- `robots.txt` - Search engine crawl rules, override this if you want your dashboard to be indexable
|
||||
- `manifest.json` - PWA configuration file, for installing Dashy on mobile devices
|
||||
- `index.html` - The main index page which initializes the client-side app, copy it from [`/public/index.html`](https://github.com/Lissy93/dashy/blob/master/public/index.html)
|
||||
- `**.html` - Write your own HTML pages, and access them at `http://my-dashy-instance.local/my-page.html`
|
||||
- `fonts/` - Custom fonts (be sure to include the ones already in [`public/fonts`](https://github.com/Lissy93/dashy/tree/master/public/fonts)
|
||||
- `item-icons/` - To use your own icons for items on your dashboard, see [Icons --> Local Icons](/docs/icons.md#local-icons)
|
||||
- `web-icons/` - Override Dashy logo
|
||||
- `widget-resources/` - Fonts, icons and assets for custom widgets
|
||||
|
||||
---
|
||||
|
||||
## 4. Configure
|
||||
|
||||
Now that you've got Dashy running, you are going to want to set it up with your own content.
|
||||
Config is written in [YAML Format](https://yaml.org/), and saved in [`/public/conf.yml`](https://github.com/Lissy93/dashy/blob/master/public/conf.yml).
|
||||
The format on the config file is pretty straight forward. There are three root attributes:
|
||||
Config is written in [YAML Format](https://yaml.org/), and saved in [`/user-data/conf.yml`](https://github.com/Lissy93/dashy/blob/master/user-data/conf.yml).
|
||||
The format on the config file is pretty straight forward. There are four root attributes:
|
||||
|
||||
- [`pageInfo`](https://github.com/Lissy93/dashy/blob/master/docs/configuring.md#pageinfo) - Dashboard meta data, like title, description, nav bar links and footer text
|
||||
- [`appConfig`](https://github.com/Lissy93/dashy/blob/master/docs/configuring.md#appconfig-optional) - Dashboard settings, like themes, authentication, language and customization
|
||||
- [`sections`](https://github.com/Lissy93/dashy/blob/master/docs/configuring.md#section) - An array of sections, each including an array of items
|
||||
- [`pages`](https://github.com/Lissy93/dashy/blob/master/docs/configuring.md#pages-optional) - Have multiples pages in your dashboard
|
||||
|
||||
You can view a full list of all available config options in the [Configuring Docs](https://github.com/Lissy93/dashy/blob/master/docs/configuring.md).
|
||||
|
||||
|
|
@ -72,15 +98,15 @@ sections: # An array of sections
|
|||
Notes:
|
||||
|
||||
- You can use a Docker volume to pass a config file from your host system to the container
|
||||
- E.g. `-v ./host-system/my-local-conf.yml:/app/public/conf.yml`
|
||||
- E.g. `-v ./host-system/my-local-conf.yml:/app/user-data/conf.yml`
|
||||
- It's also possible to edit your config directly through the UI, and changes will be saved in this file
|
||||
- Check your config against Dashy's schema, with `docker exec -it [container-id] yarn validate-config`
|
||||
- You might find it helpful to look at some examples, a collection of which can be [found here](https://gist.github.com/Lissy93/000f712a5ce98f212817d20bc16bab10)
|
||||
- After editing your config, the app will rebuild in the background, which may take a minute
|
||||
- It's also possible to load a remote config, e.g. from a GitHub Gist
|
||||
|
||||
---
|
||||
|
||||
## 4. Further Customisation
|
||||
## 5. Further Customisation
|
||||
|
||||
Once you've got Dashy setup, you'll want to ensure the container is properly healthy, secured, backed up and kept up-to-date. All this is covered in the [Management Docs](https://github.com/Lissy93/dashy/blob/master/docs/management.md).
|
||||
|
||||
|
|
@ -97,7 +123,7 @@ You might also want to check out the docs for specific features you'd like to us
|
|||
|
||||
---
|
||||
|
||||
## 5. Final Note
|
||||
## 6. Final Note
|
||||
|
||||
If you need any help or support in getting Dashy running, head over to the [Discussions](https://github.com/Lissy93/dashy/discussions) page. If you think you've found a bug, please do [raise it](https://github.com/Lissy93/dashy/issues/new/choose) so it can be fixed. For contact options, see the [Support Page](https://github.com/Lissy93/dashy/blob/master/.github/SUPPORT.md).
|
||||
|
||||
|
|
@ -118,7 +144,7 @@ yarn build # Build the app
|
|||
yarn start # Start the app
|
||||
```
|
||||
|
||||
Then edit `./public/conf.yml` and rebuild the app with `yarn build`
|
||||
Then edit `./user-data/conf.yml`
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -129,7 +155,7 @@ Don't have a server? No problem! You can run Dashy for free on Netlify (as well
|
|||
1. Fork Dashy's repository on GitHub
|
||||
2. [Log in](app.netlify.com/login/) to Netlify with GitHub
|
||||
3. Click "New site from Git" and select your forked repo, then click **Deploy**!
|
||||
4. You can then edit the config in `./public/conf.yml` in your repo, and Netlify will rebuild the app
|
||||
4. You can then edit the config in `./user-data/conf.yml` in your repo, and Netlify will rebuild the app
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
|
|
@ -3,6 +3,14 @@
|
|||
| 💗 Got a sweet dashboard? Submit it to the showcase! 👉 [See How](#submitting-your-dashboard) |
|
||||
|-|
|
||||
|
||||
## MNDashboard
|
||||
|
||||
> By [@mahrnet](https://github.com/mahrnet) <sup>Re: [#1491](https://github.com/Lissy93/dashy/issues/1491)</sup>
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
## Home Lab 2.0
|
||||
|
||||

|
||||
|
|
|
|||
|
|
@ -156,7 +156,7 @@ If you're getting an error about scenarios, then you've likely installed the wro
|
|||
Alternatively, as a workaround, you have several options:
|
||||
|
||||
- Try using [NPM](https://www.npmjs.com/get-npm) instead: So clone, cd, then run `npm install`, `npm run build` and `npm start`
|
||||
- Try using [Docker](https://www.docker.com/get-started) instead, and all of the system setup and dependencies will already be taken care of. So from within the directory, just run `docker build -t lissy93/dashy .` to build, and then use docker start to run the project, e.g: `docker run -it -p 8080:80 lissy93/dashy` (see the [deploying docs](https://github.com/Lissy93/dashy/blob/master/docs/deployment.md#deploy-with-docker) for more info)
|
||||
- Try using [Docker](https://www.docker.com/get-started) instead, and all of the system setup and dependencies will already be taken care of. So from within the directory, just run `docker build -t lissy93/dashy .` to build, and then use docker start to run the project, e.g: `docker run -it -p 8080:8080 lissy93/dashy` (see the [deploying docs](https://github.com/Lissy93/dashy/blob/master/docs/deployment.md#deploy-with-docker) for more info)
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -234,7 +234,7 @@ Version 2.0.4 introduced changes to how the config is read, and the app is build
|
|||
|
||||
```yaml
|
||||
volumes:
|
||||
- /srv/dashy/conf.yml:/app/public/conf.yml
|
||||
- /srv/dashy/conf.yml:/app/user-data/conf.yml
|
||||
- /srv/dashy/item-icons:/app/public/item-icons
|
||||
```
|
||||
|
||||
|
|
@ -273,12 +273,12 @@ See also: #479, #409, #507, #491, #341, #520
|
|||
Error response from daemon: OCI runtime create failed: container_linux.go:380:
|
||||
starting container process caused: process_linux.go:545: container init caused:
|
||||
rootfs_linux.go:76: mounting "/home/ubuntu/my-conf.yml" to rootfs at
|
||||
"/app/public/conf.yml" caused: mount through procfd: not a directory:
|
||||
"/app/user-data/conf.yml" caused: mount through procfd: not a directory:
|
||||
unknown: Are you trying to mount a directory onto a file (or vice-versa)?
|
||||
Check if the specified host path exists and is the expected type.
|
||||
```
|
||||
|
||||
If you get an error similar to the one above, you are mounting a directory to the config file's location, when a plain file is expected. Create a YAML file, (`touch my-conf.yml`), populate it with a sample config, then pass it as a volume: `-v ./my-local-conf.yml:/app/public/conf.yml`
|
||||
If you get an error similar to the one above, you are mounting a directory to the config file's location, when a plain file is expected. Create a YAML file, (`touch my-conf.yml`), populate it with a sample config, then pass it as a volume: `-v ./my-local-conf.yml:/app/user-data/conf.yml`
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
682
docs/widgets.md
12
netlify.toml
|
|
@ -8,14 +8,12 @@
|
|||
command = "yarn build"
|
||||
publish = "dist"
|
||||
functions = "services/serverless-functions"
|
||||
environment = { NODE_VERSION = "16.13.2" }
|
||||
|
||||
# Site info, used for the 1-Click deploy page
|
||||
[template.environment]
|
||||
STATUSKIT_PAGE_TITLE = "Dashy"
|
||||
STATUSKIT_COMPANY_LOGO = "https://raw.githubusercontent.com/Lissy93/dashy/master/docs/assets/logo.png"
|
||||
STATUSKIT_SUPPORT_CONTACT_LINK = "https://github.com/lissy93/dashy"
|
||||
STATUSKIT_RESOURCES_LINK = "https://dashy.to/docs"
|
||||
# Environmental variables for build command
|
||||
[build.environment]
|
||||
NODE_VERSION = "20.11.1"
|
||||
NODE_OPTIONS = "--openssl-legacy-provider"
|
||||
YARN_FLAGS = "--ignore-engines"
|
||||
|
||||
# Redirect the Node endpoints to serverless functions
|
||||
[[redirects]]
|
||||
|
|
|
|||
26
package.json
|
|
@ -1,21 +1,20 @@
|
|||
{
|
||||
"name": "Dashy",
|
||||
"version": "2.1.2",
|
||||
"name": "dashy",
|
||||
"version": "3.1.1",
|
||||
"license": "MIT",
|
||||
"main": "server",
|
||||
"author": "Alicia Sykes <alicia@omg.lol> (https://aliciasykes.com)",
|
||||
"scripts": {
|
||||
"start": "npm-run-all --parallel build-watch start",
|
||||
"dev": "vue-cli-service serve",
|
||||
"build": "vue-cli-service build",
|
||||
"start": "node server",
|
||||
"dev": "NODE_OPTIONS=--openssl-legacy-provider vue-cli-service serve",
|
||||
"build": "NODE_OPTIONS=--openssl-legacy-provider vue-cli-service build",
|
||||
"lint": "vue-cli-service lint",
|
||||
"pm2-start": "npx pm2 start server.js",
|
||||
"build-watch": "vue-cli-service build --watch --mode production",
|
||||
"build-and-start": "npm-run-all --parallel build-watch start",
|
||||
"build-and-start": "NODE_OPTIONS=--openssl-legacy-provider npm-run-all --parallel build start",
|
||||
"validate-config": "node services/config-validator",
|
||||
"health-check": "node services/healthcheck",
|
||||
"dependency-audit": "npx improved-yarn-audit --ignore-dev-deps",
|
||||
"static-start": "node server"
|
||||
"dependency-audit": "npx improved-yarn-audit --ignore-dev-deps"
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/core": "^7.0.0",
|
||||
|
|
@ -23,18 +22,20 @@
|
|||
"@sentry/tracing": "^7.102.1",
|
||||
"@sentry/vue": "^7.102.1",
|
||||
"ajv": "^8.10.0",
|
||||
"axios": "^1.6.0",
|
||||
"axios": "^1.12.0",
|
||||
"connect-history-api-fallback": "^1.6.0",
|
||||
"crypto-js": "^4.2.0",
|
||||
"express": "^4.17.2",
|
||||
"express-basic-auth": "^1.2.1",
|
||||
"frappe-charts": "^1.6.2",
|
||||
"js-yaml": "^4.1.0",
|
||||
"keycloak-js": "^20.0.3",
|
||||
"oidc-client-ts": "^3.0.1",
|
||||
"register-service-worker": "^1.7.2",
|
||||
"remedial": "^1.0.8",
|
||||
"rss-parser": "3.13.0",
|
||||
"rsup-progress": "^3.2.0",
|
||||
"simple-icons": "^7.19.0",
|
||||
"simple-icons": "^14.4.0",
|
||||
"v-jsoneditor": "^1.4.5",
|
||||
"v-tooltip": "^2.1.3",
|
||||
"vue": "^2.7.0",
|
||||
|
|
@ -53,15 +54,18 @@
|
|||
"@vue/cli-plugin-babel": "^4.5.15",
|
||||
"@vue/cli-plugin-eslint": "^4.5.15",
|
||||
"@vue/cli-plugin-pwa": "^4.5.15",
|
||||
"@vue/cli-service": "^4.5.15",
|
||||
"@vue/cli-plugin-typescript": "^5.0.8",
|
||||
"@vue/cli-service": "^4.5.19",
|
||||
"@vue/eslint-config-standard": "^4.0.0",
|
||||
"babel-eslint": "^10.0.1",
|
||||
"copy-webpack-plugin": "6.4.0",
|
||||
"eslint": "^6.8.0",
|
||||
"eslint-config-airbnb": "^18.0.1",
|
||||
"eslint-plugin-vue": "^7.9.0",
|
||||
"npm-run-all": "^4.1.5",
|
||||
"sass": "^1.38.0",
|
||||
"sass-loader": "^7.1.0",
|
||||
"typescript": "^5.4.4",
|
||||
"vue-cli-plugin-yaml": "^1.0.2",
|
||||
"vue-svg-loader": "^0.16.0",
|
||||
"vue-template-compiler": "^2.7.0"
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 827 B |
|
|
@ -5,9 +5,11 @@
|
|||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<meta name="referrer" content="no-referrer">
|
||||
<!-- Favicon, App Icon -->
|
||||
<link rel="icon" type="image/png" sizes="64x64" href="<%= BASE_URL %>/web-icons/favicon-64x64.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="web-icons/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="web-icons/favicon-16x16.png">
|
||||
<link rel="icon" type="image/png" href="/favicon.ico" />
|
||||
<link rel="stylesheet" type="text/css" href="/loading-screen.css" />
|
||||
<!-- Default Page Title -->
|
||||
|
|
|
|||
|
|
@ -50,6 +50,14 @@
|
|||
|
||||
<p class="time-note" id="note">This may take a minute or two</p>
|
||||
|
||||
<div class="why-am-i-seeing-this">
|
||||
<h3>Why are you seeing this screen?</h3>
|
||||
<p>
|
||||
The app's built files aren't yet present in the /dist directory,
|
||||
so this page is displayed while we compile the source.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<style lang="css">
|
||||
/* Page Layout Styles */
|
||||
body,
|
||||
|
|
@ -60,7 +68,7 @@
|
|||
}
|
||||
|
||||
body {
|
||||
background: #141b33;
|
||||
background: #0d1220;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
|
|
@ -194,11 +202,30 @@
|
|||
}
|
||||
|
||||
.hide { display: none; }
|
||||
|
||||
.why-am-i-seeing-this {
|
||||
color: #808080a6;
|
||||
font-family: Tahoma, 'Trebuchet MS', sans-serif;
|
||||
max-width: 25rem;
|
||||
border: 2px solid #808080a6;
|
||||
border-radius: 6px;
|
||||
padding: 0.5rem;
|
||||
position: absolute;
|
||||
bottom: 1rem;
|
||||
background: #8080800d;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
.why-am-i-seeing-this h3 {
|
||||
margin: 0 0 0.5rem 0;
|
||||
}
|
||||
.why-am-i-seeing-this p {
|
||||
margin: 0;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
const refreshRate = 8000;
|
||||
// Refresh at interval
|
||||
// Refresh the page every 10 seconds
|
||||
const refreshRate = 10000;
|
||||
setTimeout(() => { location.reload(); }, refreshRate);
|
||||
|
||||
// Get current stage
|
||||
|
|
|
|||
BIN
public/web-icons/favicon-16x16.png
Normal file
|
After Width: | Height: | Size: 794 B |
|
Before Width: | Height: | Size: 2 KiB After Width: | Height: | Size: 2 KiB |
|
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 5.3 KiB |
109
server.js
|
|
@ -6,19 +6,27 @@
|
|||
* */
|
||||
|
||||
/* Import built-in Node server modules */
|
||||
const fs = require('fs');
|
||||
const os = require('os');
|
||||
const dns = require('dns');
|
||||
const http = require('http');
|
||||
const path = require('path');
|
||||
const util = require('util');
|
||||
const dns = require('dns');
|
||||
const os = require('os');
|
||||
const crypto = require('crypto');
|
||||
|
||||
/* Import NPM dependencies */
|
||||
const yaml = require('js-yaml');
|
||||
|
||||
/* Import Express + middleware functions */
|
||||
const express = require('express');
|
||||
const basicAuth = require('express-basic-auth');
|
||||
const history = require('connect-history-api-fallback');
|
||||
|
||||
/* Kick of some basic checks */
|
||||
require('./services/update-checker'); // Checks if there are any updates available, prints message
|
||||
require('./services/config-validator'); // Include and kicks off the config file validation script
|
||||
|
||||
let config = {}; // setup the config
|
||||
config = require('./services/config-validator'); // Include and kicks off the config file validation script
|
||||
|
||||
/* Include route handlers for API endpoints */
|
||||
const statusCheck = require('./services/status-check'); // Used by the status check feature, uses GET
|
||||
|
|
@ -27,6 +35,7 @@ const rebuild = require('./services/rebuild-app'); // A script to programmatical
|
|||
const systemInfo = require('./services/system-info'); // Basic system info, for resource widget
|
||||
const sslServer = require('./services/ssl-server'); // TLS-enabled web server
|
||||
const corsProxy = require('./services/cors-proxy'); // Enables API requests to CORS-blocked services
|
||||
const getUser = require('./services/get-user'); // Enables server side user lookup
|
||||
|
||||
/* Helper functions, and default config */
|
||||
const printMessage = require('./services/print-message'); // Function to print welcome msg on start
|
||||
|
|
@ -35,12 +44,15 @@ const ENDPOINTS = require('./src/utils/defaults').serviceEndpoints; // API endpo
|
|||
/* Checks if app is running within a container, from env var */
|
||||
const isDocker = !!process.env.IS_DOCKER;
|
||||
|
||||
/* Checks env var for port. If undefined, will use Port 80 for Docker, or 4000 for metal */
|
||||
const port = process.env.PORT || (isDocker ? 80 : 4000);
|
||||
/* Checks env var for port. If undefined, will use Port 8080 for Docker, or 4000 for metal */
|
||||
const port = process.env.PORT || (isDocker ? 8080 : 4000);
|
||||
|
||||
/* Checks env var for host. If undefined, will use 0.0.0.0 */
|
||||
const host = process.env.HOST || '0.0.0.0';
|
||||
|
||||
/* Indicates for the webpack config, that running as a server */
|
||||
process.env.IS_SERVER = 'True';
|
||||
|
||||
/* Attempts to get the users local IP, used as part of welcome message */
|
||||
const getLocalIp = () => {
|
||||
const dnsLookup = util.promisify(dns.lookup);
|
||||
|
|
@ -55,7 +67,7 @@ const printWelcomeMessage = () => {
|
|||
console.log(printMessage(ip, port, isDocker)); // eslint-disable-line no-console
|
||||
});
|
||||
} catch (e) {
|
||||
// Fetching info for welcome message failed, print simple msg instead
|
||||
// No clue what could of gone wrong here, but print fallback message if above failed
|
||||
console.log(`Dashy server has started (${port})`); // eslint-disable-line no-console
|
||||
}
|
||||
};
|
||||
|
|
@ -65,32 +77,88 @@ const printWarning = (msg, error) => {
|
|||
console.warn(`\x1b[103m\x1b[34m${msg}\x1b[0m\n`, error || ''); // eslint-disable-line no-console
|
||||
};
|
||||
|
||||
/* Load appConfig.auth.users from config (if present) for authorization purposes */
|
||||
function loadUserConfig() {
|
||||
try {
|
||||
const filePath = path.join(__dirname, process.env.USER_DATA_DIR || 'user-data', 'conf.yml');
|
||||
const fileContents = fs.readFileSync(filePath, 'utf8');
|
||||
const data = yaml.load(fileContents);
|
||||
return data?.appConfig?.auth?.users || null;
|
||||
} catch (e) {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
/* If HTTP auth is enabled, and no username/password are pre-set, then check passed credentials */
|
||||
function customAuthorizer(username, password) {
|
||||
const sha256 = (input) => crypto.createHash('sha256').update(input).digest('hex').toUpperCase();
|
||||
const generateUserToken = (user) => {
|
||||
if (!user.user || (!user.hash && !user.password)) return '';
|
||||
const strAndUpper = (input) => input.toString().toUpperCase();
|
||||
const passwordHash = user.hash || sha256(process.env[user.password]);
|
||||
const sha = sha256(strAndUpper(user.user) + strAndUpper(passwordHash));
|
||||
return strAndUpper(sha);
|
||||
};
|
||||
if (password.startsWith('Bearer ')) {
|
||||
const token = password.slice('Bearer '.length);
|
||||
const users = loadUserConfig();
|
||||
return users.some(user => generateUserToken(user) === token);
|
||||
} else {
|
||||
const users = loadUserConfig();
|
||||
const userHash = sha256(password);
|
||||
return users.some(user => (
|
||||
user.user.toLowerCase() === username.toLowerCase() && user.hash.toUpperCase() === userHash
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
/* If a username and password are set, setup auth for config access, otherwise skip */
|
||||
function getBasicAuthMiddleware() {
|
||||
const configUsers = process.env.ENABLE_HTTP_AUTH ? loadUserConfig() : null;
|
||||
const { BASIC_AUTH_USERNAME, BASIC_AUTH_PASSWORD } = process.env;
|
||||
if (BASIC_AUTH_USERNAME && BASIC_AUTH_PASSWORD) {
|
||||
return basicAuth({
|
||||
users: { [BASIC_AUTH_USERNAME]: BASIC_AUTH_PASSWORD },
|
||||
challenge: true,
|
||||
unauthorizedResponse: () => 'Unauthorized - Incorrect username or password',
|
||||
});
|
||||
} else if ((configUsers && configUsers.length > 0)) {
|
||||
return basicAuth({
|
||||
authorizer: customAuthorizer,
|
||||
challenge: true,
|
||||
unauthorizedResponse: () => 'Unauthorized - Incorrect token',
|
||||
});
|
||||
} else {
|
||||
return (req, res, next) => next();
|
||||
}
|
||||
}
|
||||
|
||||
const protectConfig = getBasicAuthMiddleware();
|
||||
|
||||
/* A middleware function for Connect, that filters requests based on method type */
|
||||
const method = (m, mw) => (req, res, next) => (req.method === m ? mw(req, res, next) : next());
|
||||
|
||||
const app = express()
|
||||
// Load SSL redirection middleware
|
||||
.use(sslServer.middleware)
|
||||
// Serves up static files
|
||||
.use(express.static(path.join(__dirname, 'dist')))
|
||||
.use(express.static(path.join(__dirname, 'public'), { index: 'initialization.html' }))
|
||||
// Load middlewares for parsing JSON, and supporting HTML5 history routing
|
||||
.use(express.json({ limit: '1mb' }))
|
||||
.use(history())
|
||||
// GET endpoint to run status of a given URL with GET request
|
||||
.use(ENDPOINTS.statusCheck, (req, res) => {
|
||||
try {
|
||||
statusCheck(req.url, async (results) => {
|
||||
res.setHeader('Content-Type', 'application/json');
|
||||
await res.end(results);
|
||||
});
|
||||
} catch (e) {
|
||||
printWarning(`Error running status check for ${req.url}\n`, e);
|
||||
}
|
||||
})
|
||||
// POST Endpoint used to save config, by writing conf.yml to disk
|
||||
// POST Endpoint used to save config, by writing config file to disk
|
||||
.use(ENDPOINTS.save, method('POST', (req, res) => {
|
||||
try {
|
||||
saveConfig(req.body, (results) => { res.end(results); });
|
||||
config = req.body.config; // update the config
|
||||
} catch (e) {
|
||||
printWarning('Error writing config file to disk', e);
|
||||
res.end(JSON.stringify({ success: false, message: e }));
|
||||
|
|
@ -122,6 +190,25 @@ const app = express()
|
|||
res.end(JSON.stringify({ success: false, message: e }));
|
||||
}
|
||||
})
|
||||
// GET endpoint to return user info
|
||||
.use(ENDPOINTS.getUser, (req, res) => {
|
||||
try {
|
||||
const user = getUser(config, req);
|
||||
res.end(JSON.stringify(user));
|
||||
} catch (e) {
|
||||
res.end(JSON.stringify({ success: false, message: e }));
|
||||
}
|
||||
})
|
||||
// Middleware to serve any .yml files in USER_DATA_DIR with optional protection
|
||||
.get('/*.yml', protectConfig, (req, res) => {
|
||||
const ymlFile = req.path.split('/').pop();
|
||||
res.sendFile(path.join(__dirname, process.env.USER_DATA_DIR || 'user-data', ymlFile));
|
||||
})
|
||||
// Serves up static files
|
||||
.use(express.static(path.join(__dirname, process.env.USER_DATA_DIR || 'user-data')))
|
||||
.use(express.static(path.join(__dirname, 'dist')))
|
||||
.use(express.static(path.join(__dirname, 'public'), { index: 'initialization.html' }))
|
||||
.use(history())
|
||||
// If no other route is matched, serve up the index.html with a 404 status
|
||||
.use((req, res) => {
|
||||
res.status(404).sendFile(path.join(__dirname, 'dist', 'index.html'));
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ const schema = require('../src/utils/ConfigSchema.json');
|
|||
|
||||
/* Tell AJV to use strict mode, and report all errors */
|
||||
const validatorOptions = {
|
||||
strict: true,
|
||||
strict: false,
|
||||
allowUnionTypes: true,
|
||||
allErrors: true,
|
||||
};
|
||||
|
|
@ -98,11 +98,14 @@ const printFileReadError = (e) => {
|
|||
}
|
||||
};
|
||||
|
||||
let config = {};
|
||||
|
||||
try { // Try to open and parse the YAML file
|
||||
const config = yaml.load(fs.readFileSync('./public/conf.yml', 'utf8'));
|
||||
config = yaml.load(fs.readFileSync(`./${process.env.USER_DATA_DIR || 'user-data'}/conf.yml`, 'utf8'));
|
||||
validate(config);
|
||||
} catch (e) { // Something went very wrong...
|
||||
setIsValidVariable(false);
|
||||
logToConsole(bigError());
|
||||
printFileReadError(e);
|
||||
}
|
||||
module.exports = config;
|
||||
|
|
|
|||
15
services/get-user.js
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
module.exports = (config, req) => {
|
||||
try {
|
||||
if (config.appConfig.auth.enableHeaderAuth) {
|
||||
const { userHeader } = config.appConfig.auth.headerAuth;
|
||||
const { proxyWhitelist } = config.appConfig.auth.headerAuth;
|
||||
if (proxyWhitelist.includes(req.socket.remoteAddress)) {
|
||||
return { success: true, user: req.headers[userHeader.toLowerCase()] };
|
||||
}
|
||||
}
|
||||
return {};
|
||||
} catch (e) {
|
||||
console.warn('Error get-user: ', e);
|
||||
return { success: false };
|
||||
}
|
||||
};
|
||||
|
|
@ -6,11 +6,17 @@
|
|||
|
||||
const isSsl = !!process.env.SSL_PRIV_KEY_PATH && !!process.env.SSL_PUB_KEY_PATH;
|
||||
|
||||
// eslint-disable-next-line import/no-dynamic-require
|
||||
const http = require(isSsl ? 'https' : 'http');
|
||||
|
||||
/* Location of the server to test */
|
||||
const isDocker = !!process.env.IS_DOCKER;
|
||||
const port = isSsl ? (process.env.SSL_PORT || (isDocker ? 443 : 4001)) : (process.env.PORT || (isDocker ? 80 : 4000));
|
||||
|
||||
/* Get the port to use (depending on, if docker, if SSL) */
|
||||
const sslPort = process.env.SSL_PORT || (isDocker ? 443 : 4001);
|
||||
const normalPort = process.env.PORT || (isDocker ? 8080 : 4000);
|
||||
const port = isSsl ? sslPort : normalPort;
|
||||
|
||||
const host = process.env.HOST || '0.0.0.0';
|
||||
const timeout = 2000;
|
||||
|
||||
|
|
@ -18,7 +24,9 @@ const agent = new http.Agent({
|
|||
rejectUnauthorized: false, // Allow self-signed certificates
|
||||
});
|
||||
|
||||
const requestOptions = { host, port, timeout, agent };
|
||||
const requestOptions = {
|
||||
host, port, timeout, agent,
|
||||
};
|
||||
|
||||
const startTime = new Date(); // Initialize timestamp to calculate time taken
|
||||
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ module.exports = (ip, port, isDocker) => {
|
|||
} else {
|
||||
// Prepare message for users running app on bare metal
|
||||
msg = `${chars.GREEN}┏${line(75)}┓${chars.BR}`
|
||||
+ `┃ ${chars.CYAN}Welcome to Dashy! 🚀${blanks(55)}${chars.GREEN}┃${chars.BR}`
|
||||
+ `┃ ${chars.CYAN}Welcome to Dashy! 🚀${blanks(54)}${chars.GREEN}┃${chars.BR}`
|
||||
+ `┃ ${chars.CYAN}Your new dashboard is now up and running at ${chars.BRIGHT}`
|
||||
+ `http://${ip}:${port}${chars.RESET}${blanks(18 - ip.length)}${chars.GREEN}┃${chars.BR}`
|
||||
+ `┗${line(75)}┛${chars.BR}${chars.BR}${chars.RESET}`;
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
const { exec } = require('child_process');
|
||||
|
||||
module.exports = () => new Promise((resolve, reject) => {
|
||||
const buildProcess = exec('npm run build'); // Trigger the build command
|
||||
const buildProcess = exec('NODE_OPTIONS="--max-old-space-size=512" npm run build'); // Trigger the build command
|
||||
|
||||
let output = ''; // Will store console output
|
||||
|
||||
|
|
|
|||
|
|
@ -14,19 +14,24 @@ module.exports = async (newConfig, render) => {
|
|||
return configObj.filename.replaceAll('/', '').replaceAll('..', '');
|
||||
};
|
||||
|
||||
// Path to config file (with navigational characters stripped)
|
||||
const usersFileName = makeSafeFileName(newConfig);
|
||||
|
||||
// Path to user data directory
|
||||
const userDataDirectory = process.env.USER_DATA_DIR || './user-data/';
|
||||
|
||||
// Define constants for the config file
|
||||
const settings = {
|
||||
defaultLocation: './public/',
|
||||
defaultLocation: userDataDirectory,
|
||||
backupLocation: process.env.BACKUP_DIR || path.join(userDataDirectory, 'config-backups'),
|
||||
defaultFile: 'conf.yml',
|
||||
filename: 'conf',
|
||||
backupDenominator: '.backup.yml',
|
||||
};
|
||||
|
||||
// Make the full file name and path to save the backup config file
|
||||
const backupFilePath = path.normalize(process.env.BACKUP_DIR || settings.defaultLocation)
|
||||
+ `/${usersFileName || settings.filename}-`
|
||||
const backupFilePath = `${path.normalize(settings.backupLocation)
|
||||
}/${usersFileName || settings.filename}-`
|
||||
+ `${Math.round(new Date() / 1000)}${settings.backupDenominator}`;
|
||||
|
||||
// The path where the main conf.yml should be read and saved to
|
||||
|
|
@ -45,15 +50,20 @@ module.exports = async (newConfig, render) => {
|
|||
message: !success ? errorMsg : getSuccessMessage(),
|
||||
});
|
||||
|
||||
// Makes a backup of the existing config file
|
||||
// Create a backup of current config, and if backup dir doesn't yet exist, create it
|
||||
await fsPromises
|
||||
.copyFile(defaultFilePath, backupFilePath)
|
||||
.catch((error) => render(getRenderMessage(false, `Unable to backup conf.yml: ${error}`)));
|
||||
.mkdir(settings.backupLocation, { recursive: true })
|
||||
.then(() => fsPromises.copyFile(defaultFilePath, backupFilePath))
|
||||
.catch((error) => render(
|
||||
getRenderMessage(false, `Unable to backup ${settings.defaultFile}: ${error}`),
|
||||
));
|
||||
|
||||
// Writes the new content to the conf.yml file
|
||||
await fsPromises
|
||||
.writeFile(defaultFilePath, newConfig.config.toString(), writeFileOptions)
|
||||
.catch((error) => render(getRenderMessage(false, `Unable to write to conf.yml: ${error}`)));
|
||||
.catch((error) => render(
|
||||
getRenderMessage(false, `Unable to write to ${settings.defaultFile}: ${error}`),
|
||||
));
|
||||
|
||||
// If successful, then render hasn't yet been called- call it
|
||||
await render(getRenderMessage(true));
|
||||
|
|
|
|||
18
src/App.vue
|
|
@ -4,6 +4,7 @@
|
|||
<LoadingScreen :isLoading="isLoading" v-if="shouldShowSplash" />
|
||||
<Header :pageInfo="pageInfo" />
|
||||
<router-view v-if="!isFetching" />
|
||||
<CriticalError v-if="hasCriticalError" />
|
||||
<Footer :text="footerText" v-if="visibleComponents.footer && !isFetching" />
|
||||
</div>
|
||||
</template>
|
||||
|
|
@ -12,6 +13,7 @@
|
|||
import Header from '@/components/PageStrcture/Header.vue';
|
||||
import Footer from '@/components/PageStrcture/Footer.vue';
|
||||
import EditModeTopBanner from '@/components/InteractiveEditor/EditModeTopBanner.vue';
|
||||
import CriticalError from '@/components/PageStrcture/CriticalError.vue';
|
||||
import LoadingScreen from '@/components/PageStrcture/LoadingScreen.vue';
|
||||
import { welcomeMsg } from '@/utils/CoolConsole';
|
||||
import ErrorHandler from '@/utils/ErrorHandler';
|
||||
|
|
@ -29,6 +31,7 @@ export default {
|
|||
Footer,
|
||||
LoadingScreen,
|
||||
EditModeTopBanner,
|
||||
CriticalError,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
|
|
@ -64,7 +67,7 @@ export default {
|
|||
return this.$store.getters.pageInfo;
|
||||
},
|
||||
sections() {
|
||||
return this.$store.getters.pageInfo;
|
||||
return this.$store.getters.sections;
|
||||
},
|
||||
visibleComponents() {
|
||||
return this.$store.getters.visibleComponents;
|
||||
|
|
@ -72,6 +75,9 @@ export default {
|
|||
isEditMode() {
|
||||
return this.$store.state.editMode;
|
||||
},
|
||||
hasCriticalError() {
|
||||
return this.$store.state.criticalError;
|
||||
},
|
||||
subPageClassName() {
|
||||
const currentSubPage = this.$store.state.currentConfigInfo;
|
||||
return (currentSubPage && currentSubPage.pageId) ? currentSubPage.pageId : '';
|
||||
|
|
@ -149,11 +155,21 @@ export default {
|
|||
e.preventDefault();
|
||||
return 'You may have unsaved edits. Are you sure you want to exit the page?';
|
||||
},
|
||||
/* Detect and apply theme based on OS preference */
|
||||
applyThemeBasedOnOSPreference() {
|
||||
const prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
|
||||
const osTheme = prefersDark ? this.appConfig.nightTheme : this.appConfig.dayTheme;
|
||||
if (osTheme) {
|
||||
this.$store.commit(Keys.SET_THEME, osTheme);
|
||||
this.updateTheme(osTheme);
|
||||
}
|
||||
},
|
||||
},
|
||||
/* Basic initialization tasks on app load */
|
||||
async mounted() {
|
||||
await this.$store.dispatch(Keys.INITIALIZE_CONFIG); // Initialize config before moving on
|
||||
this.applyLanguage(); // Apply users local language
|
||||
this.applyThemeBasedOnOSPreference(); // Apply theme based on OS preference
|
||||
this.hideSplash(); // Hide the splash screen, if visible
|
||||
if (this.appConfig.customCss) { // Inject users custom CSS, if present
|
||||
const cleanedCss = this.appConfig.customCss.replace(/<\/?[^>]+(>|$)/g, '');
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
"home": {
|
||||
"no-results": "Ingen søgeresultater",
|
||||
"no-data": "Ingen data konfigureret",
|
||||
"no-items-section": "Ingen genstander at vise endnu"
|
||||
"no-items-section": "Ingen genstande at vise endnu"
|
||||
},
|
||||
"search": {
|
||||
"search-label": "Søg",
|
||||
|
|
@ -20,7 +20,7 @@
|
|||
"remember-me-hour": "4 timer",
|
||||
"remember-me-day": "1 dag",
|
||||
"remember-me-week": "1 uge",
|
||||
"remember-me-long-time": "en lang tid",
|
||||
"remember-me-long-time": "lang tid",
|
||||
"error-missing-username": "Mangler brugernavn",
|
||||
"error-missing-password": "Manglende adgangskode",
|
||||
"error-incorrect-username": "Bruger ikke fundet",
|
||||
|
|
@ -54,7 +54,7 @@
|
|||
"reset-config-msg-l3": "Er du sikker på at du vil fortsætte?",
|
||||
"data-cleared-msg": "Data blev succesfuldt ryddet",
|
||||
"actions-label": "Handlinger",
|
||||
"copy-config-label": "Kopiera Config",
|
||||
"copy-config-label": "Kopiere Config",
|
||||
"data-copied-msg": "Konfigurationen er blevet kopieret til clipboard",
|
||||
"reset-config-label": "Nulstil konfiguration",
|
||||
"css-save-btn": "Gem ændringer",
|
||||
|
|
@ -95,7 +95,7 @@
|
|||
"language-switcher": {
|
||||
"title": "Skift applikationssprog",
|
||||
"dropdown-label": "Valg en sprog",
|
||||
"save-button": "Gemme",
|
||||
"save-button": "Gem",
|
||||
"success-msg": "Sprog opdateret til"
|
||||
},
|
||||
"theme-maker": {
|
||||
|
|
@ -104,17 +104,17 @@
|
|||
"reset-button": "Nulstil styles for",
|
||||
"show-all-button": "Vis alle variabler",
|
||||
"change-fonts-button": "Skift skrifttyper",
|
||||
"save-button": "Gemme",
|
||||
"cancel-button": "Ophæve",
|
||||
"saved-toast": "{theme} opdateret med succes",
|
||||
"save-button": "Gem",
|
||||
"cancel-button": "Annuller",
|
||||
"saved-toast": "{theme} opdateret succesfuldt",
|
||||
"copied-toast": "Temadata for {theme} kopieret til udklipsholder",
|
||||
"reset-toast": "Tilpassede farver for {theme} fjernet"
|
||||
},
|
||||
"config-editor": {
|
||||
"save-location-label": "Gemme beliggenhed",
|
||||
"location-local-label": "Anbringe lokalt",
|
||||
"save-location-label": "Lokation for gem",
|
||||
"location-local-label": "Gem lokalt",
|
||||
"location-disk-label": "Skriv ændringer til konfigurationsfil",
|
||||
"save-button": "Gemme ændringer",
|
||||
"save-button": "Gem ændringer",
|
||||
"preview-button": "Forhåndsvisning af ændringer",
|
||||
"valid-label": "Konfigurationen er gyldig",
|
||||
"status-success-msg": "Opgave fuldført",
|
||||
|
|
@ -155,7 +155,7 @@
|
|||
"password-label-update": "Skriv dit kodeord",
|
||||
"backup-button-setup": "Sikkerhedskopiering",
|
||||
"backup-button-update": "Opdater sikkerhedskopiering",
|
||||
"backup-id-label": "Din sikkerhedskopi-ID",
|
||||
"backup-id-label": "Dit sikkerhedskopi-ID",
|
||||
"backup-id-note": "Dette bruges til at gendanne fra sikkerhedskopier senere. Så gem det sammen med din adgangskode et sikkert sted.",
|
||||
"restore-title": "Gendan en sikkerhedskopi",
|
||||
"restore-id-label": "Gendan-ID",
|
||||
|
|
@ -165,7 +165,7 @@
|
|||
"backup-error-unknown": "Kan ikke behandle anmodningen",
|
||||
"backup-error-password": "Forkert kodeord. Indtast venligst din nuværende adgangskode.",
|
||||
"backup-success-msg": "Afsluttet med succes",
|
||||
"restore-success-msg": "Konfiguration gendan med succes"
|
||||
"restore-success-msg": "Konfiguration gendannet med succes"
|
||||
},
|
||||
"menu": {
|
||||
"open-section-title": "Åbn i",
|
||||
|
|
@ -174,9 +174,9 @@
|
|||
"modal": "Pop-Up Modal",
|
||||
"workspace": "Arbejdsrumsvisning",
|
||||
"options-section-title": "Muligheder",
|
||||
"edit-item": "Redigere",
|
||||
"edit-item": "Rediger",
|
||||
"move-item": "Kopier eller flyt",
|
||||
"remove-item": "Fjerne"
|
||||
"remove-item": "Fjern"
|
||||
},
|
||||
"context-menus": {
|
||||
"item": {
|
||||
|
|
@ -187,14 +187,14 @@
|
|||
"workspace": "Arbejdsrumsvisning",
|
||||
"clipboard": "Kopier til udklipsholder",
|
||||
"options-section-title": "Muligheder",
|
||||
"edit-item": "Redigere",
|
||||
"edit-item": "Rediger",
|
||||
"move-item": "Kopier eller flyt",
|
||||
"remove-item": "Fjerne",
|
||||
"copied-toast": "URL er blevet kopieret til udklipsholder"
|
||||
},
|
||||
"section": {
|
||||
"open-section": "Åbn sektion",
|
||||
"edit-section": "Redigere",
|
||||
"edit-section": "Rediger",
|
||||
"expand-collapse": "Udvid / Skjul",
|
||||
"move-section": "Flytte til",
|
||||
"remove-section": "Fjerne"
|
||||
|
|
@ -206,35 +206,35 @@
|
|||
"edit-site-data-subheading": "Rediger webstedsdata",
|
||||
"edit-page-info-btn": "Rediger sideoplysninger",
|
||||
"edit-page-info-tooltip": "Apptitel, beskrivelse, navigationslinks, sidefodstekst osv.",
|
||||
"edit-app-config-btn": "Redigere appkonfiguration",
|
||||
"edit-app-config-btn": "Rediger appkonfiguration",
|
||||
"edit-app-config-tooltip": "Alle andre appkonfigurationsmuligheder",
|
||||
"edit-pages-btn": "Redigere sider",
|
||||
"edit-pages-btn": "Rediger sider",
|
||||
"edit-pages-tooltip": "Tilføj eller fjern yderligere visninger",
|
||||
"config-save-methods-subheading": "Indstillinger for lagring af konfiguration",
|
||||
"save-locally-btn": "Gemme lokalt",
|
||||
"save-locally-btn": "Gem lokalt",
|
||||
"save-locally-tooltip": "Gem konfigurationen lokalt i browserlageret. Dette vil ikke påvirke din konfigurationsfil, men ændringer vil kun blive gemt på denne enhed",
|
||||
"save-disk-btn": "Gemme til disk",
|
||||
"save-disk-btn": "Gem til disk",
|
||||
"save-disk-tooltip": "Gem konfigurationen i filen conf.yml på disken. Dette vil sikkerhedskopiere og derefter overskrive din eksisterende konfiguration",
|
||||
"export-config-btn": "Exportere konfiguration",
|
||||
"export-config-btn": "Exporter konfiguration",
|
||||
"export-config-tooltip": "Se og eksporter ny konfiguration, enten til en fil eller til udklipsholder",
|
||||
"cloud-backup-btn": "Sikkerhedskopier til cloud",
|
||||
"cloud-backup-tooltip": "Gem krypteret backup af konfiguration til cloud",
|
||||
"edit-raw-config-btn": "Rediger rå konfiguration",
|
||||
"edit-raw-config-tooltip": "Se og rediger rå config via JSON-editor",
|
||||
"cancel-changes-btn": "Avbryd redigering",
|
||||
"cancel-changes-btn": "Afbryd redigering",
|
||||
"cancel-changes-tooltip": "Nulstil aktuelle ændringer, og afslut redigeringstilstand. Dette vil ikke påvirke din gemte konfiguration",
|
||||
"edit-mode-name": "Redigeringstilstand",
|
||||
"edit-mode-subtitle": "Du er i redigeringstilstand",
|
||||
"edit-mode-description": "Det betyder, at du kan foretage ændringer i din konfiguration og se resultaterne, men indtil du gemmer, vil ingen af dine ændringer blive bevaret.",
|
||||
"save-stage-btn": "Gemme",
|
||||
"cancel-stage-btn": "Avbryd",
|
||||
"save-stage-btn": "Gem",
|
||||
"cancel-stage-btn": "Afbryd",
|
||||
"save-locally-warning": "Hvis du fortsætter, vil ændringer kun blive gemt i din browser. Du bør eksportere en kopi af din konfiguration til brug på andre maskiner. Vil du fortsætte?"
|
||||
},
|
||||
"edit-item": {
|
||||
"missing-title-err": "En varetitel er påkrævet"
|
||||
},
|
||||
"edit-section": {
|
||||
"edit-section-title": "Redigere sektion",
|
||||
"edit-section-title": "Rediger sektion",
|
||||
"add-section-title": "Tilføj ny sektion",
|
||||
"edit-tooltip": "Klik for at redigere, eller højreklik for at få flere muligheder",
|
||||
"remove-confirm": "Er du sikker på, at du vil fjerne denne sektion? Denne handling kan fortrydes senere."
|
||||
|
|
@ -273,11 +273,11 @@
|
|||
"cpu-chart-title": "CPU-historie",
|
||||
"mem-chart-title": "Hukommelsesbrug",
|
||||
"mem-breakdown-title": "Hukommelsesnedbrydning",
|
||||
"load-chart-title": "Systeminlæsning"
|
||||
"load-chart-title": "Systemindlæsning"
|
||||
},
|
||||
"glances": {
|
||||
"disk-space-free": "Ledig",
|
||||
"disk-space-used": "I bruk",
|
||||
"disk-space-used": "I brug",
|
||||
"disk-mount-point": "Mount Point",
|
||||
"disk-file-system": "Filsystem",
|
||||
"disk-io-read": "Læs",
|
||||
|
|
@ -329,7 +329,7 @@
|
|||
"disk-space": "Diskudrymme",
|
||||
"dnd": "Forstyr ikke",
|
||||
"email": "email",
|
||||
"enabled": "aktivert",
|
||||
"enabled": "aktiveret",
|
||||
"federated-shares-ucfirst": "Fødereret deler",
|
||||
"federated-shares": "fødereret deler",
|
||||
"files": "fil{plural}",
|
||||
|
|
@ -363,7 +363,7 @@
|
|||
"other": "andet",
|
||||
"overall": "Samlet set",
|
||||
"private-link": "privat link",
|
||||
"public-link": "publik link",
|
||||
"public-link": "offentlig link",
|
||||
"quota-enabled": "Diskkvote er {not} aktiveret for denne bruger",
|
||||
"received": "modtaget",
|
||||
"scripts": "scripts",
|
||||
|
|
@ -371,7 +371,7 @@
|
|||
"started": "Startede",
|
||||
"storages-by-type": "Opbevaring efter type",
|
||||
"storages": "Opbevaring{plural}",
|
||||
"strings-use": "strings brug",
|
||||
"strings-use": "tråde brug",
|
||||
"tasks": "Opgaver",
|
||||
"total-files": "samlede filer",
|
||||
"total-users": "samlede bruger",
|
||||
|
|
@ -379,7 +379,7 @@
|
|||
"until": "Så længe",
|
||||
"updates-available-for": "Opdateringer er tilgængelige for",
|
||||
"updates-available": "opdatering{plural} tilgængelig",
|
||||
"used": "brugd",
|
||||
"used": "brugt",
|
||||
"user": "bruger",
|
||||
"using": "ved brug af",
|
||||
"version": "version",
|
||||
|
|
|
|||
|
|
@ -171,9 +171,9 @@
|
|||
"status-fail-msg": "Task Failed",
|
||||
"success-msg-disk": "Config file written to disk successfully",
|
||||
"success-msg-local": "Local changes saved successfully",
|
||||
"success-note-l1": "The app should rebuild automatically.",
|
||||
"success-note-l2": "This may take up to a minute.",
|
||||
"success-note-l3": "You will need to refresh the page for changes to take effect.",
|
||||
"success-note-l1": "You will need to refresh the page for changes to take effect.",
|
||||
"success-note-l2": "",
|
||||
"success-note-l3": "",
|
||||
"error-msg-save-mode": "Please select a Save Mode: Local or File",
|
||||
"error-msg-cannot-save": "An error occurred saving config",
|
||||
"error-msg-bad-json": "Error in JSON, possibly malformed",
|
||||
|
|
@ -182,9 +182,9 @@
|
|||
},
|
||||
"app-rebuild": {
|
||||
"title": "Rebuild Application",
|
||||
"rebuild-note-l1": "A rebuild is required for changes written to the conf.yml file to take effect.",
|
||||
"rebuild-note-l2": "This should happen automatically, but if it hasn't, you can manually trigger it here.",
|
||||
"rebuild-note-l3": "This is not required for modifications stored locally.",
|
||||
"rebuild-note-l1": "A rebuild is no longer required for changes to take effect.",
|
||||
"rebuild-note-l2": "Some changes (entry-point, and auth settings) are read at build-time. So to apply these, you should trigger a rebuild here.",
|
||||
"rebuild-note-l3": "Note that this is only available on Node and Docker installations, not via statically deployed instances.",
|
||||
"rebuild-button": "Start Build",
|
||||
"rebuilding-status-1": "Building...",
|
||||
"rebuilding-status-2": "This may take a few minutes",
|
||||
|
|
@ -312,6 +312,14 @@
|
|||
"view-title": "View Config"
|
||||
}
|
||||
},
|
||||
"critical-error": {
|
||||
"title": "Configuration Load Error",
|
||||
"subtitle": "Dashy has failed to load correctly due to a configuration error.",
|
||||
"sub-ensure-that": "Ensure that",
|
||||
"sub-error-details": "Error Details",
|
||||
"sub-next-steps": "Next Steps",
|
||||
"ignore-button": "Ignore Critical Errors"
|
||||
},
|
||||
"widgets": {
|
||||
"general": {
|
||||
"loading": "Loading...",
|
||||
|
|
|
|||
385
src/assets/locales/hu.json
Normal file
|
|
@ -0,0 +1,385 @@
|
|||
{
|
||||
"home": {
|
||||
"no-results": "Nincs találat a keresésre",
|
||||
"no-data": "Nincs beállítva adat",
|
||||
"no-items-section": "Még nincs mit megjeleníteni"
|
||||
},
|
||||
"search": {
|
||||
"search-label": "Keresés",
|
||||
"search-placeholder": "Kezdj el gépelni a szűréshez",
|
||||
"clear-search-tooltip": "Keresés törlése",
|
||||
"enter-to-search-web": "Nyomj entert a webes kereséshez"
|
||||
},
|
||||
"splash-screen": {
|
||||
"loading": "Betöltés"
|
||||
},
|
||||
"login": {
|
||||
"title": "Dashy",
|
||||
"guest-label": "Vendég hozzáférés",
|
||||
"username-label": "Felhasználónév",
|
||||
"password-label": "Jelszó",
|
||||
"login-button": "Bejelentkezés",
|
||||
"remember-me-label": "Emlékezz rám",
|
||||
"remember-me-never": "Soha",
|
||||
"remember-me-hour": "4 óráig",
|
||||
"remember-me-day": "1 napig",
|
||||
"remember-me-week": "1 hétig",
|
||||
"remember-me-long-time": "Hosszabb ideig",
|
||||
"error-missing-username": "Hiányzó felhasználónév",
|
||||
"error-missing-password": "Hiányzó jelszó",
|
||||
"error-incorrect-username": "A felhasználó nem található",
|
||||
"error-incorrect-password": "Hibás jelszó",
|
||||
"success-message": "Bejelentkezés folyamatban...",
|
||||
"logout-message": "Kijelentkezve",
|
||||
"already-logged-in-title": "Már be vagy jelentkezve",
|
||||
"already-logged-in-text": "Be vagy jelentkezve mint",
|
||||
"proceed-to-dashboard": "Tovább az irányítópultra",
|
||||
"log-out-button": "Kijelentkezés",
|
||||
"proceed-guest-button": "Belépés vendégként",
|
||||
"guest-intro-1": "Ez a rendszer engedélyezi a vendég hozzáférést.",
|
||||
"guest-intro-2": "A vendég felhasználók csak megtekinthetik az irányítópultokat, módosításokat nem tudnak menteni.",
|
||||
"error": "Hiba",
|
||||
"error-no-user-configured": "A hitelesítés nincs engedélyezve, vagy nincs beállított felhasználó",
|
||||
"error-go-home-button": "Vissza a főoldalra",
|
||||
"logged-in-guest": "Vendégként bejelentkezve, átirányítás...",
|
||||
"error-guest-access": "A vendég hozzáférés nem engedélyezett"
|
||||
},
|
||||
"app-info": {
|
||||
"title": "App Info",
|
||||
"error-log": "Hibanapló",
|
||||
"no-errors": "Nem található friss hiba",
|
||||
"help-support": "Súgó és támogatás",
|
||||
"help-support-description" : "Ha segítségre van szükséged a Dashy futtatásához vagy beállításához, nézd meg a",
|
||||
"help-support-discussions": "fórumot",
|
||||
"support-dashy": "Dashy támogatása",
|
||||
"support-dashy-description": "Ha szeretnél részt venni a projektben, nézd meg a",
|
||||
"support-dashy-link": "közreműködők oldalát",
|
||||
"report-bug": "Hiba bejelentése",
|
||||
"report-bug-description": "Ha úgy gondolod, hogy hibát találtál, kérlek",
|
||||
"report-bug-link": "jelentsd be itt",
|
||||
"more-info": "További információ",
|
||||
"source": "Forráskód",
|
||||
"documentation": "Dokumentáció",
|
||||
"privacy-and-security": "Adatvédelem és biztonság",
|
||||
"privacy-and-security-l1": "Ha szeretnéd megtudni, hogyan kezeli a Dashy az adataidat, nézd meg az",
|
||||
"privacy-and-security-privacy-policy": "adatvédelmi irányelveinket",
|
||||
"privacy-and-security-advice": "Ha tanácsot keresel az irányítópultod biztonságossá tételéhez, olvasd el a",
|
||||
"privacy-and-security-advice-link": "kezelési útmutatót",
|
||||
"privacy-and-security-security-issue": "Ha biztonsági hibát találtál, jelezd azt a",
|
||||
"privacy-and-security-security-policy": "biztonsági szabályzatunk alapján",
|
||||
"license": "Licenc",
|
||||
"license-under": "Licenc típusa:",
|
||||
"licence-third-party": "A harmadik féltől származó modulok licenceiért látogasd meg a",
|
||||
"licence-third-party-link": "jogi oldalunkat",
|
||||
"list-contributors": "A teljes közreműködői lista és köszönetnyilvánítás itt található:",
|
||||
"list-contributors-link": "Készítők",
|
||||
"version": "Verzió"
|
||||
},
|
||||
"config": {
|
||||
"main-tab": "Főmenü",
|
||||
"view-config-tab": "Beállítások megtekintése",
|
||||
"edit-config-tab": "Beállítások szerkesztése",
|
||||
"custom-css-tab": "Egyéni stílusok",
|
||||
"heading": "Beállítási lehetőségek",
|
||||
"download-config-button": "Megtekintés / Exportálás",
|
||||
"edit-config-button": "Beállítások szerkesztése",
|
||||
"edit-css-button": "Egyéni CSS szerkesztése",
|
||||
"cloud-sync-button": "Szinkronizálás bekapcsolása",
|
||||
"edit-cloud-sync-button": "Szinkronizálási beállítások szerkesztése",
|
||||
"rebuild-app-button": "Alkalmazás újraépítése",
|
||||
"change-language-button": "Nyelv módosítása",
|
||||
"reset-settings-button": "Helyi beállítások visszaállítása",
|
||||
"disabled-note": "Néhány beállítási lehetőséget a rendszergazda letiltott",
|
||||
"small-screen-note": "Kis képernyőt használsz, ezért néhány menüelem nem tud jól megjelenni",
|
||||
"app-info-button": "App infó",
|
||||
"backup-note": "Módosítás előtt érdemes biztonsági mentést készíteni a beállításokról.",
|
||||
"reset-config-msg-l1": "Ez törli az összes helyi beállítást, de nem módosítja a 'conf.yml' fájlt.",
|
||||
"reset-config-msg-l2": "Mentsd el a helyi változtatásokat, ha később is használni akarod őket",
|
||||
"reset-config-msg-l3": "Biztosan folytatod?",
|
||||
"data-cleared-msg": "Az adatok sikeresen törölve",
|
||||
"actions-label": "Műveletek",
|
||||
"copy-config-label": "Beállítások másolása",
|
||||
"data-copied-msg": "A konfiguráció a vágólapra másolva",
|
||||
"reset-config-label": "Beállítások visszaállítása",
|
||||
"css-save-btn": "Változtatások mentése",
|
||||
"css-note-label": "Megjegyzés",
|
||||
"css-note-l1": "A változtatások életbe lépéséhez frissítened kell az oldalt.",
|
||||
"css-note-l2": "A stílusmódosítások csak helyben vannak mentve, ezért ajánlott másolatot készíteni a CSS-ről.",
|
||||
"css-note-l3": "Az összes egyéni stílus eltávolításához töröld a tartalmat, majd mentsd a változtatásokat.",
|
||||
"custom-css": {
|
||||
"title": "Egyéni CSS",
|
||||
"base-theme": "Alaptéma"
|
||||
}
|
||||
},
|
||||
"alternate-views": {
|
||||
"alternate-view-heading": "Váltás másik nézetre",
|
||||
"default": "Alapértelmezett",
|
||||
"workspace": "Munkaterület",
|
||||
"minimal": "Minimalista"
|
||||
},
|
||||
"settings": {
|
||||
"theme-label": "Téma",
|
||||
"layout-label": "Elrendezés",
|
||||
"layout-auto": "Automatikus",
|
||||
"layout-horizontal": "Vízszintes",
|
||||
"layout-vertical": "Függőleges",
|
||||
"item-size-label": "Elem mérete",
|
||||
"item-size-small": "Kicsi",
|
||||
"item-size-medium": "Közepes",
|
||||
"item-size-large": "Nagy",
|
||||
"config-launcher-label": "Beállítások",
|
||||
"config-launcher-tooltip": "Beállítások frissítése",
|
||||
"sign-out-tooltip": "Kijelentkezés",
|
||||
"sign-in-tooltip": "Bejelentkezés",
|
||||
"sign-in-welcome": "Szia, {username}!",
|
||||
"hide": "Elrejtés",
|
||||
"open": "Megnyitás"
|
||||
},
|
||||
"updates": {
|
||||
"app-version-note": "Dashy verzió",
|
||||
"up-to-date": "Naprakész",
|
||||
"out-of-date": "Frissítés elérhető",
|
||||
"unsupported-version-l1": "A Dashy nem támogatott verzióját használod",
|
||||
"unsupported-version-l2": "A legjobb élmény és a biztonsági javítások érdekében frissíts a következő verzióra"
|
||||
},
|
||||
"language-switcher": {
|
||||
"title": "Alkalmazás nyelvének módosítása",
|
||||
"dropdown-label": "Válassz nyelvet",
|
||||
"save-button": "Mentés",
|
||||
"success-msg": "A nyelv frissítve erre:"
|
||||
},
|
||||
"theme-maker": {
|
||||
"title": "Téma szerkesztő",
|
||||
"export-button": "Egyéni változók exportálása",
|
||||
"reset-button": "Stílus visszaállítása ehhez:",
|
||||
"show-all-button": "Összes változó megjelenítése",
|
||||
"change-fonts-button": "Betűtípus módosítása",
|
||||
"save-button": "Mentés",
|
||||
"cancel-button": "Mégse",
|
||||
"saved-toast": "{theme} sikeresen frissítve",
|
||||
"copied-toast": "{theme} témához tartozó adatok a vágólapra másolva",
|
||||
"reset-toast": "A(z) {theme} egyéni színei törölve"
|
||||
},
|
||||
"config-editor": {
|
||||
"save-location-label": "Mentés helye",
|
||||
"location-local-label": "Helyi mentés",
|
||||
"location-disk-label": "Változások mentése a konfigurációs fájlba",
|
||||
"save-button": "Változtatások mentése",
|
||||
"preview-button": "Változtatások előnézete",
|
||||
"valid-label": "A konfiguráció érvényes",
|
||||
"status-success-msg": "Feladat sikeresen befejezve",
|
||||
"status-fail-msg": "A feladat sikertelen volt",
|
||||
"success-msg-disk": "A konfigurációs fájl sikeresen mentve a lemezre",
|
||||
"success-msg-local": "A helyi változtatások sikeresen elmentve",
|
||||
"success-note-l1": "A változtatások érvényesítéséhez frissítened kell az oldalt.",
|
||||
"success-note-l2": "",
|
||||
"success-note-l3": "",
|
||||
"error-msg-save-mode": "Válaszd ki a mentés módját: helyi vagy fájlba mentés",
|
||||
"error-msg-cannot-save": "Hiba történt a konfiguráció mentése közben",
|
||||
"error-msg-bad-json": "Hibás JSON-formátum, valószínűleg rosszul van megadva",
|
||||
"warning-msg-validation": "Érvényesítési figyelmeztetés",
|
||||
"not-admin-note": "Nem írhatsz a lemezre, mert nem rendszergazdaként vagy bejelentkezve"
|
||||
},
|
||||
"app-rebuild": {
|
||||
"title": "Alkalmazás újraépítése",
|
||||
"rebuild-note-l1": "A változtatások érvényesítéséhez már nem szükséges újraépítés.",
|
||||
"rebuild-note-l2": "Bizonyos beállítások (például a belépési pont és a hitelesítés) csak az építés során kerülnek betöltésre, ezért ezekhez újraépítést kell indítani.",
|
||||
"rebuild-note-l3": "Ez a funkció csak Node és Docker telepítéseken érhető el, statikus verziókban nem.",
|
||||
"rebuild-button": "Build indítása",
|
||||
"rebuilding-status-1": "Build folyamatban...",
|
||||
"rebuilding-status-2": "Ez néhány percet igénybe vehet",
|
||||
"error-permission": "Nincs jogosultságod a folyamat elindításához",
|
||||
"success-msg": "Az újraépítés sikeresen befejeződött",
|
||||
"fail-msg": "Az újraépítés sikertelen volt",
|
||||
"reload-note": "A változtatások érvényesítéséhez frissíteni kell az oldalt",
|
||||
"reload-button": "Oldal újratöltése"
|
||||
},
|
||||
"cloud-sync": {
|
||||
"title": "Mentés felhőbe, visszaállítás",
|
||||
"intro-l1": "A mentés felhőbe, visszaállítás egy választható funkció, amellyel feltöltheted a beállításaidat az internetre, majd bármely másik Dashy példányban visszaállíthatod azokat.",
|
||||
"intro-l2": "Minden adat teljes körűen AES titkosítással védett, ahol a jelszavad szolgál kulcsként.",
|
||||
"intro-l3": "További információért lásd a",
|
||||
"intro-docs": "dokumentációt",
|
||||
"backup-title-setup": "Biztonsági mentés készítése",
|
||||
"backup-title-update": "Mentés frissítése",
|
||||
"password-label-setup": "Válassz jelszót",
|
||||
"password-label-update": "Add meg a jelszavad",
|
||||
"backup-button-setup": "Biztonsági mentés",
|
||||
"backup-button-update": "Biztonsági mentés frissítése",
|
||||
"backup-id-label": "Biztonsági mentés azonosítója",
|
||||
"backup-id-note": "Ezt az azonosítót a későbbi visszaállításhoz használhatod, ezért őrizd meg biztonságos helyen a jelszavaddal együtt.",
|
||||
"restore-title": "Biztonsági mentés visszaállítása",
|
||||
"restore-id-label": "Visszaállítási azonosító",
|
||||
"restore-password-label": "Jelszó",
|
||||
"restore-button": "Visszaállítás",
|
||||
"backup-missing-password": "Hiányzó jelszó",
|
||||
"backup-error-unknown": "A kérés feldolgozása nem sikerült",
|
||||
"backup-error-password": "Hibás jelszó. Kérlek, add meg a helyes jelszót.",
|
||||
"backup-success-msg": "Sikeresen befejezve",
|
||||
"restore-success-msg": "A beállítások sikeresen visszaállítva"
|
||||
},
|
||||
"menu": {
|
||||
"open-section-title": "Megnyitás itt",
|
||||
"sametab": "Jelenlegi fülön",
|
||||
"newtab": "Új fülön",
|
||||
"modal": "Felugró ablakban",
|
||||
"workspace": "Munkaterület nézet",
|
||||
"options-section-title": "Beállítások",
|
||||
"edit-item": "Szerkesztés",
|
||||
"move-item": "Másolás vagy áthelyezés",
|
||||
"remove-item": "Eltávolítás"
|
||||
},
|
||||
"context-menus": {
|
||||
"item": {
|
||||
"open-section-title": "Megnyitás itt",
|
||||
"sametab": "Jelenlegi fülön",
|
||||
"newtab": "Új fülön",
|
||||
"modal": "Felugró ablakban",
|
||||
"workspace": "Munkaterület nézet",
|
||||
"clipboard": "Másolás vágólapra",
|
||||
"options-section-title": "Beállítások",
|
||||
"edit-item": "Szerkesztés",
|
||||
"move-item": "Másolás vagy áthelyezés",
|
||||
"remove-item": "Eltávolítás",
|
||||
"copied-toast": "Az URL a vágólapra másolva"
|
||||
},
|
||||
"section": {
|
||||
"open-section": "Szakasz megnyitása",
|
||||
"edit-section": "Szerkesztés",
|
||||
"expand-collapse": "Kinyitás / Összecsukás",
|
||||
"move-section": "Áthelyezés ide",
|
||||
"remove-section": "Eltávolítás"
|
||||
}
|
||||
},
|
||||
"footer": {
|
||||
"dev-by": "Fejlesztette",
|
||||
"licensed-under": "Licenc típusa:",
|
||||
"get-the": "Nézd meg a",
|
||||
"source-code": "forráskódot"
|
||||
},
|
||||
"interactive-editor": {
|
||||
"menu": {
|
||||
"start-editing-tooltip": "Belépés az interaktív szerkesztőbe",
|
||||
"edit-site-data-subheading": "Oldaladatok szerkesztése",
|
||||
"edit-page-info-btn": "Oldalinformációk szerkesztése",
|
||||
"edit-page-info-tooltip": "Alkalmazás címe, leírása, menülinkek, lábléc szöveg stb.",
|
||||
"edit-app-config-btn": "Alkalmazás beállításainak szerkesztése",
|
||||
"edit-app-config-tooltip": "Az alkalmazás összes további beállítási lehetősége",
|
||||
"edit-pages-btn": "Oldalak szerkesztése",
|
||||
"edit-pages-tooltip": "További nézetek hozzáadása vagy eltávolítása",
|
||||
"config-save-methods-subheading": "Mentési beállítások",
|
||||
"save-locally-btn": "Mentés helyileg",
|
||||
"save-locally-tooltip": "A konfiguráció helyi mentése a böngészőben. Ez nem módosítja a konfigurációs fájlt, és csak ezen az eszközön marad meg.",
|
||||
"save-disk-btn": "Mentés lemezre",
|
||||
"save-disk-tooltip": "A konfiguráció mentése a conf.yml fájlba. Biztonsági mentést készít, majd felülírja a meglévő beállításokat.",
|
||||
"export-config-btn": "Beállítások exportálása",
|
||||
"export-config-tooltip": "A beállítások megtekintése és exportálása fájlba vagy vágólapra",
|
||||
"cloud-backup-btn": "Mentés felhőbe",
|
||||
"cloud-backup-tooltip": "Titkosított konfigurációs mentés feltöltése a felhőbe",
|
||||
"edit-raw-config-btn": "Nyers konfiguráció szerkesztése",
|
||||
"edit-raw-config-tooltip": "A nyers konfiguráció megtekintése és módosítása JSON szerkesztőben",
|
||||
"cancel-changes-btn": "Szerkesztés megszakítása",
|
||||
"cancel-changes-tooltip": "A jelenlegi módosítások visszaállítása és a szerkesztési mód bezárása. A mentett beállításokat nem érinti.",
|
||||
"edit-mode-name": "Szerkesztési mód",
|
||||
"edit-mode-subtitle": "Jelenleg szerkesztési módban vagy",
|
||||
"edit-mode-description": "Ez azt jelenti, hogy módosíthatod a beállításokat és megtekintheted az eredményt, de a változtatások nem lesznek automatikusan mentve, amíg kézzel el nem mented azokat.",
|
||||
"save-stage-btn": "Mentés",
|
||||
"cancel-stage-btn": "Mégse",
|
||||
"save-locally-warning": "Ha folytatod, a változtatások csak a böngészőben kerülnek mentésre. Javasolt egy másolat exportálása más eszközök használatához. Szeretnéd folytatni?"
|
||||
},
|
||||
"edit-item": {
|
||||
"missing-title-err": "Hiányzó elemcím"
|
||||
},
|
||||
"edit-section": {
|
||||
"edit-section-title": "Szakasz szerkesztése",
|
||||
"add-section-title": "Új szakasz hozzáadása",
|
||||
"edit-tooltip": "Kattints a szerkesztéshez, vagy jobb klikk a további lehetőségekért",
|
||||
"remove-confirm": "Biztosan törölni szeretnéd ezt a szakaszt? Ez a művelet később nem vonható vissza."
|
||||
},
|
||||
"edit-app-config": {
|
||||
"warning-msg-title": "Csak óvatosan!",
|
||||
"warning-msg-l1": "A következő beállítások haladó konfigurációhoz valók.",
|
||||
"warning-msg-l2": "Ha nem vagy biztos benne, hogy melyik mező mire való, olvass utána a",
|
||||
"warning-msg-docs": "dokumentációban,",
|
||||
"warning-msg-l3": "hogy elkerüld a nem kívánt következményeket."
|
||||
},
|
||||
"export": {
|
||||
"export-title": "Konfiguráció exportálása",
|
||||
"copy-clipboard-btn": "Másolás vágólapra",
|
||||
"copy-clipboard-tooltip": "Az összes beállítás másolása a vágólapra YAML formátumban",
|
||||
"download-file-btn": "Letöltés fájlként",
|
||||
"download-file-tooltip": "Az összes beállítás letöltése YAML fájlként az eszközre",
|
||||
"view-title": "Beállítások megtekintése"
|
||||
}
|
||||
},
|
||||
"critical-error": {
|
||||
"title": "Konfigurációs betöltési hiba",
|
||||
"subtitle": "A Dashy nem tudott megfelelően betöltődni a konfigurációs hiba miatt.",
|
||||
"sub-ensure-that": "Győződj meg róla, hogy",
|
||||
"sub-error-details": "Hiba részletei",
|
||||
"sub-next-steps": "Következő lépések",
|
||||
"ignore-button": "Kritikus hibák figyelmen kívül hagyása"
|
||||
},
|
||||
"widgets": {
|
||||
"general": {
|
||||
"loading": "Betöltés",
|
||||
"show-more": "Részletek megjelenítése",
|
||||
"cpu-details": "CPU adatai",
|
||||
"mem-details": "Mamória adatai",
|
||||
"show-less": "Kevesebb megjelenítése",
|
||||
"open-link": "Tovább olvasás"
|
||||
},
|
||||
"pi-hole": {
|
||||
"status-heading": "Állapot"
|
||||
},
|
||||
"stat-ping": {
|
||||
"up": "Online",
|
||||
"down": "Offline"
|
||||
},
|
||||
"net-data": {
|
||||
"cpu-chart-title": "CPU-használat",
|
||||
"mem-chart-title": "Memóriahasználat",
|
||||
"mem-breakdown-title": "Memória-összeomlás",
|
||||
"load-chart-title": "Rendszerterhelés"
|
||||
},
|
||||
"glances": {
|
||||
"disk-space-free": "Szabad",
|
||||
"disk-space-used": "Foglalt",
|
||||
"disk-mount-point": "Csatolás helye",
|
||||
"disk-file-system": "Fájlrendszer",
|
||||
"disk-io-read": "Olvasás",
|
||||
"disk-io-write": "Írás",
|
||||
"system-load-desc": "A futási sorban várakozó folyamatok száma, az összes mag átlaga"
|
||||
},
|
||||
"system-info": {
|
||||
"uptime": "Rendszer futási ideje"
|
||||
},
|
||||
"flight-data": {
|
||||
"arrivals": "Érkezések",
|
||||
"departures": "Indulások"
|
||||
},
|
||||
"tfl-status": {
|
||||
"good-service-all": "Minden vonalon zavartalan a közlekedés",
|
||||
"good-service-rest": "Minden más vonalon zavartalan a közlekedés"
|
||||
},
|
||||
"synology-download": {
|
||||
"download": "Letöltés",
|
||||
"upload": "Feltöltés",
|
||||
"downloaded": "Letöltve",
|
||||
"uploaded": "Feltöltve",
|
||||
"remaining": "Hátralévő",
|
||||
"up": "Feltöltés",
|
||||
"down": "Letöltés"
|
||||
},
|
||||
"gluetun-status": {
|
||||
"vpn-ip": "VPN IP-cím",
|
||||
"country": "Ország",
|
||||
"region": "Vármegye / Régió",
|
||||
"city": "Város",
|
||||
"post-code": "Irányítószám",
|
||||
"location": "Cím / Földrajzi hely",
|
||||
"timezone": "Időzóna",
|
||||
"organization": "Szervezet"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"home": {
|
||||
"no-results": "Ingen søkeresultater",
|
||||
"no-data": "Ingen data konfigurert"
|
||||
"no-data": "Ingen data tilgjengelig"
|
||||
},
|
||||
"search": {
|
||||
"search-label": "Søk",
|
||||
|
|
@ -43,7 +43,7 @@
|
|||
"cloud-sync-button": "Aktiver skysynkronisering",
|
||||
"edit-cloud-sync-button": "Rediger skysynkronisering",
|
||||
"rebuild-app-button": "Bygg program",
|
||||
"change-language-button": "Endre appspråk",
|
||||
"change-language-button": "Endre språk",
|
||||
"reset-settings-button": "Tilbakestill lokale innstillinger",
|
||||
"app-info-button": "Appinfo",
|
||||
"backup-note": "Det anbefales å ta en sikkerhetskopi av konfigurasjonen din før du gjør endringer.",
|
||||
|
|
@ -91,7 +91,7 @@
|
|||
"unsupported-version-l2": "For den beste opplevelsen og de siste sikkerhetsoppdateringene, vennligst oppdater til"
|
||||
},
|
||||
"language-switcher": {
|
||||
"title": "Endre applikasjonsspråk",
|
||||
"title": "Endre språk",
|
||||
"dropdown-label": "Velg et språk",
|
||||
"save-button": "Lagre",
|
||||
"success-msg": "Språk oppdatert til"
|
||||
|
|
@ -115,7 +115,7 @@
|
|||
"valid-label": "Konfigurasjon er gyldig",
|
||||
"status-success-msg": "Oppgaven fullført",
|
||||
"status-fail-msg": "Oppgaven mislyktes",
|
||||
"success-msg-disk": "Konfigurasjonsfil skrevet til disk med hell",
|
||||
"success-msg-disk": "Konfigurasjonsfil skrevet til disk vellykket",
|
||||
"success-msg-local": "Lokale endringer er lagret",
|
||||
"success-note-l1": "Appen bør bygge om automatisk.",
|
||||
"success-note-l2": "Dette kan ta opptil et minutt.",
|
||||
|
|
@ -131,10 +131,10 @@
|
|||
"rebuild-note-l1": "En ombygging er nødvendig for at endringer skrevet i conf.yml-filen skal tre i kraft.",
|
||||
"rebuild-note-l2": "Dette bør skje automatisk, men hvis det ikke har blitt gjort, kan du manuelt utløse det her.",
|
||||
"rebuild-note-l3": "Dette er ikke nødvendig for endringer som er lagret lokalt.",
|
||||
"rebuild-button": "Start Build",
|
||||
"rebuilding-status-1": "Building ...",
|
||||
"rebuild-button": "Start Bygging",
|
||||
"rebuilding-status-1": "Bygger ...",
|
||||
"rebuilding-status-2": "Dette kan ta noen minutter",
|
||||
"error-permission": "Du har ikke tillatelse til å utløse denne handlingen",
|
||||
"error-permission": "Du har ikke tillatelse til å utføre denne handlingen",
|
||||
"success-msg": "Byggingen er fullført",
|
||||
"fail-msg": "Byggoperasjonen mislyktes",
|
||||
"reload-note": "En sideinnlasting er nå nødvendig for at endringer skal tre i kraft",
|
||||
|
|
|
|||
|
|
@ -10,8 +10,12 @@
|
|||
"clear-search-tooltip": "Limpar busca",
|
||||
"enter-to-search-web": "Tecle enter para buscar na rede"
|
||||
},
|
||||
"splash-screen": {
|
||||
"loading": "Carregando"
|
||||
},
|
||||
"login": {
|
||||
"title": "Dashy",
|
||||
"guest-label": "Entrar como convidado",
|
||||
"username-label": "Nome do usuário",
|
||||
"password-label": "Senha",
|
||||
"login-button": "Conectar",
|
||||
|
|
@ -31,8 +35,20 @@
|
|||
"already-logged-in-text": "Você está logado como",
|
||||
"proceed-to-dashboard": "Ir para o Painel",
|
||||
"log-out-button": "Sair",
|
||||
"proceed-guest-button": "Seguir como Convidado"
|
||||
"proceed-guest-button": "Seguir como Convidado",
|
||||
"guest-intro-1": "Essa instância possui o acesso como convidado ativado",
|
||||
"guest-intro-2": "Convidados podem apenas visualizar os painéis, logo não podem escrever quaisquer mudanças no disco.",
|
||||
"error": "Erro",
|
||||
"error-no-user-configured": "Autenticação não está habilitada, ou nenhum usuário foi configurado.",
|
||||
"error-go-home-button": "Ir para a página inicial",
|
||||
"logged-in-guest": "Logado como convidado. Redirecionando...",
|
||||
"error-guest-access": "O acesso como convidado não foi permitido"
|
||||
},
|
||||
|
||||
"app-info": {
|
||||
"title": "Informação do App"
|
||||
},
|
||||
|
||||
"config": {
|
||||
"main-tab": "Menu Principal",
|
||||
"view-config-tab": "Ver configuração",
|
||||
|
|
@ -299,6 +315,16 @@
|
|||
"remaining": "Restante",
|
||||
"up": "Up",
|
||||
"down": "Down"
|
||||
},
|
||||
"gluetun-status": {
|
||||
"vpn-ip": "IP da VPN",
|
||||
"country": "País",
|
||||
"region": "Região",
|
||||
"city": "Cidade",
|
||||
"post-code": "Código postal",
|
||||
"location": "Localização",
|
||||
"timezone": "Fuso horário",
|
||||
"organization": "Organização"
|
||||
}
|
||||
}
|
||||
}
|
||||
448
src/assets/locales/ro.json
Normal file
|
|
@ -0,0 +1,448 @@
|
|||
{
|
||||
"home": {
|
||||
"no-results": "Niciun rezultat găsit",
|
||||
"no-data": "Nicio dată configurată",
|
||||
"no-items-section": "Niciun element de afișat încă"
|
||||
},
|
||||
"search": {
|
||||
"search-label": "Caută",
|
||||
"search-placeholder": "Începeți să tastați pentru a filtra",
|
||||
"clear-search-tooltip": "Șterge căutarea",
|
||||
"enter-to-search-web": "Apasă enter pentru a căuta pe web"
|
||||
},
|
||||
"splash-screen": {
|
||||
"loading": "Încărcare"
|
||||
},
|
||||
"login": {
|
||||
"title": "Dashy",
|
||||
"guest-label": "Acces Vizitator",
|
||||
"username-label": "Nume utilizator",
|
||||
"password-label": "Parolă",
|
||||
"login-button": "Autentificare",
|
||||
"remember-me-label": "Ține-mă minte pentru",
|
||||
"remember-me-never": "Niciodată",
|
||||
"remember-me-hour": "4 Ore",
|
||||
"remember-me-day": "1 Zi",
|
||||
"remember-me-week": "1 Săptămână",
|
||||
"remember-me-long-time": "O perioadă lungă",
|
||||
"error-missing-username": "Lipsește numele de utilizator",
|
||||
"error-missing-password": "Lipsește parola",
|
||||
"error-incorrect-username": "Utilizator negăsit",
|
||||
"error-incorrect-password": "Parolă incorectă",
|
||||
"success-message": "Autentificare...",
|
||||
"logout-message": "Deconectat",
|
||||
"already-logged-in-title": "Deja autentificat",
|
||||
"already-logged-in-text": "Ești autentificat ca",
|
||||
"proceed-to-dashboard": "Continuă către Tabloul de bord",
|
||||
"log-out-button": "Deconectare",
|
||||
"proceed-guest-button": "Continuă ca Vizitator",
|
||||
"guest-intro-1": "Această instanță are acces pentru vizitatori activat.",
|
||||
"guest-intro-2": "Vizitatorii au acces doar pentru vizualizare la tablourile de bord, deci nu pot scrie modificări pe disc.",
|
||||
"error": "Eroare",
|
||||
"error-no-user-configured": "Autentificarea nu este activată, sau nu au fost configurați utilizatori",
|
||||
"error-go-home-button": "Mergi la Pagina Principală",
|
||||
"logged-in-guest": "Autentificat ca Vizitator, Redirecționare...",
|
||||
"error-guest-access": "Acces Vizitator Interzis"
|
||||
},
|
||||
"app-info": {
|
||||
"title": "Informații Aplicație",
|
||||
"error-log": "Jurnal Erori",
|
||||
"no-errors": "Nicio eroare recentă detectată",
|
||||
"help-support": "Ajutor & Suport",
|
||||
"help-support-description" : "Pentru suport în utilizarea sau configurarea Dashy, consultați",
|
||||
"help-support-discussions": "Discuțiile",
|
||||
"support-dashy": "Suport pentru Dashy",
|
||||
"support-dashy-description": "Pentru moduri în care poți contribui, verificați",
|
||||
"support-dashy-link": "Pagina de Contribuții",
|
||||
"report-bug": "Raportează o Eroare",
|
||||
"report-bug-description": "Dacă crezi că ai găsit o eroare, atunci te rog",
|
||||
"report-bug-link": "deschide o Problemă",
|
||||
"more-info": "Mai Multe Informații",
|
||||
"source": "Sursă",
|
||||
"documentation": "Documentație",
|
||||
"privacy-and-security": "Confidențialitate & Securitate",
|
||||
"privacy-and-security-l1": "Pentru o descompunere a modului în care datele tale sunt gestionate de Dashy, consultați",
|
||||
"privacy-and-security-privacy-policy": "Politica de Confidențialitate",
|
||||
"privacy-and-security-advice": "Pentru sfaturi în securizarea tabloului tău de bord, poți consulta",
|
||||
"privacy-and-security-advice-link": "Documentele de Management",
|
||||
"privacy-and-security-security-issue": "Dacă ați descoperit o potențială problemă de securitate, raportați-o urmând",
|
||||
"privacy-and-security-security-policy": "Politica de Securitate",
|
||||
"license": "Licență",
|
||||
"license-under": "Licențiat sub",
|
||||
"licence-third-party": "Pentru licențele modulelor terțe părți, vă rugăm să consultați",
|
||||
"licence-third-party-link": "Legal",
|
||||
"list-contributors": "Pentru lista completă a contribuitorilor și mulțumiri, vedeți",
|
||||
"list-contributors-link": "Credite",
|
||||
"version": "Versiune"
|
||||
},
|
||||
"config": {
|
||||
"main-tab": "Meniu Principal",
|
||||
"view-config-tab": "Vizualizare Configurație",
|
||||
"edit-config-tab": "Editare Configurație",
|
||||
"custom-css-tab": "Stiluri Personalizate",
|
||||
"heading": "Opțiuni de Configurare",
|
||||
"download-config-button": "Vizualizați / Exportați Configurația",
|
||||
"edit-config-button": "Editare Configurație",
|
||||
"edit-css-button": "Editare CSS Personalizat",
|
||||
"cloud-sync-button": "Activează Sincronizarea în Cloud",
|
||||
"edit-cloud-sync-button": "Editare Sincronizare în Cloud",
|
||||
"rebuild-app-button": "Reconstruire Aplicație",
|
||||
"change-language-button": "Schimbă Limba Aplicației",
|
||||
"reset-settings-button": "Resetează Setările Locale",
|
||||
"disabled-note": "Unele caracteristici de configurare au fost dezactivate de administratorul tău",
|
||||
"small-screen-note": "Utilizați un ecran foarte mic, și unele ecrane din acest meniu s-ar putea să nu fie optimale",
|
||||
"app-info-button": "Informații Aplicație",
|
||||
"backup-note": "Este recomandat să faceți o copie de siguranță a configurației înainte de a face modificări.",
|
||||
"reset-config-msg-l1": "Aceasta va elimina toate setările utilizatorilor din stocarea locală, dar nu va afecta fișierul 'conf.yml'.",
|
||||
"reset-config-msg-l2": "Ar trebui să faceți mai întâi o copie de siguranță a oricăror modificări pe care le-ați făcut local, dacă doriți să le utilizați în viitor.",
|
||||
"reset-config-msg-l3": "Sunteți sigur că doriți să continuați?",
|
||||
"data-cleared-msg": "Datele au fost șterse cu succes",
|
||||
"actions-label": "Acțiuni",
|
||||
"copy-config-label": "Copiază Configurația",
|
||||
"data-copied-msg": "Configurația a fost copiată în clipboard",
|
||||
"reset-config-label": "Resetează Configurația",
|
||||
"css-save-btn": "Salvează Modificările",
|
||||
"css-note-label": "Notă",
|
||||
"css-note-l1": "Va trebui să reîmprospătați pagina pentru ca modificările să aibă efect.",
|
||||
"css-note-l2": "Suprascrierile de stiluri sunt stocate doar local, deci este recomandat să faceți o copie a CSS-ului dvs.",
|
||||
"css-note-l3": "Pentru a elimina toate stilurile personalizate, ștergeți conținutul și apăsați 'Salvează Modificările'",
|
||||
"custom-css": {
|
||||
"title": "CSS Personalizat",
|
||||
"base-theme": "Tema de Bază"
|
||||
}
|
||||
},
|
||||
"alternate-views": {
|
||||
"alternate-view-heading": "Schimbă Vederea",
|
||||
"default": "Implicit",
|
||||
"workspace": "Spațiu de Lucru",
|
||||
"minimal": "Minimal"
|
||||
},
|
||||
"settings": {
|
||||
"theme-label": "Temă",
|
||||
"layout-label": "Aspect",
|
||||
"layout-auto": "Automat",
|
||||
"layout-horizontal": "Orizontal",
|
||||
"layout-vertical": "Vertical",
|
||||
"item-size-label": "Dimensiune Element",
|
||||
"item-size-small": "Mic",
|
||||
"item-size-medium": "Mediu",
|
||||
"item-size-large": "Mare",
|
||||
"config-launcher-label": "Config",
|
||||
"config-launcher-tooltip": "Actualizează Configurația",
|
||||
"sign-out-tooltip": "Deconectare",
|
||||
"sign-in-tooltip": "Conectare",
|
||||
"sign-in-welcome": "Bună {username}!",
|
||||
"hide": "Ascunde",
|
||||
"open": "Deschide"
|
||||
},
|
||||
"updates": {
|
||||
"app-version-note": "Versiune Dashy",
|
||||
"up-to-date": "Actualizat",
|
||||
"out-of-date": "Actualizare Disponibilă",
|
||||
"unsupported-version-l1": "Utilizați o versiune nesuportată de Dashy",
|
||||
"unsupported-version-l2": "Pentru cea mai bună experiență și patch-uri de securitate recente, vă rugăm să actualizați la"
|
||||
},
|
||||
"language-switcher": {
|
||||
"title": "Schimbă Limba Aplicației",
|
||||
"dropdown-label": "Selectați o Limbă",
|
||||
"save-button": "Salvează",
|
||||
"success-msg": "Limba Actualizată la"
|
||||
},
|
||||
"theme-maker": {
|
||||
"title": "Configurator de Temă",
|
||||
"export-button": "Exportă Variabile Personalizate",
|
||||
"reset-button": "Resetează Stilurile pentru",
|
||||
"show-all-button": "Arată Toate Variabilele",
|
||||
"change-fonts-button": "Schimbă Fonturile",
|
||||
"save-button": "Salvează",
|
||||
"cancel-button": "Anulează",
|
||||
"saved-toast": "{theme} Actualizat cu Succes",
|
||||
"copied-toast": "Datele temei pentru {theme} au fost copiate în clipboard",
|
||||
"reset-toast": "Culorile Personalizate pentru {theme} au fost Eliminate"
|
||||
},
|
||||
"config-editor": {
|
||||
"save-location-label": "Locația de Salvare",
|
||||
"location-local-label": "Aplică Local",
|
||||
"location-disk-label": "Scrie Modificările în Fișierul de Configurație",
|
||||
"save-button": "Salvează Modificările",
|
||||
"preview-button": "Previzualizează Modificările",
|
||||
"valid-label": "Configurația este Valabilă",
|
||||
"status-success-msg": "Sarcină Completată",
|
||||
"status-fail-msg": "Sarcină Eșuată",
|
||||
"success-msg-disk": "Fișierul de configurație a fost scris pe disc cu succes",
|
||||
"success-msg-local": "Modificările locale au fost salvate cu succes",
|
||||
"success-note-l1": "Aplicația ar trebui să se reconstruiască automat.",
|
||||
"success-note-l2": "Aceasta poate dura până la un minut.",
|
||||
"success-note-l3": "Va trebui să reîmprospătați pagina pentru ca modificările să aibă efect.",
|
||||
"error-msg-save-mode": "Vă rugăm să selectați un Mod de Salvare: Local sau Fișier",
|
||||
"error-msg-cannot-save": "A apărut o eroare la salvarea configurației",
|
||||
"error-msg-bad-json": "Eroare în JSON, posibil malformat",
|
||||
"warning-msg-validation": "Avertisment de Validare",
|
||||
"not-admin-note": "Nu puteți scrie modificările pe disc deoarece nu sunteți conectat ca administrator"
|
||||
},
|
||||
"app-rebuild": {
|
||||
"title": "Reconstruire Aplicație",
|
||||
"rebuild-note-l1": "O reconstruire este necesară pentru ca modificările scrise în fișierul conf.yml să aibă efect.",
|
||||
"rebuild-note-l2": "Aceasta ar trebui să se întâmple automat, dar dacă nu s-a întâmplat, o puteți declanșa manual aici.",
|
||||
"rebuild-note-l3": "Aceasta nu este necesară pentru modificările stocate local.",
|
||||
"rebuild-button": "Începeți Reconstruirea",
|
||||
"rebuilding-status-1": "Se reconstruiește...",
|
||||
"rebuilding-status-2": "Aceasta poate dura câteva minute",
|
||||
"error-permission": "Nu aveți permisiunea de a declanșa această acțiune",
|
||||
"success-msg": "Reconstruirea a fost completată cu succes",
|
||||
"fail-msg": "Operațiunea de reconstruire a eșuat",
|
||||
"reload-note": "Este necesară reîncărcarea paginii pentru ca modificările să aibă efect",
|
||||
"reload-button": "Reîncarcă Pagina"
|
||||
},
|
||||
"cloud-sync": {
|
||||
"title": "Backup și Restaurare în Cloud",
|
||||
"intro-l1": "Backup-ul și restaurarea în cloud este o caracteristică opțională, care vă permite să încărcați configurația pe internet și apoi să o restaurați pe orice alt dispozitiv sau instanță de Dashy.",
|
||||
"intro-l2": "Toate datele sunt criptate end-to-end cu AES, folosind parola dumneavoastră ca cheie.",
|
||||
"intro-l3": "Pentru mai multe informații, vă rugăm să consultați",
|
||||
"intro-docs": "documentația",
|
||||
"backup-title-setup": "Creați un Backup",
|
||||
"backup-title-update": "Actualizați Backup-ul",
|
||||
"password-label-setup": "Alegeți o Parolă",
|
||||
"password-label-update": "Introduceți Parola",
|
||||
"backup-button-setup": "Backup",
|
||||
"backup-button-update": "Actualizați Backup-ul",
|
||||
"backup-id-label": "ID-ul Dvs. de Backup",
|
||||
"backup-id-note": "Acesta este utilizat pentru a restaura din backup-uri mai târziu. Deci păstrați-l, împreună cu parola dvs., într-un loc sigur.",
|
||||
"restore-title": "Restaurare Backup",
|
||||
"restore-id-label": "ID de Restaurare",
|
||||
"restore-password-label": "Parola",
|
||||
"restore-button": "Restaurare",
|
||||
"backup-missing-password": "Lipsește Parola",
|
||||
"backup-error-unknown": "Imposibil de procesat solicitarea",
|
||||
"backup-error-password": "Parolă incorectă. Vă rugăm să introduceți parola actuală.",
|
||||
"backup-success-msg": "Finalizat cu Succes",
|
||||
"restore-success-msg": "Configurația a fost Restaurată cu Succes"
|
||||
},
|
||||
"menu": {
|
||||
"open-section-title": "Deschide În",
|
||||
"sametab": "Tab Curent",
|
||||
"newtab": "Tab Nou",
|
||||
"modal": "Modal Pop-Up",
|
||||
"workspace": "Vizualizare Spațiu de Lucru",
|
||||
"options-section-title": "Opțiuni",
|
||||
"edit-item": "Editare",
|
||||
"move-item": "Copiază sau Mută",
|
||||
"remove-item": "Șterge"
|
||||
},
|
||||
"context-menus": {
|
||||
"item": {
|
||||
"open-section-title": "Deschide În",
|
||||
"sametab": "Tab Curent",
|
||||
"newtab": "Tab Nou",
|
||||
"modal": "Modal Pop-Up",
|
||||
"workspace": "Vizualizare Spațiu de Lucru",
|
||||
"clipboard": "Copiază în Clipboard",
|
||||
"options-section-title": "Opțiuni",
|
||||
"edit-item": "Editare",
|
||||
"move-item": "Copiază sau Mută",
|
||||
"remove-item": "Șterge",
|
||||
"copied-toast": "URL-ul a fost copiat în clipboard"
|
||||
},
|
||||
"section": {
|
||||
"open-section": "Deschide Secțiunea",
|
||||
"edit-section": "Editare",
|
||||
"expand-collapse": "Extinde / Colapsează",
|
||||
"move-section": "Mută La",
|
||||
"remove-section": "Șterge"
|
||||
}
|
||||
},
|
||||
"footer": {
|
||||
"dev-by": "Dezvoltat de",
|
||||
"licensed-under": "Licențiat sub",
|
||||
"get-the": "Obțineți",
|
||||
"source-code": "Codul Sursă"
|
||||
},
|
||||
"interactive-editor": {
|
||||
"menu": {
|
||||
"start-editing-tooltip": "Intră în Editorul Interactiv",
|
||||
"edit-site-data-subheading": "Editează Datele Site-ului",
|
||||
"edit-page-info-btn": "Editează Informațiile Paginii",
|
||||
"edit-page-info-tooltip": "Titlul aplicației, descriere, link-uri de navigare, textul din footer, etc.",
|
||||
"edit-app-config-btn": "Editează Configurația Aplicației",
|
||||
"edit-app-config-tooltip": "Toate celelalte opțiuni de configurare a aplicației",
|
||||
"edit-pages-btn": "Editează Paginile",
|
||||
"edit-pages-tooltip": "Adaugă sau elimină vizualizări suplimentare",
|
||||
"config-save-methods-subheading": "Opțiuni de Salvare a Configurației",
|
||||
"save-locally-btn": "Salvează Local",
|
||||
"save-locally-tooltip": "Salvează configurația local, în stocarea browserului. Aceasta nu va afecta fișierul tău de configurare, dar schimbările vor fi salvate doar pe acest dispozitiv",
|
||||
"save-disk-btn": "Salvează pe Disc",
|
||||
"save-disk-tooltip": "Salvează configurația în fișierul conf.yml de pe disc. Aceasta va face un backup și apoi va suprascrie configurația existentă",
|
||||
"export-config-btn": "Exportă Configurația",
|
||||
"export-config-tooltip": "Vizualizează și exportă noua configurație, fie într-un fișier, fie în clipboard",
|
||||
"cloud-backup-btn": "Backup în Cloud",
|
||||
"cloud-backup-tooltip": "Salvează un backup criptat al configurației în cloud",
|
||||
"edit-raw-config-btn": "Editează Configurația Brută",
|
||||
"edit-raw-config-tooltip": "Vizualizează și modifică configurația brută prin editorul JSON",
|
||||
"cancel-changes-btn": "Anulează Modificările",
|
||||
"cancel-changes-tooltip": "Resetează modificările curente și ieși din Modul de Editare. Aceasta nu va afecta configurația salvată",
|
||||
"edit-mode-name": "Mod de Editare",
|
||||
"edit-mode-subtitle": "Ești în Modul de Editare",
|
||||
"edit-mode-description": "Aceasta înseamnă că poți face modificări la configurația ta și să previzualizezi rezultatele, dar până nu salvezi, niciuna dintre modificările tale nu va fi păstrată.",
|
||||
"save-stage-btn": "Salvează",
|
||||
"cancel-stage-btn": "Anulează",
|
||||
"save-locally-warning": "Dacă vei continua, modificările vor fi salvate doar în browserul tău. Ar trebui să exporți o copie a configurației tale pentru utilizare pe alte mașini. Dorești să continui?"
|
||||
},
|
||||
"edit-item": {
|
||||
"missing-title-err": "Este necesar un titlu pentru element"
|
||||
},
|
||||
"edit-section": {
|
||||
"edit-section-title": "Editează Secțiunea",
|
||||
"add-section-title": "Adaugă o Secțiune Nouă",
|
||||
"edit-tooltip": "Clic pentru a edita, sau clic dreapta pentru mai multe opțiuni",
|
||||
"remove-confirm": "Ești sigur că vrei să elimini această secțiune? Această acțiune poate fi anulată mai târziu."
|
||||
},
|
||||
"edit-app-config": {
|
||||
"warning-msg-title": "Procedează cu Atenție",
|
||||
"warning-msg-l1": "Următoarele opțiuni sunt pentru configurarea avansată a aplicației.",
|
||||
"warning-msg-l2": "Dacă nu ești sigur în legătură cu oricare dintre câmpuri, te rog să consulți",
|
||||
"warning-msg-docs": "documentația",
|
||||
"warning-msg-l3": "pentru a evita consecințele nedorite."
|
||||
},
|
||||
"export": {
|
||||
"export-title": "Exportă Configurația",
|
||||
"copy-clipboard-btn": "Copiază în Clipboard",
|
||||
"copy-clipboard-tooltip": "Copiază toată configurația aplicației în clipboard-ul sistemului, în format YAML",
|
||||
"download-file-btn": "Descarcă ca Fișier",
|
||||
"download-file-tooltip": "Descarcă toată configurația aplicației pe dispozitivul tău, într-un fișier YAML",
|
||||
"view-title": "Vizualizează Configurația"
|
||||
}
|
||||
},
|
||||
"widgets": {
|
||||
"general": {
|
||||
"loading": "Se încarcă...",
|
||||
"show-more": "Extinde Detaliile",
|
||||
"cpu-details": "Detalii CPU",
|
||||
"mem-details": "Detalii Memorie",
|
||||
"show-less": "Arată Mai Puțin",
|
||||
"open-link": "Continuă Citirea"
|
||||
},
|
||||
"pi-hole": {
|
||||
"status-heading": "Stare"
|
||||
},
|
||||
"stat-ping": {
|
||||
"up": "Online",
|
||||
"down": "Offline"
|
||||
},
|
||||
"net-data": {
|
||||
"cpu-chart-title": "Istoric CPU",
|
||||
"mem-chart-title": "Utilizare Memorie",
|
||||
"mem-breakdown-title": "Detalii Memorie",
|
||||
"load-chart-title": "Încărcare Sistem"
|
||||
},
|
||||
"glances": {
|
||||
"disk-space-free": "Liber",
|
||||
"disk-space-used": "Utilizat",
|
||||
"disk-mount-point": "Punct de Montare",
|
||||
"disk-file-system": "Sistem de Fișiere",
|
||||
"disk-io-read": "Citire",
|
||||
"disk-io-write": "Scriere",
|
||||
"system-load-desc": "Numărul de procese așteptând în coada de execuție, mediat pe toate nucleele"
|
||||
},
|
||||
"system-info": {
|
||||
"uptime": "Timp de Funcționare"
|
||||
},
|
||||
"flight-data": {
|
||||
"arrivals": "Sosiri",
|
||||
"departures": "Plecări"
|
||||
},
|
||||
"tfl-status": {
|
||||
"good-service-all": "Servicii Bune pe Toate Liniile",
|
||||
"good-service-rest": "Servicii Bune pe Celelalte Linii"
|
||||
},
|
||||
"synology-download": {
|
||||
"download": "Descărcare",
|
||||
"upload": "Încărcare",
|
||||
"downloaded": "Descărcat",
|
||||
"uploaded": "Încărcat",
|
||||
"remaining": "Rămas",
|
||||
"up": "Sus",
|
||||
"down": "Jos"
|
||||
},
|
||||
"gluetun-status": {
|
||||
"vpn-ip": "IP VPN",
|
||||
"country": "Țară",
|
||||
"region": "Regiune",
|
||||
"city": "Oraș",
|
||||
"post-code": "Cod Poștal",
|
||||
"location": "Locație",
|
||||
"timezone": "Fus Orar",
|
||||
"organization": "Organizație"
|
||||
},
|
||||
"nextcloud": {
|
||||
"active": "activ",
|
||||
"and": "și",
|
||||
"applications": "aplicații",
|
||||
"available": "disponibil",
|
||||
"away": "Plecat",
|
||||
"cache-full": "CACHE PLIN",
|
||||
"chat-room": "camera de chat",
|
||||
"delete-all": "Șterge tot",
|
||||
"delete-notification": "Șterge notificarea",
|
||||
"disabled": "dezactivat",
|
||||
"disk-quota": "Cotă de Disc",
|
||||
"disk-space": "Spațiu pe Disc",
|
||||
"dnd": "Nu Deranja",
|
||||
"email": "email",
|
||||
"enabled": "activat",
|
||||
"federated-shares-ucfirst": "Partajări Federate",
|
||||
"federated-shares": "partajări federate",
|
||||
"files": "fișier{plural}",
|
||||
"free": "liber",
|
||||
"groups": "grupuri",
|
||||
"hit-rate": "rata de accesare",
|
||||
"hits": "accesări",
|
||||
"home": "acasă",
|
||||
"in": "în",
|
||||
"keys": "chei",
|
||||
"last-24-hours": "ultimele 24 de ore",
|
||||
"last-5-minutes": "în ultimele 5 minute",
|
||||
"last-hour": "în ultima oră",
|
||||
"last-login": "Ultima autentificare",
|
||||
"last-restart": "Ultimul restart",
|
||||
"load-averages": "Mediile de Încărcare pe toate nucleele CPU",
|
||||
"local-shares": "Partajări Locale",
|
||||
"local": "local",
|
||||
"max-keys": "chei maxime",
|
||||
"memory-used": "memorie utilizată",
|
||||
"memory-utilisation": "utilizarea memoriei",
|
||||
"memory": "memorie",
|
||||
"misses": "rateuri",
|
||||
"no-notifications": "Fără notificări",
|
||||
"no-pending-updates": "fără actualizări în așteptare",
|
||||
"nothing-to-show": "Nimic de afișat aici în acest moment",
|
||||
"of-which": "din care",
|
||||
"of": "din",
|
||||
"offline": "Deconectat",
|
||||
"online": "Conectat",
|
||||
"other": "alt",
|
||||
"overall": "În total",
|
||||
"private-link": "link privat",
|
||||
"public-link": "link public",
|
||||
"quota-enabled": "Cota de Disc este {not}activată pentru acest utilizator",
|
||||
"received": "primit",
|
||||
"scripts": "scripturi",
|
||||
"sent": "trimis",
|
||||
"started": "Început",
|
||||
"storages-by-type": "Stocări pe tip",
|
||||
"storages": "stocare{plural}",
|
||||
"strings-use": "utilizare șiruri",
|
||||
"tasks": "Sarcini",
|
||||
"total-files": "total fișiere",
|
||||
"total-users": "total utilizatori",
|
||||
"total": "total",
|
||||
"until": "Până la",
|
||||
"updates-available-for": "Actualizări disponibile pentru",
|
||||
"updates-available": "actualizare{plural} disponibilă",
|
||||
"used": "utilizat",
|
||||
"user": "utilizator",
|
||||
"using": "utilizând",
|
||||
"version": "versiune",
|
||||
"wasted": "pierdut"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,50 +1,96 @@
|
|||
{
|
||||
"home": {
|
||||
"no-results": "Нет Результатов Поиска",
|
||||
"no-data": "Данные не настроены"
|
||||
"no-results": "Нет результатов",
|
||||
"no-data": "Данные не настроены",
|
||||
"no-items-section": "Данные загружаются"
|
||||
},
|
||||
"search": {
|
||||
"search-label": "Поиск",
|
||||
"search-placeholder": "Начните вводить, чтобы отфильтровать",
|
||||
"clear-search-tooltip": "Очистить поиск",
|
||||
"search-placeholder": "Начните вводить фильтр",
|
||||
"clear-search-tooltip": "Очистить",
|
||||
"enter-to-search-web": "Нажмите \"Ввод\" для поиска в Интернете"
|
||||
},
|
||||
"splash-screen": {
|
||||
"loading": "Загрузка"
|
||||
},
|
||||
"login": {
|
||||
"title": "Даши",
|
||||
"title": "Dashy",
|
||||
"guest-label": "Гостевой доступ",
|
||||
"username-label": "Имя пользователя",
|
||||
"password-label": "Пароль",
|
||||
"login-button": "Авторизоваться",
|
||||
"remember-me-label": "Помни меня за",
|
||||
"login-button": "Войти",
|
||||
"remember-me-label": "Запомнить меня на",
|
||||
"remember-me-never": "Никогда",
|
||||
"remember-me-hour": "4 часа",
|
||||
"remember-me-day": "1 день",
|
||||
"remember-me-week": "1 неделя",
|
||||
"remember-me-week": "1 неделю",
|
||||
"remember-me-long-time": "Надолго",
|
||||
"error-missing-username": "Отсутствует имя пользователя",
|
||||
"error-missing-password": "Отсутствует пароль",
|
||||
"error-incorrect-username": "Пользователь не найден",
|
||||
"error-incorrect-password": "Неверный пароль",
|
||||
"success-message": "Вход в систему...",
|
||||
"logout-message": "Вышли из",
|
||||
"already-logged-in-title": "Уже вошли в систему",
|
||||
"logout-message": "Вы вышли из системы",
|
||||
"already-logged-in-title": "Вы уже вошли в систему",
|
||||
"already-logged-in-text": "Вы вошли как",
|
||||
"proceed-to-dashboard": "Перейти на панель управления",
|
||||
"proceed-to-dashboard": "Перейти к панели управления",
|
||||
"log-out-button": "Выйти",
|
||||
"proceed-guest-button": "Продолжить как гость"
|
||||
"proceed-guest-button": "Продолжить как гость",
|
||||
"guest-intro-1": "Этот экземпляр приложения имеет гостевой доступ.",
|
||||
"guest-intro-2": "Гости имеют имеют доступ к панелям управления только для чтения, так что они не могут записать изменения на диск.",
|
||||
"error": "Ошибка",
|
||||
"error-no-user-configured": "Аутентификация отключена или не было настроено ни одного пользователя.",
|
||||
"error-go-home-button": "Домой",
|
||||
"logged-in-guest": "Вы вошли как гость, переадресация...",
|
||||
"error-guest-access": "Гостевой доступ запрещён"
|
||||
},
|
||||
"app-info": {
|
||||
"title": "Информация о Приложении",
|
||||
"error-log": "Журнал Ошибок",
|
||||
"no-errors": "Ошибок не зафиксировано",
|
||||
"help-support": "Помощь и Поддержка",
|
||||
"help-support-description" : "Для получения поддержки в запуске и настройке Dashy, обратитесь за помощью на",
|
||||
"help-support-discussions": "страницу Discussions",
|
||||
"support-dashy": "Поддержать Dashy",
|
||||
"support-dashy-description": "Если вы хотите поддержать проект, пожалуйста посетите страницу",
|
||||
"support-dashy-link": "Contributions",
|
||||
"report-bug": "Сообщить об ошибке",
|
||||
"report-bug-description": "Если вы считаете, что нашли ошибку, пожалуйста",
|
||||
"report-bug-link": "сообщите о проблеме",
|
||||
"more-info": "Больше информации",
|
||||
"source": "Исходный код",
|
||||
"documentation": "Документация",
|
||||
"privacy-and-security": "Приватность и Безопасность",
|
||||
"privacy-and-security-l1": "Для получения подробной информации о том, как Dashy управляет вашими данными, см.",
|
||||
"privacy-and-security-privacy-policy": "Политика Приватности",
|
||||
"privacy-and-security-advice": "Для получения рекомендаций по обеспечению безопасности вашей панели управления вы можете обратиться к",
|
||||
"privacy-and-security-advice-link": "Документации по Управлению",
|
||||
"privacy-and-security-security-issue": "Если вы обнаружили потенциальную проблему безопасности, сообщите о ней, в соответствии с нашей",
|
||||
"privacy-and-security-security-policy": "Политикой Безопасности",
|
||||
"license": "Лицензия",
|
||||
"license-under": "Лицензировано под",
|
||||
"licence-third-party": "Лицензии на модули сторонних производителей см.",
|
||||
"licence-third-party-link": "Legal",
|
||||
"list-contributors": "Чтобы посмотреть полный список авторов и благодарностей, см.",
|
||||
"list-contributors-link": "Credits",
|
||||
"version": "Версия"
|
||||
},
|
||||
"config": {
|
||||
"main-tab": "Главное меню",
|
||||
"view-config-tab": "Просмотр конфигурации",
|
||||
"view-config-tab": "Посмотреть конфигурацию",
|
||||
"edit-config-tab": "Изменить конфигурацию",
|
||||
"custom-css-tab": "Пользовательские стили",
|
||||
"custom-css-tab": "Пользовательский CSS",
|
||||
"heading": "Варианты конфигурации",
|
||||
"download-config-button": "Скачать конфигурацию",
|
||||
"edit-config-button": "Изменить конфигурацию",
|
||||
"edit-css-button": "Редактировать собственный CSS",
|
||||
"edit-css-button": "Редактировать пользовательский CSS",
|
||||
"cloud-sync-button": "Включить облачную синхронизацию",
|
||||
"edit-cloud-sync-button": "Изменить Cloud Sync",
|
||||
"rebuild-app-button": "Восстановить приложение",
|
||||
"change-language-button": "Изменить язык приложения",
|
||||
"edit-cloud-sync-button": "Изменить облачную синхронизацию",
|
||||
"rebuild-app-button": "Пересобрать приложение",
|
||||
"change-language-button": "Выбрать язык",
|
||||
"reset-settings-button": "Сбросить локальные настройки",
|
||||
"disabled-note": "Некоторые пункты конфигурации были отключены вашим администратором",
|
||||
"small-screen-note": "Вы используете слишком маленький дисплей, некоторые страницы могут не быть оптимальны",
|
||||
"app-info-button": "Информация о приложении",
|
||||
"backup-note": "Перед внесением изменений рекомендуется сделать резервную копию вашей конфигурации.",
|
||||
"reset-config-msg-l1": "Это удалит все пользовательские настройки из локального хранилища, но не повлияет на ваш файл conf.yml.",
|
||||
|
|
@ -52,69 +98,77 @@
|
|||
"reset-config-msg-l3": "Вы уверены, что хотите продолжить?",
|
||||
"data-cleared-msg": "Данные успешно очищены",
|
||||
"actions-label": "Действия",
|
||||
"copy-config-label": "Копировать конфигурацию",
|
||||
"copy-config-label": "Скопировать конфигурацию",
|
||||
"data-copied-msg": "Конфиг скопирован в буфер обмена",
|
||||
"reset-config-label": "Сбросить конфигурацию",
|
||||
"css-save-btn": "Сохранить изменения",
|
||||
"css-note-label": "Примечание",
|
||||
"css-note-l1": "Вам нужно будет обновить страницу, чтобы изменения вступили в силу.",
|
||||
"css-note-l2": "Переопределения стилей хранятся только локально, поэтому рекомендуется сделать копию вашего CSS.",
|
||||
"css-note-l3": "Чтобы удалить все пользовательские стили, удалите содержимое и нажмите «Сохранить изменения»."
|
||||
"css-note-l3": "Чтобы удалить все пользовательские стили, удалите содержимое и нажмите «Сохранить изменения».",
|
||||
"custom-css": {
|
||||
"title": "Пользовательский CSS",
|
||||
"base-theme": "Базовая Тема"
|
||||
}
|
||||
},
|
||||
"alternate-views": {
|
||||
"alternate-view-heading": "Переключить вид",
|
||||
"default": "Дефолт",
|
||||
"default": "По умолчанию",
|
||||
"workspace": "Рабочая среда",
|
||||
"minimal": "Минимальный"
|
||||
},
|
||||
"settings": {
|
||||
"theme-label": "Тема",
|
||||
"layout-label": "Макет",
|
||||
"layout-label": "Сетка",
|
||||
"layout-auto": "Авто",
|
||||
"layout-horizontal": "По горизонтали",
|
||||
"layout-vertical": "Вертикальный",
|
||||
"layout-horizontal": "Горизонтальная",
|
||||
"layout-vertical": "Вертикальная",
|
||||
"item-size-label": "Размер элемента",
|
||||
"item-size-small": "Небольшой",
|
||||
"item-size-medium": "Середина",
|
||||
"item-size-small": "Маленький",
|
||||
"item-size-medium": "Средний",
|
||||
"item-size-large": "Большой",
|
||||
"config-launcher-label": "Конфиг",
|
||||
"config-launcher-tooltip": "Обновить конфигурацию",
|
||||
"config-launcher-label": "Конфигурация",
|
||||
"config-launcher-tooltip": "Редактировать конфигурацию",
|
||||
"sign-out-tooltip": "Выход",
|
||||
"sign-in-tooltip": "Авторизоваться",
|
||||
"sign-in-welcome": "Здравствуйте, {username}!"
|
||||
"sign-in-welcome": "Здравствуйте, {username}!",
|
||||
"hide": "Скрыть",
|
||||
"open": "Открыть"
|
||||
},
|
||||
"updates": {
|
||||
"app-version-note": "Даши версия",
|
||||
"up-to-date": "Своевременно",
|
||||
"app-version-note": "Dashy версия",
|
||||
"up-to-date": "Последняя версия",
|
||||
"out-of-date": "Доступно обновление",
|
||||
"unsupported-version-l1": "Вы используете неподдерживаемую версию Dashy",
|
||||
"unsupported-version-l2": "Для оптимальной работы и получения последних исправлений безопасности, пожалуйста, обновите до"
|
||||
"unsupported-version-l2": "Для оптимальной работы и получения последних исправлений безопасности, пожалуйста, обновите приложение до версии"
|
||||
},
|
||||
"language-switcher": {
|
||||
"title": "Изменить язык приложения",
|
||||
"title": "Выбрать язык приложения",
|
||||
"dropdown-label": "Выберите язык",
|
||||
"save-button": "Сохранить",
|
||||
"success-msg": "Язык обновлен до"
|
||||
"success-msg": "Выбран язык: "
|
||||
},
|
||||
"theme-maker": {
|
||||
"title": "Конфигуратор темы",
|
||||
"export-button": "Экспорт пользовательских переменных",
|
||||
"reset-button": "Сбросить стили для",
|
||||
"reset-button": "Сбросить стили для темы",
|
||||
"show-all-button": "Показать все переменные",
|
||||
"change-fonts-button": "Выбрать шрифты",
|
||||
"save-button": "Сохранить",
|
||||
"cancel-button": "Отмена",
|
||||
"saved-toast": "{theme} Обновлено успешно",
|
||||
"copied-toast": "Данные темы для {theme} скопированы в буфер обмена",
|
||||
"reset-toast": "Пользовательские цвета для {theme} удалены"
|
||||
"saved-toast": "Тема {theme} успешно обновлена",
|
||||
"copied-toast": "Данные для темы {theme} скопированы в буфер обмена",
|
||||
"reset-toast": "Пользовательские цвета для темы {theme} удалены"
|
||||
},
|
||||
"config-editor": {
|
||||
"save-location-label": "Сохранить местоположение",
|
||||
"location-local-label": "Применять локально",
|
||||
"location-disk-label": "Запись изменений в файл конфигурации",
|
||||
"save-location-label": "Место сохранения",
|
||||
"location-local-label": "Применить локально",
|
||||
"location-disk-label": "Записать изменения в файл конфигурации на диск",
|
||||
"save-button": "Сохранить изменения",
|
||||
"valid-label": "Конфигурация действительна",
|
||||
"preview-button": "Предпросмотр",
|
||||
"valid-label": "Конфигурация верна",
|
||||
"status-success-msg": "Задача завершена",
|
||||
"status-fail-msg": "Сбой задачи",
|
||||
"status-fail-msg": "Задача была провалена",
|
||||
"success-msg-disk": "Файл конфигурации успешно записан на диск",
|
||||
"success-msg-local": "Локальные изменения успешно сохранены",
|
||||
"success-note-l1": "Приложение должно перестроиться автоматически.",
|
||||
|
|
@ -123,38 +177,39 @@
|
|||
"error-msg-save-mode": "Пожалуйста, выберите режим сохранения: локальный или файл",
|
||||
"error-msg-cannot-save": "Произошла ошибка при сохранении конфигурации",
|
||||
"error-msg-bad-json": "Ошибка в JSON, возможно, неверный формат",
|
||||
"warning-msg-validation": "Предупреждение о проверке",
|
||||
"warning-msg-validation": "Предупреждение валидатора",
|
||||
"not-admin-note": "Вы не можете записать измененные на диск, потому что вы не вошли в систему как администратор"
|
||||
},
|
||||
"app-rebuild": {
|
||||
"title": "Восстановить приложение",
|
||||
"rebuild-note-l1": "Чтобы изменения, записанные в файл conf.yml, вступили в силу, требуется перестройка.",
|
||||
"rebuild-note-l2": "Это должно произойти автоматически, но если этого не произошло, вы можете запустить это вручную здесь.",
|
||||
"rebuild-note-l3": "Это не требуется для изменений, хранящихся локально.",
|
||||
"title": "Пересобрать приложение",
|
||||
"rebuild-note-l1": "Чтобы изменения, записанные в файл conf.yml, вступили в силу, требуется пересборка.",
|
||||
"rebuild-note-l2": "Это должно произойти автоматически, но если этого не произошло, вы можете запустить её вручную здесь.",
|
||||
"rebuild-note-l3": "Заметьте, что эта функция доступна только для экземпляров приложения, которые запущены с помощью Node или Docker, но не для тех, которые запущенны статично",
|
||||
"rebuild-button": "Начать сборку",
|
||||
"rebuilding-status-1": "Строительство...",
|
||||
"rebuilding-status-1": "Сборка...",
|
||||
"rebuilding-status-2": "Это может занять несколько минут",
|
||||
"error-permission": "У вас нет разрешения запускать это действие",
|
||||
"error-permission": "У вас нет разрешения на запуск этого действия",
|
||||
"success-msg": "Сборка успешно завершена",
|
||||
"fail-msg": "Не удалось выполнить операцию сборки",
|
||||
"reload-note": "Теперь требуется перезагрузка страницы, чтобы изменения вступили в силу.",
|
||||
"reload-note": "Теперь нужно перезагрузить страницу, чтобы изменения вступили в силу.",
|
||||
"reload-button": "Перезагрузить страницу"
|
||||
},
|
||||
"cloud-sync": {
|
||||
"title": "Резервное копирование и восстановление в облаке",
|
||||
"intro-l1": "Резервное копирование и восстановление в облако - это дополнительная функция, которая позволяет вам загрузить свою конфигурацию в Интернет, а затем восстановить ее на любом другом устройстве или экземпляре Dashy.",
|
||||
"intro-l2": "Все данные полностью зашифрованы с помощью AES с использованием вашего пароля в качестве ключа.",
|
||||
"title": "Облачная конфигурация",
|
||||
"intro-l1": "Облачная конфигурация - это дополнительная функция, которая позволяет вам загрузить свою конфигурацию в Интернет, а затем восстановить ее на любом другом устройстве или экземпляре Dashy.",
|
||||
"intro-l2": "Все данные полностью зашифрованы с помощью сквозного шифрования, используя AES и ваш пароль в качестве ключа.",
|
||||
"intro-l3": "Для получения дополнительной информации см.",
|
||||
"backup-title-setup": "Сделать резервную копию",
|
||||
"intro-docs": "документацию",
|
||||
"backup-title-setup": "Создать резервную копию",
|
||||
"backup-title-update": "Обновить резервную копию",
|
||||
"password-label-setup": "Выберите пароль",
|
||||
"password-label-update": "Введите ваш пароль",
|
||||
"backup-button-setup": "Резервное копирование",
|
||||
"backup-button-setup": "Создать резервную копию",
|
||||
"backup-button-update": "Обновить резервную копию",
|
||||
"backup-id-label": "Ваш резервный идентификатор",
|
||||
"backup-id-note": "Это используется для восстановления из резервных копий позже. Так что храните его вместе со своим паролем в надежном месте.",
|
||||
"backup-id-note": "Он используется для восстановления из резервных копий позже. Так что сохраните его вместе со своим паролем в надежном месте.",
|
||||
"restore-title": "Восстановить резервную копию",
|
||||
"restore-id-label": "Восстановить ID",
|
||||
"restore-id-label": "Восстановить резервный идентификатор",
|
||||
"restore-password-label": "Пароль",
|
||||
"restore-button": "Восстановить",
|
||||
"backup-missing-password": "Отсутствует пароль",
|
||||
|
|
@ -164,9 +219,167 @@
|
|||
"restore-success-msg": "Конфигурация успешно восстановлена"
|
||||
},
|
||||
"menu": {
|
||||
"sametab": "Открыть в текущей вкладке",
|
||||
"newtab": "Открыть в новой вкладке",
|
||||
"modal": "Открыть в модальном всплывающем окне",
|
||||
"workspace": "Открыть в представлении рабочей области"
|
||||
"open-section-title": "Открыть в",
|
||||
"sametab": "Текущей вкладке",
|
||||
"newtab": "Новой вкладке",
|
||||
"modal": "Всплывающем окне",
|
||||
"workspace": "Рабочей области",
|
||||
"options-section-title": "Настройки",
|
||||
"edit-item": "Редактировать",
|
||||
"move-item": "Скопировать или переместить",
|
||||
"remove-item": "Удалить"
|
||||
},
|
||||
"context-menus": {
|
||||
"item": {
|
||||
"open-section-title": "Открыть в",
|
||||
"sametab": "Текущей вкладке",
|
||||
"newtab": "Новой вкладке",
|
||||
"modal": "Всплывающем окне",
|
||||
"workspace": "Рабочей области",
|
||||
"clipboard": "Копировать в буфер обмена",
|
||||
"options-section-title": "Настройки",
|
||||
"edit-item": "Редактировать",
|
||||
"move-item": "Скопировать или переместить",
|
||||
"remove-item": "Удалить",
|
||||
"copied-toast": "Ссылка была скопирована в буфер обмена"
|
||||
},
|
||||
"section": {
|
||||
"open-section": "Открыть секцию",
|
||||
"edit-section": "Редактировать",
|
||||
"expand-collapse": "Раскрыть / Свернуть",
|
||||
"move-section": "Переместить в",
|
||||
"remove-section": "Удалить"
|
||||
}
|
||||
},
|
||||
"footer": {
|
||||
"dev-by": "Разработано ",
|
||||
"licensed-under": "Лицензировано под",
|
||||
"get-the": "Получите",
|
||||
"source-code": "Исходный код"
|
||||
},
|
||||
"interactive-editor": {
|
||||
"menu": {
|
||||
"start-editing-tooltip": "Войти в режим редактирования",
|
||||
"edit-site-data-subheading": "Редактировать параметры сайта",
|
||||
"edit-page-info-btn": "Редактировать страницу",
|
||||
"edit-page-info-tooltip": "Заголовок приложения, описание, ссылки, текст снизу страницы и т. д.",
|
||||
"edit-app-config-btn": "Редактировать конфигурацию",
|
||||
"edit-app-config-tooltip": "Конфигурация всего остального приложения",
|
||||
"edit-pages-btn": "Редактировать страницы",
|
||||
"edit-pages-tooltip": "Добавить или удалить дополнительные страницы панели управления",
|
||||
"config-save-methods-subheading": "Сохранить конфигурацию",
|
||||
"save-locally-btn": "Локально",
|
||||
"save-locally-tooltip": "Сохранить конфигурацию локально, в хранилище браузера. Это не повлияет на ваш конфигурационный файл на диске, но изменения останутся на этом устройстве",
|
||||
"save-disk-btn": "На диск",
|
||||
"save-disk-tooltip": "Сначала создастся резервная копия текущей конфигурации, а затем она перезапишется новой версией",
|
||||
"export-config-btn": "Экспорт конфигурации",
|
||||
"export-config-tooltip": "Просмотреть и экспортировать новую конфигурацию, либо как файл, либо в буфер обмена",
|
||||
"cloud-backup-btn": "Облачное сохранение",
|
||||
"cloud-backup-tooltip": "Сохранить зашифрованный файл конфигурации в облачное хранилище",
|
||||
"edit-raw-config-btn": "Редактировать JSON конфигурации",
|
||||
"edit-raw-config-tooltip": "Просмотреть и редактировать файл конфигурации напрямую, через редактор JSON",
|
||||
"cancel-changes-btn": "Сбросить изменения",
|
||||
"cancel-changes-tooltip": "Сбросить текущие изменения и выйти из режима редактирования. Это не изменит сохранённую конфигурацию",
|
||||
"edit-mode-name": "Режим редактирования",
|
||||
"edit-mode-subtitle": "Вы находитесь в режиме редактирования",
|
||||
"edit-mode-description": "Это означает, что вы сможете делать изменения вашей конфигурации и просматривать их результат, но они не вступят в силу, пока вы не сохраните их",
|
||||
"save-stage-btn": "Сохранить",
|
||||
"cancel-stage-btn": "Отмена",
|
||||
"save-locally-warning": "Если вы продолжите, изменения будут сохранены только в вашем браузере. Чтобы использовать новую конфигурацию на других устройствах, экспортируйте её. Продолжить?"
|
||||
},
|
||||
"edit-item": {
|
||||
"missing-title-err": "Отсутствует заголовок элемента"
|
||||
},
|
||||
"edit-section": {
|
||||
"edit-section-title": "Редактировать секцию",
|
||||
"add-section-title": "Добавить новую секцию",
|
||||
"edit-tooltip": "Нажмите ЛКМ, чтобы редактировать или ПКМ для дополнительных опций",
|
||||
"remove-confirm": "Вы уверены, что хотите удалить эту секцию? Это действие можно отменить позже"
|
||||
},
|
||||
"edit-app-config": {
|
||||
"warning-msg-title": "Продолжайте с осторожностью",
|
||||
"warning-msg-l1": "Следующие настройки предназначены для продвинутой настройки приложения.",
|
||||
"warning-msg-l2": "Если вы сомневаетесь в том, что значит то или иное поле, пожалуйста ознакомьтесь с",
|
||||
"warning-msg-docs": "документацией",
|
||||
"warning-msg-l3": "для избежания непредвиденных последствий."
|
||||
},
|
||||
"export": {
|
||||
"export-title": "Экспорт конфигурации",
|
||||
"copy-clipboard-btn": "Скопировано в буфер обмена",
|
||||
"copy-clipboard-tooltip": "Скопировать всю конфигурацию приложения, в формате YAML",
|
||||
"download-file-btn": "Скачать как файл",
|
||||
"download-file-tooltip": "Скачать файл конфигурации на ваше устройство в формате YAML",
|
||||
"view-title": "Просмотреть конфигурацию"
|
||||
}
|
||||
},
|
||||
"critical-error": {
|
||||
"title": "Ошибка загрузки конфигурации",
|
||||
"subtitle": "Приложение не смогло загрузиться из-за ошибки в конфигурации.",
|
||||
"sub-ensure-that": "Удостоверьтесь, что",
|
||||
"sub-error-details": "Сведения об ошибке",
|
||||
"sub-next-steps": "Следующие шаги",
|
||||
"ignore-button": "Игнорировать критические ошибки"
|
||||
},
|
||||
"widgets": {
|
||||
"general": {
|
||||
"loading": "Загрузка...",
|
||||
"show-more": "Развернуть сведения",
|
||||
"cpu-details": "Сведения о ЦПУ",
|
||||
"mem-details": "Сведения о памяти",
|
||||
"show-less": "Показать меньше",
|
||||
"open-link": "Продолжить чтение"
|
||||
},
|
||||
"pi-hole": {
|
||||
"status-heading": "Статус"
|
||||
},
|
||||
"stat-ping": {
|
||||
"up": "Онлайн",
|
||||
"down": "Оффлайн"
|
||||
},
|
||||
"net-data": {
|
||||
"cpu-chart-title": "История ЦПУ",
|
||||
"mem-chart-title": "Использование памяти",
|
||||
"mem-breakdown-title": "Подробности об использовании памяти",
|
||||
"load-chart-title": "Нагрузка системы"
|
||||
},
|
||||
"glances": {
|
||||
"disk-space-free": "Свободно",
|
||||
"disk-space-used": "Использовано",
|
||||
"disk-mount-point": "Путь монитрования",
|
||||
"disk-file-system": "Файловая система",
|
||||
"disk-io-read": "Чтение",
|
||||
"disk-io-write": "Запись",
|
||||
"system-load-desc": "Количество процессов, ожидающих в очереди запуска, усреднённое между всеми ядрами процессора"
|
||||
},
|
||||
"system-info": {
|
||||
"uptime": "Время работы"
|
||||
},
|
||||
"flight-data": {
|
||||
"arrivals": "Прибытия",
|
||||
"departures": "Отправления"
|
||||
},
|
||||
"tfl-status": {
|
||||
"good-service-all": "Хорошее обслуживание на всех линиях",
|
||||
"good-service-rest": "Хорошее обслуживание на всех остальных линиях"
|
||||
},
|
||||
"synology-download": {
|
||||
"download": "Скачивание",
|
||||
"upload": "Загрузка",
|
||||
"downloaded": "Скачано",
|
||||
"uploaded": "Загружено",
|
||||
"remaining": "Остаётся",
|
||||
"up": "Вверх",
|
||||
"down": "Вниз"
|
||||
},
|
||||
"gluetun-status": {
|
||||
"vpn-ip": "VPN IP",
|
||||
"country": "Страна",
|
||||
"region": "Регион",
|
||||
"city": "Город",
|
||||
"post-code": "Индекс",
|
||||
"location": "Местоположение",
|
||||
"timezone": "Часовой пояс",
|
||||
"organization": "Организация"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,6 +10,9 @@
|
|||
"clear-search-tooltip":"Rensa sök",
|
||||
"enter-to-search-web":"Tryck på retur för att söka på webben"
|
||||
},
|
||||
"splash-screen": {
|
||||
"loading": "Laddar"
|
||||
},
|
||||
"login":{
|
||||
"title":"Dashy",
|
||||
"username-label":"Användarnamn",
|
||||
|
|
@ -83,7 +86,9 @@
|
|||
"config-launcher-tooltip":"Uppdatera konfiguration",
|
||||
"sign-out-tooltip":"Logga ut",
|
||||
"sign-in-tooltip":"Logga in",
|
||||
"sign-in-welcome":"Hej {username}!"
|
||||
"sign-in-welcome":"Hej {username}!",
|
||||
"hide": "Göm",
|
||||
"open": "Öppna"
|
||||
},
|
||||
"updates":{
|
||||
"app-version-note":"Dashy-version",
|
||||
|
|
@ -185,14 +190,17 @@
|
|||
"newtab":"Ny flik",
|
||||
"modal":"Pop-Up Modal",
|
||||
"workspace":"Workspace View",
|
||||
"clipboard": "Kopiera till urklipp",
|
||||
"options-section-title":"Alternativ",
|
||||
"edit-item":"Redigera",
|
||||
"move-item":"Kopiera eller flytta",
|
||||
"remove-item":"Ta bort"
|
||||
"remove-item":"Ta bort",
|
||||
"copied-toast": "URLen har blivit kopierad till urklipp"
|
||||
},
|
||||
"section":{
|
||||
"open-section":"Öppna sektion",
|
||||
"edit-section":"Redigera",
|
||||
"expand-collapse": "Expandera / Minimera",
|
||||
"move-section":"Flytta till",
|
||||
"remove-section":"Ta bort"
|
||||
}
|
||||
|
|
@ -205,6 +213,8 @@
|
|||
"edit-page-info-tooltip":"Appnamn, beskrivning, navigeringslänkar, sidfotstext, etc",
|
||||
"edit-app-config-btn":"Redigera appkonfiguration",
|
||||
"edit-app-config-tooltip":"Övriga appkonfigurationsalternativ",
|
||||
"edit-pages-btn": "Editera sidor",
|
||||
"edit-pages-tooltip": "Lägg till eller ta bort ytterligare vyer",
|
||||
"config-save-methods-subheading":"Alternativ för konfigurationssparande",
|
||||
"save-locally-btn":"Spara lokalt",
|
||||
"save-locally-tooltip":"Spara konfigurationen lokalt, till webbläsarens lagring. Detta påverkar inte din konfigurationsfil, men ändringarna sparas bara på denna enhet",
|
||||
|
|
@ -269,6 +279,15 @@
|
|||
"mem-breakdown-title":"Memory Breakdown",
|
||||
"load-chart-title":"System Load"
|
||||
},
|
||||
"glances": {
|
||||
"disk-space-free": "Ledigt",
|
||||
"disk-space-used": "Utnyttjat",
|
||||
"disk-mount-point": "Mount Point",
|
||||
"disk-file-system": "Filsystem",
|
||||
"disk-io-read": "Läs",
|
||||
"disk-io-write": "Skriv",
|
||||
"system-load-desc": "Antal processer som väntar i run-queue, i genomsnitt över alla kärnor"
|
||||
},
|
||||
"system-info":{
|
||||
"uptime":"Uptime"
|
||||
},
|
||||
|
|
@ -279,6 +298,87 @@
|
|||
"tfl-status":{
|
||||
"good-service-all":"God service på alla linjer",
|
||||
"good-service-rest":"God Service på övriga linjer"
|
||||
},
|
||||
"gluetun-status": {
|
||||
"vpn-ip": "VPN IP",
|
||||
"country": "Land",
|
||||
"region": "Region",
|
||||
"city": "Stad",
|
||||
"post-code": "Postnummer",
|
||||
"location": "Plats",
|
||||
"timezone": "Tidszon",
|
||||
"organization": "Organisation"
|
||||
},
|
||||
"nextcloud": {
|
||||
"active": "aktiv",
|
||||
"and": "och",
|
||||
"applications": "applikationer",
|
||||
"available": "Tillgänglig",
|
||||
"away": "Borta",
|
||||
"cache-full": "CACHE FULL",
|
||||
"chat-room": "chattrum",
|
||||
"delete-all": "Ta bort alla",
|
||||
"delete-notification": "Ta bort notifikationer",
|
||||
"disabled": "Inaktiverad",
|
||||
"disk-quota": "Disk Quota",
|
||||
"disk-space": "Diskutrymme",
|
||||
"dnd": "Stör ej",
|
||||
"email": "mejl",
|
||||
"enabled": "aktiverad",
|
||||
"federated-shares-ucfirst": "Federated shares",
|
||||
"federated-shares": "federated shares",
|
||||
"files": "file{plural}",
|
||||
"free": "ledig",
|
||||
"groups": "grupper",
|
||||
"hit-rate": "hit rate",
|
||||
"hits": "hits",
|
||||
"home": "hem",
|
||||
"in": "in",
|
||||
"keys": "nycklar",
|
||||
"last-24-hours": "senaste 24 timmarna",
|
||||
"last-5-minutes": "under de senaste 5 minuterna",
|
||||
"last-hour": "under den senaste timmen",
|
||||
"last-login": "Senaste inlogg",
|
||||
"last-restart": "Senaste omstart",
|
||||
"load-averages": "Genomsnittlig belastning över alla CPU kärnor",
|
||||
"local-shares": "Local shares",
|
||||
"local": "local",
|
||||
"max-keys": "maximalt antal nycklar",
|
||||
"memory-used": "memory used",
|
||||
"memory-utilisation": "memory utilization",
|
||||
"memory": "minne",
|
||||
"misses": "misses",
|
||||
"no-notifications": "Inga notifieringar",
|
||||
"no-pending-updates": "Inga avvacktande uppdateringar",
|
||||
"nothing-to-show": "Inget att visa för tillfället",
|
||||
"of-which": "av vilket",
|
||||
"of": "av",
|
||||
"offline": "Offline",
|
||||
"online": "Online",
|
||||
"other": "other",
|
||||
"overall": "Totalt",
|
||||
"private-link": "privat länk",
|
||||
"public-link": "publik länk",
|
||||
"quota-enabled": "Disk Quota är {not}aktiverat för denna användare",
|
||||
"received": "mottaget",
|
||||
"scripts": "skript",
|
||||
"sent": "skickat",
|
||||
"started": "Startat",
|
||||
"storages-by-type": "Lagring efter typ",
|
||||
"storages": "lagring{plural}",
|
||||
"strings-use": "strings use",
|
||||
"tasks": "Uppgifter",
|
||||
"total-files": "totalt antal filer",
|
||||
"total-users": "totalt antal användare",
|
||||
"total": "totalt",
|
||||
"until": "Tills",
|
||||
"updates-available-for": "Uppdateringar är tillgängliga för",
|
||||
"updates-available": "uppdatering{plural} tillgänglig",
|
||||
"used": "använt",
|
||||
"user": "användare",
|
||||
"using": "använder",
|
||||
"version": "version",
|
||||
"wasted": "onödig"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,446 +0,0 @@
|
|||
{
|
||||
"home": {
|
||||
"no-results": "Немає результатів пошуку",
|
||||
"no-data": "Дані не налаштовано",
|
||||
"no-items-section": "Поки що немає елементів для показу"
|
||||
},
|
||||
"search": {
|
||||
"search-label": "Пошук",
|
||||
"search-placeholder": "Почніть друкувати для фільтрування",
|
||||
"clear-search-tooltip": "Очистити пошук",
|
||||
"enter-to-search-web": "Натисніть enter для пошуку в Інтернеті"
|
||||
},
|
||||
"splash-screen": {
|
||||
"loading": "Завантаження"
|
||||
},
|
||||
"login": {
|
||||
"title": "Dashy",
|
||||
"guest-label": "Гостьовий доступ",
|
||||
"username-label": "Ім'я користувача",
|
||||
"password-label": "Пароль",
|
||||
"login-button": "Увійти",
|
||||
"remember-me-label": "Запам'ятати мене для",
|
||||
"remember-me-never": "Ніколи не запамʼятовувати",
|
||||
"remember-me-hour": "4 години",
|
||||
"remember-me-day": "1 день",
|
||||
"remember-me-week": "1 тиждень",
|
||||
"remember-me-long-time": "Довгий час",
|
||||
"error-missing-username": "Відсутнє ім'я користувача",
|
||||
"error-missing-password": "Відсутній пароль",
|
||||
"error-incorrect-username": "Користувача не знайдено",
|
||||
"error-incorrect-password": "Неправильний пароль",
|
||||
"success-message": "Вхід...",
|
||||
"logout-message": "Вихід",
|
||||
"already-logged-in-title": "Вхід вже виконано",
|
||||
"already-logged-in-text": "Ви ввійшли як",
|
||||
"proceed-to-dashboard": "Перейти до інформаційної панелі",
|
||||
"log-out-button": "Вийти",
|
||||
"proceed-guest-button": "Продовжити як гість",
|
||||
"guest-intro-1": "Цей інстанс має гостьовий доступ.",
|
||||
"guest-intro-2": "Гості мають доступ лише для перегляду до інформаційних панелей, тому не можуть записати жодних змін на диск.",
|
||||
"error": "Помилка",
|
||||
"error-no-user-configured": "Автентифікацію не ввімкнено, або користувачі не налаштовані",
|
||||
"error-go-home-button": "Повернутися додому",
|
||||
"logged-in-guest": "Увійшли як гість, переспрямування...",
|
||||
"error-guest-access": "Гостьовий доступ заборонено"
|
||||
},
|
||||
"app-info": {
|
||||
"title": "Інформація про програму",
|
||||
"error-log": "Журнал помилок",
|
||||
"no-errors": "Останніх помилок не виявлено",
|
||||
"help-support": "Допомога та підтримка",
|
||||
"help-support-description": "Щоб отримати підтримку щодо запуску чи налаштування Dashy, див.",
|
||||
"help-support-discussions": "Обговорення",
|
||||
"support-dashy": "Підтримка Dashy",
|
||||
"support-dashy-description": "Щоб дізнатися, як ви можете взяти участь, перегляньте",
|
||||
"support-dashy-link": "Сторінка внесків",
|
||||
"report-bug": "Повідомити про помилку",
|
||||
"report-bug-description": "Якщо ви вважаєте, що знайшли помилку, будь ласка",
|
||||
"report-bug-link": "повідомте про проблему",
|
||||
"more-info": "Докладніше",
|
||||
"source": "Джерело",
|
||||
"documentation": "Документація",
|
||||
"privacy-and-security": "Конфіденційність та безпека",
|
||||
"privacy-and-security-l1": "Для детальної інформації про те, як Dashy керує вашими даними, див.",
|
||||
"privacy-and-security-privacy-policy": "Політика конфіденційності",
|
||||
"privacy-and-security-advice": "Щоб отримати поради щодо захисту вашої інформаційної панелі, ви можете звернутися до розділу",
|
||||
"privacy-and-security-advice-link": "Документи керування",
|
||||
"privacy-and-security-security-issue": "Якщо ви виявили потенційну проблему з безпекою, повідомте про це до розділу",
|
||||
"privacy-and-security-security-policy": "Політика безпеки",
|
||||
"license": "Ліцензія",
|
||||
"license-under": "Ліцензія згідно",
|
||||
"licence-third-party": "Ліцензії на сторонні модулі див.",
|
||||
"licence-third-party-link": "Юридична інформація",
|
||||
"list-contributors": "Повний список співавторів та подяки див.",
|
||||
"list-contributors-link": "Кредити",
|
||||
"version": "Версія"
|
||||
},
|
||||
"config": {
|
||||
"main-tab": "Головне меню",
|
||||
"view-config-tab": "Переглянути конфігурацію",
|
||||
"edit-config-tab": "Редагувати конфігурацію",
|
||||
"custom-css-tab": "Власні стилі",
|
||||
"heading": "Параметри конфігурації",
|
||||
"download-config-button": "Переглянути / Експортувати конфігурацію",
|
||||
"edit-config-button": "Редагувати конфігурацію",
|
||||
"edit-css-button": "Редагувати власний CSS",
|
||||
"cloud-sync-button": "Увімкнути хмарну синхронізацію",
|
||||
"edit-cloud-sync-button": "Редагувати хмарну синхронізацію",
|
||||
"rebuild-app-button": "Перебудувати програму",
|
||||
"change-language-button": "Змінити мову програми",
|
||||
"reset-settings-button": "Скинути локальні налаштування",
|
||||
"disabled-note": "Деякі функції конфігурації були відключені вашим адміністратором",
|
||||
"small-screen-note": "Ви використовуєте дуже маленький екран, і деякі екрани в цьому меню можуть бути не найкращими",
|
||||
"app-info-button": "Інформація про програму",
|
||||
"backup-note": "Рекомендовано зробити резервну копію конфігурації перед внесенням змін.",
|
||||
"reset-config-msg-l1": "Це видалить усі налаштування користувача з локального сховища, але не вплине на ваш файл 'conf.yml'.",
|
||||
"reset-config-msg-l2": "Ви повинні спочатку створити резервну копію будь-яких змін, які ви внесли локально, якщо ви хочете використовувати їх у майбутньому.",
|
||||
"reset-config-msg-l3": "Ви впевнені, що бажаєте продовжити?",
|
||||
"data-cleared-msg": "Дані успішно видалено",
|
||||
"actions-label": "Дії",
|
||||
"copy-config-label": "Копіювати конфігурацію",
|
||||
"data-copied-msg": "Конфігурацію скопійовано до буфера обміну",
|
||||
"reset-config-label": "Скинути конфігурацію",
|
||||
"css-save-btn": "Зберегти зміни",
|
||||
"css-note-label": "Примітка",
|
||||
"css-note-l1": "Вам потрібно буде оновити сторінку, щоб ваші зміни набули чинності.",
|
||||
"css-note-l2": "Заміни стилів зберігаються лише локально, тому рекомендується зробити копію вашого CSS.",
|
||||
"css-note-l3": "Щоб видалити всі спеціальні стилі, видаліть вміст та натисніть Зберегти зміни",
|
||||
"custom-css": {
|
||||
"title": "Власні стилі",
|
||||
"base-theme": "Базова тема"
|
||||
}
|
||||
},
|
||||
"alternate-views": {
|
||||
"alternate-view-heading": "Змінити перегляд",
|
||||
"default": "За замовчуванням",
|
||||
"workspace": "Робоча область",
|
||||
"minimal": "Мінімальний"
|
||||
},
|
||||
"settings": {
|
||||
"theme-label": "Тема",
|
||||
"layout-label": "Макет",
|
||||
"layout-auto": "Авто",
|
||||
"layout-horizontal": "Горизонтально",
|
||||
"layout-vertical": "Вертикально",
|
||||
"item-size-label": "Розмір",
|
||||
"item-size-small": "Маленький",
|
||||
"item-size-medium": "Середній",
|
||||
"item-size-large": "Великий",
|
||||
"config-launcher-label": "Конфіг",
|
||||
"config-launcher-tooltip": "Оновити конфігурацію",
|
||||
"sign-out-tooltip": "Вийти",
|
||||
"sign-in-tooltip": "Увійти",
|
||||
"sign-in-welcome": "Привіт {username}!",
|
||||
"hide": "Приховати",
|
||||
"open": "Відкрити"
|
||||
},
|
||||
"updates": {
|
||||
"app-version-note": "Версія Dashy",
|
||||
"up-to-date": "Оновити",
|
||||
"out-of-date": "Оновлення доступне",
|
||||
"unsupported-version-l1": "Ви використовуєте непідтримувану версію Dashy",
|
||||
"unsupported-version-l2": "Для найкращого досвіду та останніх виправлень безпеки, будь ласка, оновіться"
|
||||
},
|
||||
"language-switcher": {
|
||||
"title": "Змінити мову програми",
|
||||
"dropdown-label": "Оберіть мову",
|
||||
"save-button": "Зберегти",
|
||||
"success-msg": "Мову оновлено"
|
||||
},
|
||||
"theme-maker": {
|
||||
"title": "Конфігуратор теми",
|
||||
"export-button": "Експорт змінних користувача",
|
||||
"reset-button": "Скинути стилі",
|
||||
"show-all-button": "Показати всі змінні",
|
||||
"change-fonts-button": "Змінити шрифти",
|
||||
"save-button": "Зберегти",
|
||||
"cancel-button": "Скасувати",
|
||||
"saved-toast": "{theme} успішно оновлена",
|
||||
"copied-toast": "Дані теми для {theme} скопійовано в буфер обміну",
|
||||
"reset-toast": "Кольори користувача для {theme} видалено"
|
||||
},
|
||||
"config-editor": {
|
||||
"save-location-label": "Зберегти розташування",
|
||||
"location-local-label": "Застосувати локально",
|
||||
"location-disk-label": "Записати зміни до файлу конфігурації",
|
||||
"save-button": "Зберегти зміни",
|
||||
"preview-button": "Попередній перегляд змін",
|
||||
"valid-label": "Конфігурація дійсна",
|
||||
"status-success-msg": "Завдання виконано",
|
||||
"status-fail-msg": "Завдання не виконано",
|
||||
"success-msg-disk": "Файл конфігурації успішно записаний на диск",
|
||||
"success-msg-local": "Локальні зміни успішно збережено",
|
||||
"success-note-l1": "Програма повинна автоматично перебудуватися.",
|
||||
"success-note-l2": "Це може зайняти до хвилини.",
|
||||
"success-note-l3": "Вам потрібно буде оновити сторінку, щоб зміни набули чинності.",
|
||||
"error-msg-save-mode": "Будь ласка, виберіть режим збереження: локальний або файловий",
|
||||
"error-msg-cannot-save": "Під час збереження конфігурації сталася помилка",
|
||||
"error-msg-bad-json": "Помилка в JSON, можливо, неправильний формат",
|
||||
"warning-msg-validation": "Попередження про перевірку",
|
||||
"not-admin-note": "Ви не можете записати зміни на диск, оскільки ви не увійшли як адміністратор"
|
||||
},
|
||||
"app-rebuild": {
|
||||
"title": "Перебудувати програму",
|
||||
"rebuild-note-l1": "Перебудова потрібна, щоб зміни, записані у файл conf.yml, набули чинності.",
|
||||
"rebuild-note-l2": "Це має статися автоматично, але якщо цього не сталося, ви можете запустити це звідси вручну.",
|
||||
"rebuild-note-l3": "Це не потрібно для змін, які зберігаються локально.",
|
||||
"rebuild-button": "Почати збірку",
|
||||
"rebuilding-status-1": "Збираємо...",
|
||||
"rebuilding-status-2": "Це може зайняти кілька хвилин",
|
||||
"error-permission": "У вас немає дозволу ініціювати цю дію",
|
||||
"success-msg": "Збірку завершено успішно",
|
||||
"fail-msg": "Помилка операції збирання",
|
||||
"reload-note": "Тепер потрібно перезавантажити сторінку, щоб зміни набули чинності",
|
||||
"reload-button": "Перезавантажити сторінку"
|
||||
},
|
||||
"cloud-sync": {
|
||||
"title": "Резервне копіювання та відновлення в хмарі",
|
||||
"intro-l1": "Резервне копіювання та відновлення в хмарі є додатковою функцією, яка дає змогу завантажити вашу конфігурацію в Інтернет, а потім відновити її на будь-якому іншому пристрої чи екземплярі Dashy.",
|
||||
"intro-l2": "Усі дані повністю зашифровані за допомогою AES із використанням вашого пароля як ключа.",
|
||||
"intro-l3": "Для отримання додаткової інформації див.",
|
||||
"intro-docs": "документи",
|
||||
"backup-title-setup": "Створити резервну копію",
|
||||
"backup-title-update": "Оновити резервну копію",
|
||||
"password-label-setup": "Оберіть пароль",
|
||||
"password-label-update": "Введіть свій пароль",
|
||||
"backup-button-setup": "Резервна копія",
|
||||
"backup-button-update": "Оновити резервну копію",
|
||||
"backup-id-label": "Ваш ID резервної копії",
|
||||
"backup-id-note": "Це використовується для відновлення з резервних копій пізніше. Тож має зберігатися разом із паролем у безпечному місці.",
|
||||
"restore-title": "Відновити резервну копію",
|
||||
"restore-id-label": "Відновити ID",
|
||||
"restore-password-label": "Пароль",
|
||||
"restore-button": "Відновити",
|
||||
"backup-missing-password": "Відсутній пароль",
|
||||
"backup-error-unknown": "Неможливо обробити запит",
|
||||
"backup-error-password": "Неправильний пароль. Будь ласка введіть поточний пароль.",
|
||||
"backup-success-msg": "Успішно завершено",
|
||||
"restore-success-msg": "Конфігурацію успішно відновлено"
|
||||
},
|
||||
"menu": {
|
||||
"open-section-title": "Відкрити в",
|
||||
"sametab": "Поточна вкладка",
|
||||
"newtab": "Нова вкладка",
|
||||
"modal": "Модальне спливаюче вікно",
|
||||
"workspace": "Перегляд робочої області",
|
||||
"options-section-title": "Параметри",
|
||||
"edit-item": "Редагувати",
|
||||
"move-item": "Копіювати або перемістити",
|
||||
"remove-item": "Видалити"
|
||||
},
|
||||
"context-menus": {
|
||||
"item": {
|
||||
"open-section-title": "Відкрити в",
|
||||
"sametab": "Поточна вкладка",
|
||||
"newtab": "Нова вкладка",
|
||||
"modal": "Модальне спливаюче вікно",
|
||||
"workspace": "Перегляд робочої області",
|
||||
"clipboard": "Копіювати до буфера обміну",
|
||||
"options-section-title": "Параметри",
|
||||
"edit-item": "Редагувати",
|
||||
"move-item": "Копіювати або перемістити",
|
||||
"remove-item": "Видалити",
|
||||
"copied-toast": "URL скопійовано до буфера обміну"
|
||||
},
|
||||
"section": {
|
||||
"open-section": "Відкрити розділ",
|
||||
"edit-section": "Редагувати",
|
||||
"expand-collapse": "Розгорнути / Згорнути",
|
||||
"move-section": "Перемістити до",
|
||||
"remove-section": "Видалити"
|
||||
}
|
||||
},
|
||||
"footer": {
|
||||
"dev-by": "Розроблено",
|
||||
"licensed-under": "Ліцензія згідно",
|
||||
"get-the": "Отримати",
|
||||
"source-code": "вихідний код"
|
||||
},
|
||||
"interactive-editor": {
|
||||
"menu": {
|
||||
"start-editing-tooltip": "Увійти в інтерактивний редактор",
|
||||
"edit-site-data-subheading": "Редагувати дані сайту",
|
||||
"edit-page-info-btn": "Редагувати інформацію про сторінку",
|
||||
"edit-page-info-tooltip": "Назва програми, опис, навігаційні посилання, текст нижнього колонтитула тощо",
|
||||
"edit-app-config-btn": "Редагувати конфігурацію програми",
|
||||
"edit-app-config-tooltip": "Усі інші параметри конфігурації програми",
|
||||
"edit-pages-btn": "Редагувати сторінки",
|
||||
"edit-pages-tooltip": "Додати або видалити додаткові перегляди",
|
||||
"config-save-methods-subheading": "Параметри збереження конфігурації",
|
||||
"save-locally-btn": "Зберегти локально",
|
||||
"save-locally-tooltip": "Зберегти конфігурацію локально у сховище браузера. Це не вплине на файл конфігурації, але зміни буде збережено лише на цьому пристрої",
|
||||
"save-disk-btn": "Зберегти на диск",
|
||||
"save-disk-tooltip": "Збережіть конфігурацію у файл conf.yml на диску. Це створить резервну копію, а потім перезапише існуючу конфігурацію",
|
||||
"export-config-btn": "Експорт конфігурації",
|
||||
"export-config-tooltip": "Переглянути та експортувати нову конфігурацію у файл або в буфер обміну",
|
||||
"cloud-backup-btn": "Резервне копіювання у хмару",
|
||||
"cloud-backup-tooltip": "Зберегти зашифровану резервну копію конфігурації у хмару",
|
||||
"edit-raw-config-btn": "Редагувати необроблену конфігурацію",
|
||||
"edit-raw-config-tooltip": "Переглянути та змінити необроблену конфігурацію за допомогою редактора JSON",
|
||||
"cancel-changes-btn": "Скасувати редагування",
|
||||
"cancel-changes-tooltip": "Скинути поточні зміни та вийти з режиму редагування. Це не вплине на вашу збережену конфігурацію",
|
||||
"edit-mode-name": "Режим редагування",
|
||||
"edit-mode-subtitle": "Ви перебуваєте в режимі редагування",
|
||||
"edit-mode-description": "Це означає, що ви можете вносити зміни до конфігурації та переглядати результати, але поки ви не оберете збереження, жодні ваші зміни не будуть записані.",
|
||||
"save-stage-btn": "Зберегти",
|
||||
"cancel-stage-btn": "Скасувати",
|
||||
"save-locally-warning": "Якщо ви продовжите, зміни буде збережено лише у вашому браузері. Вам слід експортувати копію вашої конфігурації для використання на інших машинах. Бажаєте продовжити?"
|
||||
},
|
||||
"edit-item": {
|
||||
"missing-title-err": "Потрібна назва елемента"
|
||||
},
|
||||
"edit-section": {
|
||||
"edit-section-title": "Редагувати розділ",
|
||||
"add-section-title": "Додати новий розділ",
|
||||
"edit-tooltip": "Натисніть, щоб редагувати, або клацніть правою кнопкою миші, щоб отримати додаткові параметри",
|
||||
"remove-confirm": "Ви впевнені, що хочете видалити цей розділ? Цю дію можна скасувати пізніше."
|
||||
},
|
||||
"edit-app-config": {
|
||||
"warning-msg-title": "Дійте з обережністю",
|
||||
"warning-msg-l1": "Ці параметри призначені для розширеної конфігурації програми.",
|
||||
"warning-msg-l2": "Якщо ви не впевнені щодо будь-якого значення, зверніться до",
|
||||
"warning-msg-docs": "Документація",
|
||||
"warning-msg-l3": ", щоб уникнути небажаних наслідків."
|
||||
},
|
||||
"export": {
|
||||
"export-title": "Експорт конфігурації",
|
||||
"copy-clipboard-btn": "Копіювати до буфера обміну",
|
||||
"copy-clipboard-tooltip": "Скопіювати всі конфігурації програми до системного буфера обміну у форматі YAML",
|
||||
"download-file-btn": "Завантажити як файл",
|
||||
"download-file-tooltip": "Завантажте всю конфігурацію програми на свій пристрій у файлі YAML",
|
||||
"view-title": "Переглянути конфігурацію"
|
||||
}
|
||||
},
|
||||
"widgets": {
|
||||
"general": {
|
||||
"loading": "Завантаження...",
|
||||
"show-more": "Розгорнути детальніше",
|
||||
"show-less": "Показати менше",
|
||||
"open-link": "Продовжити читання"
|
||||
},
|
||||
"pi-hole": {
|
||||
"status-heading": "Статус"
|
||||
},
|
||||
"stat-ping": {
|
||||
"up": "Онлайн",
|
||||
"down": "Офлайн"
|
||||
},
|
||||
"net-data": {
|
||||
"cpu-chart-title": "Історія CPU",
|
||||
"mem-chart-title": "Використання пам'яті",
|
||||
"mem-breakdown-title": "Переривання пам'яті",
|
||||
"load-chart-title": "Завантаження системи"
|
||||
},
|
||||
"glances": {
|
||||
"disk-space-free": "Вільно",
|
||||
"disk-space-used": "Використано",
|
||||
"disk-mount-point": "Точка монтування",
|
||||
"disk-file-system": "Файлова система",
|
||||
"disk-io-read": "Читання",
|
||||
"disk-io-write": "Запис",
|
||||
"system-load-desc": "Середня кількість процесів, що очікують у черзі виконання, для всіх ядер"
|
||||
},
|
||||
"system-info": {
|
||||
"uptime": "Час роботи"
|
||||
},
|
||||
"flight-data": {
|
||||
"arrivals": "Прибуття",
|
||||
"departures": "Відправлення"
|
||||
},
|
||||
"tfl-status": {
|
||||
"good-service-all": "Якісний сервіс на всіх лініях",
|
||||
"good-service-rest": "Якісний сервіс на всіх інших лініях"
|
||||
},
|
||||
"synology-download": {
|
||||
"download": "Завантажити (Download)",
|
||||
"upload": "Вивантажити (Upload)",
|
||||
"downloaded": "Завантажено",
|
||||
"uploaded": "Вивантажено",
|
||||
"remaining": "Залишилося",
|
||||
"up": "Вгору",
|
||||
"down": "Вниз"
|
||||
},
|
||||
"gluetun-status": {
|
||||
"vpn-ip": "VPN IP",
|
||||
"country": "Країна",
|
||||
"region": "Регіон",
|
||||
"city": "Місто",
|
||||
"post-code": "Поштовий індекс",
|
||||
"location": "Розташування",
|
||||
"timezone": "Часовий пояс",
|
||||
"organization": "Організація"
|
||||
},
|
||||
"nextcloud": {
|
||||
"active": "активно",
|
||||
"and": "і",
|
||||
"applications": "програми",
|
||||
"available": "доступно",
|
||||
"away": "відсутнє",
|
||||
"cache-full": "КЕШ ЗАПОВНЕНИЙ",
|
||||
"chat-room": "кімната чату",
|
||||
"delete-all": "Видалити все",
|
||||
"delete-notification": "Видалити сповіщення",
|
||||
"disabled": "вимкнено",
|
||||
"disk-quota": "Дискова квота",
|
||||
"disk-space": "Простір на диску",
|
||||
"dnd": "Не турбувати",
|
||||
"email": "електронна пошта",
|
||||
"enabled": "увімкнено",
|
||||
"federated-shares-ucfirst": "Об'єднані спільні ресурси",
|
||||
"federated-shares": "об'єднані спільні ресурси",
|
||||
"files": "файл{множина}",
|
||||
"free": "вільний",
|
||||
"groups": "групи",
|
||||
"hit-rate": "швидкість процесів",
|
||||
"hits": "процеси",
|
||||
"home": "дім",
|
||||
"in": "у",
|
||||
"keys": "ключі",
|
||||
"last-24-hours": "за останні 24 години",
|
||||
"last-5-minutes": "останні 5 хвилин",
|
||||
"last-hour": "за останню годину",
|
||||
"last-login": "Останній вхід",
|
||||
"last-restart": "Останній перезапуск",
|
||||
"load-averages": "Завантажити середні значення для всіх ядер ЦПУ",
|
||||
"local-shares": "Локальні спільні ресурси",
|
||||
"local": "локальний",
|
||||
"max-keys": "макс. ключі",
|
||||
"memory-used": "використана пам'ять",
|
||||
"memory-utilisation": "використання пам'яті",
|
||||
"memory": "пам'ять",
|
||||
"misses": "пропуски",
|
||||
"no-notifications": "Немає сповіщень",
|
||||
"no-pending-updates": "Немає очікуваних оновлень",
|
||||
"nothing-to-show": "Зараз тут нічого показувати",
|
||||
"of-which": "з яких",
|
||||
"of": "з",
|
||||
"offline": "Офлайн",
|
||||
"online": "Онлайн",
|
||||
"other": "інше",
|
||||
"overall": "Загалом",
|
||||
"private-link": "приватне посилання",
|
||||
"public-link": "публічне посилання",
|
||||
"quota-enabled": "Дискова квота {не}ввімкнена для цього користувача",
|
||||
"received": "отримано",
|
||||
"scripts": "скрипти",
|
||||
"sent": "надіслано",
|
||||
"started": "Розпочато",
|
||||
"storages-by-type": "Сховища за типом",
|
||||
"storages": "сховище{множина}",
|
||||
"strings-use": "рядки використання",
|
||||
"tasks": "Завдання",
|
||||
"total-files": "загальна кількість файлів",
|
||||
"total-users": "загальна кількість користувачів",
|
||||
"total": "усього",
|
||||
"until": "Доки",
|
||||
"updates-available-for": "Оновлення доступні для",
|
||||
"updates-available": "доступне оновлення{множина}",
|
||||
"used": "використано",
|
||||
"user": "користувач",
|
||||
"using": "використовуючи",
|
||||
"version": "версія",
|
||||
"wasted": "витрачено"
|
||||
}
|
||||
}
|
||||
}
|
||||
456
src/assets/locales/uk.json
Normal file
|
|
@ -0,0 +1,456 @@
|
|||
{
|
||||
"home": {
|
||||
"no-results": "Немає результатів пошуку",
|
||||
"no-data": "Дані не налаштовано",
|
||||
"no-items-section": "Поки що немає елементів для показу"
|
||||
},
|
||||
"search": {
|
||||
"search-label": "Пошук",
|
||||
"search-placeholder": "Почніть вводити текст для фільтрування",
|
||||
"clear-search-tooltip": "Очистити пошук",
|
||||
"enter-to-search-web": "Натисніть Enter для пошуку в Інтернеті"
|
||||
},
|
||||
"splash-screen": {
|
||||
"loading": "Завантаження"
|
||||
},
|
||||
"login": {
|
||||
"title": "Dashy",
|
||||
"guest-label": "Гостьовий доступ",
|
||||
"username-label": "Ім'я користувача",
|
||||
"password-label": "Пароль",
|
||||
"login-button": "Увійти",
|
||||
"remember-me-label": "Запам'ятати мене для",
|
||||
"remember-me-never": "Ніколи не запам'ятовувати",
|
||||
"remember-me-hour": "4 години",
|
||||
"remember-me-day": "1 день",
|
||||
"remember-me-week": "1 тиждень",
|
||||
"remember-me-long-time": "Довгий час",
|
||||
"error-missing-username": "Відсутнє ім'я користувача",
|
||||
"error-missing-password": "Відсутній пароль",
|
||||
"error-incorrect-username": "Користувача не знайдено",
|
||||
"error-incorrect-password": "Неправильний пароль",
|
||||
"success-message": "Вхід...",
|
||||
"logout-message": "Вихід",
|
||||
"already-logged-in-title": "Вхід вже виконано",
|
||||
"already-logged-in-text": "Ви увійшли як",
|
||||
"proceed-to-dashboard": "Перейти до інформаційної панелі",
|
||||
"log-out-button": "Вийти",
|
||||
"proceed-guest-button": "Продовжити як гість",
|
||||
"guest-intro-1": "У цій системі увімкнено гостьовий доступ.",
|
||||
"guest-intro-2": "Гості мають доступ лише для перегляду до інформаційних панелей, тому не можуть записати жодних змін на диск.",
|
||||
"error": "Помилка",
|
||||
"error-no-user-configured": "Автентифікацію не ввімкнено, або користувачі не налаштовані",
|
||||
"error-go-home-button": "Повернутися на головну",
|
||||
"logged-in-guest": "Ви увійшли як гість, перенаправлення...",
|
||||
"error-guest-access": "Гостьовий доступ не дозволено"
|
||||
},
|
||||
"app-info": {
|
||||
"title": "Інформація про програму",
|
||||
"error-log": "Журнал помилок",
|
||||
"no-errors": "Останніх помилок не виявлено",
|
||||
"help-support": "Допомога та підтримка",
|
||||
"help-support-description": "Щоб отримати підтримку щодо запуску чи налаштування Dashy, див.",
|
||||
"help-support-discussions": "Обговорення",
|
||||
"support-dashy": "Підтримка Dashy",
|
||||
"support-dashy-description": "Щоб дізнатися, як ви можете взяти участь, перегляньте",
|
||||
"support-dashy-link": "Сторінка внесків",
|
||||
"report-bug": "Повідомити про помилку",
|
||||
"report-bug-description": "Якщо ви вважаєте, що знайшли помилку, будь ласка",
|
||||
"report-bug-link": "повідомте про проблему",
|
||||
"more-info": "Докладніше",
|
||||
"source": "Джерело",
|
||||
"documentation": "Документація",
|
||||
"privacy-and-security": "Конфіденційність та безпека",
|
||||
"privacy-and-security-l1": "Для детальної інформації про те, як Dashy керує вашими даними, див.",
|
||||
"privacy-and-security-privacy-policy": "Політика конфіденційності",
|
||||
"privacy-and-security-advice": "Щоб отримати поради щодо захисту вашої інформаційної панелі, ви можете звернутися до розділу",
|
||||
"privacy-and-security-advice-link": "Документи керування",
|
||||
"privacy-and-security-security-issue": "Якщо ви виявили потенційну проблему з безпекою, повідомте про це згідно з нашою",
|
||||
"privacy-and-security-security-policy": "Політика безпеки",
|
||||
"license": "Ліцензія",
|
||||
"license-under": "Ліцензія згідно",
|
||||
"licence-third-party": "Ліцензії на сторонні модулі див.",
|
||||
"licence-third-party-link": "Юридична інформація",
|
||||
"list-contributors": "Повний список співавторів та подяки див.",
|
||||
"list-contributors-link": "Подяки",
|
||||
"version": "Версія"
|
||||
},
|
||||
"config": {
|
||||
"main-tab": "Головне меню",
|
||||
"view-config-tab": "Переглянути налаштування",
|
||||
"edit-config-tab": "Редагувати налаштування",
|
||||
"custom-css-tab": "Користувацькі стилі",
|
||||
"heading": "Параметри налаштування",
|
||||
"download-config-button": "Переглянути / Експортувати налаштування",
|
||||
"edit-config-button": "Редагувати налаштування",
|
||||
"edit-css-button": "Редагувати користувацький CSS",
|
||||
"cloud-sync-button": "Увімкнути хмарну синхронізацію",
|
||||
"edit-cloud-sync-button": "Редагувати хмарну синхронізацію",
|
||||
"rebuild-app-button": "Перебудувати програму",
|
||||
"change-language-button": "Змінити мову програми",
|
||||
"reset-settings-button": "Скинути локальні налаштування",
|
||||
"disabled-note": "Деякі функції налаштувань були вимкнені адміністратором",
|
||||
"small-screen-note": "Ви використовуєте дуже маленький екран, і деякі екрани в цьому меню можуть бути не найкращими",
|
||||
"app-info-button": "Інформація про програму",
|
||||
"backup-note": "Рекомендовано зробити резервну копію налаштування перед внесенням змін.",
|
||||
"reset-config-msg-l1": "Це видалить усі налаштування користувача з локального сховища, але не вплине на ваш файл 'conf.yml'.",
|
||||
"reset-config-msg-l2": "Ви повинні спочатку створити резервну копію будь-яких змін, які ви внесли локально, якщо ви хочете використовувати їх у майбутньому.",
|
||||
"reset-config-msg-l3": "Ви впевнені, що бажаєте продовжити?",
|
||||
"data-cleared-msg": "Дані успішно видалено",
|
||||
"actions-label": "Дії",
|
||||
"copy-config-label": "Копіювати налаштування",
|
||||
"data-copied-msg": "Налаштування скопійовано до буфера обміну",
|
||||
"reset-config-label": "Скинути налаштування",
|
||||
"css-save-btn": "Зберегти зміни",
|
||||
"css-note-label": "Примітка",
|
||||
"css-note-l1": "Вам потрібно буде оновити сторінку, щоб ваші зміни набули чинності.",
|
||||
"css-note-l2": "Заміни стилів зберігаються лише локально, тому рекомендується зробити копію вашого CSS.",
|
||||
"css-note-l3": "Щоб видалити всі користувацькі стилі, видаліть вміст та натисніть Зберегти зміни",
|
||||
"custom-css": {
|
||||
"title": "Користувацькі стилі",
|
||||
"base-theme": "Базова тема"
|
||||
}
|
||||
},
|
||||
"alternate-views": {
|
||||
"alternate-view-heading": "Змінити перегляд",
|
||||
"default": "За замовчуванням",
|
||||
"workspace": "Робочий простір",
|
||||
"minimal": "Мінімальний"
|
||||
},
|
||||
"settings": {
|
||||
"theme-label": "Тема",
|
||||
"layout-label": "Макет",
|
||||
"layout-auto": "Авто",
|
||||
"layout-horizontal": "Горизонтально",
|
||||
"layout-vertical": "Вертикально",
|
||||
"item-size-label": "Розмір елемента",
|
||||
"item-size-small": "Маленький",
|
||||
"item-size-medium": "Середній",
|
||||
"item-size-large": "Великий",
|
||||
"config-launcher-label": "Налаштування",
|
||||
"config-launcher-tooltip": "Оновити налаштування",
|
||||
"sign-out-tooltip": "Вийти",
|
||||
"sign-in-tooltip": "Увійти",
|
||||
"sign-in-welcome": "Вітаємо {username}!",
|
||||
"hide": "Приховати",
|
||||
"open": "Відкрити"
|
||||
},
|
||||
"updates": {
|
||||
"app-version-note": "Версія Dashy",
|
||||
"up-to-date": "Оновити",
|
||||
"out-of-date": "Оновлення доступне",
|
||||
"unsupported-version-l1": "Ви використовуєте непідтримувану версію Dashy",
|
||||
"unsupported-version-l2": "Для найкращого досвіду та останніх виправлень безпеки, будь ласка, оновіться"
|
||||
},
|
||||
"language-switcher": {
|
||||
"title": "Змінити мову програми",
|
||||
"dropdown-label": "Оберіть мову",
|
||||
"save-button": "Зберегти",
|
||||
"success-msg": "Мову оновлено"
|
||||
},
|
||||
"theme-maker": {
|
||||
"title": "Конфігуратор теми",
|
||||
"export-button": "Експорт змінних користувача",
|
||||
"reset-button": "Скинути стилі",
|
||||
"show-all-button": "Показати всі змінні",
|
||||
"change-fonts-button": "Змінити шрифти",
|
||||
"save-button": "Зберегти",
|
||||
"cancel-button": "Скасувати",
|
||||
"saved-toast": "{theme} успішно оновлена",
|
||||
"copied-toast": "Дані теми для {theme} скопійовано в буфер обміну",
|
||||
"reset-toast": "Видалені користувацькі кольори для {theme}"
|
||||
},
|
||||
"config-editor": {
|
||||
"save-location-label": "Місце збереження",
|
||||
"location-local-label": "Застосувати локально",
|
||||
"location-disk-label": "Записати зміни до файлу налаштування",
|
||||
"save-button": "Зберегти зміни",
|
||||
"preview-button": "Попередній перегляд змін",
|
||||
"valid-label": "Налаштування дійсне",
|
||||
"status-success-msg": "Завдання виконано",
|
||||
"status-fail-msg": "Не вдалося виконати завдання",
|
||||
"success-msg-disk": "Файл налаштування успішно записаний на диск",
|
||||
"success-msg-local": "Локальні зміни успішно збережено",
|
||||
"success-note-l1": "Програма повинна автоматично перебудуватися.",
|
||||
"success-note-l2": "Це може зайняти до хвилини.",
|
||||
"success-note-l3": "Вам потрібно буде оновити сторінку, щоб зміни набули чинності.",
|
||||
"error-msg-save-mode": "Будь ласка, виберіть режим збереження: локальний або файловий",
|
||||
"error-msg-cannot-save": "Під час збереження налаштування сталася помилка",
|
||||
"error-msg-bad-json": "Помилка у форматі JSON, можливо, некоректно сформований",
|
||||
"warning-msg-validation": "Попередження про перевірку",
|
||||
"not-admin-note": "Ви не можете записати зміни на диск, оскільки ви не увійшли як адміністратор"
|
||||
},
|
||||
"app-rebuild": {
|
||||
"title": "Перебудувати програму",
|
||||
"rebuild-note-l1": "Перебудова потрібна, щоб зміни, записані у файл conf.yml, набули чинності.",
|
||||
"rebuild-note-l2": "Це має статися автоматично, але якщо цього не сталося, ви можете запустити це звідси вручну.",
|
||||
"rebuild-note-l3": "Це не потрібно для змін, які зберігаються локально.",
|
||||
"rebuild-button": "Почати збірку",
|
||||
"rebuilding-status-1": "Збираємо...",
|
||||
"rebuilding-status-2": "Це може зайняти кілька хвилин",
|
||||
"error-permission": "У вас немає дозволу ініціювати цю дію",
|
||||
"success-msg": "Збірку завершено успішно",
|
||||
"fail-msg": "Помилка при виконанні збірки",
|
||||
"reload-note": "Тепер потрібно перезавантажити сторінку, щоб зміни набули чинності",
|
||||
"reload-button": "Перезавантажити сторінку"
|
||||
},
|
||||
"cloud-sync": {
|
||||
"title": "Резервне копіювання та відновлення у хмарі",
|
||||
"intro-l1": "Резервне копіювання та відновлення в хмарі є додатковою функцією, яка дає змогу завантажити ваше налаштування в Інтернет, а потім відновити її на будь-якому іншому пристрої чи екземплярі Dashy.",
|
||||
"intro-l2": "Усі дані повністю зашифровані за допомогою AES із використанням вашого пароля як ключа.",
|
||||
"intro-l3": "Для отримання додаткової інформації див.",
|
||||
"intro-docs": "документи",
|
||||
"backup-title-setup": "Створити резервну копію",
|
||||
"backup-title-update": "Оновити резервну копію",
|
||||
"password-label-setup": "Оберіть пароль",
|
||||
"password-label-update": "Введіть свій пароль",
|
||||
"backup-button-setup": "Резервна копія",
|
||||
"backup-button-update": "Оновити резервну копію",
|
||||
"backup-id-label": "Ваш ідентифікатор резервної копії",
|
||||
"backup-id-note": "Це використовується для відновлення з резервних копій пізніше. Тож має зберігатися разом із паролем у безпечному місці.",
|
||||
"restore-title": "Відновити резервну копію",
|
||||
"restore-id-label": "Відновити ідентифікатор",
|
||||
"restore-password-label": "Пароль",
|
||||
"restore-button": "Відновити",
|
||||
"backup-missing-password": "Відсутній пароль",
|
||||
"backup-error-unknown": "Неможливо обробити запит",
|
||||
"backup-error-password": "Неправильний пароль. Будь ласка, введіть поточний пароль.",
|
||||
"backup-success-msg": "Успішно завершено",
|
||||
"restore-success-msg": "Налаштування успішно відновлено"
|
||||
},
|
||||
"menu": {
|
||||
"open-section-title": "Відкрити в",
|
||||
"sametab": "Поточна вкладка",
|
||||
"newtab": "Нова вкладка",
|
||||
"modal": "Модальне спливаюче вікно",
|
||||
"workspace": "Перегляд робочого простору",
|
||||
"options-section-title": "Параметри",
|
||||
"edit-item": "Редагувати",
|
||||
"move-item": "Копіювати або перемістити",
|
||||
"remove-item": "Видалити"
|
||||
},
|
||||
"context-menus": {
|
||||
"item": {
|
||||
"open-section-title": "Відкрити в",
|
||||
"sametab": "Поточна вкладка",
|
||||
"newtab": "Нова вкладка",
|
||||
"modal": "Модальне спливаюче вікно",
|
||||
"workspace": "Перегляд робочої області",
|
||||
"clipboard": "Копіювати до буфера обміну",
|
||||
"options-section-title": "Параметри",
|
||||
"edit-item": "Редагувати",
|
||||
"move-item": "Копіювати або перемістити",
|
||||
"remove-item": "Видалити",
|
||||
"copied-toast": "URL скопійовано до буфера обміну"
|
||||
},
|
||||
"section": {
|
||||
"open-section": "Відкрити розділ",
|
||||
"edit-section": "Редагувати",
|
||||
"expand-collapse": "Розгорнути / Згорнути",
|
||||
"move-section": "Перемістити до",
|
||||
"remove-section": "Видалити"
|
||||
}
|
||||
},
|
||||
"footer": {
|
||||
"dev-by": "Розроблено",
|
||||
"licensed-under": "Ліцензія згідно",
|
||||
"get-the": "Отримати",
|
||||
"source-code": "Вихідний код"
|
||||
},
|
||||
"interactive-editor": {
|
||||
"menu": {
|
||||
"start-editing-tooltip": "Увійти в інтерактивний редактор",
|
||||
"edit-site-data-subheading": "Редагувати дані сайту",
|
||||
"edit-page-info-btn": "Редагувати інформацію про сторінку",
|
||||
"edit-page-info-tooltip": "Назва програми, опис, навігаційні посилання, текст нижнього колонтитула тощо",
|
||||
"edit-app-config-btn": "Редагувати налаштування програми",
|
||||
"edit-app-config-tooltip": "Усі інші параметри налаштування програми",
|
||||
"edit-pages-btn": "Редагувати сторінки",
|
||||
"edit-pages-tooltip": "Додати або видалити додаткові перегляди",
|
||||
"config-save-methods-subheading": "Параметри збереження налаштування",
|
||||
"save-locally-btn": "Зберегти локально",
|
||||
"save-locally-tooltip": "Зберегти налаштування локально у сховище браузера. Це не вплине на файл налаштування, але зміни буде збережено лише на цьому пристрої",
|
||||
"save-disk-btn": "Зберегти на диск",
|
||||
"save-disk-tooltip": "Збережіть налаштування у файл conf.yml на диску. Це створить резервну копію, а потім перезапише наявне налаштування",
|
||||
"export-config-btn": "Експорт налаштування",
|
||||
"export-config-tooltip": "Переглянути та експортувати нове налаштування у файл або в буфер обміну",
|
||||
"cloud-backup-btn": "Резервне копіювання у хмару",
|
||||
"cloud-backup-tooltip": "Зберегти зашифровану резервну копію налаштування у хмару",
|
||||
"edit-raw-config-btn": "Редагувати необроблене налаштування",
|
||||
"edit-raw-config-tooltip": "Переглянути та змінити необроблене налаштування за допомогою редактора JSON",
|
||||
"cancel-changes-btn": "Скасувати редагування",
|
||||
"cancel-changes-tooltip": "Скинути поточні зміни та вийти з режиму редагування. Це не вплине на вашу збережене налаштування",
|
||||
"edit-mode-name": "Режим редагування",
|
||||
"edit-mode-subtitle": "Ви перебуваєте в режимі редагування",
|
||||
"edit-mode-description": "Це означає, що ви можете вносити зміни до налаштування та переглядати результати, але поки ви не оберете збереження, жодні ваші зміни не будуть записані.",
|
||||
"save-stage-btn": "Зберегти",
|
||||
"cancel-stage-btn": "Скасувати",
|
||||
"save-locally-warning": "Якщо ви продовжите, зміни буде збережено лише у вашому браузері. Вам слід експортувати копію вашого налаштування для використання на інших машинах. Бажаєте продовжити?"
|
||||
},
|
||||
"edit-item": {
|
||||
"missing-title-err": "Потрібна назва елемента"
|
||||
},
|
||||
"edit-section": {
|
||||
"edit-section-title": "Редагувати розділ",
|
||||
"add-section-title": "Додати новий розділ",
|
||||
"edit-tooltip": "Натисніть, щоб редагувати, або клацніть правою кнопкою миші, щоб отримати додаткові параметри",
|
||||
"remove-confirm": "Ви впевнені, що хочете видалити цей розділ? Цю дію можна скасувати пізніше."
|
||||
},
|
||||
"edit-app-config": {
|
||||
"warning-msg-title": "Дійте з обережністю",
|
||||
"warning-msg-l1": "Ці параметри призначені для розширеного налаштування програми.",
|
||||
"warning-msg-l2": "Якщо ви не впевнені щодо будь-якого значення, зверніться до",
|
||||
"warning-msg-docs": "Документація",
|
||||
"warning-msg-l3": ", щоб уникнути небажаних наслідків."
|
||||
},
|
||||
"export": {
|
||||
"export-title": "Експорт налаштування",
|
||||
"copy-clipboard-btn": "Копіювати до буфера обміну",
|
||||
"copy-clipboard-tooltip": "Скопіювати всі налаштування програми до системного буфера обміну у форматі YAML",
|
||||
"download-file-btn": "Завантажити як файл",
|
||||
"download-file-tooltip": "Завантажте все налаштування програми на свій пристрій у файлі YAML",
|
||||
"view-title": "Переглянути налаштування"
|
||||
}
|
||||
},
|
||||
"critical-error": {
|
||||
"title": "Помилка завантаження налаштування",
|
||||
"subtitle": "Dashy не вдалося правильно завантажити через помилку налаштування.",
|
||||
"sub-ensure-that": "Переконайтеся в цьому",
|
||||
"sub-error-details": "Деталі помилки",
|
||||
"sub-next-steps": "Наступні кроки",
|
||||
"ignore-button": "Ігнорувати критичні помилки"
|
||||
},
|
||||
"widgets": {
|
||||
"general": {
|
||||
"loading": "Завантаження...",
|
||||
"show-more": "Розгорнути детальніше",
|
||||
"cpu-details": "Детальніше по ЦПУ",
|
||||
"mem-details": "Детальніше по пам'яті",
|
||||
"show-less": "Показати менше",
|
||||
"open-link": "Продовжити читання"
|
||||
},
|
||||
"pi-hole": {
|
||||
"status-heading": "Статус"
|
||||
},
|
||||
"stat-ping": {
|
||||
"up": "Онлайн",
|
||||
"down": "Офлайн"
|
||||
},
|
||||
"net-data": {
|
||||
"cpu-chart-title": "Історія ЦПУ",
|
||||
"mem-chart-title": "Використання пам'яті",
|
||||
"mem-breakdown-title": "Переривання пам'яті",
|
||||
"load-chart-title": "Завантаження системи"
|
||||
},
|
||||
"glances": {
|
||||
"disk-space-free": "Вільно",
|
||||
"disk-space-used": "Використано",
|
||||
"disk-mount-point": "Точка монтування",
|
||||
"disk-file-system": "Файлова система",
|
||||
"disk-io-read": "Читання",
|
||||
"disk-io-write": "Запис",
|
||||
"system-load-desc": "Середня кількість процесів, що очікують у черзі виконання, для всіх ядер"
|
||||
},
|
||||
"system-info": {
|
||||
"uptime": "Час роботи"
|
||||
},
|
||||
"flight-data": {
|
||||
"arrivals": "Прибуття",
|
||||
"departures": "Відправлення"
|
||||
},
|
||||
"tfl-status": {
|
||||
"good-service-all": "Якісний сервіс на всіх лініях",
|
||||
"good-service-rest": "Якісний сервіс на всіх інших лініях"
|
||||
},
|
||||
"synology-download": {
|
||||
"download": "Завантажити (Download)",
|
||||
"upload": "Вивантажити (Upload)",
|
||||
"downloaded": "Завантажено",
|
||||
"uploaded": "Вивантажено",
|
||||
"remaining": "Залишилося",
|
||||
"up": "Вгору",
|
||||
"down": "Вниз"
|
||||
},
|
||||
"gluetun-status": {
|
||||
"vpn-ip": "VPN IP",
|
||||
"country": "Країна",
|
||||
"region": "Регіон",
|
||||
"city": "Місто",
|
||||
"post-code": "Поштовий індекс",
|
||||
"location": "Розташування",
|
||||
"timezone": "Часовий пояс",
|
||||
"organization": "Організація"
|
||||
},
|
||||
"nextcloud": {
|
||||
"active": "активно",
|
||||
"and": "і",
|
||||
"applications": "програми",
|
||||
"available": "доступно",
|
||||
"away": "відсутнє",
|
||||
"cache-full": "КЕШ ЗАПОВНЕНИЙ",
|
||||
"chat-room": "кімната чату",
|
||||
"delete-all": "Видалити все",
|
||||
"delete-notification": "Видалити сповіщення",
|
||||
"disabled": "вимкнено",
|
||||
"disk-quota": "Дискова квота",
|
||||
"disk-space": "Простір на диску",
|
||||
"dnd": "Не турбувати",
|
||||
"email": "електронна пошта",
|
||||
"enabled": "увімкнено",
|
||||
"federated-shares-ucfirst": "Об'єднані спільні ресурси",
|
||||
"federated-shares": "об'єднані спільні ресурси",
|
||||
"files": "файл{множина}",
|
||||
"free": "вільний",
|
||||
"groups": "групи",
|
||||
"hit-rate": "рівень попадань",
|
||||
"hits": "попадання",
|
||||
"home": "головна",
|
||||
"in": "у",
|
||||
"keys": "ключі",
|
||||
"last-24-hours": "за останні 24 години",
|
||||
"last-5-minutes": "останні 5 хвилин",
|
||||
"last-hour": "за останню годину",
|
||||
"last-login": "Останній вхід",
|
||||
"last-restart": "Останній перезапуск",
|
||||
"load-averages": "Завантажити середні значення для всіх ядер ЦПУ",
|
||||
"local-shares": "Локальні спільні ресурси",
|
||||
"local": "локальний",
|
||||
"max-keys": "максимум ключів",
|
||||
"memory-used": "використана пам'ять",
|
||||
"memory-utilisation": "використання пам'яті",
|
||||
"memory": "пам'ять",
|
||||
"misses": "промахи",
|
||||
"no-notifications": "Немає сповіщень",
|
||||
"no-pending-updates": "немає очікуваних оновлень",
|
||||
"nothing-to-show": "Зараз тут нічого показувати",
|
||||
"of-which": "з яких",
|
||||
"of": "з",
|
||||
"offline": "Офлайн",
|
||||
"online": "Онлайн",
|
||||
"other": "інше",
|
||||
"overall": "Загалом",
|
||||
"private-link": "приватне посилання",
|
||||
"public-link": "публічне посилання",
|
||||
"quota-enabled": "Дискова квота {не}ввімкнена для цього користувача",
|
||||
"received": "отримано",
|
||||
"scripts": "скрипти",
|
||||
"sent": "надіслано",
|
||||
"started": "Розпочато",
|
||||
"storages-by-type": "Сховища за типом",
|
||||
"storages": "сховище{множина}",
|
||||
"strings-use": "рядки використання",
|
||||
"tasks": "Завдання",
|
||||
"total-files": "загальна кількість файлів",
|
||||
"total-users": "загальна кількість користувачів",
|
||||
"total": "усього",
|
||||
"until": "Доки",
|
||||
"updates-available-for": "Оновлення доступні для",
|
||||
"updates-available": "доступне оновлення{множина}",
|
||||
"used": "використано",
|
||||
"user": "користувач",
|
||||
"using": "використовуючи",
|
||||
"version": "версія",
|
||||
"wasted": "витрачено"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -18,7 +18,7 @@
|
|||
"guest-label": "访客访问",
|
||||
"username-label": "用户名",
|
||||
"password-label": "密码",
|
||||
"login-button": "登陆",
|
||||
"login-button": "登录",
|
||||
"remember-me-label": "记住密码",
|
||||
"remember-me-never": "永不",
|
||||
"remember-me-hour": "4 小时",
|
||||
|
|
@ -29,19 +29,19 @@
|
|||
"error-missing-password": "密码空缺",
|
||||
"error-incorrect-username": "用户不存在",
|
||||
"error-incorrect-password": "密码不正确",
|
||||
"success-message": "登陆成功。。。",
|
||||
"success-message": "登录成功。",
|
||||
"logout-message": "注销",
|
||||
"already-logged-in-title": "已经成功登陆",
|
||||
"already-logged-in-text": "你的登陆身份",
|
||||
"already-logged-in-title": "已经成功登录",
|
||||
"already-logged-in-text": "你的登录身份",
|
||||
"proceed-to-dashboard": "前往仪表板",
|
||||
"log-out-button": "注销",
|
||||
"proceed-guest-button": "以游客身份前往",
|
||||
"guest-intro-1": "该实例已启用访客访问.",
|
||||
"guest-intro-2": "访客只有访问权限,无法保存变更",
|
||||
"guest-intro-2": "访客只有访问权限,无法保存变更",
|
||||
"error": "错误",
|
||||
"error-no-user-configured": "没有启用验证,或者未配置用户",
|
||||
"error-no-user-configured": "没有启用验证,或者未配置用户",
|
||||
"error-go-home-button": "Go Home",
|
||||
"logged-in-guest": "以访客身份登陆,正在跳转...",
|
||||
"logged-in-guest": "以访客身份登录,正在跳转...",
|
||||
"error-guest-access": "不允许访客访问"
|
||||
},
|
||||
"app-info": {
|
||||
|
|
@ -78,22 +78,22 @@
|
|||
"config": {
|
||||
"main-tab": "主菜单",
|
||||
"view-config-tab": "视图设置",
|
||||
"edit-config-tab": "编辑设置",
|
||||
"edit-config-tab": "修改设置",
|
||||
"custom-css-tab": "自定义样式",
|
||||
"heading": "设置选项",
|
||||
"download-config-button": "下载配置",
|
||||
"edit-config-button": "编辑设置",
|
||||
"edit-css-button": "编辑自定义 CSS",
|
||||
"cloud-sync-button": "启用云端同步",
|
||||
"edit-cloud-sync-button": "编辑云端同步",
|
||||
"edit-config-button": "修改设置",
|
||||
"edit-css-button": "自定义CSS",
|
||||
"cloud-sync-button": "云端同步",
|
||||
"edit-cloud-sync-button": "修改云端同步",
|
||||
"rebuild-app-button": "重建应用",
|
||||
"change-language-button": "更改语言",
|
||||
"reset-settings-button": "恢复本地设置",
|
||||
"reset-settings-button": "恢复默认设置",
|
||||
"disabled-note": "您的管理员已禁用某些配置功能",
|
||||
"small-screen-note": "您正在使用非常小的屏幕,某些菜单屏幕可能不够优化",
|
||||
"app-info-button": "应用详情",
|
||||
"backup-note": "建议在进行更改之前备份你的配置。",
|
||||
"reset-config-msg-l1": "这将从本地存储中删除所有用户设置,但不会影响‘conf.yml’文件。",
|
||||
"reset-config-msg-l1": "这将从本地存储中删除所有用户设置,但不会影响 conf.yml 文件。",
|
||||
"reset-config-msg-l2": "如果想在以后使用它们,应该首先备份你所做的任何更改。",
|
||||
"reset-config-msg-l3": "确定执行吗?",
|
||||
"data-cleared-msg": "成功清空数据",
|
||||
|
|
@ -103,9 +103,9 @@
|
|||
"reset-config-label": "重置设置",
|
||||
"css-save-btn": "保存更改",
|
||||
"css-note-label": "注意",
|
||||
"css-note-l1": "你需要刷新页面才能使更改生效。",
|
||||
"css-note-l2": "样式覆盖仅存储在本地,因此建议复制你的 CSS。",
|
||||
"css-note-l3": "要删除所有自定义样式,请删除内容并点击保存更改",
|
||||
"css-note-l1": "需刷新页面使其生效。",
|
||||
"css-note-l2": "自定义样式仅在本地有效,设置储存在当前浏览器,建议做好备份。",
|
||||
"css-note-l3": "如需删除自定义样式,清空上面内容并点击保存。",
|
||||
"custom-css": {
|
||||
"title": "自定义 CSS",
|
||||
"base-theme": "基础主题"
|
||||
|
|
@ -130,10 +130,10 @@
|
|||
"config-launcher-label": "设置",
|
||||
"config-launcher-tooltip": "更新设置",
|
||||
"sign-out-tooltip": "注销",
|
||||
"sign-in-tooltip": "登陆",
|
||||
"sign-in-tooltip": "登录",
|
||||
"sign-in-welcome": "你好 {username}!",
|
||||
"hide": "Hide",
|
||||
"open": "Open"
|
||||
"hide": "隐藏",
|
||||
"open": "打开"
|
||||
},
|
||||
"updates": {
|
||||
"app-version-note": "Dashy 版本",
|
||||
|
|
@ -195,9 +195,10 @@
|
|||
"reload-button": "刷新页面"
|
||||
},
|
||||
"cloud-sync": {
|
||||
"title": "云备份 & 云恢复",
|
||||
"title": "云备份&恢复",
|
||||
"intro-l1": "云备份和云恢复是一项试验性功能,你将配置上传到网络,然后在其他设备或 Dashy 实例上恢复。",
|
||||
"intro-l2": "所有数据都使用AES端对端加密,使用你的密码作为密钥。",
|
||||
"intro-docs": "文档",
|
||||
"intro-l3": "有关更多信息,请参阅",
|
||||
"backup-title-setup": "创建备份",
|
||||
"backup-title-update": "更新备份",
|
||||
|
|
@ -268,9 +269,9 @@
|
|||
"edit-pages-tooltip": "添加或删除其他的视图",
|
||||
"config-save-methods-subheading": "配置保存选项",
|
||||
"save-locally-btn": "暂存本地",
|
||||
"save-locally-tooltip": "将设置保存在本地浏览器上. 这不会影响配置文件,但更改只会保留在当前设备上.",
|
||||
"save-locally-tooltip": "将设置保存在浏览器上。这不会影响配置文件,仅作用于当前的浏览器。",
|
||||
"save-disk-btn": "保存",
|
||||
"save-disk-tooltip": "将设置保存到服务端的conf.yml文件.它会备份之前的配置文件.",
|
||||
"save-disk-tooltip": "将设置保存到服务端的conf.yml文件,它会备份之前的配置文件.",
|
||||
"export-config-btn": "导出配置",
|
||||
"export-config-tooltip": "查看并导出新的配置到 文件 或 剪贴板",
|
||||
"cloud-backup-btn": "备份到云端",
|
||||
|
|
@ -284,10 +285,10 @@
|
|||
"edit-mode-description": "你可以对配置进行修改并预览,在保存之前,你的任何更改都不会被保留。",
|
||||
"save-stage-btn": "保存",
|
||||
"cancel-stage-btn": "取消",
|
||||
"save-locally-warning": "如果你继续,更改将仅保存在你的浏览器中。 你应该导出配置的副本以在其他机器上使用。 你想继续吗?"
|
||||
"save-locally-warning": "配置将保存到你当前的浏览器上。你也可以导出配置到其他设备上使用。是否继续?"
|
||||
},
|
||||
"edit-item": {
|
||||
"missing-title-err": "项目标题是必需的"
|
||||
"missing-title-err": "标题是必需的"
|
||||
},
|
||||
"edit-section": {
|
||||
"edit-section-title": "编辑 Section",
|
||||
|
|
@ -314,7 +315,9 @@
|
|||
"widgets": {
|
||||
"general": {
|
||||
"loading": "加载中...",
|
||||
"show-more": "展开详情",
|
||||
"show-more": "显示更多",
|
||||
"cpu-details": "CPU 详情",
|
||||
"mem-details": "内存 详情",
|
||||
"show-less": "显示更少信息",
|
||||
"open-link": "继续读取"
|
||||
},
|
||||
|
|
@ -399,7 +402,7 @@
|
|||
"last-24-hours": "24 小时内",
|
||||
"last-5-minutes": "5 分钟内",
|
||||
"last-hour": "1 小时内",
|
||||
"last-login": "最后登陆",
|
||||
"last-login": "最后登录",
|
||||
"last-restart": "最后重启",
|
||||
"load-averages": "所有CPU的平均负载",
|
||||
"local-shares": "本地分享",
|
||||
|
|
|
|||
|
|
@ -155,13 +155,24 @@ export default {
|
|||
},
|
||||
/* When restored data is revieved, then save to local storage, and apply it in state */
|
||||
applyRestoredData(config, backupId) {
|
||||
// Store restored data in local storage
|
||||
const isSubPage = !!this.$store.state.currentConfigInfo.confId;
|
||||
if (isSubPage) { // Apply to sub-page only
|
||||
const subConfigId = this.$store.state.currentConfigInfo.confId;
|
||||
const sectionStorageKey = `${localStorageKeys.CONF_SECTIONS}-${subConfigId}`;
|
||||
const pageInfoStorageKey = `${localStorageKeys.PAGE_INFO}-${subConfigId}`;
|
||||
const themeStoreKey = `${localStorageKeys.THEME}-${subConfigId}`;
|
||||
localStorage.setItem(sectionStorageKey, JSON.stringify(config.sections));
|
||||
localStorage.setItem(pageInfoStorageKey, JSON.stringify(config.pageInfo));
|
||||
localStorage.setItem(themeStoreKey, config.appConfig.theme);
|
||||
} else { // Apply to main config
|
||||
localStorage.setItem(localStorageKeys.CONF_SECTIONS, JSON.stringify(config.sections));
|
||||
localStorage.setItem(localStorageKeys.APP_CONFIG, JSON.stringify(config.appConfig));
|
||||
localStorage.setItem(localStorageKeys.PAGE_INFO, JSON.stringify(config.pageInfo));
|
||||
localStorage.setItem(localStorageKeys.CONF_PAGES, JSON.stringify(config.pages || []));
|
||||
if (config.appConfig.theme) {
|
||||
localStorage.setItem(localStorageKeys.THEME, config.appConfig.theme);
|
||||
}
|
||||
}
|
||||
// Save hashed token in local storage
|
||||
this.setBackupIdLocally(backupId, this.restorePassword);
|
||||
// Update the current state
|
||||
|
|
|
|||
|
|
@ -47,16 +47,17 @@
|
|||
</Button>
|
||||
<!-- Display app version and language -->
|
||||
<p class="language">{{ getLanguage() }}</p>
|
||||
<p v-if="$store.state.currentConfigInfo" class="config-location">
|
||||
Using Config From<br>
|
||||
{{ $store.state.currentConfigInfo.confPath }}
|
||||
<!-- Display location of config file -->
|
||||
<p class="config-location">
|
||||
Using config from
|
||||
<a :href="configPath">{{ configPath }}</a>
|
||||
</p>
|
||||
<AppVersion />
|
||||
</div>
|
||||
<!-- Display note if Config disabled, or if on mobile -->
|
||||
<p v-if="!enableConfig" class="config-disabled-note">{{ $t('config.disabled-note') }}</p>
|
||||
<p class="small-screen-note" style="display: none;">{{ $t('config.small-screen-note') }}</p>
|
||||
<div class="config-note">
|
||||
<div class="config-note" @click="openExportConfigModal">
|
||||
<span>{{ $t('config.backup-note') }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -116,6 +117,11 @@ export default {
|
|||
enableConfig() {
|
||||
return this.$store.getters.permissions.allowViewConfig;
|
||||
},
|
||||
configPath() {
|
||||
return this.$store.state.currentConfigInfo?.confPath
|
||||
|| process.env.VUE_APP_CONFIG_PATH
|
||||
|| '/conf.yml';
|
||||
},
|
||||
},
|
||||
components: {
|
||||
Button,
|
||||
|
|
@ -248,8 +254,12 @@ a.hyperlink-wrapper {
|
|||
p.app-version, p.language, p.config-location {
|
||||
margin: 0.5rem auto;
|
||||
font-size: 1rem;
|
||||
color: var(--transparent-white-50);
|
||||
color: var(--config-settings-color);
|
||||
cursor: default;
|
||||
opacity: var(--dimming-factor);
|
||||
a {
|
||||
color: var(--config-settings-color);
|
||||
}
|
||||
}
|
||||
|
||||
div.code-container {
|
||||
|
|
|
|||
|
|
@ -116,7 +116,8 @@ export default {
|
|||
},
|
||||
mounted() {
|
||||
const jsonData = { ...this.config };
|
||||
jsonData.sections = jsonData.sections.map(({ filteredItems, ...section }) => section);
|
||||
jsonData.sections = (jsonData.sections || []).map(({ filteredItems, ...section }) => section);
|
||||
if (!jsonData.pageInfo) jsonData.pageInfo = { title: 'Dashy' };
|
||||
this.jsonData = jsonData;
|
||||
if (!this.allowWriteToDisk) this.saveMode = 'local';
|
||||
},
|
||||
|
|
@ -143,7 +144,11 @@ export default {
|
|||
this.$modal.hide(modalNames.CONF_EDITOR);
|
||||
},
|
||||
writeToDisk() {
|
||||
this.writeConfigToDisk(this.config);
|
||||
const newData = this.jsonData;
|
||||
this.writeConfigToDisk(newData);
|
||||
// this.$store.commit(StoreKeys.SET_APP_CONFIG, newData.appConfig);
|
||||
this.$store.commit(StoreKeys.SET_PAGE_INFO, newData.pageInfo);
|
||||
this.$store.commit(StoreKeys.SET_SECTIONS, newData.sections);
|
||||
},
|
||||
saveLocally() {
|
||||
const msg = this.$t('interactive-editor.menu.save-locally-warning');
|
||||
|
|
|
|||
|
|
@ -22,6 +22,14 @@
|
|||
<DownloadConfigIcon />
|
||||
</Button>
|
||||
</div>
|
||||
<!-- Show path to which config file is being used -->
|
||||
<div class="config-path-info">
|
||||
<h3>Config Location</h3>
|
||||
<p>
|
||||
The base config file you are currently using is
|
||||
<a :href="configPath">{{ configPath }}</a>
|
||||
</p>
|
||||
</div>
|
||||
<!-- View Config in Tree Mode Section -->
|
||||
<h3>{{ $t('interactive-editor.export.view-title') }}</h3>
|
||||
<tree-view :data="config" class="config-tree-view" />
|
||||
|
|
@ -61,6 +69,11 @@ export default {
|
|||
allowViewConfig() {
|
||||
return this.$store.getters.permissions.allowViewConfig;
|
||||
},
|
||||
configPath() {
|
||||
return this.$store.state.currentConfigInfo?.confPath
|
||||
|| process.env.VUE_APP_CONFIG_PATH
|
||||
|| '/conf.yml';
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
convertJsonToYaml() {
|
||||
|
|
@ -121,6 +134,13 @@ export default {
|
|||
border-bottom: 1px dashed var(--interactive-editor-color);
|
||||
button { margin: 0 1rem; }
|
||||
}
|
||||
.config-path-info {
|
||||
p, a {
|
||||
color: var(--interactive-editor-color);
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
border-bottom: 1px dashed var(--interactive-editor-color);
|
||||
}
|
||||
.config-tree-view {
|
||||
padding: 0.5rem;
|
||||
font-family: var(--font-monospace);
|
||||
|
|
|
|||
|
|
@ -64,7 +64,6 @@ export default {
|
|||
return this.$store.state.editMode;
|
||||
},
|
||||
sectionKey() {
|
||||
if (this.isEditMode) return undefined;
|
||||
return `collapsible-${this.uniqueKey}`;
|
||||
},
|
||||
collapseClass() {
|
||||
|
|
@ -104,12 +103,23 @@ export default {
|
|||
watch: {
|
||||
checkboxState(newState) {
|
||||
this.isExpanded = newState;
|
||||
this.updateLocalStorage(); // Save every change immediately
|
||||
},
|
||||
uniqueKey() {
|
||||
this.checkboxState = this.isExpanded;
|
||||
uniqueKey(newVal, oldVal) {
|
||||
if (newVal !== oldVal) {
|
||||
this.refreshCollapseState(); // Refresh state when key changes
|
||||
}
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
refreshCollapseState() {
|
||||
this.checkboxState = this.isExpanded;
|
||||
},
|
||||
updateLocalStorage() {
|
||||
const collapseState = this.locallyStoredCollapseStates();
|
||||
collapseState[this.uniqueKey] = this.checkboxState;
|
||||
localStorage.setItem(localStorageKeys.COLLAPSE_STATE, JSON.stringify(collapseState));
|
||||
},
|
||||
/* Either expand or collapse section, based on it's current state */
|
||||
toggle() {
|
||||
this.checkboxState = !this.checkboxState;
|
||||
|
|
|
|||
|
|
@ -34,6 +34,8 @@
|
|||
:statusSuccess="statusResponse ? statusResponse.successStatus : undefined"
|
||||
:statusText="statusResponse ? statusResponse.message : undefined"
|
||||
/>
|
||||
<!-- URL of the item (shown on hover, only on some themes) -->
|
||||
<p class="item-url">{{ item.url | shortUrl }}</p>
|
||||
<!-- Edit icon (displayed only when in edit mode) -->
|
||||
<EditModeIcon v-if="isEditMode" class="edit-mode-item" @click="openItemSettings()" />
|
||||
</a>
|
||||
|
|
@ -122,6 +124,26 @@ export default {
|
|||
}
|
||||
},
|
||||
},
|
||||
filters: {
|
||||
shortUrl(value) {
|
||||
if (!value || typeof value !== 'string') {
|
||||
return '';
|
||||
}
|
||||
try {
|
||||
// Use URL constructor to parse the input
|
||||
const url = new URL(value);
|
||||
return url.hostname;
|
||||
} catch (e) {
|
||||
// If the input is not a valid URL, try to handle it as an IP address
|
||||
const ipPattern = /^(\d{1,3}\.){3}\d{1,3}/;
|
||||
const match = value.match(ipPattern);
|
||||
if (match) {
|
||||
return match[0];
|
||||
}
|
||||
return '';
|
||||
}
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
editMenuOpen: false,
|
||||
|
|
@ -209,6 +231,9 @@ export default {
|
|||
&.span-7 { min-width: 14%; }
|
||||
&.span-8 { min-width: 12.5%; }
|
||||
}
|
||||
.item-url {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.item {
|
||||
|
|
|
|||
|
|
@ -21,7 +21,6 @@
|
|||
</template>
|
||||
|
||||
<script>
|
||||
import simpleIcons from 'simple-icons';
|
||||
import BrokenImage from '@/assets/interface-icons/broken-icon.svg';
|
||||
import ErrorHandler from '@/utils/ErrorHandler';
|
||||
import EmojiUnicodeRegex from '@/utils/EmojiUnicodeRegex';
|
||||
|
|
@ -29,6 +28,8 @@ import emojiLookup from '@/utils/emojis.json';
|
|||
import { asciiHash } from '@/utils/MiscHelpers';
|
||||
import { faviconApi as defaultFaviconApi, faviconApiEndpoints, iconCdns } from '@/utils/defaults';
|
||||
|
||||
const simpleicons = require('simple-icons');
|
||||
|
||||
export default {
|
||||
name: 'Icon',
|
||||
props: {
|
||||
|
|
@ -71,6 +72,7 @@ export default {
|
|||
else if (img.includes('mdi-')) imgType = 'mdi';
|
||||
else if (img.includes('si-')) imgType = 'si';
|
||||
else if (img.includes('hl-')) imgType = 'home-lab-icons';
|
||||
else if (img.includes('sh-')) imgType = 'selfhst-icons';
|
||||
else if (img.includes('favicon-')) imgType = 'custom-favicon';
|
||||
else if (img === 'favicon') imgType = 'favicon';
|
||||
else if (img === 'generative') imgType = 'generative';
|
||||
|
|
@ -89,6 +91,7 @@ export default {
|
|||
case 'mdi': return img; // Material design icons
|
||||
case 'simple-icons': return this.getSimpleIcon(img);
|
||||
case 'home-lab-icons': return this.getHomeLabIcon(img);
|
||||
case 'selfhst-icons': return this.getSelfhstIcon(img); // selfh.st/icons
|
||||
case 'svg': return img; // Local SVG icon
|
||||
case 'emoji': return img; // Emoji/ unicode
|
||||
default: return '';
|
||||
|
|
@ -186,14 +189,18 @@ export default {
|
|||
},
|
||||
/* Returns the SVG path content */
|
||||
getSimpleIcon(img) {
|
||||
const imageName = img.replace('si-', '');
|
||||
const icon = simpleIcons.Get(imageName);
|
||||
const imageName = img.charAt(3).toUpperCase() + img.slice(4);
|
||||
const icon = simpleicons[`si${imageName}`];
|
||||
if (!icon) {
|
||||
this.imageNotFound(`No icon was found for '${imageName}' in Simple Icons`);
|
||||
return null;
|
||||
}
|
||||
return icon.path;
|
||||
},
|
||||
getSelfhstIcon(img, cdn) {
|
||||
const imageName = img.slice(3).toLocaleLowerCase();
|
||||
return (cdn || iconCdns.sh).replace('{icon}', imageName);
|
||||
},
|
||||
/* Gets home-lab icon from GitHub */
|
||||
getHomeLabIcon(img, cdn) {
|
||||
const imageName = img.replace('hl-', '').toLocaleLowerCase();
|
||||
|
|
|
|||
153
src/components/PageStrcture/CriticalError.vue
Normal file
|
|
@ -0,0 +1,153 @@
|
|||
<template>
|
||||
<div class="critical-error-wrap" v-if="shouldShow">
|
||||
<button class="close" title="Close Warning" @click="close">🗙</button>
|
||||
<h3>{{ $t('critical-error.title') }}</h3>
|
||||
<p>{{ $t('critical-error.subtitle') }}</p>
|
||||
<h4>{{ $t('critical-error.sub-ensure-that') }}</h4>
|
||||
<ul>
|
||||
<li>The configuration file can be found at the specified location</li>
|
||||
<li>There are no CORS rules preventing client-side access</li>
|
||||
<li>The YAML is valid, parsable and matches the schema</li>
|
||||
</ul>
|
||||
<h4>{{ $t('critical-error.sub-error-details') }}</h4>
|
||||
<pre>{{ this.$store.state.criticalError }}</pre>
|
||||
<h4>{{ $t('critical-error.sub-next-steps') }}</h4>
|
||||
<ul>
|
||||
<li>Check the browser console for more details
|
||||
(<a href="https://github.com/Lissy93/dashy/blob/master/docs/troubleshooting.md#how-to-open-browser-console">see how</a>)
|
||||
</li>
|
||||
<li>View the
|
||||
<a href="https://github.com/Lissy93/dashy/blob/master/docs/troubleshooting.md">Troubleshooting Guide</a>
|
||||
and <a href="https://dashy.to/docs/">Docs</a>
|
||||
</li>
|
||||
<li>
|
||||
If you've verified the config is present, accessible and valid, and cannot find the solution
|
||||
in the troubleshooting, docs or GitHub issues,
|
||||
then <a href="https://github.com/Lissy93/dashy/issues/new/choose">open a ticket on GitHub</a>
|
||||
</li>
|
||||
<li>Click 'Ignore Critical Errors' below to not show this warning again</li>
|
||||
</ul>
|
||||
<button class="user-doesnt-care" @click="ignoreWarning">
|
||||
{{ $t('critical-error.ignore-button') }}
|
||||
</button>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { localStorageKeys } from '@/utils/defaults';
|
||||
import Keys from '@/utils/StoreMutations';
|
||||
|
||||
export default {
|
||||
name: 'CriticalError',
|
||||
computed: {
|
||||
/* Determines if we should show this component.
|
||||
* If error present AND user hasn't disabled */
|
||||
shouldShow() {
|
||||
return this.$store.state.criticalError
|
||||
&& !localStorage[localStorageKeys.DISABLE_CRITICAL_WARNING];
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
/* Ignore all future errors, by putting a key in local storage */
|
||||
ignoreWarning() {
|
||||
localStorage.setItem(localStorageKeys.DISABLE_CRITICAL_WARNING, true);
|
||||
this.close();
|
||||
},
|
||||
/* Close this dialog, by removing this error from the local store */
|
||||
close() {
|
||||
this.$store.commit(Keys.CRITICAL_ERROR_MSG, null);
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
@import '@/styles/media-queries.scss';
|
||||
.critical-error-wrap {
|
||||
position: absolute;
|
||||
top: 40%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
z-index: 3;
|
||||
max-width: 50rem;
|
||||
background: var(--background-darker);
|
||||
padding: 1rem;
|
||||
border-radius: var(--curve-factor);
|
||||
color: var(--danger);
|
||||
border: 2px solid var(--danger);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
gap: 0.5rem;
|
||||
transition: all 0.2s ease-in-out;
|
||||
@include tablet-down {
|
||||
top: 50%;
|
||||
width: 85vw;
|
||||
}
|
||||
p, ul, h4, a {
|
||||
margin: 0;
|
||||
color: var(--white);
|
||||
}
|
||||
pre {
|
||||
color: var(--warning);
|
||||
font-size: 0.8rem;
|
||||
overflow: auto;
|
||||
background: var(--transparent-white-10);
|
||||
padding: 0.5rem;
|
||||
border-radius: var(--curve-factor);
|
||||
}
|
||||
h4 {
|
||||
margin: 0.5rem 0 0 0;
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
h3 {
|
||||
font-size: 2.2rem;
|
||||
text-align: center;
|
||||
background: var(--danger);
|
||||
color: var(--white);
|
||||
margin: -1rem -1rem 1rem -1rem;
|
||||
padding: 0.5rem;
|
||||
}
|
||||
ul {
|
||||
padding-left: 1rem;
|
||||
}
|
||||
.user-doesnt-care {
|
||||
background: var(--background-darker);
|
||||
color: var(--white);
|
||||
border-radius: var(--curve-factor);
|
||||
border: none;
|
||||
text-decoration: underline;
|
||||
padding: 0.25rem 0.5rem;
|
||||
cursor: pointer;
|
||||
width: fit-content;
|
||||
margin: 0 auto;
|
||||
transition: all 0.2s ease-in-out;
|
||||
&:hover {
|
||||
background: var(--danger);
|
||||
color: var(--background-darker);
|
||||
text-decoration: none;
|
||||
}
|
||||
}
|
||||
.close {
|
||||
position: absolute;
|
||||
top: 1rem;
|
||||
right: 1rem;
|
||||
width: 1.5rem;
|
||||
height: 1.5rem;
|
||||
padding: 0;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
font-size: 1rem;
|
||||
background: var(--background);
|
||||
color: var(--primary);
|
||||
border: none;
|
||||
border-radius: var(--curve-factor);
|
||||
transition: all 0.2s ease-in-out;
|
||||
&:hover {
|
||||
background: var(--primary);
|
||||
color: var(--background);
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
@ -1,16 +1,13 @@
|
|||
<template>
|
||||
<!-- User Footer -->
|
||||
<footer v-if="text && text !== '' && visible" v-html="text"></footer>
|
||||
<!-- Default Footer -->
|
||||
<footer v-else-if="visible">
|
||||
<span v-if="$store.state.currentConfigInfo" class="path-to-config">
|
||||
Using: {{ $store.state.currentConfigInfo.confPath }}
|
||||
</span>
|
||||
<span>
|
||||
{{ $t('footer.dev-by') }} <a :href="authorUrl">{{authorName}}</a>.
|
||||
{{ $t('footer.licensed-under') }} <a :href="licenseUrl">{{license}}</a>
|
||||
{{ showCopyright? '©': '' }} {{date}}.
|
||||
{{ $t('footer.get-the') }} <a :href="repoUrl">{{ $t('footer.source-code') }}</a>.
|
||||
<footer v-if="visible">
|
||||
<!-- User-defined footer -->
|
||||
<span v-if="text" v-html="text"></span>
|
||||
<!-- Default footer -->
|
||||
<span v-else>
|
||||
<a :href="defaultInfo.projectUrl">Dashy</a> is free & open source
|
||||
- licensed under <a :href="defaultInfo.licenseUrl">{{defaultInfo.license}}</a>,
|
||||
© <a :href="defaultInfo.authorUrl">{{defaultInfo.authorName}}</a> {{defaultInfo.date}}.
|
||||
Get support on GitHub, at <a :href="defaultInfo.repoUrl">{{defaultInfo.repoName}}</a>.
|
||||
</span>
|
||||
</footer>
|
||||
</template>
|
||||
|
|
@ -23,13 +20,20 @@ export default {
|
|||
name: 'Footer',
|
||||
props: {
|
||||
text: String,
|
||||
authorName: { type: String, default: 'Alicia Sykes' },
|
||||
authorUrl: { type: String, default: 'https://aliciasykes.com' },
|
||||
license: { type: String, default: 'MIT' },
|
||||
licenseUrl: { type: String, default: 'https://gist.github.com/Lissy93/143d2ee01ccc5c052a17' },
|
||||
date: { type: String, default: `${new Date().getFullYear()}` },
|
||||
showCopyright: { type: Boolean, default: true },
|
||||
repoUrl: { type: String, default: 'https://github.com/lissy93/dashy' },
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
defaultInfo: {
|
||||
authorName: 'Alicia Sykes',
|
||||
authorUrl: 'https://as93.net',
|
||||
license: 'MIT',
|
||||
licenseUrl: 'https://gist.github.com/Lissy93/143d2ee01ccc5c052a17',
|
||||
date: `${new Date().getFullYear()}`,
|
||||
repoUrl: 'https://github.com/lissy93/dashy',
|
||||
repoName: 'Lissy93/Dashy',
|
||||
projectUrl: 'https://dashy.to',
|
||||
},
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
visible() {
|
||||
|
|
@ -56,7 +60,7 @@ footer {
|
|||
display: none;
|
||||
}
|
||||
span.path-to-config {
|
||||
float: right;
|
||||
float: left;
|
||||
font-size: 0.75rem;
|
||||
margin: 0.1rem 0.5rem 0 0;
|
||||
opacity: var(--dimming-factor);
|
||||
|
|
|
|||
|
|
@ -66,7 +66,7 @@ export default {
|
|||
span.subtitle {
|
||||
color: var(--heading-text-color);
|
||||
font-style: italic;
|
||||
text-shadow: 1px 1px 2px #130f23;
|
||||
text-shadow: 1px 1px 2px #130f2347;
|
||||
opacity: var(--dimming-factor);
|
||||
}
|
||||
img.site-logo {
|
||||
|
|
|
|||
|
|
@ -24,6 +24,13 @@
|
|||
v-tooltip="tooltip($t('settings.sign-out-tooltip'))"
|
||||
class="layout-icon" tabindex="-2"
|
||||
/>
|
||||
<!-- If user logged in via oidc, show oidc logout button -->
|
||||
<IconLogout
|
||||
v-if="userType == userStateEnum.oidcEnabled"
|
||||
@click="oidcLogout()"
|
||||
v-tooltip="tooltip($t('settings.sign-out-tooltip'))"
|
||||
class="layout-icon" tabindex="-2"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
|
@ -32,6 +39,7 @@
|
|||
import router from '@/router';
|
||||
import { logout as registerLogout } from '@/utils/Auth';
|
||||
import { getKeycloakAuth } from '@/utils/KeycloakAuth';
|
||||
import { getOidcAuth } from '@/utils/OidcAuth';
|
||||
import { localStorageKeys, userStateEnum } from '@/utils/defaults';
|
||||
import IconLogout from '@/assets/interface-icons/user-logout.svg';
|
||||
|
||||
|
|
@ -56,6 +64,13 @@ export default {
|
|||
router.push({ path: '/login' });
|
||||
}, 500);
|
||||
},
|
||||
oidcLogout() {
|
||||
const oidc = getOidcAuth();
|
||||
this.$toasted.show(this.$t('login.logout-message'));
|
||||
setTimeout(() => {
|
||||
oidc.logout();
|
||||
}, 500);
|
||||
},
|
||||
keycloakLogout() {
|
||||
const keycloak = getKeycloakAuth();
|
||||
this.$toasted.show(this.$t('login.logout-message'));
|
||||
|
|
|
|||
|
|
@ -37,8 +37,10 @@ export default {
|
|||
input: '',
|
||||
};
|
||||
},
|
||||
props: {
|
||||
iconSize: String,
|
||||
computed: {
|
||||
iconSize() {
|
||||
return this.$store.getters.iconSize;
|
||||
},
|
||||
},
|
||||
components: {
|
||||
IconSmall,
|
||||
|
|
|
|||
|
|
@ -5,19 +5,19 @@
|
|||
<IconDeafault
|
||||
@click="updateDisplayLayout('auto')"
|
||||
v-tooltip="tooltip($t('settings.layout-auto'))"
|
||||
:class="`layout-icon ${displayLayout === 'auto' ? 'selected' : ''}`"
|
||||
:class="`layout-icon ${layout === 'auto' ? 'selected' : ''}`"
|
||||
tabindex="-2"
|
||||
/>
|
||||
<IconHorizontal
|
||||
@click="updateDisplayLayout('horizontal')"
|
||||
v-tooltip="tooltip($t('settings.layout-horizontal'))"
|
||||
:class="`layout-icon ${displayLayout === 'horizontal' ? 'selected' : ''}`"
|
||||
:class="`layout-icon ${layout === 'horizontal' ? 'selected' : ''}`"
|
||||
tabindex="-2"
|
||||
/>
|
||||
<IconVertical
|
||||
@click="updateDisplayLayout('vertical')"
|
||||
v-tooltip="tooltip($t('settings.layout-vertical'))"
|
||||
:class="`layout-icon ${displayLayout === 'vertical' ? 'selected' : ''}`"
|
||||
:class="`layout-icon ${layout === 'vertical' ? 'selected' : ''}`"
|
||||
tabindex="-2"
|
||||
/>
|
||||
</div>
|
||||
|
|
@ -40,6 +40,11 @@ export default {
|
|||
IconHorizontal,
|
||||
IconVertical,
|
||||
},
|
||||
computed: {
|
||||
layout() {
|
||||
return this.$store.getters.layout;
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
updateDisplayLayout(layout) {
|
||||
this.$store.commit(StoreKeys.SET_ITEM_LAYOUT, layout);
|
||||
|
|
|
|||
|
|
@ -1,36 +1,70 @@
|
|||
<template>
|
||||
<transition name="slide-fade">
|
||||
<div class="kb-sc-info" v-if="!shouldHide">
|
||||
<h5>There are keyboard shortcuts! ⌨️🙌</h5>
|
||||
<h5>{{ popupContent.title }}</h5>
|
||||
<div class="close" title="Hide forever [Esc]" @click="hideWelcomeHelper()">x</div>
|
||||
<p title="Press [Esc] to hide this tip forever. See there's even a shortcut for that! 🚀">
|
||||
Just start typing to filter. Then use the tab key to cycle through results,
|
||||
and press enter to launch the selected item, or alt + enter to open in a modal.
|
||||
You can hit Esc at anytime to clear the search. Easy 🥳
|
||||
</p>
|
||||
<p :title="popupContent.hoverText">{{ popupContent.message }}</p>
|
||||
<p :title="popupContent.hoverText">{{ popupContent.messageContinued }}</p>
|
||||
<div class="action-buttons">
|
||||
<button @click="exportConfig">Export Local Config</button>
|
||||
<button @click="saveConfig">Save Changes to Disk</button>
|
||||
<button @click="resetLocalConfig">Reset Local Changes</button>
|
||||
<button @click="hideWelcomeHelper">Dismiss this Notification</button>
|
||||
</div>
|
||||
</div>
|
||||
</transition>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
||||
import { localStorageKeys } from '@/utils/defaults';
|
||||
import { localStorageKeys, modalNames } from '@/utils/defaults';
|
||||
import StoreKeys from '@/utils/StoreMutations';
|
||||
import configSavingMixin from '@/mixins/ConfigSaving';
|
||||
|
||||
export default {
|
||||
name: 'KeyboardShortcutInfo',
|
||||
mixins: [configSavingMixin],
|
||||
data() {
|
||||
return {
|
||||
shouldHide: true, // False = show/ true = hide. Intuitive, eh?
|
||||
timeDelay: 3000, // Short delay in ms before popup appears
|
||||
timeDelay: 2000, // Short delay in ms before popup appears
|
||||
popupContent: {
|
||||
title: '⚠️ You\'re using a local config',
|
||||
message: `This means that your settings are saved in this browser only,
|
||||
and won't persist across devices.`,
|
||||
messageContinued: `To ensure you don't loose your changes,
|
||||
it's recommended to download a copy of your config, so you can restore it later.`,
|
||||
hoverText: 'Press [Esc] to hide this warning',
|
||||
},
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
exportConfig() {
|
||||
this.$modal.show(modalNames.EXPORT_CONFIG_MENU);
|
||||
this.shouldHide = true;
|
||||
},
|
||||
saveConfig() {
|
||||
const localConfig = this.$store.state.config;
|
||||
this.writeConfigToDisk(localConfig);
|
||||
this.shouldHide = true;
|
||||
},
|
||||
resetLocalConfig() {
|
||||
const msg = `${this.$t('config.reset-config-msg-l1')} `
|
||||
+ `${this.$t('config.reset-config-msg-l2')}\n\n${this.$t('config.reset-config-msg-l3')}`;
|
||||
const isTheUserSure = confirm(msg); // eslint-disable-line no-alert, no-restricted-globals
|
||||
if (isTheUserSure) {
|
||||
localStorage.clear();
|
||||
this.$toasted.show(this.$t('config.data-cleared-msg'));
|
||||
this.$store.dispatch(StoreKeys.INITIALIZE_CONFIG);
|
||||
this.shouldHide = true;
|
||||
}
|
||||
},
|
||||
/**
|
||||
* Returns true if the key exists in session storage, otherwise false
|
||||
* And the !! just converts 'false' to false, as strings resolve to true
|
||||
*/
|
||||
shouldHideWelcomeMessage() {
|
||||
return !!localStorage[localStorageKeys.HIDE_WELCOME_BANNER];
|
||||
return !!localStorage[localStorageKeys.HIDE_INFO_NOTIFICATION];
|
||||
},
|
||||
/**
|
||||
* Update session storage, so that it won't be shown again
|
||||
|
|
@ -38,7 +72,7 @@ export default {
|
|||
*/
|
||||
hideWelcomeHelper() {
|
||||
this.shouldHide = true;
|
||||
localStorage.setItem(localStorageKeys.HIDE_WELCOME_BANNER, true);
|
||||
localStorage.setItem(localStorageKeys.HIDE_INFO_NOTIFICATION, true);
|
||||
window.removeEventListener('keyup', this.keyPressEvent);
|
||||
},
|
||||
/* Passed to window function, to add/ remove event listener */
|
||||
|
|
@ -114,6 +148,23 @@ export default {
|
|||
}
|
||||
}
|
||||
}
|
||||
.action-buttons {
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
margin-top: 1em;
|
||||
button {
|
||||
padding: 0.2rem;
|
||||
background: var(--welcome-popup-background);
|
||||
color: var(--welcome-popup-text-color);
|
||||
border: 1px solid var(--welcome-popup-text-color);
|
||||
border-radius: var(--curve-factor);
|
||||
transition: all 0.2s ease-in-out;
|
||||
&:hover {
|
||||
background: var(--welcome-popup-text-color);
|
||||
color: var(--welcome-popup-background);
|
||||
}
|
||||
}
|
||||
}
|
||||
/* Animations, animations everywhere */
|
||||
.slide-fade-enter-active {
|
||||
transition: all 1s ease;
|
||||
|
|
@ -95,7 +95,8 @@ export default {
|
|||
},
|
||||
/* If configured, launch specific app when hotkey pressed */
|
||||
handleHotKey(key) {
|
||||
const usersHotKeys = this.getCustomKeyShortcuts();
|
||||
const sections = this.$store.getters.sections || [];
|
||||
const usersHotKeys = this.getCustomKeyShortcuts(sections);
|
||||
usersHotKeys.forEach((hotkey) => {
|
||||
if (hotkey.hotkey === parseInt(key, 10)) {
|
||||
if (hotkey.url) window.open(hotkey.url, '_blank');
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
<div class="options-outer">
|
||||
<div :class="`options-container ${!settingsVisible ? 'hide' : ''}`">
|
||||
<ThemeSelector />
|
||||
<LayoutSelector :displayLayout="displayLayout" />
|
||||
<LayoutSelector :displayLayout="$store.getters.layout" />
|
||||
<ItemSizeSelector :iconSize="iconSize" />
|
||||
<ConfigLauncher />
|
||||
<AuthButtons v-if="userState !== 0" :userType="userState" />
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
:value="$store.getters.theme"
|
||||
class="theme-dropdown"
|
||||
:tabindex="-2"
|
||||
@input="themeChanged"
|
||||
@input="themeChangedInUI"
|
||||
/>
|
||||
</div>
|
||||
<IconPalette
|
||||
|
|
@ -28,18 +28,13 @@
|
|||
<script>
|
||||
|
||||
import CustomThemeMaker from '@/components/Settings/CustomThemeMaker';
|
||||
import {
|
||||
LoadExternalTheme,
|
||||
ApplyLocalTheme,
|
||||
ApplyCustomVariables,
|
||||
} from '@/utils/ThemeHelper';
|
||||
import Defaults, { localStorageKeys } from '@/utils/defaults';
|
||||
import Keys from '@/utils/StoreMutations';
|
||||
import ErrorHandler from '@/utils/ErrorHandler';
|
||||
import IconPalette from '@/assets/interface-icons/config-color-palette.svg';
|
||||
import ThemingMixin from '@/mixins/ThemingMixin';
|
||||
|
||||
export default {
|
||||
name: 'ThemeSelector',
|
||||
mixins: [ThemingMixin],
|
||||
props: {
|
||||
hidePallete: Boolean,
|
||||
},
|
||||
|
|
@ -47,101 +42,16 @@ export default {
|
|||
CustomThemeMaker,
|
||||
IconPalette,
|
||||
},
|
||||
watch: {
|
||||
/* When theme in VueX store changes, then update theme */
|
||||
themeFromStore(newTheme) {
|
||||
this.selectedTheme = newTheme;
|
||||
this.updateTheme(newTheme);
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
selectedTheme: '',
|
||||
themeConfiguratorOpen: false, // Control the opening of theme config popup
|
||||
themeHelper: new LoadExternalTheme(),
|
||||
ApplyLocalTheme,
|
||||
ApplyCustomVariables,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
/* Get appConfig from store */
|
||||
appConfig() {
|
||||
return this.$store.getters.appConfig;
|
||||
},
|
||||
/* Get users theme from store */
|
||||
themeFromStore() {
|
||||
return this.$store.getters.theme;
|
||||
},
|
||||
/* Combines all theme names (builtin and user defined) together */
|
||||
themeNames: function themeNames() {
|
||||
const externalThemeNames = Object.keys(this.externalThemes);
|
||||
const specialThemes = ['custom'];
|
||||
return [...this.extraThemeNames, ...externalThemeNames,
|
||||
...Defaults.builtInThemes, ...specialThemes];
|
||||
},
|
||||
extraThemeNames() {
|
||||
const userThemes = this.appConfig.cssThemes || [];
|
||||
if (typeof userThemes === 'string') return [userThemes];
|
||||
return userThemes;
|
||||
},
|
||||
/* Returns an array of links to external CSS from the Config */
|
||||
externalThemes() {
|
||||
const availibleThemes = {};
|
||||
if (this.appConfig && this.appConfig.externalStyleSheet) {
|
||||
const externals = this.appConfig.externalStyleSheet;
|
||||
if (Array.isArray(externals)) {
|
||||
externals.forEach((ext, i) => {
|
||||
availibleThemes[`External Stylesheet ${i + 1}`] = ext;
|
||||
});
|
||||
} else if (typeof externals === 'string') {
|
||||
availibleThemes['External Stylesheet'] = this.appConfig.externalStyleSheet;
|
||||
} else {
|
||||
ErrorHandler('External stylesheets must be of type string or string[]');
|
||||
}
|
||||
}
|
||||
// availibleThemes.Default = '#';
|
||||
return availibleThemes;
|
||||
},
|
||||
},
|
||||
computed: {},
|
||||
mounted() {
|
||||
const initialTheme = this.getInitialTheme();
|
||||
this.selectedTheme = initialTheme;
|
||||
// Quicker loading, if the theme is local we can apply it immidiatley
|
||||
if (this.isThemeLocal(initialTheme)) {
|
||||
this.updateTheme(initialTheme);
|
||||
}
|
||||
|
||||
// If it's an external stylesheet, then wait for promise to resolve
|
||||
if (this.externalThemes && Object.entries(this.externalThemes).length > 0) {
|
||||
const added = Object.keys(this.externalThemes).map(
|
||||
name => this.themeHelper.add(name, this.externalThemes[name]),
|
||||
);
|
||||
// Once, added, then apply users initial theme
|
||||
Promise.all(added).then(() => {
|
||||
this.updateTheme(initialTheme);
|
||||
});
|
||||
}
|
||||
this.initializeTheme();
|
||||
},
|
||||
methods: {
|
||||
/* Called when dropdown changed
|
||||
* Updates store, which will in turn update theme through watcher
|
||||
*/
|
||||
themeChanged() {
|
||||
const pageId = this.$store.state.currentConfigInfo?.pageId || null;
|
||||
this.$store.commit(Keys.SET_THEME, { theme: this.selectedTheme, pageId });
|
||||
this.updateTheme(this.selectedTheme);
|
||||
},
|
||||
/* Returns the initial theme */
|
||||
getInitialTheme() {
|
||||
const localTheme = localStorage[localStorageKeys.THEME];
|
||||
if (localTheme && localTheme !== 'undefined') return localTheme;
|
||||
return this.appConfig.theme || Defaults.theme;
|
||||
},
|
||||
/* Determines if a given theme is local / not a custom user stylesheet */
|
||||
isThemeLocal(themeToCheck) {
|
||||
const localThemes = [...Defaults.builtInThemes, ...this.extraThemeNames];
|
||||
return localThemes.includes(themeToCheck);
|
||||
},
|
||||
/* Opens the theme color configurator popup */
|
||||
openThemeConfigurator() {
|
||||
this.$store.commit(Keys.SET_MODAL_OPEN, true);
|
||||
|
|
@ -154,24 +64,6 @@ export default {
|
|||
this.themeConfiguratorOpen = false;
|
||||
}
|
||||
},
|
||||
/* Updates theme. Checks if the new theme is local or external,
|
||||
and calls appropirate updating function. Updates local storage */
|
||||
updateTheme(newTheme) {
|
||||
if (newTheme === 'Default') {
|
||||
this.resetToDefault();
|
||||
this.themeHelper.theme = 'Default';
|
||||
} else if (this.isThemeLocal(newTheme)) {
|
||||
this.ApplyLocalTheme(newTheme);
|
||||
} else {
|
||||
this.themeHelper.theme = newTheme;
|
||||
}
|
||||
this.ApplyCustomVariables(newTheme);
|
||||
// localStorage.setItem(localStorageKeys.THEME, newTheme);
|
||||
},
|
||||
/* Removes any applied themes */
|
||||
resetToDefault() {
|
||||
document.getElementsByTagName('html')[0].removeAttribute('data-theme');
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ export default {
|
|||
/* URL/ IP or hostname to the AdGuardHome instance, without trailing slash */
|
||||
hostname() {
|
||||
if (!this.options.hostname) this.error('You must specify the path to your AdGuard server');
|
||||
return this.options.hostname;
|
||||
return this.parseAsEnvVar(this.options.hostname);
|
||||
},
|
||||
showFullInfo() {
|
||||
return this.options.showFullInfo;
|
||||
|
|
@ -39,7 +39,9 @@ export default {
|
|||
},
|
||||
authHeaders() {
|
||||
if (this.options.username && this.options.password) {
|
||||
const encoded = window.btoa(`${this.options.username}:${this.options.password}`);
|
||||
const password = this.parseAsEnvVar(this.options.password);
|
||||
const username = this.parseAsEnvVar(this.options.username);
|
||||
const encoded = window.btoa(`${username}:${password}`);
|
||||
return { Authorization: `Basic ${encoded}` };
|
||||
}
|
||||
return {};
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ export default {
|
|||
/* URL/ IP or hostname to the AdGuardHome instance, without trailing slash */
|
||||
hostname() {
|
||||
if (!this.options.hostname) this.error('You must specify the path to your AdGuard server');
|
||||
return this.options.hostname;
|
||||
return this.parseAsEnvVar(this.options.hostname);
|
||||
},
|
||||
showOnOffStatusOnly() {
|
||||
return this.options.showOnOffStatusOnly;
|
||||
|
|
@ -48,7 +48,9 @@ export default {
|
|||
},
|
||||
authHeaders() {
|
||||
if (this.options.username && this.options.password) {
|
||||
const encoded = window.btoa(`${this.options.username}:${this.options.password}`);
|
||||
const username = this.parseAsEnvVar(this.options.username);
|
||||
const password = this.parseAsEnvVar(this.options.password);
|
||||
const encoded = window.btoa(`${username}:${password}`);
|
||||
return { Authorization: `Basic ${encoded}` };
|
||||
}
|
||||
return {};
|
||||
|
|
|
|||
|
|
@ -20,14 +20,16 @@ export default {
|
|||
/* URL/ IP or hostname to the AdGuardHome instance, without trailing slash */
|
||||
hostname() {
|
||||
if (!this.options.hostname) this.error('You must specify the path to your AdGuard server');
|
||||
return this.options.hostname;
|
||||
return this.parseAsEnvVar(this.options.hostname);
|
||||
},
|
||||
endpoint() {
|
||||
return `${this.hostname}/control/stats`;
|
||||
},
|
||||
authHeaders() {
|
||||
if (this.options.username && this.options.password) {
|
||||
const encoded = window.btoa(`${this.options.username}:${this.options.password}`);
|
||||
const username = this.parseAsEnvVar(this.options.username);
|
||||
const password = this.parseAsEnvVar(this.options.password);
|
||||
const encoded = window.btoa(`${username}:${password}`);
|
||||
return { Authorization: `Basic ${encoded}` };
|
||||
}
|
||||
return {};
|
||||
|
|
|
|||
|
|
@ -36,11 +36,13 @@ export default {
|
|||
/* URL/ IP or hostname to the AdGuardHome instance, without trailing slash */
|
||||
hostname() {
|
||||
if (!this.options.hostname) this.error('You must specify the path to your AdGuard server');
|
||||
return this.options.hostname;
|
||||
return this.parseAsEnvVar(this.options.hostname);
|
||||
},
|
||||
authHeaders() {
|
||||
if (this.options.username && this.options.password) {
|
||||
const encoded = window.btoa(`${this.options.username}:${this.options.password}`);
|
||||
const username = this.parseAsEnvVar(this.options.username);
|
||||
const password = this.parseAsEnvVar(this.options.password);
|
||||
const encoded = window.btoa(`${username}:${password}`);
|
||||
return { Authorization: `Basic ${encoded}` };
|
||||
}
|
||||
return {};
|
||||
|
|
|
|||
|
|
@ -113,7 +113,7 @@ export default {
|
|||
},
|
||||
computed: {
|
||||
hostname() {
|
||||
return this.options.hostname || widgetApiEndpoints.anonAddy;
|
||||
return this.parseAsEnvVar(this.options.hostname) || widgetApiEndpoints.anonAddy;
|
||||
},
|
||||
apiVersion() {
|
||||
return this.options.apiVersion || 'v1';
|
||||
|
|
@ -132,7 +132,7 @@ export default {
|
|||
},
|
||||
apiKey() {
|
||||
if (!this.options.apiKey) this.error('An apiKey is required');
|
||||
return this.options.apiKey;
|
||||
return this.parseAsEnvVar(this.options.apiKey);
|
||||
},
|
||||
hideMeta() {
|
||||
return this.options.hideMeta;
|
||||
|
|
|
|||