Compare commits
2209 commits
develop
...
feature/nv
Author | SHA1 | Date | |
---|---|---|---|
|
bf91e5251c | ||
|
3dfefc9f16 | ||
|
9289178624 | ||
|
a704192b73 | ||
|
688368e4e1 | ||
|
81cc4b3f49 | ||
|
e02fe02f35 | ||
|
6fb2fc3906 | ||
|
b5a03e40f1 | ||
|
24e49e39db | ||
|
186f2494fd | ||
|
d706b80e37 | ||
|
ac90543382 | ||
|
1b69006040 | ||
|
3def9ab3b7 | ||
|
22188b9709 | ||
|
0e8c30d3fa | ||
|
21e7529725 | ||
|
9093319906 | ||
|
0cc81624b5 | ||
|
e923172bec | ||
|
45929f95f4 | ||
|
44990a1ddb | ||
|
e9d55ff44b | ||
|
4e84d45a20 | ||
|
48b53428d0 | ||
|
4eb695f3c3 | ||
|
8a69a9c90e | ||
|
ad46ccfd33 | ||
|
b1ef858b49 | ||
|
9dd3ad6445 | ||
|
14f40f0051 | ||
|
a480e1be55 | ||
|
113a1ebe59 | ||
|
68b2dcfd75 | ||
|
46d4327fce | ||
|
0094ba8a2d | ||
|
085de45d02 | ||
|
edc5638385 | ||
|
a7045cecfb | ||
|
fa23360f13 | ||
|
abff66eada | ||
|
95fcac3e55 | ||
|
e118a28542 | ||
|
7cba70eb70 | ||
|
256fd485fd | ||
|
4c0d30c368 | ||
|
1a842703b4 | ||
|
2e6baa8ccf | ||
|
3185512753 | ||
|
9046b76536 | ||
|
1c2f0d49dc | ||
|
813bea02ab | ||
|
5f2ca1f957 | ||
|
9f8bebf5f8 | ||
|
4fe24fec1a | ||
|
a6a37d6c90 | ||
|
d8512d5485 | ||
|
93a72f31a5 | ||
|
f2371daff3 | ||
|
5a20d2af27 | ||
|
3fbeaf0e9e | ||
|
b30814913f | ||
|
69da6fa295 | ||
|
4ca445b587 | ||
|
653c71dad5 | ||
|
ace8350043 | ||
|
b02f62dba4 | ||
|
474a02bfe0 | ||
|
5c88cef03b | ||
|
cbdd09dd4a | ||
|
3e1048d3b1 | ||
|
6eee77cbc5 | ||
|
69efbf8fda | ||
|
b862402ce9 | ||
|
63cd831cf6 | ||
|
7ea17df2ba | ||
|
209cd8a7c8 | ||
|
631355c2c8 | ||
|
54de8b92d8 | ||
|
f61b157a70 | ||
|
43c985d78c | ||
|
c135d16024 | ||
|
60b959f63f | ||
|
254a9e8716 | ||
|
3de2617d6b | ||
|
8b6d3167bc | ||
|
4ddb65410b | ||
|
2f2fd293dc | ||
|
843641819c | ||
|
c6d597e886 | ||
|
31e0ac1ee8 | ||
|
12e1e676fa | ||
|
a6fdb28560 | ||
|
817c1d2e4b | ||
|
103d655ed4 | ||
|
fcc59cd35f | ||
|
fadf8144de | ||
|
1a714fb8e4 | ||
|
d103d69727 | ||
|
8fdd3e09c6 | ||
|
450c92f3e7 | ||
|
34de28cddf | ||
|
5d33c34aa8 | ||
|
004d8f18fa | ||
|
f9c0d91865 | ||
|
41ce22aa1c | ||
|
6e79148152 | ||
|
b8406ecaa4 | ||
|
23ad352088 | ||
|
b54b8d4d2e | ||
|
6cfdc31e94 | ||
|
8b08b2e572 | ||
|
8b0e3161a3 | ||
|
838ca1841a | ||
|
f2b014b4a8 | ||
|
65c73c67de | ||
|
057af8180d | ||
|
5bf632d3eb | ||
|
72e5b4f487 | ||
|
b266b21b91 | ||
|
f331592d66 | ||
|
d1dda3a178 | ||
|
f7564d87b0 | ||
|
96e1a93216 | ||
|
5a481f6286 | ||
|
a0ca938fbd | ||
|
a1cddb95c9 | ||
|
f5cd9449e9 | ||
|
f08e5cd250 | ||
|
4a1dbfad29 | ||
|
da2368bf7a | ||
|
6554b2eb9a | ||
|
d5eb131f58 | ||
|
62f1b799f8 | ||
|
5a3f84a934 | ||
|
77a4f74bc8 | ||
|
42f9d6eb5a | ||
|
7b9e6a8032 | ||
|
2c6beb66c3 | ||
|
0416c15c03 | ||
|
3c641b4461 | ||
|
b197464638 | ||
|
cca72dfbac | ||
|
f500086a0e | ||
|
a337f152f8 | ||
|
2078e64cd7 | ||
|
af0cc98ccf | ||
|
ba18da314f | ||
|
36972a64ae | ||
|
7571e96bd0 | ||
|
c2fe849e14 | ||
|
c422fb618b | ||
|
717aa899b1 | ||
|
3c2a8bec80 | ||
|
52e6bf7f4c | ||
|
d9b4ce79ac | ||
|
3c340b5142 | ||
|
569136b87c | ||
|
135860cc68 | ||
|
6bd6c62e8d | ||
|
ad27cb20ec | ||
|
9eec56f486 | ||
|
9293583bf5 | ||
|
c68c01a09e | ||
|
f2dc07522b | ||
|
fdbbd6652a | ||
|
f7c4d1a4b4 | ||
|
6acde3f034 | ||
|
54a1dc355c | ||
|
21a59dc497 | ||
|
d4c7db67ce | ||
|
bb0fe93631 | ||
|
8ec6cef20b | ||
|
32ab681714 | ||
|
5c9ff73b0a | ||
|
9ca850be06 | ||
|
f5f7493135 | ||
|
78921387b3 | ||
|
a60968f137 | ||
|
4bd399f321 | ||
|
26570158fd | ||
|
bb927f1668 | ||
|
44f593945c | ||
|
090fc75076 | ||
|
d9e56592f3 | ||
|
99be6d8b99 | ||
|
48d4b5a726 | ||
|
d1e53259fa | ||
|
7e4325f10b | ||
|
9bf87771bb | ||
|
d455c44261 | ||
|
ba4ed1652c | ||
|
8f391a87ac | ||
|
9c3fb431d5 | ||
|
e6b68012a7 | ||
|
86b4d74f46 | ||
|
13f37a8959 | ||
|
0efbe418c6 | ||
|
26a0ed1aba | ||
|
10e2f3e62a | ||
|
dc0243b8ea | ||
|
d44cb14615 | ||
|
83b56f4ad5 | ||
|
be3ec48511 | ||
|
b8c7342e49 | ||
|
6c4432aeba | ||
|
55133fcedd | ||
|
8683037677 | ||
|
654f31bc83 | ||
|
00c757a450 | ||
|
a630de2d3a | ||
|
069a775b0a | ||
|
d169ea1905 | ||
|
80f48f4dd5 | ||
|
a8d83a0e25 | ||
|
8aa0b8093f | ||
|
0e26e0c1a1 | ||
|
9838ae9680 | ||
|
72e8d9e1ce | ||
|
fd6b1b10fd | ||
|
fb33687157 | ||
|
41bfd0cc8c | ||
|
ed3ba64525 | ||
|
84cb921573 | ||
|
ed85d065b0 | ||
|
ce3308a290 | ||
|
b3b97f0866 | ||
|
2fda83c321 | ||
|
d06ed1b477 | ||
|
d19e33485d | ||
|
61e290e32a | ||
|
95595dafcb | ||
|
970b4907f3 | ||
|
1540db7af9 | ||
|
7df330ec29 | ||
|
c0ffb1db7f | ||
|
b759ec4539 | ||
|
1c434a2331 | ||
|
eb14539989 | ||
|
0ff2f2172e | ||
|
fad4692e01 | ||
|
7b51c56169 | ||
|
9e974161de | ||
|
ca971f1116 | ||
|
3a932b79e3 | ||
|
ed1fa593bd | ||
|
dc168cd3bc | ||
|
c8fc470e4e | ||
|
407f521757 | ||
|
56ff9ca223 | ||
|
5ed747fa88 | ||
|
c821f03b62 | ||
|
1d1727fdf0 | ||
|
72b40fe5ef | ||
|
76dab02a9d | ||
|
47db1e1c47 | ||
|
00bd8a35e7 | ||
|
42ce587572 | ||
|
577de84366 | ||
|
0902eb226b | ||
|
0164c77356 | ||
|
1e0becd6fb | ||
|
da704f341d | ||
|
680159c109 | ||
|
81bd92efa9 | ||
|
8e79ab69b0 | ||
|
81cd7600f7 | ||
|
9a2c05ef83 | ||
|
03741c4aa4 | ||
|
349fad7f8a | ||
|
f3f45bac5c | ||
|
6c8a58fb5d | ||
|
5a2990a2fa | ||
|
3dda8656f2 | ||
|
66448b5e52 | ||
|
03234acb8f | ||
|
d961c3d61d | ||
|
69f6955cf5 | ||
|
976f06f4e3 | ||
|
269bc3fdff | ||
|
641feb04e3 | ||
|
d6b902fd3d | ||
|
91cc7af40a | ||
|
0edc80b10a | ||
|
beb5f95ce4 | ||
|
2dcdb7d29e | ||
|
02e8269793 | ||
|
f85f072b4b | ||
|
86bb42b529 | ||
|
58b2f7f138 | ||
|
d12ebc3422 | ||
|
976a2b74fd | ||
|
adc8684081 | ||
|
e00af483b1 | ||
|
43861a8b87 | ||
|
5d42b8acbe | ||
|
b092e1467e | ||
|
b8b8d2bc7d | ||
|
df331269bf | ||
|
c19c67f6db | ||
|
4cb29beeaa | ||
|
2aba31312f | ||
|
9f224f3590 | ||
|
cf49e5ed2a | ||
|
abf47e54f3 | ||
|
cc52292985 | ||
|
c2933479b6 | ||
|
fd4d46b6a4 | ||
|
cb57411bba | ||
|
cd1679934a | ||
|
7a9c13c112 | ||
|
6cc56031f7 | ||
|
fbabfec24b | ||
|
acf376e7b9 | ||
|
513f56e2b3 | ||
|
2d8cd5fcde | ||
|
01d7e812c8 | ||
|
db865499c0 | ||
|
9350a8acab | ||
|
20bdaebe10 | ||
|
c0da8910a4 | ||
|
98f1c17991 | ||
|
be9328c851 | ||
|
4103154d52 | ||
|
22e2c5d246 | ||
|
7d85885fb6 | ||
|
21be41bc7e | ||
|
6282ccc614 | ||
|
3cf42ec658 | ||
|
40ddcd980e | ||
|
a9fcb162fc | ||
|
58a6b26475 | ||
|
309eff1654 | ||
|
a12d69ac29 | ||
|
1981467ba3 | ||
|
60e9acba76 | ||
|
66d9bd0c64 | ||
|
282e3d61c8 | ||
|
217a37a59a | ||
|
67a9a36c27 | ||
|
7c2dabd047 | ||
|
6b00abf05c | ||
|
54d3acafb3 | ||
|
f47832b1b4 | ||
|
0ff849fa02 | ||
|
ee5665e95b | ||
|
620dedab47 | ||
|
6381a7791e | ||
|
529ba76e6c | ||
|
ade6b5a5e7 | ||
|
e334494653 | ||
|
23badbc7c3 | ||
|
002e2e1a16 | ||
|
356fba3dd5 | ||
|
81e1fc67c1 | ||
|
fb8097f719 | ||
|
f752037a3a | ||
|
1c60269359 | ||
|
bbbfbc1061 | ||
|
5948b2b74c | ||
|
a0a3b128b6 | ||
|
c50225ff93 | ||
|
625be42329 | ||
|
b1e48f70d0 | ||
|
a79e5275fe | ||
|
e7065fd809 | ||
|
c33b7ac356 | ||
|
98401ff312 | ||
|
56bb3ac355 | ||
|
db0dab012d | ||
|
ac4ef7eace | ||
|
3dca9d07a9 | ||
|
f4652ce5fd | ||
|
5627a48ea2 | ||
|
0d215599be | ||
|
8a8e7be076 | ||
|
83fe5ca701 | ||
|
1223aa0a01 | ||
|
0a484ed183 | ||
|
c600a1637d | ||
|
a74a7a8606 | ||
|
f454e43903 | ||
|
72f7b51776 | ||
|
149029b1f1 | ||
|
8b9575f559 | ||
|
49ee088379 | ||
|
779128220a | ||
|
55eabae923 | ||
|
1227e5b2e7 | ||
|
684d8b477a | ||
|
ab1bd40c30 | ||
|
6f9963f717 | ||
|
aae95f65c6 | ||
|
33464d40c5 | ||
|
b4e9b579dd | ||
|
8318b59382 | ||
|
c4f5b5d521 | ||
|
81584f2468 | ||
|
9fe8465d90 | ||
|
eac5acdea8 | ||
|
43a099146e | ||
|
13a6a486b4 | ||
|
0f3b95ea98 | ||
|
1760424ec1 | ||
|
9b57916aee | ||
|
9e5135eb2b | ||
|
e19c4d17ac | ||
|
34981595fa | ||
|
34576f6670 | ||
|
ca6404a639 | ||
|
a2cfd1192a | ||
|
25eb4a3444 | ||
|
46f70c9355 | ||
|
2c700de5d9 | ||
|
32fc052978 | ||
|
3654e33eea | ||
|
f16904c1a0 | ||
|
508b33e503 | ||
|
0e121bff03 | ||
|
d8fc3483b7 | ||
|
c39fb5401f | ||
|
0fc8638eb5 | ||
|
78a2b6e242 | ||
|
2821cf13e5 | ||
|
e20b6bd4b7 | ||
|
555364494a | ||
|
af9cab7aa9 | ||
|
1702aa6a6a | ||
|
c64705592e | ||
|
37117fb748 | ||
|
94e4f1323f | ||
|
7f2a77b091 | ||
|
6144650f9d | ||
|
83e9c10646 | ||
|
8b781c4b84 | ||
|
660085171f | ||
|
aed70a05c8 | ||
|
65ee08c048 | ||
|
51ab2cbc18 | ||
|
1487d9dce7 | ||
|
0945607b3f | ||
|
ebc8ac76de | ||
|
1d45bdbfdc | ||
|
f4e2e5febf | ||
|
32127d0881 | ||
|
e916a74e14 | ||
|
7deff79977 | ||
|
b83c8f453c | ||
|
26e2540a4f | ||
|
79446afe05 | ||
|
5da72d604f | ||
|
6b7375e7c7 | ||
|
52455734c7 | ||
|
302b34fc48 | ||
|
ae98fe329b | ||
|
9921a391c0 | ||
|
e71e9d522a | ||
|
239ad21629 | ||
|
8b36927925 | ||
|
245d3815c6 | ||
|
231ce51e45 | ||
|
5be509a43d | ||
|
69c059f4f2 | ||
|
504f6a17ca | ||
|
88996a6e6f | ||
|
a6a4015858 | ||
|
d4e6ee6001 | ||
|
2fdd015da7 | ||
|
bc3442a75b | ||
|
1392083d60 | ||
|
a623948e53 | ||
|
c0cf1e2bf4 | ||
|
762674ea39 | ||
|
5a98a58d03 | ||
|
552543234e | ||
|
c308fc8214 | ||
|
9cc707d971 | ||
|
1de1b5dcdf | ||
|
e5e4ba5aec | ||
|
0c8f748d0a | ||
|
389785e165 | ||
|
c774a2f6e3 | ||
|
5a4f70d6a7 | ||
|
14d6f6d39c | ||
|
16ee7cd442 | ||
|
6ee2eda1df | ||
|
e991bf5420 | ||
|
ba4680c512 | ||
|
385a0ed7de | ||
|
f8924fb06d | ||
|
c36274848d | ||
|
9e6c7c57c4 | ||
|
200cd9f2ce | ||
|
00cd311c7d | ||
|
daf7c07cd9 | ||
|
a9ffe7d6a4 | ||
|
76d71a39db | ||
|
9ed884ec78 | ||
|
d56cd55189 | ||
|
2c8d317eaf | ||
|
8d7b50ff7b | ||
|
2025f4d68c | ||
|
b0bab6889b | ||
|
714bcd8360 | ||
|
225d7aa0f9 | ||
|
8717f93453 | ||
|
ebe0abe955 | ||
|
b019c704c2 | ||
|
d7390e09ff | ||
|
d2066d0d86 | ||
|
d9b7219404 | ||
|
afce8f04ab | ||
|
93654b7e2c | ||
|
7e7740b955 | ||
|
7f98e6751b | ||
|
1c6829d5c3 | ||
|
87591935a7 | ||
|
8c1bb50acb | ||
|
388449a159 | ||
|
956acfbcf5 | ||
|
0a34d92130 | ||
|
770ca55121 | ||
|
f794bde646 | ||
|
16e6d2a06e | ||
|
b1933d00b9 | ||
|
17da14c659 | ||
|
78e6f38ef2 | ||
|
d952912bff | ||
|
a91cdceb25 | ||
|
45669bab1a | ||
|
206381c220 | ||
|
944eadca8f | ||
|
e1182f4db9 | ||
|
a4457b8e2a | ||
|
8ff77012c7 | ||
|
3bad6459f9 | ||
|
943f1e9b4f | ||
|
af86c98efa | ||
|
df560fa20d | ||
|
acc9d698be | ||
|
762d0bde64 | ||
|
ebb326acac | ||
|
290045beb2 | ||
|
ddb9b5a077 | ||
|
74eaf9def4 | ||
|
02cb89801a | ||
|
14fbddaefb | ||
|
b1fbbbe426 | ||
|
0bc6f27e32 | ||
|
040c1a2ae2 | ||
|
3372804a82 | ||
|
97bc73a809 | ||
|
6d961cecf2 | ||
|
724098b690 | ||
|
326332fbb2 | ||
|
3f555f5cbf | ||
|
297820b124 | ||
|
7b17c88566 | ||
|
f4ca2f0b2c | ||
|
386d137066 | ||
|
8d368ac954 | ||
|
e7b426155a | ||
|
2c5d5c0dbf | ||
|
cbe6a74c86 | ||
|
0cc74b6a8d | ||
|
81afcce69b | ||
|
dbaccb3341 | ||
|
206223efd3 | ||
|
9d3acc4786 | ||
|
52070e788e | ||
|
3e9076045c | ||
|
464a38cc70 | ||
|
134a7af411 | ||
|
63f3849872 | ||
|
9137698245 | ||
|
b06b97b7c2 | ||
|
2abe0877e9 | ||
|
e8bef30c0b | ||
|
92325b1743 | ||
|
82732b6532 | ||
|
003762fb24 | ||
|
eb0f42e53a | ||
|
6b4425e309 | ||
|
4a21d43b77 | ||
|
17deb28670 | ||
|
fc3f7b7339 | ||
|
028643a531 | ||
|
42fc3f083f | ||
|
af2f878990 | ||
|
1fb3f16f37 | ||
|
eecf0ccce3 | ||
|
7e076cff75 | ||
|
e2dbed7ec7 | ||
|
114e1fa371 | ||
|
06861d0efe | ||
|
77b916c627 | ||
|
0f411c3616 | ||
|
4e7e643bd5 | ||
|
49626f54a8 | ||
|
7ed2a4a84f | ||
|
3507138c77 | ||
|
2b6f25e15d | ||
|
988bbedbfa | ||
|
48b6d50e34 | ||
|
2182d8f3ec | ||
|
ffe59d4bde | ||
|
0ad5ec427d | ||
|
83c7abd9b4 | ||
|
3cdcc207b9 | ||
|
8ba9380743 | ||
|
24306676c2 | ||
|
a226995589 | ||
|
5aeda4635f | ||
|
badaf77657 | ||
|
b7477a26fb | ||
|
f8736ebfe0 | ||
|
1930c23cd5 | ||
|
c1ae61551e | ||
|
d4f8ba118a | ||
|
08b727874f | ||
|
20be880f51 | ||
|
23ce63e49f | ||
|
e85aa145bb | ||
|
0adf713f85 | ||
|
058a4db835 | ||
|
b851ed48ad | ||
|
9894b203c9 | ||
|
845dfc3838 | ||
|
8705cb8251 | ||
|
58fa02059d | ||
|
ccdbe15b68 | ||
|
c17755e109 | ||
|
ae27aabbef | ||
|
af61a1243e | ||
|
e67afc66f3 | ||
|
d0ceb4cd70 | ||
|
785ace95a4 | ||
|
8a7da9eaa0 | ||
|
5bbf30bc71 | ||
|
20eee1f83c | ||
|
c67fb64e4a | ||
|
ed0b585fe9 | ||
|
75b1155453 | ||
|
b65da99eaa | ||
|
cceaef1956 | ||
|
75427d9767 | ||
|
c6aad324a0 | ||
|
d5c9ec9686 | ||
|
cdf0f96b4e | ||
|
7c6b2b1fce | ||
|
a6ce78d9a2 | ||
|
582a9d510e | ||
|
ad38dd201b | ||
|
c433aca4a4 | ||
|
42fd714379 | ||
|
35ebb8bcf2 | ||
|
08874b97d3 | ||
|
aae8e278a1 | ||
|
5a2bd3d379 | ||
|
25fc88afd6 | ||
|
0a9208ddea | ||
|
c050ff5580 | ||
|
a9058697be | ||
|
bf04ca4969 | ||
|
4922aefb49 | ||
|
1f9ad0f61b | ||
|
6e9c62a1a2 | ||
|
851d2b0f66 | ||
|
fa18993057 | ||
|
5e6091989d | ||
|
3a05623e87 | ||
|
a2ea56a35b | ||
|
7509f9c502 | ||
|
bd4d0ce84e | ||
|
50cb7c6de1 | ||
|
75bf6bd557 | ||
|
97bf2f2bf1 | ||
|
cfb5832e24 | ||
|
43a7891e4f | ||
|
1ab74a7a2e | ||
|
920a91756e | ||
|
60505740d5 | ||
|
bc97bbe360 | ||
|
70ddfb6a25 | ||
|
7ce7df6947 | ||
|
c03b4f8cfb | ||
|
3374f5946a | ||
|
ed02d089ed | ||
|
0efeeb8fd7 | ||
|
1ee6a52a8a | ||
|
44a457b308 | ||
|
4adc936fc1 | ||
|
14b632a828 | ||
|
177eacbceb | ||
|
7f677cbc66 | ||
|
f2506160be | ||
|
d613c5d9de | ||
|
f9615f233f | ||
|
792fcc9f9c | ||
|
91e39fa829 | ||
|
06746e73b5 | ||
|
8c882c2698 | ||
|
cfed18d612 | ||
|
b4dac66b08 | ||
|
433bceeac2 | ||
|
483b9c53fa | ||
|
27b9c6c7ad | ||
|
c47c6a4efa | ||
|
b2affc4207 | ||
|
279a5cac35 | ||
|
016c328d28 | ||
|
178a39347e | ||
|
421553b8cd | ||
|
ccb1269991 | ||
|
8e7c6d3a9b | ||
|
0d4fc974d9 | ||
|
21cd1162e3 | ||
|
a11fd6971d | ||
|
622a6cf0cd | ||
|
51306c37cb | ||
|
09d921563b | ||
|
ac444442be | ||
|
2d574f2637 | ||
|
8c8ae7c914 | ||
|
877362eeaa | ||
|
6becb2f272 | ||
|
6932ed5df5 | ||
|
de507b56f3 | ||
|
be64fa5575 | ||
|
578ab2ece6 | ||
|
b967316d6b | ||
|
ac887c8999 | ||
|
a9d446f9bf | ||
|
30597c747f | ||
|
7dd540bf43 | ||
|
41c9cd5c75 | ||
|
ddc477438a | ||
|
964fdefdae | ||
|
bb6342c550 | ||
|
cce58503e4 | ||
|
16704d5707 | ||
|
4489701855 | ||
|
9963bea521 | ||
|
2694baf85d | ||
|
3775d37031 | ||
|
bff657c542 | ||
|
45c585e5d8 | ||
|
b12227efbf | ||
|
4a32e407a9 | ||
|
0a81b34584 | ||
|
b25c904fc3 | ||
|
2978dad2be | ||
|
76c4f17017 | ||
|
70d9b3b45d | ||
|
aadbd838ca | ||
|
21d6c83a5a | ||
|
874a197360 | ||
|
f47813cf0e | ||
|
2cda9971a9 | ||
|
fe2dad30f5 | ||
|
7e3f8e8166 | ||
|
631ab0add1 | ||
|
f71e481806 | ||
|
42ebbec813 | ||
|
ef707b01bc | ||
|
4c1095ff13 | ||
|
1562069c7a | ||
|
1d26a958bb | ||
|
2d7dae91dd | ||
|
3155bc7250 | ||
|
c1acd2e98c | ||
|
2051bec543 | ||
|
170957ef05 | ||
|
a508edeaec | ||
|
8ff823eca6 | ||
|
a2f17e076a | ||
|
35bfa89b27 | ||
|
95c265f4c5 | ||
|
0e6852bbee | ||
|
04a15f1c76 | ||
|
09fd61a97b | ||
|
266229daec | ||
|
950421b84c | ||
|
4153090552 | ||
|
2bc25029fe | ||
|
46b5eb6553 | ||
|
f91ef69546 | ||
|
17cce15eca | ||
|
1743d13f0f | ||
|
6de6e5a393 | ||
|
dda9fb2945 | ||
|
ac5368749c | ||
|
a29ffde755 | ||
|
a220833a61 | ||
|
c31d7133e6 | ||
|
9c9f92cbe3 | ||
|
283fedd8ca | ||
|
44d44bbccc | ||
|
83f56e4543 | ||
|
7ff11d0b52 | ||
|
77d088ee12 | ||
|
a4916d8024 | ||
|
cfe0277619 | ||
|
2ef9011b8d | ||
|
eaf070f20d | ||
|
51431a887f | ||
|
3d75ccf24a | ||
|
8ab290b708 | ||
|
df1359e392 | ||
|
c5141db8f2 | ||
|
726e4be958 | ||
|
ff7996c7ff | ||
|
05f4494f01 | ||
|
21b7de805f | ||
|
7982fe4010 | ||
|
f1a0dc70b2 | ||
|
4c423ff06e | ||
|
a14f081af9 | ||
|
e08326abab | ||
|
3ba740bcd1 | ||
|
1c9255dce6 | ||
|
a9eb2ccc2d | ||
|
555cf6c6c7 | ||
|
5284ccd4c2 | ||
|
15a073ce70 | ||
|
a3a652bc43 | ||
|
0e8b155e07 | ||
|
3eade37f78 | ||
|
c3226b896d | ||
|
aacb1420d2 | ||
|
19baca72c9 | ||
|
f0e8e6bce4 | ||
|
0683529145 | ||
|
bc6169e1c8 | ||
|
b94fd954cc | ||
|
ed23b0bd6f | ||
|
e6ebae074c | ||
|
36785ee87c | ||
|
ea6c1ebee2 | ||
|
69d828332b | ||
|
c965188ea7 | ||
|
25fa34d97c | ||
|
e649a465ed | ||
|
01c19e4f55 | ||
|
4f625ccaa7 | ||
|
9bd397ce88 | ||
|
80e51864cd | ||
|
674bba5911 | ||
|
c825d6c5ba | ||
|
20e78ff1ce | ||
|
3ff6433fab | ||
|
aa9ef65768 | ||
|
bae03472f7 | ||
|
dcda17d6f2 | ||
|
20dc59c342 | ||
|
3bd909db1a | ||
|
9903cb2b37 | ||
|
b398001533 | ||
|
9eb1e90ed3 | ||
|
aa8c271dd2 | ||
|
48dc6861ea | ||
|
6e18d753a6 | ||
|
9620b3fd81 | ||
|
2e76315742 | ||
|
269462bfc6 | ||
|
439d062862 | ||
|
efbce8e287 | ||
|
43961da923 | ||
|
7e3c34495e | ||
|
31af36e57e | ||
|
95ce4151e4 | ||
|
d494451789 | ||
|
686a54746e | ||
|
32e33fb21a | ||
|
ee5d02689b | ||
|
e120815476 | ||
|
8a17519574 | ||
|
bb88f2cdc5 | ||
|
64bb6497c5 | ||
|
3078137596 | ||
|
4e47a558f0 | ||
|
c27c4381b0 | ||
|
4b3006bead | ||
|
85b6d8be06 | ||
|
bcce957f86 | ||
|
53aba792e0 | ||
|
c712c1d3d1 | ||
|
268b4da2cd | ||
|
817cad67b2 | ||
|
37b24bfcb3 | ||
|
bec90a9ced | ||
|
29f2914e1a | ||
|
b0c6b2b7e1 | ||
|
9f0e9896ed | ||
|
2f04d5f915 | ||
|
6df058c964 | ||
|
7844150ea2 | ||
|
150ee61446 | ||
|
ac0463feaa | ||
|
5a7f58e7b4 | ||
|
191250cb77 | ||
|
57e753ad0c | ||
|
b87f2b98e5 | ||
|
3f2967453c | ||
|
917191539d | ||
|
bf0e7368ef | ||
|
dfba51fbef | ||
|
e7b914bea3 | ||
|
4a56753869 | ||
|
8e4d3533aa | ||
|
6b0d0c7bc8 | ||
|
86b50ee32a | ||
|
2e9c6f5c73 | ||
|
58aefbebaf | ||
|
9ac5feb622 | ||
|
70dc2c7cab | ||
|
cb9a1d5dbd | ||
|
2592dda70c | ||
|
73e628ccb5 | ||
|
a44e2a720c | ||
|
3443ea3739 | ||
|
0b7566000b | ||
|
1dc7d72068 | ||
|
ca7ce5b843 | ||
|
7e82b2f5d9 | ||
|
d2d8661b9c | ||
|
160c65fa62 | ||
|
e1f1da3cc7 | ||
|
131f8af58e | ||
|
1f60f89d81 | ||
|
54db70a216 | ||
|
684f7be189 | ||
|
fe58a7b561 | ||
|
4ff8ff74de | ||
|
acf6f11b80 | ||
|
649f2e76a8 | ||
|
bef01175dc | ||
|
652908c686 | ||
|
221872fa3d | ||
|
2c64955144 | ||
|
7a54eff176 | ||
|
1a9e7dd440 | ||
|
594d3626b3 | ||
|
068d2666a9 | ||
|
920951cbd6 | ||
|
1339fa53b8 | ||
|
bee613cd76 | ||
|
042bc05fab | ||
|
34a646f478 | ||
|
ce80f5e579 | ||
|
ec237623f2 | ||
|
90efe2090e | ||
|
50adcd7b88 | ||
|
b6e2934123 | ||
|
e021893bf8 | ||
|
818531cefd | ||
|
95b3a75fa4 | ||
|
4c881cf7aa | ||
|
9daf4db0cb | ||
|
d2939b446d | ||
|
3815ec7aba | ||
|
885dea3212 | ||
|
d51a0a6984 | ||
|
3ee432819a | ||
|
f7873047cd | ||
|
e4a6631fde | ||
|
2089d0040b | ||
|
eb9d50ec70 | ||
|
8bb4714edb | ||
|
cf17d5feec | ||
|
caf5758114 | ||
|
779eb37f7a | ||
|
e0a17ae37d | ||
|
ca6b328cf8 | ||
|
09be8fc799 | ||
|
892e35d82b | ||
|
741e7707f0 | ||
|
d40f0b8eff | ||
|
ca42de1b7c | ||
|
5a6377a606 | ||
|
59e510464a | ||
|
5246a31e3a | ||
|
70c89557ad | ||
|
3df6b23be6 | ||
|
9386ad9e79 | ||
|
259cc21421 | ||
|
4a4f83a18f | ||
|
aa66bded69 | ||
|
ddf4a071cf | ||
|
cb6362fd49 | ||
|
29c2fb1ba8 | ||
|
395758021f | ||
|
cae813d9d2 | ||
|
2413f2af09 | ||
|
69b41a0954 | ||
|
1f57af4d0a | ||
|
16d34222ca | ||
|
8e1eb05f96 | ||
|
69ae5c6123 | ||
|
6fb750eaca | ||
|
0522aecc64 | ||
|
8ca66bc5fb | ||
|
3a06c43007 | ||
|
aac0a3df6a | ||
|
2e3cd5677d | ||
|
f72412ea81 | ||
|
f81492e835 | ||
|
be4cae510f | ||
|
f969d8530d | ||
|
7292f29bb7 | ||
|
eb4c18eb09 | ||
|
9dccf1df24 | ||
|
80392daea7 | ||
|
b5f997360c | ||
|
b87ba18d42 | ||
|
3909812423 | ||
|
9b3265f99b | ||
|
297de984f7 | ||
|
96a213b72d | ||
|
bff5fb1677 | ||
|
7f2402416b | ||
|
8c84a4d951 | ||
|
aaa8c8fec7 | ||
|
d55f2bd1d4 | ||
|
305f27a7db | ||
|
f1ea811a51 | ||
|
7ff47714e0 | ||
|
5f15ca4fde | ||
|
684c36556e | ||
|
8eecacec4f | ||
|
59b33b08ce | ||
|
e1a38c0d5d | ||
|
cd799c3387 | ||
|
24f451215d | ||
|
f35e850b02 | ||
|
f9aaec00d2 | ||
|
dbe6d03d24 | ||
|
efea67d64d | ||
|
a5780a7319 | ||
|
fa389fbb08 | ||
|
6319a93d00 | ||
|
33cd0dc84f | ||
|
83f318a0dd | ||
|
5de412c363 | ||
|
6dac040325 | ||
|
39f2a9fb12 | ||
|
dc3b06af6d | ||
|
ae1b9f2ea7 | ||
|
845aff45f9 | ||
|
cbc3c1c833 | ||
|
3dd84a15d8 | ||
|
7dba36c8ac | ||
|
4491e0ba21 | ||
|
c70dc36e37 | ||
|
4f3bc5a226 | ||
|
c0aa4293cf | ||
|
06dff476dc | ||
|
9fd89dcc4c | ||
|
decd9114c5 | ||
|
456d0df31b | ||
|
3cd3ea8cbd | ||
|
9ff9bb0a44 | ||
|
1d0fcee862 | ||
|
d5fbd8ca0c | ||
|
10cb1caac8 | ||
|
ec724c4022 | ||
|
27883b4480 | ||
|
08582788bf | ||
|
23d02372b9 | ||
|
de644e5469 | ||
|
060a7e477f | ||
|
7715f4f081 | ||
|
1425b2dba7 | ||
|
121dc7d73a | ||
|
4ca4780e5f | ||
|
ca1b1c9321 | ||
|
134048b1fb | ||
|
ec29fff548 | ||
|
95ffd19742 | ||
|
2589ca1a3b | ||
|
c331d23b3f | ||
|
15430ca087 | ||
|
d209b61ed9 | ||
|
d72bbb4178 | ||
|
2f7f62c4db | ||
|
6868fce23b | ||
|
35e5aa9395 | ||
|
657338d3b0 | ||
|
a8a81e8675 | ||
|
4c2f8932a6 | ||
|
eaa4d17065 | ||
|
b0b438145e | ||
|
868bc11130 | ||
|
46790212fe | ||
|
3294e4ba0f | ||
|
58dfd45ce1 | ||
|
5a691f7e98 | ||
|
dc7b8aa6e4 | ||
|
f2dc20f7f6 | ||
|
248e1f742d | ||
|
4c2e67b2dd | ||
|
b38469d91e | ||
|
f50a22625f | ||
|
6d3a03d9b6 | ||
|
f54233030b | ||
|
b311d9584e | ||
|
1b7041210a | ||
|
ee09619f78 | ||
|
c3e13cb918 | ||
|
15042c6179 | ||
|
4d58422421 | ||
|
9eddfc0c88 | ||
|
730f517bed | ||
|
8b699d494b | ||
|
bfb07d41b3 | ||
|
adb05dd66b | ||
|
222f3c817a | ||
|
6b7e55d729 | ||
|
3d7c2372c0 | ||
|
db1297952e | ||
|
8e68955ff2 | ||
|
fd4f5aeda0 | ||
|
f9d3a73fc3 | ||
|
27d6172de5 | ||
|
76a67df0a5 | ||
|
137a5461b0 | ||
|
bd6143cd08 | ||
|
9705aeae54 | ||
|
b28e87d769 | ||
|
22d1288607 | ||
|
a2d17665c4 | ||
|
fe0415fbe5 | ||
|
f07a07a38e | ||
|
b3043c383c | ||
|
394c948efc | ||
|
6749acc7ba | ||
|
0d030c8c4c | ||
|
cd48673b2e | ||
|
f177d166dc | ||
|
e346d657b6 | ||
|
0a3ed642d2 | ||
|
bb3ba02f0c | ||
|
cf2ab6becb | ||
|
3c1c238db7 | ||
|
52eeedb639 | ||
|
2d58b6307b | ||
|
972a6a10aa | ||
|
47e23b5be7 | ||
|
804dbb5b6a | ||
|
144c27298d | ||
|
fc2070c340 | ||
|
ced7145c75 | ||
|
b34acc8256 | ||
|
8a67e65ff9 | ||
|
ef50eb3e64 | ||
|
4f91798fa8 | ||
|
49d12f398f | ||
|
e35c638093 | ||
|
2fc35d931b | ||
|
33aea5b45a | ||
|
bf92109964 | ||
|
4372f6b942 | ||
|
83751f8d64 | ||
|
1ce3ef31ac | ||
|
58691cf896 | ||
|
027695cec0 | ||
|
ef3ada60e3 | ||
|
de004c0108 | ||
|
57b76eda7c | ||
|
6c4fd26e6f | ||
|
2ca7f0ad87 | ||
|
33c9a77984 | ||
|
4a08da1292 | ||
|
18b483ee27 | ||
|
e3dd9ed3c9 | ||
|
aa97271f30 | ||
|
c3e6b6544b | ||
|
5cab3db3b9 | ||
|
11082f1fb2 | ||
|
bd05b64550 | ||
|
20d264227c | ||
|
87739b77d5 | ||
|
7dbc0b5529 | ||
|
5cb2a22566 | ||
|
87225b41cd | ||
|
071f5e73ca | ||
|
b3a5fdb1e0 | ||
|
d3522f6c3f | ||
|
4026bc6fa7 | ||
|
0be24bab3d | ||
|
b42d59f1d5 | ||
|
739f26c340 | ||
|
0ca161c443 | ||
|
e50a6a99ba | ||
|
9b3e578c9e | ||
|
9ea3af662d | ||
|
c772bf2307 | ||
|
f95ca12cff | ||
|
960d99dfea | ||
|
4ce48df856 | ||
|
627d63d71e | ||
|
b883af0f21 | ||
|
eef6fb9076 | ||
|
e1d3cd4654 | ||
|
b3b4a7169d | ||
|
3ea4c8cba6 | ||
|
7beec91753 | ||
|
9f3af0afa7 | ||
|
68a83eea1c | ||
|
ec2040a840 | ||
|
b1eb1c4855 | ||
|
ce54dfa880 | ||
|
e215494132 | ||
|
5288e8d6d1 | ||
|
41b0530cd1 | ||
|
29ae062d31 | ||
|
d86905a3f3 | ||
|
174fa3f563 | ||
|
f369b0cf64 | ||
|
6571ac12c8 | ||
|
163a826af5 | ||
|
dcbeea5404 | ||
|
688757f226 | ||
|
2ab31982be | ||
|
63bded53fb | ||
|
ed10834820 | ||
|
ea73de78ed | ||
|
8beb778950 | ||
|
9cb1b1a48c | ||
|
471240b101 | ||
|
ec4474812f | ||
|
f410faa825 | ||
|
5ffe89cbd0 | ||
|
f07b8e44a5 | ||
|
7ab4f3ee76 | ||
|
565d00ca21 | ||
|
05c4180edb | ||
|
80161e8280 | ||
|
dae60381be | ||
|
58eed45187 | ||
|
dba4d2240e | ||
|
9bc3f885bc | ||
|
e5606ef249 | ||
|
f13e19dee1 | ||
|
6ee562a73c | ||
|
db6e17364a | ||
|
01e289c6de | ||
|
9d4677fc6b | ||
|
6ec6788e3f | ||
|
b383c904b2 | ||
|
b9ecbdfbad | ||
|
6bb5a99ab3 | ||
|
5a9b8e93e2 | ||
|
d459cb8ba2 | ||
|
2f8255cd5a | ||
|
e72348f5d1 | ||
|
d46f08c189 | ||
|
1d02b29e5a | ||
|
6ed18667b7 | ||
|
be683ed931 | ||
|
b60e529d7d | ||
|
b331d1b0eb | ||
|
97b6f45993 | ||
|
958196a103 | ||
|
2daa02c642 | ||
|
405eb71564 | ||
|
66876f5bfe | ||
|
73d533ff4f | ||
|
7067876dc1 | ||
|
7559a0d81a | ||
|
07c6472ba6 | ||
|
8aeb5f165e | ||
|
bfb85428af | ||
|
c1ee6140fc | ||
|
515ccfecb1 | ||
|
38b3a6b58a | ||
|
e83240f4dc | ||
|
205a353670 | ||
|
9c3ac9fbe1 | ||
|
b5b5e80c10 | ||
|
4c9dabe7b8 | ||
|
bf2b518489 | ||
|
e93f0939bd | ||
|
82fe676092 | ||
|
60a2ece852 | ||
|
63585463b3 | ||
|
373bcf9464 | ||
|
30df6ae75b | ||
|
ac0aa5c2c0 | ||
|
b7961ce6a9 | ||
|
b22bd156e7 | ||
|
42a7c07cee | ||
|
95bb87b29f | ||
|
362f20972f | ||
|
e6f36eb126 | ||
|
9c8b280c2f | ||
|
8ae4a32bb8 | ||
|
a1aa89ec3e | ||
|
2655d75272 | ||
|
0d667a6008 | ||
|
484d78d4b3 | ||
|
622ececd78 | ||
|
b97c1f0b4d | ||
|
00b19a0445 | ||
|
9217d9bff5 | ||
|
8cdab6613a | ||
|
a262e1353f | ||
|
a075813d30 | ||
|
127f154b97 | ||
|
c2fc10307d | ||
|
ca15549aea | ||
|
a758c2def1 | ||
|
bd467613ac | ||
|
f7cec09b06 | ||
|
918af38a79 | ||
|
e9445561fd | ||
|
6a2fc8ec3b | ||
|
92150c575f | ||
|
4206f46cf4 | ||
|
824070e576 | ||
|
b33b688720 | ||
|
4e7e6de82b | ||
|
6e36033600 | ||
|
65bf28907e | ||
|
926bd25a40 | ||
|
4ab7615290 | ||
|
e963347524 | ||
|
48772f62cd | ||
|
14cab46640 | ||
|
57c452f78e | ||
|
8443722a5d | ||
|
c7517aaff3 | ||
|
039660857b | ||
|
154d447488 | ||
|
b983bdb5cf | ||
|
691613368c | ||
|
8d97544046 | ||
|
e72e336dfa | ||
|
c7f679d396 | ||
|
1ffdf20a52 | ||
|
f8dcd31e76 | ||
|
b62f4299d7 | ||
|
790e4361dc | ||
|
873ebcba83 | ||
|
caa072cf49 | ||
|
1e5f9c68b3 | ||
|
5368a231c8 | ||
|
5001e27f49 | ||
|
4c021e196f | ||
|
0d28fd4277 | ||
|
b0e1c3d866 | ||
|
59f80c60b9 | ||
|
e425489411 | ||
|
fe7ceb481c | ||
|
f5277973de | ||
|
91ceb10ea9 | ||
|
e3beea02a9 | ||
|
f2d41fd9ee | ||
|
b65cc2935a | ||
|
db16ff4950 | ||
|
b293d92b56 | ||
|
fa4b8aca63 | ||
|
47509e28b1 | ||
|
64a96b8f67 | ||
|
25b032e1aa | ||
|
3ce563cdfb | ||
|
783c4effa7 | ||
|
df16580d87 | ||
|
594e849850 | ||
|
eb9063fe19 | ||
|
26e475eb0c | ||
|
bb15e6ccbc | ||
|
57f6bca9c9 | ||
|
92df522cbc | ||
|
2be92040b0 | ||
|
399f0115be | ||
|
031b3661e2 | ||
|
7a21709309 | ||
|
531c15dbae | ||
|
ac7574aff3 | ||
|
1d3f1306b6 | ||
|
13ede288f9 | ||
|
70611fd0f3 | ||
|
9007514c00 | ||
|
b4a19bab0d | ||
|
afa87c1cab | ||
|
3f7f3fd388 | ||
|
9dfb552c72 | ||
|
a9eb58ac72 | ||
|
b63c6632c9 | ||
|
09996374e4 | ||
|
e748a79165 | ||
|
ba0bf7785a | ||
|
3b3e8b5f51 | ||
|
b5df90c797 | ||
|
a846a2e15c | ||
|
038c367fd7 | ||
|
d5ed3dbe9d | ||
|
f7ed1b77cc | ||
|
51b259a3bb | ||
|
72ee2e3fdc | ||
|
7ef63a770c | ||
|
870f6d7b50 | ||
|
2964c36376 | ||
|
02ccf1dbe4 | ||
|
09d3740c67 | ||
|
86d6fe7b04 | ||
|
3143f457ec | ||
|
c13dd0f70e | ||
|
82cc9420f0 | ||
|
e8664b5664 | ||
|
00218e7387 | ||
|
11a5a99a6f | ||
|
f08c04cdb1 | ||
|
5a045794a3 | ||
|
0f21d4c077 | ||
|
c9792492cb | ||
|
78bd658a4f | ||
|
17dc06e47a | ||
|
7354b363eb | ||
|
da112b181f | ||
|
045fc9e1ee | ||
|
91de043d70 | ||
|
c601650151 | ||
|
9b3ad73576 | ||
|
1c7dc4a1e8 | ||
|
7caec25f0f | ||
|
26f0483094 | ||
|
a03f13fb3f | ||
|
7887082622 | ||
|
60fb59c878 | ||
|
e3e95e86fa | ||
|
c89d8c7ef7 | ||
|
e4861bcf0b | ||
|
37b7c4485c | ||
|
2451dc0c23 | ||
|
fcc5c7e5e9 | ||
|
94774723f0 | ||
|
79be45c65c | ||
|
4dc706a91a | ||
|
35406c0d22 | ||
|
7a6a9e0f65 | ||
|
3619881008 | ||
|
e6236a2ffb | ||
|
770b2d9908 | ||
|
ef801a4b94 | ||
|
5c6cff93ef | ||
|
b28594389e | ||
|
10b5159573 | ||
|
dfac661e2a | ||
|
ab4c267594 | ||
|
8dee3c92c7 | ||
|
405b4a5136 | ||
|
38907e3e08 | ||
|
fcd6c84351 | ||
|
dc1c1553d8 | ||
|
5d7fea344b | ||
|
437ab8e8fe | ||
|
eb4959558b | ||
|
e2d556ca9e | ||
|
533c5066c1 | ||
|
9adce79471 | ||
|
899d7b42b5 | ||
|
f0fa0cce6b | ||
|
89a1bc87d3 | ||
|
e1e3049455 | ||
|
44e03b08f1 | ||
|
5acac6cbfb | ||
|
91cefe12f1 | ||
|
62c3b001de | ||
|
2b2abd67a4 | ||
|
3b09e6f510 | ||
|
bcf3466584 | ||
|
631907e0ce | ||
|
0dc7992a6f | ||
|
80e085dadc | ||
|
700c367884 | ||
|
805a3f3793 | ||
|
b78b0a29e5 | ||
|
97eabe92db | ||
|
1ddb2f2025 | ||
|
a82149c05d | ||
|
1886193b8e | ||
|
bca91426db | ||
|
c544df7246 | ||
|
f0af0b60f2 | ||
|
504753c896 | ||
|
6c0fc88a4b | ||
|
f89f81b4c0 | ||
|
eafc3260c9 | ||
|
817ccb5b32 | ||
|
5e9d1ee478 | ||
|
04a7e9c147 | ||
|
1c02c1097d | ||
|
532c0187f6 | ||
|
ec28c5cc73 | ||
|
793fa94c15 | ||
|
b00a1c13a0 | ||
|
21612d4f5e | ||
|
abd0c1c51b | ||
|
8c35556410 | ||
|
6b7a18b967 | ||
|
d173aea0e4 | ||
|
4932ab2c34 | ||
|
93cdf4313e | ||
|
dda8655ca3 | ||
|
2e686fc966 | ||
|
3aa8a5ca60 | ||
|
edb60d0961 | ||
|
bfd01747d1 | ||
|
de207c03f1 | ||
|
25d7e6bcd6 | ||
|
cf0409a7a1 | ||
|
9c80dab7f4 | ||
|
3b85a9bb7d | ||
|
720015dc9b | ||
|
ea3c2441be | ||
|
be31b9bed3 | ||
|
eb3f52e8e3 | ||
|
0ad139d5ce | ||
|
268def0163 | ||
|
e55cd05316 | ||
|
d7d91757a7 | ||
|
53b6030395 | ||
|
be7625cca6 | ||
|
078ab39bdf | ||
|
74d5c3c162 | ||
|
473291fe70 | ||
|
2781a0aca4 | ||
|
5d8f695206 | ||
|
d6e92616be | ||
|
bd24de7ab7 | ||
|
38ebf77891 | ||
|
ec60046469 | ||
|
387d388da9 | ||
|
fe7a273aee | ||
|
d35f234fb5 | ||
|
4ef944037f | ||
|
da46c55db7 | ||
|
db61c366e8 | ||
|
00296f4eb0 | ||
|
70a4b5bf1f | ||
|
b6dcfede43 | ||
|
f8a410a843 | ||
|
0115747997 | ||
|
d5ab9d05bc | ||
|
a68ff96dc5 | ||
|
bc6abeca6d | ||
|
5b3d55c84f | ||
|
a0787d837a | ||
|
0b99897410 | ||
|
053f1c0ac4 | ||
|
42df051512 | ||
|
866b1e9428 | ||
|
fc24c0639f | ||
|
84e7c644a7 | ||
|
4f9ea8f354 | ||
|
c383c30e80 | ||
|
8068d9ed92 | ||
|
6490f4cf76 | ||
|
f101791d02 | ||
|
3badf5546a | ||
|
d56c0f3708 | ||
|
665524b622 | ||
|
d604f79cbf | ||
|
c80577c709 | ||
|
563280abe1 | ||
|
546f4a4b44 | ||
|
bed7fe6a4e | ||
|
e1b9406b95 | ||
|
31729a28d6 | ||
|
ea97c9f5d2 | ||
|
72b7a33d3b | ||
|
fb0765ba76 | ||
|
0e7c01d56f | ||
|
a7600dff54 | ||
|
68b8c15463 | ||
|
42eacf2291 | ||
|
53c125245c | ||
|
587c677b29 | ||
|
20c32d6b0e | ||
|
103221b367 | ||
|
b8db50567c | ||
|
739d8a7b24 | ||
|
c5cea77bcd | ||
|
dc00651c61 | ||
|
7e9c16501e | ||
|
3fd553b82b | ||
|
4f0030ecc8 | ||
|
0ef9dd3519 | ||
|
69a2a29023 | ||
|
92af0d39fe | ||
|
8f441fd0f4 | ||
|
50417674b2 | ||
|
4370ef7b1b | ||
|
d984b40b4c | ||
|
b49dd35907 | ||
|
4fcf5b1081 | ||
|
73a57858e0 | ||
|
fd088d0c85 | ||
|
e7f2c7df03 | ||
|
da83fd1ef2 | ||
|
47c19181f8 | ||
|
19a2c32836 | ||
|
c845d19695 | ||
|
5c164119f1 | ||
|
d9b8450efb | ||
|
ea01259b96 | ||
|
072be6870f | ||
|
9addbd1e2b | ||
|
1514757198 | ||
|
b2829fa7bf | ||
|
3a1daaeaed | ||
|
9ec3f97505 | ||
|
0cdd5c2241 | ||
|
d50ad16ac8 | ||
|
8d9596d209 | ||
|
e7fa99de86 | ||
|
42de210a6c | ||
|
5e612a96f5 | ||
|
90ecb119db | ||
|
30bedee17b | ||
|
5289de0cf0 | ||
|
82813ffe7b | ||
|
6aaf8cbd7d | ||
|
1ae895d098 | ||
|
f9d9bd9f50 | ||
|
7a4ddeba16 | ||
|
f08acce023 | ||
|
b475ea415d | ||
|
7fd1f05bb3 | ||
|
cc7ddc840d | ||
|
16c274aaab | ||
|
b3f109cf52 | ||
|
916e9db51a | ||
|
8914bffe85 | ||
|
eabc23374b | ||
|
7c53328001 | ||
|
58ff242241 | ||
|
70484a011c | ||
|
dde7cecf43 | ||
|
30e20cb683 | ||
|
62c5225754 | ||
|
a993acd26c | ||
|
109b111871 | ||
|
ec474acded | ||
|
b7f00ea40a | ||
|
a21698b1b2 | ||
|
2f539272c3 | ||
|
c1179b35ef | ||
|
50eb7b693f | ||
|
a83adcc5a8 | ||
|
98721d0dcd | ||
|
dccd29fcd2 | ||
|
795ed6ff85 | ||
|
54b741e838 | ||
|
5ffff41a01 | ||
|
7095abf728 | ||
|
4cfda11f8c | ||
|
ff6402b58a | ||
|
0601a89cb8 | ||
|
7ad306831d | ||
|
ef2ec5035b | ||
|
47c376d5c5 | ||
|
1ac790a1ff | ||
|
49e383e704 | ||
|
648c58c514 | ||
|
0764d42f40 | ||
|
30591e529a | ||
|
313d5a9542 | ||
|
294e091604 | ||
|
44ad92f127 | ||
|
1c94ba16ea | ||
|
7927c7cce4 | ||
|
a5541d1283 | ||
|
7452f648b6 | ||
|
74bd9fd01c | ||
|
31e9279c70 | ||
|
9ab37dd087 | ||
|
497675c49e | ||
|
4cae839bfa | ||
|
e4e20288c9 | ||
|
f4753a9342 | ||
|
8be0bad287 | ||
|
c59f1a424b | ||
|
c1509ebcad | ||
|
26e82b73dc | ||
|
b376d3e98e | ||
|
1151991b70 | ||
|
a3aaf78e78 | ||
|
f1a704b276 | ||
|
9510b66b6a | ||
|
7395644883 | ||
|
939a5abb8c | ||
|
84bb48d0e8 | ||
|
66cb028713 | ||
|
1fffcff4bc | ||
|
db6907a6fa | ||
|
e7d942554a | ||
|
74cf3d887c | ||
|
dd28859348 | ||
|
725ee609dd | ||
|
0e7361d4b8 | ||
|
d29b4001f0 | ||
|
414d4c2031 | ||
|
025a8e23c4 | ||
|
3ccf2ea098 | ||
|
5b9e2ec817 | ||
|
2d14777573 | ||
|
669ee2c600 | ||
|
bcc219566d | ||
|
261e00fcde | ||
|
8d1144cda0 | ||
|
1372a246b5 | ||
|
b51a8750a3 | ||
|
b53bbc960f | ||
|
5112f6425e | ||
|
13648d03a1 | ||
|
40c197ed60 | ||
|
152c8c9cae | ||
|
8380487afe | ||
|
3fae29e4d5 | ||
|
15ad79c3de | ||
|
e639496be2 | ||
|
291649b6e7 | ||
|
9d53e8322a | ||
|
e8ccd62a27 | ||
|
e447e72c77 | ||
|
664ea1dcf4 | ||
|
73ac045aa8 | ||
|
2c7ece6bc6 | ||
|
1af22f0bc2 | ||
|
4ac0540d01 | ||
|
60dde2ef08 | ||
|
a0529277e3 | ||
|
c96c0ac7d3 | ||
|
60e92cb6a9 | ||
|
74a62309de | ||
|
a761801a27 | ||
|
dac68a30ff | ||
|
0bfbf23ea5 | ||
|
260f87d715 | ||
|
41dd258789 | ||
|
b3a50187b1 | ||
|
fc915b89a2 | ||
|
494d672920 | ||
|
1df313ec17 | ||
|
d8f15171ba | ||
|
66813e2975 | ||
|
eda97e870e | ||
|
fccab12c82 | ||
|
84c3664628 | ||
|
d37e83046c | ||
|
4ac6073a77 | ||
|
1001c18e17 | ||
|
ee9ba3ef81 | ||
|
7e22f5fea3 | ||
|
61b2c2e973 | ||
|
b96019ff9c | ||
|
a82c2fd926 | ||
|
b60d8f147c | ||
|
29cdb93104 | ||
|
f73d6c5bb2 | ||
|
027c09e6fe | ||
|
3ada9db8f7 | ||
|
1eb1239684 | ||
|
9d8c2b67cc | ||
|
dc09283b5d | ||
|
ef78dbb7ff | ||
|
6f5ebb3649 | ||
|
5b67390baf | ||
|
5464e8a728 | ||
|
aa6ca4d6e9 | ||
|
979c7cc839 | ||
|
80860ec2a7 | ||
|
db787696b7 | ||
|
76ce3f80de | ||
|
e1d6e910f7 | ||
|
160cb38afa | ||
|
f277aaf677 | ||
|
6e7efb8c43 | ||
|
ac570286a2 | ||
|
86014698be | ||
|
86346ff311 | ||
|
12c030af02 | ||
|
b36bb813c1 | ||
|
74e45c24af | ||
|
be7e65f082 | ||
|
1129a2ec8c | ||
|
75a75f8508 | ||
|
eb843e7cff | ||
|
7ae95770aa | ||
|
4a7166625f | ||
|
4d22797624 | ||
|
dc66eea6ac | ||
|
9e1e64e58d | ||
|
6fac9bc1d6 | ||
|
67ff22be70 | ||
|
e1c96a88e3 | ||
|
768de4f29a | ||
|
82e5b80641 | ||
|
4c1b2c79c5 | ||
|
805e389d06 | ||
|
a88fe74b82 | ||
|
9a4381d4f6 | ||
|
274e7b7bbf | ||
|
06978f2edf | ||
|
28473d382a | ||
|
b036c9d490 | ||
|
528b2be5b3 | ||
|
744e1bf57e | ||
|
86498050c4 | ||
|
6e49f7055c | ||
|
108e8a0637 | ||
|
13ed4389c1 | ||
|
c75d94e465 | ||
|
bdb4a6321b | ||
|
02493c8d08 | ||
|
bc4a8359a0 | ||
|
17edc3f8aa | ||
|
430cb7f38b | ||
|
39c0576599 | ||
|
66c5715ee4 | ||
|
5cf313ce3b | ||
|
bc7f3043bc | ||
|
b1a53e61a6 | ||
|
4ff2d0e567 | ||
|
96a219a294 | ||
|
a9d62349c1 | ||
|
a0cb40f202 | ||
|
38f33b3354 | ||
|
3fd86bbe33 | ||
|
74b52213ee | ||
|
4d009b4369 | ||
|
986301754a | ||
|
0b60b3a932 | ||
|
319e7f4d2c | ||
|
5adf4c2b8a | ||
|
0c5d5ba5a3 | ||
|
289fddedca | ||
|
f04995c3e8 | ||
|
7da0602759 | ||
|
3046b87b76 | ||
|
0eb25b5ab4 | ||
|
6bf10ccfbc | ||
|
fbd42f5c76 | ||
|
72c3e82b65 | ||
|
a4e411da1e | ||
|
7bde1c4d50 | ||
|
055b0d6057 | ||
|
dca0db770e | ||
|
307bfaf220 | ||
|
5c7c227bf7 | ||
|
d67a5a897e | ||
|
f256e8b578 | ||
|
ff46da778a | ||
|
7303bd79ce | ||
|
15f06a1d50 | ||
|
86342538aa | ||
|
b3a22f49cb | ||
|
d6a95797d8 | ||
|
20763a84ee | ||
|
3b40c7d081 | ||
|
5972640a17 | ||
|
e16b2d6d82 | ||
|
d93a6752a0 | ||
|
ee0a19c3f7 | ||
|
a03ae35f57 | ||
|
352732defb | ||
|
e90d5b23db | ||
|
a2c6d253f3 | ||
|
642215f6c0 | ||
|
2b1e707f8c | ||
|
68e2e0404d | ||
|
88ba3314a5 | ||
|
69dc41e7b1 | ||
|
4088097887 | ||
|
f73ad931b1 | ||
|
8ed88c9e10 | ||
|
acc482abef | ||
|
b707b44591 | ||
|
da292ef985 | ||
|
55b19a8ef2 | ||
|
ed83d902ed | ||
|
73ec7cb896 | ||
|
ab81d50078 | ||
|
35715f8223 | ||
|
f7a03c77d8 | ||
|
1c76716a83 | ||
|
cebd2e59ba | ||
|
c479de3b22 | ||
|
c1be1c01b5 | ||
|
e4a72f8de3 | ||
|
425ed95505 | ||
|
6713da840a | ||
|
394b9d404a | ||
|
1a9a3b1bc4 | ||
|
ae8968e787 | ||
|
0074ff52e6 | ||
|
bf8a82bf67 | ||
|
3d26526d61 | ||
|
4230e289da | ||
|
8ab4242918 | ||
|
c1f301056b | ||
|
f41374789e | ||
|
53c794cd60 | ||
|
194df14a3c | ||
|
f1919f73d6 | ||
|
d30a2dc0db | ||
|
07a79c916c | ||
|
86eede2403 | ||
|
eb6c975395 | ||
|
f7e0c8a4a9 | ||
|
05e54fe819 | ||
|
859a6870a3 | ||
|
ed50935360 | ||
|
e5fcab860c | ||
|
9629e3ccb9 | ||
|
a866d49b6f | ||
|
d552eeeb09 | ||
|
60e0df4d3f | ||
|
c1230edae3 | ||
|
35fe923db3 | ||
|
1f98b349bf | ||
|
d2b0367e8f | ||
|
db97dff0cb | ||
|
490fab8335 | ||
|
5466f547cd | ||
|
429c5b2cbc | ||
|
fc055d7bd5 | ||
|
73700eafe2 | ||
|
69514857dc | ||
|
a977285400 | ||
|
6aa6dcdc5e | ||
|
d316b8ad0b | ||
|
cd4e32c680 | ||
|
2b8a57bd51 | ||
|
b9bcc59750 | ||
|
10d1a6c9da | ||
|
483cd60ebb | ||
|
d88f07f431 | ||
|
06daf9cf42 | ||
|
97e03f9e9d | ||
|
ada5d54d9b | ||
|
f97cbfd9ee | ||
|
40300ce9cb | ||
|
724fe20caa | ||
|
2246261f8e | ||
|
a193a1f284 | ||
|
d4a23e894a | ||
|
880582b0cd | ||
|
3149b93de2 | ||
|
b418fe89dd | ||
|
5bf6dc5e75 | ||
|
4d0f511fa1 | ||
|
99e36c5851 | ||
|
1524f02655 | ||
|
08e85bf477 | ||
|
64ef31f8db | ||
|
ecf90a5564 | ||
|
c4d1e6ce50 | ||
|
4b752976be | ||
|
3ef68d682c | ||
|
de6c93ceb6 | ||
|
a9bb2a6b3e | ||
|
b1efe26c89 | ||
|
ebbd3a3fa4 | ||
|
ea304762b3 | ||
|
6ddb0c7c2a | ||
|
35997e27c8 | ||
|
4aba4bc825 | ||
|
8aaaa82e5b | ||
|
4386004fbf | ||
|
eaf31f78ad | ||
|
2497499d63 | ||
|
b27e3fb634 | ||
|
c4e2a222f0 | ||
|
0131ec4a58 | ||
|
4ca48908be | ||
|
29f7eb4482 | ||
|
c0b42fd3be | ||
|
3632eec20b | ||
|
54e805eaa6 | ||
|
c7c3d6e0dd | ||
|
563999f09d | ||
|
16a90516ea | ||
|
b31386da9e | ||
|
f99e1e3b7e | ||
|
2b0a5a6db4 | ||
|
0cc5c23049 | ||
|
f35d518caf | ||
|
938e0353b4 | ||
|
9f94881233 | ||
|
8b38dfc209 | ||
|
dcdf281156 | ||
|
a36e097a1b | ||
|
e1309d687c | ||
|
5ca8b75343 | ||
|
023fc8948a | ||
|
51eb8b1e54 | ||
|
ac15dc429d | ||
|
46644844be | ||
|
0e25cf773a | ||
|
d4866c780f | ||
|
4360b8221b | ||
|
09b78cb1ab | ||
|
7bffc47f10 | ||
|
43a41b515c | ||
|
ab576c0843 | ||
|
0c46bb96b1 | ||
|
5dad0028cd | ||
|
5d64103979 | ||
|
f623af89ee | ||
|
167eed78be | ||
|
2762053f41 | ||
|
4de929487e | ||
|
6a70fed2e7 | ||
|
936d297942 | ||
|
24fad611d5 | ||
|
d70dec109b | ||
|
5355c29e76 | ||
|
fcb91702d9 | ||
|
4fc9fea262 | ||
|
d876350db0 | ||
|
8e825ed3b0 | ||
|
4e1673ac41 | ||
|
de57e5d66a | ||
|
5177060c82 | ||
|
de17d4d9fe | ||
|
2937b5cf74 | ||
|
fa8b52a0da | ||
|
4bfc6f2457 | ||
|
f63e725a90 | ||
|
79df43f773 | ||
|
be12452fb8 | ||
|
e082f12b6d | ||
|
d146280677 | ||
|
9fc5062018 | ||
|
3609c2784d | ||
|
6adfebd6b9 | ||
|
c9b0b778f5 | ||
|
e930f6287e | ||
|
e87d2aba83 | ||
|
f8907a1a19 | ||
|
b1b1d8d9e4 | ||
|
25f2f25ded | ||
|
9b216b9702 | ||
|
44c742f859 | ||
|
7fdb21c200 | ||
|
36a7231f76 | ||
|
1e3aff2b21 | ||
|
655ab4af00 | ||
|
668aecc378 | ||
|
bf49ee6875 | ||
|
6e84c6d40d | ||
|
95f427b505 | ||
|
700a7110f7 | ||
|
3f14e23431 | ||
|
a69557f193 | ||
|
e7f20affc9 | ||
|
2bf2eac765 | ||
|
96d0b6e561 | ||
|
b55b37634a | ||
|
87b38c651f | ||
|
a8de112fe0 | ||
|
32115b5ca5 | ||
|
d16afd3d13 | ||
|
a61da5e486 | ||
|
2292c42742 | ||
|
7101ceefb1 | ||
|
82dca831a4 | ||
|
b17fb633ff | ||
|
621e2cdb5b | ||
|
95005327a3 | ||
|
55e389ba61 | ||
|
5bd64758a1 | ||
|
38e0ff9875 | ||
|
4684d279ae | ||
|
6f2036565b | ||
|
9b316c3ee7 | ||
|
6f09e14225 | ||
|
8b4be8cad1 | ||
|
03b7f7d7f3 | ||
|
7b66ac609f | ||
|
fe95244f49 | ||
|
b355c21e36 | ||
|
eebdb35dda | ||
|
e53a5baa36 | ||
|
e51af57fb7 | ||
|
1c15e127a7 | ||
|
38048208ed | ||
|
decea5e7f5 | ||
|
3e9a6d07d2 | ||
|
a162526539 | ||
|
2ae42b5824 | ||
|
1a366293f7 | ||
|
e4459dada4 | ||
|
e92b279c15 | ||
|
0789fd3ae1 | ||
|
189b1bff38 | ||
|
787d593b8f | ||
|
7fb09407bb | ||
|
68941063f9 | ||
|
81d8c223ad | ||
|
e37dd8b93e | ||
|
033462653c | ||
|
1dc28da65a | ||
|
49c4d345f2 | ||
|
50a7d10f27 | ||
|
c81e5ae8f5 | ||
|
02a18fb8f9 | ||
|
9cd1526073 | ||
|
1f51b2aba7 | ||
|
e9c6d312a4 | ||
|
c11cef09fc | ||
|
0a6e4c5893 | ||
|
49beee532b | ||
|
9ac1a527dc | ||
|
bfedb98fb0 | ||
|
4f0f4ed1ff | ||
|
47f05adc13 | ||
|
173960310e | ||
|
b9154cda2f | ||
|
4335e09802 | ||
|
308f57d18d | ||
|
15ec284ef7 | ||
|
4746ef58fc | ||
|
f2e593a35c | ||
|
9851b444d4 | ||
|
7ddfd049a4 | ||
|
11fbd546c1 | ||
|
014ef17f25 | ||
|
772cf15985 | ||
|
b53a67b8cd | ||
|
fba88e110a | ||
|
b85397c181 | ||
|
ff1f65291f | ||
|
93b5dd70c8 | ||
|
d8ef0ca27a | ||
|
c0fea1c1ff | ||
|
77a3c7639e | ||
|
09d1ba9f68 | ||
|
fd5595724c | ||
|
dea1322847 | ||
|
41fadc9ae9 | ||
|
1a837bbef4 | ||
|
ac89f25b79 | ||
|
9b727f6c2d | ||
|
71538d4cbb | ||
|
3e38e47b3a | ||
|
9264b50c32 | ||
|
a53663f4df | ||
|
021a52cb40 | ||
|
d34bb62dea | ||
|
f4059eb6cb | ||
|
e21919c296 | ||
|
4d16fb70ce | ||
|
db0344e6ca | ||
|
3820a0722d | ||
|
66ab7591bf | ||
|
e489c5390e | ||
|
789d0f8201 | ||
|
e0c57cf1da | ||
|
7bba4876af | ||
|
e4dde132b4 | ||
|
2208df17cc | ||
|
d5af0a6bc7 | ||
|
099c62370c | ||
|
75d2336d8e | ||
|
33c58df79c | ||
|
a872e6e3bb | ||
|
71a907007c | ||
|
9daea49275 | ||
|
54ed997e53 | ||
|
a2f9e1cec2 | ||
|
de29d9adb2 | ||
|
5cf5a836df | ||
|
95aff06dfc | ||
|
d76ec576b6 | ||
|
299ec96e0e | ||
|
dd1bfae823 | ||
|
88c7594d2d | ||
|
bc94eb8baf | ||
|
44c42f1715 | ||
|
db86110b97 | ||
|
c05cc01191 | ||
|
6f2a9d567d | ||
|
39f8cb3006 | ||
|
322fe727cb | ||
|
4970befc10 | ||
|
3208a2ef94 | ||
|
ff99a92f4d | ||
|
6254a1e163 | ||
|
f035817489 | ||
|
7bd65cf986 | ||
|
7df83d7252 | ||
|
9afb41042c | ||
|
6ba6dd1720 | ||
|
fd8170f1dc | ||
|
9d1c8b4f00 | ||
|
3140a3f9a2 | ||
|
9652183eff | ||
|
ea7d5353ca | ||
|
76e399cd81 | ||
|
5c7fca456c | ||
|
0db2051480 | ||
|
f68a2c0881 | ||
|
92d53f7441 |
182
.config/ci.yml
|
@ -1,12 +1,12 @@
|
||||||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
# Misskey configuration
|
# Calckey configuration
|
||||||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
# ┌─────┐
|
# ┌─────┐
|
||||||
#───┘ URL └─────────────────────────────────────────────────────
|
#───┘ URL └─────────────────────────────────────────────────────
|
||||||
|
|
||||||
# Final accessible URL seen by a user.
|
# Final accessible URL seen by a user.
|
||||||
url: http://misskey.local
|
url: https://example.tld/
|
||||||
|
|
||||||
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
||||||
# URL SETTINGS AFTER THAT!
|
# URL SETTINGS AFTER THAT!
|
||||||
|
@ -34,7 +34,7 @@ port: 3000
|
||||||
#───┘ PostgreSQL configuration └────────────────────────────────
|
#───┘ PostgreSQL configuration └────────────────────────────────
|
||||||
|
|
||||||
db:
|
db:
|
||||||
host: postgres
|
host: database
|
||||||
port: 5432
|
port: 5432
|
||||||
|
|
||||||
# Database name
|
# Database name
|
||||||
|
@ -42,7 +42,7 @@ db:
|
||||||
|
|
||||||
# Auth
|
# Auth
|
||||||
user: postgres
|
user: postgres
|
||||||
pass: ci
|
pass: test
|
||||||
|
|
||||||
# Whether disable Caching queries
|
# Whether disable Caching queries
|
||||||
#disableCache: true
|
#disableCache: true
|
||||||
|
@ -51,23 +51,6 @@ db:
|
||||||
#extra:
|
#extra:
|
||||||
# ssl: true
|
# ssl: true
|
||||||
|
|
||||||
dbReplications: false
|
|
||||||
|
|
||||||
# You can configure any number of replicas here
|
|
||||||
#dbSlaves:
|
|
||||||
# -
|
|
||||||
# host:
|
|
||||||
# port:
|
|
||||||
# db:
|
|
||||||
# user:
|
|
||||||
# pass:
|
|
||||||
# -
|
|
||||||
# host:
|
|
||||||
# port:
|
|
||||||
# db:
|
|
||||||
# user:
|
|
||||||
# pass:
|
|
||||||
|
|
||||||
# ┌─────────────────────┐
|
# ┌─────────────────────┐
|
||||||
#───┘ Redis configuration └─────────────────────────────────────
|
#───┘ Redis configuration └─────────────────────────────────────
|
||||||
|
|
||||||
|
@ -79,43 +62,15 @@ redis:
|
||||||
#prefix: example-prefix
|
#prefix: example-prefix
|
||||||
#db: 1
|
#db: 1
|
||||||
|
|
||||||
#redisForPubsub:
|
# ┌─────────────────────────────┐
|
||||||
# host: redis
|
#───┘ Elasticsearch configuration └─────────────────────────────
|
||||||
# port: 6379
|
|
||||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
|
||||||
# #pass: example-pass
|
|
||||||
# #prefix: example-prefix
|
|
||||||
# #db: 1
|
|
||||||
|
|
||||||
#redisForJobQueue:
|
#elasticsearch:
|
||||||
# host: redis
|
# host: localhost
|
||||||
# port: 6379
|
# port: 9200
|
||||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
# ssl: false
|
||||||
# #pass: example-pass
|
# user:
|
||||||
# #prefix: example-prefix
|
# pass:
|
||||||
# #db: 1
|
|
||||||
|
|
||||||
#redisForTimelines:
|
|
||||||
# host: redis
|
|
||||||
# port: 6379
|
|
||||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
|
||||||
# #pass: example-pass
|
|
||||||
# #prefix: example-prefix
|
|
||||||
# #db: 1
|
|
||||||
|
|
||||||
# ┌───────────────────────────┐
|
|
||||||
#───┘ MeiliSearch configuration └─────────────────────────────
|
|
||||||
|
|
||||||
# You can set scope to local (default value) or global
|
|
||||||
# (include notes from remote).
|
|
||||||
|
|
||||||
#meilisearch:
|
|
||||||
# host: meilisearch
|
|
||||||
# port: 7700
|
|
||||||
# apiKey: ''
|
|
||||||
# ssl: true
|
|
||||||
# index: ''
|
|
||||||
# scope: global
|
|
||||||
|
|
||||||
# ┌───────────────┐
|
# ┌───────────────┐
|
||||||
#───┘ ID generation └───────────────────────────────────────────
|
#───┘ ID generation └───────────────────────────────────────────
|
||||||
|
@ -126,7 +81,6 @@ redis:
|
||||||
|
|
||||||
# Available methods:
|
# Available methods:
|
||||||
# aid ... Short, Millisecond accuracy
|
# aid ... Short, Millisecond accuracy
|
||||||
# aidx ... Millisecond accuracy
|
|
||||||
# meid ... Similar to ObjectID, Millisecond accuracy
|
# meid ... Similar to ObjectID, Millisecond accuracy
|
||||||
# ulid ... Millisecond accuracy
|
# ulid ... Millisecond accuracy
|
||||||
# objectid ... This is left for backward compatibility
|
# objectid ... This is left for backward compatibility
|
||||||
|
@ -134,11 +88,14 @@ redis:
|
||||||
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
||||||
# ID SETTINGS AFTER THAT!
|
# ID SETTINGS AFTER THAT!
|
||||||
|
|
||||||
id: 'aidx'
|
id: 'aid'
|
||||||
|
|
||||||
# ┌─────────────────────┐
|
# ┌─────────────────────┐
|
||||||
#───┘ Other configuration └─────────────────────────────────────
|
#───┘ Other configuration └─────────────────────────────────────
|
||||||
|
|
||||||
|
# Max note length, should be < 8000.
|
||||||
|
#maxNoteLength: 3000
|
||||||
|
|
||||||
# Whether disable HSTS
|
# Whether disable HSTS
|
||||||
#disableHsts: true
|
#disableHsts: true
|
||||||
|
|
||||||
|
@ -148,47 +105,30 @@ id: 'aidx'
|
||||||
# Job concurrency per worker
|
# Job concurrency per worker
|
||||||
# deliverJobConcurrency: 128
|
# deliverJobConcurrency: 128
|
||||||
# inboxJobConcurrency: 16
|
# inboxJobConcurrency: 16
|
||||||
# relashionshipJobConcurrency: 16
|
|
||||||
# What's relashionshipJob?:
|
|
||||||
# Follow, unfollow, block and unblock(ings) while following-imports, etc. or account migrations.
|
|
||||||
|
|
||||||
# Job rate limiter
|
# Job rate limiter
|
||||||
# deliverJobPerSec: 128
|
# deliverJobPerSec: 128
|
||||||
# inboxJobPerSec: 32
|
# inboxJobPerSec: 16
|
||||||
# relashionshipJobPerSec: 64
|
|
||||||
|
|
||||||
# Job attempts
|
# Job attempts
|
||||||
# deliverJobMaxAttempts: 12
|
# deliverJobMaxAttempts: 12
|
||||||
# inboxJobMaxAttempts: 8
|
# inboxJobMaxAttempts: 8
|
||||||
|
|
||||||
# Local address used for outgoing requests
|
|
||||||
#outgoingAddress: 127.0.0.1
|
|
||||||
|
|
||||||
# IP address family used for outgoing request (ipv4, ipv6 or dual)
|
# IP address family used for outgoing request (ipv4, ipv6 or dual)
|
||||||
#outgoingAddressFamily: ipv4
|
#outgoingAddressFamily: ipv4
|
||||||
|
|
||||||
# Amount of characters that can be used when writing notes. Longer notes will be rejected. (minimum: 1)
|
# Syslog option
|
||||||
#maxNoteLength: 3000
|
#syslog:
|
||||||
# Amount of characters that will be saved for remote notes. Longer notes will be truncated to this length. (minimum: 1)
|
# host: localhost
|
||||||
#maxRemoteNoteLength: 100000
|
# port: 514
|
||||||
# Amount of characters that can be used when writing content warnings. Longer warnings will be rejected. (minimum: 1)
|
|
||||||
#maxCwLength: 500
|
|
||||||
# Amount of characters that will be saved for remote content warnings. Longer warnings will be truncated to this length. (minimum: 1)
|
|
||||||
#maxRemoteCwLength: 5000
|
|
||||||
# Amount of characters that can be used when writing media descriptions (alt text). Longer descriptions will be rejected. (minimum: 1)
|
|
||||||
#maxAltTextLength: 20000
|
|
||||||
# Amount of characters that will be saved for remote media descriptions (alt text). Longer descriptions will be truncated to this length. (minimum: 1)
|
|
||||||
#maxRemoteAltTextLength: 100000
|
|
||||||
|
|
||||||
# Proxy for HTTP/HTTPS
|
# Proxy for HTTP/HTTPS
|
||||||
#proxy: http://127.0.0.1:3128
|
#proxy: http://127.0.0.1:3128
|
||||||
|
|
||||||
proxyBypassHosts:
|
#proxyBypassHosts: [
|
||||||
- api.deepl.com
|
# 'example.com',
|
||||||
- api-free.deepl.com
|
# '192.0.2.8'
|
||||||
- www.recaptcha.net
|
#]
|
||||||
- hcaptcha.com
|
|
||||||
- challenges.cloudflare.com
|
|
||||||
|
|
||||||
# Proxy for SMTP/SMTPS
|
# Proxy for SMTP/SMTPS
|
||||||
#proxySmtp: http://127.0.0.1:3128 # use HTTP/1.1 CONNECT
|
#proxySmtp: http://127.0.0.1:3128 # use HTTP/1.1 CONNECT
|
||||||
|
@ -198,34 +138,58 @@ proxyBypassHosts:
|
||||||
# Media Proxy
|
# Media Proxy
|
||||||
#mediaProxy: https://example.com/proxy
|
#mediaProxy: https://example.com/proxy
|
||||||
|
|
||||||
# Proxy remote files (default: true)
|
# Proxy remote files (default: false)
|
||||||
# Proxy remote files by this instance or mediaProxy to prevent remote files from running in remote domains.
|
#proxyRemoteFiles: true
|
||||||
proxyRemoteFiles: true
|
|
||||||
|
|
||||||
# Movie Thumbnail Generation URL
|
|
||||||
# There is no reference implementation.
|
|
||||||
# For example, Misskey will point to the following URL:
|
|
||||||
# https://example.com/thumbnail.webp?thumbnail=1&url=https%3A%2F%2Fstorage.example.com%2Fpath%2Fto%2Fvideo.mp4
|
|
||||||
#videoThumbnailGenerator: https://example.com
|
|
||||||
|
|
||||||
# Sign outgoing ActivityPub GET request (default: true)
|
|
||||||
signToActivityPubGet: true
|
|
||||||
# Sign outgoing ActivityPub Activities (default: true)
|
|
||||||
# Linked Data signatures are cryptographic signatures attached to each activity to provide proof of authenticity.
|
|
||||||
# When using authorized fetch, this is often undesired as any signed activity can be forwarded to a blocked instance by relays and other instances.
|
|
||||||
# This setting allows admins to disable LD signatures for increased privacy, at the expense of fewer relayed activities and additional inbound fetch (GET) requests.
|
|
||||||
attachLdSignatureForRelays: true
|
|
||||||
# check that inbound ActivityPub GET requests are signed ("authorized fetch")
|
|
||||||
checkActivityPubGetSignature: false
|
|
||||||
|
|
||||||
# For security reasons, uploading attachments from the intranet is prohibited,
|
|
||||||
# but exceptions can be made from the following settings. Default value is "undefined".
|
|
||||||
# Read changelog to learn more (Improvements of 12.90.0 (2021/09/04)).
|
|
||||||
#allowedPrivateNetworks: [
|
#allowedPrivateNetworks: [
|
||||||
# '127.0.0.1/32'
|
# '127.0.0.1/32'
|
||||||
#]
|
#]
|
||||||
|
|
||||||
#customMOTD: ['Hello World', 'The sharks rule all', 'Shonks']
|
|
||||||
|
|
||||||
# Upload or download file size limits (bytes)
|
# Upload or download file size limits (bytes)
|
||||||
#maxFileSize: 262144000
|
#maxFileSize: 262144000
|
||||||
|
|
||||||
|
# Managed hosting settings
|
||||||
|
# !!!!!!!!!!
|
||||||
|
# >>>>>> NORMAL SELF-HOSTERS, STAY AWAY! <<<<<<
|
||||||
|
# >>>>>> YOU DON'T NEED THIS! <<<<<<
|
||||||
|
# !!!!!!!!!!
|
||||||
|
# Each category is optional, but if each item in each category is mandatory!
|
||||||
|
# If you mess this up, that's on you, you've been warned...
|
||||||
|
|
||||||
|
#maxUserSignups: 100
|
||||||
|
#isManagedHosting: true
|
||||||
|
#deepl:
|
||||||
|
# managed: true
|
||||||
|
# authKey: ''
|
||||||
|
# isPro: false
|
||||||
|
#
|
||||||
|
#email:
|
||||||
|
# managed: true
|
||||||
|
# address: 'example@email.com'
|
||||||
|
# host: 'email.com'
|
||||||
|
# port: 587
|
||||||
|
# user: 'example@email.com'
|
||||||
|
# pass: ''
|
||||||
|
# useImplicitSslTls: false
|
||||||
|
#
|
||||||
|
#objectStorage:
|
||||||
|
# managed: true
|
||||||
|
# baseUrl: ''
|
||||||
|
# bucket: ''
|
||||||
|
# prefix: ''
|
||||||
|
# endpoint: ''
|
||||||
|
# region: ''
|
||||||
|
# accessKey: ''
|
||||||
|
# secretKey: ''
|
||||||
|
# useSsl: true
|
||||||
|
# connnectOverProxy: false
|
||||||
|
# setPublicReadOnUpload: true
|
||||||
|
# s3ForcePathStyle: true
|
||||||
|
|
||||||
|
# !!!!!!!!!!
|
||||||
|
# >>>>>> AGAIN, NORMAL SELF-HOSTERS, STAY AWAY! <<<<<<
|
||||||
|
# >>>>>> YOU DON'T NEED THIS, ABOVE SETTINGS ARE FOR MANAGED HOSTING ONLY! <<<<<<
|
||||||
|
# !!!!!!!!!!
|
||||||
|
|
||||||
|
# Seriously. Do NOT fill out the above settings if you're self-hosting.
|
||||||
|
# They're much better off being set from the control panel.
|
||||||
|
|
|
@ -1,224 +0,0 @@
|
||||||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
||||||
# Misskey configuration
|
|
||||||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
||||||
|
|
||||||
# ┌─────┐
|
|
||||||
#───┘ URL └─────────────────────────────────────────────────────
|
|
||||||
|
|
||||||
# Final accessible URL seen by a user.
|
|
||||||
url: 'http://misskey.local'
|
|
||||||
|
|
||||||
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
|
||||||
# URL SETTINGS AFTER THAT!
|
|
||||||
|
|
||||||
# ┌───────────────────────┐
|
|
||||||
#───┘ Port and TLS settings └───────────────────────────────────
|
|
||||||
|
|
||||||
#
|
|
||||||
# Misskey requires a reverse proxy to support HTTPS connections.
|
|
||||||
#
|
|
||||||
# +----- https://example.tld/ ------------+
|
|
||||||
# +------+ |+-------------+ +----------------+|
|
|
||||||
# | User | ---> || Proxy (443) | ---> | Misskey (3000) ||
|
|
||||||
# +------+ |+-------------+ +----------------+|
|
|
||||||
# +---------------------------------------+
|
|
||||||
#
|
|
||||||
# You need to set up a reverse proxy. (e.g. nginx)
|
|
||||||
# An encrypted connection with HTTPS is highly recommended
|
|
||||||
# because tokens may be transferred in GET requests.
|
|
||||||
|
|
||||||
# The port that your Misskey server should listen on.
|
|
||||||
port: 61812
|
|
||||||
|
|
||||||
# ┌──────────────────────────┐
|
|
||||||
#───┘ PostgreSQL configuration └────────────────────────────────
|
|
||||||
|
|
||||||
db:
|
|
||||||
host: db
|
|
||||||
port: 5432
|
|
||||||
|
|
||||||
# Database name
|
|
||||||
db: misskey
|
|
||||||
|
|
||||||
# Auth
|
|
||||||
user: postgres
|
|
||||||
pass: postgres
|
|
||||||
|
|
||||||
# Whether disable Caching queries
|
|
||||||
#disableCache: true
|
|
||||||
|
|
||||||
# Extra Connection options
|
|
||||||
#extra:
|
|
||||||
# ssl: true
|
|
||||||
|
|
||||||
dbReplications: false
|
|
||||||
|
|
||||||
# You can configure any number of replicas here
|
|
||||||
#dbSlaves:
|
|
||||||
# -
|
|
||||||
# host:
|
|
||||||
# port:
|
|
||||||
# db:
|
|
||||||
# user:
|
|
||||||
# pass:
|
|
||||||
# -
|
|
||||||
# host:
|
|
||||||
# port:
|
|
||||||
# db:
|
|
||||||
# user:
|
|
||||||
# pass:
|
|
||||||
|
|
||||||
# ┌─────────────────────┐
|
|
||||||
#───┘ Redis configuration └─────────────────────────────────────
|
|
||||||
|
|
||||||
redis:
|
|
||||||
host: redis
|
|
||||||
port: 6379
|
|
||||||
#family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
|
||||||
#pass: example-pass
|
|
||||||
#prefix: example-prefix
|
|
||||||
#db: 1
|
|
||||||
|
|
||||||
#redisForPubsub:
|
|
||||||
# host: redis
|
|
||||||
# port: 6379
|
|
||||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
|
||||||
# #pass: example-pass
|
|
||||||
# #prefix: example-prefix
|
|
||||||
# #db: 1
|
|
||||||
|
|
||||||
#redisForJobQueue:
|
|
||||||
# host: redis
|
|
||||||
# port: 6379
|
|
||||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
|
||||||
# #pass: example-pass
|
|
||||||
# #prefix: example-prefix
|
|
||||||
# #db: 1
|
|
||||||
|
|
||||||
#redisForTimelines:
|
|
||||||
# host: redis
|
|
||||||
# port: 6379
|
|
||||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
|
||||||
# #pass: example-pass
|
|
||||||
# #prefix: example-prefix
|
|
||||||
# #db: 1
|
|
||||||
|
|
||||||
#redisForReactions:
|
|
||||||
# host: redis
|
|
||||||
# port: 6379
|
|
||||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
|
||||||
# #pass: example-pass
|
|
||||||
# #prefix: example-prefix
|
|
||||||
# #db: 1
|
|
||||||
|
|
||||||
# ┌───────────────────────────┐
|
|
||||||
#───┘ MeiliSearch configuration └─────────────────────────────
|
|
||||||
|
|
||||||
#meilisearch:
|
|
||||||
# host: meilisearch
|
|
||||||
# port: 7700
|
|
||||||
# apiKey: ''
|
|
||||||
# ssl: true
|
|
||||||
# index: ''
|
|
||||||
|
|
||||||
# ┌───────────────┐
|
|
||||||
#───┘ ID generation └───────────────────────────────────────────
|
|
||||||
|
|
||||||
# You can select the ID generation method.
|
|
||||||
# You don't usually need to change this setting, but you can
|
|
||||||
# change it according to your preferences.
|
|
||||||
|
|
||||||
# Available methods:
|
|
||||||
# aid ... Short, Millisecond accuracy
|
|
||||||
# aidx ... Millisecond accuracy
|
|
||||||
# meid ... Similar to ObjectID, Millisecond accuracy
|
|
||||||
# ulid ... Millisecond accuracy
|
|
||||||
# objectid ... This is left for backward compatibility
|
|
||||||
|
|
||||||
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
|
||||||
# ID SETTINGS AFTER THAT!
|
|
||||||
|
|
||||||
id: 'aidx'
|
|
||||||
|
|
||||||
# ┌────────────────┐
|
|
||||||
#───┘ Error tracking └──────────────────────────────────────────
|
|
||||||
|
|
||||||
# Sentry is available for error tracking.
|
|
||||||
# See the Sentry documentation for more details on options.
|
|
||||||
|
|
||||||
#sentryForBackend:
|
|
||||||
# enableNodeProfiling: true
|
|
||||||
# options:
|
|
||||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
|
||||||
|
|
||||||
#sentryForFrontend:
|
|
||||||
# options:
|
|
||||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
|
||||||
|
|
||||||
# ┌─────────────────────┐
|
|
||||||
#───┘ Other configuration └─────────────────────────────────────
|
|
||||||
|
|
||||||
# Whether disable HSTS
|
|
||||||
#disableHsts: true
|
|
||||||
|
|
||||||
# Number of worker processes
|
|
||||||
#clusterLimit: 1
|
|
||||||
|
|
||||||
# Job concurrency per worker
|
|
||||||
# deliverJobConcurrency: 128
|
|
||||||
# inboxJobConcurrency: 16
|
|
||||||
|
|
||||||
# Job rate limiter
|
|
||||||
# deliverJobPerSec: 128
|
|
||||||
# inboxJobPerSec: 32
|
|
||||||
|
|
||||||
# Job attempts
|
|
||||||
# deliverJobMaxAttempts: 12
|
|
||||||
# inboxJobMaxAttempts: 8
|
|
||||||
|
|
||||||
# IP address family used for outgoing request (ipv4, ipv6 or dual)
|
|
||||||
#outgoingAddressFamily: ipv4
|
|
||||||
|
|
||||||
# Amount of characters that can be used when writing notes. Longer notes will be rejected. (minimum: 1)
|
|
||||||
#maxNoteLength: 3000
|
|
||||||
# Amount of characters that will be saved for remote notes. Longer notes will be truncated to this length. (minimum: 1)
|
|
||||||
#maxRemoteNoteLength: 100000
|
|
||||||
# Amount of characters that can be used when writing content warnings. Longer warnings will be rejected. (minimum: 1)
|
|
||||||
#maxCwLength: 500
|
|
||||||
# Amount of characters that will be saved for remote content warnings. Longer warnings will be truncated to this length. (minimum: 1)
|
|
||||||
#maxRemoteCwLength: 5000
|
|
||||||
# Amount of characters that can be used when writing media descriptions (alt text). Longer descriptions will be rejected. (minimum: 1)
|
|
||||||
#maxAltTextLength: 20000
|
|
||||||
# Amount of characters that will be saved for remote media descriptions (alt text). Longer descriptions will be truncated to this length. (minimum: 1)
|
|
||||||
#maxRemoteAltTextLength: 100000
|
|
||||||
|
|
||||||
# Proxy for HTTP/HTTPS
|
|
||||||
#proxy: http://127.0.0.1:3128
|
|
||||||
|
|
||||||
proxyBypassHosts:
|
|
||||||
- api.deepl.com
|
|
||||||
- api-free.deepl.com
|
|
||||||
- www.recaptcha.net
|
|
||||||
- hcaptcha.com
|
|
||||||
- challenges.cloudflare.com
|
|
||||||
|
|
||||||
# Proxy for SMTP/SMTPS
|
|
||||||
#proxySmtp: http://127.0.0.1:3128 # use HTTP/1.1 CONNECT
|
|
||||||
#proxySmtp: socks4://127.0.0.1:1080 # use SOCKS4
|
|
||||||
#proxySmtp: socks5://127.0.0.1:1080 # use SOCKS5
|
|
||||||
|
|
||||||
# Media Proxy
|
|
||||||
#mediaProxy: https://example.com/proxy
|
|
||||||
|
|
||||||
# Proxy remote files (default: true)
|
|
||||||
proxyRemoteFiles: true
|
|
||||||
|
|
||||||
# Sign to ActivityPub GET request (default: true)
|
|
||||||
signToActivityPubGet: true
|
|
||||||
|
|
||||||
allowedPrivateNetworks: [
|
|
||||||
'127.0.0.1/32'
|
|
||||||
]
|
|
||||||
|
|
||||||
# Upload or download file size limits (bytes)
|
|
||||||
#maxFileSize: 262144000
|
|
|
@ -1,11 +1,4 @@
|
||||||
# misskey settings
|
|
||||||
# MISSKEY_URL=https://example.tld/
|
|
||||||
|
|
||||||
# db settings
|
# db settings
|
||||||
POSTGRES_PASSWORD=example-misskey-pass
|
POSTGRES_PASSWORD=example-calckey-pass
|
||||||
# DATABASE_PASSWORD=${POSTGRES_PASSWORD}
|
POSTGRES_USER=example-calckey-user
|
||||||
POSTGRES_USER=example-misskey-user
|
POSTGRES_DB=calckey
|
||||||
# DATABASE_USER=${POSTGRES_USER}
|
|
||||||
POSTGRES_DB=misskey
|
|
||||||
# DATABASE_DB=${POSTGRES_DB}
|
|
||||||
DATABASE_URL="postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}"
|
|
||||||
|
|
|
@ -1,314 +0,0 @@
|
||||||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
||||||
# Misskey configuration
|
|
||||||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
||||||
|
|
||||||
# ┌──────────────────────────────┐
|
|
||||||
#───┘ a boring but important thing └────────────────────────────
|
|
||||||
|
|
||||||
#
|
|
||||||
# First of all, let me tell you a story that may possibly be
|
|
||||||
# boring to you and possibly important to you.
|
|
||||||
#
|
|
||||||
# Misskey is licensed under the AGPLv3 license. This license is
|
|
||||||
# known to be often misunderstood. Please read the following
|
|
||||||
# instructions carefully and select the appropriate option so
|
|
||||||
# that you do not negligently cause a license violation.
|
|
||||||
#
|
|
||||||
|
|
||||||
# --------
|
|
||||||
# Option 1: If you host Misskey AS-IS (without any changes to
|
|
||||||
# the source code. forks are not included).
|
|
||||||
#
|
|
||||||
# Step 1: Congratulations! You don't need to do anything.
|
|
||||||
|
|
||||||
# --------
|
|
||||||
# Option 2: If you have made changes to the source code (forks
|
|
||||||
# are included) and publish a Git repository of source
|
|
||||||
# code. There should be no access restrictions on
|
|
||||||
# this repository. Strictly speaking, it doesn't have
|
|
||||||
# to be a Git repository, but you'll probably use Git!
|
|
||||||
#
|
|
||||||
# Step 1: Build and run the Misskey server first.
|
|
||||||
# Step 2: Open <https://your.misskey.example/admin/settings> in
|
|
||||||
# your browser with the administrator account.
|
|
||||||
# Step 3: Enter the URL of your Git repository in the
|
|
||||||
# "Repository URL" field.
|
|
||||||
|
|
||||||
# --------
|
|
||||||
# Option 3: If neither of the above applies to you.
|
|
||||||
# (In this case, the source code should be published
|
|
||||||
# on the Misskey interface. IT IS NOT ENOUGH TO
|
|
||||||
# DISCLOSE THE SOURCE CODE WEHN A USER REQUESTS IT BY
|
|
||||||
# E-MAIL OR OTHER MEANS. If you are not satisfied
|
|
||||||
# with this, it is recommended that you read the
|
|
||||||
# license again carefully. Anyway, enabling this
|
|
||||||
# option will automatically generate and publish a
|
|
||||||
# tarball at build time, protecting you from
|
|
||||||
# inadvertent license violations. (There is no legal
|
|
||||||
# guarantee, of course.) The tarball will generated
|
|
||||||
# from the root directory of your codebase. So it is
|
|
||||||
# also recommended to check <built/tarball> directory
|
|
||||||
# once after building and before activating the server
|
|
||||||
# to avoid ACCIDENTAL LEAKING OF SENSITIVE INFORMATION.
|
|
||||||
# To prevent certain files from being included in the
|
|
||||||
# tarball, add a glob pattern after line 15 in
|
|
||||||
# <scripts/tarball.mjs>. DO NOT FORGET TO BUILD AFTER
|
|
||||||
# ENABLING THIS OPTION!)
|
|
||||||
#
|
|
||||||
# Step 1: Uncomment the following line.
|
|
||||||
#
|
|
||||||
# publishTarballInsteadOfProvideRepositoryUrl: true
|
|
||||||
|
|
||||||
# ┌─────┐
|
|
||||||
#───┘ URL └─────────────────────────────────────────────────────
|
|
||||||
|
|
||||||
# Final accessible URL seen by a user.
|
|
||||||
# You can set url from an environment variable instead.
|
|
||||||
url: https://example.tld/
|
|
||||||
|
|
||||||
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
|
||||||
# URL SETTINGS AFTER THAT!
|
|
||||||
|
|
||||||
# ┌───────────────────────┐
|
|
||||||
#───┘ Port and TLS settings └───────────────────────────────────
|
|
||||||
|
|
||||||
#
|
|
||||||
# Misskey requires a reverse proxy to support HTTPS connections.
|
|
||||||
#
|
|
||||||
# +----- https://example.tld/ ------------+
|
|
||||||
# +------+ |+-------------+ +----------------+|
|
|
||||||
# | User | ---> || Proxy (443) | ---> | Misskey (3000) ||
|
|
||||||
# +------+ |+-------------+ +----------------+|
|
|
||||||
# +---------------------------------------+
|
|
||||||
#
|
|
||||||
# You need to set up a reverse proxy. (e.g. nginx)
|
|
||||||
# An encrypted connection with HTTPS is highly recommended
|
|
||||||
# because tokens may be transferred in GET requests.
|
|
||||||
|
|
||||||
# The port that your Misskey server should listen on.
|
|
||||||
port: 3000
|
|
||||||
|
|
||||||
# ┌──────────────────────────┐
|
|
||||||
#───┘ PostgreSQL configuration └────────────────────────────────
|
|
||||||
|
|
||||||
db:
|
|
||||||
host: db
|
|
||||||
port: 5432
|
|
||||||
|
|
||||||
# Database name
|
|
||||||
# You can set db from an environment variable instead.
|
|
||||||
db: misskey
|
|
||||||
|
|
||||||
# Auth
|
|
||||||
# You can set user and pass from environment variables instead.
|
|
||||||
user: example-misskey-user
|
|
||||||
pass: example-misskey-pass
|
|
||||||
|
|
||||||
# Whether disable Caching queries
|
|
||||||
#disableCache: true
|
|
||||||
|
|
||||||
# Extra Connection options
|
|
||||||
#extra:
|
|
||||||
# ssl: true
|
|
||||||
|
|
||||||
dbReplications: false
|
|
||||||
|
|
||||||
# You can configure any number of replicas here
|
|
||||||
#dbSlaves:
|
|
||||||
# -
|
|
||||||
# host:
|
|
||||||
# port:
|
|
||||||
# db:
|
|
||||||
# user:
|
|
||||||
# pass:
|
|
||||||
# -
|
|
||||||
# host:
|
|
||||||
# port:
|
|
||||||
# db:
|
|
||||||
# user:
|
|
||||||
# pass:
|
|
||||||
|
|
||||||
# ┌─────────────────────┐
|
|
||||||
#───┘ Redis configuration └─────────────────────────────────────
|
|
||||||
|
|
||||||
redis:
|
|
||||||
host: redis
|
|
||||||
port: 6379
|
|
||||||
#family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
|
||||||
#pass: example-pass
|
|
||||||
#prefix: example-prefix
|
|
||||||
#db: 1
|
|
||||||
|
|
||||||
#redisForPubsub:
|
|
||||||
# host: redis
|
|
||||||
# port: 6379
|
|
||||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
|
||||||
# #pass: example-pass
|
|
||||||
# #prefix: example-prefix
|
|
||||||
# #db: 1
|
|
||||||
|
|
||||||
#redisForJobQueue:
|
|
||||||
# host: redis
|
|
||||||
# port: 6379
|
|
||||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
|
||||||
# #pass: example-pass
|
|
||||||
# #prefix: example-prefix
|
|
||||||
# #db: 1
|
|
||||||
|
|
||||||
#redisForTimelines:
|
|
||||||
# host: redis
|
|
||||||
# port: 6379
|
|
||||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
|
||||||
# #pass: example-pass
|
|
||||||
# #prefix: example-prefix
|
|
||||||
# #db: 1
|
|
||||||
|
|
||||||
#redisForReactions:
|
|
||||||
# host: redis
|
|
||||||
# port: 6379
|
|
||||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
|
||||||
# #pass: example-pass
|
|
||||||
# #prefix: example-prefix
|
|
||||||
# #db: 1
|
|
||||||
|
|
||||||
# ┌───────────────────────────┐
|
|
||||||
#───┘ MeiliSearch configuration └─────────────────────────────
|
|
||||||
|
|
||||||
# You can set scope to local (default value) or global
|
|
||||||
# (include notes from remote).
|
|
||||||
|
|
||||||
#meilisearch:
|
|
||||||
# host: meilisearch
|
|
||||||
# port: 7700
|
|
||||||
# apiKey: ''
|
|
||||||
# ssl: true
|
|
||||||
# index: ''
|
|
||||||
# scope: global
|
|
||||||
|
|
||||||
# ┌───────────────┐
|
|
||||||
#───┘ ID generation └───────────────────────────────────────────
|
|
||||||
|
|
||||||
# You can select the ID generation method.
|
|
||||||
# You don't usually need to change this setting, but you can
|
|
||||||
# change it according to your preferences.
|
|
||||||
|
|
||||||
# Available methods:
|
|
||||||
# aid ... Short, Millisecond accuracy
|
|
||||||
# aidx ... Millisecond accuracy
|
|
||||||
# meid ... Similar to ObjectID, Millisecond accuracy
|
|
||||||
# ulid ... Millisecond accuracy
|
|
||||||
# objectid ... This is left for backward compatibility
|
|
||||||
|
|
||||||
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
|
||||||
# ID SETTINGS AFTER THAT!
|
|
||||||
|
|
||||||
id: 'aidx'
|
|
||||||
|
|
||||||
# ┌────────────────┐
|
|
||||||
#───┘ Error tracking └──────────────────────────────────────────
|
|
||||||
|
|
||||||
# Sentry is available for error tracking.
|
|
||||||
# See the Sentry documentation for more details on options.
|
|
||||||
|
|
||||||
#sentryForBackend:
|
|
||||||
# enableNodeProfiling: true
|
|
||||||
# options:
|
|
||||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
|
||||||
|
|
||||||
#sentryForFrontend:
|
|
||||||
# options:
|
|
||||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
|
||||||
|
|
||||||
# ┌─────────────────────┐
|
|
||||||
#───┘ Other configuration └─────────────────────────────────────
|
|
||||||
|
|
||||||
# Whether disable HSTS
|
|
||||||
#disableHsts: true
|
|
||||||
|
|
||||||
# Number of worker processes
|
|
||||||
#clusterLimit: 1
|
|
||||||
|
|
||||||
# Job concurrency per worker
|
|
||||||
# deliverJobConcurrency: 128
|
|
||||||
# inboxJobConcurrency: 16
|
|
||||||
# relationshipJobConcurrency: 16
|
|
||||||
# What's relationshipJob?:
|
|
||||||
# Follow, unfollow, block and unblock(ings) while following-imports, etc. or account migrations.
|
|
||||||
|
|
||||||
# Job rate limiter
|
|
||||||
# deliverJobPerSec: 128
|
|
||||||
# inboxJobPerSec: 32
|
|
||||||
# relationshipJobPerSec: 64
|
|
||||||
|
|
||||||
# Job attempts
|
|
||||||
# deliverJobMaxAttempts: 12
|
|
||||||
# inboxJobMaxAttempts: 8
|
|
||||||
|
|
||||||
# Local address used for outgoing requests
|
|
||||||
#outgoingAddress: 127.0.0.1
|
|
||||||
|
|
||||||
# IP address family used for outgoing request (ipv4, ipv6 or dual)
|
|
||||||
#outgoingAddressFamily: ipv4
|
|
||||||
|
|
||||||
# Amount of characters that can be used when writing notes. Longer notes will be rejected. (minimum: 1)
|
|
||||||
#maxNoteLength: 3000
|
|
||||||
# Amount of characters that will be saved for remote notes. Longer notes will be truncated to this length. (minimum: 1)
|
|
||||||
#maxRemoteNoteLength: 100000
|
|
||||||
# Amount of characters that can be used when writing content warnings. Longer warnings will be rejected. (minimum: 1)
|
|
||||||
#maxCwLength: 500
|
|
||||||
# Amount of characters that will be saved for remote content warnings. Longer warnings will be truncated to this length. (minimum: 1)
|
|
||||||
#maxRemoteCwLength: 5000
|
|
||||||
# Amount of characters that can be used when writing media descriptions (alt text). Longer descriptions will be rejected. (minimum: 1)
|
|
||||||
#maxAltTextLength: 20000
|
|
||||||
# Amount of characters that will be saved for remote media descriptions (alt text). Longer descriptions will be truncated to this length. (minimum: 1)
|
|
||||||
#maxRemoteAltTextLength: 100000
|
|
||||||
|
|
||||||
# Proxy for HTTP/HTTPS
|
|
||||||
#proxy: http://127.0.0.1:3128
|
|
||||||
|
|
||||||
proxyBypassHosts:
|
|
||||||
- api.deepl.com
|
|
||||||
- api-free.deepl.com
|
|
||||||
- www.recaptcha.net
|
|
||||||
- hcaptcha.com
|
|
||||||
- challenges.cloudflare.com
|
|
||||||
|
|
||||||
# Proxy for SMTP/SMTPS
|
|
||||||
#proxySmtp: http://127.0.0.1:3128 # use HTTP/1.1 CONNECT
|
|
||||||
#proxySmtp: socks4://127.0.0.1:1080 # use SOCKS4
|
|
||||||
#proxySmtp: socks5://127.0.0.1:1080 # use SOCKS5
|
|
||||||
|
|
||||||
# Media Proxy
|
|
||||||
#mediaProxy: https://example.com/proxy
|
|
||||||
|
|
||||||
# Proxy remote files (default: true)
|
|
||||||
# Proxy remote files by this instance or mediaProxy to prevent remote files from running in remote domains.
|
|
||||||
proxyRemoteFiles: true
|
|
||||||
|
|
||||||
# Movie Thumbnail Generation URL
|
|
||||||
# There is no reference implementation.
|
|
||||||
# For example, Misskey will point to the following URL:
|
|
||||||
# https://example.com/thumbnail.webp?thumbnail=1&url=https%3A%2F%2Fstorage.example.com%2Fpath%2Fto%2Fvideo.mp4
|
|
||||||
#videoThumbnailGenerator: https://example.com
|
|
||||||
|
|
||||||
# Sign outgoing ActivityPub GET request (default: true)
|
|
||||||
signToActivityPubGet: true
|
|
||||||
# Sign outgoing ActivityPub Activities (default: true)
|
|
||||||
# Linked Data signatures are cryptographic signatures attached to each activity to provide proof of authenticity.
|
|
||||||
# When using authorized fetch, this is often undesired as any signed activity can be forwarded to a blocked instance by relays and other instances.
|
|
||||||
# This setting allows admins to disable LD signatures for increased privacy, at the expense of fewer relayed activities and additional inbound fetch (GET) requests.
|
|
||||||
attachLdSignatureForRelays: true
|
|
||||||
# check that inbound ActivityPub GET requests are signed ("authorized fetch")
|
|
||||||
checkActivityPubGetSignature: false
|
|
||||||
|
|
||||||
# For security reasons, uploading attachments from the intranet is prohibited,
|
|
||||||
# but exceptions can be made from the following settings. Default value is "undefined".
|
|
||||||
# Read changelog to learn more (Improvements of 12.90.0 (2021/09/04)).
|
|
||||||
#allowedPrivateNetworks: [
|
|
||||||
# '127.0.0.1/32'
|
|
||||||
#]
|
|
||||||
|
|
||||||
#customMOTD: ['Hello World', 'The sharks rule all', 'Shonks']
|
|
||||||
|
|
||||||
# Upload or download file size limits (bytes)
|
|
||||||
#maxFileSize: 262144000
|
|
|
@ -1,64 +1,7 @@
|
||||||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
# Misskey configuration
|
# Calckey configuration
|
||||||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
# ┌──────────────────────────────┐
|
|
||||||
#───┘ a boring but important thing └────────────────────────────
|
|
||||||
|
|
||||||
#
|
|
||||||
# First of all, let me tell you a story that may possibly be
|
|
||||||
# boring to you and possibly important to you.
|
|
||||||
#
|
|
||||||
# Misskey is licensed under the AGPLv3 license. This license is
|
|
||||||
# known to be often misunderstood. Please read the following
|
|
||||||
# instructions carefully and select the appropriate option so
|
|
||||||
# that you do not negligently cause a license violation.
|
|
||||||
#
|
|
||||||
|
|
||||||
# --------
|
|
||||||
# Option 1: If you host Misskey AS-IS (without any changes to
|
|
||||||
# the source code. forks are not included).
|
|
||||||
#
|
|
||||||
# Step 1: Congratulations! You don't need to do anything.
|
|
||||||
|
|
||||||
# --------
|
|
||||||
# Option 2: If you have made changes to the source code (forks
|
|
||||||
# are included) and publish a Git repository of source
|
|
||||||
# code. There should be no access restrictions on
|
|
||||||
# this repository. Strictly speaking, it doesn't have
|
|
||||||
# to be a Git repository, but you'll probably use Git!
|
|
||||||
#
|
|
||||||
# Step 1: Build and run the Misskey server first.
|
|
||||||
# Step 2: Open <https://your.misskey.example/admin/settings> in
|
|
||||||
# your browser with the administrator account.
|
|
||||||
# Step 3: Enter the URL of your Git repository in the
|
|
||||||
# "Repository URL" field.
|
|
||||||
|
|
||||||
# --------
|
|
||||||
# Option 3: If neither of the above applies to you.
|
|
||||||
# (In this case, the source code should be published
|
|
||||||
# on the Misskey interface. IT IS NOT ENOUGH TO
|
|
||||||
# DISCLOSE THE SOURCE CODE WHEN A USER REQUESTS IT BY
|
|
||||||
# E-MAIL OR OTHER MEANS. If you are not satisfied
|
|
||||||
# with this, it is recommended that you read the
|
|
||||||
# license again carefully. Anyway, enabling this
|
|
||||||
# option will automatically generate and publish a
|
|
||||||
# tarball at build time, protecting you from
|
|
||||||
# inadvertent license violations. (There is no legal
|
|
||||||
# guarantee, of course.) The tarball will generated
|
|
||||||
# from the root directory of your codebase. So it is
|
|
||||||
# also recommended to check <built/tarball> directory
|
|
||||||
# once after building and before activating the server
|
|
||||||
# to avoid ACCIDENTAL LEAKING OF SENSITIVE INFORMATION.
|
|
||||||
# To prevent certain files from being included in the
|
|
||||||
# tarball, add a glob pattern after line 15 in
|
|
||||||
# <scripts/tarball.mjs>. DO NOT FORGET TO BUILD AFTER
|
|
||||||
# ENABLING THIS OPTION!)
|
|
||||||
#
|
|
||||||
# Step 1: Uncomment the following line.
|
|
||||||
#
|
|
||||||
# publishTarballInsteadOfProvideRepositoryUrl: true
|
|
||||||
|
|
||||||
# ┌─────┐
|
# ┌─────┐
|
||||||
#───┘ URL └─────────────────────────────────────────────────────
|
#───┘ URL └─────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
@ -87,10 +30,6 @@ url: https://example.tld/
|
||||||
# The port that your Misskey server should listen on.
|
# The port that your Misskey server should listen on.
|
||||||
port: 3000
|
port: 3000
|
||||||
|
|
||||||
# You can also use UNIX domain socket.
|
|
||||||
# socket: /path/to/misskey.sock
|
|
||||||
# chmodSocket: '777'
|
|
||||||
|
|
||||||
# ┌──────────────────────────┐
|
# ┌──────────────────────────┐
|
||||||
#───┘ PostgreSQL configuration └────────────────────────────────
|
#───┘ PostgreSQL configuration └────────────────────────────────
|
||||||
|
|
||||||
|
@ -99,11 +38,11 @@ db:
|
||||||
port: 5432
|
port: 5432
|
||||||
|
|
||||||
# Database name
|
# Database name
|
||||||
db: misskey
|
db: calckey
|
||||||
|
|
||||||
# Auth
|
# Auth
|
||||||
user: example-misskey-user
|
user: example-calckey-user
|
||||||
pass: example-misskey-pass
|
pass: example-calckey-pass
|
||||||
|
|
||||||
# Whether disable Caching queries
|
# Whether disable Caching queries
|
||||||
#disableCache: true
|
#disableCache: true
|
||||||
|
@ -112,23 +51,6 @@ db:
|
||||||
#extra:
|
#extra:
|
||||||
# ssl: true
|
# ssl: true
|
||||||
|
|
||||||
dbReplications: false
|
|
||||||
|
|
||||||
# You can configure any number of replicas here
|
|
||||||
#dbSlaves:
|
|
||||||
# -
|
|
||||||
# host:
|
|
||||||
# port:
|
|
||||||
# db:
|
|
||||||
# user:
|
|
||||||
# pass:
|
|
||||||
# -
|
|
||||||
# host:
|
|
||||||
# port:
|
|
||||||
# db:
|
|
||||||
# user:
|
|
||||||
# pass:
|
|
||||||
|
|
||||||
# ┌─────────────────────┐
|
# ┌─────────────────────┐
|
||||||
#───┘ Redis configuration └─────────────────────────────────────
|
#───┘ Redis configuration └─────────────────────────────────────
|
||||||
|
|
||||||
|
@ -139,62 +61,16 @@ redis:
|
||||||
#pass: example-pass
|
#pass: example-pass
|
||||||
#prefix: example-prefix
|
#prefix: example-prefix
|
||||||
#db: 1
|
#db: 1
|
||||||
# You can specify more ioredis options...
|
|
||||||
#username: example-username
|
|
||||||
|
|
||||||
#redisForPubsub:
|
# ┌─────────────────────────────┐
|
||||||
|
#───┘ Elasticsearch configuration └─────────────────────────────
|
||||||
|
|
||||||
|
#elasticsearch:
|
||||||
# host: localhost
|
# host: localhost
|
||||||
# port: 6379
|
# port: 9200
|
||||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
# ssl: false
|
||||||
# #pass: example-pass
|
# user:
|
||||||
# #prefix: example-prefix
|
# pass:
|
||||||
# #db: 1
|
|
||||||
# # You can specify more ioredis options...
|
|
||||||
# #username: example-username
|
|
||||||
|
|
||||||
#redisForJobQueue:
|
|
||||||
# host: localhost
|
|
||||||
# port: 6379
|
|
||||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
|
||||||
# #pass: example-pass
|
|
||||||
# #prefix: example-prefix
|
|
||||||
# #db: 1
|
|
||||||
# # You can specify more ioredis options...
|
|
||||||
# #username: example-username
|
|
||||||
|
|
||||||
#redisForTimelines:
|
|
||||||
# host: localhost
|
|
||||||
# port: 6379
|
|
||||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
|
||||||
# #pass: example-pass
|
|
||||||
# #prefix: example-prefix
|
|
||||||
# #db: 1
|
|
||||||
# # You can specify more ioredis options...
|
|
||||||
# #username: example-username
|
|
||||||
|
|
||||||
#redisForReactions:
|
|
||||||
# host: localhost
|
|
||||||
# port: 6379
|
|
||||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
|
||||||
# #pass: example-pass
|
|
||||||
# #prefix: example-prefix
|
|
||||||
# #db: 1
|
|
||||||
# # You can specify more ioredis options...
|
|
||||||
# #username: example-username
|
|
||||||
|
|
||||||
# ┌───────────────────────────┐
|
|
||||||
#───┘ MeiliSearch configuration └─────────────────────────────
|
|
||||||
|
|
||||||
# You can set scope to local (default value) or global
|
|
||||||
# (include notes from remote).
|
|
||||||
|
|
||||||
#meilisearch:
|
|
||||||
# host: localhost
|
|
||||||
# port: 7700
|
|
||||||
# apiKey: ''
|
|
||||||
# ssl: true
|
|
||||||
# index: ''
|
|
||||||
# scope: global
|
|
||||||
|
|
||||||
# ┌───────────────┐
|
# ┌───────────────┐
|
||||||
#───┘ ID generation └───────────────────────────────────────────
|
#───┘ ID generation └───────────────────────────────────────────
|
||||||
|
@ -205,7 +81,6 @@ redis:
|
||||||
|
|
||||||
# Available methods:
|
# Available methods:
|
||||||
# aid ... Short, Millisecond accuracy
|
# aid ... Short, Millisecond accuracy
|
||||||
# aidx ... Millisecond accuracy
|
|
||||||
# meid ... Similar to ObjectID, Millisecond accuracy
|
# meid ... Similar to ObjectID, Millisecond accuracy
|
||||||
# ulid ... Millisecond accuracy
|
# ulid ... Millisecond accuracy
|
||||||
# objectid ... This is left for backward compatibility
|
# objectid ... This is left for backward compatibility
|
||||||
|
@ -213,26 +88,14 @@ redis:
|
||||||
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
||||||
# ID SETTINGS AFTER THAT!
|
# ID SETTINGS AFTER THAT!
|
||||||
|
|
||||||
id: 'aidx'
|
id: 'aid'
|
||||||
|
|
||||||
# ┌────────────────┐
|
|
||||||
#───┘ Error tracking └──────────────────────────────────────────
|
|
||||||
|
|
||||||
# Sentry is available for error tracking.
|
|
||||||
# See the Sentry documentation for more details on options.
|
|
||||||
|
|
||||||
#sentryForBackend:
|
|
||||||
# enableNodeProfiling: true
|
|
||||||
# options:
|
|
||||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
|
||||||
|
|
||||||
#sentryForFrontend:
|
|
||||||
# options:
|
|
||||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
|
||||||
|
|
||||||
# ┌─────────────────────┐
|
# ┌─────────────────────┐
|
||||||
#───┘ Other configuration └─────────────────────────────────────
|
#───┘ Other configuration └─────────────────────────────────────
|
||||||
|
|
||||||
|
# Max note length, should be < 8000.
|
||||||
|
#maxNoteLength: 3000
|
||||||
|
|
||||||
# Whether disable HSTS
|
# Whether disable HSTS
|
||||||
#disableHsts: true
|
#disableHsts: true
|
||||||
|
|
||||||
|
@ -240,49 +103,32 @@ id: 'aidx'
|
||||||
#clusterLimit: 1
|
#clusterLimit: 1
|
||||||
|
|
||||||
# Job concurrency per worker
|
# Job concurrency per worker
|
||||||
#deliverJobConcurrency: 128
|
# deliverJobConcurrency: 128
|
||||||
#inboxJobConcurrency: 16
|
# inboxJobConcurrency: 16
|
||||||
#relationshipJobConcurrency: 16
|
|
||||||
# What's relationshipJob?:
|
|
||||||
# Follow, unfollow, block and unblock(ings) while following-imports, etc. or account migrations.
|
|
||||||
|
|
||||||
# Job rate limiter
|
# Job rate limiter
|
||||||
#deliverJobPerSec: 128
|
# deliverJobPerSec: 128
|
||||||
#inboxJobPerSec: 32
|
# inboxJobPerSec: 16
|
||||||
#relationshipJobPerSec: 64
|
|
||||||
|
|
||||||
# Job attempts
|
# Job attempts
|
||||||
#deliverJobMaxAttempts: 12
|
# deliverJobMaxAttempts: 12
|
||||||
#inboxJobMaxAttempts: 8
|
# inboxJobMaxAttempts: 8
|
||||||
|
|
||||||
# Local address used for outgoing requests
|
|
||||||
#outgoingAddress: 127.0.0.1
|
|
||||||
|
|
||||||
# IP address family used for outgoing request (ipv4, ipv6 or dual)
|
# IP address family used for outgoing request (ipv4, ipv6 or dual)
|
||||||
#outgoingAddressFamily: ipv4
|
#outgoingAddressFamily: ipv4
|
||||||
|
|
||||||
# Amount of characters that can be used when writing notes. Longer notes will be rejected. (minimum: 1)
|
# Syslog option
|
||||||
#maxNoteLength: 3000
|
#syslog:
|
||||||
# Amount of characters that will be saved for remote notes. Longer notes will be truncated to this length. (minimum: 1)
|
# host: localhost
|
||||||
#maxRemoteNoteLength: 100000
|
# port: 514
|
||||||
# Amount of characters that can be used when writing content warnings. Longer warnings will be rejected. (minimum: 1)
|
|
||||||
#maxCwLength: 500
|
|
||||||
# Amount of characters that will be saved for remote content warnings. Longer warnings will be truncated to this length. (minimum: 1)
|
|
||||||
#maxRemoteCwLength: 5000
|
|
||||||
# Amount of characters that can be used when writing media descriptions (alt text). Longer descriptions will be rejected. (minimum: 1)
|
|
||||||
#maxAltTextLength: 20000
|
|
||||||
# Amount of characters that will be saved for remote media descriptions (alt text). Longer descriptions will be truncated to this length. (minimum: 1)
|
|
||||||
#maxRemoteAltTextLength: 100000
|
|
||||||
|
|
||||||
# Proxy for HTTP/HTTPS
|
# Proxy for HTTP/HTTPS
|
||||||
#proxy: http://127.0.0.1:3128
|
#proxy: http://127.0.0.1:3128
|
||||||
|
|
||||||
proxyBypassHosts:
|
#proxyBypassHosts: [
|
||||||
- api.deepl.com
|
# 'example.com',
|
||||||
- api-free.deepl.com
|
# '192.0.2.8'
|
||||||
- www.recaptcha.net
|
#]
|
||||||
- hcaptcha.com
|
|
||||||
- challenges.cloudflare.com
|
|
||||||
|
|
||||||
# Proxy for SMTP/SMTPS
|
# Proxy for SMTP/SMTPS
|
||||||
#proxySmtp: http://127.0.0.1:3128 # use HTTP/1.1 CONNECT
|
#proxySmtp: http://127.0.0.1:3128 # use HTTP/1.1 CONNECT
|
||||||
|
@ -290,47 +136,66 @@ proxyBypassHosts:
|
||||||
#proxySmtp: socks5://127.0.0.1:1080 # use SOCKS5
|
#proxySmtp: socks5://127.0.0.1:1080 # use SOCKS5
|
||||||
|
|
||||||
# Media Proxy
|
# Media Proxy
|
||||||
# Reference Implementation: https://github.com/misskey-dev/media-proxy
|
|
||||||
# * Deliver a common cache between instances
|
|
||||||
# * Perform image compression (on a different server resource than the main process)
|
|
||||||
#mediaProxy: https://example.com/proxy
|
#mediaProxy: https://example.com/proxy
|
||||||
|
|
||||||
# Proxy remote files (default: true)
|
# Proxy remote files (default: false)
|
||||||
# Proxy remote files by this instance or mediaProxy to prevent remote files from running in remote domains.
|
#proxyRemoteFiles: true
|
||||||
proxyRemoteFiles: true
|
|
||||||
|
|
||||||
# Movie Thumbnail Generation URL
|
|
||||||
# There is no reference implementation.
|
|
||||||
# For example, Misskey will point to the following URL:
|
|
||||||
# https://example.com/thumbnail.webp?thumbnail=1&url=https%3A%2F%2Fstorage.example.com%2Fpath%2Fto%2Fvideo.mp4
|
|
||||||
#videoThumbnailGenerator: https://example.com
|
|
||||||
|
|
||||||
# Sign outgoing ActivityPub GET request (default: true)
|
|
||||||
signToActivityPubGet: true
|
|
||||||
# Sign outgoing ActivityPub Activities (default: true)
|
|
||||||
# Linked Data signatures are cryptographic signatures attached to each activity to provide proof of authenticity.
|
|
||||||
# When using authorized fetch, this is often undesired as any signed activity can be forwarded to a blocked instance by relays and other instances.
|
|
||||||
# This setting allows admins to disable LD signatures for increased privacy, at the expense of fewer relayed activities and additional inbound fetch (GET) requests.
|
|
||||||
attachLdSignatureForRelays: true
|
|
||||||
# check that inbound ActivityPub GET requests are signed ("authorized fetch")
|
|
||||||
checkActivityPubGetSignature: false
|
|
||||||
|
|
||||||
# For security reasons, uploading attachments from the intranet is prohibited,
|
|
||||||
# but exceptions can be made from the following settings. Default value is "undefined".
|
|
||||||
# Read changelog to learn more (Improvements of 12.90.0 (2021/09/04)).
|
|
||||||
#allowedPrivateNetworks: [
|
#allowedPrivateNetworks: [
|
||||||
# '127.0.0.1/32'
|
# '127.0.0.1/32'
|
||||||
#]
|
#]
|
||||||
|
|
||||||
#customMOTD: ['Hello World', 'The sharks rule all', 'Shonks']
|
# TWA
|
||||||
|
#twa:
|
||||||
|
# nameSpace: android_app
|
||||||
|
# packageName: tld.domain.twa
|
||||||
|
# sha256CertFingerprints: ['AB:CD:EF']
|
||||||
|
|
||||||
# Upload or download file size limits (bytes)
|
# Upload or download file size limits (bytes)
|
||||||
#maxFileSize: 262144000
|
#maxFileSize: 262144000
|
||||||
|
|
||||||
# timeout and maximum size for imports (e.g. note imports)
|
# Managed hosting settings
|
||||||
#import:
|
# !!!!!!!!!!
|
||||||
# downloadTimeout: 30
|
# >>>>>> NORMAL SELF-HOSTERS, STAY AWAY! <<<<<<
|
||||||
# maxFileSize: 262144000
|
# >>>>>> YOU DON'T NEED THIS! <<<<<<
|
||||||
|
# !!!!!!!!!!
|
||||||
|
# Each category is optional, but if each item in each category is mandatory!
|
||||||
|
# If you mess this up, that's on you, you've been warned...
|
||||||
|
|
||||||
# PID File of master process
|
#maxUserSignups: 100
|
||||||
#pidFile: /tmp/misskey.pid
|
#isManagedHosting: true
|
||||||
|
#deepl:
|
||||||
|
# managed: true
|
||||||
|
# authKey: ''
|
||||||
|
# isPro: false
|
||||||
|
#
|
||||||
|
#email:
|
||||||
|
# managed: true
|
||||||
|
# address: 'example@email.com'
|
||||||
|
# host: 'email.com'
|
||||||
|
# port: 587
|
||||||
|
# user: 'example@email.com'
|
||||||
|
# pass: ''
|
||||||
|
# useImplicitSslTls: false
|
||||||
|
#
|
||||||
|
#objectStorage:
|
||||||
|
# managed: true
|
||||||
|
# baseUrl: ''
|
||||||
|
# bucket: ''
|
||||||
|
# prefix: ''
|
||||||
|
# endpoint: ''
|
||||||
|
# region: ''
|
||||||
|
# accessKey: ''
|
||||||
|
# secretKey: ''
|
||||||
|
# useSsl: true
|
||||||
|
# connnectOverProxy: false
|
||||||
|
# setPublicReadOnUpload: true
|
||||||
|
# s3ForcePathStyle: true
|
||||||
|
|
||||||
|
# !!!!!!!!!!
|
||||||
|
# >>>>>> AGAIN, NORMAL SELF-HOSTERS, STAY AWAY! <<<<<<
|
||||||
|
# >>>>>> YOU DON'T NEED THIS, ABOVE SETTINGS ARE FOR MANAGED HOSTING ONLY! <<<<<<
|
||||||
|
# !!!!!!!!!!
|
||||||
|
|
||||||
|
# Seriously. Do NOT fill out the above settings if you're self-hosting.
|
||||||
|
# They're much better off being set from the control panel.
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
FROM mcr.microsoft.com/devcontainers/javascript-node:0-18
|
|
|
@ -1,53 +0,0 @@
|
||||||
services:
|
|
||||||
app:
|
|
||||||
build:
|
|
||||||
context: .
|
|
||||||
dockerfile: Dockerfile
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
- ../:/workspace:cached
|
|
||||||
- node_modules:/workspace/node_modules
|
|
||||||
|
|
||||||
command: sleep infinity
|
|
||||||
|
|
||||||
networks:
|
|
||||||
- internal_network
|
|
||||||
- external_network
|
|
||||||
|
|
||||||
redis:
|
|
||||||
restart: unless-stopped
|
|
||||||
image: redis:7-alpine
|
|
||||||
networks:
|
|
||||||
- internal_network
|
|
||||||
volumes:
|
|
||||||
- redis-data:/data
|
|
||||||
healthcheck:
|
|
||||||
test: "redis-cli ping"
|
|
||||||
interval: 5s
|
|
||||||
retries: 20
|
|
||||||
|
|
||||||
db:
|
|
||||||
restart: unless-stopped
|
|
||||||
image: postgres:15-alpine
|
|
||||||
networks:
|
|
||||||
- internal_network
|
|
||||||
environment:
|
|
||||||
POSTGRES_USER: postgres
|
|
||||||
POSTGRES_PASSWORD: postgres
|
|
||||||
POSTGRES_DB: misskey
|
|
||||||
volumes:
|
|
||||||
- postgres-data:/var/lib/postgresql/data
|
|
||||||
healthcheck:
|
|
||||||
test: "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"
|
|
||||||
interval: 5s
|
|
||||||
retries: 20
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
postgres-data:
|
|
||||||
redis-data:
|
|
||||||
node_modules:
|
|
||||||
|
|
||||||
networks:
|
|
||||||
internal_network:
|
|
||||||
internal: true
|
|
||||||
external_network:
|
|
|
@ -1,26 +0,0 @@
|
||||||
{
|
|
||||||
"name": "Misskey",
|
|
||||||
"dockerComposeFile": "compose.yml",
|
|
||||||
"service": "app",
|
|
||||||
"workspaceFolder": "/workspace",
|
|
||||||
"features": {
|
|
||||||
"ghcr.io/devcontainers/features/node:1": {
|
|
||||||
"version": "20.16.0"
|
|
||||||
},
|
|
||||||
"ghcr.io/devcontainers-contrib/features/corepack:1": {}
|
|
||||||
},
|
|
||||||
"forwardPorts": [3000],
|
|
||||||
"postCreateCommand": "/bin/bash .devcontainer/init.sh",
|
|
||||||
"customizations": {
|
|
||||||
"vscode": {
|
|
||||||
"extensions": [
|
|
||||||
"editorconfig.editorconfig",
|
|
||||||
"dbaeumer.vscode-eslint",
|
|
||||||
"Vue.volar",
|
|
||||||
"Orta.vscode-jest",
|
|
||||||
"dbaeumer.vscode-eslint",
|
|
||||||
"mrmlnc.vscode-json5"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,211 +0,0 @@
|
||||||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
||||||
# Misskey configuration
|
|
||||||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
||||||
|
|
||||||
# ┌─────┐
|
|
||||||
#───┘ URL └─────────────────────────────────────────────────────
|
|
||||||
|
|
||||||
# Final accessible URL seen by a user.
|
|
||||||
url: http://127.0.0.1:3000/
|
|
||||||
|
|
||||||
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
|
||||||
# URL SETTINGS AFTER THAT!
|
|
||||||
|
|
||||||
# ┌───────────────────────┐
|
|
||||||
#───┘ Port and TLS settings └───────────────────────────────────
|
|
||||||
|
|
||||||
#
|
|
||||||
# Misskey requires a reverse proxy to support HTTPS connections.
|
|
||||||
#
|
|
||||||
# +----- https://example.tld/ ------------+
|
|
||||||
# +------+ |+-------------+ +----------------+|
|
|
||||||
# | User | ---> || Proxy (443) | ---> | Misskey (3000) ||
|
|
||||||
# +------+ |+-------------+ +----------------+|
|
|
||||||
# +---------------------------------------+
|
|
||||||
#
|
|
||||||
# You need to set up a reverse proxy. (e.g. nginx)
|
|
||||||
# An encrypted connection with HTTPS is highly recommended
|
|
||||||
# because tokens may be transferred in GET requests.
|
|
||||||
|
|
||||||
# The port that your Misskey server should listen on.
|
|
||||||
port: 3000
|
|
||||||
|
|
||||||
# ┌──────────────────────────┐
|
|
||||||
#───┘ PostgreSQL configuration └────────────────────────────────
|
|
||||||
|
|
||||||
db:
|
|
||||||
host: db
|
|
||||||
port: 5432
|
|
||||||
|
|
||||||
# Database name
|
|
||||||
db: misskey
|
|
||||||
|
|
||||||
# Auth
|
|
||||||
user: postgres
|
|
||||||
pass: postgres
|
|
||||||
|
|
||||||
# Whether disable Caching queries
|
|
||||||
#disableCache: true
|
|
||||||
|
|
||||||
# Extra Connection options
|
|
||||||
#extra:
|
|
||||||
# ssl: true
|
|
||||||
|
|
||||||
dbReplications: false
|
|
||||||
|
|
||||||
# You can configure any number of replicas here
|
|
||||||
#dbSlaves:
|
|
||||||
# -
|
|
||||||
# host:
|
|
||||||
# port:
|
|
||||||
# db:
|
|
||||||
# user:
|
|
||||||
# pass:
|
|
||||||
# -
|
|
||||||
# host:
|
|
||||||
# port:
|
|
||||||
# db:
|
|
||||||
# user:
|
|
||||||
# pass:
|
|
||||||
|
|
||||||
# ┌─────────────────────┐
|
|
||||||
#───┘ Redis configuration └─────────────────────────────────────
|
|
||||||
|
|
||||||
redis:
|
|
||||||
host: redis
|
|
||||||
port: 6379
|
|
||||||
#family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
|
||||||
#pass: example-pass
|
|
||||||
#prefix: example-prefix
|
|
||||||
#db: 1
|
|
||||||
|
|
||||||
#redisForPubsub:
|
|
||||||
# host: redis
|
|
||||||
# port: 6379
|
|
||||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
|
||||||
# #pass: example-pass
|
|
||||||
# #prefix: example-prefix
|
|
||||||
# #db: 1
|
|
||||||
|
|
||||||
#redisForJobQueue:
|
|
||||||
# host: redis
|
|
||||||
# port: 6379
|
|
||||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
|
||||||
# #pass: example-pass
|
|
||||||
# #prefix: example-prefix
|
|
||||||
# #db: 1
|
|
||||||
|
|
||||||
#redisForTimelines:
|
|
||||||
# host: redis
|
|
||||||
# port: 6379
|
|
||||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
|
||||||
# #pass: example-pass
|
|
||||||
# #prefix: example-prefix
|
|
||||||
# #db: 1
|
|
||||||
|
|
||||||
#redisForReactions:
|
|
||||||
# host: redis
|
|
||||||
# port: 6379
|
|
||||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
|
||||||
# #pass: example-pass
|
|
||||||
# #prefix: example-prefix
|
|
||||||
# #db: 1
|
|
||||||
|
|
||||||
# ┌───────────────────────────┐
|
|
||||||
#───┘ MeiliSearch configuration └─────────────────────────────
|
|
||||||
|
|
||||||
#meilisearch:
|
|
||||||
# host: meilisearch
|
|
||||||
# port: 7700
|
|
||||||
# apiKey: ''
|
|
||||||
# ssl: true
|
|
||||||
# index: ''
|
|
||||||
|
|
||||||
# ┌───────────────┐
|
|
||||||
#───┘ ID generation └───────────────────────────────────────────
|
|
||||||
|
|
||||||
# You can select the ID generation method.
|
|
||||||
# You don't usually need to change this setting, but you can
|
|
||||||
# change it according to your preferences.
|
|
||||||
|
|
||||||
# Available methods:
|
|
||||||
# aid ... Short, Millisecond accuracy
|
|
||||||
# aidx ... Millisecond accuracy
|
|
||||||
# meid ... Similar to ObjectID, Millisecond accuracy
|
|
||||||
# ulid ... Millisecond accuracy
|
|
||||||
# objectid ... This is left for backward compatibility
|
|
||||||
|
|
||||||
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
|
||||||
# ID SETTINGS AFTER THAT!
|
|
||||||
|
|
||||||
id: 'aidx'
|
|
||||||
|
|
||||||
# ┌────────────────┐
|
|
||||||
#───┘ Error tracking └──────────────────────────────────────────
|
|
||||||
|
|
||||||
# Sentry is available for error tracking.
|
|
||||||
# See the Sentry documentation for more details on options.
|
|
||||||
|
|
||||||
#sentryForBackend:
|
|
||||||
# enableNodeProfiling: true
|
|
||||||
# options:
|
|
||||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
|
||||||
|
|
||||||
#sentryForFrontend:
|
|
||||||
# options:
|
|
||||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
|
||||||
|
|
||||||
# ┌─────────────────────┐
|
|
||||||
#───┘ Other configuration └─────────────────────────────────────
|
|
||||||
|
|
||||||
# Whether disable HSTS
|
|
||||||
#disableHsts: true
|
|
||||||
|
|
||||||
# Number of worker processes
|
|
||||||
#clusterLimit: 1
|
|
||||||
|
|
||||||
# Job concurrency per worker
|
|
||||||
# deliverJobConcurrency: 128
|
|
||||||
# inboxJobConcurrency: 16
|
|
||||||
|
|
||||||
# Job rate limiter
|
|
||||||
# deliverJobPerSec: 128
|
|
||||||
# inboxJobPerSec: 32
|
|
||||||
|
|
||||||
# Job attempts
|
|
||||||
# deliverJobMaxAttempts: 12
|
|
||||||
# inboxJobMaxAttempts: 8
|
|
||||||
|
|
||||||
# IP address family used for outgoing request (ipv4, ipv6 or dual)
|
|
||||||
#outgoingAddressFamily: ipv4
|
|
||||||
|
|
||||||
# Proxy for HTTP/HTTPS
|
|
||||||
#proxy: http://127.0.0.1:3128
|
|
||||||
|
|
||||||
proxyBypassHosts:
|
|
||||||
- api.deepl.com
|
|
||||||
- api-free.deepl.com
|
|
||||||
- www.recaptcha.net
|
|
||||||
- hcaptcha.com
|
|
||||||
- challenges.cloudflare.com
|
|
||||||
|
|
||||||
# Proxy for SMTP/SMTPS
|
|
||||||
#proxySmtp: http://127.0.0.1:3128 # use HTTP/1.1 CONNECT
|
|
||||||
#proxySmtp: socks4://127.0.0.1:1080 # use SOCKS4
|
|
||||||
#proxySmtp: socks5://127.0.0.1:1080 # use SOCKS5
|
|
||||||
|
|
||||||
# Media Proxy
|
|
||||||
#mediaProxy: https://example.com/proxy
|
|
||||||
|
|
||||||
# Proxy remote files (default: true)
|
|
||||||
proxyRemoteFiles: true
|
|
||||||
|
|
||||||
# Sign to ActivityPub GET request (default: true)
|
|
||||||
signToActivityPubGet: true
|
|
||||||
|
|
||||||
allowedPrivateNetworks: [
|
|
||||||
'127.0.0.1/32'
|
|
||||||
]
|
|
||||||
|
|
||||||
# Upload or download file size limits (bytes)
|
|
||||||
#maxFileSize: 262144000
|
|
|
@ -1,17 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -xe
|
|
||||||
|
|
||||||
sudo chown node node_modules
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get -y install libgtk2.0-0 libgtk-3-0 libgbm-dev libnotify-dev libnss3 libxss1 libasound2 libxtst6 xauth xvfb
|
|
||||||
git config --global --add safe.directory /workspace
|
|
||||||
git submodule update --init
|
|
||||||
corepack install
|
|
||||||
corepack enable
|
|
||||||
pnpm config set store-dir /home/node/.local/share/pnpm/store
|
|
||||||
pnpm install --frozen-lockfile
|
|
||||||
cp .devcontainer/devcontainer.yml .config/default.yml
|
|
||||||
pnpm build
|
|
||||||
pnpm migrate
|
|
||||||
pnpm exec cypress install
|
|
|
@ -1,30 +1,48 @@
|
||||||
.autogen
|
# Visual Studio Code
|
||||||
.github
|
/.vscode
|
||||||
.travis
|
!/.vscode/extensions.json
|
||||||
.vscode
|
|
||||||
.config
|
# Intelij-IDEA
|
||||||
|
/.idea
|
||||||
|
packages/backend/.idea/backend.iml
|
||||||
|
packages/backend/.idea/modules.xml
|
||||||
|
packages/backend/.idea/vcs.xml
|
||||||
|
|
||||||
|
# Node.js
|
||||||
|
node_modules
|
||||||
|
report.*.json
|
||||||
|
|
||||||
|
# Cypress
|
||||||
|
cypress/screenshots
|
||||||
|
cypress/videos
|
||||||
|
|
||||||
|
# Coverage
|
||||||
|
coverage
|
||||||
|
|
||||||
|
# config
|
||||||
|
/.config/*
|
||||||
|
!/.config/example.yml
|
||||||
|
!/.config/docker_example.env
|
||||||
|
|
||||||
|
#docker dev config
|
||||||
|
/dev/docker-compose.yml
|
||||||
|
|
||||||
|
# misskey
|
||||||
|
built
|
||||||
|
db
|
||||||
|
elasticsearch
|
||||||
|
redis
|
||||||
|
npm-debug.log
|
||||||
|
*.pem
|
||||||
|
run.bat
|
||||||
|
api-docs.json
|
||||||
|
*.log
|
||||||
|
*.code-workspace
|
||||||
|
.DS_Store
|
||||||
|
files
|
||||||
|
ormconfig.json
|
||||||
|
packages/backend/assets/instance.css
|
||||||
|
|
||||||
|
# dockerignore custom
|
||||||
|
.git
|
||||||
Dockerfile
|
Dockerfile
|
||||||
build/
|
|
||||||
built/
|
|
||||||
db/
|
|
||||||
.devcontainer/compose.yml
|
|
||||||
node_modules/
|
|
||||||
packages/*/node_modules
|
|
||||||
redis/
|
|
||||||
files/
|
|
||||||
fluent-emojis/
|
|
||||||
.pnp.*
|
|
||||||
|
|
||||||
# .yarn関連
|
|
||||||
.yarn/*
|
|
||||||
!.yarn/patches
|
|
||||||
!.yarn/plugins
|
|
||||||
!.yarn/releases
|
|
||||||
!.yarn/sdks
|
|
||||||
!.yarn/versions
|
|
||||||
|
|
||||||
.pnpm-store
|
|
||||||
|
|
||||||
.idea/
|
|
||||||
packages/*/.vscode/
|
|
||||||
packages/backend/test/compose.yml
|
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
DKL-DI-0005
|
|
||||||
DKL-DI-0006
|
|
||||||
DKL-LI-0003
|
|
|
@ -5,11 +5,6 @@ indent_style = tab
|
||||||
indent_size = 2
|
indent_size = 2
|
||||||
charset = utf-8
|
charset = utf-8
|
||||||
insert_final_newline = true
|
insert_final_newline = true
|
||||||
end_of_line = lf
|
|
||||||
trim_trailing_whitespace = true
|
|
||||||
|
|
||||||
[*.md]
|
[*.yml]
|
||||||
trim_trailing_whitespace = false
|
|
||||||
|
|
||||||
[*.{yml,yaml}]
|
|
||||||
indent_style = space
|
indent_style = space
|
||||||
|
|
1
.gitattributes
vendored
|
@ -5,4 +5,3 @@
|
||||||
*.glb -diff -text
|
*.glb -diff -text
|
||||||
*.blend -diff -text
|
*.blend -diff -text
|
||||||
*.afdesign -diff -text
|
*.afdesign -diff -text
|
||||||
* text=auto eol=lf
|
|
||||||
|
|
59
.gitignore
vendored
|
@ -4,28 +4,14 @@
|
||||||
|
|
||||||
# Intelij-IDEA
|
# Intelij-IDEA
|
||||||
/.idea
|
/.idea
|
||||||
|
packages/backend/.idea/backend.iml
|
||||||
|
packages/backend/.idea/modules.xml
|
||||||
|
packages/backend/.idea/vcs.xml
|
||||||
|
|
||||||
# Node.js
|
# Node.js
|
||||||
node_modules
|
node_modules
|
||||||
report.*.json
|
report.*.json
|
||||||
|
|
||||||
# Yarn
|
|
||||||
.yarn/*
|
|
||||||
!.yarn/patches
|
|
||||||
!.yarn/plugins
|
|
||||||
!.yarn/releases
|
|
||||||
!.yarn/sdks
|
|
||||||
!.yarn/versions
|
|
||||||
packages/frontend/.yarn/cache
|
|
||||||
packages/backend/.yarn/cache
|
|
||||||
packages/sw/.yarn/cache
|
|
||||||
|
|
||||||
# pnpm
|
|
||||||
.pnpm-store
|
|
||||||
|
|
||||||
# eslint
|
|
||||||
**/.eslintcache
|
|
||||||
|
|
||||||
# Cypress
|
# Cypress
|
||||||
cypress/screenshots
|
cypress/screenshots
|
||||||
cypress/videos
|
cypress/videos
|
||||||
|
@ -36,41 +22,28 @@ coverage
|
||||||
# config
|
# config
|
||||||
/.config/*
|
/.config/*
|
||||||
!/.config/example.yml
|
!/.config/example.yml
|
||||||
!/.config/docker_example.yml
|
|
||||||
!/.config/docker_example.env
|
!/.config/docker_example.env
|
||||||
!/.config/cypress-devcontainer.yml
|
|
||||||
docker-compose.yml
|
#docker dev config
|
||||||
compose.yml
|
/dev/docker-compose.yml
|
||||||
.devcontainer/compose.yml
|
|
||||||
!/.devcontainer/compose.yml
|
|
||||||
|
|
||||||
# misskey
|
# misskey
|
||||||
/build
|
|
||||||
built
|
built
|
||||||
built-test
|
db
|
||||||
js-built
|
elasticsearch
|
||||||
/data
|
redis
|
||||||
/.cache-loader
|
|
||||||
/db
|
|
||||||
/meili_data
|
|
||||||
npm-debug.log
|
npm-debug.log
|
||||||
*.pem
|
*.pem
|
||||||
run.bat
|
run.bat
|
||||||
api-docs.json
|
api-docs.json
|
||||||
*.log
|
*.log
|
||||||
/redis
|
|
||||||
*.code-workspace
|
*.code-workspace
|
||||||
.DS_Store
|
.DS_Store
|
||||||
/files
|
files
|
||||||
ormconfig.json
|
ormconfig.json
|
||||||
temp
|
packages/backend/assets/instance.css
|
||||||
/packages/frontend/src/**/*.stories.ts
|
packages/backend/assets/sounds/None.mp3
|
||||||
tsdoc-metadata.json
|
|
||||||
misskey-assets
|
|
||||||
|
|
||||||
# Vite temporary files
|
|
||||||
vite.config.js.timestamp-*
|
|
||||||
vite.config.ts.timestamp-*
|
|
||||||
|
|
||||||
# blender backups
|
# blender backups
|
||||||
*.blend1
|
*.blend1
|
||||||
|
@ -79,8 +52,6 @@ vite.config.ts.timestamp-*
|
||||||
*.blend4
|
*.blend4
|
||||||
*.blend5
|
*.blend5
|
||||||
|
|
||||||
# VSCode addon
|
# old yarn
|
||||||
.favorites.json
|
.yarn
|
||||||
|
yarn*
|
||||||
# Sharkey
|
|
||||||
/packages/megalodon/lib
|
|
||||||
|
|
114
.gitlab-ci.yml
|
@ -1,114 +0,0 @@
|
||||||
stages:
|
|
||||||
- test
|
|
||||||
- deploy
|
|
||||||
|
|
||||||
testCommit:
|
|
||||||
stage: test
|
|
||||||
image: node:iron
|
|
||||||
services:
|
|
||||||
- postgres:15
|
|
||||||
- redis
|
|
||||||
variables:
|
|
||||||
POSTGRES_PASSWORD: ci
|
|
||||||
script:
|
|
||||||
- apt-get update && apt-get install -y git wget curl build-essential python3 ffmpeg
|
|
||||||
- cp .config/ci.yml .config/default.yml
|
|
||||||
- cp .config/ci.yml .config/test.yml
|
|
||||||
- corepack enable
|
|
||||||
- corepack prepare pnpm@latest --activate
|
|
||||||
- git submodule update --init
|
|
||||||
- pnpm install --frozen-lockfile
|
|
||||||
- pnpm run build
|
|
||||||
- pnpm run migrate
|
|
||||||
- pnpm run --filter='!megalodon' test
|
|
||||||
- pnpm run --filter=backend --filter=misskey-js lint
|
|
||||||
- pnpm run --filter=frontend --filter=frontend-embed eslint
|
|
||||||
cache:
|
|
||||||
key: test
|
|
||||||
policy: pull-push
|
|
||||||
when: on_success
|
|
||||||
paths:
|
|
||||||
- node_modules/
|
|
||||||
- packages/*/node_modules/
|
|
||||||
only:
|
|
||||||
- develop
|
|
||||||
- merge_requests
|
|
||||||
- stable
|
|
||||||
|
|
||||||
getImageTag:
|
|
||||||
stage: deploy
|
|
||||||
image: ubuntu:latest
|
|
||||||
script:
|
|
||||||
- apt-get update && apt-get install -y jq
|
|
||||||
- |
|
|
||||||
if test -n "$CI_COMMIT_TAG"; then
|
|
||||||
tag="$CI_COMMIT_TAG"
|
|
||||||
elif test "$CI_COMMIT_BRANCH" == "stable"; then
|
|
||||||
tag="latest"
|
|
||||||
elif test "$CI_COMMIT_BRANCH" == "develop"; then
|
|
||||||
tag="develop"
|
|
||||||
else
|
|
||||||
tag="$CI_COMMIT_BRANCH"
|
|
||||||
fi
|
|
||||||
version=$(cat package.json | jq -r '.version')
|
|
||||||
- echo "REGISTRY_PUSH_TAG=$tag" >> build.env
|
|
||||||
- echo "REGISTRY_PUSH_VERSION=$version" >> build.env
|
|
||||||
artifacts:
|
|
||||||
reports:
|
|
||||||
dotenv: build.env
|
|
||||||
only:
|
|
||||||
- stable
|
|
||||||
- develop
|
|
||||||
- tags
|
|
||||||
|
|
||||||
buildDocker:
|
|
||||||
stage: deploy
|
|
||||||
needs:
|
|
||||||
- job: getImageTag
|
|
||||||
artifacts: true
|
|
||||||
parallel:
|
|
||||||
matrix:
|
|
||||||
- ARCH: amd64
|
|
||||||
- ARCH: arm64
|
|
||||||
tags:
|
|
||||||
- ${ARCH}
|
|
||||||
image:
|
|
||||||
name: gcr.io/kaniko-project/executor:debug
|
|
||||||
entrypoint: [""]
|
|
||||||
script:
|
|
||||||
- >-
|
|
||||||
/kaniko/executor
|
|
||||||
--context "${CI_PROJECT_DIR}"
|
|
||||||
--dockerfile "${CI_PROJECT_DIR}/Dockerfile"
|
|
||||||
--destination "${CI_REGISTRY_IMAGE}:${REGISTRY_PUSH_VERSION}-${ARCH}"
|
|
||||||
only:
|
|
||||||
- stable
|
|
||||||
- develop
|
|
||||||
- tags
|
|
||||||
|
|
||||||
mergeManifests:
|
|
||||||
stage: deploy
|
|
||||||
needs:
|
|
||||||
- job: buildDocker
|
|
||||||
artifacts: false
|
|
||||||
- job: getImageTag
|
|
||||||
artifacts: true
|
|
||||||
tags:
|
|
||||||
- docker
|
|
||||||
image:
|
|
||||||
name: mplatform/manifest-tool:alpine
|
|
||||||
entrypoint: [""]
|
|
||||||
script:
|
|
||||||
- >-
|
|
||||||
manifest-tool
|
|
||||||
--username=${CI_REGISTRY_USER}
|
|
||||||
--password=${CI_REGISTRY_PASSWORD}
|
|
||||||
push from-args
|
|
||||||
--platforms linux/amd64,linux/arm64
|
|
||||||
--tags ${REGISTRY_PUSH_VERSION}
|
|
||||||
--template ${CI_REGISTRY_IMAGE}:${REGISTRY_PUSH_VERSION}-ARCH
|
|
||||||
--target ${CI_REGISTRY_IMAGE}:${REGISTRY_PUSH_TAG}
|
|
||||||
only:
|
|
||||||
- stable
|
|
||||||
- develop
|
|
||||||
- tags
|
|
|
@ -1,29 +0,0 @@
|
||||||
<!-- 💖 Thanks for taking the time to fill out this bug report!
|
|
||||||
💁 Having trouble with deployment? [Ask the support chat.](https://discord.gg/4qUhaeeHmm)
|
|
||||||
🔒 Found a security vulnerability? [Please disclose it responsibly.](https://activitypub.software/TransFem-org/Sharkey/-/blob/develop/SECURITY.md)
|
|
||||||
🤝 By submitting this feature request, you agree to follow our [Contribution Guidelines.](https://activitypub.software/TransFem-org/Sharkey/-/blob/develop/CONTRIBUTING.md) -->
|
|
||||||
|
|
||||||
**What happened?** _(Please give us a brief description of what happened.)_
|
|
||||||
|
|
||||||
**What did you expect to happen?** _(Please give us a brief description of what you expected to happen.)_
|
|
||||||
|
|
||||||
**Version** _(What version of Sharkey is your instance running? You can find this by clicking your instance's logo at the top left and then clicking instance information.)_
|
|
||||||
|
|
||||||
**Instance** _(What instance of Sharkey are you using?)_
|
|
||||||
|
|
||||||
**What type of issue is this?** _(If this happens on your device and has to do with the user interface, it's client-side. If this happens on either with the API or the backend, or you got a server-side error in the client, it's server-side.)_
|
|
||||||
|
|
||||||
**What browser are you using? (Client-side issues only)**
|
|
||||||
|
|
||||||
**What operating system are you using? (Client-side issues only)**
|
|
||||||
|
|
||||||
**How do you deploy Sharkey on your server? (Server-side issues only)**
|
|
||||||
|
|
||||||
**What operating system are you using? (Server-side issues only)**
|
|
||||||
|
|
||||||
**Relevant log output** _(Please copy and paste any relevant log output. You can find your log by inspecting the page, and going to the "console" tab. This will be automatically formatted into code, so no need for backticks.)_
|
|
||||||
|
|
||||||
**Contribution Guidelines**
|
|
||||||
By submitting this issue, you agree to follow our [Contribution Guidelines](https://activitypub.software/TransFem-org/Sharkey/-/blob/develop/CONTRIBUTING.md)
|
|
||||||
- [ ] I agree to follow this project's Contribution Guidelines
|
|
||||||
- [ ] I have searched the issue tracker for similar issues, and this is not a duplicate.
|
|
|
@ -1,17 +0,0 @@
|
||||||
<!-- 💖 Thanks for taking the time to fill out this bug report!
|
|
||||||
💁 Having trouble with deployment? [Ask the support chat.](https://discord.gg/4qUhaeeHmm)
|
|
||||||
🔒 Found a security vulnerability? [Please disclose it responsibly.](https://activitypub.software/TransFem-org/Sharkey/-/blob/develop/SECURITY.md)
|
|
||||||
🤝 By submitting this feature request, you agree to follow our [Contribution Guidelines.](https://activitypub.software/TransFem-org/Sharkey/-/blob/develop/CONTRIBUTING.md) -->
|
|
||||||
|
|
||||||
**What feature would you like implemented?** _(Please give us a brief description of what you'd like.)_
|
|
||||||
|
|
||||||
**Why should we add this feature?** _(Please give us a brief description of why your feature is important.)_
|
|
||||||
|
|
||||||
**Version** _(What version of Sharkey is your instance running? You can find this by clicking your instance's logo at the top left and then clicking instance information.)_
|
|
||||||
|
|
||||||
**Instance** _(What instance of Sharkey are you using?)_
|
|
||||||
|
|
||||||
**Contribution Guidelines**
|
|
||||||
By submitting this issue, you agree to follow our [Contribution Guidelines](https://activitypub.software/TransFem-org/Sharkey/-/blob/develop/CONTRIBUTING.md)
|
|
||||||
- [ ] I agree to follow this project's Contribution Guidelines
|
|
||||||
- [ ] I have searched the issue tracker for similar requests, and this is not a duplicate.
|
|
|
@ -1,11 +0,0 @@
|
||||||
<!-- Thanks for taking the time to make Sharkey better! -->
|
|
||||||
|
|
||||||
**What does this PR do?** _(Please give us a brief description of what this PR does.)_
|
|
||||||
|
|
||||||
**Contribution Guidelines**
|
|
||||||
By submitting this merge request, you agree to follow our [Contribution Guidelines](https://activitypub.software/TransFem-org/Sharkey/-/blob/develop/CONTRIBUTING.md)
|
|
||||||
- [ ] I agree to follow this project's Contribution Guidelines
|
|
||||||
- [ ] I have made sure to test this pull request
|
|
||||||
|
|
||||||
<!-- Uncomment if your merge request has multiple authors -->
|
|
||||||
<!-- Co-authored-by: Name <email@email.com> -->
|
|
6
.gitmodules
vendored
|
@ -1,6 +0,0 @@
|
||||||
[submodule "fluent-emojis"]
|
|
||||||
path = fluent-emojis
|
|
||||||
url = https://github.com/misskey-dev/emojis.git
|
|
||||||
[submodule "tossface-emojis"]
|
|
||||||
path = tossface-emojis
|
|
||||||
url = https://activitypub.software/TransFem-org/tossface-emojis.git
|
|
|
@ -1 +1 @@
|
||||||
20.16.0
|
v16.15.0
|
||||||
|
|
2
.npmrc
|
@ -1,2 +0,0 @@
|
||||||
@transfem-org:registry=https://activitypub.software/api/v4/packages/npm/
|
|
||||||
engine-strict = true
|
|
4
.vim/coc-settings.json
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"eslint.packageManager": "pnpm",
|
||||||
|
"workspace.workspaceFolderCheckCwd": false
|
||||||
|
}
|
16
.vscode/extensions.json
vendored
|
@ -1,9 +1,11 @@
|
||||||
{
|
{
|
||||||
"recommendations": [
|
"recommendations": [
|
||||||
"editorconfig.editorconfig",
|
"editorconfig.editorconfig",
|
||||||
"dbaeumer.vscode-eslint",
|
"eg2.vscode-npm-script",
|
||||||
"Vue.volar",
|
"rome.rome",
|
||||||
"Orta.vscode-jest",
|
"Vue.volar",
|
||||||
"mrmlnc.vscode-json5"
|
"Vue.vscode-typescript-vue-plugin",
|
||||||
]
|
"arcanis.vscode-zipfs",
|
||||||
|
"Orta.vscode-twoslash-queries"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
15
.vscode/settings.json
vendored
|
@ -1,15 +0,0 @@
|
||||||
{
|
|
||||||
"search.exclude": {
|
|
||||||
"**/node_modules": true
|
|
||||||
},
|
|
||||||
"typescript.tsdk": "node_modules/typescript/lib",
|
|
||||||
"files.associations": {
|
|
||||||
"*.test.ts": "typescript"
|
|
||||||
},
|
|
||||||
"jest.jestCommandLine": "pnpm run jest",
|
|
||||||
"jest.runMode": "on-demand",
|
|
||||||
"editor.codeActionsOnSave": {
|
|
||||||
"source.fixAll": "explicit"
|
|
||||||
},
|
|
||||||
"editor.formatOnSave": false
|
|
||||||
}
|
|
21
.woodpecker/commit.yml
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
pipeline:
|
||||||
|
testCommit:
|
||||||
|
image: node:latest
|
||||||
|
commands:
|
||||||
|
- cp .config/ci.yml .config/default.yml
|
||||||
|
- corepack enable
|
||||||
|
- corepack prepare pnpm@latest --activate
|
||||||
|
- pnpm i --frozen-lockfile
|
||||||
|
- pnpm run build
|
||||||
|
- pnpm run migrate
|
||||||
|
|
||||||
|
services:
|
||||||
|
database:
|
||||||
|
image: postgres:15
|
||||||
|
environment:
|
||||||
|
- POSTGRES_PASSWORD=test
|
||||||
|
redis:
|
||||||
|
image: redis
|
||||||
|
|
||||||
|
branches:
|
||||||
|
include: [ main, develop, feature/* ]
|
15
.woodpecker/dockerHubRelease.yml
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
pipeline:
|
||||||
|
publish-docker-latest:
|
||||||
|
image: plugins/kaniko
|
||||||
|
settings:
|
||||||
|
repo: thatonecalculator/calckey
|
||||||
|
tags: latest
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
username:
|
||||||
|
# Secret 'docker_username' needs to be set in the CI settings
|
||||||
|
from_secret: docker_username
|
||||||
|
password:
|
||||||
|
# Secret 'docker_password' needs to be set in the CI settings
|
||||||
|
from_secret: docker_password
|
||||||
|
|
||||||
|
branches: main
|
15
.woodpecker/dockerHubReleaseCandidate.yml
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
pipeline:
|
||||||
|
publish-docker-latest:
|
||||||
|
image: plugins/kaniko
|
||||||
|
settings:
|
||||||
|
repo: thatonecalculator/calckey
|
||||||
|
tags: rc
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
username:
|
||||||
|
# Secret 'docker_username' needs to be set in the CI settings
|
||||||
|
from_secret: docker_username
|
||||||
|
password:
|
||||||
|
# Secret 'docker_password' needs to be set in the CI settings
|
||||||
|
from_secret: docker_password
|
||||||
|
|
||||||
|
branches: beta
|
19
.woodpecker/dockerHubTag.yml
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
pipeline:
|
||||||
|
publish-docker-tag:
|
||||||
|
image: plugins/kaniko
|
||||||
|
settings:
|
||||||
|
repo: thatonecalculator/calckey
|
||||||
|
# Uses the tag from git for the container tag
|
||||||
|
tags: ${CI_COMMIT_TAG}
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
username:
|
||||||
|
# Secret 'docker_username' needs to be set in the CI settings
|
||||||
|
from_secret: docker_username
|
||||||
|
password:
|
||||||
|
# Secret 'docker_password' needs to be set in the CI settings
|
||||||
|
from_secret: docker_password
|
||||||
|
when:
|
||||||
|
# Push new version when version tag is created
|
||||||
|
event: tag
|
||||||
|
tag: v*
|
||||||
|
|
11
.woodpecker/testDocker.yml
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
pipeline:
|
||||||
|
docker-build:
|
||||||
|
image: plugins/kaniko
|
||||||
|
settings:
|
||||||
|
repo: thatonecalculator/calckey
|
||||||
|
tags: test
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
no_push: true
|
||||||
|
|
||||||
|
branches:
|
||||||
|
include: [ main, develop, beta ]
|
152
CALCKEY.md
Normal file
|
@ -0,0 +1,152 @@
|
||||||
|
# All the changes to Calckey from stock Misskey
|
||||||
|
|
||||||
|
## Planned
|
||||||
|
|
||||||
|
- Stucture
|
||||||
|
- [Sonic](https://crates.io/crates/sonic-server) support as an ElasticSearch alternative
|
||||||
|
- [DragonflyDB](https://dragonflydb.io/) support as a Redis alternative
|
||||||
|
- Optionally use [ScyllaDB](https://www.scylladb.com/open-source-nosql-database/) for storing notes
|
||||||
|
- Rewrite backend in Rust and [Axum](https://github.com/tokio-rs/axum)
|
||||||
|
- Function
|
||||||
|
- Federate with note edits
|
||||||
|
- Admin customizable max note length (100-8000)
|
||||||
|
- User "choices" (recommended users) like Mastodon and Soapbox
|
||||||
|
- Join Reason system like Mastodon/Pleroma
|
||||||
|
- Option to publicize instance blocks
|
||||||
|
- Backfill remote users
|
||||||
|
- Build flag to remove NSFW/AI stuff
|
||||||
|
- Timeline filters
|
||||||
|
- Filter notifications by user
|
||||||
|
- Non-nyaify cat mode
|
||||||
|
- Exclude self from antenna
|
||||||
|
- Form
|
||||||
|
- MFM button
|
||||||
|
- Personal notes for all accounts
|
||||||
|
- Fully revamp non-logged-in screen
|
||||||
|
- Classic mode make instance icon bring up new context menu
|
||||||
|
- [Rat mode?](https://stop.voring.me/notes/933fx97bmd)
|
||||||
|
|
||||||
|
## Work in progress
|
||||||
|
|
||||||
|
- Weblate project
|
||||||
|
- Customizable max note length
|
||||||
|
- Link verification
|
||||||
|
- Better Messaging UI
|
||||||
|
- Better API Documentation
|
||||||
|
- Remote follow button
|
||||||
|
- Admin custom CSS
|
||||||
|
- Add back time machine (jump to date)
|
||||||
|
- Improve accesibility
|
||||||
|
|
||||||
|
## Implemented
|
||||||
|
|
||||||
|
- A lot of general bugfixes
|
||||||
|
- pnpm instead of yarn
|
||||||
|
- Fix Dockerfile @hanna
|
||||||
|
- Upgrade packages with security vunrabilities
|
||||||
|
- Saner defaults
|
||||||
|
- Fediverse account migration
|
||||||
|
- Recommended instances timeline
|
||||||
|
- OCR image captioning
|
||||||
|
- Improve mobile UX
|
||||||
|
- Swipe through pages on mobile
|
||||||
|
- Redesigned mobile bottom nav bar
|
||||||
|
- Post button on TL
|
||||||
|
- Star as default reaction
|
||||||
|
- Like/star button
|
||||||
|
- Rosé Pine by default (+ non-themable elements made Rosé Pine)
|
||||||
|
- Better sidebar/navbar
|
||||||
|
- Better intro tutorial/onboarding
|
||||||
|
- Add back groups
|
||||||
|
- Integrate groups UI into chats UI
|
||||||
|
- MOTD (customizable by admins!)
|
||||||
|
- Custom randomized splash icons
|
||||||
|
- Self hosted, newly designed error images
|
||||||
|
- Illustrated by [Henki](https://www.youtube.com/c/Henkiwashere)!
|
||||||
|
- Licensed under the CC-BY-SA 4.0.
|
||||||
|
- Better timeline top bar
|
||||||
|
- Improved note style
|
||||||
|
- Make more of the post clickable like every other SNS
|
||||||
|
- No more details tag for reply attachments
|
||||||
|
- Better CW button
|
||||||
|
- Mark as read from notifications widget
|
||||||
|
- Less cluttered notification summary
|
||||||
|
- Better welcome screen (not logged in)
|
||||||
|
- vue-plyr as video/audio player
|
||||||
|
- Ability to turn off "Connection lost" message
|
||||||
|
- Raw instance info only for moderators
|
||||||
|
- New spinner animation
|
||||||
|
- Spinner instead of "Loading..."
|
||||||
|
- SearchX instead of Google
|
||||||
|
- Always signToActivityPubGet
|
||||||
|
- Spacing on group items
|
||||||
|
- Quotes have solid border
|
||||||
|
- Reply limit bug fixed
|
||||||
|
- Make showing the update popup optional
|
||||||
|
- Improve PWA manifest
|
||||||
|
- Fix incoming chat scrolling globally
|
||||||
|
- Update notifier
|
||||||
|
- Allow admins to set logo URL via admin settings
|
||||||
|
- Allow importing follows from Pixelfed
|
||||||
|
- Phosphor icons instead of FontAwesome
|
||||||
|
- Fully deprecate MkEmojiPickerWindow in favor of MkEmojiPickerDialog
|
||||||
|
- Link hover effect
|
||||||
|
- Replace all `$ts` with i18n
|
||||||
|
- AVIF support
|
||||||
|
- Page drafts
|
||||||
|
- Patron list
|
||||||
|
- Animations respect reduced motion
|
||||||
|
- Undo renote button inside original note
|
||||||
|
- Custom locales
|
||||||
|
- Obliteration of Ai-chan
|
||||||
|
- Switch to [Calckey.js](https://codeberg.org/calckey/calckey.js)
|
||||||
|
- Woozy mode 🥴
|
||||||
|
- Improve blocking instances
|
||||||
|
- Release notes
|
||||||
|
- New post style
|
||||||
|
- Admins set default reaction emoji
|
||||||
|
- Allows custom emoji
|
||||||
|
- Fix lint errors
|
||||||
|
- Use Rome instead of ESLint
|
||||||
|
- MissV: [fix Misskey Forkbomb](https://code.vtopia.live/Vtopia/MissV/commit/40b23c070bd4adbb3188c73546c6c625138fb3c1)
|
||||||
|
- [Make showing ads optional](https://github.com/misskey-dev/misskey/pull/8996)
|
||||||
|
- [Tapping avatar in mobile opens account modal](https://github.com/misskey-dev/misskey/pull/9056)
|
||||||
|
- [OAuth bearer token authentication](https://github.com/misskey-dev/misskey/pull/9021)
|
||||||
|
- [Styled Repair Tools](https://github.com/misskey-dev/misskey/pull/8956)
|
||||||
|
- [Option to make enter send message](https://github.com/misskey-dev/misskey/pull/8954)
|
||||||
|
- [Autocomplete in messaging](https://github.com/misskey-dev/misskey/pull/8955)
|
||||||
|
- [Profile background as banner](https://codeberg.org/Freeplay/Misskey-Tweaks/src/branch/main/snippets/profile-background.styl)
|
||||||
|
- [Star is generic like/favorite](https://github.com/JakeMBauer/Misskey-Extras/blob/master/patches/star-is-like.patch)
|
||||||
|
- 👍 also triggers generic like/favorite
|
||||||
|
- [Add additional background for acrylic popups if backdrop-filter is unsupported](https://github.com/misskey-dev/misskey/pull/8671)
|
||||||
|
- [Add parameters to MFM rotate](https://github.com/misskey-dev/misskey/pull/8549)
|
||||||
|
- Many changes from [Foundkey](https://akkoma.dev/FoundKeyGang/Foundkey)
|
||||||
|
- 0ece67b04c3f0365057624c1068808276ccab981: refactor pages/auth.form.vue to composition API
|
||||||
|
- 0ece67b04c3f0365057624c1068808276ccab981: refactor pages/auth.form.vue to composition API
|
||||||
|
- 4bc9610d8bf5af736b5e89e4782395705de45d7d: remove unnecessary joins
|
||||||
|
- 9ee609d70082f7a6dc119a5d83c0e7c5e1208676: enhance privacy of notes
|
||||||
|
- 0fec6e10477b1c1b95d9469fbaf4e249a3722f12: remove ms dependency
|
||||||
|
- 46fff77accbe8bf0fd3cc88170d67b997bf2bdc3: client uses new API for child notes depth
|
||||||
|
- c35372a20d22cddb75e93a0b407f2b652cd7faf0: pack children without detail
|
||||||
|
- aca724e0bfff3e58b4d273f3ee744e3f3aa9c39b: enable to fetch replies recursively
|
||||||
|
- 2fe64c11502fd8d89c126558cd715e095c83754e: Refactor components/page/page.textarea.vue to composition API
|
||||||
|
- 6d3181f9835955e5b79bde5484c74bd70e7f9535: Refactor components/page/page.text.vue to composition API
|
||||||
|
- b630cd7eacd695bb705e6748c87f38425ec4ed45: refactor: add NoteReactions.packMany
|
||||||
|
- 3fe351df6d4e21f7748c46adfa6ca165abd030c0: fix: catch errors from packing with detail
|
||||||
|
- 63591da33e233b2ed0ab331ae6bb3c9eff5020ae: refactor: colours in queue chart
|
||||||
|
- 0f6d94f1e7e1f58cfbf8d07e5f835f8de626842e: backend: improve mutes and blocks
|
||||||
|
- e2bf2715a6462ed377b033956d65260157f042ea: fix spelling error
|
||||||
|
- 09a7eabda137e77f81ab31f65d69329670693c8d: backend: fix lint "no-throw-literal"
|
||||||
|
- 4fbe2e065e75ed3e5b4dfdfd4be3baa03cc447c3: client: fix lint "quotes"
|
||||||
|
- 585e4f5c42cfafb6cdf7eb601ab435d6a4d85a96: fix textarea not updating properly
|
||||||
|
- 30d8bc9259cb6b72ed76d67b21dbb4cdceca8327: refactor: welcome.setup.vue to composition api
|
||||||
|
- 751921e24f37ed707fe44a40d88eebb1299efa35: make emoji picker case insensitive
|
||||||
|
- 298febeb9c9501e3e3df16982c08657d1da474e0: enhance: add re-collapsing to quoted notes
|
||||||
|
- b0fdedb264db87575063abed45e52ad71ce4a6af: fix lints in folder.vue
|
||||||
|
- 6fed87f85d132304eb84b0a59b84dce299a1822f: fix pagination.vue lints
|
||||||
|
- Tosti's security fixes
|
||||||
|
- 384e8c49b738f576ba8843296de6cebf01c1b247: server: allow to like own gallery posts
|
||||||
|
- 4c5aa9e53887cca5561fcec6ab0754e018f589a5: server: allow to like own pages
|
||||||
|
- 923c93da1228458dd65be47483c198a1a9191bcf: use await for notes.countBy
|
||||||
|
- ca90cedba0a0704b503c2778694230f5a7dfbace: server: reduce dead instance detection to 7 days
|
||||||
|
- e9ab42c10afb4e27516c2d2b5e3e06630efe9edd: Alt text in image viewer
|
13312
CHANGELOG.md
|
@ -1,3 +1,4 @@
|
||||||
|
|
||||||
# Contributor Covenant Code of Conduct
|
# Contributor Covenant Code of Conduct
|
||||||
|
|
||||||
## Our Pledge
|
## Our Pledge
|
||||||
|
@ -60,7 +61,9 @@ representative at an online or offline event.
|
||||||
|
|
||||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||||
reported to the community leaders responsible for enforcement at
|
reported to the community leaders responsible for enforcement at
|
||||||
<syuilotan@yahoo.co.jp>.
|
@thatonecalculator on Codeberg,
|
||||||
|
`@thatonecalculator@stop.voring.me` or `@t1c@i.calckey.cloud` on the Fediverse,
|
||||||
|
or kainoa@t1c.dev via email.
|
||||||
All complaints will be reviewed and investigated promptly and fairly.
|
All complaints will be reviewed and investigated promptly and fairly.
|
||||||
|
|
||||||
All community leaders are obligated to respect the privacy and security of the
|
All community leaders are obligated to respect the privacy and security of the
|
||||||
|
@ -130,3 +133,4 @@ For answers to common questions about this code of conduct, see the FAQ at
|
||||||
[Mozilla CoC]: https://github.com/mozilla/diversity
|
[Mozilla CoC]: https://github.com/mozilla/diversity
|
||||||
[FAQ]: https://www.contributor-covenant.org/faq
|
[FAQ]: https://www.contributor-covenant.org/faq
|
||||||
[translations]: https://www.contributor-covenant.org/translations
|
[translations]: https://www.contributor-covenant.org/translations
|
||||||
|
|
||||||
|
|
504
CONTRIBUTING.md
|
@ -1,63 +1,55 @@
|
||||||
# Contribution guide
|
# Contribution guide
|
||||||
We're glad you're interested in contributing to Sharkey! In this document you will find the information you need to contribute to the project.
|
We're glad you're interested in contributing Calckey! In this document you will find the information you need to contribute to the project.
|
||||||
|
|
||||||
|
## Localization (l10n)
|
||||||
|
Calckey uses [Weblate](hhttps://hosted.weblate.org/engage/calckey/) for localization management.
|
||||||
|
|
||||||
|
If your language is not listed in Weblate, please open an issue.
|
||||||
|
|
||||||
|
You can contribute without knowing how to code by helping translate here:
|
||||||
|
|
||||||
|
[![Translation status](https://hosted.weblate.org/widgets/calckey/-/287x66-grey.png)](https://hosted.weblate.org/engage/calckey/)
|
||||||
|
|
||||||
|
[![Translation bars](https://hosted.weblate.org/widgets/calckey/-/multi-auto.svg)](https://hosted.weblate.org/engage/calckey/)
|
||||||
|
|
||||||
## Roadmap
|
## Roadmap
|
||||||
See [ROADMAP.md](./ROADMAP.md) for the upstream Misskey roadmap.
|
See [CALCKEY.md](./CALCKEY.md)
|
||||||
|
|
||||||
## Issues
|
## Issues
|
||||||
Before creating an issue, please check the following:
|
Before creating an issue, please check the following:
|
||||||
- To avoid duplication, please search for similar issues before creating a new issue.
|
- To avoid duplication, please search for similar issues before creating a new issue.
|
||||||
- Do not use Issues to ask questions or troubleshooting.
|
- Do not use Issues to ask questions or troubleshooting.
|
||||||
- Issues should only be used to feature requests, suggestions, and bug tracking.
|
- Issues should only be used to feature requests, suggestions, and bug tracking.
|
||||||
- Please ask questions or troubleshooting in [Discord](https://discord.gg/6VgKmEqHNk).
|
- Please ask questions or troubleshooting in the [Matrix room](https://matrix.to/#/#calckey:matrix.fedibird.com).
|
||||||
|
|
||||||
> [!WARNING]
|
> **Warning**
|
||||||
> Do not close issues that are about to be resolved. It should remain open until a commit that actually resolves it is merged.
|
> Do not close issues that are about to be resolved. It should remain open until a commit that actually resolves it is merged.
|
||||||
|
|
||||||
### Recommended discussing before implementation
|
## Before implementation
|
||||||
We welcome your proposal.
|
When you want to add a feature or fix a bug, **first have the design and policy reviewed in an Issue** (if it is not there, please make one). Without this step, there is a high possibility that the PR will not be merged even if it is implemented.
|
||||||
|
|
||||||
When you want to add a feature or fix a bug, *please open an issue*,
|
At this point, you also need to clarify the goals of the PR you will create, and make sure that the other members of the team are aware of them.
|
||||||
don't just start writing code. We may suggest different approaches, or
|
PRs that do not have a clear set of do's and don'ts tend to be bloated and difficult to review.
|
||||||
show that the "bug" is actually intended behaviour (and offer
|
|
||||||
work-arounds), or maybe we won't be able to merge your new feature
|
|
||||||
because it would make it too hard to incorporate future changes from
|
|
||||||
Misskey. Each of these examples have actually happened!
|
|
||||||
|
|
||||||
On the other hand, it's very likely that we'll tell you "go
|
Also, when you start implementation, assign yourself to the Issue (if you cannot do it yourself, ask another member to assign you). By expressing your intention to work the Issue, you can prevent conflicts in the work.
|
||||||
ahead!". We try our best to incorporate improvements from our users!
|
|
||||||
|
|
||||||
Also, when you start implementation, assign yourself to the Issue (if you cannot do it yourself, ask Committer to assign you).
|
|
||||||
By expressing your intention to work on the Issue, you can prevent conflicts in the work.
|
|
||||||
|
|
||||||
To the Committers: you should not assign someone on it before the Final Decision.
|
|
||||||
|
|
||||||
### How issues are triaged
|
|
||||||
|
|
||||||
The Committers may:
|
|
||||||
* close an issue that is not reproducible on latest stable release,
|
|
||||||
* merge an issue into another issue,
|
|
||||||
* split an issue into multiple issues,
|
|
||||||
* or re-open that has been closed for some reason which is not applicable anymore.
|
|
||||||
|
|
||||||
@syuilo reserves the Final Decision rights including whether the project will implement feature and how to implement, these rights are not always exercised.
|
|
||||||
|
|
||||||
## Well-known branches
|
## Well-known branches
|
||||||
- **`stable`** branch is tracking the latest release and used for production purposes.
|
- The **`main`** branch is tracking the latest release and used for production purposes.
|
||||||
- **`develop`** branch is where we work for the next release.
|
- The **`develop`** branch is where we work for the next release.
|
||||||
- When you create a PR, basically target it to this branch.
|
- When you create a PR, basically target it to this branch. **But create a different branch**
|
||||||
|
- The **`l10n_develop`** branch is reserved for localization management.
|
||||||
|
- **`feature/*`** branches are reserved for the development of a specific feature
|
||||||
|
|
||||||
## Creating a PR
|
## Creating a PR
|
||||||
Thank you for your PR! Before creating a PR, please check the following:
|
Thank you for your PR! Before creating a PR, please check the following:
|
||||||
- If possible, prefix the title with a keyword that identifies the type of this PR, as shown below.
|
- If possible, prefix the title with a keyword that identifies the type of this PR, as shown below.
|
||||||
- `fix` / `refactor` / `feat` / `enhance` / `perf` / `chore` etc
|
- `fix` / `refactor` / `feat` / `enhance` / `perf` / `chore` etc. You are also welcome to use gitmoji. This is important as we use these to A) easier read the git history and B) generate our changelog. Without propper prefixing it is possible that your PR is rejected.
|
||||||
- Also, make sure that the granularity of this PR is appropriate. Please do not include more than one type of change or interest in a single PR.
|
- Also, make sure that the granularity of this PR is appropriate. Please do not include more than one type of change or interest in a single PR.
|
||||||
- If there is an Issue which will be resolved by this PR, please include a reference to the Issue in the text.
|
- If there is an Issue which will be resolved by this PR, please include a reference to the Issue in the text. Good examples include `Closing: #21` or `Resolves: #21`
|
||||||
- Please add the summary of the changes to [`CHANGELOG.md`](CHANGELOG.md). However, this is not necessary for changes that do not affect the users, such as refactoring.
|
|
||||||
- Check if there are any documents that need to be created or updated due to this change.
|
- Check if there are any documents that need to be created or updated due to this change.
|
||||||
- If you have added a feature or fixed a bug, please add a test case if possible.
|
- If you have added a feature or fixed a bug, please add a test case if possible.
|
||||||
- Please make sure that tests and Lint are passed in advance.
|
- Please make sure that tests and Lint are passed in advance.
|
||||||
- You can run it with `pnpm test` and `pnpm lint`. [See more info](#testing)
|
- You can run it with `pnpm run test` and `pnpm run lint`. [See more info](#testing)
|
||||||
- If this PR includes UI changes, please attach a screenshot in the text.
|
- If this PR includes UI changes, please attach a screenshot in the text.
|
||||||
|
|
||||||
Thanks for your cooperation 🤗
|
Thanks for your cooperation 🤗
|
||||||
|
@ -67,8 +59,8 @@ Be willing to comment on the good points and not just the things you want fixed
|
||||||
|
|
||||||
### Review perspective
|
### Review perspective
|
||||||
- Scope
|
- Scope
|
||||||
- Are the goals of the PR clear?
|
- Are the goals of the PR clear?
|
||||||
- Is the granularity of the PR appropriate?
|
- Is the granularity of the PR appropriate?
|
||||||
- Security
|
- Security
|
||||||
- Does merging this PR create a vulnerability?
|
- Does merging this PR create a vulnerability?
|
||||||
- Performance
|
- Performance
|
||||||
|
@ -79,142 +71,66 @@ Be willing to comment on the good points and not just the things you want fixed
|
||||||
- Are there any omissions or gaps?
|
- Are there any omissions or gaps?
|
||||||
- Does it check for anomalies?
|
- Does it check for anomalies?
|
||||||
|
|
||||||
|
## Deploy (SOON)
|
||||||
|
The `/deploy` command by issue comment can be used to deploy the contents of a PR to the preview environment.
|
||||||
|
```
|
||||||
|
/deploy sha=<commit hash>
|
||||||
|
```
|
||||||
|
An actual domain will be assigned so you can test the federation.
|
||||||
|
|
||||||
## Merge
|
## Merge
|
||||||
|
|
||||||
## Release
|
## Release
|
||||||
### Release Instructions
|
### Release Instructions
|
||||||
1. Commit version changes in the `develop` branch ([package.json](package.json))
|
1. Commit version changes in the `develop` branch ([package.json](https://github.com/misskey-dev/misskey/blob/develop/package.json))
|
||||||
2. Create a release PR.
|
2. Create a release PR.
|
||||||
- Into `stable` from `develop` branch.
|
- Into `master` from `develop` branch.
|
||||||
- The title must be in the format `Release: x.y.z`.
|
- The title must be in the format `Release: x.y.z`.
|
||||||
- `x.y.z` is the new version you are trying to release.
|
- `x.y.z` is the new version you are trying to release.
|
||||||
3. Deploy and perform a simple QA check. Also verify that the tests passed.
|
3. Deploy and perform a simple QA check. Also verify that the tests passed.
|
||||||
4. Merge it. (Do not squash commit)
|
4. Merge it.
|
||||||
5. Create a [release](https://activitypub.software/TransFem-org/Sharkey/-/releases)
|
5. Create a [release of GitHub](https://github.com/misskey-dev/misskey/releases)
|
||||||
- The target branch must be `stable`
|
- The target branch must be `master`
|
||||||
- The tag name must be the version
|
- The tag name must be the version
|
||||||
|
|
||||||
> [!NOTE]
|
|
||||||
> Why this instruction is necessary:
|
|
||||||
> - To perform final QA checks
|
|
||||||
> - To distribute responsibility
|
|
||||||
> - To check direct commits to develop
|
|
||||||
> - To celebrate the release together 🎉
|
|
||||||
|
|
||||||
## Localization (l10n)
|
|
||||||
Misskey uses [Crowdin](https://crowdin.com/project/misskey) for localization management.
|
|
||||||
You can improve our translations with your Crowdin account.
|
|
||||||
Your changes in Crowdin are automatically submitted as a PR (with the title "New Crowdin translations") to the repository.
|
|
||||||
The owner [@syuilo](https://github.com/syuilo) merges the PR into the develop branch before the next release.
|
|
||||||
|
|
||||||
If your language is not listed in Crowdin, please open an issue.
|
|
||||||
|
|
||||||
![Crowdin](https://d322cqt584bo4o.cloudfront.net/misskey/localized.svg)
|
|
||||||
|
|
||||||
## Icon Font (Shark Font)
|
|
||||||
Sharkey has its own Icon Font called Shark Font which can be found at https://activitypub.software/TransFem-org/shark-font
|
|
||||||
Build Instructions can all be found over there in the `README`.
|
|
||||||
|
|
||||||
If you have an Icon Suggestion or want to add an Icon please open an issue/merge request over at that repo.
|
|
||||||
|
|
||||||
When Updating the Font make sure to copy **all generated files** from the `dest` folder into `packages/backend/assets/fonts/sharkey-icons`
|
|
||||||
For the CSS simply copy the file content and replace the old content in `style.css` and for the WOFF, TTF and SVG simply replace them.
|
|
||||||
|
|
||||||
## Development
|
## Development
|
||||||
### Setup
|
During development, it is useful to use the `yarn dev` command.
|
||||||
Before developing, you have to set up environment. Misskey requires Redis, PostgreSQL, and FFmpeg.
|
This command monitors the server-side and client-side source files and automatically builds them if they are modified.
|
||||||
|
In addition, it will also automatically start the Misskey server process.
|
||||||
|
|
||||||
You would want to install Meilisearch to experiment related features. Technically, meilisearch is not strict requirement, but some features and tests require it.
|
|
||||||
|
|
||||||
There are a few ways to proceed.
|
# THE FOLLOWING IS OUTDATED:
|
||||||
|
|
||||||
#### Use system-wide software
|
|
||||||
You could install them in system-wide (such as from package manager).
|
|
||||||
|
|
||||||
#### Use `docker compose`
|
|
||||||
You could obtain middleware container by typing `docker compose -f $PROJECT_ROOT/compose.local-db.yml up -d`.
|
|
||||||
|
|
||||||
#### Use Devcontainer
|
|
||||||
Devcontainer also has necessary setting. This method can be done by connecting from VSCode.
|
|
||||||
|
|
||||||
Instead of running `pnpm` locally, you can use Dev Container to set up your development environment.
|
|
||||||
To use Dev Container, open the project directory on VSCode with Dev Containers installed.
|
|
||||||
**Note:** If you are using Windows, please clone the repository with WSL. Using Git for Windows will result in broken files due to the difference in how newlines are handled.
|
|
||||||
|
|
||||||
It will run the following command automatically inside the container.
|
|
||||||
``` bash
|
|
||||||
git submodule update --init
|
|
||||||
pnpm install --frozen-lockfile
|
|
||||||
cp .devcontainer/devcontainer.yml .config/default.yml
|
|
||||||
pnpm build
|
|
||||||
pnpm migrate
|
|
||||||
```
|
|
||||||
|
|
||||||
After finishing the migration, you can proceed.
|
|
||||||
|
|
||||||
### Start developing
|
|
||||||
During development, it is useful to use the
|
|
||||||
```
|
|
||||||
pnpm dev
|
|
||||||
```
|
|
||||||
command.
|
|
||||||
|
|
||||||
- Server-side source files and automatically builds them if they are modified. Automatically start the server process(es).
|
|
||||||
- Vite HMR (just the `vite` command) is available. The behavior may be different from production.
|
|
||||||
- Service Worker is watched by esbuild.
|
|
||||||
- The front end can be viewed by accessing `http://localhost:5173`.
|
|
||||||
- The backend listens on the port configured with `port` in .config/default.yml.
|
|
||||||
If you have not changed it from the default, it will be "http://localhost:3000".
|
|
||||||
If "port" in .config/default.yml is set to something other than 3000, you need to change the proxy settings in packages/frontend/vite.config.local-dev.ts.
|
|
||||||
|
|
||||||
### `MK_DEV_PREFER=backend pnpm dev`
|
|
||||||
pnpm dev has another mode with `MK_DEV_PREFER=backend`.
|
|
||||||
|
|
||||||
```
|
|
||||||
MK_DEV_PREFER=backend pnpm dev
|
|
||||||
```
|
|
||||||
|
|
||||||
- This mode is closer to the production environment than the default mode.
|
|
||||||
- Vite runs behind the backend (the backend will proxy Vite at /vite).
|
|
||||||
- You can see Misskey by accessing `http://localhost:3000` (Replace `3000` with the port configured with `port` in .config/default.yml).
|
|
||||||
- To change the port of Vite, specify with `VITE_PORT` environment variable.
|
|
||||||
- HMR may not work in some environments such as Windows.
|
|
||||||
|
|
||||||
## Testing
|
## Testing
|
||||||
- Test codes are located in [`/packages/backend/test`](packages/backend/test).
|
- Test codes are located in [`/test`](/test).
|
||||||
|
|
||||||
### Run test
|
### Run test
|
||||||
Create a config file.
|
Create a config file.
|
||||||
```
|
```
|
||||||
cp .github/misskey/test.yml .config/
|
cp test/test.yml .config/
|
||||||
```
|
```
|
||||||
Prepare DB/Redis for testing.
|
Prepare DB/Redis for testing.
|
||||||
```
|
```
|
||||||
docker compose -f packages/backend/test/compose.yml up
|
docker-compose -f test/docker-compose.yml up
|
||||||
```
|
```
|
||||||
Alternatively, prepare an empty (data can be erased) DB and edit `.config/test.yml`.
|
Alternatively, prepare an empty (data can be erased) DB and edit `.config/test.yml`.
|
||||||
|
|
||||||
Run all test.
|
Run all test.
|
||||||
```
|
```
|
||||||
pnpm test
|
yarn test
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Run specify test
|
#### Run specify test
|
||||||
```
|
```
|
||||||
pnpm jest -- foo.ts
|
TS_NODE_FILES=true TS_NODE_TRANSPILE_ONLY=true TS_NODE_PROJECT="./test/tsconfig.json" yarn dlx mocha test/foo.ts --require ts-node/register
|
||||||
```
|
```
|
||||||
|
|
||||||
### e2e tests
|
### e2e tests
|
||||||
TODO
|
TODO
|
||||||
|
|
||||||
## Environment Variable
|
|
||||||
|
|
||||||
- `MISSKEY_CONFIG_YML`: Specify the file path of config.yml instead of default.yml (e.g. `2nd.yml`).
|
|
||||||
- `MISSKEY_WEBFINGER_USE_HTTP`: If it's set true, WebFinger requests will be http instead of https, useful for testing federation between servers in localhost. NEVER USE IN PRODUCTION.
|
|
||||||
|
|
||||||
## Continuous integration
|
## Continuous integration
|
||||||
Sharkey uses GitLab CI for executing automated tests.
|
Misskey uses GitHub Actions for executing automated tests.
|
||||||
Configuration files are located in [`/.gitlab-ci.yml`](.gitlab-ci.yml).
|
Configuration files are located in [`/.github/workflows`](/.github/workflows).
|
||||||
|
|
||||||
## Vue
|
## Vue
|
||||||
Misskey uses Vue(v3) as its front-end framework.
|
Misskey uses Vue(v3) as its front-end framework.
|
||||||
|
@ -229,7 +145,7 @@ niraxは、Misskeyで使用しているオリジナルのフロントエンド
|
||||||
### ルート定義
|
### ルート定義
|
||||||
ルート定義は、以下の形式のオブジェクトの配列です。
|
ルート定義は、以下の形式のオブジェクトの配列です。
|
||||||
|
|
||||||
```ts
|
``` ts
|
||||||
{
|
{
|
||||||
name?: string;
|
name?: string;
|
||||||
path: string;
|
path: string;
|
||||||
|
@ -242,7 +158,7 @@ niraxは、Misskeyで使用しているオリジナルのフロントエンド
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
> [!WARNING]
|
> **Warning**
|
||||||
> 現状、ルートは定義された順に評価されます。
|
> 現状、ルートは定義された順に評価されます。
|
||||||
> たとえば、`/foo/:id`ルート定義の次に`/foo/bar`ルート定義がされていた場合、後者がマッチすることはありません。
|
> たとえば、`/foo/:id`ルート定義の次に`/foo/bar`ルート定義がされていた場合、後者がマッチすることはありません。
|
||||||
|
|
||||||
|
@ -250,199 +166,10 @@ niraxは、Misskeyで使用しているオリジナルのフロントエンド
|
||||||
vue-routerとの最大の違いは、niraxは複数のルーターが存在することを許可している点です。
|
vue-routerとの最大の違いは、niraxは複数のルーターが存在することを許可している点です。
|
||||||
これにより、アプリ内ウィンドウでブラウザとは個別にルーティングすることなどが可能になります。
|
これにより、アプリ内ウィンドウでブラウザとは個別にルーティングすることなどが可能になります。
|
||||||
|
|
||||||
## Storybook
|
|
||||||
|
|
||||||
Misskey uses [Storybook](https://storybook.js.org/) for UI development.
|
|
||||||
|
|
||||||
### Setup & Run
|
|
||||||
|
|
||||||
#### Setup
|
|
||||||
|
|
||||||
```bash
|
|
||||||
pnpm --filter misskey-js build
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Run
|
|
||||||
|
|
||||||
```bash
|
|
||||||
pnpm --filter frontend storybook-dev
|
|
||||||
```
|
|
||||||
|
|
||||||
### Usage
|
|
||||||
|
|
||||||
When you create a new component (in this example, `MyComponent.vue`), the story file (`MyComponent.stories.ts`) will be automatically generated by the `.storybook/generate.js` script.
|
|
||||||
You can override the default story by creating a impl story file (`MyComponent.stories.impl.ts`).
|
|
||||||
|
|
||||||
```ts
|
|
||||||
/* eslint-disable @typescript-eslint/explicit-function-return-type */
|
|
||||||
import { StoryObj } from '@storybook/vue3';
|
|
||||||
import MyComponent from './MyComponent.vue';
|
|
||||||
export const Default = {
|
|
||||||
render(args) {
|
|
||||||
return {
|
|
||||||
components: {
|
|
||||||
MyComponent,
|
|
||||||
},
|
|
||||||
setup() {
|
|
||||||
return {
|
|
||||||
args,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
props() {
|
|
||||||
return {
|
|
||||||
...this.args,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
},
|
|
||||||
template: '<MyComponent v-bind="props" />',
|
|
||||||
};
|
|
||||||
},
|
|
||||||
args: {
|
|
||||||
foo: 'bar',
|
|
||||||
},
|
|
||||||
parameters: {
|
|
||||||
layout: 'centered',
|
|
||||||
},
|
|
||||||
} satisfies StoryObj<typeof MyComponent>;
|
|
||||||
```
|
|
||||||
|
|
||||||
If you want to opt-out from the automatic generation, create a `MyComponent.stories.impl.ts` file and add the following line to the file.
|
|
||||||
|
|
||||||
```ts
|
|
||||||
import MyComponent from './MyComponent.vue';
|
|
||||||
void MyComponent;
|
|
||||||
```
|
|
||||||
|
|
||||||
You can override the component meta by creating a meta story file (`MyComponent.stories.meta.ts`).
|
|
||||||
|
|
||||||
```ts
|
|
||||||
export const argTypes = {
|
|
||||||
scale: {
|
|
||||||
control: {
|
|
||||||
type: 'range',
|
|
||||||
min: 1,
|
|
||||||
max: 4,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
```
|
|
||||||
|
|
||||||
Also, you can use msw to mock API requests in the storybook. Creating a `MyComponent.stories.msw.ts` file to define the mock handlers.
|
|
||||||
|
|
||||||
```ts
|
|
||||||
import { HttpResponse, http } from 'msw';
|
|
||||||
export const handlers = [
|
|
||||||
http.post('/api/notes/timeline', ({ request }) => {
|
|
||||||
return HttpResponse.json([]);
|
|
||||||
}),
|
|
||||||
];
|
|
||||||
```
|
|
||||||
|
|
||||||
Don't forget to re-run the `.storybook/generate.js` script after adding, editing, or removing the above files.
|
|
||||||
|
|
||||||
## Nest
|
|
||||||
|
|
||||||
### Nest Service Circular dependency / Nestでサービスの循環参照でエラーが起きた場合
|
|
||||||
|
|
||||||
#### forwardRef
|
|
||||||
まずは簡単に`forwardRef`を試してみる
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
export class FooService {
|
|
||||||
constructor(
|
|
||||||
@Inject(forwardRef(() => BarService))
|
|
||||||
private barService: BarService
|
|
||||||
) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
#### OnModuleInit
|
|
||||||
できなければ`OnModuleInit`を使う
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
import { Injectable, OnModuleInit } from '@nestjs/common';
|
|
||||||
import { ModuleRef } from '@nestjs/core';
|
|
||||||
import { BarService } from '@/core/BarService';
|
|
||||||
|
|
||||||
@Injectable()
|
|
||||||
export class FooService implements OnModuleInit {
|
|
||||||
private barService: BarService // constructorから移動してくる
|
|
||||||
|
|
||||||
constructor(
|
|
||||||
private moduleRef: ModuleRef,
|
|
||||||
) {
|
|
||||||
}
|
|
||||||
|
|
||||||
async onModuleInit() {
|
|
||||||
this.barService = this.moduleRef.get(BarService.name);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async niceMethod() {
|
|
||||||
return await this.barService.incredibleMethod({ hoge: 'fuga' });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
##### Service Unit Test
|
|
||||||
テストで`onModuleInit`を呼び出す必要がある
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
// import ...
|
|
||||||
|
|
||||||
describe('test', () => {
|
|
||||||
let app: TestingModule;
|
|
||||||
let fooService: FooService; // for test case
|
|
||||||
let barService: BarService; // for test case
|
|
||||||
|
|
||||||
beforeEach(async () => {
|
|
||||||
app = await Test.createTestingModule({
|
|
||||||
imports: ...,
|
|
||||||
providers: [
|
|
||||||
FooService,
|
|
||||||
{ // mockする (mockは必須ではないかもしれない)
|
|
||||||
provide: BarService,
|
|
||||||
useFactory: () => ({
|
|
||||||
incredibleMethod: jest.fn(),
|
|
||||||
}),
|
|
||||||
},
|
|
||||||
{ // Provideにする
|
|
||||||
provide: BarService.name,
|
|
||||||
useExisting: BarService,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
})
|
|
||||||
.useMocker(...
|
|
||||||
.compile();
|
|
||||||
|
|
||||||
fooService = app.get<FooService>(FooService);
|
|
||||||
barService = app.get<BarService>(BarService) as jest.Mocked<BarService>;
|
|
||||||
|
|
||||||
// onModuleInitを実行する
|
|
||||||
await fooService.onModuleInit();
|
|
||||||
});
|
|
||||||
|
|
||||||
test('nice', () => {
|
|
||||||
await fooService.niceMethod();
|
|
||||||
|
|
||||||
expect(barService.incredibleMethod).toHaveBeenCalled();
|
|
||||||
expect(barService.incredibleMethod.mock.lastCall![0])
|
|
||||||
.toEqual({ hoge: 'fuga' });
|
|
||||||
});
|
|
||||||
})
|
|
||||||
```
|
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
|
### How to resolve conflictions occurred at yarn.lock?
|
||||||
|
|
||||||
### Misskeyのドメイン固有の概念は`Mi`をprefixする
|
Just execute `yarn` to fix it.
|
||||||
例えばGoogleが自社サービスをMap、Earth、DriveではなくGoogle Map、Google Earth、Google Driveのように命名するのと同じ
|
|
||||||
コード上でMisskeyのドメイン固有の概念には`Mi`をprefixすることで、他のドメインの同様の概念と区別できるほか、名前の衝突を防ぐ。
|
|
||||||
ただし、文脈上Misskeyのものを指すことが明らかであり、名前の衝突の恐れがない場合は、一時的なローカル変数に限って`Mi`を省略してもよい。
|
|
||||||
|
|
||||||
### How to resolve conflictions occurred at pnpm-lock.yaml?
|
|
||||||
|
|
||||||
Just execute `pnpm` to fix it.
|
|
||||||
|
|
||||||
### INSERTするときにはsaveではなくinsertを使用する
|
### INSERTするときにはsaveではなくinsertを使用する
|
||||||
#6441
|
#6441
|
||||||
|
@ -521,42 +248,19 @@ SQLでは配列のインデックスは**1始まり**。
|
||||||
### null IN
|
### null IN
|
||||||
nullが含まれる可能性のあるカラムにINするときは、そのままだとおかしくなるのでORなどでnullのハンドリングをしよう。
|
nullが含まれる可能性のあるカラムにINするときは、そのままだとおかしくなるのでORなどでnullのハンドリングをしよう。
|
||||||
|
|
||||||
### enumの削除は気をつける
|
### `undefined`にご用心
|
||||||
enumの列挙の内容の削除は、その値をもつレコードを全て削除しないといけない
|
MongoDBの時とは違い、findOneでレコードを取得する時に対象レコードが存在しない場合 **`undefined`** が返ってくるので注意。
|
||||||
|
MongoDBは`null`で返してきてたので、その感覚で`if (x === null)`とか書くとバグる。代わりに`if (x == null)`と書いてください
|
||||||
削除が重たかったり不可能だったりする場合は、削除しないでおく
|
|
||||||
|
|
||||||
### Migration作成方法
|
### Migration作成方法
|
||||||
packages/backendで:
|
packages/backendで:
|
||||||
```sh
|
```sh
|
||||||
pnpm run build
|
pnpm dlx typeorm migration:generate -d ormconfig.js -o <migration name>
|
||||||
pnpm dlx typeorm migration:generate -d ormconfig.js -o migration/<migration name>
|
|
||||||
```
|
```
|
||||||
|
|
||||||
- 生成後、ファイルをmigration下に移してください
|
- 生成後、ファイルをmigration下に移してください
|
||||||
- 作成されたスクリプトは不必要な変更を含むため除去してください
|
- 作成されたスクリプトは不必要な変更を含むため除去してください
|
||||||
|
|
||||||
### JSON SchemaのobjectでanyOfを使うとき
|
|
||||||
JSON Schemaで、objectに対してanyOfを使う場合、anyOfの中でpropertiesを定義しないこと。
|
|
||||||
バリデーションが効かないため。(SchemaTypeもそのように作られており、objectのanyOf内のpropertiesは捨てられます)
|
|
||||||
https://github.com/misskey-dev/misskey/pull/10082
|
|
||||||
|
|
||||||
テキストhogeおよびfugaについて、片方を必須としつつ両方の指定もありうる場合:
|
|
||||||
|
|
||||||
```ts
|
|
||||||
export const paramDef = {
|
|
||||||
type: 'object',
|
|
||||||
properties: {
|
|
||||||
hoge: { type: 'string', minLength: 1 },
|
|
||||||
fuga: { type: 'string', minLength: 1 },
|
|
||||||
},
|
|
||||||
anyOf: [
|
|
||||||
{ required: ['hoge'] },
|
|
||||||
{ required: ['fuga'] },
|
|
||||||
],
|
|
||||||
} as const;
|
|
||||||
```
|
|
||||||
|
|
||||||
### コネクションには`markRaw`せよ
|
### コネクションには`markRaw`せよ
|
||||||
**Vueのコンポーネントのdataオプションとして**misskey.jsのコネクションを設定するとき、必ず`markRaw`でラップしてください。インスタンスが不必要にリアクティブ化されることで、misskey.js内の処理で不具合が発生するとともに、パフォーマンス上の問題にも繋がる。なお、Composition APIを使う場合はこの限りではない(リアクティブ化はマニュアルなため)。
|
**Vueのコンポーネントのdataオプションとして**misskey.jsのコネクションを設定するとき、必ず`markRaw`でラップしてください。インスタンスが不必要にリアクティブ化されることで、misskey.js内の処理で不具合が発生するとともに、パフォーマンス上の問題にも繋がる。なお、Composition APIを使う場合はこの限りではない(リアクティブ化はマニュアルなため)。
|
||||||
|
|
||||||
|
@ -570,87 +274,3 @@ marginはそのコンポーネントを使う側が設定する
|
||||||
## その他
|
## その他
|
||||||
### HTMLのクラス名で follow という単語は使わない
|
### HTMLのクラス名で follow という単語は使わない
|
||||||
広告ブロッカーで誤ってブロックされる
|
広告ブロッカーで誤ってブロックされる
|
||||||
|
|
||||||
### indexというファイル名を使うな
|
|
||||||
ESMではディレクトリインポートは廃止されているのと、ディレクトリインポートせずともファイル名が index だと何故か一部のライブラリ?でディレクトリインポートだと見做されてエラーになる
|
|
||||||
|
|
||||||
## CSS Recipe
|
|
||||||
|
|
||||||
### Lighten CSS vars
|
|
||||||
|
|
||||||
``` css
|
|
||||||
color: hsl(from var(--accent) h s calc(l + 10));
|
|
||||||
```
|
|
||||||
|
|
||||||
### Darken CSS vars
|
|
||||||
|
|
||||||
``` css
|
|
||||||
color: hsl(from var(--accent) h s calc(l - 10));
|
|
||||||
```
|
|
||||||
|
|
||||||
### Add alpha to CSS vars
|
|
||||||
|
|
||||||
``` css
|
|
||||||
color: color(from var(--accent) srgb r g b / 0.5);
|
|
||||||
```
|
|
||||||
|
|
||||||
## Merging from Misskey into Sharkey
|
|
||||||
|
|
||||||
Make sure you have both remotes in the same clone (`git remote add misskey
|
|
||||||
https://github.com/misskey-dev/misskey.git`), then:
|
|
||||||
|
|
||||||
git remote update
|
|
||||||
git checkout develop # this is Sharkey's develop
|
|
||||||
git checkout -m merge/$(date +%Y-%m-%d) # or whatever
|
|
||||||
git merge --no-ff misskey/develop
|
|
||||||
|
|
||||||
fix conflicts and *commit*! (conflicts in `pnpm-lock.yaml` can usually
|
|
||||||
be fixed by running `pnpm install`, it detects conflict markers and
|
|
||||||
seems to do a decent job)
|
|
||||||
|
|
||||||
*after that commit*, do all the extra work, on the same branch:
|
|
||||||
|
|
||||||
* copy all changes (commit after each step):
|
|
||||||
* in
|
|
||||||
`packages/backend/src/core/activitypub/models/ApNoteService.ts`,
|
|
||||||
from `createNote` to `updateNote`
|
|
||||||
* from `packages/backend/src/core/NoteCreateService.ts` to
|
|
||||||
`packages/backend/src/core/NoteEditService.vue`
|
|
||||||
* from `packages/backend/src/server/api/endpoints/notes/create.ts`
|
|
||||||
to `packages/backend/src/server/api/endpoints/notes/edit.ts`
|
|
||||||
* from `packages/frontend/src/components/MkNote*.vue` to
|
|
||||||
`packages/frontend/src/components/SkNote*.vue` (if sensible)
|
|
||||||
* from the global timeline to the bubble timeline
|
|
||||||
(`packages/backend/src/server/api/stream/channels/global-timeline.ts`,
|
|
||||||
`packages/backend/src/server/api/stream/channels/bubble-timeline.ts`,
|
|
||||||
`packages/frontend/src/timelines.ts`,
|
|
||||||
`packages/frontend/src/components/MkTimeline.vue`,
|
|
||||||
`packages/frontend/src/pages/timeline.vue`,
|
|
||||||
`packages/frontend/src/ui/deck/tl-column.vue`,
|
|
||||||
`packages/frontend/src/widgets/WidgetTimeline.vue`)
|
|
||||||
* check the changes against our `develop` (`git diff develop`) and
|
|
||||||
against Misskey (`git diff misskey/develop`)
|
|
||||||
* re-generate `misskey-js` (`pnpm build-misskey-js-with-types`) and commit
|
|
||||||
* build the frontend: `rm -rf built/; NODE_ENV=development pnpm
|
|
||||||
--filter=frontend --filter=frontend-embed build` (the `development`
|
|
||||||
tells it to keep some of the original filenames in the built files)
|
|
||||||
* make sure there aren't any new `ti-*` classes (Tabler Icons), and
|
|
||||||
replace them with appropriate `ph-*` ones (Phosphor Icons):
|
|
||||||
`grep -rP '["'\'']ti[ -](?!fw)' -- built/` should show you what to change.
|
|
||||||
NOTE: `ti-fw` is a special class that's defined by Misskey, leave it
|
|
||||||
alone
|
|
||||||
|
|
||||||
after every change, re-build the frontend and check again, until
|
|
||||||
there are no more `ti-*` classes in the built files
|
|
||||||
|
|
||||||
commit!
|
|
||||||
* double-check the new migration, that they won't conflict with our db
|
|
||||||
changes: `git diff develop -- packages/backend/migration/`
|
|
||||||
* `pnpm clean; pnpm build`
|
|
||||||
* run tests `pnpm --filter='!megalodon' test` (requires a test
|
|
||||||
database, [see above](#testing)) and fix as much as you can
|
|
||||||
* right now `megalodon` doesn't pass its tests, so we skip them
|
|
||||||
* run lint `pnpm --filter=backend lint` + `pnpm --filter=frontend
|
|
||||||
eslint` and fix as much as you can
|
|
||||||
|
|
||||||
Then push and open a Merge Request.
|
|
||||||
|
|
5
COPYING
|
@ -1,10 +1,11 @@
|
||||||
Unless otherwise stated this repository is
|
Unless otherwise stated this repository is
|
||||||
Copyright © 2014-2024 syuilo and contributors
|
Copyright © 2014-2022 syuilo and contributers
|
||||||
|
Copyright © 2022 thatonecalculator and contributers
|
||||||
|
|
||||||
And is distributed under The GNU Affero General Public License Version 3, you should have received a copy of the license file as LICENSE.
|
And is distributed under The GNU Affero General Public License Version 3, you should have received a copy of the license file as LICENSE.
|
||||||
|
|
||||||
|
|
||||||
Misskey includes several third-party Open-Source softwares.
|
Calckey includes several third-party Open-Source softwares.
|
||||||
|
|
||||||
Emoji keywords for Unicode 11 and below by Mu-An Chiou
|
Emoji keywords for Unicode 11 and below by Mu-An Chiou
|
||||||
License: MIT
|
License: MIT
|
||||||
|
|
123
Dockerfile
|
@ -1,84 +1,51 @@
|
||||||
# syntax = docker/dockerfile:1.4
|
## Install dev and compilation dependencies, build files
|
||||||
|
FROM node:19-alpine as build
|
||||||
|
WORKDIR /calckey
|
||||||
|
|
||||||
ARG NODE_VERSION=20.16.0-alpine3.20
|
# Install compilation dependencies
|
||||||
|
RUN apk add --no-cache --no-progress git alpine-sdk python3
|
||||||
|
|
||||||
FROM node:${NODE_VERSION} as build
|
# Copy only the dependency-related files first, to cache efficiently
|
||||||
|
COPY package.json pnpm*.yaml ./
|
||||||
|
COPY packages/backend/package.json packages/backend/package.json
|
||||||
|
COPY packages/client/package.json packages/client/package.json
|
||||||
|
COPY packages/sw/package.json packages/sw/package.json
|
||||||
|
|
||||||
RUN apk add git linux-headers build-base
|
# Configure corepack and pnpm
|
||||||
|
RUN corepack enable
|
||||||
|
RUN corepack prepare pnpm@latest --activate
|
||||||
|
|
||||||
ENV PYTHONUNBUFFERED=1
|
# Install dev mode dependencies for compilation
|
||||||
RUN apk add --update python3 && ln -sf python3 /usr/bin/python
|
RUN pnpm i --frozen-lockfile
|
||||||
RUN apk add py3-pip py3-setuptools
|
|
||||||
|
# Copy in the rest of the files, to compile from TS to JS
|
||||||
|
COPY . ./
|
||||||
|
RUN pnpm run build
|
||||||
|
|
||||||
|
# Trim down the dependencies to only the prod deps
|
||||||
|
RUN pnpm i --prod --frozen-lockfile
|
||||||
|
|
||||||
|
|
||||||
|
## Runtime container
|
||||||
|
FROM node:19-alpine
|
||||||
|
WORKDIR /calckey
|
||||||
|
|
||||||
|
# Install runtime dependencies
|
||||||
|
RUN apk add --no-cache --no-progress tini ffmpeg
|
||||||
|
|
||||||
|
COPY . ./
|
||||||
|
|
||||||
|
# Copy node modules
|
||||||
|
COPY --from=build /calckey/node_modules /calckey/node_modules
|
||||||
|
COPY --from=build /calckey/packages/backend/node_modules /calckey/packages/backend/node_modules
|
||||||
|
COPY --from=build /calckey/packages/sw/node_modules /calckey/packages/sw/node_modules
|
||||||
|
COPY --from=build /calckey/packages/client/node_modules /calckey/packages/client/node_modules
|
||||||
|
|
||||||
|
# Copy the finished compiled files
|
||||||
|
COPY --from=build /calckey/built /calckey/built
|
||||||
|
COPY --from=build /calckey/packages/backend/built /calckey/packages/backend/built
|
||||||
|
COPY --from=build /calckey/packages/backend/assets/instance.css /calckey/packages/backend/assets/instance.css
|
||||||
|
|
||||||
RUN corepack enable
|
RUN corepack enable
|
||||||
|
ENTRYPOINT [ "/sbin/tini", "--" ]
|
||||||
WORKDIR /sharkey
|
CMD [ "pnpm", "run", "migrateandstart" ]
|
||||||
|
|
||||||
COPY --link . ./
|
|
||||||
|
|
||||||
RUN git submodule update --init --recursive
|
|
||||||
RUN pnpm config set fetch-retries 5
|
|
||||||
RUN --mount=type=cache,target=/root/.local/share/pnpm/store,sharing=locked \
|
|
||||||
pnpm i --frozen-lockfile --aggregate-output
|
|
||||||
RUN pnpm build
|
|
||||||
RUN node scripts/trim-deps.mjs
|
|
||||||
RUN mv packages/frontend/assets sharkey-assets
|
|
||||||
RUN mv packages/frontend-embed/assets sharkey-embed-assets
|
|
||||||
RUN --mount=type=cache,target=/root/.local/share/pnpm/store,sharing=locked \
|
|
||||||
pnpm prune
|
|
||||||
RUN rm -r node_modules packages/frontend packages/frontend-shared packages/frontend-embed packages/sw
|
|
||||||
RUN --mount=type=cache,target=/root/.local/share/pnpm/store,sharing=locked \
|
|
||||||
pnpm i --prod --frozen-lockfile --aggregate-output
|
|
||||||
RUN rm -rf .git
|
|
||||||
|
|
||||||
FROM node:${NODE_VERSION}
|
|
||||||
|
|
||||||
ARG UID="991"
|
|
||||||
ARG GID="991"
|
|
||||||
|
|
||||||
RUN apk add ffmpeg tini jemalloc \
|
|
||||||
&& corepack enable \
|
|
||||||
&& addgroup -g "${GID}" sharkey \
|
|
||||||
&& adduser -D -u "${UID}" -G sharkey -h /sharkey sharkey \
|
|
||||||
&& find / -type d -path /sys -prune -o -type d -path /proc -prune -o -type f -perm /u+s -exec chmod u-s {} \; \
|
|
||||||
&& find / -type d -path /sys -prune -o -type d -path /proc -prune -o -type f -perm /g+s -exec chmod g-s {} \;
|
|
||||||
|
|
||||||
USER sharkey
|
|
||||||
WORKDIR /sharkey
|
|
||||||
|
|
||||||
# add package.json to add pnpm
|
|
||||||
COPY --chown=sharkey:sharkey ./package.json ./package.json
|
|
||||||
RUN corepack install
|
|
||||||
|
|
||||||
COPY --chown=sharkey:sharkey --from=build /sharkey/node_modules ./node_modules
|
|
||||||
COPY --chown=sharkey:sharkey --from=build /sharkey/packages/backend/node_modules ./packages/backend/node_modules
|
|
||||||
COPY --chown=sharkey:sharkey --from=build /sharkey/packages/misskey-js/node_modules ./packages/misskey-js/node_modules
|
|
||||||
COPY --chown=sharkey:sharkey --from=build /sharkey/packages/misskey-reversi/node_modules ./packages/misskey-reversi/node_modules
|
|
||||||
COPY --chown=sharkey:sharkey --from=build /sharkey/packages/misskey-bubble-game/node_modules ./packages/misskey-bubble-game/node_modules
|
|
||||||
COPY --chown=sharkey:sharkey --from=build /sharkey/packages/megalodon/node_modules ./packages/megalodon/node_modules
|
|
||||||
COPY --chown=sharkey:sharkey --from=build /sharkey/built ./built
|
|
||||||
COPY --chown=sharkey:sharkey --from=build /sharkey/packages/misskey-js/built ./packages/misskey-js/built
|
|
||||||
COPY --chown=sharkey:sharkey --from=build /sharkey/packages/misskey-reversi/built ./packages/misskey-reversi/built
|
|
||||||
COPY --chown=sharkey:sharkey --from=build /sharkey/packages/misskey-bubble-game/built ./packages/misskey-bubble-game/built
|
|
||||||
COPY --chown=sharkey:sharkey --from=build /sharkey/packages/backend/built ./packages/backend/built
|
|
||||||
COPY --chown=sharkey:sharkey --from=build /sharkey/packages/megalodon/lib ./packages/megalodon/lib
|
|
||||||
COPY --chown=sharkey:sharkey --from=build /sharkey/fluent-emojis ./fluent-emojis
|
|
||||||
COPY --chown=sharkey:sharkey --from=build /sharkey/tossface-emojis/dist ./tossface-emojis/dist
|
|
||||||
COPY --chown=sharkey:sharkey --from=build /sharkey/sharkey-assets ./packages/frontend/assets
|
|
||||||
COPY --chown=sharkey:sharkey --from=build /sharkey/sharkey-embed-assets ./packages/frontend-embed/assets
|
|
||||||
|
|
||||||
COPY --chown=sharkey:sharkey pnpm-workspace.yaml ./pnpm-workspace.yaml
|
|
||||||
COPY --chown=sharkey:sharkey packages/backend/package.json ./packages/backend/package.json
|
|
||||||
COPY --chown=sharkey:sharkey packages/backend/scripts/check_connect.js ./packages/backend/scripts/check_connect.js
|
|
||||||
COPY --chown=sharkey:sharkey packages/backend/ormconfig.js ./packages/backend/ormconfig.js
|
|
||||||
COPY --chown=sharkey:sharkey packages/backend/migration ./packages/backend/migration
|
|
||||||
COPY --chown=sharkey:sharkey packages/backend/assets ./packages/backend/assets
|
|
||||||
COPY --chown=sharkey:sharkey packages/megalodon/package.json ./packages/megalodon/package.json
|
|
||||||
COPY --chown=sharkey:sharkey packages/misskey-js/package.json ./packages/misskey-js/package.json
|
|
||||||
COPY --chown=sharkey:sharkey packages/misskey-reversi/package.json ./packages/misskey-reversi/package.json
|
|
||||||
COPY --chown=sharkey:sharkey packages/misskey-bubble-game/package.json ./packages/misskey-bubble-game/package.json
|
|
||||||
|
|
||||||
ENV LD_PRELOAD=/usr/lib/libjemalloc.so.2
|
|
||||||
ENV NODE_ENV=production
|
|
||||||
ENTRYPOINT ["/sbin/tini", "--"]
|
|
||||||
CMD ["pnpm", "run", "migrateandstart"]
|
|
||||||
|
|
|
@ -1,16 +0,0 @@
|
||||||
# Basic Precautions
|
|
||||||
|
|
||||||
When using a service with Sharkey, there are several important points to keep in mind.
|
|
||||||
|
|
||||||
1. Because it is decentralized, there is no guarantee that data you upload will be deleted from all other servers even if you delete it once. (However, this applies to the internet in general.)
|
|
||||||
|
|
||||||
2. Even for posts made in private, there is no guarantee that the recipient's server will treat them as private in the same way. Please exercise caution when posting personal or confidential information. (Again, this applies to the internet in general.)
|
|
||||||
|
|
||||||
3. The "Drive" feature is NOT secure cloud storage. This feature exists for easier managing of your uploaded files.
|
|
||||||
Any data uploaded, whether shared via post or not, will be publicly accessible. Please use 3rd party cloud storage providers if you need to upload data with sensitive information of any kind.
|
|
||||||
|
|
||||||
4. Account deletion can be a resource-intensive process and may take a long time. In cases with a lot of uploaded data, it may even be impossible to delete an account.
|
|
||||||
|
|
||||||
5. Please disable ad blockers. Some servers may rely on advertising revenue to cover operating costs. Additionally, ad blockers can mistakenly block content and features unrelated to ads, potentially causing issues with the client's functionality and preventing normal use of Sharkey. Therefore, we recommend turning off ad blockers and similar features when using Sharkey.
|
|
||||||
|
|
||||||
Please understand these points and enjoy using the service.
|
|
201
README.md
|
@ -1,53 +1,180 @@
|
||||||
<div align="center">
|
<div align="center">
|
||||||
<a href="https://joinsharkey.org/">
|
<a href="https://i.calckey.cloud/">
|
||||||
<img src="https://activitypub.software/TransFem-org/Sharkey/-/raw/develop/packages/frontend/assets/sharkey.svg" alt="Sharkey logo" style="border-radius:50%" width="300"/>
|
<img src="./title_float.svg" alt="Calckey logo" style="border-radius:50%" width="400"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
**🌎 **[Sharkey](https://joinsharkey.org/)** is an open source, decentralized social media platform that's free forever! 🚀**
|
**🌎 **[Calckey](https://i.calckey.cloud/)** is an open source, decentralized social media platform that's free forever! 🚀**
|
||||||
|
|
||||||
---
|
[![no github badge](https://nogithub.codeberg.page/badge.svg)](https://nogithub.codeberg.page/)
|
||||||
|
[![status badge](https://ci.codeberg.org/api/badges/calckey/calckey/status.svg)](https://ci.codeberg.org/calckey/calckey)
|
||||||
<a href="https://docs.joinsharkey.org/docs/install/fresh/">
|
[![liberapay badge](https://img.shields.io/liberapay/receives/ThatOneCalculator?logo=liberapay)](https://liberapay.com/ThatOneCalculator)
|
||||||
<img src="https://custom-icon-badges.herokuapp.com/badge/create_an-instance-FBD53C?logoColor=FBD53C&style=for-the-badge&logo=server&labelColor=363B40" alt="create an instance"/></a>
|
[![translate-badge](https://hosted.weblate.org/widgets/calckey/-/svg-badge.svg)](https://hosted.weblate.org/engage/calckey/)
|
||||||
|
[![docker badge](https://img.shields.io/docker/pulls/thatonecalculator/calckey?logo=docker)](https://hub.docker.com/r/thatonecalculator/calckey)
|
||||||
<a href="./CONTRIBUTING.md">
|
[![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](./CODE_OF_CONDUCT.md)
|
||||||
<img src="https://custom-icon-badges.herokuapp.com/badge/become_a-contributor-A371F7?logoColor=A371F7&style=for-the-badge&logo=git-merge&labelColor=363B40" alt="become a contributor"/></a>
|
[![Codeberg badge](https://custom-icon-badges.demolab.com/badge/hosted%20on-codeberg-4793CC.svg?logo=codeberg&logoColor=white)](https://codeberg.org/calckey/calckey/)
|
||||||
|
|
||||||
<a href="https://discord.gg/6VgKmEqHNk">
|
|
||||||
<img src="https://custom-icon-badges.herokuapp.com/badge/join_the-community-5865F2?logoColor=5865F2&style=for-the-badge&logo=discord&labelColor=363B40" alt="join the community"/></a>
|
|
||||||
|
|
||||||
<a href="https://opencollective.com/sharkey">
|
|
||||||
<img src="https://custom-icon-badges.herokuapp.com/badge/donate-81ACF4?logoColor=81ACF4&style=for-the-badge&logo=opencollective&labelColor=363B40" alt="donate"/></a>
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
|
|
||||||
<a href="https://joinsharkey.org/"><img src="https://cdn.shonk.social/files/b671c81c-58cf-4f13-bc96-af0b0c96c667.webp" align="right" height="520px"/></a>
|
<img src="https://pool.jortage.com/voringme/misskey/e7cd2a17-8b23-4e1e-b5cf-709480c623e2.png" align="right" height="320px" alt="Calc (the Calckey mascot) smoking a fat dart"/>
|
||||||
|
|
||||||
## ✨ Features
|
# ✨ About Calckey
|
||||||
- **ActivityPub support**\
|
|
||||||
Not on Sharkey? No problem! Not only can Sharkey instances talk to each other, but you can make friends with people on other networks like Mastodon and Pixelfed!
|
- Calckey is based off of Misskey, a powerful microblogging server on ActivityPub with features such as emoji reactions, a customizable web UI, rich chatting, and much more!
|
||||||
- **Federated Backgrounds and Music status**\
|
- Calckey adds many quality of life changes and bug fixes for users and instance admins alike.
|
||||||
You can add a background to your profile as well as a music status via ListenBrainz, show everyone what music you are currently listening to
|
- Read **[this document](./CALCKEY.md)** all for current and future differences.
|
||||||
- **Mastodon API**\
|
- Notable differences:
|
||||||
Sharkey implements the Mastodon API unlike normal Misskey
|
- Improved UI/UX (especially on mobile)
|
||||||
- **UI/UX Improvements**\
|
- Improved notifications
|
||||||
Sharkey makes some UI/UX improvements to make it easier to navigate
|
- Fediverse account migration
|
||||||
- **Sign-Up Approval**\
|
- Improved instance security
|
||||||
With Sharkey, you can enable sign-ups, subject to manual moderator approval and mandatory user-provided reasons for joining.
|
- Improved accessibility
|
||||||
- **Rich Web UI**\
|
- Recommended Instances timeline
|
||||||
Sharkey has a rich and easy to use Web UI!
|
- OCR image captioning
|
||||||
It is highly customizable, from changing the layout and adding widgets to making custom themes.
|
- New and improved Groups
|
||||||
Furthermore, plugins can be created using AiScript, an original programming language.
|
- Better intro tutorial
|
||||||
- And much more...
|
- Many more user and admin settings
|
||||||
|
- [So much more!](./CALCKEY.md)
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div style="clear: both;"></div>
|
<div style="clear: both;"></div>
|
||||||
|
|
||||||
## Documentation
|
# 🥂 Links
|
||||||
|
|
||||||
Sharkey Documentation can be found at [Sharkey Documentation](https://docs.joinsharkey.org/docs/install/fresh/)
|
- 💸 Liberapay: <https://liberapay.com/ThatOneCalculator>
|
||||||
|
- Donate publicly to get your name on the Patron list!
|
||||||
|
- 🚢 Flagship instance: <https://calckey.social>
|
||||||
|
- 📣 Official account: <https://i.calckey.cloud/@calckey>
|
||||||
|
- 💁 Matrix support room: <https://matrix.to/#/#calckey:matrix.fedibird.com>
|
||||||
|
- 📜 Instance list: <https://calckey.fediverse.observer/list>
|
||||||
|
- 📖 JoinFediverse Wiki: <https://joinfediverse.wiki/What_is_Calckey%3F>
|
||||||
|
- 🐋 Docker Hub: <https://hub.docker.com/r/thatonecalculator/calckey>
|
||||||
|
- ✍️ Weblate: <https://hosted.weblate.org/engage/calckey/>
|
||||||
|
- 📦 Yunohost: <https://github.com/YunoHost-Apps/calckey_ynh>
|
||||||
|
|
||||||
|
# 🌠 Getting started
|
||||||
|
|
||||||
|
This guide will work for both **starting from scratch** and **migrating from Misskey**.
|
||||||
|
|
||||||
|
## 🔰 Easy installers
|
||||||
|
|
||||||
|
If you have access to a server that supports one of the sources below, I recommend you use it! Note that these methods *won't* allow you to migrate from Misskey without manual intervention.
|
||||||
|
|
||||||
|
[![Install on Ubuntu](https://pool.jortage.com/voringme/misskey/3b62a443-1b44-45cf-8f9e-f1c588f803ed.png)](https://codeberg.org/calckey/ubuntu-bash-install) [![Install on the Arch User Repository](https://pool.jortage.com/voringme/misskey/ba2a5c07-f078-43f1-8483-2e01acca9c40.png)](https://aur.archlinux.org/packages/calckey) [![Install Calckey with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=calckey)
|
||||||
|
|
||||||
|
### 🐋 Docker
|
||||||
|
|
||||||
|
[How to run Calckey with Docker](./docker-README.md).
|
||||||
|
|
||||||
|
## 🧑💻 Dependencies
|
||||||
|
|
||||||
|
- 🐢 At least [NodeJS](https://nodejs.org/en/) v18.12.1 (v19 recommended)
|
||||||
|
- Install with [nvm](https://github.com/nvm-sh/nvm)
|
||||||
|
- 🐘 At least [PostgreSQL](https://www.postgresql.org/) v12
|
||||||
|
- 🍱 At least [Redis](https://redis.io/) v6 (v7 recommend)
|
||||||
|
|
||||||
|
### 😗 Optional dependencies
|
||||||
|
|
||||||
|
- [FFmpeg](https://ffmpeg.org/) for video transcoding
|
||||||
|
- [ElasticSearch](https://www.elastic.co/elasticsearch/) for full-text search
|
||||||
|
- OpenSearch/Sonic are not supported as of right now
|
||||||
|
- Management (choose one of the following)
|
||||||
|
- 🛰️ [pm2](https://pm2.io/)
|
||||||
|
- 🐳 [Docker](https://docker.com)
|
||||||
|
- Service manager (systemd, openrc, etc)
|
||||||
|
|
||||||
|
### 🏗️ Build dependencies
|
||||||
|
|
||||||
|
- 🦬 C/C++ compiler & build tools
|
||||||
|
- `build-essential` on Debian/Ubuntu Linux
|
||||||
|
- `base-devel` on Arch Linux
|
||||||
|
- 🐍 [Python 3](https://www.python.org/)
|
||||||
|
|
||||||
|
## 👀 Get folder ready
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git clone --depth 1 https://codeberg.org/calckey/calckey.git
|
||||||
|
cd calckey/
|
||||||
|
```
|
||||||
|
|
||||||
|
By default, you're on the development branch. Run `git checkout beta` or `git checkout main` to switch to the Beta/Main branches.
|
||||||
|
|
||||||
|
## 📩 Install dependencies
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# nvm install 19 && nvm use 19
|
||||||
|
corepack enable
|
||||||
|
corepack prepare pnpm@latest --activate
|
||||||
|
# To build without TensorFlow, append --no-optional
|
||||||
|
pnpm i # --no-optional
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🐘 Create database
|
||||||
|
|
||||||
|
Assuming you set up PostgreSQL correctly, all you have to run is:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
psql postgres -c "create database calckey with encoding = 'UTF8';"
|
||||||
|
```
|
||||||
|
|
||||||
|
## 💅 Customize
|
||||||
|
|
||||||
|
- To add custom CSS for all users, edit `./custom/assets/instance.css`.
|
||||||
|
- To add static assets (such as images for the splash screen), place them in the `./custom/assets/` directory. They'll then be available on `https://yourinstance.tld/static-assets/filename.ext`.
|
||||||
|
- To add custom locales, place them in the `./custom/locales/` directory. If you name your custom locale the same as an existing locale, it will overwrite it. If you give it a unique name, it will be added to the list. Also make sure that the first part of the filename matches the locale you're basing it on. (Example: `en-FOO.yml`)
|
||||||
|
- To add custom error images, place them in the `./custom/assets/badges` directory, replacing the files already there.
|
||||||
|
- To add custom sounds, place only mp3 files in the `./custom/assets/sounds` directory.
|
||||||
|
- To update custom assets without rebuilding, just run `pnpm run gulp`.
|
||||||
|
|
||||||
|
## 🧑🔬 Configuring a new instance
|
||||||
|
|
||||||
|
- Run `cp .config/example.yml .config/default.yml`
|
||||||
|
- Edit `.config/default.yml`, making sure to fill out required fields.
|
||||||
|
- Also copy and edit `.config/docker_example.env` to `.config/docker.env` if you're using Docker.
|
||||||
|
|
||||||
|
## 🚚 Migrating from Misskey to Calckey
|
||||||
|
|
||||||
|
> ⚠️ Because of their changes, migrating from Foundkey is not supported.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cp ../misskey/.config/default.yml ./.config/default.yml # replace `../misskey/` with misskey path, add `docker.env` if you use Docker
|
||||||
|
cp -r ../misskey/files .
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🍀 NGINX
|
||||||
|
|
||||||
|
- Run `sudo cp ./calckey.nginx.conf /etc/nginx/sites-available/ && cd /etc/nginx/sites-available/`
|
||||||
|
- Edit `calckey.nginx.conf` to reflect your instance properly
|
||||||
|
- Run `sudo cp ./calckey.nginx.conf ../sites-enabled/`
|
||||||
|
- Run `sudo nginx -t` to validate that the config is valid, then restart the NGINX service.
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
## 🚀 Build and launch!
|
||||||
|
|
||||||
|
### 🐢 NodeJS + pm2
|
||||||
|
|
||||||
|
#### `git pull` and run these steps to update Calckey in the future!
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# git pull
|
||||||
|
NODE_ENV=production pnpm install && pnpm run build && pnpm run migrate
|
||||||
|
pm2 start "NODE_ENV=production pnpm run start" --name Calckey
|
||||||
|
```
|
||||||
|
|
||||||
|
## 😉 Tips & Tricks
|
||||||
|
|
||||||
|
- When editing the config file, please don't fill out the settings at the bottom. They're designed *only* for managed hosting, not self hosting. Those settings are much better off being set in Calckey's control panel.
|
||||||
|
- Port 3000 (used in the default config) might be already used on your server for something else. To find an open port for Calckey, run `for p in {3000..4000}; do ss -tlnH | tr -s ' ' | cut -d" " -sf4 | grep -q "${p}$" || echo "${p}"; done | head -n 1`. Replace 3000 with the minimum port and 4000 with the maximum port if you need it.
|
||||||
|
- I'd recommend you use a S3 Bucket/CDN for Object Storage, especially if you use Docker.
|
||||||
|
- I'd ***strongly*** recommend against using CloudFlare, but if you do, make sure to turn code minification off.
|
||||||
|
- For push notifications, run `npx web-push generate-vapid-keys`, then put the public and private keys into Control Panel > General > ServiceWorker.
|
||||||
|
- For translations, make a [DeepL](https://deepl.com) account and generate an API key, then put it into Control Panel > General > DeepL Translation.
|
||||||
|
- To add another admin account:
|
||||||
|
- Go to the user's page > 3 Dots > About > Moderation > turn on "Moderator"
|
||||||
|
- Go back to Overview > click the clipboard icon next to the ID
|
||||||
|
- Run `psql -d calckey` (or whatever the database name is)
|
||||||
|
- Run `UPDATE "user" SET "isAdmin" = true WHERE id='999999';` (replace `999999` with the copied ID)
|
||||||
|
- Have the new admin log out and log back in
|
||||||
|
|
40
ROADMAP.md
|
@ -1,40 +0,0 @@
|
||||||
# Roadmap
|
|
||||||
The order of individual tasks is a guide only and is subject to change depending on the situation.
|
|
||||||
Also, the later tasks are more indefinite and are subject to change as development progresses.
|
|
||||||
|
|
||||||
## (1) Improve maintainability \<current phase\>
|
|
||||||
This is the phase we are at now. We need to make a high-maintenance environment that can withstand future development.
|
|
||||||
|
|
||||||
- ~~Make the number of type errors zero (backend)~~ → Done ✔️
|
|
||||||
- Make the number of type errors zero (frontend)
|
|
||||||
- Improve CI
|
|
||||||
- ~~Fix tests~~ → Done ✔️
|
|
||||||
- Fix random test failures - https://github.com/misskey-dev/misskey/issues/7985 and https://github.com/misskey-dev/misskey/issues/7986
|
|
||||||
- Add more tests
|
|
||||||
- ~~May need to implement a mechanism that allows for DI~~ → Done ✔️
|
|
||||||
- https://github.com/misskey-dev/misskey/pull/9085
|
|
||||||
- ~~Measure coverage~~ → Done ✔️
|
|
||||||
- https://github.com/misskey-dev/misskey/pull/9081
|
|
||||||
- Improve documentation
|
|
||||||
- Refactoring
|
|
||||||
- Extract the logic of each endpoint definition into a service and just call it
|
|
||||||
|
|
||||||
## (2) Improve functionality
|
|
||||||
Once Phase 1 is complete and an environment conducive to the development of a stable system is in place, the implementation of new functions can begin gradually.
|
|
||||||
|
|
||||||
- Improve features for moderation
|
|
||||||
- ~~OAuth2 support https://github.com/misskey-dev/misskey/issues/8262~~ → Done ✔️
|
|
||||||
- GraphQL support?
|
|
||||||
|
|
||||||
## (3) Improve scalability
|
|
||||||
Once the development of the feature has settled down, this may be an opportunity to make larger modifications.
|
|
||||||
|
|
||||||
- Rewriting in Rust?
|
|
||||||
|
|
||||||
## (4) Change the world
|
|
||||||
It is time to promote Misskey and change the world.
|
|
||||||
|
|
||||||
- Become more major than services such as Twitter and become critical infrastructure for the world
|
|
||||||
- MiOS will be developed and integrated into various systems - What is MiOS?
|
|
||||||
- Letting Ai-chan interfere with the real world
|
|
||||||
- Make Misskey a member of GAFA; Misskey's office must be a reinforced concrete brutalist building with a courtyard.
|
|
15
SECURITY.md
|
@ -1,9 +1,16 @@
|
||||||
# Reporting Security Issues
|
# Reporting Security Issues
|
||||||
|
|
||||||
If you discover a security issue in Sharkey, please report it by sending an
|
## Minor Security Issues
|
||||||
email to [admin@transfem.org](mailto:admin@transfem.org).
|
|
||||||
|
If you discover a minor security issue in Calckey, please report it by sending an
|
||||||
|
email to [kainoa@t1c.dev](mailto:kainoa@t1c.dev).
|
||||||
|
|
||||||
|
## High Security Issues
|
||||||
|
|
||||||
|
If you discover a security issue, which is so high risk, that too much is affected by it, please dont send it over unencrypted communication. You can share your PGP keys with us using kainoa@t1c.dev and after we established a secure communication, send it over E-Mail, or message us using matrix' encrypted private messages at @t1c:matrix.fedibird.com or @cleo:tchncs.de
|
||||||
|
|
||||||
|
|
||||||
This will allow us to assess the risk, and make a fix available before we add a
|
This will allow us to assess the risk, and make a fix available before we add a
|
||||||
bug report to the GitLab repository.
|
bug report to the Codeberg repository.
|
||||||
|
|
||||||
Thanks for helping make Sharkey safe for everyone.
|
Thanks for helping make Calckey safe for everyone.
|
||||||
|
|
|
@ -1,41 +0,0 @@
|
||||||
# Upgrade Notes
|
|
||||||
|
|
||||||
## 2024.9.0
|
|
||||||
|
|
||||||
### Following Feed
|
|
||||||
|
|
||||||
When upgrading an existing instance to version 2024.9.0, the Following Feed will initially be empty.
|
|
||||||
The feed will gradually fill as new posts federate, but it may be desirable to back-fill the feed with existing data.
|
|
||||||
This database script will populate the feed with the latest post of each type for all users, ensuring that data is fully populated after the update.
|
|
||||||
Run this after migrations but before starting the instance.
|
|
||||||
Warning: the script may take a long time to execute!
|
|
||||||
|
|
||||||
```postgresql
|
|
||||||
INSERT INTO latest_note (user_id, note_id, is_public, is_reply, is_quote)
|
|
||||||
SELECT
|
|
||||||
"userId" as user_id,
|
|
||||||
id as note_id,
|
|
||||||
visibility = 'public' AS is_public,
|
|
||||||
"replyId" IS NOT NULL AS is_reply,
|
|
||||||
(
|
|
||||||
"renoteId" IS NOT NULL
|
|
||||||
AND (
|
|
||||||
text IS NOT NULL
|
|
||||||
OR cw IS NOT NULL
|
|
||||||
OR "replyId" IS NOT NULL
|
|
||||||
OR "hasPoll"
|
|
||||||
OR "fileIds" != '{}'
|
|
||||||
)
|
|
||||||
) AS is_quote
|
|
||||||
FROM note
|
|
||||||
WHERE ( -- Exclude pure renotes (boosts)
|
|
||||||
"renoteId" IS NULL
|
|
||||||
OR text IS NOT NULL
|
|
||||||
OR cw IS NOT NULL
|
|
||||||
OR "replyId" IS NOT NULL
|
|
||||||
OR "hasPoll"
|
|
||||||
OR "fileIds" != '{}'
|
|
||||||
)
|
|
||||||
ORDER BY id DESC -- This part is very important: it ensures that we only load the *latest* notes of each type. Do not remove it!
|
|
||||||
ON CONFLICT DO NOTHING; -- Any conflicts are guaranteed to be older notes that we can ignore.
|
|
||||||
```
|
|
Before Width: | Height: | Size: 94 KiB |
Before Width: | Height: | Size: 317 KiB |
Before Width: | Height: | Size: 24 KiB |
Before Width: | Height: | Size: 95 KiB |
Before Width: | Height: | Size: 200 KiB |
BIN
assets/ai.png
Before Width: | Height: | Size: 235 KiB |
Before Width: | Height: | Size: 41 KiB |
Before Width: | Height: | Size: 238 KiB |
Before Width: | Height: | Size: 148 KiB |
BIN
assets/title.png
Before Width: | Height: | Size: 3.8 KiB |
|
@ -1,67 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
id="svg10"
|
|
||||||
version="1.1"
|
|
||||||
viewBox="0 0 162.642 54.261"
|
|
||||||
height="205.08"
|
|
||||||
width="614.71">
|
|
||||||
<metadata
|
|
||||||
id="metadata16">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
<dc:title></dc:title>
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<style>
|
|
||||||
#g8 {
|
|
||||||
animation-name: floating;
|
|
||||||
animation-duration: 3s;
|
|
||||||
animation-iteration-count: infinite;
|
|
||||||
animation-timing-function: ease-in-out;
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes floating {
|
|
||||||
0% { transform: translate(0, 0px); }
|
|
||||||
50% { transform: translate(0, -5px); }
|
|
||||||
100% { transform: translate(0, 0px); }
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<linearGradient id="myGradient" gradientTransform="rotate(90)">
|
|
||||||
<stop offset="5%" stop-color="#A1CA03" />
|
|
||||||
<stop offset="95%" stop-color="#91BA03" />
|
|
||||||
</linearGradient>
|
|
||||||
<defs
|
|
||||||
id="defs14" />
|
|
||||||
<g
|
|
||||||
id="g8"
|
|
||||||
fill="url('#myGradient')"
|
|
||||||
word-spacing="0"
|
|
||||||
letter-spacing="0"
|
|
||||||
font-family="OTADESIGN Rounded"
|
|
||||||
font-weight="400">
|
|
||||||
<g
|
|
||||||
id="g4"
|
|
||||||
style="line-height:476.69509888px;-inkscape-font-specification:'OTADESIGN Rounded'">
|
|
||||||
<path
|
|
||||||
id="path2"
|
|
||||||
font-size="141.034"
|
|
||||||
aria-label="Mi"
|
|
||||||
d="m 27.595,34.59 c -1.676,0.006 -3.115,-1.004 -3.793,-2.179 -0.363,-0.513 -1.08,-0.696 -1.09,0 v 3.214 c 0,1.291 -0.47,2.408 -1.412,3.35 -0.915,0.914 -2.031,1.371 -3.35,1.371 -1.29,0 -2.407,-0.457 -3.349,-1.372 -0.914,-0.941 -1.372,-2.058 -1.372,-3.349 V 17.95 c 0,-0.995 0.283,-1.896 0.848,-2.703 0.591,-0.834 1.345,-1.413 2.26,-1.735 0.516591,-0.189385 1.062793,-0.285215 1.613,-0.283 1.453,0 2.664,0.565 3.632,1.695 l 4.832,5.608 c 0.108,0.08 0.424,0.697 1.18,0.697 0.758,0 1.115,-0.617 1.222,-0.698 l 4.791,-5.607 c 0.996,-1.13 2.22,-1.695 3.673,-1.695 0.538,0 1.076,0.094 1.614,0.283 0.914,0.322 1.654,0.9 2.22,1.735 0.591,0.807 0.887,1.708 0.887,2.703 v 17.675 c 0,1.291 -0.47,2.408 -1.412,3.35 -0.915,0.914 -2.032,1.371 -3.35,1.371 -1.291,0 -2.407,-0.457 -3.35,-1.372 -0.914,-0.941 -1.371,-2.058 -1.371,-3.349 v -3.214 c -0.08,-0.877 -0.855,-0.324 -1.13,0 -0.726,1.345 -2.118,2.173 -3.793,2.18 z M 47.806,21.38 c -1.13,0 -2.098333,-0.39 -2.905,-1.17 -0.78,-0.806667 -1.17,-1.775 -1.17,-2.905 0,-1.13 0.39,-2.085 1.17,-2.865 0.806667,-0.806667 1.775,-1.21 2.905,-1.21 1.13,0 2.098667,0.403333 2.906,1.21 0.806667,0.78 1.21,1.735 1.21,2.865 0,1.13 -0.403333,2.098333 -1.21,2.905 -0.807333,0.78 -1.776,1.17 -2.906,1.17 z m 0.04,0.808 c 1.13,0 2.085333,0.403333 2.866,1.21 0.806667,0.806667 1.21,1.775333 1.21,2.906 v 9.967 c 0,1.13 -0.403333,2.098333 -1.21,2.905 -0.78,0.78 -1.735333,1.17 -2.866,1.17 -1.129333,0 -2.097667,-0.39 -2.905,-1.17 -0.806667,-0.806667 -1.21,-1.775 -1.21,-2.905 v -9.967 c 0,-1.13 0.403333,-2.098667 1.21,-2.906 0.806667,-0.806667 1.775,-1.21 2.905,-1.21 z"
|
|
||||||
style="font-size:141.03399658px;-inkscape-font-specification:'OTADESIGN Rounded'" />
|
|
||||||
</g>
|
|
||||||
<path
|
|
||||||
id="path6"
|
|
||||||
d="M60.925 27.24q.968.243 2.42.525 2.42.403 3.792 1.29 2.582 1.695 2.582 5.083 0 2.743-1.815 4.478-2.098 2.017-5.85 2.017-2.742 0-6.13-.767-1.09-.242-1.776-1.089-.645-.847-.645-1.896 0-1.29.887-2.178.928-.928 2.179-.928.363 0 .685.081 1.17.242 4.478.605.444 0 .968-.04.202 0 .202-.242.04-.202-.242-.283-1.372-.242-2.542-.524-1.33-.282-1.896-.484-1.129-.323-1.895-.847-2.582-1.694-2.622-5.083 0-2.702 1.855-4.477 2.26-2.179 6.414-1.977 2.783.121 5.567.726 1.048.242 1.734 1.09.686.846.686 1.936 0 1.25-.928 2.178-.887.887-2.178.887-.323 0-.645-.08-1.17-.242-4.518-.565-.404-.04-.767 0-.323.04-.323.242.04.242.323.323zm17.555 0q.968.243 2.42.525 2.42.403 3.792 1.29 2.581 1.695 2.581 5.083 0 2.743-1.815 4.478-2.098 2.017-5.849 2.017-2.743 0-6.131-.767-1.09-.242-1.775-1.089-.646-.847-.646-1.896 0-1.29.888-2.178.927-.928 2.178-.928.363 0 .686.081 1.17.242 4.477.605.444 0 .968-.04.202 0 .202-.242.04-.202-.242-.283-1.371-.242-2.541-.524-1.331-.282-1.896-.484-1.13-.323-1.896-.847-2.582-1.694-2.622-5.083 0-2.702 1.855-4.477 2.26-2.179 6.414-1.977 2.784.121 5.567.726 1.049.242 1.735 1.09.685.846.685 1.936 0 1.25-.927 2.178-.888.887-2.179.887-.322 0-.645-.08-1.17-.242-4.518-.565-.403-.04-.767 0-.322.04-.322.242.04.242.322.323zm26.075 3.335q.12.08 2.864 2.783 1.25 1.21 1.25 2.945 0 1.613-1.17 2.864-1.17 1.21-2.904 1.21-1.654 0-2.864-1.17l-4.034-3.913q-.161-.12-.323-.12-.322 0-.322 1.21 0 1.694-1.21 2.904-1.21 1.17-2.905 1.17-1.694 0-2.904-1.17-1.17-1.21-1.17-2.905V17.586q0-1.694 1.17-2.864 1.21-1.21 2.904-1.21t2.904 1.21q1.21 1.17 1.21 2.864v6.293q0 .403.283.524.242.121.524-.08.162-.081 4.841-3.188 1.049-.645 2.259-.645 2.219 0 3.429 1.815.645 1.05.645 2.26 0 2.218-1.815 3.428l-2.541 1.614v.04l-.081.04q-.565.363-.04.888zm15.599 10.058q-4.195 0-7.18-2.945-2.945-2.985-2.945-7.18 0-4.155 2.945-7.1 2.985-2.985 7.18-2.985 4.155 0 6.979 2.784.928.927.928 2.259 0 1.33-.928 2.259l-4.68 4.639q-1.008 1.008-2.016 1.008-1.453 0-2.26-.807-.806-.807-.806-2.138 0-1.29.928-2.218l.806-.847q.162-.121.081-.243-.12-.08-.323-.04-.806.202-1.371.807-1.13 1.09-1.13 2.622 0 1.573 1.09 2.703 1.13 1.089 2.702 1.089 1.533 0 2.622-1.13.928-.927 2.26-.927 1.33 0 2.258.927.928.928.928 2.26 0 1.33-.928 2.258-2.985 2.945-7.14 2.945zm29.259-15.786v5.607q0 .564-.08 1.21v7.382q0 4.518-2.744 7.22-2.702 2.703-7.301 2.703-2.662 0-4.8-1.008-2.138-.968-2.138-3.348 0-.807.363-1.533.968-2.179 3.348-2.179.565 0 1.573.323 1.009.323 1.654.323 1.694 0 2.219-.726.201-.283.08-.444-.161-.242-.564-.161-.686.12-1.493.12-4.074 0-6.979-2.904-2.904-2.904-2.904-6.978v-5.607q0-1.695 1.17-2.864 1.21-1.21 2.904-1.21t2.905 1.21q1.21 1.17 1.21 2.864v5.607q0 .685.484 1.21.524.484 1.21.484.726 0 1.21-.484.484-.525.484-1.21v-5.607q0-1.695 1.21-2.864 1.21-1.21 2.905-1.21 1.694 0 2.864 1.21 1.21 1.17 1.21 2.864z"
|
|
||||||
style="line-height:136.34428406px;-inkscape-font-specification:'OTADESIGN Rounded'" />
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 6.1 KiB |
72
calckey.nginx.conf
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
# Replace example.tld with your domain
|
||||||
|
|
||||||
|
# For WebSocket
|
||||||
|
map $http_upgrade $connection_upgrade {
|
||||||
|
default upgrade;
|
||||||
|
'' close;
|
||||||
|
}
|
||||||
|
|
||||||
|
proxy_cache_path /tmp/nginx_cache levels=1:2 keys_zone=cache1:16m max_size=1g inactive=720m use_temp_path=off;
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
listen [::]:80;
|
||||||
|
server_name example.tld;
|
||||||
|
|
||||||
|
# For SSL domain validation
|
||||||
|
root /var/www/html;
|
||||||
|
location /.well-known/acme-challenge/ { allow all; }
|
||||||
|
location /.well-known/pki-validation/ { allow all; }
|
||||||
|
location / { return 301 https://$server_name$request_uri; }
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 443 ssl http2;
|
||||||
|
listen [::]:443 ssl http2;
|
||||||
|
server_name example.tld;
|
||||||
|
|
||||||
|
ssl_session_timeout 1d;
|
||||||
|
ssl_session_cache shared:ssl_session_cache:10m;
|
||||||
|
ssl_session_tickets off;
|
||||||
|
|
||||||
|
# To use Let's Encrypt certificate
|
||||||
|
ssl_certificate /etc/letsencrypt/live/example.tld/fullchain.pem;
|
||||||
|
ssl_certificate_key /etc/letsencrypt/live/example.tld/privkey.pem;
|
||||||
|
|
||||||
|
# To use Debian/Ubuntu's self-signed certificate (For testing or before issuing a certificate)
|
||||||
|
#ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
|
||||||
|
#ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;
|
||||||
|
|
||||||
|
# SSL protocol settings
|
||||||
|
ssl_protocols TLSv1.2 TLSv1.3;
|
||||||
|
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
|
||||||
|
ssl_prefer_server_ciphers off;
|
||||||
|
ssl_stapling on;
|
||||||
|
ssl_stapling_verify on;
|
||||||
|
|
||||||
|
# Change to your upload limit
|
||||||
|
client_max_body_size 80m;
|
||||||
|
|
||||||
|
# Proxy to Node
|
||||||
|
location / {
|
||||||
|
proxy_pass http://127.0.0.1:3000;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_redirect off;
|
||||||
|
|
||||||
|
# If it's behind another reverse proxy or CDN, remove the following.
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto https;
|
||||||
|
|
||||||
|
# For WebSocket
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection $connection_upgrade;
|
||||||
|
|
||||||
|
# Cache settings
|
||||||
|
proxy_cache cache1;
|
||||||
|
proxy_cache_lock on;
|
||||||
|
proxy_cache_use_stale updating;
|
||||||
|
add_header X-Cache $upstream_cache_status;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,4 +1,3 @@
|
||||||
apiVersion: v2
|
apiVersion: v2
|
||||||
name: misskey
|
name: misskey
|
||||||
version: 0.0.0
|
version: 0.0.0
|
||||||
description: This chart is created for the purpose of previewing Pull Requests. Do not use this for production use.
|
|
||||||
|
|
|
@ -72,75 +72,25 @@ db:
|
||||||
#extra:
|
#extra:
|
||||||
# ssl: true
|
# ssl: true
|
||||||
|
|
||||||
dbReplications: false
|
|
||||||
|
|
||||||
# You can configure any number of replicas here
|
|
||||||
#dbSlaves:
|
|
||||||
# -
|
|
||||||
# host:
|
|
||||||
# port:
|
|
||||||
# db:
|
|
||||||
# user:
|
|
||||||
# pass:
|
|
||||||
# -
|
|
||||||
# host:
|
|
||||||
# port:
|
|
||||||
# db:
|
|
||||||
# user:
|
|
||||||
# pass:
|
|
||||||
|
|
||||||
# ┌─────────────────────┐
|
# ┌─────────────────────┐
|
||||||
#───┘ Redis configuration └─────────────────────────────────────
|
#───┘ Redis configuration └─────────────────────────────────────
|
||||||
|
|
||||||
redis:
|
redis:
|
||||||
host: localhost
|
host: localhost
|
||||||
port: 6379
|
port: 6379
|
||||||
#family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
|
||||||
#pass: example-pass
|
#pass: example-pass
|
||||||
#prefix: example-prefix
|
#prefix: example-prefix
|
||||||
#db: 1
|
#db: 1
|
||||||
|
|
||||||
#redisForPubsub:
|
# ┌─────────────────────────────┐
|
||||||
|
#───┘ Elasticsearch configuration └─────────────────────────────
|
||||||
|
|
||||||
|
#elasticsearch:
|
||||||
# host: localhost
|
# host: localhost
|
||||||
# port: 6379
|
# port: 9200
|
||||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
# ssl: false
|
||||||
# #pass: example-pass
|
# user:
|
||||||
# #prefix: example-prefix
|
# pass:
|
||||||
# #db: 1
|
|
||||||
|
|
||||||
#redisForJobQueue:
|
|
||||||
# host: localhost
|
|
||||||
# port: 6379
|
|
||||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
|
||||||
# #pass: example-pass
|
|
||||||
# #prefix: example-prefix
|
|
||||||
# #db: 1
|
|
||||||
|
|
||||||
#redisForTimelines:
|
|
||||||
# host: redis
|
|
||||||
# port: 6379
|
|
||||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
|
||||||
# #pass: example-pass
|
|
||||||
# #prefix: example-prefix
|
|
||||||
# #db: 1
|
|
||||||
|
|
||||||
#redisForReactions:
|
|
||||||
# host: redis
|
|
||||||
# port: 6379
|
|
||||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
|
||||||
# #pass: example-pass
|
|
||||||
# #prefix: example-prefix
|
|
||||||
# #db: 1
|
|
||||||
|
|
||||||
# ┌───────────────────────────┐
|
|
||||||
#───┘ MeiliSearch configuration └─────────────────────────────
|
|
||||||
|
|
||||||
#meilisearch:
|
|
||||||
# host: localhost
|
|
||||||
# port: 7700
|
|
||||||
# apiKey: ''
|
|
||||||
# ssl: true
|
|
||||||
# index: ''
|
|
||||||
|
|
||||||
# ┌───────────────┐
|
# ┌───────────────┐
|
||||||
#───┘ ID generation └───────────────────────────────────────────
|
#───┘ ID generation └───────────────────────────────────────────
|
||||||
|
@ -151,7 +101,6 @@ redis:
|
||||||
|
|
||||||
# Available methods:
|
# Available methods:
|
||||||
# aid ... Short, Millisecond accuracy
|
# aid ... Short, Millisecond accuracy
|
||||||
# aidx ... Millisecond accuracy
|
|
||||||
# meid ... Similar to ObjectID, Millisecond accuracy
|
# meid ... Similar to ObjectID, Millisecond accuracy
|
||||||
# ulid ... Millisecond accuracy
|
# ulid ... Millisecond accuracy
|
||||||
# objectid ... This is left for backward compatibility
|
# objectid ... This is left for backward compatibility
|
||||||
|
@ -159,23 +108,7 @@ redis:
|
||||||
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
||||||
# ID SETTINGS AFTER THAT!
|
# ID SETTINGS AFTER THAT!
|
||||||
|
|
||||||
id: "aidx"
|
id: "aid"
|
||||||
|
|
||||||
# ┌────────────────┐
|
|
||||||
#───┘ Error tracking └──────────────────────────────────────────
|
|
||||||
|
|
||||||
# Sentry is available for error tracking.
|
|
||||||
# See the Sentry documentation for more details on options.
|
|
||||||
|
|
||||||
#sentryForBackend:
|
|
||||||
# enableNodeProfiling: true
|
|
||||||
# options:
|
|
||||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
|
||||||
|
|
||||||
#sentryForFrontend:
|
|
||||||
# options:
|
|
||||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
|
||||||
|
|
||||||
# ┌─────────────────────┐
|
# ┌─────────────────────┐
|
||||||
#───┘ Other configuration └─────────────────────────────────────
|
#───┘ Other configuration └─────────────────────────────────────
|
||||||
|
|
||||||
|
@ -191,7 +124,7 @@ id: "aidx"
|
||||||
|
|
||||||
# Job rate limiter
|
# Job rate limiter
|
||||||
# deliverJobPerSec: 128
|
# deliverJobPerSec: 128
|
||||||
# inboxJobPerSec: 32
|
# inboxJobPerSec: 16
|
||||||
|
|
||||||
# Job attempts
|
# Job attempts
|
||||||
# deliverJobMaxAttempts: 12
|
# deliverJobMaxAttempts: 12
|
||||||
|
@ -200,6 +133,11 @@ id: "aidx"
|
||||||
# IP address family used for outgoing request (ipv4, ipv6 or dual)
|
# IP address family used for outgoing request (ipv4, ipv6 or dual)
|
||||||
#outgoingAddressFamily: ipv4
|
#outgoingAddressFamily: ipv4
|
||||||
|
|
||||||
|
# Syslog option
|
||||||
|
#syslog:
|
||||||
|
# host: localhost
|
||||||
|
# port: 514
|
||||||
|
|
||||||
# Proxy for HTTP/HTTPS
|
# Proxy for HTTP/HTTPS
|
||||||
#proxy: http://127.0.0.1:3128
|
#proxy: http://127.0.0.1:3128
|
||||||
|
|
||||||
|
@ -216,16 +154,6 @@ id: "aidx"
|
||||||
# Media Proxy
|
# Media Proxy
|
||||||
#mediaProxy: https://example.com/proxy
|
#mediaProxy: https://example.com/proxy
|
||||||
|
|
||||||
# Sign outgoing ActivityPub GET request (default: true)
|
|
||||||
signToActivityPubGet: true
|
|
||||||
# Sign outgoing ActivityPub Activities (default: true)
|
|
||||||
# Linked Data signatures are cryptographic signatures attached to each activity to provide proof of authenticity.
|
|
||||||
# When using authorized fetch, this is often undesired as any signed activity can be forwarded to a blocked instance by relays and other instances.
|
|
||||||
# This setting allows admins to disable LD signatures for increased privacy, at the expense of fewer relayed activities and additional inbound fetch (GET) requests.
|
|
||||||
attachLdSignatureForRelays: true
|
|
||||||
# check that inbound ActivityPub GET requests are signed ("authorized fetch")
|
|
||||||
checkActivityPubGetSignature: false
|
|
||||||
|
|
||||||
#allowedPrivateNetworks: [
|
#allowedPrivateNetworks: [
|
||||||
# '127.0.0.1/32'
|
# '127.0.0.1/32'
|
||||||
#]
|
#]
|
||||||
|
|
|
@ -3,16 +3,16 @@ kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
name: {{ include "misskey.fullname" . }}
|
name: {{ include "misskey.fullname" . }}
|
||||||
labels:
|
labels:
|
||||||
{{- include "misskey.labels" . | nindent 4 }}
|
{{- include "misskey.labels" . | nindent 4 }}
|
||||||
spec:
|
spec:
|
||||||
selector:
|
selector:
|
||||||
matchLabels:
|
matchLabels:
|
||||||
{{- include "misskey.selectorLabels" . | nindent 6 }}
|
{{- include "misskey.selectorLabels" . | nindent 6 }}
|
||||||
replicas: 1
|
replicas: 1
|
||||||
template:
|
template:
|
||||||
metadata:
|
metadata:
|
||||||
labels:
|
labels:
|
||||||
{{- include "misskey.selectorLabels" . | nindent 8 }}
|
{{- include "misskey.selectorLabels" . | nindent 8 }}
|
||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: misskey
|
- name: misskey
|
||||||
|
@ -27,7 +27,7 @@ spec:
|
||||||
ports:
|
ports:
|
||||||
- containerPort: 3000
|
- containerPort: 3000
|
||||||
- name: postgres
|
- name: postgres
|
||||||
image: postgres:15-alpine
|
image: postgres:14-alpine
|
||||||
env:
|
env:
|
||||||
- name: POSTGRES_USER
|
- name: POSTGRES_USER
|
||||||
value: "example-misskey-user"
|
value: "example-misskey-user"
|
||||||
|
@ -38,7 +38,7 @@ spec:
|
||||||
ports:
|
ports:
|
||||||
- containerPort: 5432
|
- containerPort: 5432
|
||||||
- name: redis
|
- name: redis
|
||||||
image: redis:7-alpine
|
image: redis:alpine
|
||||||
ports:
|
ports:
|
||||||
- containerPort: 6379
|
- containerPort: 6379
|
||||||
volumes:
|
volumes:
|
||||||
|
|
|
@ -11,4 +11,4 @@ spec:
|
||||||
protocol: TCP
|
protocol: TCP
|
||||||
name: http
|
name: http
|
||||||
selector:
|
selector:
|
||||||
{{- include "misskey.selectorLabels" . | nindent 4 }}
|
{{- include "misskey.selectorLabels" . | nindent 4 }}
|
||||||
|
|
103
cliff.toml
Normal file
|
@ -0,0 +1,103 @@
|
||||||
|
# configuration file for git-cliff (0.1.0)
|
||||||
|
|
||||||
|
[changelog]
|
||||||
|
# changelog header
|
||||||
|
header = """
|
||||||
|
# Changelog\n
|
||||||
|
All changes from v13.0.0 onwards, for a full list of differences read CALCKEY.md\n
|
||||||
|
"""
|
||||||
|
# template for the changelog body
|
||||||
|
# https://tera.netlify.app/docs/#introduction
|
||||||
|
body = """
|
||||||
|
{% if version %}\
|
||||||
|
## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
|
||||||
|
{% else %}\
|
||||||
|
## [unreleased]
|
||||||
|
{% endif %}\
|
||||||
|
{% for group, commits in commits | group_by(attribute="group") %}
|
||||||
|
### {{ group | upper_first }}
|
||||||
|
{% for commit in commits %}
|
||||||
|
- {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\
|
||||||
|
{% endfor %}
|
||||||
|
{% endfor %}\n
|
||||||
|
"""
|
||||||
|
# remove the leading and trailing whitespace from the template
|
||||||
|
trim = true
|
||||||
|
# changelog footer
|
||||||
|
footer = """
|
||||||
|
<!-- generated by git-cliff -->
|
||||||
|
"""
|
||||||
|
|
||||||
|
[git]
|
||||||
|
# parse the commits based on https://www.conventionalcommits.org
|
||||||
|
conventional_commits = false
|
||||||
|
# filter out the commits that are not conventional
|
||||||
|
filter_unconventional = true
|
||||||
|
# process each line of a commit as an individual commit
|
||||||
|
split_commits = false
|
||||||
|
# regex for preprocessing the commit messages
|
||||||
|
commit_preprocessors = [
|
||||||
|
{ pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](https://github.com/orhun/git-cliff/issues/${2}))"},
|
||||||
|
]
|
||||||
|
# regex for parsing and grouping commits
|
||||||
|
commit_parsers = [
|
||||||
|
{ message = "^feat", group = "Features"},
|
||||||
|
{ message = "^add", group = "Features"},
|
||||||
|
{ message = "^fix", group = "Bug Fixes"},
|
||||||
|
{ message = "^prevent", group = "Bug Fixes"},
|
||||||
|
{ message = "^doc", group = "Documentation"},
|
||||||
|
{ message = "^perf", group = "Performance"},
|
||||||
|
{ message = "^🎨", group = "Refactor"},
|
||||||
|
{ message = "^enhance", group = "Refactor"},
|
||||||
|
{ message = "^⚡️", group = "Refactor"},
|
||||||
|
{ message = "^🔥", group = "Features"},
|
||||||
|
{ message = "^🐛", group = "Bug Fixes"},
|
||||||
|
{ message = "^🚑️", group = "Bug Fixes"},
|
||||||
|
{ message = "^block", group = "Bug Fixes"},
|
||||||
|
{ message = "^✨", group = "Features"},
|
||||||
|
{ message = "^📝", group = "Documentation"},
|
||||||
|
{ message = "^🚀", group = "Features"},
|
||||||
|
{ message = "^💄", group = "Styling"},
|
||||||
|
{ message = "^✅", group = "Testing"},
|
||||||
|
{ message = "^🔒️", group = "Security"},
|
||||||
|
{ message = "^🚨", group = "Testing"},
|
||||||
|
{ message = "^💚", group = "CI"},
|
||||||
|
{ message = "^👷", group = "CI"},
|
||||||
|
{ message = "^⬇️", group = "Miscellaneous Tasks"},
|
||||||
|
{ message = "^⬆️", group = "Miscellaneous Tasks"},
|
||||||
|
{ message = "^📌", group = "Miscellaneous Tasks"},
|
||||||
|
{ message = "^➕", group = "Miscellaneous Tasks"},
|
||||||
|
{ message = "^➖", group = "Miscellaneous Tasks"},
|
||||||
|
{ message = "^♻️", group = "Refactor"},
|
||||||
|
{ message = "^🔧", group = "CI"},
|
||||||
|
{ message = "^🔨", group = "CI"},
|
||||||
|
{ message = "^🌐", group = "Localization"},
|
||||||
|
{ message = "^✏️", group = "Localization"},
|
||||||
|
{ message = "^👽️", group = "Bug Fixes"},
|
||||||
|
{ message = "^🍱", group = "Styling"},
|
||||||
|
{ message = "^♿️", group = "Styling"},
|
||||||
|
{ message = "^🩹", group = "Bug Fixes"},
|
||||||
|
{ message = "^refactor", group = "Refactor"},
|
||||||
|
{ message = "^style", group = "Styling"},
|
||||||
|
{ message = "^test", group = "Testing"},
|
||||||
|
{ message = "^chore\\(release\\): prepare for", skip = true},
|
||||||
|
{ message = "^chore", group = "Miscellaneous Tasks"},
|
||||||
|
{ message = "^update", group = "Miscellaneous Tasks"},
|
||||||
|
{ body = ".*security", group = "Security"},
|
||||||
|
]
|
||||||
|
# protect breaking changes from being skipped due to matching a skipping commit_parser
|
||||||
|
protect_breaking_commits = false
|
||||||
|
# filter out the commits that are not matched by commit parsers
|
||||||
|
filter_commits = false
|
||||||
|
# glob pattern for matching git tags
|
||||||
|
tag_pattern = "v[0-9]*"
|
||||||
|
# regex for skipping tags
|
||||||
|
skip_tags = "v0.1.0-beta.1"
|
||||||
|
# regex for ignoring tags
|
||||||
|
ignore_tags = ""
|
||||||
|
# sort the tags chronologically
|
||||||
|
date_order = false
|
||||||
|
# sort the commits inside sections by oldest/newest order
|
||||||
|
sort_commits = "oldest"
|
||||||
|
# limit the number of commits included in the changelog.
|
||||||
|
# limit_commits = 42
|
|
@ -1,4 +0,0 @@
|
||||||
coverage:
|
|
||||||
status:
|
|
||||||
project: false
|
|
||||||
patch: false
|
|
|
@ -1,40 +0,0 @@
|
||||||
# このconfigは、 dockerでMisskey本体を起動せず、 redisとpostgresql などだけを起動します
|
|
||||||
|
|
||||||
services:
|
|
||||||
redis:
|
|
||||||
restart: always
|
|
||||||
image: redis:7-alpine
|
|
||||||
ports:
|
|
||||||
- "6379:6379"
|
|
||||||
volumes:
|
|
||||||
- ./redis:/data
|
|
||||||
healthcheck:
|
|
||||||
test: "redis-cli ping"
|
|
||||||
interval: 5s
|
|
||||||
retries: 20
|
|
||||||
|
|
||||||
db:
|
|
||||||
restart: always
|
|
||||||
image: postgres:15-alpine
|
|
||||||
ports:
|
|
||||||
- "5432:5432"
|
|
||||||
env_file:
|
|
||||||
- .config/docker.env
|
|
||||||
volumes:
|
|
||||||
- ./db:/var/lib/postgresql/data
|
|
||||||
healthcheck:
|
|
||||||
test: "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"
|
|
||||||
interval: 5s
|
|
||||||
retries: 20
|
|
||||||
|
|
||||||
# meilisearch:
|
|
||||||
# restart: always
|
|
||||||
# image: getmeili/meilisearch:v1.3.4
|
|
||||||
# environment:
|
|
||||||
# - MEILI_NO_ANALYTICS=true
|
|
||||||
# - MEILI_ENV=production
|
|
||||||
# env_file:
|
|
||||||
# - .config/meilisearch.env
|
|
||||||
# volumes:
|
|
||||||
# - ./meili_data:/meili_data
|
|
||||||
|
|
|
@ -1,97 +0,0 @@
|
||||||
services:
|
|
||||||
web:
|
|
||||||
# image: registry.activitypub.software/transfem-org/sharkey:latest
|
|
||||||
build: .
|
|
||||||
restart: always
|
|
||||||
links:
|
|
||||||
- db
|
|
||||||
- redis
|
|
||||||
# - mcaptcha
|
|
||||||
# - meilisearch
|
|
||||||
depends_on:
|
|
||||||
db:
|
|
||||||
condition: service_healthy
|
|
||||||
redis:
|
|
||||||
condition: service_healthy
|
|
||||||
ports:
|
|
||||||
- "3000:3000"
|
|
||||||
networks:
|
|
||||||
- shonk
|
|
||||||
# env_file:
|
|
||||||
# - .config/docker.env
|
|
||||||
volumes:
|
|
||||||
- ./files:/sharkey/files
|
|
||||||
- ./.config:/sharkey/.config:ro
|
|
||||||
|
|
||||||
redis:
|
|
||||||
restart: always
|
|
||||||
image: redis:7-alpine
|
|
||||||
networks:
|
|
||||||
- shonk
|
|
||||||
volumes:
|
|
||||||
- ./redis:/data
|
|
||||||
healthcheck:
|
|
||||||
test: "redis-cli ping"
|
|
||||||
interval: 5s
|
|
||||||
retries: 20
|
|
||||||
|
|
||||||
db:
|
|
||||||
restart: always
|
|
||||||
image: postgres:15-alpine
|
|
||||||
networks:
|
|
||||||
- shonk
|
|
||||||
env_file:
|
|
||||||
- .config/docker.env
|
|
||||||
volumes:
|
|
||||||
- ./db:/var/lib/postgresql/data
|
|
||||||
healthcheck:
|
|
||||||
test: "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"
|
|
||||||
interval: 5s
|
|
||||||
retries: 20
|
|
||||||
|
|
||||||
# mcaptcha:
|
|
||||||
# restart: always
|
|
||||||
# image: mcaptcha/mcaptcha:latest
|
|
||||||
# networks:
|
|
||||||
# shonk:
|
|
||||||
# aliases:
|
|
||||||
# - localhost
|
|
||||||
# ports:
|
|
||||||
# - 7493:7493
|
|
||||||
# env_file:
|
|
||||||
# - .config/docker.env
|
|
||||||
# environment:
|
|
||||||
# PORT: 7493
|
|
||||||
# MCAPTCHA_redis_URL: "redis://mcaptcha_redis/"
|
|
||||||
# MCAPTCHA_allow_registration: true
|
|
||||||
# MCAPTCHA_server_DOMAIN: "example.tld"
|
|
||||||
# depends_on:
|
|
||||||
# db:
|
|
||||||
# condition: service_healthy
|
|
||||||
# mcaptcha_redis:
|
|
||||||
# condition: service_healthy
|
|
||||||
#
|
|
||||||
# mcaptcha_redis:
|
|
||||||
# image: mcaptcha/cache:latest
|
|
||||||
# networks:
|
|
||||||
# - shonk
|
|
||||||
# healthcheck:
|
|
||||||
# test: "redis-cli ping"
|
|
||||||
# interval: 5s
|
|
||||||
# retries: 20
|
|
||||||
|
|
||||||
# meilisearch:
|
|
||||||
# restart: always
|
|
||||||
# image: getmeili/meilisearch:v1.3.4
|
|
||||||
# environment:
|
|
||||||
# - MEILI_NO_ANALYTICS=true
|
|
||||||
# - MEILI_ENV=production
|
|
||||||
# - MEILI_MASTER_KEY=ChangeThis
|
|
||||||
# networks:
|
|
||||||
# - shonk
|
|
||||||
# volumes:
|
|
||||||
# - ./meili_data:/meili_data
|
|
||||||
|
|
||||||
|
|
||||||
networks:
|
|
||||||
shonk:
|
|
|
@ -1,4 +0,0 @@
|
||||||
files:
|
|
||||||
- source: /sharkey-locales/en-US.yml
|
|
||||||
translation: /sharkey-locales/%locale%.yml
|
|
||||||
update_option: update_as_unapproved
|
|
BIN
custom/assets/badges/error.png
Normal file
After Width: | Height: | Size: 57 KiB |
BIN
custom/assets/badges/info.png
Normal file
After Width: | Height: | Size: 55 KiB |
BIN
custom/assets/badges/not-found.png
Normal file
After Width: | Height: | Size: 56 KiB |
7
custom/assets/instance.css
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
/*
|
||||||
|
* !!! WARNING !!!
|
||||||
|
* Editing this file may cause your instance to break for EVERYONE.
|
||||||
|
* Please know what you're doing and test it out with regular user custom CSS.
|
||||||
|
* With that said, GLHF!
|
||||||
|
* This may eventuallly be replaced with a function in the admin panel.
|
||||||
|
*/
|
BIN
custom/assets/sounds/None.mp3
Normal file
0
custom/locales/.gitkeep
Normal file
149
cypress/e2e/basic.cy.js
Normal file
|
@ -0,0 +1,149 @@
|
||||||
|
describe('Before setup instance', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
cy.resetState();
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
// テスト終了直前にページ遷移するようなテストケース(例えばアカウント作成)だと、たぶんCypressのバグでブラウザの内容が次のテストケースに引き継がれてしまう(例えばアカウントが作成し終わった段階からテストが始まる)。
|
||||||
|
// waitを入れることでそれを防止できる
|
||||||
|
cy.wait(1000);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('successfully loads', () => {
|
||||||
|
cy.visit('/');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('setup instance', () => {
|
||||||
|
cy.visit('/');
|
||||||
|
|
||||||
|
cy.intercept('POST', '/api/admin/accounts/create').as('signup');
|
||||||
|
|
||||||
|
cy.get('[data-cy-admin-username] input').type('admin');
|
||||||
|
cy.get('[data-cy-admin-password] input').type('admin1234');
|
||||||
|
cy.get('[data-cy-admin-ok]').click();
|
||||||
|
|
||||||
|
// なぜか動かない
|
||||||
|
//cy.wait('@signup').should('have.property', 'response.statusCode');
|
||||||
|
cy.wait('@signup');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('After setup instance', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
cy.resetState();
|
||||||
|
|
||||||
|
// インスタンス初期セットアップ
|
||||||
|
cy.registerUser('admin', 'pass', true);
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
// テスト終了直前にページ遷移するようなテストケース(例えばアカウント作成)だと、たぶんCypressのバグでブラウザの内容が次のテストケースに引き継がれてしまう(例えばアカウントが作成し終わった段階からテストが始まる)。
|
||||||
|
// waitを入れることでそれを防止できる
|
||||||
|
cy.wait(1000);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('successfully loads', () => {
|
||||||
|
cy.visit('/');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('signup', () => {
|
||||||
|
cy.visit('/');
|
||||||
|
|
||||||
|
cy.intercept('POST', '/api/signup').as('signup');
|
||||||
|
|
||||||
|
cy.get('[data-cy-signup]').click();
|
||||||
|
cy.get('[data-cy-signup-username] input').type('alice');
|
||||||
|
cy.get('[data-cy-signup-password] input').type('alice1234');
|
||||||
|
cy.get('[data-cy-signup-password-retype] input').type('alice1234');
|
||||||
|
cy.get('[data-cy-signup-submit]').click();
|
||||||
|
|
||||||
|
cy.wait('@signup');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('After user signup', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
cy.resetState();
|
||||||
|
|
||||||
|
// インスタンス初期セットアップ
|
||||||
|
cy.registerUser('admin', 'pass', true);
|
||||||
|
|
||||||
|
// ユーザー作成
|
||||||
|
cy.registerUser('alice', 'alice1234');
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
// テスト終了直前にページ遷移するようなテストケース(例えばアカウント作成)だと、たぶんCypressのバグでブラウザの内容が次のテストケースに引き継がれてしまう(例えばアカウントが作成し終わった段階からテストが始まる)。
|
||||||
|
// waitを入れることでそれを防止できる
|
||||||
|
cy.wait(1000);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('successfully loads', () => {
|
||||||
|
cy.visit('/');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('signin', () => {
|
||||||
|
cy.visit('/');
|
||||||
|
|
||||||
|
cy.intercept('POST', '/api/signin').as('signin');
|
||||||
|
|
||||||
|
cy.get('[data-cy-signin]').click();
|
||||||
|
cy.get('[data-cy-signin-username] input').type('alice');
|
||||||
|
// Enterキーでサインインできるかの確認も兼ねる
|
||||||
|
cy.get('[data-cy-signin-password] input').type('alice1234{enter}');
|
||||||
|
|
||||||
|
cy.wait('@signin');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('suspend', function() {
|
||||||
|
cy.request('POST', '/api/admin/suspend-user', {
|
||||||
|
i: this.admin.token,
|
||||||
|
userId: this.alice.id,
|
||||||
|
});
|
||||||
|
|
||||||
|
cy.visit('/');
|
||||||
|
|
||||||
|
cy.get('[data-cy-signin]').click();
|
||||||
|
cy.get('[data-cy-signin-username] input').type('alice');
|
||||||
|
cy.get('[data-cy-signin-password] input').type('alice1234{enter}');
|
||||||
|
|
||||||
|
// TODO: cypressにブラウザの言語指定できる機能が実装され次第英語のみテストするようにする
|
||||||
|
cy.contains(/アカウントが凍結されています|This account has been suspended due to/gi);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('After user singed in', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
cy.resetState();
|
||||||
|
|
||||||
|
// インスタンス初期セットアップ
|
||||||
|
cy.registerUser('admin', 'pass', true);
|
||||||
|
|
||||||
|
// ユーザー作成
|
||||||
|
cy.registerUser('alice', 'alice1234');
|
||||||
|
|
||||||
|
cy.login('alice', 'alice1234');
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
// テスト終了直前にページ遷移するようなテストケース(例えばアカウント作成)だと、たぶんCypressのバグでブラウザの内容が次のテストケースに引き継がれてしまう(例えばアカウントが作成し終わった段階からテストが始まる)。
|
||||||
|
// waitを入れることでそれを防止できる
|
||||||
|
cy.wait(1000);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('successfully loads', () => {
|
||||||
|
cy.get('[data-cy-open-post-form]').should('be.visible');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('note', () => {
|
||||||
|
cy.get('[data-cy-open-post-form]').click();
|
||||||
|
cy.get('[data-cy-post-form-text]').type('Hello, Misskey!');
|
||||||
|
cy.get('[data-cy-open-post-form-submit]').click();
|
||||||
|
|
||||||
|
cy.contains('Hello, Misskey!');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// TODO: 投稿フォームの公開範囲指定のテスト
|
||||||
|
// TODO: 投稿フォームのファイル添付のテスト
|
||||||
|
// TODO: 投稿フォームのハッシュタグ保持フィールドのテスト
|
|
@ -1,248 +0,0 @@
|
||||||
/*
|
|
||||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
|
||||||
* SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
*/
|
|
||||||
|
|
||||||
describe('Before setup instance', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
cy.resetState();
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
// テスト終了直前にページ遷移するようなテストケース(例えばアカウント作成)だと、たぶんCypressのバグでブラウザの内容が次のテストケースに引き継がれてしまう(例えばアカウントが作成し終わった段階からテストが始まる)。
|
|
||||||
// waitを入れることでそれを防止できる
|
|
||||||
cy.wait(1000);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('successfully loads', () => {
|
|
||||||
cy.visitHome();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('setup instance', () => {
|
|
||||||
cy.visitHome();
|
|
||||||
|
|
||||||
cy.intercept('POST', '/api/admin/accounts/create').as('signup');
|
|
||||||
|
|
||||||
cy.get('[data-cy-admin-username] input').type('admin');
|
|
||||||
cy.get('[data-cy-admin-password] input').type('admin1234');
|
|
||||||
cy.get('[data-cy-admin-ok]').click();
|
|
||||||
|
|
||||||
// なぜか動かない
|
|
||||||
//cy.wait('@signup').should('have.property', 'response.statusCode');
|
|
||||||
cy.wait('@signup');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('After setup instance', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
cy.resetState();
|
|
||||||
|
|
||||||
// インスタンス初期セットアップ
|
|
||||||
cy.registerUser('admin', 'pass', true);
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
// テスト終了直前にページ遷移するようなテストケース(例えばアカウント作成)だと、たぶんCypressのバグでブラウザの内容が次のテストケースに引き継がれてしまう(例えばアカウントが作成し終わった段階からテストが始まる)。
|
|
||||||
// waitを入れることでそれを防止できる
|
|
||||||
cy.wait(1000);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('successfully loads', () => {
|
|
||||||
cy.visitHome();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('signup', () => {
|
|
||||||
cy.visitHome();
|
|
||||||
|
|
||||||
cy.intercept('POST', '/api/signup').as('signup');
|
|
||||||
|
|
||||||
cy.get('[data-cy-signup]').click();
|
|
||||||
cy.get('[data-cy-signup-rules-continue]').should('be.disabled');
|
|
||||||
cy.get('[data-cy-signup-rules-notes-agree] [data-cy-switch-toggle]').click();
|
|
||||||
cy.get('[data-cy-modal-dialog-ok]').click();
|
|
||||||
cy.get('[data-cy-signup-rules-continue]').should('not.be.disabled');
|
|
||||||
cy.get('[data-cy-signup-rules-continue]').click();
|
|
||||||
|
|
||||||
cy.get('[data-cy-signup-submit]').should('be.disabled');
|
|
||||||
cy.get('[data-cy-signup-username] input').type('alice');
|
|
||||||
cy.get('[data-cy-signup-submit]').should('be.disabled');
|
|
||||||
cy.get('[data-cy-signup-password] input').type('alice1234');
|
|
||||||
cy.get('[data-cy-signup-submit]').should('be.disabled');
|
|
||||||
cy.get('[data-cy-signup-password-retype] input').type('alice1234');
|
|
||||||
cy.get('[data-cy-signup-submit]').should('not.be.disabled');
|
|
||||||
cy.get('[data-cy-signup-submit]').click();
|
|
||||||
|
|
||||||
cy.wait('@signup');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('signup with duplicated username', () => {
|
|
||||||
cy.registerUser('alice', 'alice1234');
|
|
||||||
|
|
||||||
cy.visitHome();
|
|
||||||
|
|
||||||
// ユーザー名が重複している場合の挙動確認
|
|
||||||
cy.get('[data-cy-signup]').click();
|
|
||||||
cy.get('[data-cy-signup-rules-continue]').should('be.disabled');
|
|
||||||
cy.get('[data-cy-signup-rules-notes-agree] [data-cy-switch-toggle]').click();
|
|
||||||
cy.get('[data-cy-modal-dialog-ok]').click();
|
|
||||||
cy.get('[data-cy-signup-rules-continue]').should('not.be.disabled');
|
|
||||||
cy.get('[data-cy-signup-rules-continue]').click();
|
|
||||||
|
|
||||||
cy.get('[data-cy-signup-username] input').type('alice');
|
|
||||||
cy.get('[data-cy-signup-password] input').type('alice1234');
|
|
||||||
cy.get('[data-cy-signup-password-retype] input').type('alice1234');
|
|
||||||
cy.get('[data-cy-signup-submit]').should('be.disabled');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('After user signup', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
cy.resetState();
|
|
||||||
|
|
||||||
// インスタンス初期セットアップ
|
|
||||||
cy.registerUser('admin', 'pass', true);
|
|
||||||
|
|
||||||
// ユーザー作成
|
|
||||||
cy.registerUser('alice', 'alice1234');
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
// テスト終了直前にページ遷移するようなテストケース(例えばアカウント作成)だと、たぶんCypressのバグでブラウザの内容が次のテストケースに引き継がれてしまう(例えばアカウントが作成し終わった段階からテストが始まる)。
|
|
||||||
// waitを入れることでそれを防止できる
|
|
||||||
cy.wait(1000);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('successfully loads', () => {
|
|
||||||
cy.visitHome();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('signin', () => {
|
|
||||||
cy.visitHome();
|
|
||||||
|
|
||||||
cy.intercept('POST', '/api/signin').as('signin');
|
|
||||||
|
|
||||||
cy.get('[data-cy-signin]').click();
|
|
||||||
cy.get('[data-cy-signin-username] input').type('alice');
|
|
||||||
// Enterキーでサインインできるかの確認も兼ねる
|
|
||||||
cy.get('[data-cy-signin-password] input').type('alice1234{enter}');
|
|
||||||
|
|
||||||
cy.wait('@signin');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('suspend', function() {
|
|
||||||
cy.request('POST', '/api/admin/suspend-user', {
|
|
||||||
i: this.admin.token,
|
|
||||||
userId: this.alice.id,
|
|
||||||
});
|
|
||||||
|
|
||||||
cy.visitHome();
|
|
||||||
|
|
||||||
cy.get('[data-cy-signin]').click();
|
|
||||||
cy.get('[data-cy-signin-username] input').type('alice');
|
|
||||||
cy.get('[data-cy-signin-password] input').type('alice1234{enter}');
|
|
||||||
|
|
||||||
// TODO: cypressにブラウザの言語指定できる機能が実装され次第英語のみテストするようにする
|
|
||||||
cy.contains(/アカウントが凍結されています|This account has been suspended due to/gi);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('After user signed in', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
cy.resetState();
|
|
||||||
|
|
||||||
// インスタンス初期セットアップ
|
|
||||||
cy.registerUser('admin', 'pass', true);
|
|
||||||
|
|
||||||
// ユーザー作成
|
|
||||||
cy.registerUser('alice', 'alice1234');
|
|
||||||
|
|
||||||
cy.login('alice', 'alice1234');
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
// テスト終了直前にページ遷移するようなテストケース(例えばアカウント作成)だと、たぶんCypressのバグでブラウザの内容が次のテストケースに引き継がれてしまう(例えばアカウントが作成し終わった段階からテストが始まる)。
|
|
||||||
// waitを入れることでそれを防止できる
|
|
||||||
cy.wait(1000);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('successfully loads', () => {
|
|
||||||
// 表示に時間がかかるのでデフォルト秒数だとタイムアウトする
|
|
||||||
cy.get('[data-cy-user-setup-continue]', { timeout: 30000 }).should('be.visible');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('account setup wizard', () => {
|
|
||||||
// 表示に時間がかかるのでデフォルト秒数だとタイムアウトする
|
|
||||||
cy.get('[data-cy-user-setup-continue]', { timeout: 30000 }).click();
|
|
||||||
|
|
||||||
cy.get('[data-cy-user-setup-user-name] input').type('ありす');
|
|
||||||
cy.get('[data-cy-user-setup-user-description] textarea').type('ほげ');
|
|
||||||
// TODO: アイコン設定テスト
|
|
||||||
|
|
||||||
cy.get('[data-cy-user-setup-continue]').click();
|
|
||||||
|
|
||||||
// プライバシー設定
|
|
||||||
|
|
||||||
cy.get('[data-cy-user-setup-continue]').click();
|
|
||||||
|
|
||||||
// フォローはスキップ
|
|
||||||
|
|
||||||
cy.get('[data-cy-user-setup-continue]').click();
|
|
||||||
|
|
||||||
// プッシュ通知設定はスキップ
|
|
||||||
|
|
||||||
cy.get('[data-cy-user-setup-continue]').click();
|
|
||||||
|
|
||||||
cy.get('[data-cy-user-setup-continue]').click();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('After user setup', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
cy.resetState();
|
|
||||||
|
|
||||||
// インスタンス初期セットアップ
|
|
||||||
cy.registerUser('admin', 'pass', true);
|
|
||||||
|
|
||||||
// ユーザー作成
|
|
||||||
cy.registerUser('alice', 'alice1234');
|
|
||||||
|
|
||||||
cy.login('alice', 'alice1234');
|
|
||||||
|
|
||||||
// アカウント初期設定ウィザード
|
|
||||||
// 表示に時間がかかるのでデフォルト秒数だとタイムアウトする
|
|
||||||
cy.get('[data-cy-user-setup] [data-cy-modal-window-close]', { timeout: 30000 }).click();
|
|
||||||
cy.get('[data-cy-modal-dialog-ok]').click();
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
// テスト終了直前にページ遷移するようなテストケース(例えばアカウント作成)だと、たぶんCypressのバグでブラウザの内容が次のテストケースに引き継がれてしまう(例えばアカウントが作成し終わった段階からテストが始まる)。
|
|
||||||
// waitを入れることでそれを防止できる
|
|
||||||
cy.wait(1000);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('note', () => {
|
|
||||||
cy.get('[data-cy-open-post-form]').should('be.visible');
|
|
||||||
cy.get('[data-cy-open-post-form]').click();
|
|
||||||
cy.get('[data-cy-post-form-text]').type('Hello, Misskey!');
|
|
||||||
cy.get('[data-cy-open-post-form-submit]').click();
|
|
||||||
|
|
||||||
cy.contains('Hello, Misskey!');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('open note form with hotkey', () => {
|
|
||||||
// Wait until the page loads
|
|
||||||
cy.get('[data-cy-open-post-form]').should('be.visible');
|
|
||||||
// Use trigger() to give different `code` to test if hotkeys also work on non-QWERTY keyboards.
|
|
||||||
cy.document().trigger("keydown", { eventConstructor: 'KeyboardEvent', key: "n", code: "KeyL" });
|
|
||||||
// See if the form is opened
|
|
||||||
cy.get('[data-cy-post-form-text]').should('be.visible');
|
|
||||||
// Close it
|
|
||||||
cy.focused().trigger("keydown", { eventConstructor: 'KeyboardEvent', key: "Escape", code: "Escape" });
|
|
||||||
// See if the form is closed
|
|
||||||
cy.get('[data-cy-post-form-text]').should('not.be.visible');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// TODO: 投稿フォームの公開範囲指定のテスト
|
|
||||||
// TODO: 投稿フォームのファイル添付のテスト
|
|
||||||
// TODO: 投稿フォームのハッシュタグ保持フィールドのテスト
|
|
|
@ -1,35 +0,0 @@
|
||||||
/*
|
|
||||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
|
||||||
* SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
*/
|
|
||||||
|
|
||||||
describe('Router transition', () => {
|
|
||||||
describe('Redirect', () => {
|
|
||||||
// サーバの初期化。ルートのテストに関しては各describeごとに1度だけ実行で十分だと思う(使いまわした方が早い)
|
|
||||||
before(() => {
|
|
||||||
cy.resetState();
|
|
||||||
|
|
||||||
// インスタンス初期セットアップ
|
|
||||||
cy.registerUser('admin', 'pass', true);
|
|
||||||
|
|
||||||
// ユーザー作成
|
|
||||||
cy.registerUser('alice', 'alice1234');
|
|
||||||
|
|
||||||
cy.login('alice', 'alice1234');
|
|
||||||
|
|
||||||
// アカウント初期設定ウィザード
|
|
||||||
// 表示に時間がかかるのでデフォルト秒数だとタイムアウトする
|
|
||||||
cy.get('[data-cy-user-setup] [data-cy-modal-window-close]', { timeout: 30000 }).click();
|
|
||||||
cy.wait(500);
|
|
||||||
cy.get('[data-cy-modal-dialog-ok]').click();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('redirect to user profile', () => {
|
|
||||||
// テストのためだけに用意されたリダイレクト用ルートに飛ぶ
|
|
||||||
cy.visit('/redirect-test');
|
|
||||||
|
|
||||||
// プロフィールページのURLであることを確認する
|
|
||||||
cy.url().should('include', '/@alice')
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
64
cypress/e2e/widgets.cy.js
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
describe('After user signed in', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
cy.resetState();
|
||||||
|
cy.viewport('macbook-16');
|
||||||
|
|
||||||
|
// インスタンス初期セットアップ
|
||||||
|
cy.registerUser('admin', 'pass', true);
|
||||||
|
|
||||||
|
// ユーザー作成
|
||||||
|
cy.registerUser('alice', 'alice1234');
|
||||||
|
|
||||||
|
cy.login('alice', 'alice1234');
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
// テスト終了直前にページ遷移するようなテストケース(例えばアカウント作成)だと、たぶんCypressのバグでブラウザの内容が次のテストケースに引き継がれてしまう(例えばアカウントが作成し終わった段階からテストが始まる)。
|
||||||
|
// waitを入れることでそれを防止できる
|
||||||
|
cy.wait(1000);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('widget edit toggle is visible', () => {
|
||||||
|
cy.get('.mk-widget-edit').should('be.visible');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('widget select should be visible in edit mode', () => {
|
||||||
|
cy.get('.mk-widget-edit').click();
|
||||||
|
cy.get('.mk-widget-select').should('be.visible');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('first widget should be removed', () => {
|
||||||
|
cy.get('.mk-widget-edit').click();
|
||||||
|
cy.get('.customize-container:first-child .remove._button').click();
|
||||||
|
cy.get('.customize-container').should('have.length', 2);
|
||||||
|
});
|
||||||
|
|
||||||
|
function buildWidgetTest(widgetName) {
|
||||||
|
it(`${widgetName} widget should get added`, () => {
|
||||||
|
cy.get('.mk-widget-edit').click();
|
||||||
|
cy.get('.mk-widget-select select').select(widgetName, { force: true });
|
||||||
|
cy.get('.bg._modalBg.transparent').click({ multiple: true, force: true });
|
||||||
|
cy.get('.mk-widget-add').click({ force: true });
|
||||||
|
cy.get(`.mkw-${widgetName}`).should('exist');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
buildWidgetTest('memo');
|
||||||
|
buildWidgetTest('notifications');
|
||||||
|
buildWidgetTest('timeline');
|
||||||
|
buildWidgetTest('calendar');
|
||||||
|
buildWidgetTest('rss');
|
||||||
|
buildWidgetTest('trends');
|
||||||
|
buildWidgetTest('clock');
|
||||||
|
buildWidgetTest('activity');
|
||||||
|
buildWidgetTest('photos');
|
||||||
|
buildWidgetTest('digitalClock');
|
||||||
|
buildWidgetTest('federation');
|
||||||
|
buildWidgetTest('postForm');
|
||||||
|
buildWidgetTest('slideshow');
|
||||||
|
buildWidgetTest('serverMetric');
|
||||||
|
buildWidgetTest('onlineUsers');
|
||||||
|
buildWidgetTest('jobQueue');
|
||||||
|
buildWidgetTest('button');
|
||||||
|
buildWidgetTest('aiscript');
|
||||||
|
});
|
|
@ -1,76 +0,0 @@
|
||||||
/*
|
|
||||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
|
||||||
* SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* flaky
|
|
||||||
describe('After user signed in', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
cy.resetState();
|
|
||||||
cy.viewport('macbook-16');
|
|
||||||
|
|
||||||
// インスタンス初期セットアップ
|
|
||||||
cy.registerUser('admin', 'pass', true);
|
|
||||||
|
|
||||||
// ユーザー作成
|
|
||||||
cy.registerUser('alice', 'alice1234');
|
|
||||||
|
|
||||||
cy.login('alice', 'alice1234');
|
|
||||||
|
|
||||||
// アカウント初期設定ウィザード
|
|
||||||
cy.get('[data-cy-user-setup] [data-cy-modal-window-close]').click();
|
|
||||||
cy.get('[data-cy-modal-dialog-ok]').click();
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
// テスト終了直前にページ遷移するようなテストケース(例えばアカウント作成)だと、たぶんCypressのバグでブラウザの内容が次のテストケースに引き継がれてしまう(例えばアカウントが作成し終わった段階からテストが始まる)。
|
|
||||||
// waitを入れることでそれを防止できる
|
|
||||||
cy.wait(1000);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('widget edit toggle is visible', () => {
|
|
||||||
cy.get('[data-cy-widget-edit]').should('be.visible');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('widget select should be visible in edit mode', () => {
|
|
||||||
cy.get('[data-cy-widget-edit]').click();
|
|
||||||
cy.get('[data-cy-widget-select]').should('be.visible');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('first widget should be removed', () => {
|
|
||||||
cy.get('[data-cy-widget-edit]').click();
|
|
||||||
cy.get('[data-cy-customize-container]:first-child [data-cy-customize-container-remove]._button').click();
|
|
||||||
cy.get('[data-cy-customize-container]').should('have.length', 2);
|
|
||||||
});
|
|
||||||
|
|
||||||
function buildWidgetTest(widgetName) {
|
|
||||||
it(`${widgetName} widget should get added`, () => {
|
|
||||||
cy.get('[data-cy-widget-edit]').click();
|
|
||||||
cy.get('[data-cy-widget-select] select').select(widgetName, { force: true });
|
|
||||||
cy.get('[data-cy-bg]._modalBg[data-cy-transparent]').click({ multiple: true, force: true });
|
|
||||||
cy.get('[data-cy-widget-add]').click({ force: true });
|
|
||||||
cy.get(`[data-cy-mkw-${widgetName}]`).should('exist');
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
buildWidgetTest('memo');
|
|
||||||
buildWidgetTest('notifications');
|
|
||||||
buildWidgetTest('timeline');
|
|
||||||
buildWidgetTest('calendar');
|
|
||||||
buildWidgetTest('rss');
|
|
||||||
buildWidgetTest('trends');
|
|
||||||
buildWidgetTest('clock');
|
|
||||||
buildWidgetTest('activity');
|
|
||||||
buildWidgetTest('photos');
|
|
||||||
buildWidgetTest('digitalClock');
|
|
||||||
buildWidgetTest('federation');
|
|
||||||
buildWidgetTest('postForm');
|
|
||||||
buildWidgetTest('slideshow');
|
|
||||||
buildWidgetTest('serverMetric');
|
|
||||||
buildWidgetTest('onlineUsers');
|
|
||||||
buildWidgetTest('jobQueue');
|
|
||||||
buildWidgetTest('button');
|
|
||||||
buildWidgetTest('aiscript');
|
|
||||||
buildWidgetTest('aichan');
|
|
||||||
});
|
|
||||||
*/
|
|
|
@ -15,7 +15,6 @@
|
||||||
/**
|
/**
|
||||||
* @type {Cypress.PluginConfig}
|
* @type {Cypress.PluginConfig}
|
||||||
*/
|
*/
|
||||||
// eslint-disable-next-line no-unused-vars
|
|
||||||
module.exports = (on, config) => {
|
module.exports = (on, config) => {
|
||||||
// `on` is used to hook into various events Cypress emits
|
// `on` is used to hook into various events Cypress emits
|
||||||
// `config` is the resolved Cypress config
|
// `config` is the resolved Cypress config
|
||||||
|
|
55
cypress/support/commands.js
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
// ***********************************************
|
||||||
|
// This example commands.js shows you how to
|
||||||
|
// create various custom commands and overwrite
|
||||||
|
// existing commands.
|
||||||
|
//
|
||||||
|
// For more comprehensive examples of custom
|
||||||
|
// commands please read more here:
|
||||||
|
// https://on.cypress.io/custom-commands
|
||||||
|
// ***********************************************
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// -- This is a parent command --
|
||||||
|
// Cypress.Commands.add('login', (email, password) => { ... })
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// -- This is a child command --
|
||||||
|
// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// -- This is a dual command --
|
||||||
|
// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// -- This will overwrite an existing command --
|
||||||
|
// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
|
||||||
|
|
||||||
|
Cypress.Commands.add('resetState', () => {
|
||||||
|
cy.window(win => {
|
||||||
|
win.indexedDB.deleteDatabase('keyval-store');
|
||||||
|
});
|
||||||
|
cy.request('POST', '/api/reset-db').as('reset');
|
||||||
|
cy.get('@reset').its('status').should('equal', 204);
|
||||||
|
cy.reload(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
Cypress.Commands.add('registerUser', (username, password, isAdmin = false) => {
|
||||||
|
const route = isAdmin ? '/api/admin/accounts/create' : '/api/signup';
|
||||||
|
|
||||||
|
cy.request('POST', route, {
|
||||||
|
username: username,
|
||||||
|
password: password,
|
||||||
|
}).its('body').as(username);
|
||||||
|
});
|
||||||
|
|
||||||
|
Cypress.Commands.add('login', (username, password) => {
|
||||||
|
cy.visit('/');
|
||||||
|
|
||||||
|
cy.intercept('POST', '/api/signin').as('signin');
|
||||||
|
|
||||||
|
cy.get('[data-cy-signin]').click();
|
||||||
|
cy.get('[data-cy-signin-username] input').type(username);
|
||||||
|
cy.get('[data-cy-signin-password] input').type(`${password}{enter}`);
|
||||||
|
|
||||||
|
cy.wait('@signin').as('signedIn');
|
||||||
|
});
|
|
@ -1,64 +0,0 @@
|
||||||
// ***********************************************
|
|
||||||
// This example commands.js shows you how to
|
|
||||||
// create various custom commands and overwrite
|
|
||||||
// existing commands.
|
|
||||||
//
|
|
||||||
// For more comprehensive examples of custom
|
|
||||||
// commands please read more here:
|
|
||||||
// https://on.cypress.io/custom-commands
|
|
||||||
// ***********************************************
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// -- This is a parent command --
|
|
||||||
// Cypress.Commands.add('login', (email, password) => { ... })
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// -- This is a child command --
|
|
||||||
// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// -- This is a dual command --
|
|
||||||
// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// -- This will overwrite an existing command --
|
|
||||||
// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
|
|
||||||
|
|
||||||
Cypress.Commands.add('visitHome', () => {
|
|
||||||
cy.visit('/');
|
|
||||||
cy.get('button', { timeout: 30000 }).should('be.visible');
|
|
||||||
})
|
|
||||||
|
|
||||||
Cypress.Commands.add('resetState', () => {
|
|
||||||
// iframe.contentWindow.indexedDB.deleteDatabase() がchromeのバグで使用できないため、indexedDBを無効化している。
|
|
||||||
// see https://github.com/misskey-dev/misskey/issues/13605#issuecomment-2053652123
|
|
||||||
/*
|
|
||||||
cy.window().then(win => {
|
|
||||||
win.indexedDB.deleteDatabase('keyval-store');
|
|
||||||
});
|
|
||||||
*/
|
|
||||||
cy.request('POST', '/api/reset-db', {}).as('reset');
|
|
||||||
cy.get('@reset').its('status').should('equal', 204);
|
|
||||||
cy.reload(true);
|
|
||||||
});
|
|
||||||
|
|
||||||
Cypress.Commands.add('registerUser', (username, password, isAdmin = false) => {
|
|
||||||
const route = isAdmin ? '/api/admin/accounts/create' : '/api/signup';
|
|
||||||
|
|
||||||
cy.request('POST', route, {
|
|
||||||
username: username,
|
|
||||||
password: password,
|
|
||||||
}).its('body').as(username);
|
|
||||||
});
|
|
||||||
|
|
||||||
Cypress.Commands.add('login', (username, password) => {
|
|
||||||
cy.visitHome();
|
|
||||||
|
|
||||||
cy.intercept('POST', '/api/signin').as('signin');
|
|
||||||
|
|
||||||
cy.get('[data-cy-signin]').click();
|
|
||||||
cy.get('[data-cy-signin-username] input').type(username);
|
|
||||||
cy.get('[data-cy-signin-password] input').type(`${password}{enter}`);
|
|
||||||
|
|
||||||
cy.wait('@signin').as('signedIn');
|
|
||||||
});
|
|
32
cypress/support/e2e.js
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
// ***********************************************************
|
||||||
|
// This example support/index.js is processed and
|
||||||
|
// loaded automatically before your test files.
|
||||||
|
//
|
||||||
|
// This is a great place to put global configuration and
|
||||||
|
// behavior that modifies Cypress.
|
||||||
|
//
|
||||||
|
// You can change the location of this file or turn off
|
||||||
|
// automatically serving support files with the
|
||||||
|
// 'supportFile' configuration option.
|
||||||
|
//
|
||||||
|
// You can read more here:
|
||||||
|
// https://on.cypress.io/configuration
|
||||||
|
// ***********************************************************
|
||||||
|
|
||||||
|
// Import commands.js using ES2015 syntax:
|
||||||
|
import './commands'
|
||||||
|
|
||||||
|
// Alternatively you can use CommonJS syntax:
|
||||||
|
// require('./commands')
|
||||||
|
|
||||||
|
Cypress.on('uncaught:exception', (err, runnable) => {
|
||||||
|
if ([
|
||||||
|
// Chrome
|
||||||
|
'ResizeObserver loop limit exceeded',
|
||||||
|
|
||||||
|
// Firefox
|
||||||
|
'ResizeObserver loop completed with undelivered notifications',
|
||||||
|
].some(msg => err.message.includes(msg))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
|
@ -1,34 +0,0 @@
|
||||||
// ***********************************************************
|
|
||||||
// This example support/index.js is processed and
|
|
||||||
// loaded automatically before your test files.
|
|
||||||
//
|
|
||||||
// This is a great place to put global configuration and
|
|
||||||
// behavior that modifies Cypress.
|
|
||||||
//
|
|
||||||
// You can change the location of this file or turn off
|
|
||||||
// automatically serving support files with the
|
|
||||||
// 'supportFile' configuration option.
|
|
||||||
//
|
|
||||||
// You can read more here:
|
|
||||||
// https://on.cypress.io/configuration
|
|
||||||
// ***********************************************************
|
|
||||||
|
|
||||||
// Import commands.js using ES2015 syntax:
|
|
||||||
import './commands'
|
|
||||||
|
|
||||||
// Alternatively you can use CommonJS syntax:
|
|
||||||
// require('./commands')
|
|
||||||
|
|
||||||
Cypress.on('uncaught:exception', (err, runnable) => {
|
|
||||||
if ([
|
|
||||||
'The source image cannot be decoded',
|
|
||||||
|
|
||||||
// Chrome
|
|
||||||
'ResizeObserver loop limit exceeded',
|
|
||||||
|
|
||||||
// Firefox
|
|
||||||
'ResizeObserver loop completed with undelivered notifications',
|
|
||||||
].some(msg => err.message.includes(msg))) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
});
|
|
|
@ -1,19 +0,0 @@
|
||||||
declare global {
|
|
||||||
namespace Cypress {
|
|
||||||
interface Chainable {
|
|
||||||
login(username: string, password: string): Chainable<void>;
|
|
||||||
|
|
||||||
registerUser(
|
|
||||||
username: string,
|
|
||||||
password: string,
|
|
||||||
isAdmin?: boolean
|
|
||||||
): Chainable<void>;
|
|
||||||
|
|
||||||
resetState(): Chainable<void>;
|
|
||||||
|
|
||||||
visitHome(): Chainable<void>;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export {}
|
|
|
@ -1,8 +0,0 @@
|
||||||
{
|
|
||||||
"compilerOptions": {
|
|
||||||
"lib": ["dom", "es5"],
|
|
||||||
"target": "es5",
|
|
||||||
"types": ["cypress", "node"]
|
|
||||||
},
|
|
||||||
"include": ["./**/*.ts"]
|
|
||||||
}
|
|
57
dev/docker-compose.yml.example
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
version: "3"
|
||||||
|
|
||||||
|
services:
|
||||||
|
web:
|
||||||
|
image: docker.io/thatonecalculator/calckey
|
||||||
|
build: ..
|
||||||
|
container_name: calckey_web
|
||||||
|
restart: always
|
||||||
|
depends_on:
|
||||||
|
- db
|
||||||
|
- redis
|
||||||
|
# - es
|
||||||
|
ports:
|
||||||
|
- "3000:3000"
|
||||||
|
networks:
|
||||||
|
- network
|
||||||
|
# - web
|
||||||
|
volumes:
|
||||||
|
- ../files:/calckey/files
|
||||||
|
- ../.config:/calckey/.config:ro
|
||||||
|
|
||||||
|
redis:
|
||||||
|
restart: always
|
||||||
|
container_name: calckey_redis
|
||||||
|
image: docker.io/redis:7.0-alpine
|
||||||
|
networks:
|
||||||
|
- network
|
||||||
|
volumes:
|
||||||
|
- ../redis:/data
|
||||||
|
|
||||||
|
db:
|
||||||
|
restart: always
|
||||||
|
image: docker.io/postgres:12.2-alpine
|
||||||
|
container_name: calckey_db
|
||||||
|
networks:
|
||||||
|
- network
|
||||||
|
env_file:
|
||||||
|
- ../.config/docker.env
|
||||||
|
volumes:
|
||||||
|
- ../db:/var/lib/postgresql/data
|
||||||
|
|
||||||
|
# es:
|
||||||
|
# restart: always
|
||||||
|
# image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.4.2
|
||||||
|
# environment:
|
||||||
|
# - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
|
||||||
|
# - "TAKE_FILE_OWNERSHIP=111"
|
||||||
|
# networks:
|
||||||
|
# - network
|
||||||
|
# volumes:
|
||||||
|
# - ./elasticsearch:/usr/share/elasticsearch/data
|
||||||
|
|
||||||
|
networks:
|
||||||
|
network:
|
||||||
|
# web:
|
||||||
|
# external:
|
||||||
|
# name: web
|
47
docker-README.md
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
# 🐳 Running a Calckey instance with Docker
|
||||||
|
|
||||||
|
## Pre-built docker container
|
||||||
|
[thatonecalculator/calckey](https://hub.docker.com/r/thatonecalculator/calckey)
|
||||||
|
|
||||||
|
## `docker-compose`
|
||||||
|
|
||||||
|
There is a `docker-compose.yml` in the root of the project that you can use to build the container from source
|
||||||
|
|
||||||
|
- .config/docker.env (**db config settings**)
|
||||||
|
- .config/default.yml (**calckey instance settings**)
|
||||||
|
|
||||||
|
## Configuring
|
||||||
|
|
||||||
|
Rename the files:
|
||||||
|
|
||||||
|
`cp .config/default_example.yml .config/default.yml`
|
||||||
|
|
||||||
|
`cp .config/example.env .config/docker.env`
|
||||||
|
|
||||||
|
then edit them according to your environment.
|
||||||
|
You can configure `docker.env` with anything you like, but you will have to pay attention to the `default.yml` file:
|
||||||
|
- `url` should be set to the URL you will be hosting the web interface for the instance at.
|
||||||
|
- `host`, `db`, `user`, `pass` will have to be configured in the `PostgreSQL configuration` section - `host` is the name of the postgres container (eg: *calckey_db_1*), and the others should match your `docker.env`.
|
||||||
|
- `host`will need to be configured in the *Redis configuration* section - it is the name of the redis container (eg: *calckey_redis_1*)
|
||||||
|
|
||||||
|
Everything else can be left as-is.
|
||||||
|
|
||||||
|
## Running docker-compose
|
||||||
|
|
||||||
|
The [prebuilt container for calckey](https://hub.docker.com/r/thatonecalculator/calckey) is fairly large, and may take a few minutes to download and extract using docker.
|
||||||
|
|
||||||
|
Copy `docker-compose.yml` and the `config/` to a directory, then run the **docker-compose** command:
|
||||||
|
`docker-compose up -d`.
|
||||||
|
|
||||||
|
NOTE: This will take some time to come fully online, even after download and extracting the container images, and it may emit some error messages before completing successfully. Specifically, the `db` container needs to initialize and so isn't available to the `web` container right away. Only once the `db` container comes online does the `web` container start building and initializing the calckey tables.
|
||||||
|
|
||||||
|
Once the instance is up you can use a web browser to access the web interface at `http://serverip:3000` (where `serverip` is the IP of the server you are running the calckey instance on).
|
||||||
|
|
||||||
|
## Docker for development
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd dev/
|
||||||
|
docker-compose build
|
||||||
|
docker-compose run --rm web pnpm run init
|
||||||
|
docker-compose up -d
|
||||||
|
```
|
58
docker-compose.yml
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
version: "3"
|
||||||
|
|
||||||
|
services:
|
||||||
|
web:
|
||||||
|
image: docker.io/thatonecalculator/calckey
|
||||||
|
container_name: calckey_web
|
||||||
|
restart: unless-stopped
|
||||||
|
depends_on:
|
||||||
|
- db
|
||||||
|
- redis
|
||||||
|
# - es
|
||||||
|
ports:
|
||||||
|
- "3000:3000"
|
||||||
|
networks:
|
||||||
|
- calcnet
|
||||||
|
# - web
|
||||||
|
environment:
|
||||||
|
NODE_ENV: production
|
||||||
|
volumes:
|
||||||
|
- ./files:/calckey/files
|
||||||
|
- ./.config:/calckey/.config:ro
|
||||||
|
|
||||||
|
redis:
|
||||||
|
restart: unless-stopped
|
||||||
|
image: docker.io/redis:7.0-alpine
|
||||||
|
container_name: calckey_redis
|
||||||
|
networks:
|
||||||
|
- calcnet
|
||||||
|
volumes:
|
||||||
|
- ./redis:/data
|
||||||
|
|
||||||
|
db:
|
||||||
|
restart: unless-stopped
|
||||||
|
image: docker.io/postgres:12.2-alpine
|
||||||
|
container_name: calckey_db
|
||||||
|
networks:
|
||||||
|
- calcnet
|
||||||
|
env_file:
|
||||||
|
- .config/docker.env
|
||||||
|
volumes:
|
||||||
|
- ./db:/var/lib/postgresql/data
|
||||||
|
|
||||||
|
# es:
|
||||||
|
# restart: unless-stopped
|
||||||
|
# image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.4.2
|
||||||
|
# environment:
|
||||||
|
# - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
|
||||||
|
# - "TAKE_FILE_OWNERSHIP=111"
|
||||||
|
# networks:
|
||||||
|
# - calcnet
|
||||||
|
# volumes:
|
||||||
|
# - ./elasticsearch:/usr/share/elasticsearch/data
|
||||||
|
|
||||||
|
networks:
|
||||||
|
calcnet:
|
||||||
|
# web:
|
||||||
|
# external:
|
||||||
|
# name: web
|
251
eslint/locale.js
|
@ -1,251 +0,0 @@
|
||||||
/*
|
|
||||||
* SPDX-FileCopyrightText: dakkar and other Sharkey contributors
|
|
||||||
* SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* This is a ESLint rule to report use of the `i18n.ts` and `i18n.tsx`
|
|
||||||
* objects that reference translation items that don't actually exist
|
|
||||||
* in the lexicon (the `locale/` files)
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* given a MemberExpression node, collects all the member names
|
|
||||||
*
|
|
||||||
* e.g. for a bit of code like `foo=one.two.three`, `collectMembers`
|
|
||||||
* called on the node for `three` would return `['one', 'two',
|
|
||||||
* 'three']`
|
|
||||||
*/
|
|
||||||
function collectMembers(node) {
|
|
||||||
if (!node) return [];
|
|
||||||
if (node.type !== 'MemberExpression') return [];
|
|
||||||
// this is something like `foo[bar]`
|
|
||||||
if (node.computed) return [];
|
|
||||||
return [ node.property.name, ...collectMembers(node.parent) ];
|
|
||||||
}
|
|
||||||
|
|
||||||
/* given an object and an array of names, recursively descends the
|
|
||||||
* object via those names
|
|
||||||
*
|
|
||||||
* e.g. `walkDown({one:{two:{three:15}}},['one','two','three'])` would
|
|
||||||
* return 15
|
|
||||||
*/
|
|
||||||
function walkDown(locale, path) {
|
|
||||||
if (!locale) return null;
|
|
||||||
if (!path || path.length === 0 || !path[0]) return locale;
|
|
||||||
return walkDown(locale[path[0]], path.slice(1));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* given a MemberExpression node, returns its attached CallExpression
|
|
||||||
* node if present
|
|
||||||
*
|
|
||||||
* e.g. for a bit of code like `foo=one.two.three()`,
|
|
||||||
* `findCallExpression` called on the node for `three` would return
|
|
||||||
* the node for function call (which is the parent of the `one` and
|
|
||||||
* `two` nodes, and holds the nodes for the argument list)
|
|
||||||
*
|
|
||||||
* if the code had been `foo=one.two.three`, `findCallExpression`
|
|
||||||
* would have returned null, because there's no function call attached
|
|
||||||
* to the MemberExpressions
|
|
||||||
*/
|
|
||||||
function findCallExpression(node) {
|
|
||||||
if (!node.parent) return null;
|
|
||||||
|
|
||||||
// the second half of this guard protects from cases like
|
|
||||||
// `foo(one.two.three)` where the CallExpression is parent of the
|
|
||||||
// MemberExpressions, but via `arguments`, not `callee`
|
|
||||||
if (node.parent.type === 'CallExpression' && node.parent.callee === node) return node.parent;
|
|
||||||
if (node.parent.type === 'MemberExpression') return findCallExpression(node.parent);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// same, but for Vue expressions (`<I18n :src="i18n.ts.foo">`)
|
|
||||||
function findVueExpression(node) {
|
|
||||||
if (!node.parent) return null;
|
|
||||||
|
|
||||||
if (node.parent.type.match(/^VExpr/) && node.parent.expression === node) return node.parent;
|
|
||||||
if (node.parent.type === 'MemberExpression') return findVueExpression(node.parent);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
function areArgumentsOneObject(node) {
|
|
||||||
return node.arguments.length === 1 &&
|
|
||||||
node.arguments[0].type === 'ObjectExpression';
|
|
||||||
}
|
|
||||||
|
|
||||||
// only call if `areArgumentsOneObject(node)` is true
|
|
||||||
function getArgumentObjectProperties(node) {
|
|
||||||
return new Set(node.arguments[0].properties.map(
|
|
||||||
p => {
|
|
||||||
if (p.key && p.key.type === 'Identifier') return p.key.name;
|
|
||||||
return null;
|
|
||||||
},
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
function getTranslationParameters(translation) {
|
|
||||||
return new Set(Array.from(translation.matchAll(/\{(\w+)\}/g)).map( m => m[1] ));
|
|
||||||
}
|
|
||||||
|
|
||||||
function setDifference(a,b) {
|
|
||||||
const result = [];
|
|
||||||
for (const element of a.values()) {
|
|
||||||
if (!b.has(element)) {
|
|
||||||
result.push(element);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* the actual rule body
|
|
||||||
*/
|
|
||||||
function theRuleBody(context,node) {
|
|
||||||
// we get the locale/translations via the options; it's the data
|
|
||||||
// that goes into a specific language's JSON file, see
|
|
||||||
// `scripts/build-assets.mjs`
|
|
||||||
const locale = context.options[0];
|
|
||||||
|
|
||||||
// sometimes we get MemberExpression nodes that have a
|
|
||||||
// *descendent* with the right identifier: skip them, we'll get
|
|
||||||
// the right ones as well
|
|
||||||
if (node.object?.name !== 'i18n') {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// `method` is going to be `'ts'` or `'tsx'`, `path` is going to
|
|
||||||
// be the various translation steps/names
|
|
||||||
const [ method, ...path ] = collectMembers(node);
|
|
||||||
const pathStr = `i18n.${method}.${path.join('.')}`;
|
|
||||||
|
|
||||||
// does that path point to a real translation?
|
|
||||||
const translation = walkDown(locale, path);
|
|
||||||
if (!translation) {
|
|
||||||
context.report({
|
|
||||||
node,
|
|
||||||
message: `translation missing for ${pathStr}`,
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// we hit something weird, assume the programmers know what
|
|
||||||
// they're doing (this is usually some complicated slicing of
|
|
||||||
// the translation structure)
|
|
||||||
if (typeof(translation) !== 'string') return;
|
|
||||||
|
|
||||||
const callExpression = findCallExpression(node);
|
|
||||||
const vueExpression = findVueExpression(node);
|
|
||||||
|
|
||||||
// some more checks on how the translation is called
|
|
||||||
if (method === 'ts') {
|
|
||||||
// the `<I18n> component gets parametric translations via
|
|
||||||
// `i18n.ts.*`, but we error out elsewhere
|
|
||||||
if (translation.match(/\{/) && !vueExpression) {
|
|
||||||
context.report({
|
|
||||||
node,
|
|
||||||
message: `translation for ${pathStr} is parametric, but called via 'ts'`,
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (callExpression) {
|
|
||||||
context.report({
|
|
||||||
node,
|
|
||||||
message: `translation for ${pathStr} is not parametric, but is called as a function`,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (method === 'tsx') {
|
|
||||||
if (!translation.match(/\{/)) {
|
|
||||||
context.report({
|
|
||||||
node,
|
|
||||||
message: `translation for ${pathStr} is not parametric, but called via 'tsx'`,
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!callExpression && !vueExpression) {
|
|
||||||
context.report({
|
|
||||||
node,
|
|
||||||
message: `translation for ${pathStr} is parametric, but not called as a function`,
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// we're not currently checking arguments when used via the
|
|
||||||
// `<I18n>` component, because it's too complicated (also, it
|
|
||||||
// would have to be done inside the `if (method === 'ts')`)
|
|
||||||
if (!callExpression) return;
|
|
||||||
|
|
||||||
if (!areArgumentsOneObject(callExpression)) {
|
|
||||||
context.report({
|
|
||||||
node,
|
|
||||||
message: `translation for ${pathStr} should be called with a single object as argument`,
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const translationParameters = getTranslationParameters(translation);
|
|
||||||
const parameterCount = translationParameters.size;
|
|
||||||
const callArguments = getArgumentObjectProperties(callExpression);
|
|
||||||
const argumentCount = callArguments.size;
|
|
||||||
|
|
||||||
if (parameterCount !== argumentCount) {
|
|
||||||
context.report({
|
|
||||||
node,
|
|
||||||
message: `translation for ${pathStr} has ${parameterCount} parameters, but is called with ${argumentCount} arguments`,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// node 20 doesn't have `Set.difference`...
|
|
||||||
const extraArguments = setDifference(callArguments, translationParameters);
|
|
||||||
const missingArguments = setDifference(translationParameters, callArguments);
|
|
||||||
|
|
||||||
if (extraArguments.length > 0) {
|
|
||||||
context.report({
|
|
||||||
node,
|
|
||||||
message: `translation for ${pathStr} passes unused arguments ${extraArguments.join(' ')}`,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (missingArguments.length > 0) {
|
|
||||||
context.report({
|
|
||||||
node,
|
|
||||||
message: `translation for ${pathStr} does not pass arguments ${missingArguments.join(' ')}`,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function theRule(context) {
|
|
||||||
// we get the locale/translations via the options; it's the data
|
|
||||||
// that goes into a specific language's JSON file, see
|
|
||||||
// `scripts/build-assets.mjs`
|
|
||||||
const locale = context.options[0];
|
|
||||||
|
|
||||||
// for all object member access that have an identifier 'i18n'...
|
|
||||||
return context.getSourceCode().parserServices.defineTemplateBodyVisitor(
|
|
||||||
{
|
|
||||||
// this is for <template> bits, needs work
|
|
||||||
'MemberExpression:has(Identifier[name=i18n])': (node) => theRuleBody(context, node),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
// this is for normal code
|
|
||||||
'MemberExpression:has(Identifier[name=i18n])': (node) => theRuleBody(context, node),
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
meta: {
|
|
||||||
type: 'problem',
|
|
||||||
docs: {
|
|
||||||
description: 'assert that all translations used are present in the locale files',
|
|
||||||
},
|
|
||||||
schema: [
|
|
||||||
// here we declare that we need the locale/translation as a
|
|
||||||
// generic object
|
|
||||||
{ type: 'object', additionalProperties: true },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
create: theRule,
|
|
||||||
};
|
|
|
@ -1,54 +0,0 @@
|
||||||
/*
|
|
||||||
* SPDX-FileCopyrightText: dakkar and other Sharkey contributors
|
|
||||||
* SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
*/
|
|
||||||
|
|
||||||
const {RuleTester} = require("eslint");
|
|
||||||
const localeRule = require("./locale");
|
|
||||||
|
|
||||||
const locale = { foo: { bar: 'ok', baz: 'good {x}' }, top: '123' };
|
|
||||||
|
|
||||||
const ruleTester = new RuleTester({
|
|
||||||
languageOptions: {
|
|
||||||
parser: require('vue-eslint-parser'),
|
|
||||||
ecmaVersion: 2015,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
function testCase(code,errors) {
|
|
||||||
return { code, errors, options: [ locale ], filename: 'test.ts' };
|
|
||||||
}
|
|
||||||
function testCaseVue(code,errors) {
|
|
||||||
return { code, errors, options: [ locale ], filename: 'test.vue' };
|
|
||||||
}
|
|
||||||
|
|
||||||
ruleTester.run(
|
|
||||||
'sharkey-locale',
|
|
||||||
localeRule,
|
|
||||||
{
|
|
||||||
valid: [
|
|
||||||
testCase('i18n.ts.foo.bar'),
|
|
||||||
testCase('i18n.ts.top'),
|
|
||||||
testCase('i18n.tsx.foo.baz({x:1})'),
|
|
||||||
testCase('whatever.i18n.ts.blah.blah'),
|
|
||||||
testCase('whatever.i18n.tsx.does.not.matter'),
|
|
||||||
testCase('whatever(i18n.ts.foo.bar)'),
|
|
||||||
testCaseVue('<template><p>{{ i18n.ts.foo.bar }}</p></template>'),
|
|
||||||
testCaseVue('<template><I18n :src="i18n.ts.foo.baz"/></template>'),
|
|
||||||
// we don't detect the problem here, but should still accept it
|
|
||||||
testCase('i18n.ts.foo["something"]'),
|
|
||||||
testCase('i18n.ts.foo[something]'),
|
|
||||||
],
|
|
||||||
invalid: [
|
|
||||||
testCase('i18n.ts.not', 1),
|
|
||||||
testCase('i18n.tsx.deep.not', 1),
|
|
||||||
testCase('i18n.tsx.deep.not({x:12})', 1),
|
|
||||||
testCase('i18n.tsx.top({x:1})', 1),
|
|
||||||
testCase('i18n.ts.foo.baz', 1),
|
|
||||||
testCase('i18n.tsx.foo.baz', 1),
|
|
||||||
testCase('i18n.tsx.foo.baz({y:2})', 2),
|
|
||||||
testCaseVue('<template><p>{{ i18n.ts.not }}</p></template>', 1),
|
|
||||||
testCaseVue('<template><I18n :src="i18n.ts.not"/></template>', 1),
|
|
||||||
],
|
|
||||||
},
|
|
||||||
);
|
|
|
@ -1 +0,0 @@
|
||||||
Subproject commit cae981eb4c5189ea9ea3230e83b876a5068df7d1
|
|
71
gulpfile.js
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
/**
|
||||||
|
* Gulp tasks
|
||||||
|
*/
|
||||||
|
|
||||||
|
const fs = require('fs');
|
||||||
|
const gulp = require('gulp');
|
||||||
|
const replace = require('gulp-replace');
|
||||||
|
const terser = require('gulp-terser');
|
||||||
|
const cssnano = require('gulp-cssnano');
|
||||||
|
|
||||||
|
const locales = require('./locales');
|
||||||
|
const meta = require('./package.json');
|
||||||
|
|
||||||
|
gulp.task('copy:backend:views', () =>
|
||||||
|
gulp.src('./packages/backend/src/server/web/views/**/*').pipe(gulp.dest('./packages/backend/built/server/web/views'))
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
gulp.task('copy:backend:custom', () =>
|
||||||
|
gulp.src('./custom/assets/**/*').pipe(gulp.dest('./packages/backend/assets/'))
|
||||||
|
);
|
||||||
|
|
||||||
|
gulp.task('copy:client:fonts', () =>
|
||||||
|
gulp.src('./packages/client/node_modules/three/examples/fonts/**/*').pipe(gulp.dest('./built/_client_dist_/fonts/'))
|
||||||
|
);
|
||||||
|
|
||||||
|
gulp.task('copy:client:phosphor', () =>
|
||||||
|
gulp.src('./node_modules/phosphor-icons/src/fonts/*').pipe(gulp.dest('./built/_client_dist_/phosphor/'))
|
||||||
|
);
|
||||||
|
|
||||||
|
gulp.task('copy:client:locales', cb => {
|
||||||
|
fs.mkdirSync('./built/_client_dist_/locales', { recursive: true });
|
||||||
|
|
||||||
|
const v = { '_version_': meta.version };
|
||||||
|
|
||||||
|
for (const [lang, locale] of Object.entries(locales)) {
|
||||||
|
fs.writeFileSync(`./built/_client_dist_/locales/${lang}.${meta.version}.json`, JSON.stringify({ ...locale, ...v }), 'utf-8');
|
||||||
|
}
|
||||||
|
|
||||||
|
cb();
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
gulp.task('build:backend:script', () => {
|
||||||
|
return gulp.src(['./packages/backend/src/server/web/boot.js', './packages/backend/src/server/web/bios.js', './packages/backend/src/server/web/cli.js'])
|
||||||
|
.pipe(replace('LANGS', JSON.stringify(Object.keys(locales))))
|
||||||
|
.pipe(terser({
|
||||||
|
toplevel: true
|
||||||
|
}))
|
||||||
|
.pipe(gulp.dest('./packages/backend/built/server/web/'));
|
||||||
|
});
|
||||||
|
|
||||||
|
gulp.task('build:backend:style', () => {
|
||||||
|
return gulp.src(['./packages/backend/src/server/web/style.css', './packages/backend/src/server/web/bios.css', './packages/backend/src/server/web/cli.css'])
|
||||||
|
.pipe(cssnano({
|
||||||
|
zindex: false
|
||||||
|
}))
|
||||||
|
.pipe(gulp.dest('./packages/backend/built/server/web/'));
|
||||||
|
});
|
||||||
|
|
||||||
|
gulp.task('build', gulp.parallel(
|
||||||
|
'copy:client:locales', 'copy:backend:views', 'copy:backend:custom', 'build:backend:script', 'build:backend:style', 'copy:client:fonts', 'copy:client:phosphor'
|
||||||
|
));
|
||||||
|
|
||||||
|
gulp.task('default', gulp.task('build'));
|
||||||
|
|
||||||
|
gulp.task('watch', () => {
|
||||||
|
gulp.watch([
|
||||||
|
'./packages/*/src/**/*',
|
||||||
|
], { ignoreInitial: false }, gulp.task('build'));
|
||||||
|
});
|
|
@ -1,7 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# SPDX-FileCopyrightText: syuilo and misskey-project
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
|
|
||||||
PORT=$(grep '^port:' /sharkey/.config/default.yml | awk 'NR==1{print $2; exit}')
|
|
||||||
curl -Sfso/dev/null "http://localhost:${PORT}/healthz"
|
|
|
@ -1,41 +0,0 @@
|
||||||
<!--
|
|
||||||
SPDX-FileCopyrightText: syuilo and misskey-project
|
|
||||||
SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
-->
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div :class="[$style.root]">
|
|
||||||
<div :inert="disabled" :class="[{ [$style.disabled]: disabled }]">
|
|
||||||
<slot></slot>
|
|
||||||
</div>
|
|
||||||
<div v-if="disabled" :class="[$style.cover]"></div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script lang="ts" setup>
|
|
||||||
defineProps<{
|
|
||||||
disabled?: boolean;
|
|
||||||
}>();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" module>
|
|
||||||
.root {
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
.disabled {
|
|
||||||
opacity: 0.7;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cover {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
cursor: not-allowed;
|
|
||||||
--color: color(from var(--error) srgb r g b / 0.25);
|
|
||||||
background-size: auto auto;
|
|
||||||
background-image: repeating-linear-gradient(135deg, transparent, transparent 10px, var(--color) 4px, var(--color) 14px);
|
|
||||||
}
|
|
||||||
</style>
|
|
|
@ -1 +0,0 @@
|
||||||
使われなくなったけど消すのは勿体ない(将来使えるかもしれない)コードを入れておくとこ
|
|
70
issue_template/bug.yaml
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
name: Bug Report
|
||||||
|
about: File a bug report
|
||||||
|
title: "[Bug]: "
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
Thanks for taking the time to fill out this bug report!
|
||||||
|
- type: textarea
|
||||||
|
id: what-happened
|
||||||
|
attributes:
|
||||||
|
label: What happened?
|
||||||
|
description: Please give us a brief description of what happened.
|
||||||
|
placeholder: Tell us what you see!
|
||||||
|
value: "A bug happened!"
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: what-is-expected
|
||||||
|
attributes:
|
||||||
|
label: What did you expect to happen?
|
||||||
|
description: Please give us a brief description of what you expected to happen.
|
||||||
|
placeholder: Tell us what you wish happened!
|
||||||
|
value: "Instead of x, y should happen instead!"
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
id: version
|
||||||
|
attributes:
|
||||||
|
label: Version
|
||||||
|
description: What version of calckey is your instance running? You can find this by clicking your instance's logo at the bottom left and then clicking instance information.
|
||||||
|
placeholder: Calckey Version 13.0.4
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
id: instance
|
||||||
|
attributes:
|
||||||
|
label: Instance
|
||||||
|
description: What instance of calckey are you using?
|
||||||
|
placeholder: stop.voring.me
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: dropdown
|
||||||
|
id: browsers
|
||||||
|
attributes:
|
||||||
|
label: What browser are you using?
|
||||||
|
multiple: false
|
||||||
|
options:
|
||||||
|
- Firefox
|
||||||
|
- Chrome
|
||||||
|
- Brave
|
||||||
|
- Librewolf
|
||||||
|
- Chromium
|
||||||
|
- Safari
|
||||||
|
- Microsoft Edge
|
||||||
|
- Other (Please Specify)
|
||||||
|
- type: textarea
|
||||||
|
id: logs
|
||||||
|
attributes:
|
||||||
|
label: Relevant log output
|
||||||
|
description: Please copy and paste any relevant log output. You can find your log by inspecting the page, and going to the "console" tab. This will be automatically formatted into code, so no need for backticks.
|
||||||
|
render: shell
|
||||||
|
- type: checkboxes
|
||||||
|
id: terms
|
||||||
|
attributes:
|
||||||
|
label: Contribution Guidelines
|
||||||
|
description: By submitting this issue, you agree to follow our [Contribution Guidelines](https://codeberg.org/calckey/calckey/src/branch/develop/CONTRIBUTING.md)
|
||||||
|
options:
|
||||||
|
- label: I agree to follow this project's Contribution Guidelines
|
||||||
|
required: true
|
70
issue_template/feature.yaml
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
name: Feature Request
|
||||||
|
about: Request a Feature
|
||||||
|
title: "[Feature]: "
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
Thanks for taking the time to fill out this feature request!
|
||||||
|
- type: textarea
|
||||||
|
id: what-feature
|
||||||
|
attributes:
|
||||||
|
label: What feature would you like implemented?
|
||||||
|
description: Please give us a brief description of what you'd like.
|
||||||
|
placeholder: Tell us what you want!
|
||||||
|
value: "x feature would be great!"
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: why-add-feature
|
||||||
|
attributes:
|
||||||
|
label: Why should we add this feature?
|
||||||
|
description: Please give us a brief description of why your feature is important.
|
||||||
|
placeholder: Tell us why you want this feature!
|
||||||
|
value: "x feature is super useful because y!"
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
id: version
|
||||||
|
attributes:
|
||||||
|
label: Version
|
||||||
|
description: What version of calckey is your instance running? You can find this by clicking your instance's logo at the bottom left and then clicking instance information.
|
||||||
|
placeholder: Calckey Version 13.0.4
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
id: instance
|
||||||
|
attributes:
|
||||||
|
label: Instance
|
||||||
|
description: What instance of calckey are you using?
|
||||||
|
placeholder: stop.voring.me
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: dropdown
|
||||||
|
id: browsers
|
||||||
|
attributes:
|
||||||
|
label: What browser are you using?
|
||||||
|
multiple: false
|
||||||
|
options:
|
||||||
|
- Firefox
|
||||||
|
- Chrome
|
||||||
|
- Brave
|
||||||
|
- Librewolf
|
||||||
|
- Chromium
|
||||||
|
- Safari
|
||||||
|
- Microsoft Edge
|
||||||
|
- Other (Please Specify)
|
||||||
|
- type: textarea
|
||||||
|
id: logs
|
||||||
|
attributes:
|
||||||
|
label: Relevant log output
|
||||||
|
description: Please copy and paste any relevant log output. You can find your log by inspecting the page, and going to the "console" tab. This will be automatically formatted into code, so no need for backticks.
|
||||||
|
render: shell
|
||||||
|
- type: checkboxes
|
||||||
|
id: terms
|
||||||
|
attributes:
|
||||||
|
label: Contribution Guidelines
|
||||||
|
description: By submitting this issue, you agree to follow our [Contribution Guidelines](https://codeberg.org/calckey/calckey/src/branch/develop/CONTRIBUTING.md)
|
||||||
|
options:
|
||||||
|
- label: I agree to follow this project's Contribution Guidelines
|
||||||
|
required: true
|
|
@ -2,25 +2,22 @@
|
||||||
_lang_: "বাংলা"
|
_lang_: "বাংলা"
|
||||||
headlineMisskey: "নোট ব্যাবহার করে সংযুক্ত নেটওয়ার্ক"
|
headlineMisskey: "নোট ব্যাবহার করে সংযুক্ত নেটওয়ার্ক"
|
||||||
introMisskey: "স্বাগতম! মিসকি একটি ওপেন সোর্স, ডিসেন্ট্রালাইজড মাইক্রোব্লগিং পরিষেবা। \n\"নোট\" তৈরির মাধ্যমে যা ঘটছে তা সবার সাথে শেয়ার করুন 📡\n\"রিঅ্যাকশন\" গুলির মাধ্যমে যেকোনো নোট সম্পর্কে আপনার অনুভূতি ব্যাক্ত করতে পারেন 👍\nএকটি নতুন দুনিয়া ঘুরে দেখুন 🚀\n"
|
introMisskey: "স্বাগতম! মিসকি একটি ওপেন সোর্স, ডিসেন্ট্রালাইজড মাইক্রোব্লগিং পরিষেবা। \n\"নোট\" তৈরির মাধ্যমে যা ঘটছে তা সবার সাথে শেয়ার করুন 📡\n\"রিঅ্যাকশন\" গুলির মাধ্যমে যেকোনো নোট সম্পর্কে আপনার অনুভূতি ব্যাক্ত করতে পারেন 👍\nএকটি নতুন দুনিয়া ঘুরে দেখুন 🚀\n"
|
||||||
poweredByMisskeyDescription: "{name} হল ওপেন সোর্স প্ল্যাটফর্ম <b>Misskey</b>-এর সার্ভারগুলির একটি৷"
|
|
||||||
monthAndDay: "{day}/{month}"
|
monthAndDay: "{day}/{month}"
|
||||||
search: "খুঁজুন"
|
search: "খুঁজুন"
|
||||||
notifications: "বিজ্ঞপ্তি"
|
notifications: "বিজ্ঞপ্তি"
|
||||||
username: "ব্যবহারকারীর নাম"
|
username: "ব্যবহারকারীর নাম"
|
||||||
password: "পাসওয়ার্ড"
|
password: "পাসওয়ার্ড"
|
||||||
forgotPassword: "পাসওয়ার্ড ভুলে গেছেন"
|
forgotPassword: "পাসওয়ার্ড ভুলে গেছেন"
|
||||||
fetchingAsApObject: "ফেডিভার্স থেকে খবর আনা হচ্ছে..."
|
fetchingAsApObject: "ফেডিভার্স থেকে খবর আনা হচ্ছে"
|
||||||
ok: "ঠিক"
|
ok: "ঠিক"
|
||||||
gotIt: "বুঝেছি"
|
gotIt: "বুঝেছি"
|
||||||
cancel: "বাতিল"
|
cancel: "বাতিল"
|
||||||
noThankYou: "না, ধন্যবাদ"
|
|
||||||
enterUsername: "ইউজারনেম লিখুন"
|
enterUsername: "ইউজারনেম লিখুন"
|
||||||
renotedBy: "{user} রিনোট করেছেন"
|
renotedBy: "{user} রিনোট করেছেন"
|
||||||
noNotes: "কোন নোট নেই"
|
noNotes: "কোন নোট নেই"
|
||||||
noNotifications: "কোনো বিজ্ঞপ্তি নেই"
|
noNotifications: "কোনো বিজ্ঞপ্তি নেই"
|
||||||
instance: "ইন্সট্যান্স"
|
instance: "ইন্সট্যান্স"
|
||||||
settings: "সেটিংস"
|
settings: "সেটিংস"
|
||||||
notificationSettings: "বিজ্ঞপ্তির সেটিংস"
|
|
||||||
basicSettings: "সাধারণ সেটিংস"
|
basicSettings: "সাধারণ সেটিংস"
|
||||||
otherSettings: "অন্যান্য সেটিংস"
|
otherSettings: "অন্যান্য সেটিংস"
|
||||||
openInWindow: "নতুন উইন্ডোতে খুলা"
|
openInWindow: "নতুন উইন্ডোতে খুলা"
|
||||||
|
@ -45,20 +42,12 @@ pin: "পিন করা"
|
||||||
unpin: "পিন সরান"
|
unpin: "পিন সরান"
|
||||||
copyContent: "বিষয়বস্তু কপি করুন"
|
copyContent: "বিষয়বস্তু কপি করুন"
|
||||||
copyLink: "লিঙ্ক কপি করুন"
|
copyLink: "লিঙ্ক কপি করুন"
|
||||||
copyLinkRenote: "রিনোট লিঙ্ক কপি করুন"
|
|
||||||
delete: "মুছুন"
|
delete: "মুছুন"
|
||||||
deleteAndEdit: "মুছুন এবং সম্পাদনা করুন"
|
deleteAndEdit: "মুছুন এবং সম্পাদনা করুন"
|
||||||
deleteAndEditConfirm: "আপনি কি এই নোটটি মুছে এটি সম্পাদনা করার বিষয়ে নিশ্চিত? আপনি এটির সমস্ত রিঅ্যাকশন, রিনোট এবং জবাব হারাবেন।"
|
deleteAndEditConfirm: "আপনি কি এই নোটটি মুছে এটি সম্পাদনা করার বিষয়ে নিশ্চিত? আপনি এটির সমস্ত রিঅ্যাকশন, রিনোট এবং জবাব হারাবেন।"
|
||||||
addToList: "লিস্ট এ যোগ করুন"
|
addToList: "লিস্ট এ যোগ করুন"
|
||||||
addToAntenna: "অ্যান্টেনা এ যোগ করুন"
|
|
||||||
sendMessage: "একটি বার্তা পাঠান"
|
sendMessage: "একটি বার্তা পাঠান"
|
||||||
copyRSS: "RSS কপি করুন"
|
|
||||||
copyUsername: "ব্যবহারকারীর নাম কপি করুন"
|
copyUsername: "ব্যবহারকারীর নাম কপি করুন"
|
||||||
copyUserId: "ব্যবহারকারীর ID কপি করুন"
|
|
||||||
copyNoteId: "নোটের ID কপি করুন"
|
|
||||||
copyFileId: "ফাইল ID কপি করুন"
|
|
||||||
copyFolderId: "ফোল্ডার ID কপি করুন"
|
|
||||||
copyProfileUrl: "প্রোফাইল URL কপি করুন"
|
|
||||||
searchUser: "ব্যবহারকারী খুঁজুন..."
|
searchUser: "ব্যবহারকারী খুঁজুন..."
|
||||||
reply: "জবাব"
|
reply: "জবাব"
|
||||||
loadMore: "আরও দেখুন"
|
loadMore: "আরও দেখুন"
|
||||||
|
@ -111,8 +100,6 @@ renoted: "রিনোট করা হয়েছে"
|
||||||
cantRenote: "এই নোটটি রিনোট করা যাবে না।"
|
cantRenote: "এই নোটটি রিনোট করা যাবে না।"
|
||||||
cantReRenote: "রিনোটকে রিনোট করা যাবে না।"
|
cantReRenote: "রিনোটকে রিনোট করা যাবে না।"
|
||||||
quote: "উদ্ধৃতি"
|
quote: "উদ্ধৃতি"
|
||||||
inChannelRenote: "চ্যানেলে রিনোট"
|
|
||||||
inChannelQuote: "চ্যানেলে উদ্ধৃতি"
|
|
||||||
pinnedNote: "পিন করা নোট"
|
pinnedNote: "পিন করা নোট"
|
||||||
pinned: "পিন করা"
|
pinned: "পিন করা"
|
||||||
you: "আপনি"
|
you: "আপনি"
|
||||||
|
@ -120,11 +107,7 @@ clickToShow: "দেখার জন্য ক্লিক করুন"
|
||||||
sensitive: "সংবেদনশীল বিষয়বস্তু"
|
sensitive: "সংবেদনশীল বিষয়বস্তু"
|
||||||
add: "যুক্ত করুন"
|
add: "যুক্ত করুন"
|
||||||
reaction: "প্রতিক্রিয়া"
|
reaction: "প্রতিক্রিয়া"
|
||||||
reactions: "প্রতিক্রিয়া"
|
reactionSetting: "রিঅ্যাকশন পিকারে যেসকল প্রতিক্রিয়া দেখানো হবে"
|
||||||
emojiPicker: "ইমোজি পিকার"
|
|
||||||
pinnedEmojisForReactionSettingDescription: "রিঅ্যাকশন দেয়ার সময় আপনি ইমোজিটিকে পিন করা এবং প্রদর্শিত হওয়ার জন্য সেট করতে পারেন।"
|
|
||||||
pinnedEmojisSettingDescription: "ইমোজি ইনপুট দেয়ার সময় আপনি ইমোজিটিকে পিন করা এবং প্রদর্শিত হওয়ার জন্য সেট করতে পারেন।"
|
|
||||||
emojiPickerDisplay: "পিকার ডিসপ্লে"
|
|
||||||
reactionSettingDescription2: "পুনরায় সাজাতে টেনে আনুন, মুছতে ক্লিক করুন, যোগ করতে + টিপুন।"
|
reactionSettingDescription2: "পুনরায় সাজাতে টেনে আনুন, মুছতে ক্লিক করুন, যোগ করতে + টিপুন।"
|
||||||
rememberNoteVisibility: "নোটের দৃশ্যমান্যতার সেটিংস মনে রাখুন"
|
rememberNoteVisibility: "নোটের দৃশ্যমান্যতার সেটিংস মনে রাখুন"
|
||||||
attachCancel: "অ্যাটাচমেন্ট সরান "
|
attachCancel: "অ্যাটাচমেন্ট সরান "
|
||||||
|
@ -181,6 +164,7 @@ annotation: "মন্তব্য"
|
||||||
federation: "ফেডিভার্স"
|
federation: "ফেডিভার্স"
|
||||||
instances: "ইন্সট্যান্স"
|
instances: "ইন্সট্যান্স"
|
||||||
registeredAt: "যোগ দিয়েছেন"
|
registeredAt: "যোগ দিয়েছেন"
|
||||||
|
latestRequestSentAt: "শেষ রিকুয়েস্ট পাঠানো হয়েছে"
|
||||||
latestRequestReceivedAt: "শেষ রিকুয়েস্ট গৃহীত হয়েছে"
|
latestRequestReceivedAt: "শেষ রিকুয়েস্ট গৃহীত হয়েছে"
|
||||||
latestStatus: "সর্বশেষ অবস্থা"
|
latestStatus: "সর্বশেষ অবস্থা"
|
||||||
storageUsage: "স্টোরেজের ব্যাবহার"
|
storageUsage: "স্টোরেজের ব্যাবহার"
|
||||||
|
@ -268,12 +252,12 @@ noMoreHistory: "আর কোন ইতিহাস নেই"
|
||||||
startMessaging: "চ্যাট শুরু করুন"
|
startMessaging: "চ্যাট শুরু করুন"
|
||||||
nUsersRead: "{n} জন পড়েছেন"
|
nUsersRead: "{n} জন পড়েছেন"
|
||||||
agreeTo: "{0} এর প্রতি আমি সম্মত"
|
agreeTo: "{0} এর প্রতি আমি সম্মত"
|
||||||
|
tos: "পরিষেবার শর্তাদি"
|
||||||
start: "শুরু করুন"
|
start: "শুরু করুন"
|
||||||
home: "মূল পাতা"
|
home: "মূল পাতা"
|
||||||
remoteUserCaution: "এই ব্যাবহারকারী রিমোট ইন্সট্যান্সের, নিম্নক্ত তথ্য অসম্পূর্ণ হতে পারে।"
|
remoteUserCaution: "এই ব্যাবহারকারী রিমোট ইন্সট্যান্সের, নিম্নক্ত তথ্য অসম্পূর্ণ হতে পারে।"
|
||||||
activity: "কার্যকলাপ"
|
activity: "কার্যকলাপ"
|
||||||
images: "ছবি"
|
images: "ছবি"
|
||||||
image: "ছবি"
|
|
||||||
birthday: "জন্মদিন"
|
birthday: "জন্মদিন"
|
||||||
yearsOld: "{age} বছর"
|
yearsOld: "{age} বছর"
|
||||||
registeredDate: "যোগদানের তারিখ"
|
registeredDate: "যোগদানের তারিখ"
|
||||||
|
@ -310,6 +294,7 @@ copyUrl: "URL কপি করুন"
|
||||||
rename: "পুনঃনামকরণ"
|
rename: "পুনঃনামকরণ"
|
||||||
avatar: "প্রোফাইল ছবি"
|
avatar: "প্রোফাইল ছবি"
|
||||||
banner: "ব্যানার"
|
banner: "ব্যানার"
|
||||||
|
nsfw: "সংবেদনশীল বিষয়বস্তু"
|
||||||
whenServerDisconnected: "সার্ভারের সাথে সংযোগ বিচ্ছিন্ন হয়ে গেলে"
|
whenServerDisconnected: "সার্ভারের সাথে সংযোগ বিচ্ছিন্ন হয়ে গেলে"
|
||||||
disconnectedFromServer: "সার্ভার থেকে সংযোগ বিচ্ছিন্ন হয়েছে"
|
disconnectedFromServer: "সার্ভার থেকে সংযোগ বিচ্ছিন্ন হয়েছে"
|
||||||
reload: "আবার লোড করুন"
|
reload: "আবার লোড করুন"
|
||||||
|
@ -344,6 +329,7 @@ invite: "আমন্ত্রণ"
|
||||||
driveCapacityPerLocalAccount: "প্রত্যেক স্থানীয় ব্যাবহারকারীর জন্য ড্রাইভের জায়গা"
|
driveCapacityPerLocalAccount: "প্রত্যেক স্থানীয় ব্যাবহারকারীর জন্য ড্রাইভের জায়গা"
|
||||||
driveCapacityPerRemoteAccount: "প্রত্যেক রিমোট ব্যাবহারকারীর জন্য ড্রাইভের জায়গা"
|
driveCapacityPerRemoteAccount: "প্রত্যেক রিমোট ব্যাবহারকারীর জন্য ড্রাইভের জায়গা"
|
||||||
inMb: "মেগাবাইটে লিখুন"
|
inMb: "মেগাবাইটে লিখুন"
|
||||||
|
iconUrl: "আইকনের URL (ফ্যাভিকন, ইত্যাদি)"
|
||||||
bannerUrl: "ব্যানার ছবির URL"
|
bannerUrl: "ব্যানার ছবির URL"
|
||||||
backgroundImageUrl: "পটভূমির চিত্রের URL"
|
backgroundImageUrl: "পটভূমির চিত্রের URL"
|
||||||
basicInfo: "আপনার ব্যক্তিগত তথ্য"
|
basicInfo: "আপনার ব্যক্তিগত তথ্য"
|
||||||
|
@ -357,14 +343,10 @@ hcaptcha: "hCaptcha"
|
||||||
enableHcaptcha: "hCaptcha চালু করুন"
|
enableHcaptcha: "hCaptcha চালু করুন"
|
||||||
hcaptchaSiteKey: "সাইট কী"
|
hcaptchaSiteKey: "সাইট কী"
|
||||||
hcaptchaSecretKey: "সিক্রেট কী"
|
hcaptchaSecretKey: "সিক্রেট কী"
|
||||||
mcaptchaSiteKey: "সাইট কী"
|
|
||||||
mcaptchaSecretKey: "সিক্রেট কী"
|
|
||||||
recaptcha: "reCAPTCHA"
|
recaptcha: "reCAPTCHA"
|
||||||
enableRecaptcha: "reCAPTCHA চালু করুন"
|
enableRecaptcha: "reCAPTCHA চালু করুন"
|
||||||
recaptchaSiteKey: "সাইট কী"
|
recaptchaSiteKey: "সাইট কী"
|
||||||
recaptchaSecretKey: "সিক্রেট কী"
|
recaptchaSecretKey: "সিক্রেট কী"
|
||||||
turnstileSiteKey: "সাইট কী"
|
|
||||||
turnstileSecretKey: "সিক্রেট কী"
|
|
||||||
avoidMultiCaptchaConfirm: "একাধিক Captcha ব্যবহার করলে তারা পরস্পরের কাজে বাধা দিতে পারে। আপনি কি অন্যান্য Captcha নিষ্ক্রিয় করতে চান? আপনি 'বাতিল' ক্লিক করার মাধ্যমে একাধিক Captcha চালু রাখতে পারেন।"
|
avoidMultiCaptchaConfirm: "একাধিক Captcha ব্যবহার করলে তারা পরস্পরের কাজে বাধা দিতে পারে। আপনি কি অন্যান্য Captcha নিষ্ক্রিয় করতে চান? আপনি 'বাতিল' ক্লিক করার মাধ্যমে একাধিক Captcha চালু রাখতে পারেন।"
|
||||||
antennas: "অ্যান্টেনা"
|
antennas: "অ্যান্টেনা"
|
||||||
manageAntennas: "অ্যান্টেনা ব্যবস্থাপনা"
|
manageAntennas: "অ্যান্টেনা ব্যবস্থাপনা"
|
||||||
|
@ -398,9 +380,12 @@ about: "আপনার সম্পর্কে"
|
||||||
aboutMisskey: "Misskey সম্পর্কে"
|
aboutMisskey: "Misskey সম্পর্কে"
|
||||||
administrator: "প্রশাসক"
|
administrator: "প্রশাসক"
|
||||||
token: "টোকেন"
|
token: "টোকেন"
|
||||||
|
twoStepAuthentication: "২-ধাপ প্রমাণীকরণ"
|
||||||
moderator: "মডারেটর"
|
moderator: "মডারেটর"
|
||||||
nUsersMentioned: "{n} জনকে উল্লেখ করা হয়েছে"
|
nUsersMentioned: "{n} জনকে উল্লেখ করা হয়েছে"
|
||||||
securityKey: "সিকিউরিটি কী"
|
securityKey: "সিকিউরিটি কী"
|
||||||
|
securityKeyName: "কী'র নাম"
|
||||||
|
registerSecurityKey: "সিকিউরিটি কী নিবন্ধন করুন"
|
||||||
lastUsed: "শেষ ব্যাবহার করা হয়েছে"
|
lastUsed: "শেষ ব্যাবহার করা হয়েছে"
|
||||||
unregister: "নিবন্ধনমুক্ত হন"
|
unregister: "নিবন্ধনমুক্ত হন"
|
||||||
passwordLessLogin: "পাসওয়ার্ড-বিহীন লগইন সেট আপ করুন"
|
passwordLessLogin: "পাসওয়ার্ড-বিহীন লগইন সেট আপ করুন"
|
||||||
|
@ -411,21 +396,31 @@ share: "শেয়ার"
|
||||||
notFound: "পাওয়া যায়নি"
|
notFound: "পাওয়া যায়নি"
|
||||||
notFoundDescription: "এই URL-এর সাথে সম্পর্কিত কোনো পৃষ্ঠা নেই।"
|
notFoundDescription: "এই URL-এর সাথে সম্পর্কিত কোনো পৃষ্ঠা নেই।"
|
||||||
uploadFolder: "আপলোডের জন্য ডিফল্ট ফোল্ডার"
|
uploadFolder: "আপলোডের জন্য ডিফল্ট ফোল্ডার"
|
||||||
|
cacheClear: "ক্যাশ পরিষ্কার করুন"
|
||||||
markAsReadAllNotifications: "সমস্ত বিজ্ঞপ্তিগুলি পঠিত হিসাবে চিহ্নিত করুন"
|
markAsReadAllNotifications: "সমস্ত বিজ্ঞপ্তিগুলি পঠিত হিসাবে চিহ্নিত করুন"
|
||||||
markAsReadAllUnreadNotes: "সমস্ত নোটগুলি পঠিত হিসাবে চিহ্নিত করুন"
|
markAsReadAllUnreadNotes: "সমস্ত নোটগুলি পঠিত হিসাবে চিহ্নিত করুন"
|
||||||
markAsReadAllTalkMessages: "সমস্ত মেসেজ পঠিত হিসাবে চিহ্নিত করুন"
|
markAsReadAllTalkMessages: "সমস্ত মেসেজ পঠিত হিসাবে চিহ্নিত করুন"
|
||||||
help: "সহায়তা"
|
help: "সহায়তা"
|
||||||
inputMessageHere: "এখানে মেসেজ লিখুন"
|
inputMessageHere: "এখানে মেসেজ লিখুন"
|
||||||
close: "বন্ধ"
|
close: "বন্ধ"
|
||||||
|
group: "গ্রুপ"
|
||||||
|
groups: "গ্রুপসমূহ"
|
||||||
|
createGroup: "গ্রুপ তৈরী করুন"
|
||||||
|
ownedGroups: "আপনার গ্রুপগুলি"
|
||||||
|
joinedGroups: "যেসব গ্রুপে আপনি আছেন"
|
||||||
invites: "আমন্ত্রণ"
|
invites: "আমন্ত্রণ"
|
||||||
|
groupName: "গ্রুপের নাম"
|
||||||
members: "সদস্যবৃন্দ"
|
members: "সদস্যবৃন্দ"
|
||||||
transfer: "হস্তান্তর"
|
transfer: "হস্তান্তর"
|
||||||
|
messagingWithUser: "প্রাইভেট চ্যাট"
|
||||||
|
messagingWithGroup: "গ্রুপ চ্যাট"
|
||||||
title: "শিরোনাম"
|
title: "শিরোনাম"
|
||||||
text: "পাঠ্য"
|
text: "পাঠ্য"
|
||||||
enable: "সক্রিয়"
|
enable: "সক্রিয়"
|
||||||
next: "পরবর্তী"
|
next: "পরবর্তী"
|
||||||
retype: "পুনঃ প্রবেশ"
|
retype: "পুনঃ প্রবেশ"
|
||||||
noteOf: "{user} এর নোট"
|
noteOf: "{user} এর নোট"
|
||||||
|
inviteToGroup: "গ্রুপে আমন্ত্রণ জানান"
|
||||||
quoteAttached: "উদ্ধৃত"
|
quoteAttached: "উদ্ধৃত"
|
||||||
quoteQuestion: "উদ্ধৃতি হিসাবে সংযুক্ত করবেন?"
|
quoteQuestion: "উদ্ধৃতি হিসাবে সংযুক্ত করবেন?"
|
||||||
noMessagesYet: "কোন মেসেজ নেই"
|
noMessagesYet: "কোন মেসেজ নেই"
|
||||||
|
@ -447,12 +442,19 @@ passwordMatched: "মিলেছে"
|
||||||
passwordNotMatched: "মিলেনি"
|
passwordNotMatched: "মিলেনি"
|
||||||
signinWith: "{x} এর সাহায্যে সাইন ইন করুন"
|
signinWith: "{x} এর সাহায্যে সাইন ইন করুন"
|
||||||
signinFailed: "লগ ইন করা যায়নি। আপনার ব্যবহারকারীর নাম এবং পাসওয়ার্ড চেক করুন."
|
signinFailed: "লগ ইন করা যায়নি। আপনার ব্যবহারকারীর নাম এবং পাসওয়ার্ড চেক করুন."
|
||||||
|
tapSecurityKey: "সিকিউরিটি কী স্পর্শ করুন"
|
||||||
or: "অথবা"
|
or: "অথবা"
|
||||||
language: "ভাষা"
|
language: "ভাষা"
|
||||||
uiLanguage: "UI এর ভাষা"
|
uiLanguage: "UI এর ভাষা"
|
||||||
|
groupInvited: "আপনি একটি গ্রুপে আমন্ত্রিত হয়েছেন"
|
||||||
aboutX: "{x} সম্পর্কে"
|
aboutX: "{x} সম্পর্কে"
|
||||||
|
useOsNativeEmojis: "অপারেটিং সিস্টেমের নেটিভ ইমোজি ব্যবহার করুন"
|
||||||
|
disableDrawer: "ড্রয়ার মেনু প্রদর্শন করবেন না"
|
||||||
|
youHaveNoGroups: "আপনার কোন গ্রুপ নেই "
|
||||||
|
joinOrCreateGroup: "একটি বিদ্যমান গ্রুপের আমন্ত্রণ পান বা একটি নতুন গ্রুপ তৈরি করুন৷"
|
||||||
noHistory: "কোনো ইতিহাস নেই"
|
noHistory: "কোনো ইতিহাস নেই"
|
||||||
signinHistory: "প্রবেশ করার ইতিহাস"
|
signinHistory: "প্রবেশ করার ইতিহাস"
|
||||||
|
disableAnimatedMfm: "অ্যানিমেটেড MFM অক্ষম করুন"
|
||||||
doing: "প্রক্রিয়া করছে..."
|
doing: "প্রক্রিয়া করছে..."
|
||||||
category: "বিভাগ"
|
category: "বিভাগ"
|
||||||
tags: "ট্যাগসমূহ"
|
tags: "ট্যাগসমূহ"
|
||||||
|
@ -499,7 +501,6 @@ deleteAll: "সব মুছুন"
|
||||||
showFixedPostForm: "টাইমলাইনের শীর্ষে পোস্ট করার ফর্মটি দেখান"
|
showFixedPostForm: "টাইমলাইনের শীর্ষে পোস্ট করার ফর্মটি দেখান"
|
||||||
newNoteRecived: "নতুন নোট আছে"
|
newNoteRecived: "নতুন নোট আছে"
|
||||||
sounds: "শব্দ"
|
sounds: "শব্দ"
|
||||||
sound: "শব্দ"
|
|
||||||
listen: "শুনুন"
|
listen: "শুনুন"
|
||||||
none: "কিছুই না"
|
none: "কিছুই না"
|
||||||
showInPage: "পেজে দেখান"
|
showInPage: "পেজে দেখান"
|
||||||
|
@ -624,7 +625,10 @@ abuseReported: "আপনার অভিযোগটি দাখিল কর
|
||||||
reporter: "অভিযোগকারী"
|
reporter: "অভিযোগকারী"
|
||||||
reporteeOrigin: "অভিযোগটির উৎস"
|
reporteeOrigin: "অভিযোগটির উৎস"
|
||||||
reporterOrigin: "অভিযোগকারীর উৎস"
|
reporterOrigin: "অভিযোগকারীর উৎস"
|
||||||
|
forwardReport: "রিমোট ইন্সত্যান্সে অভিযোগটি পাঠান"
|
||||||
|
forwardReportIsAnonymous: "আপনার তথ্য রিমোট ইন্সত্যান্সে পাঠানো হবে না এবং একটি বেনামী সিস্টেম অ্যাকাউন্ট হিসাবে প্রদর্শিত হবে।"
|
||||||
send: "পাঠান"
|
send: "পাঠান"
|
||||||
|
abuseMarkAsResolved: "অভিযোগটিকে সমাধাকৃত হিসাবে চিহ্নিত করুন"
|
||||||
openInNewTab: "নতুন ট্যাবে খুলুন"
|
openInNewTab: "নতুন ট্যাবে খুলুন"
|
||||||
openInSideView: "সাইড ভিউতে খুলুন"
|
openInSideView: "সাইড ভিউতে খুলুন"
|
||||||
defaultNavigationBehaviour: "ডিফল্ট নেভিগেশন"
|
defaultNavigationBehaviour: "ডিফল্ট নেভিগেশন"
|
||||||
|
@ -640,8 +644,7 @@ createNew: "নতুন"
|
||||||
optional: "প্রয়োজনীয় নয়"
|
optional: "প্রয়োজনীয় নয়"
|
||||||
createNewClip: "নতুন ক্লিপ তৈরি করুন"
|
createNewClip: "নতুন ক্লিপ তৈরি করুন"
|
||||||
public: "সর্বজনীন"
|
public: "সর্বজনীন"
|
||||||
private: "ব্যাক্তিগত"
|
i18nInfo: "Calckey স্বেচ্ছাসেবকদের দ্বারা বিভিন্ন ভাষায় অনুবাদ করা হচ্ছে। আপনি {link} এ গিয়ে অনুবাদে সহযোগিতা করতে পারেন।"
|
||||||
i18nInfo: "Misskey স্বেচ্ছাসেবকদের দ্বারা বিভিন্ন ভাষায় অনুবাদ করা হচ্ছে। আপনি {link} এ গিয়ে অনুবাদে সহযোগিতা করতে পারেন।"
|
|
||||||
manageAccessTokens: "অ্যাক্সেস টোকেন পরিচালনা করুন"
|
manageAccessTokens: "অ্যাক্সেস টোকেন পরিচালনা করুন"
|
||||||
accountInfo: "অ্যাকাউন্টের তথ্য"
|
accountInfo: "অ্যাকাউন্টের তথ্য"
|
||||||
notesCount: "নোটের সংখ্যা"
|
notesCount: "নোটের সংখ্যা"
|
||||||
|
@ -808,11 +811,15 @@ makeReactionsPublicDescription: "আপনার পূর্ববর্তী
|
||||||
classic: "ক্লাসিক"
|
classic: "ক্লাসিক"
|
||||||
muteThread: "থ্রেড মিউট করুন"
|
muteThread: "থ্রেড মিউট করুন"
|
||||||
unmuteThread: "থ্রেড আনমিউট করুন"
|
unmuteThread: "থ্রেড আনমিউট করুন"
|
||||||
|
ffVisibility: "অনুসরণ/অনুসরণকারীদের দৃশ্যমান্যতা"
|
||||||
|
ffVisibilityDescription: "আপনি কাকে অনুসরণ করেন এবং কে আপনাকে অনুসরণ করে, সেটা কারা দেখতে পাবে তা নির্ধারণ করে।"
|
||||||
continueThread: "আরো থ্রেড দেখুন"
|
continueThread: "আরো থ্রেড দেখুন"
|
||||||
deleteAccountConfirm: "আপনার অ্যাকাউন্ট মুছে ফেলা হবে। ঠিক আছে?"
|
deleteAccountConfirm: "আপনার অ্যাকাউন্ট মুছে ফেলা হবে। ঠিক আছে?"
|
||||||
incorrectPassword: "আপনার দেওয়া পাসওয়ার্ডটি ভুল।"
|
incorrectPassword: "আপনার দেওয়া পাসওয়ার্ডটি ভুল।"
|
||||||
voteConfirm: "\"{choice}\" এ ভোট দিতে চান?"
|
voteConfirm: "\"{choice}\" এ ভোট দিতে চান?"
|
||||||
hide: "লুকান"
|
hide: "লুকান"
|
||||||
|
leaveGroup: "গ্রুপ ছেড়ে চলে যান"
|
||||||
|
leaveGroupConfirm: "\"{name}\" গ্রুপ ছেড়ে চলে যেতে চান?"
|
||||||
useDrawerReactionPickerForMobile: "মোবাইলে রিঅ্যাকশন পিকারকে ড্রয়ারে প্রদর্শন করুন"
|
useDrawerReactionPickerForMobile: "মোবাইলে রিঅ্যাকশন পিকারকে ড্রয়ারে প্রদর্শন করুন"
|
||||||
welcomeBackWithName: "আবার স্বাগতম, {name}"
|
welcomeBackWithName: "আবার স্বাগতম, {name}"
|
||||||
clickToFinishEmailVerification: " [{ok}] ক্লিক করার মাধ্যমে আপনার ইমেল ঠিকানা নিশ্চিত করুন।"
|
clickToFinishEmailVerification: " [{ok}] ক্লিক করার মাধ্যমে আপনার ইমেল ঠিকানা নিশ্চিত করুন।"
|
||||||
|
@ -828,7 +835,6 @@ instanceDefaultLightTheme: "ইন্সট্যান্সের ডিফল
|
||||||
instanceDefaultDarkTheme: "ইন্সট্যান্সের ডিফল্ট ডার্ক থিম"
|
instanceDefaultDarkTheme: "ইন্সট্যান্সের ডিফল্ট ডার্ক থিম"
|
||||||
instanceDefaultThemeDescription: "অবজেক্ট ফরম্যাটে থিম কোড লিখুন"
|
instanceDefaultThemeDescription: "অবজেক্ট ফরম্যাটে থিম কোড লিখুন"
|
||||||
mutePeriod: "মিউটের সময়কাল"
|
mutePeriod: "মিউটের সময়কাল"
|
||||||
period: "পোলের সময়সীমা"
|
|
||||||
indefinitely: "অনির্দিষ্ট"
|
indefinitely: "অনির্দিষ্ট"
|
||||||
tenMinutes: "১০ মিনিট"
|
tenMinutes: "১০ মিনিট"
|
||||||
oneHour: "১ ঘণ্টা"
|
oneHour: "১ ঘণ্টা"
|
||||||
|
@ -843,26 +849,6 @@ colored: "রঙ্গিন"
|
||||||
label: "লেবেল"
|
label: "লেবেল"
|
||||||
localOnly: "শুধুমাত্র লোকাল"
|
localOnly: "শুধুমাত্র লোকাল"
|
||||||
account: "অ্যাকাউন্টগুলি"
|
account: "অ্যাকাউন্টগুলি"
|
||||||
like: "পছন্দ করা"
|
|
||||||
show: "প্রদর্শন"
|
|
||||||
color: "রং"
|
|
||||||
horizontal: "পাশে"
|
|
||||||
youFollowing: "অনুসরণ করা হচ্ছে"
|
|
||||||
icon: "প্রোফাইল ছবি"
|
|
||||||
replies: "জবাব"
|
|
||||||
renotes: "রিনোট"
|
|
||||||
sourceCode: "সোর্স কোড"
|
|
||||||
flip: "উল্টান"
|
|
||||||
_delivery:
|
|
||||||
stop: "স্থগিত করা হয়েছে"
|
|
||||||
_type:
|
|
||||||
none: "প্রকাশ করা হচ্ছে"
|
|
||||||
_role:
|
|
||||||
priority: "অগ্রাধিকার"
|
|
||||||
_priority:
|
|
||||||
low: "নিম্ন"
|
|
||||||
middle: "মাঝারি"
|
|
||||||
high: "উচ্চ"
|
|
||||||
_emailUnavailable:
|
_emailUnavailable:
|
||||||
used: "এই ইমেইল ঠিকানাটি ইতোমধ্যে ব্যবহৃত হয়েছে"
|
used: "এই ইমেইল ঠিকানাটি ইতোমধ্যে ব্যবহৃত হয়েছে"
|
||||||
format: "এই ইমেল ঠিকানাটি সঠিকভাবে লিখা হয়নি"
|
format: "এই ইমেল ঠিকানাটি সঠিকভাবে লিখা হয়নি"
|
||||||
|
@ -887,7 +873,6 @@ _accountDelete:
|
||||||
_ad:
|
_ad:
|
||||||
back: "পিছনে"
|
back: "পিছনে"
|
||||||
reduceFrequencyOfThisAd: "এই বিজ্ঞাপনটি কম দেখান"
|
reduceFrequencyOfThisAd: "এই বিজ্ঞাপনটি কম দেখান"
|
||||||
hide: "দেখাবেন না"
|
|
||||||
_forgotPassword:
|
_forgotPassword:
|
||||||
enterEmail: "আপনি আপনার অ্যাকাউন্টের জন্য নিবন্ধিত ইমেল ঠিকানা লিখুন. সেই ঠিকানায় একটি পাসওয়ার্ড রিসেট লিঙ্ক পাঠানো হবে।"
|
enterEmail: "আপনি আপনার অ্যাকাউন্টের জন্য নিবন্ধিত ইমেল ঠিকানা লিখুন. সেই ঠিকানায় একটি পাসওয়ার্ড রিসেট লিঙ্ক পাঠানো হবে।"
|
||||||
ifNoEmail: "আপনি যদি নিবন্ধনের সময় ই-মেইল ঠিকানা না দিয়ে থাকেন, তাহলে অনুগ্রহ করে প্রশাসকের সাথে যোগাযোগ করুন।"
|
ifNoEmail: "আপনি যদি নিবন্ধনের সময় ই-মেইল ঠিকানা না দিয়ে থাকেন, তাহলে অনুগ্রহ করে প্রশাসকের সাথে যোগাযোগ করুন।"
|
||||||
|
@ -906,7 +891,6 @@ _plugin:
|
||||||
install: "প্লাগইন ইন্সটল করুন"
|
install: "প্লাগইন ইন্সটল করুন"
|
||||||
installWarn: "অবিশ্বস্ত প্লাগইন ইনস্টল করবেন না।"
|
installWarn: "অবিশ্বস্ত প্লাগইন ইনস্টল করবেন না।"
|
||||||
manage: "প্লাগইন ম্যানেজ করুন"
|
manage: "প্লাগইন ম্যানেজ করুন"
|
||||||
viewSource: "উৎস দেখুন"
|
|
||||||
_registry:
|
_registry:
|
||||||
scope: "স্কোপ"
|
scope: "স্কোপ"
|
||||||
key: "কী"
|
key: "কী"
|
||||||
|
@ -922,6 +906,74 @@ _aboutMisskey:
|
||||||
donate: "Misskey তে দান করুন"
|
donate: "Misskey তে দান করুন"
|
||||||
morePatrons: "আরও অনেকে আমাদের সাহায্য করছেন। তাদের সবাইকে ধন্যবাদ 🥰"
|
morePatrons: "আরও অনেকে আমাদের সাহায্য করছেন। তাদের সবাইকে ধন্যবাদ 🥰"
|
||||||
patrons: "সমর্থনকারী"
|
patrons: "সমর্থনকারী"
|
||||||
|
_nsfw:
|
||||||
|
respect: "স্পর্শকাতর মিডিয়া লুকান"
|
||||||
|
ignore: "স্পর্শকাতর মিডিয়া লুকাবেন না"
|
||||||
|
force: "সকল মিডিয়া লুকান"
|
||||||
|
_mfm:
|
||||||
|
cheatSheet: "MFM চিটশিট"
|
||||||
|
intro: "MFM একটি মার্কআপ ভাষা যা Misskey-এর মধ্যে বিভিন্ন জায়গায় ব্যবহার করা যেতে পারে। এখানে আপনি MFM-এর সিনট্যাক্সগুলির একটি তালিকা দেখতে পারবেন।"
|
||||||
|
dummy: "মিসকি ফেডিভার্সের বিশ্বকে প্রসারিত করে"
|
||||||
|
mention: "উল্লেখ"
|
||||||
|
mentionDescription: "@ চিহ্ন + ব্যবহারকারীর নাম একটি নির্দিষ্ট ব্যবহারকারীকে নির্দেশ করতে ব্যবহার করা যায়।"
|
||||||
|
hashtag: "হ্যাশট্যাগ"
|
||||||
|
hashtagDescription: "আপনি একটি # চিহ্ন + ট্যাগ সহ একটি হ্যাশট্যাগ নির্দেশ করতে পারেন।"
|
||||||
|
url: "URL"
|
||||||
|
urlDescription: "URL দেখানো সম্ভব।"
|
||||||
|
link: "লিংক"
|
||||||
|
linkDescription: "আপনি পাঠ্যের একটি নির্দিষ্ট অংশকে URL হিসাবে দেখাতে পারেন৷"
|
||||||
|
bold: "গাঢ়"
|
||||||
|
boldDescription: "অক্ষরগুলিকে মোটাকরে প্রদর্শন করা হবে।"
|
||||||
|
small: "ছোট"
|
||||||
|
smallDescription: "লেখা ছোট এবং পাতলা করে দেখানো হবে।"
|
||||||
|
center: "সেন্টার"
|
||||||
|
centerDescription: "লেখা মাঝ বরাবর দেখানো হবে"
|
||||||
|
inlineCode: "কোড (ইনলাইন)"
|
||||||
|
inlineCodeDescription: " প্রোগ্রামের কোডের জন্য ইনলাইন সিনট্যাক্স হাইলাইটিং করা হবে"
|
||||||
|
blockCode: "কোড (ব্লক)"
|
||||||
|
blockCodeDescription: "মাল্টি-লাইন প্রোগ্রামের কোডের জন্য সিনট্যাক্স হাইলাইট করে।"
|
||||||
|
inlineMath: "গাণিতিক সূত্র (ইনলাইন)"
|
||||||
|
inlineMathDescription: "গাণিতিক সূত্র প্রদর্শন করুন (KaTeX) ইনলাইন।"
|
||||||
|
blockMath: "গাণিতিক সূত্র (ব্লক)"
|
||||||
|
blockMathDescription: "একটি ব্লকে একাধিক লাইনের গাণিতিক সূত্র প্রদর্শন করুন (KaTeX)।"
|
||||||
|
quote: "উদ্ধৃতি"
|
||||||
|
quoteDescription: "বিষয়বস্তুকে একটি উদ্ধৃতি হিসাবে দেখানো হবে।"
|
||||||
|
emoji: "স্বনির্ধারিত ইমোজিগুলি"
|
||||||
|
emojiDescription: "আপনি একটি কাস্টম ইমোজির নাম কোলনে আবদ্ধ করে কাস্টম ইমোজিটি দেখাতে পারেন৷"
|
||||||
|
search: "খুঁজুন"
|
||||||
|
searchDescription: "পূর্ব-টাইপ করা পাঠ্য সহ একটি অনুসন্ধান বাক্স প্রদর্শন করে।"
|
||||||
|
flip: "উল্টান"
|
||||||
|
flipDescription: "বিষয়বস্তু উপরে/নীচে বা বাম/ডানে উল্টান।"
|
||||||
|
jelly: "অ্যানিমেশন (জেলি)"
|
||||||
|
jellyDescription: "জেলির মত অ্যানিমেশন দেখায়।"
|
||||||
|
tada: "অ্যানিমেশন (টাডা)"
|
||||||
|
tadaDescription: "\"টাডা!\" এর মত অ্যানিমেশন দেখায়।"
|
||||||
|
jump: "অ্যানিমেশন (লাফ)"
|
||||||
|
jumpDescription: "বিষয়বস্তুতে লাফ মারার মত অ্যানিমেশন দেখায়।"
|
||||||
|
bounce: "অ্যানিমেশন (তিড়িং বিড়িং)"
|
||||||
|
bounceDescription: "তিড়িং বিড়িং করার মত অ্যানিমেশন দেখায়।"
|
||||||
|
shake: "অ্যানিমেশন (ঝাঁকি)"
|
||||||
|
shakeDescription: "ঝাঁকির মত অ্যানিমেশন দেখায়।"
|
||||||
|
twitch: "অ্যানিমেশন (মোচড়ানো)"
|
||||||
|
twitchDescription: "মোচড়ানোর মত অ্যানিমেশন দেখায়।"
|
||||||
|
spin: "অ্যানিমেশন (ঘুরা)"
|
||||||
|
spinDescription: "ঘুরার মত অ্যানিমেশন দেখায়।"
|
||||||
|
x2: "বড়"
|
||||||
|
x2Description: "বিষয়বস্তু বড় করে দেখায়।"
|
||||||
|
x3: "অনেক বড়"
|
||||||
|
x3Description: "বিষয়বস্তু আরও বড় করে দেখায়।"
|
||||||
|
x4: "অস্বাভাবিক বড়"
|
||||||
|
x4Description: "বিষয়বস্তুকে আগের থেকেও আরও বড় করে দেখায়।"
|
||||||
|
blur: "ব্লার"
|
||||||
|
blurDescription: "বিষয়বস্তুকে ব্লার করতে পারেন। আপনি এর উপর মাউস কার্সার রাখলে, এটি পরিষ্কারভাবে দেখতে পাবেন।"
|
||||||
|
font: "ফন্ট"
|
||||||
|
fontDescription: "বিষয়বস্তুকে কোন ফন্টে দেখানো হবে তা নির্ধারণ করে।"
|
||||||
|
rainbow: "রেইনবো"
|
||||||
|
rainbowDescription: "বিষয়বস্তুকে রংধনুর রং গুলিতে প্রদর্শন করে।"
|
||||||
|
sparkle: "চিক চিক"
|
||||||
|
sparkleDescription: "বিষয়বস্তুকে একটি চিকচিকে কণা প্রভাব দেয়।"
|
||||||
|
rotate: "ঘুরান"
|
||||||
|
rotateDescription: "বিষয়বস্তুকে একটি নির্দিষ্ট কোনে ঘুরায়।"
|
||||||
_instanceTicker:
|
_instanceTicker:
|
||||||
none: "দেখাবেন না"
|
none: "দেখাবেন না"
|
||||||
remote: "রিমোট ব্যাবহারকারীদের জন্য দেখান"
|
remote: "রিমোট ব্যাবহারকারীদের জন্য দেখান"
|
||||||
|
@ -949,6 +1001,11 @@ _wordMute:
|
||||||
muteWords: "নিঃশব্দ করা শব্দগুলি"
|
muteWords: "নিঃশব্দ করা শব্দগুলি"
|
||||||
muteWordsDescription: "স্পেস দিয়ে আলাদা করলে AND শর্ত তৈরি হবে এবং আলাদা লাইনে লিখলে OR শর্ত তৈরি হবে।"
|
muteWordsDescription: "স্পেস দিয়ে আলাদা করলে AND শর্ত তৈরি হবে এবং আলাদা লাইনে লিখলে OR শর্ত তৈরি হবে।"
|
||||||
muteWordsDescription2: "রেগুলার এক্সপ্রেশন ব্যবহার করতে স্ল্যাশ দিয়ে কীওয়ার্ডকে ঘিরে রাখুন।"
|
muteWordsDescription2: "রেগুলার এক্সপ্রেশন ব্যবহার করতে স্ল্যাশ দিয়ে কীওয়ার্ডকে ঘিরে রাখুন।"
|
||||||
|
softDescription: "টাইমলাইন থেকে নির্দিষ্ট শর্তানুযায়ী নোট লুকিয়ে রাখে।"
|
||||||
|
hardDescription: "নির্দিষ্ট শর্তানুযায়ী নোটগুলিকে টাইমলাইন থেকে বাদ দেয়। আপনি শর্ত পরিবর্তন করলেও যে নোটগুলি যোগ করা হয়নি সেগুলি বাদ দেওয়া হবে।"
|
||||||
|
soft: "নমনীয়"
|
||||||
|
hard: "কঠোর"
|
||||||
|
mutedNotes: "মিউট করা নোটগুলি"
|
||||||
_instanceMute:
|
_instanceMute:
|
||||||
instanceMuteDescription: "কনফিগার করা ইন্সট্যান্সের সব নোট এবং রিনোট মিউট করুন, মিউট করা ইন্সট্যান্সের ব্যবহারকারীদের উত্তর সহ।"
|
instanceMuteDescription: "কনফিগার করা ইন্সট্যান্সের সব নোট এবং রিনোট মিউট করুন, মিউট করা ইন্সট্যান্সের ব্যবহারকারীদের উত্তর সহ।"
|
||||||
instanceMuteDescription2: "প্রতিটিকে আলাদা লাইনে লিখুন"
|
instanceMuteDescription2: "প্রতিটিকে আলাদা লাইনে লিখুন"
|
||||||
|
@ -1012,11 +1069,15 @@ _theme:
|
||||||
infoFg: "তথ্যের পাঠ্য"
|
infoFg: "তথ্যের পাঠ্য"
|
||||||
infoWarnBg: "ওয়ার্নিং এর পটভূমি"
|
infoWarnBg: "ওয়ার্নিং এর পটভূমি"
|
||||||
infoWarnFg: "ওয়ার্নিং এর পাঠ্য"
|
infoWarnFg: "ওয়ার্নিং এর পাঠ্য"
|
||||||
|
cwBg: "CW বাটনের পটভূমি"
|
||||||
|
cwFg: "CW বাটনের পাঠ্য"
|
||||||
|
cwHoverBg: "CW বাটনের পটভূমি (হভার)"
|
||||||
toastBg: "বিজ্ঞপ্তির পটভূমি"
|
toastBg: "বিজ্ঞপ্তির পটভূমি"
|
||||||
toastFg: "বিজ্ঞপ্তির পাঠ্য"
|
toastFg: "বিজ্ঞপ্তির পাঠ্য"
|
||||||
buttonBg: "বাটনের পটভূমি"
|
buttonBg: "বাটনের পটভূমি"
|
||||||
buttonHoverBg: "বাটনের পটভূমি (হভার)"
|
buttonHoverBg: "বাটনের পটভূমি (হভার)"
|
||||||
inputBorder: "ইনপুট ফিল্ডের বর্ডার"
|
inputBorder: "ইনপুট ফিল্ডের বর্ডার"
|
||||||
|
listItemHoverBg: "লিস্ট আইটেমের পটভূমি (হোভার)"
|
||||||
driveFolderBg: "ড্রাইভ ফোল্ডারের পটভূমি"
|
driveFolderBg: "ড্রাইভ ফোল্ডারের পটভূমি"
|
||||||
wallpaperOverlay: "ওয়ালপেপার ওভারলে"
|
wallpaperOverlay: "ওয়ালপেপার ওভারলে"
|
||||||
badge: "ব্যাজ"
|
badge: "ব্যাজ"
|
||||||
|
@ -1028,6 +1089,10 @@ _sfx:
|
||||||
note: "নোটগুলি"
|
note: "নোটগুলি"
|
||||||
noteMy: "নোট (আপনার)"
|
noteMy: "নোট (আপনার)"
|
||||||
notification: "বিজ্ঞপ্তি"
|
notification: "বিজ্ঞপ্তি"
|
||||||
|
chat: "চ্যাট"
|
||||||
|
chatBg: "চ্যাট (ব্যাকগ্রাউন্ড)"
|
||||||
|
antenna: "অ্যান্টেনাগুলি"
|
||||||
|
channel: "চ্যানেলের বিজ্ঞপ্তি"
|
||||||
_ago:
|
_ago:
|
||||||
future: "ভবিষ্যৎ"
|
future: "ভবিষ্যৎ"
|
||||||
justNow: "এইমাত্র"
|
justNow: "এইমাত্র"
|
||||||
|
@ -1038,20 +1103,42 @@ _ago:
|
||||||
weeksAgo: "{n} সপ্তাহ আগে"
|
weeksAgo: "{n} সপ্তাহ আগে"
|
||||||
monthsAgo: "{n} মাস আগে"
|
monthsAgo: "{n} মাস আগে"
|
||||||
yearsAgo: "{n} বছর আগে"
|
yearsAgo: "{n} বছর আগে"
|
||||||
invalid: "এখানে কিছুই নাই"
|
|
||||||
_time:
|
_time:
|
||||||
second: "সেকেন্ড"
|
second: "সেকেন্ড"
|
||||||
minute: "মিনিট"
|
minute: "মিনিট"
|
||||||
hour: "ঘণ্টা"
|
hour: "ঘণ্টা"
|
||||||
day: "দিন"
|
day: "দিন"
|
||||||
|
_tutorial:
|
||||||
|
title: "How to use Calckey"
|
||||||
|
step1_1: "Welcome!"
|
||||||
|
step1_2: "Let's get you set up. You'll be up and running in no time!"
|
||||||
|
step2_1: "First, please fill out your profile."
|
||||||
|
step2_2: "Providing some information about who you are will make it easier for others to tell if they want to see your notes or follow you."
|
||||||
|
step3_1: "Now time to follow some people!"
|
||||||
|
step3_2: "Your home and social timelines are based off of who you follow, so try following a couple accounts to get started.\nClick the plus circle on the top right of a profile to follow them."
|
||||||
|
step4_1: "Let's get you out there."
|
||||||
|
step4_2: "For your first post, some people like to made a {introduction} post or a simple \"Hello world!\""
|
||||||
|
step5_1: "Timelines, timelines everywhere!"
|
||||||
|
step5_2: "Your instance has {timelines} different timelines enabled."
|
||||||
|
step5_3: "The Home {icon} timeline is where you can see posts from your followers."
|
||||||
|
step5_4: "The Local {icon} timeline is where you can see posts from everyone else on this instance."
|
||||||
|
step5_5: "The Recommended {icon} timeline is where you can see posts from instances the admins recommend."
|
||||||
|
step5_6: "The Social {icon} timeline is where you can see posts from friends of your followers."
|
||||||
|
step5_7: "The Global {icon} timeline is where you can see posts from every other connected instance."
|
||||||
|
step6_1: "So, what is this place?"
|
||||||
|
step6_2: "Well, you didn't just join Calckey. You joined a portal to the Fediverse, an interconnected network of thousands of servers, called \"instances\"."
|
||||||
|
step6_3: "Each server works in different ways, and not all servers run Calckey. This one does though! It's a bit complicated, but you'll get the hang of it in no time."
|
||||||
|
step6_4: "Now go, explore, and have fun!"
|
||||||
_2fa:
|
_2fa:
|
||||||
alreadyRegistered: "আপনি ইতিমধ্যে একটি 2-ফ্যাক্টর অথেনটিকেশন ডিভাইস নিবন্ধন করেছেন৷"
|
alreadyRegistered: "আপনি ইতিমধ্যে একটি 2-ফ্যাক্টর অথেনটিকেশন ডিভাইস নিবন্ধন করেছেন৷"
|
||||||
|
registerDevice: "নতুন ডিভাইস নিবন্ধন করুন"
|
||||||
|
registerKey: "সিকিউরিটি কী নিবন্ধন করুন"
|
||||||
step1: "প্রথমে, আপনার ডিভাইসে {a} বা {b} এর মতো একটি অথেনটিকেশন অ্যাপ ইনস্টল করুন৷"
|
step1: "প্রথমে, আপনার ডিভাইসে {a} বা {b} এর মতো একটি অথেনটিকেশন অ্যাপ ইনস্টল করুন৷"
|
||||||
step2: "এরপরে, অ্যাপের সাহায্যে প্রদর্শিত QR কোডটি স্ক্যান করুন।"
|
step2: "এরপরে, অ্যাপের সাহায্যে প্রদর্শিত QR কোডটি স্ক্যান করুন।"
|
||||||
|
step2Url: "ডেস্কটপ অ্যাপে, নিম্নলিখিত URL লিখুন:"
|
||||||
step3: "অ্যাপে প্রদর্শিত টোকেনটি লিখুন এবং আপনার কাজ শেষ।"
|
step3: "অ্যাপে প্রদর্শিত টোকেনটি লিখুন এবং আপনার কাজ শেষ।"
|
||||||
step4: "আপনাকে এখন থেকে লগ ইন করার সময়, এইভাবে টোকেন লিখতে হবে।"
|
step4: "আপনাকে এখন থেকে লগ ইন করার সময়, এইভাবে টোকেন লিখতে হবে।"
|
||||||
securityKeyInfo: "আপনি একটি হার্ডওয়্যার সিকিউরিটি কী ব্যবহার করে লগ ইন করতে পারেন যা FIDO2 বা ডিভাইসের ফিঙ্গারপ্রিন্ট সেন্সর বা পিন সমর্থন করে৷"
|
securityKeyInfo: "আপনি একটি হার্ডওয়্যার সিকিউরিটি কী ব্যবহার করে লগ ইন করতে পারেন যা FIDO2 বা ডিভাইসের ফিঙ্গারপ্রিন্ট সেন্সর বা পিন সমর্থন করে৷"
|
||||||
renewTOTPCancel: "না, ধন্যবাদ"
|
|
||||||
_permissions:
|
_permissions:
|
||||||
"read:account": "অ্যাকাউন্টের তথ্য দেখুন"
|
"read:account": "অ্যাকাউন্টের তথ্য দেখুন"
|
||||||
"write:account": "অ্যাকাউন্টের তথ্য সম্পাদন করুন"
|
"write:account": "অ্যাকাউন্টের তথ্য সম্পাদন করুন"
|
||||||
|
@ -1097,6 +1184,7 @@ _antennaSources:
|
||||||
homeTimeline: "আপনি অনুসরণ করছেন, এমন ব্যবহারকারীদের নোট"
|
homeTimeline: "আপনি অনুসরণ করছেন, এমন ব্যবহারকারীদের নোট"
|
||||||
users: "এক বা একাধিক নির্দিষ্ট ব্যবহারকারীর নোট"
|
users: "এক বা একাধিক নির্দিষ্ট ব্যবহারকারীর নোট"
|
||||||
userList: "নির্দিষ্ট তালিকায় নাম থাকা ব্যবহারকারীদের নোট"
|
userList: "নির্দিষ্ট তালিকায় নাম থাকা ব্যবহারকারীদের নোট"
|
||||||
|
userGroup: "নির্দিষ্ট গ্রুপে থাকা ব্যবহারকারীদের নোট"
|
||||||
_weekday:
|
_weekday:
|
||||||
sunday: "রবিবার"
|
sunday: "রবিবার"
|
||||||
monday: "সোমবার"
|
monday: "সোমবার"
|
||||||
|
@ -1106,8 +1194,6 @@ _weekday:
|
||||||
friday: "শুক্রবার"
|
friday: "শুক্রবার"
|
||||||
saturday: "শনিবার"
|
saturday: "শনিবার"
|
||||||
_widgets:
|
_widgets:
|
||||||
profile: "প্রোফাইল"
|
|
||||||
instanceInfo: "ইন্সট্যান্সের তথ্য"
|
|
||||||
memo: "স্টিকি নোট"
|
memo: "স্টিকি নোট"
|
||||||
notifications: "বিজ্ঞপ্তি"
|
notifications: "বিজ্ঞপ্তি"
|
||||||
timeline: "টাইমলাইন"
|
timeline: "টাইমলাইন"
|
||||||
|
@ -1127,8 +1213,6 @@ _widgets:
|
||||||
serverMetric: "সার্ভার মেট্রিক্স"
|
serverMetric: "সার্ভার মেট্রিক্স"
|
||||||
aiscript: "AiScript কনসোল"
|
aiscript: "AiScript কনসোল"
|
||||||
aichan: "আই চান"
|
aichan: "আই চান"
|
||||||
_userList:
|
|
||||||
chooseList: "লিস্ট নির্বাচন করুন"
|
|
||||||
_cw:
|
_cw:
|
||||||
hide: "লুকান"
|
hide: "লুকান"
|
||||||
show: "আরও দেখুন"
|
show: "আরও দেখুন"
|
||||||
|
@ -1165,6 +1249,8 @@ _visibility:
|
||||||
followersDescription: "শুধুমাত্র আপনার অনুসরণকারীদের নিকট পোস্ট করুন"
|
followersDescription: "শুধুমাত্র আপনার অনুসরণকারীদের নিকট পোস্ট করুন"
|
||||||
specified: "ডাইরেক্ট নোট"
|
specified: "ডাইরেক্ট নোট"
|
||||||
specifiedDescription: "শুধুমাত্র নির্দিষ্ট ব্যাবহারকারীর নিকট পাঠান"
|
specifiedDescription: "শুধুমাত্র নির্দিষ্ট ব্যাবহারকারীর নিকট পাঠান"
|
||||||
|
localOnly: "শুধুমাত্র লোকাল"
|
||||||
|
localOnlyDescription: "রিমোট ব্যাবহারকারীদের নিকট দৃশ্যমান নয়"
|
||||||
_postForm:
|
_postForm:
|
||||||
replyPlaceholder: "নোটটির জবাব দিন..."
|
replyPlaceholder: "নোটটির জবাব দিন..."
|
||||||
quotePlaceholder: "নোটটিকে উদ্ধৃত করুন..."
|
quotePlaceholder: "নোটটিকে উদ্ধৃত করুন..."
|
||||||
|
@ -1190,7 +1276,6 @@ _profile:
|
||||||
changeBanner: "ব্যানার পরিবর্তন করুন"
|
changeBanner: "ব্যানার পরিবর্তন করুন"
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
allNotes: "সকল নোট"
|
allNotes: "সকল নোট"
|
||||||
clips: "ক্লিপ"
|
|
||||||
followingList: "অনুসরণ করা হচ্ছে"
|
followingList: "অনুসরণ করা হচ্ছে"
|
||||||
muteList: "মিউট"
|
muteList: "মিউট"
|
||||||
blockingList: "ব্লক"
|
blockingList: "ব্লক"
|
||||||
|
@ -1228,12 +1313,6 @@ _timelines:
|
||||||
local: "স্থানীয়"
|
local: "স্থানীয়"
|
||||||
social: "সামাজিক"
|
social: "সামাজিক"
|
||||||
global: "গ্লোবাল"
|
global: "গ্লোবাল"
|
||||||
_play:
|
|
||||||
viewSource: "উৎস দেখুন"
|
|
||||||
featured: "জনপ্রিয়"
|
|
||||||
title: "শিরোনাম"
|
|
||||||
script: "স্ক্রিপ্ট"
|
|
||||||
summary: "বর্ণনা"
|
|
||||||
_pages:
|
_pages:
|
||||||
newPage: "নতুন পৃষ্ঠা বানান"
|
newPage: "নতুন পৃষ্ঠা বানান"
|
||||||
editPage: "পৃষ্ঠাটি সম্পাদনা করুন"
|
editPage: "পৃষ্ঠাটি সম্পাদনা করুন"
|
||||||
|
@ -1269,6 +1348,8 @@ _pages:
|
||||||
eyeCatchingImageRemove: "থাম্বনেইল সরান"
|
eyeCatchingImageRemove: "থাম্বনেইল সরান"
|
||||||
chooseBlock: "ব্লক যোগ করুন"
|
chooseBlock: "ব্লক যোগ করুন"
|
||||||
selectType: "ধরন নির্বাচন করুন"
|
selectType: "ধরন নির্বাচন করুন"
|
||||||
|
enterVariableName: "চলকের নাম লিখুন"
|
||||||
|
variableNameIsAlreadyUsed: "চলকের নামটি ইতিপূর্বে ব্যাবহৃত হয়েছে"
|
||||||
contentBlocks: "বিষয়বস্তু"
|
contentBlocks: "বিষয়বস্তু"
|
||||||
inputBlocks: "ইনপুট"
|
inputBlocks: "ইনপুট"
|
||||||
specialBlocks: "বিশেষ"
|
specialBlocks: "বিশেষ"
|
||||||
|
@ -1278,11 +1359,249 @@ _pages:
|
||||||
section: "বিভাগ"
|
section: "বিভাগ"
|
||||||
image: "ছবি"
|
image: "ছবি"
|
||||||
button: "বাটন"
|
button: "বাটন"
|
||||||
|
if: "যদি"
|
||||||
|
_if:
|
||||||
|
variable: "চলকগুলি"
|
||||||
|
post: "নোট লিখুন"
|
||||||
|
_post:
|
||||||
|
text: "বিষয়বস্তু"
|
||||||
|
attachCanvasImage: "ক্যানভাস ছবিসহ পোস্ট করুন"
|
||||||
|
canvasId: "ক্যানভাস ID"
|
||||||
|
textInput: "টেক্সট ইনপুট"
|
||||||
|
_textInput:
|
||||||
|
name: "চলকের নাম"
|
||||||
|
text: "শিরোনাম"
|
||||||
|
default: "ডিফল্ট মান"
|
||||||
|
textareaInput: "একাধিক লাইনের টেক্সট ইনপুট"
|
||||||
|
_textareaInput:
|
||||||
|
name: "চলকের নাম"
|
||||||
|
text: "শিরোনাম"
|
||||||
|
default: "ডিফল্ট মান"
|
||||||
|
numberInput: "সংখ্যা ইনপুট"
|
||||||
|
_numberInput:
|
||||||
|
name: "চলকের নাম"
|
||||||
|
text: "শিরোনাম"
|
||||||
|
default: "ডিফল্ট মান"
|
||||||
|
canvas: "ক্যানভাস"
|
||||||
|
_canvas:
|
||||||
|
id: "ক্যানভাস ID"
|
||||||
|
width: "প্রস্থ"
|
||||||
|
height: "উচ্চতা"
|
||||||
note: "এম্বেড নোট"
|
note: "এম্বেড নোট"
|
||||||
_note:
|
_note:
|
||||||
id: "নোট ID"
|
id: "নোট ID"
|
||||||
idDescription: "আপনি এর বদলে নোটের URL পেস্ট করতে পারেন."
|
idDescription: "আপনি এর বদলে নোটের URL পেস্ট করতে পারেন."
|
||||||
detailed: "বিস্তারিত দেখুন"
|
detailed: "বিস্তারিত দেখুন"
|
||||||
|
switch: "সুইচ"
|
||||||
|
_switch:
|
||||||
|
name: "চলকের নাম"
|
||||||
|
text: "শিরোনাম"
|
||||||
|
default: "ডিফল্ট মান"
|
||||||
|
counter: "কাউন্টার"
|
||||||
|
_counter:
|
||||||
|
name: "চলকের নাম"
|
||||||
|
text: "শিরোনাম"
|
||||||
|
inc: "এভাবে মান বাড়ান"
|
||||||
|
_button:
|
||||||
|
text: "শিরোনাম"
|
||||||
|
colored: "রঙ্গিন"
|
||||||
|
action: "বাটনে ক্লিক করলে যা হবে"
|
||||||
|
_action:
|
||||||
|
dialog: "ডায়ালগ দেখান "
|
||||||
|
_dialog:
|
||||||
|
content: "বিষয়বস্তু"
|
||||||
|
resetRandom: "র্যানডম সিড রিসেট করুন"
|
||||||
|
pushEvent: "ইভেন্ট পাঠান"
|
||||||
|
_pushEvent:
|
||||||
|
event: "ইভেন্টের নাম"
|
||||||
|
message: "চালু হলে প্রদর্শনের জন্য বার্তা"
|
||||||
|
variable: "পাঠানো চলক"
|
||||||
|
no-variable: "কিছুই না"
|
||||||
|
callAiScript: "AiScript চালান"
|
||||||
|
_callAiScript:
|
||||||
|
functionName: "ফাংশনের নাম"
|
||||||
|
radioButton: "বহুনির্বাচনী"
|
||||||
|
_radioButton:
|
||||||
|
name: "চলকের নাম"
|
||||||
|
title: "শিরোনাম"
|
||||||
|
values: "বিকল্পগুলিকে আলাদা লাইনে লিখুন"
|
||||||
|
default: "ডিফল্ট মান"
|
||||||
|
script:
|
||||||
|
categories:
|
||||||
|
flow: "নিয়ন্ত্রণ"
|
||||||
|
logical: "লজিক্যাল অপারেশন"
|
||||||
|
operation: "হিসাব-নিকাশ"
|
||||||
|
comparison: "তুলনা"
|
||||||
|
random: "র্যান্ডম"
|
||||||
|
value: "মান"
|
||||||
|
fn: "ফাংশন"
|
||||||
|
text: "টেক্সট ম্যানিপুলেশন"
|
||||||
|
convert: "রুপান্তর"
|
||||||
|
list: "লিস্ট"
|
||||||
|
blocks:
|
||||||
|
text: "লেখা"
|
||||||
|
multiLineText: "লেখা (একাধিক লাইন)"
|
||||||
|
textList: "লেখার লিস্ট"
|
||||||
|
_textList:
|
||||||
|
info: "প্রতিটি এন্ট্রিকে আলাদা লাইনে লিখুন"
|
||||||
|
strLen: "লেখার দৈর্ঘ্য"
|
||||||
|
_strLen:
|
||||||
|
arg1: "লেখা"
|
||||||
|
strPick: "অক্ষর বের করে আনুন"
|
||||||
|
_strPick:
|
||||||
|
arg1: "লেখা"
|
||||||
|
arg2: "অক্ষরের অবস্থান"
|
||||||
|
strReplace: "লেখা প্রতিস্থাপন"
|
||||||
|
_strReplace:
|
||||||
|
arg1: "লেখা"
|
||||||
|
arg2: "যে লেখা প্রতিস্থাপন করা হবে"
|
||||||
|
arg3: "যা দ্বারা প্রতিস্থাপন করা হবে"
|
||||||
|
strReverse: "লেখা উল্টান"
|
||||||
|
_strReverse:
|
||||||
|
arg1: "লেখা"
|
||||||
|
join: "লেখা যুক্ত করুন"
|
||||||
|
_join:
|
||||||
|
arg1: "লিস্ট"
|
||||||
|
arg2: "বিভাজক"
|
||||||
|
add: "যোগ"
|
||||||
|
_add:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
subtract: "বিয়োগ"
|
||||||
|
_subtract:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
multiply: "গুন"
|
||||||
|
_multiply:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
divide: "ভাগ"
|
||||||
|
_divide:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
mod: "ভাগশেষ"
|
||||||
|
_mod:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
round: "দশমিক রাউন্ড করুন"
|
||||||
|
_round:
|
||||||
|
arg1: "সংখ্যা"
|
||||||
|
eq: "A ও B সমান"
|
||||||
|
_eq:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
notEq: "A ও B সমান না"
|
||||||
|
_notEq:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
and: "A এবং B"
|
||||||
|
_and:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
or: "A অথবা B"
|
||||||
|
_or:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
lt: "< A , B হতে কম"
|
||||||
|
_lt:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
gt: "> A , B হতে বেশী"
|
||||||
|
_gt:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
ltEq: "<= A , B হতে কম বা সমান"
|
||||||
|
_ltEq:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
gtEq: ">= A , B হতে বেশী বা সমান"
|
||||||
|
_gtEq:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
if: "যদি"
|
||||||
|
_if:
|
||||||
|
arg1: "যদি"
|
||||||
|
arg2: "তাহলে"
|
||||||
|
arg3: "তাছাড়া"
|
||||||
|
not: "না"
|
||||||
|
_not:
|
||||||
|
arg1: "না"
|
||||||
|
random: "র্যান্ডম"
|
||||||
|
_random:
|
||||||
|
arg1: "সম্ভাব্যতা"
|
||||||
|
rannum: "র্যানডম সংখ্যা"
|
||||||
|
_rannum:
|
||||||
|
arg1: "ন্যূনতম মান"
|
||||||
|
arg2: "সর্বোচ্চ মান"
|
||||||
|
randomPick: "তালিকা থেকে দৈবচয়ন করুন"
|
||||||
|
_randomPick:
|
||||||
|
arg1: "লিস্ট"
|
||||||
|
dailyRandom: "র্যান্ডম সংখ্যা (প্রতিটি ব্যবহারকারীর জন্য প্রতিদিন পরিবর্তীত হয়)"
|
||||||
|
_dailyRandom:
|
||||||
|
arg1: "সম্ভাব্যতা"
|
||||||
|
dailyRannum: "র্যান্ডম সংখ্যা (প্রতিটি ব্যবহারকারীর জন্য প্রতিদিন পরিবর্তীত হয়)"
|
||||||
|
_dailyRannum:
|
||||||
|
arg1: "ন্যূনতম মান"
|
||||||
|
arg2: "সর্বোচ্চ মান"
|
||||||
|
dailyRandomPick: "তালিকা থেকে এলোমেলোভাবে নির্বাচন করুন (প্রতিটি ব্যবহারকারীর জন্য প্রতিদিন পরিবর্তীত হয়)"
|
||||||
|
_dailyRandomPick:
|
||||||
|
arg1: "লিস্ট"
|
||||||
|
seedRandom: "র্যানডম (সীড দ্বারা)"
|
||||||
|
_seedRandom:
|
||||||
|
arg1: "সীড"
|
||||||
|
arg2: "সম্ভাব্যতা"
|
||||||
|
seedRannum: "র্যানডম সংখ্যা (সীড দ্বারা)"
|
||||||
|
_seedRannum:
|
||||||
|
arg1: "সীড"
|
||||||
|
arg2: "ন্যূনতম মান"
|
||||||
|
arg3: "সর্বোচ্চ মান"
|
||||||
|
seedRandomPick: "তালিকা থেকে দৈবচয়ন করুন (সীড দ্বারা)"
|
||||||
|
_seedRandomPick:
|
||||||
|
arg1: "সীড"
|
||||||
|
arg2: "লিস্ট"
|
||||||
|
DRPWPM: "সম্ভাব্যতা সহ একটি তালিকা থেকে এলোমেলোভাবে নির্বাচন করুন (প্রতিটি ব্যবহারকারীর জন্য প্রতিদিন)"
|
||||||
|
_DRPWPM:
|
||||||
|
arg1: "লেখার লিস্ট"
|
||||||
|
pick: "তালিকা থেকে নির্বাচন করুন"
|
||||||
|
_pick:
|
||||||
|
arg1: "লিস্ট"
|
||||||
|
arg2: "অবস্থান"
|
||||||
|
listLen: "লিস্টের দৈর্ঘ্য পান"
|
||||||
|
_listLen:
|
||||||
|
arg1: "লিস্ট"
|
||||||
|
number: "সংখ্যা"
|
||||||
|
stringToNumber: "পাঠ্য থেকে সংখ্যা"
|
||||||
|
_stringToNumber:
|
||||||
|
arg1: "লেখা"
|
||||||
|
numberToString: "সংখ্যা থেকে পাঠ্য"
|
||||||
|
_numberToString:
|
||||||
|
arg1: "সংখ্যা"
|
||||||
|
splitStrByLine: "পাঠ্যকে লাইনে বিভক্ত করুন"
|
||||||
|
_splitStrByLine:
|
||||||
|
arg1: "লেখা"
|
||||||
|
ref: "চলক"
|
||||||
|
aiScriptVar: "AiScript চলক"
|
||||||
|
fn: "ফাংশন"
|
||||||
|
_fn:
|
||||||
|
slots: "স্লটগুলি"
|
||||||
|
slots-info: "প্রতিটি স্লটকে আলাদা লাইনে লিখুন"
|
||||||
|
arg1: "আউটপুট"
|
||||||
|
for: "for-লুপ"
|
||||||
|
_for:
|
||||||
|
arg1: "কতবার চলবে"
|
||||||
|
arg2: "অ্যাকশন"
|
||||||
|
typeError: "স্লট {slot}, {expect} ধরনের মান গ্রহণ করে, কিন্তু {actual} ধরনের মান দেওয়া হয়েছে!"
|
||||||
|
thereIsEmptySlot: "স্লট {slot} খালি!"
|
||||||
|
types:
|
||||||
|
string: "লেখা"
|
||||||
|
number: "সংখ্যা"
|
||||||
|
boolean: "ফ্ল্যাগ"
|
||||||
|
array: "লিস্ট"
|
||||||
|
stringArray: "লেখার লিস্ট"
|
||||||
|
emptySlot: "খালি স্লট"
|
||||||
|
enviromentVariables: "এনভাইরনমেন্ট ভ্যারিয়েবল"
|
||||||
|
pageVariables: "পেজের চলক"
|
||||||
|
argVariables: "ইনপুটের জায়গা"
|
||||||
_relayStatus:
|
_relayStatus:
|
||||||
requesting: "অপেক্ষমান"
|
requesting: "অপেক্ষমান"
|
||||||
accepted: "অনুমোদিত"
|
accepted: "অনুমোদিত"
|
||||||
|
@ -1293,9 +1612,13 @@ _notification:
|
||||||
youGotReply: "{name} আপনাকে জবাব দিয়েছে"
|
youGotReply: "{name} আপনাকে জবাব দিয়েছে"
|
||||||
youGotQuote: "{name} আপনাকে উদ্ধৃত করেছে"
|
youGotQuote: "{name} আপনাকে উদ্ধৃত করেছে"
|
||||||
youRenoted: "{name} এর Renote"
|
youRenoted: "{name} এর Renote"
|
||||||
|
youGotPoll: "{name} আপনার পোলে ভোট দিয়েছে"
|
||||||
|
youGotMessagingMessageFromUser: "{name} আপনাকে মেসেজ করেছে"
|
||||||
|
youGotMessagingMessageFromGroup: "{name} গ্রুপে একটি নতুন মেসেজ আছে"
|
||||||
youWereFollowed: "আপনাকে অনুসরণ করছে"
|
youWereFollowed: "আপনাকে অনুসরণ করছে"
|
||||||
youReceivedFollowRequest: "অনুসরণ করার জন্য অনুরোধ পাওয়া গেছে"
|
youReceivedFollowRequest: "অনুসরণ করার জন্য অনুরোধ পাওয়া গেছে"
|
||||||
yourFollowRequestAccepted: "আপনার অনুসরণ করার অনুরোধ গৃহীত হয়েছে"
|
yourFollowRequestAccepted: "আপনার অনুসরণ করার অনুরোধ গৃহীত হয়েছে"
|
||||||
|
youWereInvitedToGroup: "আপনি একটি গ্রুপে আমন্ত্রিত হয়েছেন"
|
||||||
pollEnded: "পোলের ফলাফল দেখা যাবে"
|
pollEnded: "পোলের ফলাফল দেখা যাবে"
|
||||||
emptyPushNotificationMessage: "আপডেট করা পুশ বিজ্ঞপ্তি"
|
emptyPushNotificationMessage: "আপডেট করা পুশ বিজ্ঞপ্তি"
|
||||||
_types:
|
_types:
|
||||||
|
@ -1306,10 +1629,11 @@ _notification:
|
||||||
renote: "রিনোট"
|
renote: "রিনোট"
|
||||||
quote: "উদ্ধৃতি"
|
quote: "উদ্ধৃতি"
|
||||||
reaction: "প্রতিক্রিয়া"
|
reaction: "প্রতিক্রিয়া"
|
||||||
|
pollVote: "পোলে ভোট আছে"
|
||||||
pollEnded: "পোল শেষ"
|
pollEnded: "পোল শেষ"
|
||||||
receiveFollowRequest: "প্রাপ্ত অনুসরণের অনুরোধসমূহ"
|
receiveFollowRequest: "প্রাপ্ত অনুসরণের অনুরোধসমূহ"
|
||||||
followRequestAccepted: "গৃহীত অনুসরণের অনুরোধসমূহ"
|
followRequestAccepted: "গৃহীত অনুসরণের অনুরোধসমূহ"
|
||||||
login: "প্রবেশ করুন"
|
groupInvited: "গ্রুপের আমন্ত্রনসমূহ"
|
||||||
app: "লিঙ্ক করা অ্যাপ থেকে বিজ্ঞপ্তি"
|
app: "লিঙ্ক করা অ্যাপ থেকে বিজ্ঞপ্তি"
|
||||||
_actions:
|
_actions:
|
||||||
followBack: "ফলো ব্যাক করেছে"
|
followBack: "ফলো ব্যাক করেছে"
|
||||||
|
@ -1334,18 +1658,5 @@ _deck:
|
||||||
tl: "টাইমলাইন"
|
tl: "টাইমলাইন"
|
||||||
antenna: "অ্যান্টেনা"
|
antenna: "অ্যান্টেনা"
|
||||||
list: "লিস্ট"
|
list: "লিস্ট"
|
||||||
channel: "চ্যানেলগুলি"
|
|
||||||
mentions: "উল্লেখসমূহ"
|
mentions: "উল্লেখসমূহ"
|
||||||
direct: "ডাইরেক্ট নোটগুলি"
|
direct: "ডাইরেক্ট নোটগুলি"
|
||||||
_webhookSettings:
|
|
||||||
name: "নাম"
|
|
||||||
active: "চালু"
|
|
||||||
_abuseReport:
|
|
||||||
_notificationRecipient:
|
|
||||||
_recipientType:
|
|
||||||
mail: "ইমেইল"
|
|
||||||
_moderationLogTypes:
|
|
||||||
suspend: "স্থগিত করা"
|
|
||||||
resetPassword: "পাসওয়ার্ড রিসেট করুন"
|
|
||||||
_reversi:
|
|
||||||
total: "মোট"
|
|
||||||
|
|
2515
locales/ca-ES.yml
1451
locales/cs-CZ.yml
|
@ -1,4 +1,2 @@
|
||||||
---
|
---
|
||||||
_lang_: "Dansk"
|
_lang_: "Dansk"
|
||||||
headlineMisskey: ""
|
|
||||||
introMisskey: "ようこそ!Misskeyは、オープンソースの分散型マイクロブログサービスです。\n「ノート」を作成して、いま起こっていることを共有したり、あなたについて皆に発信しよう📡\n「リアクション」機能で、皆のノートに素早く反応を追加することもできます👍\n新しい世界を探検しよう🚀"
|
|
||||||
|
|