Compare commits
1774 Commits
help-docs-
...
internal_i
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8378af153b | ||
|
|
7f57fd597c | ||
|
|
f7515f520c | ||
|
|
b0ebbce292 | ||
|
|
3d409ffd77 | ||
|
|
6d45c3c4e5 | ||
|
|
35ca600c4e | ||
|
|
6fcf2732a8 | ||
|
|
311e8f3939 | ||
|
|
da1ff4131c | ||
|
|
d0bbdfec8e | ||
|
|
e5f2ae8ac8 | ||
|
|
701f42fa74 | ||
|
|
a119babe21 | ||
|
|
9dd9a8db80 | ||
|
|
ea4282882e | ||
|
|
862064d2e4 | ||
|
|
191ec62215 | ||
|
|
dabd703803 | ||
|
|
be6bc3747b | ||
|
|
9f9eab3644 | ||
|
|
88eb935d2f | ||
|
|
91499c7775 | ||
|
|
d71f50b79b | ||
|
|
25eaee57e9 | ||
|
|
cf3b5897d2 | ||
|
|
c00ad310ef | ||
|
|
10101c697b | ||
|
|
8ad1b94b87 | ||
|
|
783f53bfdc | ||
|
|
3e5ba6f939 | ||
|
|
b3c0681d54 | ||
|
|
98951e2d2a | ||
|
|
e8edacf924 | ||
|
|
f254a7841b | ||
|
|
508e83acd4 | ||
|
|
702b03a288 | ||
|
|
2c6f4228d2 | ||
|
|
95228cc0a6 | ||
|
|
e583794d37 | ||
|
|
87df2add67 | ||
|
|
c074f66b38 | ||
|
|
b8c7079c94 | ||
|
|
754dd48367 | ||
|
|
2b4ed5b43c | ||
|
|
7c87f27539 | ||
|
|
aae1caf37d | ||
|
|
9bdf6305f7 | ||
|
|
0a6558bf48 | ||
|
|
e13e27c10e | ||
|
|
7bd22fd5b8 | ||
|
|
d1d7d03af2 | ||
|
|
32b7081b02 | ||
|
|
676c3fd22c | ||
|
|
b305d3c9bf | ||
|
|
ad9cb3cb8d | ||
|
|
b833487c54 | ||
|
|
ba2cf287ce | ||
|
|
619d7676f6 | ||
|
|
0a19245c76 | ||
|
|
a60172473b | ||
|
|
0d7cbd3187 | ||
|
|
a292d09d8c | ||
|
|
b66348f277 | ||
|
|
e4b1adfd1d | ||
|
|
7325b7a385 | ||
|
|
0f78e90aa7 | ||
|
|
5c6ae7dcea | ||
|
|
46bcab26d5 | ||
|
|
4523a4272f | ||
|
|
4d6d3d651a | ||
|
|
a71663032d | ||
|
|
495d8449f7 | ||
|
|
4e7f95e999 | ||
|
|
5890c35050 | ||
|
|
bb1719c59f | ||
|
|
bd58becd38 | ||
|
|
d6fa9d1257 | ||
|
|
ee42e71168 | ||
|
|
0f2e7b40d0 | ||
|
|
79b1ecfcd6 | ||
|
|
ecf56dfd60 | ||
|
|
75d919e815 | ||
|
|
ed7cc5f8c1 | ||
|
|
aede55eb72 | ||
|
|
50790bf241 | ||
|
|
93b7cb8bea | ||
|
|
8f8eeb82a9 | ||
|
|
62baa623c9 | ||
|
|
b71651220b | ||
|
|
74d930005c | ||
|
|
25117f846a | ||
|
|
3ca5303db6 | ||
|
|
bc3302157c | ||
|
|
d57daf91a0 | ||
|
|
0d162b6075 | ||
|
|
7450996f4d | ||
|
|
463602c425 | ||
|
|
78864b9301 | ||
|
|
f37d94a2bd | ||
|
|
ee864ee0a5 | ||
|
|
d48b4392f5 | ||
|
|
4c61fd248d | ||
|
|
8feb69d711 | ||
|
|
446195b8f6 | ||
|
|
382cd90ea1 | ||
|
|
4f8b2e9fa0 | ||
|
|
fad05f3a7f | ||
|
|
99de753c44 | ||
|
|
88e0c6cdbf | ||
|
|
7a35748e30 | ||
|
|
21d59fa0a3 | ||
|
|
b89a9a7307 | ||
|
|
24266e9eca | ||
|
|
3419197817 | ||
|
|
79eff8aa5a | ||
|
|
ba07894d18 | ||
|
|
41593eecda | ||
|
|
b59a23d0ac | ||
|
|
d30fb6fc3c | ||
|
|
d06db67e3e | ||
|
|
6d59e51ffa | ||
|
|
16bc189c2b | ||
|
|
0906fddfc6 | ||
|
|
637f11ac23 | ||
|
|
e9da23aff9 | ||
|
|
d466b77f0e | ||
|
|
4e0fa8fecf | ||
|
|
f951880ed1 | ||
|
|
c942257c5f | ||
|
|
bc7d265812 | ||
|
|
f7ee1099c4 | ||
|
|
f6852885b1 | ||
|
|
050d7d3725 | ||
|
|
0289a5535e | ||
|
|
8242916172 | ||
|
|
241dcd64bf | ||
|
|
0b8f26d0bb | ||
|
|
ee1686370b | ||
|
|
c94e817205 | ||
|
|
4669107647 | ||
|
|
dcf0192257 | ||
|
|
7d9cfd8587 | ||
|
|
da7edac292 | ||
|
|
a0686dc8bd | ||
|
|
daaf73664a | ||
|
|
20fed3b65a | ||
|
|
8330e2902c | ||
|
|
8613d0d338 | ||
|
|
a33938a620 | ||
|
|
506fc51675 | ||
|
|
6751648aae | ||
|
|
17127b8f0e | ||
|
|
b9c8fdb080 | ||
|
|
98868dd76f | ||
|
|
b58aeddeba | ||
|
|
f8fe2bd7f2 | ||
|
|
59888840b5 | ||
|
|
be3568c3ba | ||
|
|
d606d9c1e0 | ||
|
|
bb9dd31520 | ||
|
|
a8cc1ab4f0 | ||
|
|
c87065b1c2 | ||
|
|
88aa5fbfe1 | ||
|
|
b8bb3d5730 | ||
|
|
cf75528f5e | ||
|
|
7a6fb1ba31 | ||
|
|
774292bdea | ||
|
|
4dd7305c46 | ||
|
|
3d952a2ecc | ||
|
|
9386e3796c | ||
|
|
77d7d358f3 | ||
|
|
e9ef9d55a4 | ||
|
|
968f04c04a | ||
|
|
59cb3f091e | ||
|
|
630f5a2706 | ||
|
|
4a743be322 | ||
|
|
c2db1f7da9 | ||
|
|
843e956a8a | ||
|
|
c2d1c66888 | ||
|
|
e2aabfb95a | ||
|
|
cd46db3d30 | ||
|
|
4f00296933 | ||
|
|
7ff2c8f424 | ||
|
|
dbf88c7bed | ||
|
|
a06a5be983 | ||
|
|
a3340d684f | ||
|
|
cfbacc3b45 | ||
|
|
f2791abd7c | ||
|
|
3387361489 | ||
|
|
3bba125f1c | ||
|
|
e9c084bd54 | ||
|
|
8d848050d1 | ||
|
|
3756a56776 | ||
|
|
1718e5d1d6 | ||
|
|
e4a0ed7ec1 | ||
|
|
b96e1a2536 | ||
|
|
b16c9af36b | ||
|
|
1cc3499019 | ||
|
|
4260c3c769 | ||
|
|
209291e09a | ||
|
|
c34d214313 | ||
|
|
b209779f59 | ||
|
|
dd08ca82fe | ||
|
|
8d71a6bb58 | ||
|
|
c583fa4742 | ||
|
|
ec0d3c4266 | ||
|
|
55cc92e57d | ||
|
|
3f71d491e9 | ||
|
|
304daf0b09 | ||
|
|
e1281657ba | ||
|
|
595871f571 | ||
|
|
d31127c2e3 | ||
|
|
51891996a2 | ||
|
|
5fd861b60a | ||
|
|
09d7b82c08 | ||
|
|
88c9f4943b | ||
|
|
cacc7dc85a | ||
|
|
24a30709cd | ||
|
|
caa092f6c5 | ||
|
|
bbcb6dc702 | ||
|
|
662f4a3fb7 | ||
|
|
b053b0082f | ||
|
|
8e4e06af73 | ||
|
|
439b4fdeec | ||
|
|
32efdf464e | ||
|
|
3578df0ac0 | ||
|
|
f76fa34e5b | ||
|
|
868c45baa4 | ||
|
|
fa1838c82e | ||
|
|
6b5db8d85b | ||
|
|
9c071c0dab | ||
|
|
73b87950de | ||
|
|
ee0c7472a1 | ||
|
|
ba56908d2d | ||
|
|
b5d725e139 | ||
|
|
5750d72c5a | ||
|
|
00a430927f | ||
|
|
ab57a1f8fe | ||
|
|
cfdeb475ef | ||
|
|
1f0f240f97 | ||
|
|
2ff5058a3e | ||
|
|
641dfdd11e | ||
|
|
054ad8b480 | ||
|
|
b3827dd812 | ||
|
|
087ba629e0 | ||
|
|
50ea38d471 | ||
|
|
e0c647f583 | ||
|
|
e08f97e543 | ||
|
|
43c06d93c7 | ||
|
|
ecad643ea6 | ||
|
|
9241755d44 | ||
|
|
efa82b7fb7 | ||
|
|
3ff0356dd2 | ||
|
|
3fdb906834 | ||
|
|
7c325065a5 | ||
|
|
4a346c47d1 | ||
|
|
dee38e3ed8 | ||
|
|
69237fa659 | ||
|
|
f32b98c1bc | ||
|
|
fb8a22d370 | ||
|
|
764921ec69 | ||
|
|
8a177bbe2c | ||
|
|
06397a4992 | ||
|
|
943a524ba9 | ||
|
|
f232fc401d | ||
|
|
a10dcd01b0 | ||
|
|
552003600a | ||
|
|
63746523e2 | ||
|
|
b5868468bd | ||
|
|
aa48543a98 | ||
|
|
164da10772 | ||
|
|
291368f7ba | ||
|
|
b6d797681d | ||
|
|
d67dc4b76f | ||
|
|
9b289d7845 | ||
|
|
21a843fb3b | ||
|
|
401c8e160a | ||
|
|
c2374ed14e | ||
|
|
dc6221c977 | ||
|
|
d78fa3f27d | ||
|
|
e30b8024e2 | ||
|
|
c95d3b8c00 | ||
|
|
ec532ad2ac | ||
|
|
479f2188b6 | ||
|
|
c7d96482cb | ||
|
|
67e1a64e7f | ||
|
|
49a8016786 | ||
|
|
39558a27c9 | ||
|
|
f7d4273c1d | ||
|
|
3369e14f69 | ||
|
|
9b28996d3f | ||
|
|
fd98243394 | ||
|
|
9cd6784837 | ||
|
|
127c480855 | ||
|
|
d1717ef308 | ||
|
|
08a43f5d64 | ||
|
|
bcb389c56d | ||
|
|
689edebec4 | ||
|
|
5b4d4b86f7 | ||
|
|
6423901165 | ||
|
|
4672b44d48 | ||
|
|
a97658b67d | ||
|
|
576f85055e | ||
|
|
8a4ef26a6e | ||
|
|
b6dafd5a17 | ||
|
|
a6e78ab732 | ||
|
|
e3ab4eda15 | ||
|
|
de8fa9f9e9 | ||
|
|
8541657ee0 | ||
|
|
14bc47c055 | ||
|
|
99a8f5152a | ||
|
|
7340e5a100 | ||
|
|
30f8162ee4 | ||
|
|
b68fda70ef | ||
|
|
ef08c4bd96 | ||
|
|
776c3158a7 | ||
|
|
987c02fdac | ||
|
|
0f8ea1e814 | ||
|
|
27af2c3bbc | ||
|
|
96c2270062 | ||
|
|
56d0acc501 | ||
|
|
e3a5cd060d | ||
|
|
781583c1db | ||
|
|
06d3f679f1 | ||
|
|
a809ab58b3 | ||
|
|
f06314fb13 | ||
|
|
9696409b01 | ||
|
|
e4f10d0e69 | ||
|
|
03c116c2ba | ||
|
|
b8d69e79f0 | ||
|
|
7f3311ad36 | ||
|
|
c318162feb | ||
|
|
60485e98c2 | ||
|
|
76e30fe959 | ||
|
|
2bee2fe71c | ||
|
|
1b1e82ebbd | ||
|
|
d319b244ee | ||
|
|
18dba3f629 | ||
|
|
22e85b0364 | ||
|
|
26fbe84d9c | ||
|
|
880594398d | ||
|
|
82cc0559b4 | ||
|
|
1c780c4b02 | ||
|
|
86f14f985b | ||
|
|
fa6694e2f9 | ||
|
|
35f0251064 | ||
|
|
aa60c3c71a | ||
|
|
d2c1437210 | ||
|
|
e31768afe9 | ||
|
|
a475cc9933 | ||
|
|
b260648192 | ||
|
|
be6f596b79 | ||
|
|
90c1638e7d | ||
|
|
8a4b038e86 | ||
|
|
a3dbaf7015 | ||
|
|
3b7d13aec0 | ||
|
|
034eb69473 | ||
|
|
f06403adc7 | ||
|
|
b580d6ce35 | ||
|
|
caf664f11d | ||
|
|
2d90c14890 | ||
|
|
4d078c094c | ||
|
|
cbfcbe8da2 | ||
|
|
d0f637b154 | ||
|
|
d2228ccd58 | ||
|
|
9233149e25 | ||
|
|
4d8d0d1b07 | ||
|
|
59b07f3507 | ||
|
|
38e5135878 | ||
|
|
2426b7405c | ||
|
|
0e66632337 | ||
|
|
b092d2e250 | ||
|
|
e259b06d63 | ||
|
|
2920f77c75 | ||
|
|
884e805f46 | ||
|
|
848771dcaa | ||
|
|
97b3a3cb57 | ||
|
|
57ec62e45e | ||
|
|
8f55749607 | ||
|
|
384a2f2c0a | ||
|
|
03c903fc5b | ||
|
|
d7d5e85618 | ||
|
|
f04b62e540 | ||
|
|
9db925c3a6 | ||
|
|
aeac72e35c | ||
|
|
85bea417a1 | ||
|
|
cb282aa56e | ||
|
|
834234143a | ||
|
|
4fc8f32df8 | ||
|
|
25c962c001 | ||
|
|
9937b9f096 | ||
|
|
407a8bd257 | ||
|
|
7eea133441 | ||
|
|
37e2ccaac3 | ||
|
|
0f101110e6 | ||
|
|
69fcdcf14b | ||
|
|
567582b423 | ||
|
|
937af3da37 | ||
|
|
9f028adb63 | ||
|
|
7e08f2ab3c | ||
|
|
2595fdebae | ||
|
|
9938db6af4 | ||
|
|
da4e0aa826 | ||
|
|
372c4d9086 | ||
|
|
80e28ee1a3 | ||
|
|
abd5704ebb | ||
|
|
30262f82a5 | ||
|
|
fddbbe5135 | ||
|
|
db981d0344 | ||
|
|
6f15b4178b | ||
|
|
bfd0bc116d | ||
|
|
ae28125a7a | ||
|
|
aa80f86a7a | ||
|
|
6221f904e4 | ||
|
|
beb3276c53 | ||
|
|
96276a1234 | ||
|
|
6e025945ae | ||
|
|
3fb02cf343 | ||
|
|
6d20b9cd55 | ||
|
|
a34a07644e | ||
|
|
67b9ba09fa | ||
|
|
01d3c80240 | ||
|
|
be7b57f3d5 | ||
|
|
786620a5ac | ||
|
|
2a0795dd47 | ||
|
|
68d831ef3d | ||
|
|
5b175b3734 | ||
|
|
1d7f9522e3 | ||
|
|
f9adbdf639 | ||
|
|
d327eb027c | ||
|
|
ef1a5358fd | ||
|
|
f4b909f4a7 | ||
|
|
236c6f612b | ||
|
|
c54ca8c7ae | ||
|
|
4c5d340b57 | ||
|
|
02ea875497 | ||
|
|
bafa3b5c5b | ||
|
|
1dc83b272a | ||
|
|
1d3b3eb1cf | ||
|
|
6a5e012236 | ||
|
|
f1cc16ddae | ||
|
|
6e14aaaad7 | ||
|
|
62a798d527 | ||
|
|
0e41627306 | ||
|
|
bcd5ca7bf5 | ||
|
|
ba94427b36 | ||
|
|
b7c11998c6 | ||
|
|
4864091202 | ||
|
|
72c45bd706 | ||
|
|
28be02bb9a | ||
|
|
93851db27a | ||
|
|
8335c9ac7e | ||
|
|
8a0f61a1c7 | ||
|
|
db30b8cfe8 | ||
|
|
65f75e3467 | ||
|
|
b9d9c6f65a | ||
|
|
e07fdfb5e1 | ||
|
|
2a7b218fed | ||
|
|
63a9ef9455 | ||
|
|
148a3c13db | ||
|
|
e79426e47f | ||
|
|
a5f3085e01 | ||
|
|
ec5b5ca80d | ||
|
|
2d076c3df8 | ||
|
|
6e67a8b815 | ||
|
|
896c2a3fe9 | ||
|
|
cbe7d2532b | ||
|
|
099b4202c0 | ||
|
|
6f181a7bbd | ||
|
|
211fa7cc11 | ||
|
|
043f8913c2 | ||
|
|
0748c9bf8d | ||
|
|
6e979c7591 | ||
|
|
53210c2212 | ||
|
|
85fb861980 | ||
|
|
efc19d1262 | ||
|
|
172531c585 | ||
|
|
8cc0fa7305 | ||
|
|
cc19b24cc4 | ||
|
|
87f04dbaa6 | ||
|
|
bf644477dc | ||
|
|
5748039371 | ||
|
|
7e93b52e5e | ||
|
|
e173982115 | ||
|
|
4445ef8aef | ||
|
|
3b273a9e7b | ||
|
|
ec23e869e8 | ||
|
|
dcb4dd4944 | ||
|
|
12f890a501 | ||
|
|
4e474d4f29 | ||
|
|
9020907b56 | ||
|
|
3812a92913 | ||
|
|
369fcddc39 | ||
|
|
b08545d40d | ||
|
|
99d7685be2 | ||
|
|
9f12229b28 | ||
|
|
d1951a1f10 | ||
|
|
85a3a2f2ea | ||
|
|
275c1d4705 | ||
|
|
f70c284b58 | ||
|
|
d3bef2e8cb | ||
|
|
522704ccb8 | ||
|
|
6ae0516bd7 | ||
|
|
e64d66a320 | ||
|
|
27faef415f | ||
|
|
fd05961303 | ||
|
|
093624a6ee | ||
|
|
9d87560d5c | ||
|
|
04a23c03d2 | ||
|
|
23728107a3 | ||
|
|
2ffce031de | ||
|
|
cde42eb43a | ||
|
|
ce380b3b7a | ||
|
|
d4d29d1957 | ||
|
|
94b4c6b0bb | ||
|
|
a2072c022c | ||
|
|
7dabd9545e | ||
|
|
46dc71ebd2 | ||
|
|
bbe10b1618 | ||
|
|
c9521fb626 | ||
|
|
70b5b8e682 | ||
|
|
5c0b3795c2 | ||
|
|
69cf09e13d | ||
|
|
9e4a67312f | ||
|
|
4e8a4250dc | ||
|
|
1cc80aab75 | ||
|
|
ea5ebd0965 | ||
|
|
ef752a244c | ||
|
|
0d55ae1a6d | ||
|
|
ad892c1055 | ||
|
|
6249211bca | ||
|
|
5b7d4a8806 | ||
|
|
337c25b670 | ||
|
|
595e458c49 | ||
|
|
eb92929647 | ||
|
|
9d24914c1c | ||
|
|
e68b695284 | ||
|
|
0343bdd393 | ||
|
|
745528a9f1 | ||
|
|
b7e6015720 | ||
|
|
a3364408b7 | ||
|
|
67c65657a4 | ||
|
|
29f7a54950 | ||
|
|
fd39c78e5d | ||
|
|
e88a3b59e7 | ||
|
|
2b258f984d | ||
|
|
44c73cb110 | ||
|
|
5c4b4b9194 | ||
|
|
3cf4d3ee31 | ||
|
|
b1386b8f57 | ||
|
|
802a3edf9b | ||
|
|
aec3ec718b | ||
|
|
e856a653b8 | ||
|
|
21fb4e6a03 | ||
|
|
ef7ff0b186 | ||
|
|
95c35d7df8 | ||
|
|
0d5b1ef094 | ||
|
|
033caedfb5 | ||
|
|
32d1d357ba | ||
|
|
9927cc1988 | ||
|
|
efaab96e2c | ||
|
|
1a6c6d2b67 | ||
|
|
093e3a0061 | ||
|
|
f7597e5ea5 | ||
|
|
2c57a99b5f | ||
|
|
d7b6c771e8 | ||
|
|
1feebfdb83 | ||
|
|
f1f0a77bc0 | ||
|
|
a8c270433a | ||
|
|
7aa327badd | ||
|
|
042e08f504 | ||
|
|
c2a84cd707 | ||
|
|
45d89e4108 | ||
|
|
290df814b8 | ||
|
|
42f2d51766 | ||
|
|
06656c1d88 | ||
|
|
794d1e0112 | ||
|
|
d2a0c74554 | ||
|
|
81e40b0872 | ||
|
|
cd51f1f147 | ||
|
|
cbe7c32150 | ||
|
|
089a5835b0 | ||
|
|
06a30078da | ||
|
|
97bdcffd9d | ||
|
|
c74f79e93b | ||
|
|
162a2efe71 | ||
|
|
1634c90ad9 | ||
|
|
2235482345 | ||
|
|
e2bee5d5a4 | ||
|
|
5e4ad6e6a4 | ||
|
|
ad7dad59bc | ||
|
|
cf99651e2d | ||
|
|
4a26ce1b58 | ||
|
|
9bdb0f6a94 | ||
|
|
3a46f9994f | ||
|
|
f053b7962b | ||
|
|
76a479064e | ||
|
|
ffb19c3a65 | ||
|
|
ddcfd2ff43 | ||
|
|
3c7b1c6c5e | ||
|
|
d04ee0aa71 | ||
|
|
ce020d4398 | ||
|
|
028a5cf827 | ||
|
|
c60288b0df | ||
|
|
2fba8a2705 | ||
|
|
f66304815e | ||
|
|
17ac627ddd | ||
|
|
54aec6e0db | ||
|
|
7edb1fab7b | ||
|
|
21738995cc | ||
|
|
b752af7046 | ||
|
|
60b044e61a | ||
|
|
98364405c6 | ||
|
|
23558a2584 | ||
|
|
035f40dc0a | ||
|
|
910a64dc1c | ||
|
|
8c5bc316f9 | ||
|
|
645bb485a7 | ||
|
|
68fa4d87eb | ||
|
|
f527624027 | ||
|
|
fb06332272 | ||
|
|
4fda4b5773 | ||
|
|
68efbc2bed | ||
|
|
e47d6a8ece | ||
|
|
09466f05c6 | ||
|
|
738088e8a5 | ||
|
|
54dde95545 | ||
|
|
7ded133caf | ||
|
|
fe2f066733 | ||
|
|
5034fb4496 | ||
|
|
b854730533 | ||
|
|
a538e852bd | ||
|
|
436a5811cb | ||
|
|
27a400743c | ||
|
|
4e692fce1f | ||
|
|
09de1f2d46 | ||
|
|
2caf773bbe | ||
|
|
edc015d589 | ||
|
|
d5707a030b | ||
|
|
8ed7fa0e4c | ||
|
|
4f9e9f30aa | ||
|
|
f08f72c46a | ||
|
|
4885c13d86 | ||
|
|
46b0b7ce70 | ||
|
|
bd267edf3f | ||
|
|
b0d44f3799 | ||
|
|
bb91471cdc | ||
|
|
7f24ffd7ef | ||
|
|
fb03c88a5d | ||
|
|
07420304d0 | ||
|
|
aa26a48e67 | ||
|
|
bd776dc98d | ||
|
|
dc3f0be186 | ||
|
|
5cc68e5bb5 | ||
|
|
092d8aa9f5 | ||
|
|
2d87237d10 | ||
|
|
579c2620bf | ||
|
|
3c2eeadec6 | ||
|
|
1b178ec6ab | ||
|
|
944b2ec4b8 | ||
|
|
ac7e4eeccf | ||
|
|
0bddd91b2e | ||
|
|
ae225cf89d | ||
|
|
8569b27e8f | ||
|
|
4f4649f7a2 | ||
|
|
b69f1bd237 | ||
|
|
59e9967518 | ||
|
|
0621c3d30b | ||
|
|
236a51b0b8 | ||
|
|
c9f5c03e17 | ||
|
|
1a3b38f219 | ||
|
|
ce377308e3 | ||
|
|
155bb5a214 | ||
|
|
9d9b7a87f5 | ||
|
|
0c3b751b30 | ||
|
|
6a8cfe31de | ||
|
|
c9175bee04 | ||
|
|
76939691fd | ||
|
|
c2b6bfa1ed | ||
|
|
0056d87009 | ||
|
|
eaefeebe83 | ||
|
|
d92183bd0b | ||
|
|
27605ce156 | ||
|
|
df3a6a5a22 | ||
|
|
eeff3d5cdf | ||
|
|
0565b71653 | ||
|
|
8e5786c6fb | ||
|
|
4b826d1aed | ||
|
|
556177358e | ||
|
|
19f4acfc94 | ||
|
|
599e59c548 | ||
|
|
19b508d869 | ||
|
|
c4719f7d9d | ||
|
|
d5eea09c8a | ||
|
|
04125bc30c | ||
|
|
fda415aab1 | ||
|
|
ab052dcb89 | ||
|
|
5210a5a0ba | ||
|
|
7607d2a14a | ||
|
|
0abf4354aa | ||
|
|
6c3cc168c9 | ||
|
|
516420d872 | ||
|
|
358a86f18f | ||
|
|
52d024a263 | ||
|
|
da3df70544 | ||
|
|
e3ed92e930 | ||
|
|
cfce0bc198 | ||
|
|
f9b2b90f4e | ||
|
|
c60aed7f0f | ||
|
|
1cc9115972 | ||
|
|
332d4219ac | ||
|
|
3bda830156 | ||
|
|
00799c531a | ||
|
|
883b5b66e9 | ||
|
|
759bea83bb | ||
|
|
51ba11cfcc | ||
|
|
4c82d6bc84 | ||
|
|
f66f6ab9be | ||
|
|
5f76391379 | ||
|
|
fa39effe9c | ||
|
|
61a7b4f07a | ||
|
|
798a03007a | ||
|
|
8386e3a4f1 | ||
|
|
3575704724 | ||
|
|
e8b68d7d28 | ||
|
|
c7bf3a0a9d | ||
|
|
66617ada86 | ||
|
|
edacaaa334 | ||
|
|
dfec66f971 | ||
|
|
70faf61391 | ||
|
|
9903201fa8 | ||
|
|
4a0f0f295d | ||
|
|
16a2a5cc13 | ||
|
|
6405886aca | ||
|
|
ad0cf583b5 | ||
|
|
2608a8c9ab | ||
|
|
d4e9bdd035 | ||
|
|
b6de9497d3 | ||
|
|
e27f4544d0 | ||
|
|
ac8efa9d7d | ||
|
|
489c806923 | ||
|
|
e1a2946a2b | ||
|
|
354c08921b | ||
|
|
a7f89d0077 | ||
|
|
7d8fb296af | ||
|
|
7509a367c5 | ||
|
|
5f0154f9fe | ||
|
|
0c6cc8f7a1 | ||
|
|
7f0ac9629e | ||
|
|
c4a9b2e4f9 | ||
|
|
fcef3fd4e5 | ||
|
|
a434862b2f | ||
|
|
c91ad8348e | ||
|
|
cac053f4e9 | ||
|
|
99b379280f | ||
|
|
0529c8cf9b | ||
|
|
5ae5341658 | ||
|
|
b3bff83a40 | ||
|
|
9efd99fd10 | ||
|
|
7fc4f36970 | ||
|
|
fc5837ea3b | ||
|
|
7ebb039b35 | ||
|
|
f33eb83eef | ||
|
|
81947c61ab | ||
|
|
8d3057e011 | ||
|
|
d5a46f273a | ||
|
|
b02e987fdc | ||
|
|
ed6e401688 | ||
|
|
1256852259 | ||
|
|
5b360a549a | ||
|
|
0337cccea4 | ||
|
|
7514b93261 | ||
|
|
f5c5ffd86d | ||
|
|
ac4b737e89 | ||
|
|
4792775630 | ||
|
|
f22ca13205 | ||
|
|
7076deb46e | ||
|
|
4eebcc03b9 | ||
|
|
7eed321c99 | ||
|
|
9b39dd2697 | ||
|
|
8e34fa7bf3 | ||
|
|
4be696dd6d | ||
|
|
ea90f5c6cb | ||
|
|
ccaa00152e | ||
|
|
1b4ead7f77 | ||
|
|
a9b454a631 | ||
|
|
a44db791d3 | ||
|
|
23b017c17d | ||
|
|
4a81c56a55 | ||
|
|
5141b04695 | ||
|
|
e70d704ced | ||
|
|
3f87fd1a5a | ||
|
|
72028ec9d2 | ||
|
|
7af11786fb | ||
|
|
61fb167cec | ||
|
|
9fd950f928 | ||
|
|
a888d40722 | ||
|
|
5d594b4952 | ||
|
|
55a21c1233 | ||
|
|
49e2ae3120 | ||
|
|
5ee16e992b | ||
|
|
ad269fe995 | ||
|
|
17937f8c54 | ||
|
|
886ceec05c | ||
|
|
433be55081 | ||
|
|
e664a3ec70 | ||
|
|
ad9fd6d547 | ||
|
|
d921541d5d | ||
|
|
6b16f7f172 | ||
|
|
e463d68688 | ||
|
|
41cda039ec | ||
|
|
4989204b59 | ||
|
|
04ae708f33 | ||
|
|
d803c31d63 | ||
|
|
903c46bae0 | ||
|
|
6b965b1aa6 | ||
|
|
04395739d5 | ||
|
|
c5ec0891c9 | ||
|
|
3213735a4d | ||
|
|
b854a603af | ||
|
|
641f48e27d | ||
|
|
7016861281 | ||
|
|
ae5144635e | ||
|
|
a0a0556037 | ||
|
|
be8d1932b1 | ||
|
|
b127cf724b | ||
|
|
cc1177150b | ||
|
|
9f82c3788b | ||
|
|
67be26604f | ||
|
|
ec4deb5179 | ||
|
|
f02f10f832 | ||
|
|
eb75b2addf | ||
|
|
a0061da938 | ||
|
|
e5fbd5fde5 | ||
|
|
6c53421e36 | ||
|
|
e38477aa64 | ||
|
|
27380d3c42 | ||
|
|
a70f9327aa | ||
|
|
5dd6482937 | ||
|
|
6465106302 | ||
|
|
5b6d0e7a2a | ||
|
|
8b46cf6bc5 | ||
|
|
090e8bbf40 | ||
|
|
4ccb782740 | ||
|
|
54722ac5c3 | ||
|
|
8e1711c951 | ||
|
|
088630ccce | ||
|
|
799b1b0d03 | ||
|
|
dc787a2754 | ||
|
|
d319f42a4d | ||
|
|
aea62fcd2c | ||
|
|
b8eb200295 | ||
|
|
f16b75ae9c | ||
|
|
47359051a1 | ||
|
|
b273a70a3e | ||
|
|
3b3038ebb9 | ||
|
|
569a16cc5b | ||
|
|
3780d41765 | ||
|
|
78b9ce1674 | ||
|
|
601a1d029b | ||
|
|
5c55e52cc1 | ||
|
|
2740ad75af | ||
|
|
e3a72987ce | ||
|
|
6870ed24f2 | ||
|
|
ab2d49b162 | ||
|
|
cd98458ada | ||
|
|
909cba41bc | ||
|
|
3fdfb6c57d | ||
|
|
2fbce97f89 | ||
|
|
e4fd78250d | ||
|
|
cef3679bb3 | ||
|
|
e65b5cefdc | ||
|
|
71650df31f | ||
|
|
b785fe69f4 | ||
|
|
67c3375ace | ||
|
|
bdb5f5894e | ||
|
|
a0d4326d62 | ||
|
|
a16b20122d | ||
|
|
b981152dee | ||
|
|
63c1e63035 | ||
|
|
2c2b8f77cb | ||
|
|
ef4b9ebc42 | ||
|
|
1babaf529e | ||
|
|
f4ec5f348d | ||
|
|
5a881440d9 | ||
|
|
44f8d80b22 | ||
|
|
477c01bc55 | ||
|
|
b2df63e499 | ||
|
|
038de1d7ad | ||
|
|
5f1e393ac7 | ||
|
|
e38a39200a | ||
|
|
217b40a107 | ||
|
|
938e7284d7 | ||
|
|
8fe3182b79 | ||
|
|
d271472984 | ||
|
|
3acb04f4cc | ||
|
|
9628bf8723 | ||
|
|
4161371a8e | ||
|
|
0bb10f2ee0 | ||
|
|
3f50771e18 | ||
|
|
9d707fcb48 | ||
|
|
a13db6b268 | ||
|
|
2b9d80d23f | ||
|
|
8706b368ba | ||
|
|
d46b27e81f | ||
|
|
58f3144ea0 | ||
|
|
d65aeaf181 | ||
|
|
da8b9daff0 | ||
|
|
a6a1b4baa8 | ||
|
|
b9f6d19152 | ||
|
|
324d2fbe4f | ||
|
|
86446ab8bf | ||
|
|
380289e660 | ||
|
|
c66ee58d85 | ||
|
|
37a70125b9 | ||
|
|
c8715ca846 | ||
|
|
d3491b80ee | ||
|
|
fa62abb7be | ||
|
|
2b57a59b47 | ||
|
|
3bf3018d22 | ||
|
|
fd331c0733 | ||
|
|
b5f12b56fa | ||
|
|
096a1dd043 | ||
|
|
02e2abef07 | ||
|
|
e629db5bb1 | ||
|
|
1274ea21d4 | ||
|
|
6fda320c83 | ||
|
|
7a3cd9a139 | ||
|
|
06a5611a56 | ||
|
|
db8fa98ac6 | ||
|
|
952f8212dc | ||
|
|
24507f5f23 | ||
|
|
66079b0af2 | ||
|
|
88498f11fc | ||
|
|
c5afc6d453 | ||
|
|
5d7848752f | ||
|
|
bf93e28a3d | ||
|
|
124006929f | ||
|
|
bf8713ba21 | ||
|
|
878b46631f | ||
|
|
4832739ff8 | ||
|
|
67f43453aa | ||
|
|
43eb6ca30f | ||
|
|
2449c6d592 | ||
|
|
f41bd1818d | ||
|
|
8f8056a918 | ||
|
|
c14846f4fc | ||
|
|
2eaa2d6ee2 | ||
|
|
d183000fe3 | ||
|
|
396b893f43 | ||
|
|
fffb1e2734 | ||
|
|
4419090831 | ||
|
|
f6e464bb21 | ||
|
|
88d3f2388c | ||
|
|
7bbbeceab5 | ||
|
|
8d35e16abe | ||
|
|
282f908ffd | ||
|
|
9f86b3fdd2 | ||
|
|
a3c011070a | ||
|
|
ef76904b4d | ||
|
|
aa4b44f8bd | ||
|
|
311b7ef77e | ||
|
|
2678b94433 | ||
|
|
eac85d1708 | ||
|
|
766608696d | ||
|
|
59b761bf33 | ||
|
|
b93f78b3c9 | ||
|
|
bcc293358f | ||
|
|
4c30d9d6d1 | ||
|
|
022dd35d5a | ||
|
|
9351c1121e | ||
|
|
a7a69aa558 | ||
|
|
3923f18cd8 | ||
|
|
fbd0bf257e | ||
|
|
86d09d997a | ||
|
|
241e1cbf88 | ||
|
|
fc4379f4e1 | ||
|
|
d84c42e5c1 | ||
|
|
b092fcaf29 | ||
|
|
3dd9696f75 | ||
|
|
0eba503d2f | ||
|
|
b6ea502bc3 | ||
|
|
e603853e52 | ||
|
|
fa137dcccc | ||
|
|
7719c4604e | ||
|
|
4b82516909 | ||
|
|
17648c582a | ||
|
|
1559ae7f42 | ||
|
|
498a60d752 | ||
|
|
22b6707e92 | ||
|
|
08b92cc560 | ||
|
|
37bc453de6 | ||
|
|
493fe4b3a5 | ||
|
|
f22a065c15 | ||
|
|
6b50b24abf | ||
|
|
b0b8169e2e | ||
|
|
53ab5b05c3 | ||
|
|
bd93fe5538 | ||
|
|
96ebaf3c7f | ||
|
|
0ba9bdb666 | ||
|
|
f66a433442 | ||
|
|
c14021f2a7 | ||
|
|
85ac983ab9 | ||
|
|
3f0897ae77 | ||
|
|
f7e96794cd | ||
|
|
1624ef52d7 | ||
|
|
b7541e02e1 | ||
|
|
db69caedf9 | ||
|
|
9dac908dc1 | ||
|
|
7211f4992a | ||
|
|
606a838ad0 | ||
|
|
65bf785cce | ||
|
|
3bcab0216f | ||
|
|
cb83a19edf | ||
|
|
6df16159d0 | ||
|
|
a840950fbb | ||
|
|
8ae29074c5 | ||
|
|
f22372c271 | ||
|
|
568d4eadff | ||
|
|
755de42dbe | ||
|
|
1016706a6b | ||
|
|
76bff25de1 | ||
|
|
d1c393b177 | ||
|
|
4e52caf23b | ||
|
|
03462771a4 | ||
|
|
c9304c1992 | ||
|
|
2baeaf1119 | ||
|
|
6cdc6ce9b4 | ||
|
|
97307598f0 | ||
|
|
de4bbf44d7 | ||
|
|
bc39f60183 | ||
|
|
45308a70a8 | ||
|
|
450c7b187f | ||
|
|
f3438751ed | ||
|
|
919d1a4503 | ||
|
|
de0f3205ac | ||
|
|
d8f2965f82 | ||
|
|
7954b143b5 | ||
|
|
17d33fc9f6 | ||
|
|
c18b1a7e83 | ||
|
|
21ec31d4d3 | ||
|
|
bd0f04258a | ||
|
|
7d995bd83a | ||
|
|
98fd2021b7 | ||
|
|
63fc066301 | ||
|
|
d9fa30dbef | ||
|
|
012a3bef0a | ||
|
|
c23cd8d2f0 | ||
|
|
9e80aeb061 | ||
|
|
cbf82f464d | ||
|
|
6d576adce0 | ||
|
|
eb5a0cb1db | ||
|
|
43b96776e4 | ||
|
|
57d919b56f | ||
|
|
54b9661ddc | ||
|
|
b13f4c0b18 | ||
|
|
af6942e99d | ||
|
|
d8e5526655 | ||
|
|
e4de98b9d6 | ||
|
|
bb75627383 | ||
|
|
130148e5d6 | ||
|
|
e2f40f1e33 | ||
|
|
13c9afb219 | ||
|
|
a32a6e9b9e | ||
|
|
828ade2609 | ||
|
|
64d04ca22d | ||
|
|
1996bc2612 | ||
|
|
eaa15b0d66 | ||
|
|
8003b8a6b8 | ||
|
|
904a2c9743 | ||
|
|
c3d4214ad0 | ||
|
|
f641fac98c | ||
|
|
b03bdfb9d6 | ||
|
|
f3484eff79 | ||
|
|
55aa8d73f0 | ||
|
|
07da6cece6 | ||
|
|
6799acf965 | ||
|
|
b3bb79ecd4 | ||
|
|
858d9d3f04 | ||
|
|
caa180ba1a | ||
|
|
d58388e5d2 | ||
|
|
6b5c4f07c2 | ||
|
|
03e7ad6268 | ||
|
|
61bd4eefa7 | ||
|
|
92e33c8c20 | ||
|
|
82063ce972 | ||
|
|
fd8bbc3c95 | ||
|
|
9cca314ea9 | ||
|
|
33a64106be | ||
|
|
519287805f | ||
|
|
36880fac6d | ||
|
|
83bf37c8bb | ||
|
|
328b2f5961 | ||
|
|
3244686058 | ||
|
|
8af2aa35d4 | ||
|
|
f743dc14d5 | ||
|
|
573d269aac | ||
|
|
18ef86ddc3 | ||
|
|
d6a340ac79 | ||
|
|
b217093bc9 | ||
|
|
d265181c26 | ||
|
|
a022d4aaa2 | ||
|
|
c4f6ed6938 | ||
|
|
6e3a0b1b94 | ||
|
|
f6b6cfa4d0 | ||
|
|
3ba6ecc3c2 | ||
|
|
bdfaf6dcd2 | ||
|
|
6e5fb95e8f | ||
|
|
0c81d2ff56 | ||
|
|
d1dd9aacfe | ||
|
|
7f18c4e669 | ||
|
|
fe334c0a24 | ||
|
|
8e0172eb03 | ||
|
|
95b73953d8 | ||
|
|
34c606ddba | ||
|
|
63597b3bc4 | ||
|
|
7dd6e46543 | ||
|
|
c090609045 | ||
|
|
4c9e7956c1 | ||
|
|
1b0bc7fd1e | ||
|
|
2baa16bba7 | ||
|
|
3587f8cafd | ||
|
|
8e756215c0 | ||
|
|
6512820653 | ||
|
|
8dd4a178dd | ||
|
|
89cb13ffde | ||
|
|
81cb6c5ee4 | ||
|
|
d3cd20ef1a | ||
|
|
0670d02bb8 | ||
|
|
eef3f19644 | ||
|
|
b1e1f877d0 | ||
|
|
6be2d19b35 | ||
|
|
1b700c894d | ||
|
|
2ec460a01e | ||
|
|
ac25abf7d5 | ||
|
|
19d6f437e3 | ||
|
|
c9edc409bc | ||
|
|
599ca52e16 | ||
|
|
023de8274d | ||
|
|
1b77d0eca6 | ||
|
|
e9092fe01d | ||
|
|
8bc60f9b5b | ||
|
|
a851a1132d | ||
|
|
93930d0636 | ||
|
|
d9941a7711 | ||
|
|
d8be34000b | ||
|
|
da993fa9f6 | ||
|
|
f76e07337d | ||
|
|
b09f7d57a0 | ||
|
|
2c1dd14098 | ||
|
|
6249e5e4d6 | ||
|
|
3aa6e5712b | ||
|
|
a9d2b09260 | ||
|
|
a964976b67 | ||
|
|
e48caecfe0 | ||
|
|
686ab262b2 | ||
|
|
2418c24901 | ||
|
|
9c5e46ee11 | ||
|
|
1bbdefbd41 | ||
|
|
3dcd2570ad | ||
|
|
2ed28c3b70 | ||
|
|
3c87ef0d28 | ||
|
|
d0fc047fc9 | ||
|
|
3e0448bbe5 | ||
|
|
773d98e20c | ||
|
|
29afe01c40 | ||
|
|
d49288a1c0 | ||
|
|
d7faaa6592 | ||
|
|
b99b3646da | ||
|
|
d4ca156f53 | ||
|
|
4e59a4af5f | ||
|
|
15eb0321ac | ||
|
|
f7dfb5df24 | ||
|
|
52103c4b2f | ||
|
|
9fd724ff2d | ||
|
|
230244f2e5 | ||
|
|
7f14bdd0a0 | ||
|
|
f71e5accce | ||
|
|
e055c750aa | ||
|
|
11f2cce274 | ||
|
|
69eef7043f | ||
|
|
60cc6fda96 | ||
|
|
ee603ba82e | ||
|
|
8c8f0b46ef | ||
|
|
231a77239f | ||
|
|
89f58bf043 | ||
|
|
4dc3421ab9 | ||
|
|
ce9c227780 | ||
|
|
0d77c0a49b | ||
|
|
f9b67e2197 | ||
|
|
114ff5dc9b | ||
|
|
2a85d17cc1 | ||
|
|
d430a5cf31 | ||
|
|
f484f953fa | ||
|
|
c23d9cb96f | ||
|
|
eca8f3432e | ||
|
|
2edce34f29 | ||
|
|
af0fccf36e | ||
|
|
f00d04c0b8 | ||
|
|
a310fbe14f | ||
|
|
fc1e119fcd | ||
|
|
569423af12 | ||
|
|
8cd25252f8 | ||
|
|
1e63fe72cf | ||
|
|
1a5a7d71b6 | ||
|
|
91198d02e3 | ||
|
|
aa45fe898a | ||
|
|
92e013d5c9 | ||
|
|
9acfbf355c | ||
|
|
59f64da447 | ||
|
|
31f3958925 | ||
|
|
c78588c9c2 | ||
|
|
2dbeffe380 | ||
|
|
9f9aa17cb4 | ||
|
|
44ea3d92e2 | ||
|
|
21d3f42e2a | ||
|
|
b4052fcc00 | ||
|
|
fc7b8c18cb | ||
|
|
6983dd9364 | ||
|
|
5877d64449 | ||
|
|
cc54faf78a | ||
|
|
446b7bbd00 | ||
|
|
53468c9c3e | ||
|
|
67e1cddfa1 | ||
|
|
5c83f3aa15 | ||
|
|
d32b44bc2d | ||
|
|
b70c216131 | ||
|
|
58e2b8ab52 | ||
|
|
8b7e630bed | ||
|
|
323c37c34e | ||
|
|
b593f2d390 | ||
|
|
3800ba1dc9 | ||
|
|
8a00cfe2e7 | ||
|
|
e8e0ff63fc | ||
|
|
c324267c5f | ||
|
|
6a481f40da | ||
|
|
d02650047a | ||
|
|
b908fd8efb | ||
|
|
0aaed84549 | ||
|
|
7b980d83c1 | ||
|
|
dc9a90046e | ||
|
|
3cd5610b45 | ||
|
|
48a392ef78 | ||
|
|
1e324b3e5c | ||
|
|
37967ecc05 | ||
|
|
b3776600e6 | ||
|
|
90f3deb5e7 | ||
|
|
79d35f3710 | ||
|
|
5b2463258c | ||
|
|
7607003dd5 | ||
|
|
c4abdc3230 | ||
|
|
de079ca3b8 | ||
|
|
80f1420170 | ||
|
|
e3c7c8c994 | ||
|
|
dabdb01ce6 | ||
|
|
6a4a971863 | ||
|
|
de6a0ab5bc | ||
|
|
41102dab4b | ||
|
|
9ac77d832f | ||
|
|
2ab250e7db | ||
|
|
75e289640a | ||
|
|
6bf4b9faf4 | ||
|
|
15925b47fb | ||
|
|
a58ab7cd16 | ||
|
|
e566b1596d | ||
|
|
a61389b776 | ||
|
|
14c9dad567 | ||
|
|
fc1f3d66a2 | ||
|
|
1d45f09162 | ||
|
|
33c321c7ff | ||
|
|
6b336ed19a | ||
|
|
c6d57fe689 | ||
|
|
154fb77a1f | ||
|
|
de1a87b855 | ||
|
|
d121bd5ed2 | ||
|
|
fb55b785c2 | ||
|
|
9ec9282492 | ||
|
|
cf8ad57eea | ||
|
|
0dad2dedeb | ||
|
|
276d75b47d | ||
|
|
1230ed3018 | ||
|
|
c0d26e80b3 | ||
|
|
ea439c939f | ||
|
|
7976873384 | ||
|
|
bedda2cbc4 | ||
|
|
dd8a355ac4 | ||
|
|
f2bc7a3f20 | ||
|
|
5820bb6c1b | ||
|
|
d93f52ad1a | ||
|
|
383c12f11b | ||
|
|
5839bbd690 | ||
|
|
60b040f54b | ||
|
|
60c7adbb8a | ||
|
|
d45d3c38e6 | ||
|
|
89897aef4b | ||
|
|
dc3a242dcb | ||
|
|
03f418245d | ||
|
|
8046e2fd74 | ||
|
|
2e05ff06f4 | ||
|
|
bf831a3057 | ||
|
|
8b691fe905 | ||
|
|
7b8230fa6c | ||
|
|
379491f3de | ||
|
|
9643b244f6 | ||
|
|
48c16e92e9 | ||
|
|
6143b68eb1 | ||
|
|
73521f8253 | ||
|
|
673ae95aa8 | ||
|
|
33a64c9887 | ||
|
|
576350bc1f | ||
|
|
ad3a85d80b | ||
|
|
e27cc11a49 | ||
|
|
8504b3984a | ||
|
|
68f5f08df5 | ||
|
|
29024b91fe | ||
|
|
d96a24c2ca | ||
|
|
0f41eb99f2 | ||
|
|
7ad277c666 | ||
|
|
002cfd5419 | ||
|
|
9e8e57051a | ||
|
|
08c446a57c | ||
|
|
fe59a6f5b9 | ||
|
|
c234688542 | ||
|
|
f96e7507bc | ||
|
|
beac9f5756 | ||
|
|
3eb700661b | ||
|
|
17f9c8299f | ||
|
|
7cecb80a64 | ||
|
|
e4ae03a252 | ||
|
|
c52df50faf | ||
|
|
3502579b11 | ||
|
|
d58c500c97 | ||
|
|
3ee741abbb | ||
|
|
cf424e59f6 | ||
|
|
634a4e595c | ||
|
|
3da404a714 | ||
|
|
bdcd75a3be | ||
|
|
a75b9c0574 | ||
|
|
f407af363a | ||
|
|
17378319f6 | ||
|
|
86dc335137 | ||
|
|
4d9b7fa905 | ||
|
|
9fde80593f | ||
|
|
fdc428bde4 | ||
|
|
4edc144255 | ||
|
|
e5b60d434d | ||
|
|
7ee222925d | ||
|
|
42a6697531 | ||
|
|
223fd9a7d5 | ||
|
|
9693cb3c8d | ||
|
|
898c0e31a1 | ||
|
|
bab661914d | ||
|
|
3c4a92612d | ||
|
|
000002c327 | ||
|
|
dc051e75e3 | ||
|
|
b500912650 | ||
|
|
7e13f8b1cc | ||
|
|
d535cfc5a4 | ||
|
|
25b96825cc | ||
|
|
6d952cc89e | ||
|
|
e0303cd2a6 | ||
|
|
4d0a6e93ea | ||
|
|
15f844e538 | ||
|
|
56db78d699 | ||
|
|
a9cf299a4f | ||
|
|
5f75db4e1f | ||
|
|
8459d7ead6 | ||
|
|
64e671b0d2 | ||
|
|
23609c4bb9 | ||
|
|
331521306e | ||
|
|
141b5603eb | ||
|
|
8585f3881c | ||
|
|
432d44f4af | ||
|
|
49b4adc843 | ||
|
|
228bf55a8d | ||
|
|
00aabfc283 | ||
|
|
8463dc8721 | ||
|
|
fe224b5ab2 | ||
|
|
6e9f3bfbe2 | ||
|
|
d44fe31277 | ||
|
|
709a9f5996 | ||
|
|
71867dd63e | ||
|
|
3db9ded294 | ||
|
|
844b893ebf | ||
|
|
a6c69b80e3 | ||
|
|
7885ad18c6 | ||
|
|
dab8b634bd | ||
|
|
d59eed6974 | ||
|
|
b1837dec75 | ||
|
|
b5edd39517 | ||
|
|
0931e590a9 | ||
|
|
89917d6168 | ||
|
|
41ebc50538 | ||
|
|
f7ace0a57f | ||
|
|
b7b7d2382b | ||
|
|
49d3b033cb | ||
|
|
5a78b77da5 | ||
|
|
34f3c55573 | ||
|
|
6521921687 | ||
|
|
806bf2cd31 | ||
|
|
ff3d105271 | ||
|
|
4d30d8837a | ||
|
|
f35e2fb49c | ||
|
|
cae140b239 | ||
|
|
b11452d29a | ||
|
|
155d939ae8 | ||
|
|
11383d3689 | ||
|
|
00d4d27277 | ||
|
|
97309e9a6e | ||
|
|
501bba0283 | ||
|
|
e51506b9f8 | ||
|
|
df5b46e0d3 | ||
|
|
55dd0ea830 | ||
|
|
7e76f40f43 | ||
|
|
1c2e81353d | ||
|
|
bf53b61d03 | ||
|
|
6256ddfc78 | ||
|
|
6937701fa4 | ||
|
|
29962197d7 | ||
|
|
287e6da537 | ||
|
|
069958d220 | ||
|
|
d95fb14f8e | ||
|
|
4c231691f6 | ||
|
|
718a81e41d | ||
|
|
8d67d07f27 | ||
|
|
e965aa370c | ||
|
|
daaefd8e18 | ||
|
|
138b4a5cc4 | ||
|
|
ed48c74885 | ||
|
|
27b816e50e | ||
|
|
b5ac9a9591 | ||
|
|
7ec1eaf334 | ||
|
|
e1e66ca670 | ||
|
|
673a8df520 | ||
|
|
f55e718aca | ||
|
|
15008d0559 | ||
|
|
a1a45df14e | ||
|
|
c7b06d8a69 | ||
|
|
c0b0fa44af | ||
|
|
38bacb17e0 | ||
|
|
6febb54478 | ||
|
|
263bfa55e5 | ||
|
|
4c9a09866b | ||
|
|
a43d19fb79 | ||
|
|
999cc91f6c | ||
|
|
488886d685 | ||
|
|
485fbcf393 | ||
|
|
f434e0dd67 | ||
|
|
cbb35a8e3c | ||
|
|
caff966d3b | ||
|
|
7539a1003c | ||
|
|
ee24d12d8c | ||
|
|
4dc424464e | ||
|
|
977552fa81 | ||
|
|
644bfe72af | ||
|
|
fc21932a34 | ||
|
|
a1a480f35e | ||
|
|
61d07242ad | ||
|
|
ea217404e9 | ||
|
|
6f7250d179 | ||
|
|
9e27951c3e | ||
|
|
91891fc5b5 | ||
|
|
b62ea7b28f | ||
|
|
893e1e307d | ||
|
|
6b4653a996 | ||
|
|
06dcc697f9 | ||
|
|
f62872808d | ||
|
|
0fe5b45f8b | ||
|
|
44e71d8b09 | ||
|
|
abc1f2cd64 | ||
|
|
8a8d0e4069 | ||
|
|
ec3df01606 | ||
|
|
851fd08d5d | ||
|
|
c7cb728feb | ||
|
|
43ae1de2b5 | ||
|
|
13bac40aeb | ||
|
|
1e5abf20cd | ||
|
|
6a796debb8 | ||
|
|
7373a07a71 | ||
|
|
f9fc6b83d0 | ||
|
|
6ff586c3e9 | ||
|
|
fc9b2a186b | ||
|
|
dfbf51fa36 | ||
|
|
6a417750b2 | ||
|
|
0d08907e9c | ||
|
|
589acf459d | ||
|
|
5d0dff7172 | ||
|
|
9827ca5048 | ||
|
|
c7341e65e9 | ||
|
|
c1a2c76a38 | ||
|
|
3d58698bfc | ||
|
|
71c70dcc8c | ||
|
|
584ca125a6 | ||
|
|
4b616dcbe1 | ||
|
|
ac59eae329 | ||
|
|
44a1e6c28b | ||
|
|
d6500f8cb7 | ||
|
|
769704f0fc | ||
|
|
ba7fbcc02f | ||
|
|
613a08dd3a | ||
|
|
7087de0c94 | ||
|
|
afa0d87c76 | ||
|
|
a6428608e6 | ||
|
|
550d026061 | ||
|
|
45a41497df | ||
|
|
a0e9d8340c | ||
|
|
a48b40fc0c | ||
|
|
fa7d534c56 | ||
|
|
92d1a9d335 | ||
|
|
b8f8d90d13 | ||
|
|
c1c40581d5 | ||
|
|
4aacd1e47a | ||
|
|
4cc9311343 | ||
|
|
9f0e5d712f | ||
|
|
92096e6a21 | ||
|
|
002ef8ca5c | ||
|
|
0e4ce445e0 | ||
|
|
7a11547a14 | ||
|
|
29ac7b7df9 | ||
|
|
3b749f0e75 | ||
|
|
edc9917b57 | ||
|
|
bab5c3697b | ||
|
|
043b8e42c0 | ||
|
|
29d955933d | ||
|
|
a3b5d8dcfd | ||
|
|
86ba7a6d7a | ||
|
|
38bbd8a5d7 | ||
|
|
8339e9e1ca | ||
|
|
b359258d8b | ||
|
|
f94a65fcfb | ||
|
|
58c4ada254 | ||
|
|
a57b2448d0 | ||
|
|
f8093a65a6 | ||
|
|
81eff305d3 | ||
|
|
093ff9c395 | ||
|
|
857fabadbe | ||
|
|
9074441c5a | ||
|
|
d2b33defa1 | ||
|
|
aec107b6b7 | ||
|
|
7d56db701c | ||
|
|
de9e48aa98 | ||
|
|
6d13535d8d | ||
|
|
0df7b20fae | ||
|
|
84f7b96998 | ||
|
|
b1810c7ea6 | ||
|
|
6aeb508d6e | ||
|
|
d9d4ebdc01 | ||
|
|
2b70b22117 | ||
|
|
a12088f2f1 | ||
|
|
dbea39c182 | ||
|
|
269e9ceea7 | ||
|
|
80adeecb6b | ||
|
|
19eb3a5141 | ||
|
|
25bc6220b3 | ||
|
|
a938c82fc6 | ||
|
|
147b06f08e | ||
|
|
55be8bc5d7 | ||
|
|
dfd80a136b | ||
|
|
31f393ad5b | ||
|
|
5b3f15de34 | ||
|
|
009408581d | ||
|
|
960d2fd2b1 | ||
|
|
b4b34e89bc | ||
|
|
cc8dc77f92 | ||
|
|
350af6a43f | ||
|
|
71308f28c3 | ||
|
|
2d2f9d348d | ||
|
|
6d5a2a956f | ||
|
|
938afa34c9 | ||
|
|
4df59e7bf2 | ||
|
|
613230d218 | ||
|
|
65add2e448 | ||
|
|
bfa396b93f | ||
|
|
e473c1852c | ||
|
|
088cf4adef | ||
|
|
5b0a04142f | ||
|
|
d1d7af4f7e | ||
|
|
7b0190ff8a | ||
|
|
e2d103f20f | ||
|
|
7bfb2f0fe8 | ||
|
|
8adebbba3f | ||
|
|
719c8f7b9c | ||
|
|
af0f1600d9 | ||
|
|
b014cb57c0 | ||
|
|
1832f9f996 | ||
|
|
a94a0f199a | ||
|
|
2c0dc85d70 | ||
|
|
ca748f731e | ||
|
|
ebf6c15655 | ||
|
|
95271a45b6 | ||
|
|
e5d5ea9d3e | ||
|
|
94351f68fb | ||
|
|
87c1877736 | ||
|
|
bc6529a35f | ||
|
|
d2ee45653c | ||
|
|
d0d35937e8 | ||
|
|
f9d428e2c1 | ||
|
|
68fda97f9e | ||
|
|
f8fa731a32 | ||
|
|
38a4d96035 | ||
|
|
9cacbb4f34 | ||
|
|
bc6fce30ed | ||
|
|
930070ad14 | ||
|
|
11e5704414 | ||
|
|
81eca40f13 | ||
|
|
0fdb27ccd7 | ||
|
|
8b4e66e37c | ||
|
|
d409935ceb | ||
|
|
4d985abd07 | ||
|
|
3a127bcd8b | ||
|
|
a1e506eb85 | ||
|
|
b82427a6cf | ||
|
|
a3b4a0b80c | ||
|
|
df0b8cc44e | ||
|
|
709eb66614 | ||
|
|
0381cf66dc | ||
|
|
2317a4cadb | ||
|
|
5c6397e8ad | ||
|
|
6f0828858d | ||
|
|
76cff8d386 | ||
|
|
37c0fa1cd6 | ||
|
|
63830b798b | ||
|
|
b707b3e3dc | ||
|
|
af391346d1 | ||
|
|
e96774e325 | ||
|
|
e3329a8d73 | ||
|
|
da8174bcc7 | ||
|
|
5b1b52e529 | ||
|
|
0165f07bb9 | ||
|
|
7dee2c1526 | ||
|
|
52d2bea970 | ||
|
|
e26f78d9ed | ||
|
|
e0b62ded5a | ||
|
|
b17821685f | ||
|
|
a5016b0984 | ||
|
|
b5ad82f5ba | ||
|
|
14da860973 | ||
|
|
2b381e7e2f | ||
|
|
4152751d52 | ||
|
|
e8a35bf6e6 | ||
|
|
abdc3bbca1 | ||
|
|
8519183013 | ||
|
|
7c0450c364 | ||
|
|
eed1341003 | ||
|
|
3671080cfc | ||
|
|
c8481fdb3e | ||
|
|
146db578b6 | ||
|
|
c98726e4d0 | ||
|
|
4b49bab0bd | ||
|
|
385f35b6e5 | ||
|
|
a86e9b8f57 | ||
|
|
e06ccc35a0 | ||
|
|
7bdcbcca02 | ||
|
|
e1cb8e06a1 | ||
|
|
1a15bcb7e0 | ||
|
|
2df06ccf61 | ||
|
|
560533b2d4 | ||
|
|
60a2febe46 | ||
|
|
ed2a98b341 | ||
|
|
e8187356af | ||
|
|
21febab897 | ||
|
|
250aad43bc | ||
|
|
5e9e8bd76b | ||
|
|
7b3ea32963 | ||
|
|
ac9cee8fa3 | ||
|
|
4a3d503992 | ||
|
|
7bfc63ffc7 | ||
|
|
b359d97b95 | ||
|
|
19a0a8a7ec | ||
|
|
51a736dbce | ||
|
|
36928e4f39 | ||
|
|
bfe738c846 | ||
|
|
47c52e31ae | ||
|
|
d62865f9e5 | ||
|
|
f7dcaffc32 | ||
|
|
c88a43d2dc | ||
|
|
a5fe20b0e9 | ||
|
|
3dffebf733 | ||
|
|
4be5ac8780 | ||
|
|
d858fdef75 | ||
|
|
f1d9fc61c5 | ||
|
|
931dafd264 | ||
|
|
40f3ad592f | ||
|
|
723362fc33 | ||
|
|
94c5cf316b | ||
|
|
5de4b3c1b0 | ||
|
|
6eab85b7e1 | ||
|
|
40e7d58c0b | ||
|
|
c85aac613e | ||
|
|
9387320948 | ||
|
|
9e1b1b0850 | ||
|
|
b656d4fe1f | ||
|
|
76cca72bec | ||
|
|
3f6a706e9a | ||
|
|
9245af5080 | ||
|
|
7953337f15 | ||
|
|
3facf47540 | ||
|
|
629d902745 | ||
|
|
107e8e665a | ||
|
|
d9040047ec | ||
|
|
4fb2be51e0 | ||
|
|
a99cdbedc4 | ||
|
|
a543b8c0f6 | ||
|
|
f5ca4a9d15 | ||
|
|
496691d236 | ||
|
|
f1a6af048d | ||
|
|
22e32baf34 | ||
|
|
b17ba26268 | ||
|
|
e2fbb26dce | ||
|
|
81bfc83e9d | ||
|
|
cc98ca70d5 | ||
|
|
544078a40c | ||
|
|
229d438181 | ||
|
|
aab1450c3f | ||
|
|
07d7635464 | ||
|
|
277b88f332 | ||
|
|
0473bcc543 | ||
|
|
79c1affc39 | ||
|
|
4d27341787 | ||
|
|
45d8c236fe | ||
|
|
4412b016ce | ||
|
|
3cea8e8a90 | ||
|
|
9a0722ffcc | ||
|
|
49dcb55de7 | ||
|
|
fa37b11c7f | ||
|
|
20314a5d2d | ||
|
|
2bb839e26c | ||
|
|
63d0f23742 | ||
|
|
36e7a664ff | ||
|
|
e9631c2eb2 | ||
|
|
b43bc8a5bd | ||
|
|
27932679dd | ||
|
|
ab3808adbf | ||
|
|
8d8de53167 | ||
|
|
09199180f3 | ||
|
|
d9f36f1949 | ||
|
|
e9b95cce62 | ||
|
|
3ea09df4c0 | ||
|
|
8c58e536de | ||
|
|
8eed8a67ee | ||
|
|
89ba442731 | ||
|
|
81965d0d36 | ||
|
|
674642ac7c | ||
|
|
08889bd608 | ||
|
|
990d185e86 | ||
|
|
8db7fb3842 | ||
|
|
f18dd26716 | ||
|
|
25c5efbb8c | ||
|
|
f5e0a006c8 | ||
|
|
5141493337 | ||
|
|
e0f8e791b3 | ||
|
|
2bb28f83c1 | ||
|
|
af52644a4b | ||
|
|
eb71113d73 | ||
|
|
cd5288eb47 | ||
|
|
c8e5246f44 | ||
|
|
00c0f36d71 | ||
|
|
aaca6d62f3 | ||
|
|
f62e76eb02 | ||
|
|
9717a92142 | ||
|
|
cfe091b5b3 | ||
|
|
a450004c19 | ||
|
|
939b30c1b2 | ||
|
|
68886d72ce | ||
|
|
15947c311d | ||
|
|
da7247357a | ||
|
|
2bc84f446b | ||
|
|
c3f970b5fe | ||
|
|
7a69ac730b | ||
|
|
0b83bbbe40 | ||
|
|
e7bf39a770 | ||
|
|
3d1b6a40e2 | ||
|
|
8d55d310da |
27
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@@ -1,39 +1,22 @@
|
||||
name: Report a bug
|
||||
description: For regressions only (things that were working earlier)
|
||||
description: Things that were working earlier but don't anymore
|
||||
labels: []
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Before opening a new issue, **please** ensure
|
||||
1. You are on the latest version,
|
||||
2. You've searched for existing issues,
|
||||
3. It was working earlier (otherwise use [this](https://github.com/ente-io/ente/discussions/categories/enhancements))
|
||||
4. It is not about self hosting (otherwise use [this](https://github.com/ente-io/ente/discussions/categories/q-a))
|
||||
**Checklist**
|
||||
1. You've searched existing [issues](https://github.com/search?q=repo%3Aente-io%2Fente+&type=issues) and [discussions](https://github.com/search?q=repo%3Aente-io%2Fente+&type=discussions)
|
||||
2. It was working earlier (otherwise use [enhancements](https://github.com/ente-io/ente/discussions/categories/enhancements))
|
||||
3. It is not about self hosting (for those use [this](https://github.com/ente-io/ente/discussions/categories/q-a))
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Description
|
||||
description: >
|
||||
Describe the bug and steps to reproduce the behaviour, and how it
|
||||
differs from the previously working behaviour.
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
attributes:
|
||||
label: Version
|
||||
description: The version can be seen at the bottom of settings.
|
||||
placeholder: e.g. v1.2.3
|
||||
- type: input
|
||||
attributes:
|
||||
label: Last working version
|
||||
description: >
|
||||
The version where things were last known to be working. It is fine
|
||||
if you don't remember the exact version (mention roughly then),
|
||||
but **if there just isn't a last working version, then please file
|
||||
it as an
|
||||
[enhancement](https://github.com/ente-io/ente/discussions/categories/enhancements))**
|
||||
(where the community upvotes can be used to help prioritize).
|
||||
placeholder: e.g. v1.2.3
|
||||
- type: dropdown
|
||||
attributes:
|
||||
label: What product are you using?
|
||||
|
||||
4
.github/workflows/auth-crowdin-push.yml
vendored
@@ -24,8 +24,8 @@ jobs:
|
||||
- name: Crowdin's action
|
||||
uses: crowdin/github-action@v2
|
||||
with:
|
||||
base_path: "auth/"
|
||||
config: "auth/crowdin.yml"
|
||||
base_path: "mobile/apps/auth/"
|
||||
config: "mobile/apps/auth/crowdin.yml"
|
||||
upload_sources: true
|
||||
upload_translations: false
|
||||
download_translations: false
|
||||
|
||||
4
.github/workflows/auth-crowdin-sync.yml
vendored
@@ -23,8 +23,8 @@ jobs:
|
||||
- name: Crowdin's action
|
||||
uses: crowdin/github-action@v2
|
||||
with:
|
||||
base_path: "auth/"
|
||||
config: "auth/crowdin.yml"
|
||||
base_path: "mobile/apps/auth/"
|
||||
config: "mobile/apps/auth/crowdin.yml"
|
||||
upload_sources: true
|
||||
upload_translations: false
|
||||
download_translations: true
|
||||
|
||||
4
.github/workflows/auth-internal-release.yml
vendored
@@ -15,7 +15,7 @@ jobs:
|
||||
|
||||
defaults:
|
||||
run:
|
||||
working-directory: auth
|
||||
working-directory: mobile/apps/auth
|
||||
|
||||
steps:
|
||||
- name: Checkout code and submodules
|
||||
@@ -55,7 +55,7 @@ jobs:
|
||||
with:
|
||||
serviceAccountJsonPlainText: ${{ secrets.SERVICE_ACCOUNT_JSON }}
|
||||
packageName: io.ente.auth
|
||||
releaseFiles: auth/build/app/outputs/bundle/playstoreRelease/app-playstore-release.aab
|
||||
releaseFiles: mobile/apps/auth/build/app/outputs/bundle/playstoreRelease/app-playstore-release.aab
|
||||
track: internal
|
||||
|
||||
- name: Notify Discord
|
||||
|
||||
2
.github/workflows/auth-lint.yml
vendored
@@ -18,7 +18,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
defaults:
|
||||
run:
|
||||
working-directory: auth
|
||||
working-directory: mobile/apps/auth
|
||||
steps:
|
||||
- name: Checkout code and submodules
|
||||
uses: actions/checkout@v4
|
||||
|
||||
20
.github/workflows/auth-release.yml
vendored
@@ -40,7 +40,7 @@ jobs:
|
||||
|
||||
defaults:
|
||||
run:
|
||||
working-directory: auth
|
||||
working-directory: mobile/apps/auth
|
||||
|
||||
steps:
|
||||
- name: Checkout code and submodules
|
||||
@@ -98,7 +98,7 @@ jobs:
|
||||
|
||||
- name: Install appimagetool
|
||||
run: |
|
||||
wget -O appimagetool "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage"
|
||||
wget -O appimagetool "https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage"
|
||||
chmod +x appimagetool
|
||||
mv appimagetool /usr/local/bin/
|
||||
|
||||
@@ -124,7 +124,7 @@ jobs:
|
||||
- name: Create a draft GitHub release
|
||||
uses: ncipollo/release-action@v1
|
||||
with:
|
||||
artifacts: "auth/artifacts/*"
|
||||
artifacts: "mobile/apps/auth/artifacts/*"
|
||||
draft: true
|
||||
allowUpdates: true
|
||||
updateOnlyUnreleased: true
|
||||
@@ -136,7 +136,7 @@ jobs:
|
||||
with:
|
||||
serviceAccountJsonPlainText: ${{ secrets.SERVICE_ACCOUNT_JSON }}
|
||||
packageName: io.ente.auth
|
||||
releaseFiles: auth/build/app/outputs/bundle/playstoreRelease/app-playstore-release.aab
|
||||
releaseFiles: mobile/apps/auth/build/app/outputs/bundle/playstoreRelease/app-playstore-release.aab
|
||||
track: internal
|
||||
|
||||
build-windows:
|
||||
@@ -145,7 +145,7 @@ jobs:
|
||||
|
||||
defaults:
|
||||
run:
|
||||
working-directory: auth
|
||||
working-directory: mobile/apps/auth
|
||||
|
||||
steps:
|
||||
- name: Checkout code and submodules
|
||||
@@ -185,8 +185,8 @@ jobs:
|
||||
trusted-signing-account-name: ${{ secrets.AZURE_CODE_SIGNING_NAME }}
|
||||
certificate-profile-name: ${{ secrets.AZURE_CERT_PROFILE_NAME }}
|
||||
files: |
|
||||
${{ github.workspace }}/auth/artifacts/ente-${{ github.ref_name }}-installer.exe
|
||||
${{ github.workspace }}/auth/ente-${{ github.ref_name }}-windows/auth.exe
|
||||
${{ github.workspace }}/mobile/apps/auth/artifacts/ente-${{ github.ref_name }}-installer.exe
|
||||
${{ github.workspace }}/mobile/apps/auth/ente-${{ github.ref_name }}-windows/auth.exe
|
||||
file-digest: SHA256
|
||||
timestamp-rfc3161: http://timestamp.acs.microsoft.com
|
||||
timestamp-digest: SHA256
|
||||
@@ -201,7 +201,7 @@ jobs:
|
||||
- name: Create a draft GitHub release
|
||||
uses: ncipollo/release-action@v1
|
||||
with:
|
||||
artifacts: "auth/artifacts/*"
|
||||
artifacts: "mobile/apps/auth/artifacts/*"
|
||||
draft: true
|
||||
allowUpdates: true
|
||||
updateOnlyUnreleased: true
|
||||
@@ -211,7 +211,7 @@ jobs:
|
||||
|
||||
defaults:
|
||||
run:
|
||||
working-directory: auth
|
||||
working-directory: mobile/apps/auth
|
||||
|
||||
steps:
|
||||
- name: Checkout code and submodules
|
||||
@@ -298,7 +298,7 @@ jobs:
|
||||
- name: Create a draft GitHub release
|
||||
uses: ncipollo/release-action@v1
|
||||
with:
|
||||
artifacts: "auth/artifacts/*"
|
||||
artifacts: "mobile/apps/auth/artifacts/*"
|
||||
draft: true
|
||||
allowUpdates: true
|
||||
updateOnlyUnreleased: true
|
||||
|
||||
70
.github/workflows/auth-win-sign.yml
vendored
@@ -1,70 +0,0 @@
|
||||
name: "Windows build & Sign (auth)"
|
||||
|
||||
|
||||
on:
|
||||
workflow_dispatch: # Allow manually running the action
|
||||
|
||||
env:
|
||||
FLUTTER_VERSION: "3.24.3"
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
jobs:
|
||||
build-windows:
|
||||
runs-on: windows-latest
|
||||
environment: "auth-win-build"
|
||||
|
||||
defaults:
|
||||
run:
|
||||
working-directory: auth
|
||||
|
||||
steps:
|
||||
- name: Checkout code and submodules
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Install Flutter ${{ env.FLUTTER_VERSION }}
|
||||
uses: subosito/flutter-action@v2
|
||||
with:
|
||||
channel: "stable"
|
||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
||||
cache: true
|
||||
|
||||
- name: Create artifacts directory
|
||||
run: mkdir artifacts
|
||||
|
||||
- name: Build Windows installer
|
||||
run: |
|
||||
flutter config --enable-windows-desktop
|
||||
# dart pub global activate flutter_distributor
|
||||
dart pub global activate --source git https://github.com/ente-io/flutter_distributor_fork --git-ref develop --git-path packages/flutter_distributor
|
||||
make innoinstall
|
||||
flutter_distributor package --platform=windows --targets=exe --skip-clean
|
||||
mv dist/**/*-windows-setup.exe artifacts/ente-${{ github.ref_name }}-installer.exe
|
||||
|
||||
- name: Retain Windows EXE and DLLs
|
||||
run: cp -r build/windows/x64/runner/Release ente-${{ github.ref_name }}-windows
|
||||
|
||||
- name: Sign files with Trusted Signing
|
||||
uses: azure/trusted-signing-action@v0
|
||||
with:
|
||||
azure-tenant-id: ${{ secrets.AZURE_TENANT_ID }}
|
||||
azure-client-id: ${{ secrets.AZURE_CLIENT_ID }}
|
||||
azure-client-secret: ${{ secrets.AZURE_CLIENT_SECRET }}
|
||||
endpoint: ${{ secrets.AZURE_ENDPOINT }}
|
||||
trusted-signing-account-name: ${{ secrets.AZURE_CODE_SIGNING_NAME }}
|
||||
certificate-profile-name: ${{ secrets.AZURE_CERT_PROFILE_NAME }}
|
||||
files: |
|
||||
${{ github.workspace }}/auth/artifacts/ente-${{ github.ref_name }}-installer.exe
|
||||
${{ github.workspace }}/auth/ente-${{ github.ref_name }}-windows/auth.exe
|
||||
file-digest: SHA256
|
||||
timestamp-rfc3161: http://timestamp.acs.microsoft.com
|
||||
timestamp-digest: SHA256
|
||||
|
||||
- name: Zip Windows EXE and DLLs
|
||||
run: tar.exe -a -c -f artifacts/ente-${{ github.ref_name }}-windows.zip ente-${{ github.ref_name }}-windows
|
||||
|
||||
- name: Generate checksums
|
||||
run: sha256sum artifacts/ente-* > artifacts/sha256sum-windows
|
||||
6
.github/workflows/mobile-crowdin-push.yml
vendored
@@ -5,7 +5,7 @@ on:
|
||||
branches: [main]
|
||||
paths:
|
||||
# Run workflow when mobiles's intl_en.arb is changed
|
||||
- "mobile/lib/l10n/intl_en.arb"
|
||||
- "mobile/apps/photos/lib/l10n/intl_en.arb"
|
||||
# Or the workflow itself is changed
|
||||
- ".github/workflows/mobile-crowdin.yml"
|
||||
|
||||
@@ -24,8 +24,8 @@ jobs:
|
||||
- name: Crowdin's action
|
||||
uses: crowdin/github-action@v2
|
||||
with:
|
||||
base_path: "mobile/"
|
||||
config: "mobile/crowdin.yml"
|
||||
base_path: "mobile/apps/photos/"
|
||||
config: "mobile/apps/photos/crowdin.yml"
|
||||
upload_sources: true
|
||||
upload_translations: false
|
||||
download_translations: false
|
||||
|
||||
8
.github/workflows/mobile-crowdin-sync.yml
vendored
@@ -1,4 +1,4 @@
|
||||
name: "Sync Crowdin translations (mobile)"
|
||||
name: "Sync Crowdin translations (mobile/photos)"
|
||||
|
||||
on:
|
||||
schedule:
|
||||
@@ -23,14 +23,14 @@ jobs:
|
||||
- name: Crowdin's action
|
||||
uses: crowdin/github-action@v2
|
||||
with:
|
||||
base_path: "mobile/"
|
||||
config: "mobile/crowdin.yml"
|
||||
base_path: "mobile/apps/photos/"
|
||||
config: "mobile/apps/photos/crowdin.yml"
|
||||
upload_sources: true
|
||||
upload_translations: false
|
||||
download_translations: true
|
||||
localization_branch_name: translations/mobile
|
||||
create_pull_request: true
|
||||
pull_request_title: "[mobile] New translations"
|
||||
pull_request_title: "[mobile/photos] New translations"
|
||||
pull_request_body: "New translations from [Crowdin](https://crowdin.com/project/ente-photos-app)"
|
||||
pull_request_base_branch_name: "main"
|
||||
project_id: 574741
|
||||
|
||||
@@ -16,7 +16,7 @@ jobs:
|
||||
|
||||
defaults:
|
||||
run:
|
||||
working-directory: mobile
|
||||
working-directory: mobile/apps/photos
|
||||
|
||||
steps:
|
||||
- name: Checkout code and submodules
|
||||
@@ -64,7 +64,7 @@ jobs:
|
||||
with:
|
||||
serviceAccountJsonPlainText: ${{ secrets.SERVICE_ACCOUNT_JSON }}
|
||||
packageName: io.ente.photos
|
||||
releaseFiles: mobile/build/app/outputs/bundle/playstoreRelease/app-playstore-release.aab
|
||||
releaseFiles: mobile/apps/photos/build/app/outputs/bundle/playstoreRelease/app-playstore-release.aab
|
||||
track: internal
|
||||
|
||||
- name: Notify Discord
|
||||
|
||||
@@ -4,7 +4,7 @@ on:
|
||||
workflow_dispatch: # Allow manually running the action
|
||||
|
||||
env:
|
||||
FLUTTER_VERSION: "3.24.3"
|
||||
FLUTTER_VERSION: "3.27.4"
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
@@ -15,7 +15,7 @@ jobs:
|
||||
|
||||
defaults:
|
||||
run:
|
||||
working-directory: mobile
|
||||
working-directory: mobile/apps/photos
|
||||
|
||||
steps:
|
||||
- name: Checkout code and submodules
|
||||
@@ -55,7 +55,7 @@ jobs:
|
||||
with:
|
||||
serviceAccountJsonPlainText: ${{ secrets.SERVICE_ACCOUNT_JSON }}
|
||||
packageName: io.ente.photos
|
||||
releaseFiles: mobile/build/app/outputs/bundle/playstoreRelease/app-playstore-release.aab
|
||||
releaseFiles: mobile/apps/photos/build/app/outputs/bundle/playstoreRelease/app-playstore-release.aab
|
||||
track: internal
|
||||
|
||||
- name: Notify Discord
|
||||
|
||||
6
.github/workflows/mobile-lint.yml
vendored
@@ -4,11 +4,11 @@ on:
|
||||
# Run on every pull request (open or push to it) that changes mobile/
|
||||
pull_request:
|
||||
paths:
|
||||
- "mobile/**"
|
||||
- "mobile/apps/photos/**"
|
||||
- ".github/workflows/mobile-lint.yml"
|
||||
|
||||
env:
|
||||
FLUTTER_VERSION: "3.24.3"
|
||||
FLUTTER_VERSION: "3.27.4"
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
@@ -18,7 +18,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
defaults:
|
||||
run:
|
||||
working-directory: mobile
|
||||
working-directory: mobile/apps/photos
|
||||
steps:
|
||||
- name: Checkout code and submodules
|
||||
uses: actions/checkout@v4
|
||||
|
||||
6
.github/workflows/mobile-release.yml
vendored
@@ -9,7 +9,7 @@ on:
|
||||
- "photos-v*"
|
||||
|
||||
env:
|
||||
FLUTTER_VERSION: "3.24.3"
|
||||
FLUTTER_VERSION: "3.27.4"
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
@@ -20,7 +20,7 @@ jobs:
|
||||
|
||||
defaults:
|
||||
run:
|
||||
working-directory: mobile
|
||||
working-directory: mobile/apps/photos
|
||||
|
||||
steps:
|
||||
- name: Checkout code and submodules
|
||||
@@ -62,5 +62,5 @@ jobs:
|
||||
- name: Create a draft GitHub release
|
||||
uses: ncipollo/release-action@v1
|
||||
with:
|
||||
artifacts: "mobile/build/app/outputs/flutter-apk/ente-${{ github.ref_name }}.apk,mobile/build/app/outputs/flutter-apk/sha256sum"
|
||||
artifacts: "mobile/apps/photos/build/app/outputs/flutter-apk/ente-${{ github.ref_name }}.apk,mobile/apps/photos/build/app/outputs/flutter-apk/sha256sum"
|
||||
draft: true
|
||||
|
||||
190
.github/workflows/photos-internal-release.yml
vendored
Normal file
@@ -0,0 +1,190 @@
|
||||
name: "Internal Release V2 (photos)"
|
||||
|
||||
on:
|
||||
workflow_dispatch: # Manual trigger only
|
||||
|
||||
env:
|
||||
FLUTTER_VERSION: "3.27.4"
|
||||
ANDROID_KEYSTORE_PATH: "keystore/ente_photos_key.jks"
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: macos-15 # Required for iOS builds
|
||||
environment: "ios-build"
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
defaults:
|
||||
run:
|
||||
working-directory: mobile/apps/photos
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Install Apple Certificate
|
||||
env:
|
||||
MAC_OS_CERTIFICATE: ${{ secrets.MAC_OS_CERTIFICATE }}
|
||||
MAC_OS_CERTIFICATE_PASSWORD: ${{ secrets.MAC_OS_CERTIFICATE_PASSWORD }}
|
||||
KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
|
||||
run: |
|
||||
# Create variables
|
||||
CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12
|
||||
KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db
|
||||
|
||||
# Import certificate from secrets
|
||||
echo -n "$MAC_OS_CERTIFICATE" | base64 --decode -o $CERTIFICATE_PATH
|
||||
|
||||
# Create temporary keychain
|
||||
security create-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
|
||||
security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
|
||||
security unlock-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
|
||||
|
||||
# Import certificate to keychain
|
||||
security import $CERTIFICATE_PATH -P "$MAC_OS_CERTIFICATE_PASSWORD" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
|
||||
security set-key-partition-list -S apple-tool:,apple: -k "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
|
||||
|
||||
# Make the keychain the default
|
||||
security list-keychain -d user -s $KEYCHAIN_PATH
|
||||
|
||||
- name: Add provisioning profiles
|
||||
run: |
|
||||
# Decode and install all provisioning profiles
|
||||
PROFILES_HOME="$HOME/Library/MobileDevice/Provisioning Profiles"
|
||||
mkdir -p "$PROFILES_HOME"
|
||||
IFS=$'\n'
|
||||
for profile in ${{ secrets.MAC_OS_PROFILES_BASE64 }}; do
|
||||
PROFILE_PATH="$(mktemp "$PROFILES_HOME"/$(uuidgen).mobileprovision)"
|
||||
echo "$profile" | base64 --decode > "$PROFILE_PATH"
|
||||
echo "Saved provisioning profile to $PROFILE_PATH"
|
||||
done
|
||||
|
||||
# Common Setup
|
||||
|
||||
- name: Setup JDK 17
|
||||
uses: actions/setup-java@v1
|
||||
with:
|
||||
java-version: 17
|
||||
|
||||
- name: Install Flutter
|
||||
uses: subosito/flutter-action@v2
|
||||
with:
|
||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
||||
cache: true
|
||||
|
||||
- name: Get Flutter dependencies
|
||||
run: flutter pub get
|
||||
|
||||
# Android Build
|
||||
- name: Setup Android signing key
|
||||
uses: timheuer/base64-to-file@v1
|
||||
with:
|
||||
fileName: ${{ env.ANDROID_KEYSTORE_PATH }}
|
||||
encodedString: ${{ secrets.SIGNING_KEY_PHOTOS }}
|
||||
|
||||
# - name: Build Android AAB
|
||||
# run: |
|
||||
# flutter build appbundle \
|
||||
# --dart-define=cronetHttpNoPlay=true \
|
||||
# --release \
|
||||
# --flavor playstore
|
||||
# env:
|
||||
# SIGNING_KEY_PATH: ${{ env.ANDROID_KEYSTORE_PATH }}
|
||||
# SIGNING_KEY_ALIAS: ${{ secrets.SIGNING_KEY_ALIAS_PHOTOS }}
|
||||
# SIGNING_KEY_PASSWORD: ${{ secrets.SIGNING_KEY_PASSWORD_PHOTOS }}
|
||||
# SIGNING_STORE_PASSWORD: ${{ secrets.SIGNING_STORE_PASSWORD_PHOTOS }}
|
||||
|
||||
# iOS Build (new secure implementation)
|
||||
- name: Install fastlane
|
||||
run: gem install fastlane
|
||||
|
||||
- name: Update CocoaPods Specs
|
||||
run: pod repo update
|
||||
working-directory: mobile/apps/photos/ios
|
||||
|
||||
- name: Install CocoaPods dependencies
|
||||
run: |
|
||||
rm -f Podfile.lock
|
||||
pod install
|
||||
working-directory: mobile/apps/photos/ios
|
||||
|
||||
- name: Create ExportOptions.plist
|
||||
run: |
|
||||
cat <<EOF > ios/ExportOptions.plist
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>method</key>
|
||||
<string>app-store</string>
|
||||
<key>teamID</key>
|
||||
<string>${{ secrets.IOS_TEAM_ID }}</string>
|
||||
<key>provisioningProfiles</key>
|
||||
<dict>
|
||||
<key>io.ente.photos</key>
|
||||
<string>match AppStore io.ente.photos</string>
|
||||
<key>io.ente.frame</key>
|
||||
<string>match AppStore io.ente.frame</string>
|
||||
<key>io.ente.frame.EntePeopleWidget</key>
|
||||
<string>match AppStore io.ente.frame.EntePeopleWidget</string>
|
||||
<key>io.ente.frame.EnteAlbumWidget</key>
|
||||
<string>match AppStore io.ente.frame.EnteAlbumWidget</string>
|
||||
<key>io.ente.frame.EnteMemoryWidget</key>
|
||||
<string>match AppStore io.ente.frame.EnteMemoryWidget</string>
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
||||
EOF
|
||||
|
||||
- name: Setup App Store Connect API Key
|
||||
run: |
|
||||
echo '${{ secrets.IOS_API_KEY }}' > api_key.json
|
||||
chmod 600 api_key.json
|
||||
|
||||
- name: Build iOS IPA
|
||||
run: |
|
||||
flutter build ipa \
|
||||
--release \
|
||||
--export-options-plist=ios/ExportOptions.plist \
|
||||
--dart-define=cronetHttpNoPlay=true
|
||||
env:
|
||||
SIGNING_TEAM_ID: ${{ secrets.IOS_TEAM_ID }}
|
||||
|
||||
# Uploads
|
||||
# - name: Upload to Play Store
|
||||
# uses: r0adkll/upload-google-play@v1
|
||||
# with:
|
||||
# serviceAccountJsonPlainText: ${{ secrets.SERVICE_ACCOUNT_JSON }}
|
||||
# packageName: io.ente.photos
|
||||
# releaseFiles: build/app/outputs/bundle/playstoreRelease/app-playstore-release.aab
|
||||
# track: internal
|
||||
|
||||
- name: Upload to TestFlight
|
||||
run: |
|
||||
fastlane pilot upload \
|
||||
--api_key_path api_key.json \
|
||||
--ipa "build/ios/ipa/Ente Photos.ipa" \
|
||||
--skip_waiting_for_build_processing \
|
||||
--apple_id ${{ secrets.IOS_APPLE_ID }} \
|
||||
--app_identifier "io.ente.photos"
|
||||
env:
|
||||
APP_STORE_CONNECT_API_KEY_ID: ${{ secrets.IOS_API_KEY_ID }}
|
||||
APP_STORE_CONNECT_ISSUER_ID: ${{ secrets.IOS_ISSUER_ID }}
|
||||
FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD: ${{ secrets.IOS_APP_SPECIFIC_PASSWORD }}
|
||||
|
||||
- name: Clean sensitive files
|
||||
run: |
|
||||
rm -f api_key.json
|
||||
rm -f ${{ env.ANDROID_KEYSTORE_PATH }}
|
||||
|
||||
- name: Notify Discord
|
||||
uses: sarisia/actions-status-discord@v1
|
||||
with:
|
||||
webhook: ${{ secrets.DISCORD_INTERNAL_RELEASE_WEBHOOK }}
|
||||
title: "🚀 Dual Platform Release Uploaded"
|
||||
description: |
|
||||
**Android**: [Play Store Internal](https://play.google.com/store/apps/details?id=io.ente.photos)
|
||||
**iOS**: TestFlight build processing
|
||||
color: 0x00ff00
|
||||
10
.github/workflows/web-deploy.yml
vendored
@@ -93,3 +93,13 @@ jobs:
|
||||
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
||||
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
||||
command: pages deploy --project-name=ente --commit-dirty=true --branch=deploy/payments web/apps/payments/dist
|
||||
|
||||
- name: Build locker
|
||||
run: yarn build:locker
|
||||
|
||||
- name: Publish locker
|
||||
uses: cloudflare/wrangler-action@v3
|
||||
with:
|
||||
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
||||
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
||||
command: pages deploy --project-name=ente --commit-dirty=true --branch=deploy/locker web/apps/locker/out
|
||||
|
||||
4
.gitmodules
vendored
@@ -3,9 +3,9 @@
|
||||
url = https://github.com/ente-io/sentry-dart.git
|
||||
branch = sentry_flutter_ente
|
||||
[submodule "auth/flutter"]
|
||||
path = auth/flutter
|
||||
path = mobile/apps/auth/flutter
|
||||
url = https://github.com/flutter/flutter.git
|
||||
branch = stable
|
||||
[submodule "auth/assets/simple-icons"]
|
||||
path = auth/assets/simple-icons
|
||||
path = mobile/apps/auth/assets/simple-icons
|
||||
url = https://github.com/simple-icons/simple-icons.git
|
||||
|
||||
@@ -1,54 +1,42 @@
|
||||
# Contributing
|
||||
|
||||
First and foremost, thank you for your interest in contributing to Ente 🙏
|
||||
|
||||
There are many ways to contribute, and most of them don't require writing code.
|
||||
|
||||
* [Spread the word](#spread-the-word)
|
||||
* [Engage with the community](#engage-with-the-community)
|
||||
* [Translate](#translate)
|
||||
* [Document](#document)
|
||||
|
||||
- [Spread the word](#spread-the-word)
|
||||
- [Engage with the community](#engage-with-the-community)
|
||||
- [Translate](#translate)
|
||||
- [Document](#document)
|
||||
|
||||
## Spread the word
|
||||
|
||||
This is perhaps the most impactful contribution you can make. [Spread the
|
||||
word](https://help.ente.io/photos/features/referral-program/). Online on your
|
||||
favorite social media channels. Offline to your friends and family who are
|
||||
looking for a privacy-friendly alternative to big tech.
|
||||
**This is the most impactful contribution you can make**.
|
||||
|
||||
[Spread the word](https://help.ente.io/photos/features/referral-program/). Online on your favorite social media channels. Offline to your friends and family who are looking for a privacy-friendly alternative to big tech.
|
||||
|
||||
## Engage with the community
|
||||
|
||||
Just hang around, enjoy the vibe. Answer someone's query on our
|
||||
[Discord](https://discord.gg/z2YVKkycX3), or pile on in the sporadic #off-topic
|
||||
rants there. Chuckle (or wince!) at our [Twitter](https://twitter.com/enteio)
|
||||
memes. Suggest a new feature in our [Github
|
||||
Discussions](https://github.com/ente-io/ente/discussions/new?category=enhancements),
|
||||
or upvote the existing ones that you feel we should focus on first. Provide your
|
||||
opinion on existing threads.
|
||||
Just hang around, enjoy the vibe. The Ente community — the people who are building Ente, and the people who are using Ente — hang out at various places depending on their proclivity:
|
||||
|
||||
These might seem like small things, but it provides us energy. Knowing that
|
||||
there is a community of people who care for what we are building.
|
||||
- [Discord](https://discord.ente.io)
|
||||
- [Mastodon](https://fosstodon.org/@ente)
|
||||
- [X / Twitter](https://twitter.com/enteio)
|
||||
- [Github Discussions](https://github.com/ente-io/ente/discussions)
|
||||
|
||||
Just being around might seem a small thing, but it provides us energy. Knowing that there is a community of people who care for what we are building, **who want us to do better**.
|
||||
|
||||
## Translate
|
||||
|
||||
If you're interested in helping out with translation, please visit our Crowdin
|
||||
projects to get started:
|
||||
|
||||
| Project | |
|
||||
| ------------- | ------------- |
|
||||
| [Auth](https://crowdin.com/project/ente-authenticator-app) | [](https://crowdin.com/project/ente-authenticator-app) |
|
||||
| [Photos](https://crowdin.com/project/ente-photos-app) | [](https://crowdin.com/project/ente-photos-app) |
|
||||
| [Photos Web / Desktop](https://crowdin.com/project/ente-photos-web) | [](https://crowdin.com/project/ente-photos-web) |
|
||||
Visit our Crowdin projects to help with translations:
|
||||
|
||||
| Project | |
|
||||
| ------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| [Auth](https://crowdin.com/project/ente-authenticator-app) | [](https://crowdin.com/project/ente-authenticator-app) |
|
||||
| [Photos](https://crowdin.com/project/ente-photos-app) | [](https://crowdin.com/project/ente-photos-app) |
|
||||
| [Photos Web / Desktop](https://crowdin.com/project/ente-photos-web) | [](https://crowdin.com/project/ente-photos-web) |
|
||||
|
||||
If your language is not listed for translation, please [create a GitHub
|
||||
issue](https://github.com/ente-io/ente/issues/new?title=Request+for+New+Language+Translation&body=Language+name%3A+%0AProject%3A+auth%2Fphotos%2Fboth)
|
||||
to have it added. It is okay to have partial translations. Once ~90% of the
|
||||
strings in a language get translated, we will start surfacing it in the apps.
|
||||
|
||||
Thank you for your support.
|
||||
|
||||
## Document
|
||||
|
||||
The help guides and FAQs for users of Ente products are also open source, and
|
||||
@@ -60,25 +48,9 @@ See [docs/](docs/README.md) for how to edit these documents.
|
||||
|
||||
## Code contributions
|
||||
|
||||
Code is a small aspect of community, and the ways mentioned above are more
|
||||
important in helping us. But if you'd _really_ like to contribute code, it is
|
||||
best to start small. Consider some well-scoped changes, say like adding more
|
||||
[custom icons to auth](auth/docs/adding-icons.md).
|
||||
If you'd like to contribute code, it is best to start small. Consider some well-scoped changes, say like adding more [custom icons to auth](auth/docs/adding-icons.md), or fixing a specific bug.
|
||||
|
||||
Each of the individual product/platform specific directories in this repository
|
||||
have instructions on setting up a dev environment.
|
||||
|
||||
For anything beyond trivial bug fixes, please use
|
||||
[discussions](https://github.com/ente-io/ente/discussions) instead of performing
|
||||
code changes directly.
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> Please remember that code is a important, but small, part of the overall big
|
||||
> picture that makes a product a joy to use. Something that's easy in code is
|
||||
> not necessarily the right choice for the product as a whole. So we'll repeat -
|
||||
> there are other ways to contribute than code that we'd request you to
|
||||
> consider.
|
||||
Code that changes the behaviour of the product might not get merged, at least not initially. The PR can serve as a discussion bed, but you might find it easier to just start a discussion instead, or post your perspective in the (likely) existing thread about the behaviour change or new feature you wish for.
|
||||
|
||||
## Leave a review or star
|
||||
|
||||
|
||||
@@ -1,97 +0,0 @@
|
||||
{
|
||||
"account": "Уліковы запіс",
|
||||
"unlock": "Разблакіраваць",
|
||||
"recoveryKey": "Ключ аднаўлення",
|
||||
"counterAppBarTitle": "Лічыльнік",
|
||||
"@counterAppBarTitle": {
|
||||
"description": "Text shown in the AppBar of the Counter Page"
|
||||
},
|
||||
"onBoardingBody": "Бяспечна зрабіць рэзервовую копію кодаў 2ФА",
|
||||
"onBoardingGetStarted": "Пачаць",
|
||||
"setupFirstAccount": "Наладзіць ваш першы ўліковы запіс",
|
||||
"importScanQrCode": "Сканіраваць код QR-код",
|
||||
"qrCode": "QR-код",
|
||||
"importEnterSetupKey": "Увесці ключ наладжвання",
|
||||
"importAccountPageTitle": "Увесці падрабязнасці ўліковага запісу",
|
||||
"secretCanNotBeEmpty": "Сакрэт не можа быць пустым",
|
||||
"bothIssuerAndAccountCanNotBeEmpty": "І выдавец, і ўліковы запіс не могуць быць пустымі",
|
||||
"incorrectDetails": "Няправільныя падрабязнасці",
|
||||
"pleaseVerifyDetails": "Праверце падрабязнасці і паспрабуйце яшчэ раз",
|
||||
"codeIssuerHint": "Выдавец",
|
||||
"codeSecretKeyHint": "Сакрэтны ключ",
|
||||
"secret": "Сакрэт",
|
||||
"all": "Усе",
|
||||
"notes": "Нататкі",
|
||||
"notesLengthLimit": "Максімальная колькасць сімвалаў у нататках не больш за {count}",
|
||||
"@notesLengthLimit": {
|
||||
"description": "Text to indicate the maximum number of characters allowed for notes",
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"description": "The maximum number of characters allowed for notes",
|
||||
"type": "int",
|
||||
"example": "100"
|
||||
}
|
||||
}
|
||||
},
|
||||
"codeAccountHint": "Уліковы запіс (vy@damen.com)",
|
||||
"codeTagHint": "Тэг",
|
||||
"accountKeyType": "Тып ключа",
|
||||
"sessionExpired": "Сеанс завяршыўся",
|
||||
"@sessionExpired": {
|
||||
"description": "Title of the dialog when the users current session is invalid/expired"
|
||||
},
|
||||
"pleaseLoginAgain": "Аўтарызуйцеся яшчэ раз",
|
||||
"loggingOut": "Выхад...",
|
||||
"timeBasedKeyType": "Заснаваныя на часе (TOTP)",
|
||||
"counterBasedKeyType": "Заснаваныя на лічыльніку (HOTP)",
|
||||
"saveAction": "Захаваць",
|
||||
"nextTotpTitle": "наступны",
|
||||
"deleteCodeTitle": "Выдаліць код?",
|
||||
"deleteCodeMessage": "Вы сапраўды хочаце выдаліць гэты код? Гэта дзеянне з'яўляецца незваротным.",
|
||||
"trashCode": "Выдаліць код?",
|
||||
"trashCodeMessage": "Вы сапраўды хочаце выдаліць код для {account}?",
|
||||
"trash": "Сметніца",
|
||||
"viewLogsAction": "Паглядзець журнал",
|
||||
"preparingLogsTitle": "Падрыхтоўка журнала...",
|
||||
"emailLogsTitle": "Адправіць журнал па электроннай пошце",
|
||||
"exportLogsAction": "Экспартаваць журнал",
|
||||
"reportABug": "Паведаміць пра памылку",
|
||||
"reportBug": "Паведаміць пра памылку",
|
||||
"contactSupport": "Звярнуцца ў службу падтрымкі",
|
||||
"blog": "Блог",
|
||||
"verifyPassword": "Праверыць пароль",
|
||||
"pleaseWait": "Пачакайце...",
|
||||
"generatingEncryptionKeysTitle": "Генерацыя ключоў шыфравання...",
|
||||
"recreatePassword": "Стварыць пароль паўторна",
|
||||
"useRecoveryKey": "Выкарыстоўваць ключ аднаўлення",
|
||||
"incorrectPasswordTitle": "Няправільны пароль",
|
||||
"welcomeBack": "З вяртаннем!",
|
||||
"changePassword": "Змяніць пароль",
|
||||
"data": "Даныя",
|
||||
"importCodes": "Імпартаваць коды",
|
||||
"passwordEmptyError": "Пароль не можа быць пустым",
|
||||
"importFromApp": "Імпартаваць коды з {appName}",
|
||||
"exportCodes": "Экспартаваць коды",
|
||||
"importLabel": "Імпарт",
|
||||
"selectFile": "Выбраць файл",
|
||||
"yes": "Так",
|
||||
"no": "Не",
|
||||
"email": "Электронная пошта",
|
||||
"support": "Падтрымка",
|
||||
"settings": "Налады",
|
||||
"pleaseTryAgain": "Калі ласка, паспрабуйце яшчэ раз",
|
||||
"delete": "Выдаліць",
|
||||
"enterYourPasswordHint": "Увядзіце ваш пароль",
|
||||
"faq": "Частыя пытанні",
|
||||
"deleteAccount": "Выдаліць уліковы запіс",
|
||||
"noDeleteAccountAction": "Не, выдаліць уліковы запіс",
|
||||
"sendEmail": "Адправіць ліст",
|
||||
"createNewAccount": "Стварыць новы ўліковы запіс",
|
||||
"confirmPassword": "Пацвердзіць пароль",
|
||||
"close": "Закрыць",
|
||||
"oopsSomethingWentWrong": "Штосьці пайшло не так.",
|
||||
"language": "Мова",
|
||||
"security": "Бяспека",
|
||||
"searchHint": "Пошук...",
|
||||
"search": "Пошук"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"loggingOut": "Väljalogimine...",
|
||||
"useRecoveryKey": "Kasuta taastevõtit"
|
||||
}
|
||||
@@ -1,141 +0,0 @@
|
||||
import 'dart:async';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:ente_auth/core/configuration.dart';
|
||||
import 'package:ente_auth/core/event_bus.dart';
|
||||
import 'package:ente_auth/core/network.dart';
|
||||
import 'package:ente_auth/events/notification_event.dart';
|
||||
import 'package:ente_auth/services/user_service.dart';
|
||||
import 'package:logging/logging.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
class UserRemoteFlagService {
|
||||
final _dio = Network.instance.getDio();
|
||||
final _logger = Logger((UserRemoteFlagService).toString());
|
||||
final _config = Configuration.instance;
|
||||
late SharedPreferences _prefs;
|
||||
|
||||
UserRemoteFlagService._privateConstructor();
|
||||
|
||||
static final UserRemoteFlagService instance =
|
||||
UserRemoteFlagService._privateConstructor();
|
||||
|
||||
static const String recoveryVerificationFlag = "recoveryKeyVerified";
|
||||
static const String needRecoveryKeyVerification =
|
||||
"needRecoveryKeyVerification";
|
||||
|
||||
Future<void> init() async {
|
||||
_prefs = await SharedPreferences.getInstance();
|
||||
}
|
||||
|
||||
bool shouldShowRecoveryVerification() {
|
||||
if (!_prefs.containsKey(needRecoveryKeyVerification)) {
|
||||
// fetch the status from remote
|
||||
unawaited(_refreshRecoveryVerificationFlag());
|
||||
return false;
|
||||
} else {
|
||||
final bool shouldShow = _prefs.getBool(needRecoveryKeyVerification)!;
|
||||
if (shouldShow) {
|
||||
// refresh the status to check if user marked it as done on another device
|
||||
unawaited(_refreshRecoveryVerificationFlag());
|
||||
}
|
||||
return shouldShow;
|
||||
}
|
||||
}
|
||||
|
||||
// markRecoveryVerificationAsDone is used to track if user has verified their
|
||||
// recovery key in the past or not. This helps in avoid showing the same
|
||||
// prompt to the user on re-install or signing into a different device
|
||||
Future<void> markRecoveryVerificationAsDone() async {
|
||||
await _updateKeyValue(recoveryVerificationFlag, true.toString());
|
||||
await _prefs.setBool(needRecoveryKeyVerification, false);
|
||||
}
|
||||
|
||||
Future<void> _refreshRecoveryVerificationFlag() async {
|
||||
_logger.finest('refresh recovery key verification flag');
|
||||
final remoteStatusValue =
|
||||
await _getValue(recoveryVerificationFlag, "false");
|
||||
final bool isNeedVerificationFlagSet =
|
||||
_prefs.containsKey(needRecoveryKeyVerification);
|
||||
if (remoteStatusValue.toLowerCase() == "true") {
|
||||
await _prefs.setBool(needRecoveryKeyVerification, false);
|
||||
// If the user verified on different device, then we should refresh
|
||||
// the UI to dismiss the Notification.
|
||||
if (isNeedVerificationFlagSet) {
|
||||
Bus.instance.fire(NotificationEvent());
|
||||
}
|
||||
} else if (!isNeedVerificationFlagSet) {
|
||||
// Verification is not done yet as remoteStatus is false and local flag to
|
||||
// show notification isn't set. Set the flag to true if any active
|
||||
// session is older than 1 day.
|
||||
final activeSessions = await UserService.instance.getActiveSessions();
|
||||
final int microSecondsInADay = const Duration(days: 1).inMicroseconds;
|
||||
final bool anyActiveSessionOlderThanADay =
|
||||
activeSessions.sessions.firstWhereOrNull(
|
||||
(e) =>
|
||||
(e.creationTime + microSecondsInADay) <
|
||||
DateTime.now().microsecondsSinceEpoch,
|
||||
) !=
|
||||
null;
|
||||
if (anyActiveSessionOlderThanADay) {
|
||||
await _prefs.setBool(needRecoveryKeyVerification, true);
|
||||
Bus.instance.fire(NotificationEvent());
|
||||
} else {
|
||||
// continue defaulting to no verification prompt
|
||||
_logger.finest('No active session older than 1 day');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Future<String> _getValue(String key, String? defaultValue) async {
|
||||
try {
|
||||
final Map<String, dynamic> queryParams = {"key": key};
|
||||
if (defaultValue != null) {
|
||||
queryParams["defaultValue"] = defaultValue;
|
||||
}
|
||||
final response = await _dio.get(
|
||||
"${_config.getHttpEndpoint()}/remote-store",
|
||||
queryParameters: queryParams,
|
||||
options: Options(
|
||||
headers: {
|
||||
"X-Auth-Token": _config.getToken(),
|
||||
},
|
||||
),
|
||||
);
|
||||
if (response.statusCode != HttpStatus.ok) {
|
||||
throw Exception("Unexpected status code ${response.statusCode}");
|
||||
}
|
||||
return response.data["value"];
|
||||
} catch (e) {
|
||||
_logger.info("Error while fetching bool status for $key", e);
|
||||
rethrow;
|
||||
}
|
||||
}
|
||||
|
||||
// _setBooleanFlag sets the corresponding flag on remote
|
||||
// to mark recovery as completed
|
||||
Future<void> _updateKeyValue(String key, String value) async {
|
||||
try {
|
||||
final response = await _dio.post(
|
||||
"${_config.getHttpEndpoint()}/remote-store/update",
|
||||
data: {
|
||||
"key": key,
|
||||
"value": value,
|
||||
},
|
||||
options: Options(
|
||||
headers: {
|
||||
"X-Auth-Token": _config.getToken(),
|
||||
},
|
||||
),
|
||||
);
|
||||
if (response.statusCode != HttpStatus.ok) {
|
||||
throw Exception("Unexpected state");
|
||||
}
|
||||
} catch (e) {
|
||||
_logger.warning("Failed to set flag for $key", e);
|
||||
rethrow;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,219 +0,0 @@
|
||||
import 'package:bip39/bip39.dart' as bip39;
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:ente_auth/core/configuration.dart';
|
||||
import 'package:ente_auth/ente_theme_data.dart';
|
||||
import 'package:ente_auth/l10n/l10n.dart';
|
||||
import 'package:ente_auth/services/local_authentication_service.dart';
|
||||
import 'package:ente_auth/services/user_remote_flag_service.dart';
|
||||
import 'package:ente_auth/ui/account/recovery_key_page.dart';
|
||||
import 'package:ente_auth/ui/common/gradient_button.dart';
|
||||
import 'package:ente_auth/ui/components/buttons/button_widget.dart';
|
||||
import 'package:ente_auth/utils/dialog_util.dart';
|
||||
import 'package:ente_auth/utils/navigation_util.dart';
|
||||
import 'package:ente_auth/utils/platform_util.dart';
|
||||
import 'package:ente_crypto_dart/ente_crypto_dart.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:logging/logging.dart';
|
||||
|
||||
class VerifyRecoveryPage extends StatefulWidget {
|
||||
const VerifyRecoveryPage({super.key});
|
||||
|
||||
@override
|
||||
State<VerifyRecoveryPage> createState() => _VerifyRecoveryPageState();
|
||||
}
|
||||
|
||||
class _VerifyRecoveryPageState extends State<VerifyRecoveryPage> {
|
||||
final _recoveryKey = TextEditingController();
|
||||
final Logger _logger = Logger((_VerifyRecoveryPageState).toString());
|
||||
|
||||
void _verifyRecoveryKey() async {
|
||||
final dialog =
|
||||
createProgressDialog(context, context.l10n.verifyingRecoveryKey);
|
||||
await dialog.show();
|
||||
try {
|
||||
final String inputKey = _recoveryKey.text.trim();
|
||||
final String recoveryKey =
|
||||
CryptoUtil.bin2hex(Configuration.instance.getRecoveryKey());
|
||||
final String recoveryKeyWords = bip39.entropyToMnemonic(recoveryKey);
|
||||
if (inputKey == recoveryKey || inputKey == recoveryKeyWords) {
|
||||
try {
|
||||
await UserRemoteFlagService.instance.markRecoveryVerificationAsDone();
|
||||
} catch (e) {
|
||||
await dialog.hide();
|
||||
if (e is DioException && e.type == DioExceptionType.unknown) {
|
||||
await showErrorDialog(
|
||||
context,
|
||||
"No internet connection",
|
||||
"Please check your internet connection and try again.",
|
||||
);
|
||||
} else {
|
||||
await showGenericErrorDialog(
|
||||
context: context,
|
||||
error: e,
|
||||
);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
await dialog.hide();
|
||||
// todo: change this as per figma once the component is ready
|
||||
await showErrorDialog(
|
||||
context,
|
||||
context.l10n.recoveryKeyVerified,
|
||||
context.l10n.recoveryKeySuccessBody,
|
||||
);
|
||||
Navigator.of(context).pop();
|
||||
} else {
|
||||
throw Exception("recovery key didn't match");
|
||||
}
|
||||
} catch (e, s) {
|
||||
_logger.severe("failed to verify recovery key", e, s);
|
||||
await dialog.hide();
|
||||
final String errMessage = context.l10n.invalidRecoveryKey;
|
||||
final result = await showChoiceDialog(
|
||||
context,
|
||||
title: context.l10n.invalidKey,
|
||||
body: errMessage,
|
||||
firstButtonLabel: context.l10n.tryAgain,
|
||||
secondButtonLabel: context.l10n.viewRecoveryKey,
|
||||
secondButtonAction: ButtonAction.second,
|
||||
);
|
||||
if (result!.action == ButtonAction.second) {
|
||||
await _onViewRecoveryKeyClick();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _onViewRecoveryKeyClick() async {
|
||||
final hasAuthenticated =
|
||||
await LocalAuthenticationService.instance.requestLocalAuthentication(
|
||||
context,
|
||||
"Please authenticate to view your recovery key",
|
||||
);
|
||||
await PlatformUtil.refocusWindows();
|
||||
|
||||
if (hasAuthenticated) {
|
||||
String recoveryKey;
|
||||
try {
|
||||
recoveryKey =
|
||||
CryptoUtil.bin2hex(Configuration.instance.getRecoveryKey());
|
||||
await routeToPage(
|
||||
context,
|
||||
RecoveryKeyPage(
|
||||
recoveryKey,
|
||||
context.l10n.ok,
|
||||
showAppBar: true,
|
||||
onDone: () {
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
),
|
||||
);
|
||||
} catch (e) {
|
||||
// ignore: unawaited_futures
|
||||
showGenericErrorDialog(
|
||||
context: context,
|
||||
error: e,
|
||||
);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final enteTheme = Theme.of(context).colorScheme.enteTheme;
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
elevation: 0,
|
||||
leading: IconButton(
|
||||
icon: const Icon(Icons.arrow_back),
|
||||
color: Theme.of(context).iconTheme.color,
|
||||
onPressed: () {
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
),
|
||||
),
|
||||
body: Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 16.0),
|
||||
child: LayoutBuilder(
|
||||
builder: (context, constraints) {
|
||||
return SingleChildScrollView(
|
||||
child: ConstrainedBox(
|
||||
constraints: BoxConstraints(
|
||||
minWidth: constraints.maxWidth,
|
||||
minHeight: constraints.maxHeight,
|
||||
),
|
||||
child: IntrinsicHeight(
|
||||
child: Column(
|
||||
children: [
|
||||
const SizedBox(height: 12),
|
||||
SizedBox(
|
||||
width: double.infinity,
|
||||
child: Text(
|
||||
context.l10n.confirmRecoveryKey,
|
||||
style: enteTheme.textTheme.h3Bold,
|
||||
textAlign: TextAlign.left,
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 18),
|
||||
Text(
|
||||
context.l10n.recoveryKeyVerifyReason,
|
||||
style: enteTheme.textTheme.small
|
||||
.copyWith(color: enteTheme.colorScheme.textMuted),
|
||||
),
|
||||
const SizedBox(height: 12),
|
||||
TextFormField(
|
||||
decoration: InputDecoration(
|
||||
filled: true,
|
||||
hintText: context.l10n.enterYourRecoveryKey,
|
||||
contentPadding: const EdgeInsets.all(20),
|
||||
border: UnderlineInputBorder(
|
||||
borderSide: BorderSide.none,
|
||||
borderRadius: BorderRadius.circular(6),
|
||||
),
|
||||
),
|
||||
style: const TextStyle(
|
||||
fontSize: 14,
|
||||
fontFeatures: [FontFeature.tabularFigures()],
|
||||
),
|
||||
controller: _recoveryKey,
|
||||
autofocus: false,
|
||||
autocorrect: false,
|
||||
keyboardType: TextInputType.multiline,
|
||||
minLines: 4,
|
||||
maxLines: null,
|
||||
onChanged: (_) {
|
||||
setState(() {});
|
||||
},
|
||||
),
|
||||
const SizedBox(height: 12),
|
||||
Expanded(
|
||||
child: Container(
|
||||
alignment: Alignment.bottomCenter,
|
||||
width: double.infinity,
|
||||
padding: const EdgeInsets.fromLTRB(0, 12, 0, 40),
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.end,
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
children: [
|
||||
GradientButton(
|
||||
onTap: _verifyRecoveryKey,
|
||||
text: context.l10n.confirm,
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 20),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -5,8 +5,6 @@
|
||||
|
||||
endpoint:
|
||||
api: "http://localhost:8080"
|
||||
# Endpoint for the account service for passkey
|
||||
accounts: "http://localhost:3001"
|
||||
|
||||
log:
|
||||
http: false # log status code & time taken by requests
|
||||
|
||||
@@ -35,6 +35,7 @@ type AuthorizationResponse struct {
|
||||
ID int64 `json:"id"`
|
||||
KeyAttributes *KeyAttributes `json:"keyAttributes,omitempty"`
|
||||
EncryptedToken string `json:"encryptedToken,omitempty"`
|
||||
AccountsUrl string `json:"accountsUrl"`
|
||||
Token string `json:"token,omitempty"`
|
||||
TwoFactorSessionID string `json:"twoFactorSessionID"`
|
||||
PassKeySessionID string `json:"passkeySessionID"`
|
||||
|
||||
@@ -110,7 +110,6 @@ func initConfig(cliConfigDir string) {
|
||||
viper.AddConfigPath(".") // optionally look for config in the working directory
|
||||
|
||||
viper.SetDefault("endpoint.api", constants.EnteApiUrl)
|
||||
viper.SetDefault("endpoint.accounts", constants.EnteAccountUrl)
|
||||
viper.SetDefault("log.http", false)
|
||||
if err := viper.ReadInConfig(); err != nil {
|
||||
if _, ok := err.(viper.ConfigFileNotFoundError); ok {
|
||||
|
||||
@@ -8,8 +8,8 @@ import (
|
||||
eCrypto "github.com/ente-io/cli/internal/crypto"
|
||||
"github.com/ente-io/cli/pkg/model"
|
||||
"github.com/ente-io/cli/utils/browser"
|
||||
"github.com/ente-io/cli/utils/constants"
|
||||
"github.com/ente-io/cli/utils/encoding"
|
||||
"github.com/spf13/viper"
|
||||
"log"
|
||||
|
||||
"github.com/kong/go-srp"
|
||||
@@ -145,7 +145,10 @@ func (c *ClICtrl) verifyPassKey(ctx context.Context, authResp *api.Authorization
|
||||
if !authResp.IsPasskeyRequired() {
|
||||
return authResp, nil
|
||||
}
|
||||
baseAccountUrl := viper.GetString("endpoint.accounts")
|
||||
baseAccountUrl := constants.EnteAccountUrl
|
||||
if authResp.AccountsUrl != "" {
|
||||
baseAccountUrl = authResp.AccountsUrl
|
||||
}
|
||||
passkeyAuthUrl := fmt.Sprintf("%s/passkeys/verify?passkeySessionID=%s&redirect=ente-cli://passkey&clientPackage=%s", baseAccountUrl, authResp.PassKeySessionID, app.ClientPkg())
|
||||
fmt.Printf("Open this url in browser to verify passkey: %s\n", passkeyAuthUrl)
|
||||
err := browser.OpenURL(passkeyAuthUrl)
|
||||
|
||||
@@ -113,6 +113,11 @@ jobs:
|
||||
APPLE_APP_SPECIFIC_PASSWORD:
|
||||
${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }}
|
||||
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
|
||||
# Windows Azure Trusted Signing related values
|
||||
# https://www.electron.build/code-signing-win#using-azure-trusted-signing-beta
|
||||
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
|
||||
AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
|
||||
AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }}
|
||||
# Default is "draft", but since our nightly builds update
|
||||
# existing pre-releases, set this to "prerelease".
|
||||
EP_PRE_RELEASE: true
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
# CHANGELOG
|
||||
|
||||
## v1.7.14 (Unreleased)
|
||||
## v1.7.15 (Unreleased)
|
||||
|
||||
- .
|
||||
|
||||
## v1.7.14
|
||||
|
||||
- Increase file size limit to 10 GB.
|
||||
|
||||
## v1.7.13
|
||||
|
||||
- Generate streams for videos (beta)
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
- [Electron](#electron)
|
||||
- [Dev dependencies](#dev)
|
||||
- [Functionality](#functionality)
|
||||
- [Pinned](#pinned)
|
||||
|
||||
## Electron
|
||||
|
||||
@@ -140,3 +141,13 @@ handles to avoid reopening them for every operation.
|
||||
|
||||
[chokidar](https://github.com/paulmillr/chokidar) is used as a file system
|
||||
watcher for the watch folders functionality.
|
||||
|
||||
## Pinned
|
||||
|
||||
- `electron-builder` is pinned to 26.0.14 because of
|
||||
https://github.com/electron-userland/electron-builder/issues/9161
|
||||
|
||||
To reproduce this locally, add `x64ArchFiles: "ffmpeg"` to
|
||||
`electron-builder.yml`, then run `node_modules/.bin/electron-builder --mac`.
|
||||
|
||||
- `electron-store` is pinned to 8.2.0 because subsequent versions are ESM only.
|
||||
|
||||
@@ -14,6 +14,11 @@ win:
|
||||
target:
|
||||
- target: nsis
|
||||
arch: [x64, arm64]
|
||||
azureSignOptions:
|
||||
publisherName: ENTE TECHNOLOGIES, INC.
|
||||
endpoint: https://eus.codesigning.azure.net/
|
||||
certificateProfileName: EnteTrustCertProfile
|
||||
codeSigningAccountName: EnteTechnologiesInc
|
||||
nsis:
|
||||
deleteAppDataOnUninstall: true
|
||||
linux:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "ente",
|
||||
"version": "1.7.14-beta",
|
||||
"version": "1.7.15-beta",
|
||||
"private": true,
|
||||
"description": "Desktop client for Ente Photos",
|
||||
"repository": "github:ente-io/photos-desktop",
|
||||
@@ -21,9 +21,6 @@
|
||||
"lint-fix": "yarn prettier --write --log-level warn . && yarn eslint && yarn tsc",
|
||||
"prepare": "node scripts/vips.js"
|
||||
},
|
||||
"resolutions": {
|
||||
"jackspeak": "2.1.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"any-shell-escape": "^0.1.1",
|
||||
"auto-launch": "^5.0.6",
|
||||
@@ -31,33 +28,32 @@
|
||||
"clip-bpe-js": "^0.0.6",
|
||||
"comlink": "^4.4.2",
|
||||
"compare-versions": "^6.1.1",
|
||||
"electron-log": "^5.4.0",
|
||||
"electron-log": "^5.4.1",
|
||||
"electron-store": "^8.2.0",
|
||||
"electron-updater": "^6.6.3",
|
||||
"electron-updater": "^6.6.5",
|
||||
"ffmpeg-static": "^5.2.0",
|
||||
"lru-cache": "^11.1.0",
|
||||
"next-electron-server": "^1.0.0",
|
||||
"node-stream-zip": "^1.15.0",
|
||||
"onnxruntime-node": "^1.20.1",
|
||||
"zod": "^3.25.51"
|
||||
"onnxruntime-node": "1.22.0-rev",
|
||||
"zod": "^3.25.67"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@eslint/js": "^9.28.0",
|
||||
"@eslint/js": "^9.30.1",
|
||||
"@tsconfig/node22": "^22.0.2",
|
||||
"@types/auto-launch": "^5.0.5",
|
||||
"@types/ffmpeg-static": "^3.0.3",
|
||||
"ajv": "^8.17.1",
|
||||
"concurrently": "^9.1.2",
|
||||
"concurrently": "^9.2.0",
|
||||
"cross-env": "^7.0.3",
|
||||
"electron": "^36.4.0",
|
||||
"electron-builder": "^26.0.14",
|
||||
"electron": "^37.1.0",
|
||||
"electron-builder": "26.0.14",
|
||||
"eslint": "^9",
|
||||
"prettier": "3.5.3",
|
||||
"prettier": "3.6.2",
|
||||
"prettier-plugin-organize-imports": "^4.1.0",
|
||||
"prettier-plugin-packagejson": "^2.5.15",
|
||||
"prettier-plugin-packagejson": "^2.5.17",
|
||||
"shx": "^0.4.0",
|
||||
"typescript": "^5.8.3",
|
||||
"typescript-eslint": "^8.33.1"
|
||||
"typescript-eslint": "^8.35.1"
|
||||
},
|
||||
"packageManager": "yarn@1.22.22",
|
||||
"productName": "ente"
|
||||
|
||||
@@ -78,14 +78,6 @@ export const allowWindowClose = (): void => {
|
||||
* We call this at the end of this file.
|
||||
*/
|
||||
const main = () => {
|
||||
// Workaround for Electron 36 not launching on some Linux distros. Remove
|
||||
// once fixed or otherwise mitigated upstream.
|
||||
//
|
||||
// https://github.com/electron/electron/issues/46538#issuecomment-2808806722
|
||||
if (process.platform == "linux") {
|
||||
app.commandLine.appendSwitch("gtk-version", "3");
|
||||
}
|
||||
|
||||
const gotTheLock = app.requestSingleInstanceLock();
|
||||
if (!gotTheLock) {
|
||||
app.quit();
|
||||
|
||||
@@ -50,8 +50,8 @@ import { convertToJPEG, generateImageThumbnail } from "./services/image";
|
||||
import { logout } from "./services/logout";
|
||||
import {
|
||||
lastShownChangelogVersion,
|
||||
masterKeyB64,
|
||||
saveMasterKeyB64,
|
||||
masterKeyFromSafeStorage,
|
||||
saveMasterKeyInSafeStorage,
|
||||
setLastShownChangelogVersion,
|
||||
} from "./services/store";
|
||||
import {
|
||||
@@ -108,10 +108,12 @@ export const attachIPCHandlers = () => {
|
||||
|
||||
ipcMain.handle("selectDirectory", () => selectDirectory());
|
||||
|
||||
ipcMain.handle("masterKeyB64", () => masterKeyB64());
|
||||
ipcMain.handle("masterKeyFromSafeStorage", () =>
|
||||
masterKeyFromSafeStorage(),
|
||||
);
|
||||
|
||||
ipcMain.handle("saveMasterKeyB64", (_, masterKeyB64: string) =>
|
||||
saveMasterKeyB64(masterKeyB64),
|
||||
ipcMain.handle("saveMasterKeyInSafeStorage", (_, masterKey: string) =>
|
||||
saveMasterKeyInSafeStorage(masterKey),
|
||||
);
|
||||
|
||||
ipcMain.handle("lastShownChangelogVersion", () =>
|
||||
|
||||
@@ -184,14 +184,13 @@ const downloadModel = async (saveLocation: string, name: string) => {
|
||||
/**
|
||||
* Create an ONNX {@link InferenceSession} with some defaults.
|
||||
*/
|
||||
const createInferenceSession = async (modelPath: string) => {
|
||||
return await ort.InferenceSession.create(modelPath, {
|
||||
const createInferenceSession = (modelPath: string) =>
|
||||
ort.InferenceSession.create(modelPath, {
|
||||
// Restrict the number of threads to 1.
|
||||
intraOpNumThreads: 1,
|
||||
// Be more conservative with RAM usage.
|
||||
enableCpuMemArena: false,
|
||||
});
|
||||
};
|
||||
|
||||
const cachedCLIPImageSession = makeCachedInferenceSession(
|
||||
"mobileclip_s2_image_opset18_rgba_opt.onnx",
|
||||
@@ -233,9 +232,11 @@ const getTokenizer = () => (_tokenizer ??= new Tokenizer());
|
||||
export const computeCLIPTextEmbeddingIfAvailable = async (text: string) => {
|
||||
const sessionOrSkip = await Promise.race([
|
||||
cachedCLIPTextSession(),
|
||||
// Wait for a tick to get the session promise to resolved the first time
|
||||
// this code runs on each app start (and the model has been downloaded).
|
||||
wait(0).then(() => 1),
|
||||
// Wait a bit to get the session promise to resolved the first time this
|
||||
// code runs on each app start (in these cases the model will already be
|
||||
// downloaded, so session creation should take only a 1 or 2 ticks: file
|
||||
// system stat, and ort.InferenceSession.create).
|
||||
wait(50).then(() => 1),
|
||||
]);
|
||||
|
||||
// Don't wait for the download to complete.
|
||||
|
||||
@@ -24,17 +24,17 @@ export const clearStores = () => {
|
||||
* On macOS, `safeStorage` stores our data under a Keychain entry named
|
||||
* "<app-name> Safe Storage". In our case, "ente Safe Storage".
|
||||
*/
|
||||
export const saveMasterKeyB64 = (masterKeyB64: string) => {
|
||||
const encryptedKey = safeStorage.encryptString(masterKeyB64);
|
||||
const b64EncryptedKey = Buffer.from(encryptedKey).toString("base64");
|
||||
safeStorageStore.set("encryptionKey", b64EncryptedKey);
|
||||
export const saveMasterKeyInSafeStorage = (masterKey: string) => {
|
||||
const encryptedKeyBuffer = safeStorage.encryptString(masterKey);
|
||||
const encryptedKey = Buffer.from(encryptedKeyBuffer).toString("base64");
|
||||
safeStorageStore.set("encryptionKey", encryptedKey);
|
||||
};
|
||||
|
||||
export const masterKeyB64 = (): string | undefined => {
|
||||
const b64EncryptedKey = safeStorageStore.get("encryptionKey");
|
||||
if (!b64EncryptedKey) return undefined;
|
||||
const keyBuffer = Buffer.from(b64EncryptedKey, "base64");
|
||||
return safeStorage.decryptString(keyBuffer);
|
||||
export const masterKeyFromSafeStorage = (): string | undefined => {
|
||||
const encryptedKey = safeStorageStore.get("encryptionKey");
|
||||
if (!encryptedKey) return undefined;
|
||||
const encryptedKeyBuffer = Buffer.from(encryptedKey, "base64");
|
||||
return safeStorage.decryptString(encryptedKeyBuffer);
|
||||
};
|
||||
|
||||
export const lastShownChangelogVersion = (): number | undefined =>
|
||||
|
||||
@@ -113,10 +113,11 @@ const logout = () => {
|
||||
return ipcRenderer.invoke("logout");
|
||||
};
|
||||
|
||||
const masterKeyB64 = () => ipcRenderer.invoke("masterKeyB64");
|
||||
const masterKeyFromSafeStorage = () =>
|
||||
ipcRenderer.invoke("masterKeyFromSafeStorage");
|
||||
|
||||
const saveMasterKeyB64 = (masterKeyB64: string) =>
|
||||
ipcRenderer.invoke("saveMasterKeyB64", masterKeyB64);
|
||||
const saveMasterKeyInSafeStorage = (masterKey: string) =>
|
||||
ipcRenderer.invoke("saveMasterKeyInSafeStorage", masterKey);
|
||||
|
||||
const lastShownChangelogVersion = () =>
|
||||
ipcRenderer.invoke("lastShownChangelogVersion");
|
||||
@@ -358,8 +359,8 @@ contextBridge.exposeInMainWorld("electron", {
|
||||
selectDirectory,
|
||||
pathForFile,
|
||||
logout,
|
||||
masterKeyB64,
|
||||
saveMasterKeyB64,
|
||||
masterKeyFromSafeStorage,
|
||||
saveMasterKeyInSafeStorage,
|
||||
lastShownChangelogVersion,
|
||||
setLastShownChangelogVersion,
|
||||
isAutoLaunchEnabled,
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
ajv "^6.12.0"
|
||||
ajv-keywords "^3.4.1"
|
||||
|
||||
"@electron/asar@3.4.1":
|
||||
"@electron/asar@3.4.1", "@electron/asar@^3.2.7":
|
||||
version "3.4.1"
|
||||
resolved "https://registry.yarnpkg.com/@electron/asar/-/asar-3.4.1.tgz#4e9196a4b54fba18c56cd8d5cac67c5bdc588065"
|
||||
integrity sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==
|
||||
@@ -34,15 +34,6 @@
|
||||
glob "^7.1.6"
|
||||
minimatch "^3.0.4"
|
||||
|
||||
"@electron/asar@^3.2.7":
|
||||
version "3.2.18"
|
||||
resolved "https://registry.yarnpkg.com/@electron/asar/-/asar-3.2.18.tgz#fa607f829209bab8b9e0ce6658d3fe81b2cba517"
|
||||
integrity sha512-2XyvMe3N3Nrs8cV39IKELRHTYUWFKrmqqSY1U+GMlc0jvqjIVnoxhNd2H4JolWQncbJi1DCvb5TNxZuI2fEjWg==
|
||||
dependencies:
|
||||
commander "^5.0.0"
|
||||
glob "^7.1.6"
|
||||
minimatch "^3.0.4"
|
||||
|
||||
"@electron/fuses@^1.8.0":
|
||||
version "1.8.0"
|
||||
resolved "https://registry.yarnpkg.com/@electron/fuses/-/fuses-1.8.0.tgz#ad34d3cc4703b1258b83f6989917052cfc1490a0"
|
||||
@@ -184,10 +175,10 @@
|
||||
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.9.1.tgz#4a97e85e982099d6c7ee8410aacb55adaa576f06"
|
||||
integrity sha512-xIDQRsfg5hNBqHz04H1R3scSVwmI+KUbqjsQKHKQ1DAUSaUjYPReZZmS/5PNiKu1fUvzDd6H7DEDKACSEhu+TQ==
|
||||
|
||||
"@eslint/js@^9.28.0":
|
||||
version "9.28.0"
|
||||
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.28.0.tgz#7822ccc2f8cae7c3cd4f902377d520e9ae03f844"
|
||||
integrity sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==
|
||||
"@eslint/js@^9.30.1":
|
||||
version "9.30.1"
|
||||
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.30.1.tgz#ebe9dd52a38345784c486300175a28c6013c088d"
|
||||
integrity sha512-zXhuECFlyep42KZUhWjfvsmXGX39W8K8LFb8AWXM9gSV9dQB+MrJGLKvW6Zw0Ggnbpw0VHTtrhFXYe3Gym18jg==
|
||||
|
||||
"@eslint/object-schema@^2.1.4":
|
||||
version "2.1.4"
|
||||
@@ -209,12 +200,29 @@
|
||||
resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.0.tgz#6d86b8cb322660f03d3f0aa94b99bdd8e172d570"
|
||||
integrity sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==
|
||||
|
||||
"@isaacs/fs-minipass@^4.0.0":
|
||||
"@isaacs/balanced-match@^4.0.1":
|
||||
version "4.0.1"
|
||||
resolved "https://registry.yarnpkg.com/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz#2d59ae3ab4b38fb4270bfa23d30f8e2e86c7fe32"
|
||||
integrity sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==
|
||||
resolved "https://registry.yarnpkg.com/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz#3081dadbc3460661b751e7591d7faea5df39dd29"
|
||||
integrity sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==
|
||||
|
||||
"@isaacs/brace-expansion@^5.0.0":
|
||||
version "5.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz#4b3dabab7d8e75a429414a96bd67bf4c1d13e0f3"
|
||||
integrity sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==
|
||||
dependencies:
|
||||
minipass "^7.0.4"
|
||||
"@isaacs/balanced-match" "^4.0.1"
|
||||
|
||||
"@isaacs/cliui@^8.0.2":
|
||||
version "8.0.2"
|
||||
resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550"
|
||||
integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==
|
||||
dependencies:
|
||||
string-width "^5.1.2"
|
||||
string-width-cjs "npm:string-width@^4.2.0"
|
||||
strip-ansi "^7.0.1"
|
||||
strip-ansi-cjs "npm:strip-ansi@^6.0.1"
|
||||
wrap-ansi "^8.1.0"
|
||||
wrap-ansi-cjs "npm:wrap-ansi@^7.0.0"
|
||||
|
||||
"@malept/cross-spawn-promise@^2.0.0":
|
||||
version "2.0.0"
|
||||
@@ -324,11 +332,6 @@
|
||||
dependencies:
|
||||
"@types/ms" "*"
|
||||
|
||||
"@types/ffmpeg-static@^3.0.3":
|
||||
version "3.0.3"
|
||||
resolved "https://registry.yarnpkg.com/@types/ffmpeg-static/-/ffmpeg-static-3.0.3.tgz#605358ac6304507a75c2fd5fd861534837b19e2f"
|
||||
integrity sha512-wmjANN0CiYs5clQESK+xE6plet0y9ndqaNBdQx4IIw7ZbPBMQw+14Lq4ky2WqMqGlpFJ9ZUxU0O43TvVZziyyA==
|
||||
|
||||
"@types/fs-extra@9.0.13", "@types/fs-extra@^9.0.11":
|
||||
version "9.0.13"
|
||||
resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45"
|
||||
@@ -392,78 +395,78 @@
|
||||
dependencies:
|
||||
"@types/node" "*"
|
||||
|
||||
"@typescript-eslint/eslint-plugin@8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.33.1.tgz#532641b416ed2afd5be893cddb2a58e9cd1f7a3e"
|
||||
integrity sha512-TDCXj+YxLgtvxvFlAvpoRv9MAncDLBV2oT9Bd7YBGC/b/sEURoOYuIwLI99rjWOfY3QtDzO+mk0n4AmdFExW8A==
|
||||
"@typescript-eslint/eslint-plugin@8.35.1":
|
||||
version "8.35.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.35.1.tgz#06b1129fe26d6532abd58fb2b3fe9810bd016935"
|
||||
integrity sha512-9XNTlo7P7RJxbVeICaIIIEipqxLKguyh+3UbXuT2XQuFp6d8VOeDEGuz5IiX0dgZo8CiI6aOFLg4e8cF71SFVg==
|
||||
dependencies:
|
||||
"@eslint-community/regexpp" "^4.10.0"
|
||||
"@typescript-eslint/scope-manager" "8.33.1"
|
||||
"@typescript-eslint/type-utils" "8.33.1"
|
||||
"@typescript-eslint/utils" "8.33.1"
|
||||
"@typescript-eslint/visitor-keys" "8.33.1"
|
||||
"@typescript-eslint/scope-manager" "8.35.1"
|
||||
"@typescript-eslint/type-utils" "8.35.1"
|
||||
"@typescript-eslint/utils" "8.35.1"
|
||||
"@typescript-eslint/visitor-keys" "8.35.1"
|
||||
graphemer "^1.4.0"
|
||||
ignore "^7.0.0"
|
||||
natural-compare "^1.4.0"
|
||||
ts-api-utils "^2.1.0"
|
||||
|
||||
"@typescript-eslint/parser@8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.33.1.tgz#ef9a5ee6aa37a6b4f46cc36d08a14f828238afe2"
|
||||
integrity sha512-qwxv6dq682yVvgKKp2qWwLgRbscDAYktPptK4JPojCwwi3R9cwrvIxS4lvBpzmcqzR4bdn54Z0IG1uHFskW4dA==
|
||||
"@typescript-eslint/parser@8.35.1":
|
||||
version "8.35.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.35.1.tgz#787312e80f0f337d85f4c2a569411c469e852d44"
|
||||
integrity sha512-3MyiDfrfLeK06bi/g9DqJxP5pV74LNv4rFTyvGDmT3x2p1yp1lOd+qYZfiRPIOf/oON+WRZR5wxxuF85qOar+w==
|
||||
dependencies:
|
||||
"@typescript-eslint/scope-manager" "8.33.1"
|
||||
"@typescript-eslint/types" "8.33.1"
|
||||
"@typescript-eslint/typescript-estree" "8.33.1"
|
||||
"@typescript-eslint/visitor-keys" "8.33.1"
|
||||
"@typescript-eslint/scope-manager" "8.35.1"
|
||||
"@typescript-eslint/types" "8.35.1"
|
||||
"@typescript-eslint/typescript-estree" "8.35.1"
|
||||
"@typescript-eslint/visitor-keys" "8.35.1"
|
||||
debug "^4.3.4"
|
||||
|
||||
"@typescript-eslint/project-service@8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.33.1.tgz#c85e7d9a44d6a11fe64e73ac1ed47de55dc2bf9f"
|
||||
integrity sha512-DZR0efeNklDIHHGRpMpR5gJITQpu6tLr9lDJnKdONTC7vvzOlLAG/wcfxcdxEWrbiZApcoBCzXqU/Z458Za5Iw==
|
||||
"@typescript-eslint/project-service@8.35.1":
|
||||
version "8.35.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.35.1.tgz#815bb771f2f6c97780e44299434ece3c2e526127"
|
||||
integrity sha512-VYxn/5LOpVxADAuP3NrnxxHYfzVtQzLKeldIhDhzC8UHaiQvYlXvKuVho1qLduFbJjjy5U5bkGwa3rUGUb1Q6Q==
|
||||
dependencies:
|
||||
"@typescript-eslint/tsconfig-utils" "^8.33.1"
|
||||
"@typescript-eslint/types" "^8.33.1"
|
||||
"@typescript-eslint/tsconfig-utils" "^8.35.1"
|
||||
"@typescript-eslint/types" "^8.35.1"
|
||||
debug "^4.3.4"
|
||||
|
||||
"@typescript-eslint/scope-manager@8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.33.1.tgz#d1e0efb296da5097d054bc9972e69878a2afea73"
|
||||
integrity sha512-dM4UBtgmzHR9bS0Rv09JST0RcHYearoEoo3pG5B6GoTR9XcyeqX87FEhPo+5kTvVfKCvfHaHrcgeJQc6mrDKrA==
|
||||
"@typescript-eslint/scope-manager@8.35.1":
|
||||
version "8.35.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.35.1.tgz#b19f9be65c8d1059e88a323a1a6567dbfe0a1a4e"
|
||||
integrity sha512-s/Bpd4i7ht2934nG+UoSPlYXd08KYz3bmjLEb7Ye1UVob0d1ENiT3lY8bsCmik4RqfSbPw9xJJHbugpPpP5JUg==
|
||||
dependencies:
|
||||
"@typescript-eslint/types" "8.33.1"
|
||||
"@typescript-eslint/visitor-keys" "8.33.1"
|
||||
"@typescript-eslint/types" "8.35.1"
|
||||
"@typescript-eslint/visitor-keys" "8.35.1"
|
||||
|
||||
"@typescript-eslint/tsconfig-utils@8.33.1", "@typescript-eslint/tsconfig-utils@^8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.33.1.tgz#7836afcc097a4657a5ed56670851a450d8b70ab8"
|
||||
integrity sha512-STAQsGYbHCF0/e+ShUQ4EatXQ7ceh3fBCXkNU7/MZVKulrlq1usH7t2FhxvCpuCi5O5oi1vmVaAjrGeL71OK1g==
|
||||
"@typescript-eslint/tsconfig-utils@8.35.1", "@typescript-eslint/tsconfig-utils@^8.35.1":
|
||||
version "8.35.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.35.1.tgz#c2db8714c181cc0700216c1a2e3cf55719c58006"
|
||||
integrity sha512-K5/U9VmT9dTHoNowWZpz+/TObS3xqC5h0xAIjXPw+MNcKV9qg6eSatEnmeAwkjHijhACH0/N7bkhKvbt1+DXWQ==
|
||||
|
||||
"@typescript-eslint/type-utils@8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.33.1.tgz#d73ee1a29d8a0abe60d4abbff4f1d040f0de15fa"
|
||||
integrity sha512-1cG37d9xOkhlykom55WVwG2QRNC7YXlxMaMzqw2uPeJixBFfKWZgaP/hjAObqMN/u3fr5BrTwTnc31/L9jQ2ww==
|
||||
"@typescript-eslint/type-utils@8.35.1":
|
||||
version "8.35.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.35.1.tgz#4f9a07d6efa0e617a67e1890d28117e68ce154bd"
|
||||
integrity sha512-HOrUBlfVRz5W2LIKpXzZoy6VTZzMu2n8q9C2V/cFngIC5U1nStJgv0tMV4sZPzdf4wQm9/ToWUFPMN9Vq9VJQQ==
|
||||
dependencies:
|
||||
"@typescript-eslint/typescript-estree" "8.33.1"
|
||||
"@typescript-eslint/utils" "8.33.1"
|
||||
"@typescript-eslint/typescript-estree" "8.35.1"
|
||||
"@typescript-eslint/utils" "8.35.1"
|
||||
debug "^4.3.4"
|
||||
ts-api-utils "^2.1.0"
|
||||
|
||||
"@typescript-eslint/types@8.33.1", "@typescript-eslint/types@^8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.33.1.tgz#b693111bc2180f8098b68e9958cf63761657a55f"
|
||||
integrity sha512-xid1WfizGhy/TKMTwhtVOgalHwPtV8T32MS9MaH50Cwvz6x6YqRIPdD2WvW0XaqOzTV9p5xdLY0h/ZusU5Lokg==
|
||||
"@typescript-eslint/types@8.35.1", "@typescript-eslint/types@^8.35.1":
|
||||
version "8.35.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.35.1.tgz#4344dcf934495bbf25a9f83a06dd9fe2acf15780"
|
||||
integrity sha512-q/O04vVnKHfrrhNAscndAn1tuQhIkwqnaW+eu5waD5IPts2eX1dgJxgqcPx5BX109/qAz7IG6VrEPTOYKCNfRQ==
|
||||
|
||||
"@typescript-eslint/typescript-estree@8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.33.1.tgz#d271beed470bc915b8764e22365d4925c2ea265d"
|
||||
integrity sha512-+s9LYcT8LWjdYWu7IWs7FvUxpQ/DGkdjZeE/GGulHvv8rvYwQvVaUZ6DE+j5x/prADUgSbbCWZ2nPI3usuVeOA==
|
||||
"@typescript-eslint/typescript-estree@8.35.1":
|
||||
version "8.35.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.35.1.tgz#b80e85fcb6bfbcbacb3224b1367f6ca3f03e6183"
|
||||
integrity sha512-Vvpuvj4tBxIka7cPs6Y1uvM7gJgdF5Uu9F+mBJBPY4MhvjrjWGK4H0lVgLJd/8PWZ23FTqsaJaLEkBCFUk8Y9g==
|
||||
dependencies:
|
||||
"@typescript-eslint/project-service" "8.33.1"
|
||||
"@typescript-eslint/tsconfig-utils" "8.33.1"
|
||||
"@typescript-eslint/types" "8.33.1"
|
||||
"@typescript-eslint/visitor-keys" "8.33.1"
|
||||
"@typescript-eslint/project-service" "8.35.1"
|
||||
"@typescript-eslint/tsconfig-utils" "8.35.1"
|
||||
"@typescript-eslint/types" "8.35.1"
|
||||
"@typescript-eslint/visitor-keys" "8.35.1"
|
||||
debug "^4.3.4"
|
||||
fast-glob "^3.3.2"
|
||||
is-glob "^4.0.3"
|
||||
@@ -471,23 +474,23 @@
|
||||
semver "^7.6.0"
|
||||
ts-api-utils "^2.1.0"
|
||||
|
||||
"@typescript-eslint/utils@8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.33.1.tgz#ea22f40d3553da090f928cf17907e963643d4b96"
|
||||
integrity sha512-52HaBiEQUaRYqAXpfzWSR2U3gxk92Kw006+xZpElaPMg3C4PgM+A5LqwoQI1f9E5aZ/qlxAZxzm42WX+vn92SQ==
|
||||
"@typescript-eslint/utils@8.35.1":
|
||||
version "8.35.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.35.1.tgz#a9a0ceeb81c9d132f3f75537ad2ca7f6ca266523"
|
||||
integrity sha512-lhnwatFmOFcazAsUm3ZnZFpXSxiwoa1Lj50HphnDe1Et01NF4+hrdXONSUHIcbVu2eFb1bAf+5yjXkGVkXBKAQ==
|
||||
dependencies:
|
||||
"@eslint-community/eslint-utils" "^4.7.0"
|
||||
"@typescript-eslint/scope-manager" "8.33.1"
|
||||
"@typescript-eslint/types" "8.33.1"
|
||||
"@typescript-eslint/typescript-estree" "8.33.1"
|
||||
"@typescript-eslint/scope-manager" "8.35.1"
|
||||
"@typescript-eslint/types" "8.35.1"
|
||||
"@typescript-eslint/typescript-estree" "8.35.1"
|
||||
|
||||
"@typescript-eslint/visitor-keys@8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.33.1.tgz#6c6e002c24d13211df3df851767f24dfdb4f42bc"
|
||||
integrity sha512-3i8NrFcZeeDHJ+7ZUuDkGT+UHq+XoFGsymNK2jZCOHcfEzRQ0BdpRtdpSx/Iyf3MHLWIcLS0COuOPibKQboIiQ==
|
||||
"@typescript-eslint/visitor-keys@8.35.1":
|
||||
version "8.35.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.35.1.tgz#aac78ab2265dd11927bc6af3f9c5a021bbc1670a"
|
||||
integrity sha512-VRwixir4zBWCSTP/ljEo091lbpypz57PoeAQ9imjG+vbeof9LplljsL1mos4ccG6H9IjfrVGM359RozUnuFhpw==
|
||||
dependencies:
|
||||
"@typescript-eslint/types" "8.33.1"
|
||||
eslint-visitor-keys "^4.2.0"
|
||||
"@typescript-eslint/types" "8.35.1"
|
||||
eslint-visitor-keys "^4.2.1"
|
||||
|
||||
"@xmldom/xmldom@^0.8.8":
|
||||
version "0.8.10"
|
||||
@@ -509,6 +512,11 @@ acorn@^8.12.0:
|
||||
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248"
|
||||
integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==
|
||||
|
||||
adm-zip@^0.5.16:
|
||||
version "0.5.16"
|
||||
resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.5.16.tgz#0b5e4c779f07dedea5805cdccb1147071d94a909"
|
||||
integrity sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==
|
||||
|
||||
agent-base@6, agent-base@^6.0.2:
|
||||
version "6.0.2"
|
||||
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
|
||||
@@ -575,6 +583,11 @@ ansi-regex@^5.0.1:
|
||||
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
|
||||
integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
|
||||
|
||||
ansi-regex@^6.0.1:
|
||||
version "6.1.0"
|
||||
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654"
|
||||
integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==
|
||||
|
||||
ansi-styles@^4.0.0, ansi-styles@^4.1.0:
|
||||
version "4.3.0"
|
||||
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
|
||||
@@ -582,6 +595,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0:
|
||||
dependencies:
|
||||
color-convert "^2.0.1"
|
||||
|
||||
ansi-styles@^6.1.0:
|
||||
version "6.2.1"
|
||||
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5"
|
||||
integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==
|
||||
|
||||
any-shell-escape@^0.1.1:
|
||||
version "0.1.1"
|
||||
resolved "https://registry.yarnpkg.com/any-shell-escape/-/any-shell-escape-0.1.1.tgz#d55ab972244c71a9a5e1ab0879f30bf110806959"
|
||||
@@ -854,11 +872,6 @@ chownr@^2.0.0:
|
||||
resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
|
||||
integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
|
||||
|
||||
chownr@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/chownr/-/chownr-3.0.0.tgz#9855e64ecd240a9cc4267ce8a4aa5d24a1da15e4"
|
||||
integrity sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==
|
||||
|
||||
chromium-pickle-js@^0.2.0:
|
||||
version "0.2.0"
|
||||
resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205"
|
||||
@@ -974,10 +987,10 @@ concat-stream@^2.0.0:
|
||||
readable-stream "^3.0.2"
|
||||
typedarray "^0.0.6"
|
||||
|
||||
concurrently@^9.1.2:
|
||||
version "9.1.2"
|
||||
resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-9.1.2.tgz#22d9109296961eaee773e12bfb1ce9a66bc9836c"
|
||||
integrity sha512-H9MWcoPsYddwbOGM6difjVwVZHl63nwMEwDJG/L7VGtuaJhb12h2caPG2tVPWs7emuYix252iGfqOyrz1GczTQ==
|
||||
concurrently@^9.2.0:
|
||||
version "9.2.0"
|
||||
resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-9.2.0.tgz#233e3892ceb0b5db9fd49e9c8c739737a7b638b5"
|
||||
integrity sha512-IsB/fiXTupmagMW4MNp2lx2cdSN2FfZq78vF90LBB+zZHArbIQZjQtzXCiXnvTxCZSvXanTqFLWBjw2UkLx1SQ==
|
||||
dependencies:
|
||||
chalk "^4.1.2"
|
||||
lodash "^4.17.21"
|
||||
@@ -1186,6 +1199,11 @@ dotenv@^16.4.4, dotenv@^16.4.5:
|
||||
resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f"
|
||||
integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==
|
||||
|
||||
eastasianwidth@^0.2.0:
|
||||
version "0.2.0"
|
||||
resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb"
|
||||
integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==
|
||||
|
||||
ejs@^3.1.8:
|
||||
version "3.1.10"
|
||||
resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b"
|
||||
@@ -1193,7 +1211,7 @@ ejs@^3.1.8:
|
||||
dependencies:
|
||||
jake "^10.8.5"
|
||||
|
||||
electron-builder@^26.0.14:
|
||||
electron-builder@26.0.14:
|
||||
version "26.0.14"
|
||||
resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-26.0.14.tgz#8927c6da42a69425d15e08f351e944ea0e7866da"
|
||||
integrity sha512-YBxpWLMGj0oS7fbS3LVingeZqFunU0F8s+uB9QTd5+wN4qgrf/rSGRkqoImbWg2+F2yHq11wmaA/Xr9xzvgQ0w==
|
||||
@@ -1209,10 +1227,10 @@ electron-builder@^26.0.14:
|
||||
simple-update-notifier "2.0.0"
|
||||
yargs "^17.6.2"
|
||||
|
||||
electron-log@^5.4.0:
|
||||
version "5.4.0"
|
||||
resolved "https://registry.yarnpkg.com/electron-log/-/electron-log-5.4.0.tgz#3180bf5194b2e2efacb62ec1392f8150faf4de6b"
|
||||
integrity sha512-AXI5OVppskrWxEAmCxuv8ovX+s2Br39CpCAgkGMNHQtjYT3IiVbSQTncEjFVGPgoH35ZygRm/mvUMBDWwhRxgg==
|
||||
electron-log@^5.4.1:
|
||||
version "5.4.1"
|
||||
resolved "https://registry.yarnpkg.com/electron-log/-/electron-log-5.4.1.tgz#700ddc6ef4b06c13a983468580ba7a7e579129d4"
|
||||
integrity sha512-QvisA18Z++8E3Th0zmhUelys9dEv7aIeXJlbFw3UrxCc8H9qSRW0j8/ooTef/EtHui8tVmbKSL+EIQzP9GoRLg==
|
||||
|
||||
electron-publish@26.0.13:
|
||||
version "26.0.13"
|
||||
@@ -1236,10 +1254,10 @@ electron-store@^8.2.0:
|
||||
conf "^10.2.0"
|
||||
type-fest "^2.17.0"
|
||||
|
||||
electron-updater@^6.6.3:
|
||||
version "6.6.3"
|
||||
resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-6.6.3.tgz#a1f53671ffbb08a475d495d48f0c0d971e665d5d"
|
||||
integrity sha512-i448/SwMtqxy5wqAcXScnWjiFxZp+hmWA2jZCmojcdfodEGhi/DWTdRP01mE3lCILb8hmdE28SBaHf1oQW3+kw==
|
||||
electron-updater@^6.6.5:
|
||||
version "6.6.5"
|
||||
resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-6.6.5.tgz#6614daa2f737c294471eee7ce7b61deda0d5543a"
|
||||
integrity sha512-jnk38WfByl2Pb0cje02xls/pJkvkq3AQZI7usDCLriU23adkerLTkRrugbCPuUxUOa79nY1g/rokHPWHZFBKyA==
|
||||
dependencies:
|
||||
builder-util-runtime "9.3.2"
|
||||
fs-extra "^10.1.0"
|
||||
@@ -1250,10 +1268,10 @@ electron-updater@^6.6.3:
|
||||
semver "^7.6.3"
|
||||
tiny-typed-emitter "^2.1.0"
|
||||
|
||||
electron@^36.4.0:
|
||||
version "36.4.0"
|
||||
resolved "https://registry.yarnpkg.com/electron/-/electron-36.4.0.tgz#9463bf5fa7565ae7be3a274f7f6a46359bcfe74d"
|
||||
integrity sha512-LLOOZEuW5oqvnjC7HBQhIqjIIJAZCIFjQxltQGLfEC7XFsBoZgQ3u3iFj+Kzw68Xj97u1n57Jdt7P98qLvUibQ==
|
||||
electron@^37.1.0:
|
||||
version "37.1.0"
|
||||
resolved "https://registry.yarnpkg.com/electron/-/electron-37.1.0.tgz#6d6d1891f8add5d2d44007e2ee5d4542140fc4b4"
|
||||
integrity sha512-Fcr3yfAw4oU392waVZSlrFUQx4P+h/k31+PRgkBY9tFx9E/zxzdPQQj0achZlG1HRDusw3ooQB+OXb9PvufdzA==
|
||||
dependencies:
|
||||
"@electron/get" "^2.0.0"
|
||||
"@types/node" "^22.7.7"
|
||||
@@ -1264,6 +1282,11 @@ emoji-regex@^8.0.0:
|
||||
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
|
||||
integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
|
||||
|
||||
emoji-regex@^9.2.2:
|
||||
version "9.2.2"
|
||||
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
|
||||
integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
|
||||
|
||||
encoding@^0.1.13:
|
||||
version "0.1.13"
|
||||
resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9"
|
||||
@@ -1328,11 +1351,16 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.3:
|
||||
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800"
|
||||
integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
|
||||
|
||||
eslint-visitor-keys@^4.0.0, eslint-visitor-keys@^4.2.0:
|
||||
eslint-visitor-keys@^4.0.0:
|
||||
version "4.2.0"
|
||||
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45"
|
||||
integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==
|
||||
|
||||
eslint-visitor-keys@^4.2.1:
|
||||
version "4.2.1"
|
||||
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz#4cfea60fe7dd0ad8e816e1ed026c1d5251b512c1"
|
||||
integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==
|
||||
|
||||
eslint@^9:
|
||||
version "9.9.1"
|
||||
resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.9.1.tgz#147ac9305d56696fb84cf5bdecafd6517ddc77ec"
|
||||
@@ -1669,7 +1697,7 @@ glob-parent@^6.0.2:
|
||||
dependencies:
|
||||
is-glob "^4.0.3"
|
||||
|
||||
glob@^10.3.12, glob@^10.3.7:
|
||||
glob@^10.3.12:
|
||||
version "10.4.5"
|
||||
resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956"
|
||||
integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==
|
||||
@@ -2024,12 +2052,12 @@ isexe@^2.0.0:
|
||||
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
|
||||
integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
|
||||
|
||||
jackspeak@2.1.1, jackspeak@^3.1.2:
|
||||
version "2.1.1"
|
||||
resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.1.1.tgz#2a42db4cfbb7e55433c28b6f75d8b796af9669cd"
|
||||
integrity sha512-juf9stUEwUaILepraGOWIJTLwg48bUnBmRqd2ln2Os1sW987zeoj/hzhbvRB95oMuS2ZTpjULmdwHNX4rzZIZw==
|
||||
jackspeak@^3.1.2:
|
||||
version "3.4.3"
|
||||
resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a"
|
||||
integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==
|
||||
dependencies:
|
||||
cliui "^8.0.1"
|
||||
"@isaacs/cliui" "^8.0.2"
|
||||
optionalDependencies:
|
||||
"@pkgjs/parseargs" "^0.11.0"
|
||||
|
||||
@@ -2276,11 +2304,11 @@ mimic-response@^3.1.0:
|
||||
integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==
|
||||
|
||||
minimatch@^10.0.0:
|
||||
version "10.0.1"
|
||||
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.0.1.tgz#ce0521856b453c86e25f2c4c0d03e6ff7ddc440b"
|
||||
integrity sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==
|
||||
version "10.0.3"
|
||||
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.0.3.tgz#cf7a0314a16c4d9ab73a7730a0e8e3c3502d47aa"
|
||||
integrity sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==
|
||||
dependencies:
|
||||
brace-expansion "^2.0.1"
|
||||
"@isaacs/brace-expansion" "^5.0.0"
|
||||
|
||||
minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
|
||||
version "3.1.2"
|
||||
@@ -2359,7 +2387,7 @@ minipass@^5.0.0:
|
||||
resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d"
|
||||
integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==
|
||||
|
||||
"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4, minipass@^7.1.2:
|
||||
"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2:
|
||||
version "7.1.2"
|
||||
resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707"
|
||||
integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==
|
||||
@@ -2372,14 +2400,6 @@ minizlib@^2.1.1, minizlib@^2.1.2:
|
||||
minipass "^3.0.0"
|
||||
yallist "^4.0.0"
|
||||
|
||||
minizlib@^3.0.1:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-3.0.1.tgz#46d5329d1eb3c83924eff1d3b858ca0a31581012"
|
||||
integrity sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==
|
||||
dependencies:
|
||||
minipass "^7.0.4"
|
||||
rimraf "^5.0.5"
|
||||
|
||||
mkdirp@^0.5.1:
|
||||
version "0.5.6"
|
||||
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6"
|
||||
@@ -2392,11 +2412,6 @@ mkdirp@^1.0.3, mkdirp@^1.0.4:
|
||||
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
|
||||
integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
|
||||
|
||||
mkdirp@^3.0.1:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-3.0.1.tgz#e44e4c5607fb279c168241713cc6e0fea9adcb50"
|
||||
integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==
|
||||
|
||||
ms@2.1.2:
|
||||
version "2.1.2"
|
||||
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
|
||||
@@ -2489,18 +2504,19 @@ onetime@^5.1.0, onetime@^5.1.2:
|
||||
dependencies:
|
||||
mimic-fn "^2.1.0"
|
||||
|
||||
onnxruntime-common@1.20.1:
|
||||
version "1.20.1"
|
||||
resolved "https://registry.yarnpkg.com/onnxruntime-common/-/onnxruntime-common-1.20.1.tgz#b42e317d4d6728745b9e8089617c8cd938d312dc"
|
||||
integrity sha512-YiU0s0IzYYC+gWvqD1HzLc46Du1sXpSiwzKb63PACIJr6LfL27VsXSXQvt68EzD3V0D5Bc0vyJTjmMxp0ylQiw==
|
||||
onnxruntime-common@1.22.0:
|
||||
version "1.22.0"
|
||||
resolved "https://registry.yarnpkg.com/onnxruntime-common/-/onnxruntime-common-1.22.0.tgz#27d7d06ebb6c7d3dd773dfa21b6fa2ae86f64983"
|
||||
integrity sha512-vcuaNWgtF2dGQu/EP5P8UI5rEPEYqXG2sPPe5j9lg2TY/biJF8eWklTMwlDO08iuXq48xJo0awqIpK5mPG+IxA==
|
||||
|
||||
onnxruntime-node@^1.20.1:
|
||||
version "1.20.1"
|
||||
resolved "https://registry.yarnpkg.com/onnxruntime-node/-/onnxruntime-node-1.20.1.tgz#a5ba0bd160aeccdb4b7d36fbc2f6a97bde1f7843"
|
||||
integrity sha512-di/I4HDXRw+FLgq+TyHmQEDd3cEp9iFFZm0r4uJ1Wd7b/WE1VXtKWo8yemex347c6GNF/3Pv86ZfPhIWxORr0w==
|
||||
onnxruntime-node@1.22.0-rev:
|
||||
version "1.22.0-rev"
|
||||
resolved "https://registry.yarnpkg.com/onnxruntime-node/-/onnxruntime-node-1.22.0-rev.tgz#068c85adb6b938cbaaef2ffba4b35fcac3e683f4"
|
||||
integrity sha512-9vh50/mnwauFUex0NYyyLf9pmRp8q6DVMG8K+xtoXv68SSB9bESa1bEbWLqfUncgB3XucQaOV+wfMPcqANMYhQ==
|
||||
dependencies:
|
||||
onnxruntime-common "1.20.1"
|
||||
tar "^7.0.1"
|
||||
adm-zip "^0.5.16"
|
||||
global-agent "^3.0.0"
|
||||
onnxruntime-common "1.22.0"
|
||||
|
||||
optionator@^0.9.3:
|
||||
version "0.9.4"
|
||||
@@ -2680,18 +2696,18 @@ prettier-plugin-organize-imports@^4.1.0:
|
||||
resolved "https://registry.yarnpkg.com/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-4.1.0.tgz#f3d3764046a8e7ba6491431158b9be6ffd83b90f"
|
||||
integrity sha512-5aWRdCgv645xaa58X8lOxzZoiHAldAPChljr/MT0crXVOWTZ+Svl4hIWlz+niYSlO6ikE5UXkN1JrRvIP2ut0A==
|
||||
|
||||
prettier-plugin-packagejson@^2.5.15:
|
||||
version "2.5.15"
|
||||
resolved "https://registry.yarnpkg.com/prettier-plugin-packagejson/-/prettier-plugin-packagejson-2.5.15.tgz#7ea880d4bb1681b5331ea7044efd3d653776f469"
|
||||
integrity sha512-2QSx6y4IT6LTwXtCvXAopENW5IP/aujC8fobEM2pDbs0IGkiVjW/ipPuYAHuXigbNe64aGWF7vIetukuzM3CBw==
|
||||
prettier-plugin-packagejson@^2.5.17:
|
||||
version "2.5.17"
|
||||
resolved "https://registry.yarnpkg.com/prettier-plugin-packagejson/-/prettier-plugin-packagejson-2.5.17.tgz#98df28819bb5071c9330eec31ff029acf538f96e"
|
||||
integrity sha512-1WYvhTix+4EMYZQYSjAxb6+KTCULINuHUTBcxYa2ipoUS9Y2zJVjE3kuZ5I7ZWIFqyK8xpwYIunXqN5eiT7Hew==
|
||||
dependencies:
|
||||
sort-package-json "3.2.1"
|
||||
sort-package-json "3.3.1"
|
||||
synckit "0.11.8"
|
||||
|
||||
prettier@3.5.3:
|
||||
version "3.5.3"
|
||||
resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.5.3.tgz#4fc2ce0d657e7a02e602549f053b239cb7dfe1b5"
|
||||
integrity sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==
|
||||
prettier@3.6.2:
|
||||
version "3.6.2"
|
||||
resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.6.2.tgz#ccda02a1003ebbb2bfda6f83a074978f608b9393"
|
||||
integrity sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==
|
||||
|
||||
proc-log@^2.0.1:
|
||||
version "2.0.1"
|
||||
@@ -2835,13 +2851,6 @@ rimraf@^3.0.2:
|
||||
dependencies:
|
||||
glob "^7.1.3"
|
||||
|
||||
rimraf@^5.0.5:
|
||||
version "5.0.10"
|
||||
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.10.tgz#23b9843d3dc92db71f96e1a2ce92e39fd2a8221c"
|
||||
integrity sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==
|
||||
dependencies:
|
||||
glob "^10.3.7"
|
||||
|
||||
roarr@^2.15.3:
|
||||
version "2.15.4"
|
||||
resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.15.4.tgz#f5fe795b7b838ccfe35dc608e0282b9eba2e7afd"
|
||||
@@ -3022,10 +3031,10 @@ sort-object-keys@^1.1.3:
|
||||
resolved "https://registry.yarnpkg.com/sort-object-keys/-/sort-object-keys-1.1.3.tgz#bff833fe85cab147b34742e45863453c1e190b45"
|
||||
integrity sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==
|
||||
|
||||
sort-package-json@3.2.1:
|
||||
version "3.2.1"
|
||||
resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-3.2.1.tgz#889f3bdf43ceeff5fa4278a7c53ae5b1520d287e"
|
||||
integrity sha512-rTfRdb20vuoAn7LDlEtCqOkYfl2X+Qze6cLbNOzcDpbmKEhJI30tTN44d5shbKJnXsvz24QQhlCm81Bag7EOKg==
|
||||
sort-package-json@3.3.1:
|
||||
version "3.3.1"
|
||||
resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-3.3.1.tgz#c31c0b4cd970b7fde6b1d0197f8b768584e2e65c"
|
||||
integrity sha512-awjhQR2Iy5UN3NuguAK5+RezcEuUg9Ra4O8y2Aj+DlJa7MywyHaipAPf9bu4qqFj0hsYHHoT9sS3aV7Ucu728g==
|
||||
dependencies:
|
||||
detect-indent "^7.0.1"
|
||||
detect-newline "^4.0.1"
|
||||
@@ -3065,6 +3074,15 @@ stat-mode@^1.0.0:
|
||||
resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-1.0.0.tgz#68b55cb61ea639ff57136f36b216a291800d1465"
|
||||
integrity sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==
|
||||
|
||||
"string-width-cjs@npm:string-width@^4.2.0":
|
||||
version "4.2.3"
|
||||
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
|
||||
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
|
||||
dependencies:
|
||||
emoji-regex "^8.0.0"
|
||||
is-fullwidth-code-point "^3.0.0"
|
||||
strip-ansi "^6.0.1"
|
||||
|
||||
string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
|
||||
version "4.2.3"
|
||||
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
|
||||
@@ -3074,6 +3092,15 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
|
||||
is-fullwidth-code-point "^3.0.0"
|
||||
strip-ansi "^6.0.1"
|
||||
|
||||
string-width@^5.0.1, string-width@^5.1.2:
|
||||
version "5.1.2"
|
||||
resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794"
|
||||
integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==
|
||||
dependencies:
|
||||
eastasianwidth "^0.2.0"
|
||||
emoji-regex "^9.2.2"
|
||||
strip-ansi "^7.0.1"
|
||||
|
||||
string_decoder@^1.1.1:
|
||||
version "1.3.0"
|
||||
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
|
||||
@@ -3081,6 +3108,13 @@ string_decoder@^1.1.1:
|
||||
dependencies:
|
||||
safe-buffer "~5.2.0"
|
||||
|
||||
"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
|
||||
version "6.0.1"
|
||||
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
|
||||
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
|
||||
dependencies:
|
||||
ansi-regex "^5.0.1"
|
||||
|
||||
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
|
||||
version "6.0.1"
|
||||
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
|
||||
@@ -3088,6 +3122,13 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1:
|
||||
dependencies:
|
||||
ansi-regex "^5.0.1"
|
||||
|
||||
strip-ansi@^7.0.1:
|
||||
version "7.1.0"
|
||||
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45"
|
||||
integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==
|
||||
dependencies:
|
||||
ansi-regex "^6.0.1"
|
||||
|
||||
strip-eof@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
|
||||
@@ -3143,18 +3184,6 @@ tar@^6.0.5, tar@^6.1.11, tar@^6.1.12, tar@^6.2.1:
|
||||
mkdirp "^1.0.3"
|
||||
yallist "^4.0.0"
|
||||
|
||||
tar@^7.0.1:
|
||||
version "7.4.3"
|
||||
resolved "https://registry.yarnpkg.com/tar/-/tar-7.4.3.tgz#88bbe9286a3fcd900e94592cda7a22b192e80571"
|
||||
integrity sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==
|
||||
dependencies:
|
||||
"@isaacs/fs-minipass" "^4.0.0"
|
||||
chownr "^3.0.0"
|
||||
minipass "^7.1.2"
|
||||
minizlib "^3.0.1"
|
||||
mkdirp "^3.0.1"
|
||||
yallist "^5.0.0"
|
||||
|
||||
temp-file@^3.4.0:
|
||||
version "3.4.0"
|
||||
resolved "https://registry.yarnpkg.com/temp-file/-/temp-file-3.4.0.tgz#766ea28911c683996c248ef1a20eea04d51652c7"
|
||||
@@ -3251,14 +3280,14 @@ typedarray@^0.0.6:
|
||||
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
|
||||
integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==
|
||||
|
||||
typescript-eslint@^8.33.1:
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.33.1.tgz#d2d59c9b24afe1f903a855b02145802e4ae930ff"
|
||||
integrity sha512-AgRnV4sKkWOiZ0Kjbnf5ytTJXMUZQ0qhSVdQtDNYLPLnjsATEYhaO94GlRQwi4t4gO8FfjM6NnikHeKjUm8D7A==
|
||||
typescript-eslint@^8.35.1:
|
||||
version "8.35.1"
|
||||
resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.35.1.tgz#4ddeda5c5777a7bd86516280d8099ada06055f2f"
|
||||
integrity sha512-xslJjFzhOmHYQzSB/QTeASAHbjmxOGEP6Coh93TXmUBFQoJ1VU35UHIDmG06Jd6taf3wqqC1ntBnCMeymy5Ovw==
|
||||
dependencies:
|
||||
"@typescript-eslint/eslint-plugin" "8.33.1"
|
||||
"@typescript-eslint/parser" "8.33.1"
|
||||
"@typescript-eslint/utils" "8.33.1"
|
||||
"@typescript-eslint/eslint-plugin" "8.35.1"
|
||||
"@typescript-eslint/parser" "8.35.1"
|
||||
"@typescript-eslint/utils" "8.35.1"
|
||||
|
||||
typescript@^5.4.3, typescript@^5.8.3:
|
||||
version "5.8.3"
|
||||
@@ -3356,6 +3385,15 @@ word-wrap@^1.2.5:
|
||||
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34"
|
||||
integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==
|
||||
|
||||
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
|
||||
version "7.0.0"
|
||||
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
|
||||
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
|
||||
dependencies:
|
||||
ansi-styles "^4.0.0"
|
||||
string-width "^4.1.0"
|
||||
strip-ansi "^6.0.0"
|
||||
|
||||
wrap-ansi@^7.0.0:
|
||||
version "7.0.0"
|
||||
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
|
||||
@@ -3365,6 +3403,15 @@ wrap-ansi@^7.0.0:
|
||||
string-width "^4.1.0"
|
||||
strip-ansi "^6.0.0"
|
||||
|
||||
wrap-ansi@^8.1.0:
|
||||
version "8.1.0"
|
||||
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"
|
||||
integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==
|
||||
dependencies:
|
||||
ansi-styles "^6.1.0"
|
||||
string-width "^5.0.1"
|
||||
strip-ansi "^7.0.1"
|
||||
|
||||
wrappy@1:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
|
||||
@@ -3385,11 +3432,6 @@ yallist@^4.0.0:
|
||||
resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
|
||||
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
|
||||
|
||||
yallist@^5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.yarnpkg.com/yallist/-/yallist-5.0.0.tgz#00e2de443639ed0d78fd87de0d27469fbcffb533"
|
||||
integrity sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==
|
||||
|
||||
yargs-parser@^21.1.1:
|
||||
version "21.1.1"
|
||||
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35"
|
||||
@@ -3421,7 +3463,7 @@ yocto-queue@^0.1.0:
|
||||
resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
|
||||
integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
|
||||
|
||||
zod@^3.25.51:
|
||||
version "3.25.51"
|
||||
resolved "https://registry.yarnpkg.com/zod/-/zod-3.25.51.tgz#aa2cf648e54f6f060f139cf77b694819f63c9f3a"
|
||||
integrity sha512-TQSnBldh+XSGL+opiSIq0575wvDPqu09AqWe1F7JhUMKY+M91/aGlK4MhpVNO7MgYfHcVCB1ffwAUTJzllKJqg==
|
||||
zod@^3.25.67:
|
||||
version "3.25.67"
|
||||
resolved "https://registry.yarnpkg.com/zod/-/zod-3.25.67.tgz#62987e4078e2ab0f63b491ef0c4f33df24236da8"
|
||||
integrity sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==
|
||||
|
||||
@@ -8,13 +8,6 @@ export default defineConfig({
|
||||
head: [["link", { rel: "icon", type: "image/png", href: "/favicon.png" }]],
|
||||
cleanUrls: true,
|
||||
ignoreDeadLinks: "localhostLinks",
|
||||
vite: {
|
||||
build: {
|
||||
rollupOptions: {
|
||||
external: ["client-museum-s3.png"], // Added to handle static asset import
|
||||
},
|
||||
},
|
||||
},
|
||||
themeConfig: {
|
||||
// We use the default theme (with some CSS color overrides). This
|
||||
// themeConfig block can be used to further customize the default theme.
|
||||
@@ -33,6 +26,9 @@ export default defineConfig({
|
||||
},
|
||||
},
|
||||
sidebar: sidebar,
|
||||
outline: {
|
||||
level: [2, 3],
|
||||
},
|
||||
socialLinks: [
|
||||
{ icon: "github", link: "https://github.com/ente-io/ente/" },
|
||||
{ icon: "twitter", link: "https://twitter.com/enteio" },
|
||||
|
||||
@@ -2,27 +2,6 @@
|
||||
// appropriate place here.
|
||||
|
||||
export const sidebar = [
|
||||
{
|
||||
text: "Overview",
|
||||
items: [
|
||||
{
|
||||
text: "Introduction",
|
||||
link: "/overview/",
|
||||
},
|
||||
{
|
||||
text: "Community",
|
||||
link: "/overview/community",
|
||||
},
|
||||
{
|
||||
text: "Contributing",
|
||||
link: "/overview/contribute",
|
||||
},
|
||||
{
|
||||
text: "Help",
|
||||
link: "/overview/help",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Photos",
|
||||
items: [
|
||||
@@ -73,6 +52,10 @@ export const sidebar = [
|
||||
link: "/photos/features/machine-learning",
|
||||
},
|
||||
{ text: "Map", link: "/photos/features/map" },
|
||||
{
|
||||
text: "Notifications",
|
||||
link: "/photos/features/notifications",
|
||||
},
|
||||
{
|
||||
text: "Passkeys",
|
||||
link: "/photos/features/passkeys",
|
||||
@@ -224,22 +207,22 @@ export const sidebar = [
|
||||
text: "Migration",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{ text: "Introduction", link: "/auth/migration-guides/" },
|
||||
{ text: "Introduction", link: "/auth/migration/" },
|
||||
{
|
||||
text: "From Authy",
|
||||
link: "/auth/migration-guides/authy/",
|
||||
link: "/auth/migration/authy/",
|
||||
},
|
||||
{
|
||||
text: "From Steam",
|
||||
link: "/auth/migration-guides/steam/",
|
||||
link: "/auth/migration/steam/",
|
||||
},
|
||||
{
|
||||
text: "From others",
|
||||
link: "/auth/migration-guides/import",
|
||||
link: "/auth/migration/import",
|
||||
},
|
||||
{
|
||||
text: "Exporting your data",
|
||||
link: "/auth/migration-guides/export",
|
||||
link: "/auth/migration/export",
|
||||
},
|
||||
],
|
||||
},
|
||||
@@ -256,50 +239,98 @@ export const sidebar = [
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Self hosting",
|
||||
text: "Self-hosting",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{ text: "Getting started", link: "/self-hosting/" },
|
||||
{
|
||||
text: "Connecting to custom server",
|
||||
link: "/self-hosting/guides/custom-server/",
|
||||
text: "Quickstart",
|
||||
link: "/self-hosting/",
|
||||
},
|
||||
{
|
||||
text: "Creating accounts",
|
||||
link: "/self-hosting/creating-accounts",
|
||||
},
|
||||
{
|
||||
text: "Configuring your server",
|
||||
link: "/self-hosting/museum",
|
||||
},
|
||||
{
|
||||
text: "Configuring S3",
|
||||
link: "/self-hosting/guides/configuring-s3",
|
||||
},
|
||||
{
|
||||
text: "Reverse proxy",
|
||||
link: "/self-hosting/reverse-proxy",
|
||||
},
|
||||
{
|
||||
text: "Guides",
|
||||
text: "Installation",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{ text: "Introduction", link: "/self-hosting/guides/" },
|
||||
{
|
||||
text: "Administering your server",
|
||||
link: "/self-hosting/guides/admin",
|
||||
text: "Requirements",
|
||||
link: "/self-hosting/installation/requirements",
|
||||
},
|
||||
{
|
||||
text: "Configuring CLI for your instance",
|
||||
link: "/self-hosting/guides/selfhost-cli",
|
||||
text: "Quickstart script (Recommended)",
|
||||
link: "/self-hosting/installation/quickstart",
|
||||
},
|
||||
{
|
||||
text: "Running Ente from source",
|
||||
link: "/self-hosting/guides/from-source",
|
||||
text: "Docker Compose",
|
||||
link: "/self-hosting/installation/compose",
|
||||
},
|
||||
{
|
||||
text: "Running Ente without Docker",
|
||||
link: "/self-hosting/guides/standalone-ente",
|
||||
text: "Manual setup (without Docker)",
|
||||
link: "/self-hosting/installation/manual",
|
||||
},
|
||||
{
|
||||
text: "Environment variables and defaults",
|
||||
link: "/self-hosting/installation/env-var",
|
||||
},
|
||||
{
|
||||
text: "Configuration",
|
||||
link: "/self-hosting/installation/config",
|
||||
},
|
||||
{
|
||||
text: "Post-installation steps",
|
||||
link: "/self-hosting/installation/post-install/",
|
||||
},
|
||||
{
|
||||
text: "Upgrade",
|
||||
link: "/self-hosting/installation/upgrade",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Administration",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "User management",
|
||||
link: "/self-hosting/administration/users",
|
||||
},
|
||||
{
|
||||
text: "Reverse proxy",
|
||||
link: "/self-hosting/administration/reverse-proxy",
|
||||
},
|
||||
{
|
||||
text: "Object storage",
|
||||
link: "/self-hosting/administration/object-storage",
|
||||
},
|
||||
{
|
||||
text: "Ente CLI",
|
||||
link: "/self-hosting/administration/cli",
|
||||
},
|
||||
{
|
||||
text: "Backup",
|
||||
link: "/self-hosting/administration/backup",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Development",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "Building mobile apps",
|
||||
link: "/self-hosting/development/mobile-build",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Community Guides",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "Ente via Tailscale",
|
||||
link: "/self-hosting/guides/tailscale",
|
||||
},
|
||||
{
|
||||
text: "Running Ente using systemd",
|
||||
link: "/self-hosting/guides/systemd",
|
||||
},
|
||||
],
|
||||
},
|
||||
@@ -311,10 +342,6 @@ export const sidebar = [
|
||||
text: "General",
|
||||
link: "/self-hosting/troubleshooting/misc",
|
||||
},
|
||||
{
|
||||
text: "Bucket CORS",
|
||||
link: "/self-hosting/troubleshooting/bucket-cors",
|
||||
},
|
||||
{
|
||||
text: "Uploads",
|
||||
link: "/self-hosting/troubleshooting/uploads",
|
||||
@@ -323,47 +350,6 @@ export const sidebar = [
|
||||
text: "Docker / quickstart",
|
||||
link: "/self-hosting/troubleshooting/docker",
|
||||
},
|
||||
{
|
||||
text: "Ente CLI secrets",
|
||||
link: "/self-hosting/troubleshooting/keyring",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Community Guides",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "Ente via Tailscale",
|
||||
link: "/self-hosting/guides/Tailscale",
|
||||
},
|
||||
{
|
||||
text: "Ente with External S3",
|
||||
link: "/self-hosting/guides/external-s3",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "FAQ",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{ text: "General", link: "/self-hosting/faq/" },
|
||||
{
|
||||
text: "Verification code",
|
||||
link: "/self-hosting/faq/otp",
|
||||
},
|
||||
{
|
||||
text: "Shared albums",
|
||||
link: "/self-hosting/faq/sharing",
|
||||
},
|
||||
{
|
||||
text: "Backups",
|
||||
link: "/self-hosting/faq/backup",
|
||||
},
|
||||
{
|
||||
text: "Environment variables",
|
||||
link: "/self-hosting/faq/environment",
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
|
||||
@@ -12,7 +12,7 @@ This page outlines the key features available in Ente Auth.
|
||||
Ente Auth supports the icon pack provided by
|
||||
[simple-icons](https://github.com/simple-icons/simple-icons). If an icon you
|
||||
need is missing, please refer to the
|
||||
[docs/adding-icons](https://github.com/ente-io/ente/blob/main/auth/docs/adding-icons.md)
|
||||
[docs/adding-icons](https://github.com/ente-io/ente/blob/main/mobile/apps/auth/docs/adding-icons.md)
|
||||
guide for instructions on how to contribute.
|
||||
|
||||
### Search
|
||||
@@ -105,8 +105,7 @@ Ente Auth offers various import and export options for your codes.
|
||||
automatically via the CLI.
|
||||
- **Import:** Import codes from various other authentication apps.
|
||||
|
||||
For detailed instructions, refer to the
|
||||
[migration guides](../migration-guides/).
|
||||
For detailed instructions, refer to the [migration guides](../migration/).
|
||||
|
||||
### Deduplicate codes
|
||||
|
||||
@@ -136,4 +135,4 @@ Easily add or share entries using QR codes:
|
||||
right-click (desktop) a code and select "QR". This allows you to easily share
|
||||
the complete entry (including the secret) with others by letting them scan the
|
||||
displayed QR code. This can also be used to easily add the same entry to
|
||||
another authenticatior app or service.
|
||||
another authenticator app or service.
|
||||
|
||||
@@ -10,4 +10,4 @@ Ende-zu-Ende-verschlüsselte Authenticator-App für jedermann. Wir sind froh, da
|
||||
du hier bist!
|
||||
|
||||
**Please note that this German translation is currently just a placeholder.**
|
||||
Know German? [Help us fill this in!](/overview/contribute).
|
||||
Know German? [Help us fill this in!](/#contribute).
|
||||
|
||||
@@ -1,15 +1,82 @@
|
||||
---
|
||||
title: Home
|
||||
description: >
|
||||
Introduction to Ente: Products, Community and Support
|
||||
---
|
||||
|
||||
# Welcome!
|
||||
|
||||
This site contains documentation and help for Ente Photos and Ente Auth. It
|
||||
describes various features, and also offers various troubleshooting suggestions.
|
||||
{width=50% style="margin: 0 auto"}
|
||||
|
||||
Use the **sidebar** menu to navigate to information about the product (Photos or
|
||||
Auth) you'd like to know more about. Or use the **search** at the top to try and
|
||||
jump directly to page that might contain the information you need.
|
||||
## Introduction
|
||||
|
||||
To know more about Ente, see [overview](/overview/) or visit our website
|
||||
[ente.io](https://ente.io).
|
||||
Ente (pronounced en-_tay_) is a end-to-end encrypted platform for privately,
|
||||
reliably, and securely storing your data on the cloud, over which 2 applications
|
||||
have been developed and made available for mobile, web and desktop, namely:
|
||||
|
||||
- **Ente Photos** - An alternative to Google Photos and Apple Photos.
|
||||
- **Ente Auth** - A free 2FA alternative to Authy.
|
||||
|
||||
## History
|
||||
|
||||
Ente was founded by Vishnu Mohandas (Ente's CEO) in response to privacy concerns
|
||||
with major tech companies. The underlying motivation was the understanding that
|
||||
big tech had no incentive to fix their act, but with end-to-end encrypted cross
|
||||
platform apps, there was a way for people to take back control over their own
|
||||
data without sacrificing on features.
|
||||
|
||||
### Origin of the name
|
||||
|
||||
In Malayalam, Vishnu's native language, "ente" means "mine", thus "Ente Photos"
|
||||
literally means "my photos".
|
||||
|
||||
But one day, he discovered that "ente" means "duck" in German. This unexpected
|
||||
connection sealed the deal after looking for alternative names and led to the
|
||||
adoption of ["Ducky"](https://ente.io/blog/ducky/), representing the playfulness
|
||||
and friendly nature of the community and team.
|
||||
|
||||
## Getting Started
|
||||
|
||||
We recommend reading the documentation for [Ente Photos](/photos/) or
|
||||
[Ente Auth](/auth/) to get started with installation on the desired platform,
|
||||
explore available features and usage.
|
||||
|
||||
If you are looking to self-host Ente, we recommend you to read the
|
||||
[official documentation](/self-hosting/) for updated information on getting
|
||||
started, installation, administration and maintenance.
|
||||
|
||||
## Contributing
|
||||
|
||||
There are many ways to support Ente and you don't have to be a programmer for
|
||||
that. You can spread the word, give feedback, report bugs, help us with
|
||||
translations, contribute documentation and community guides and more.
|
||||
|
||||
To suggest new features and/or offer your perspective on how we should design
|
||||
(planned and upcoming features), use our
|
||||
[GitHub discussions](https://github.com/ente-io/ente/discussions)
|
||||
|
||||
You can find our contribution guidelines
|
||||
[here](https://github.com/ente-io/ente/blob/main/CONTRIBUTING.md).
|
||||
|
||||
You can always engage with our community and team to hang out, answer queries
|
||||
and stay updated:
|
||||
|
||||
- Chat: [Discord](https://ente.io/discord)
|
||||
- Discussions: [GitHub](https://github.com/ente-io/ente/discussions)
|
||||
- Socials:
|
||||
- Twitter: [enteio](https://twitter.com/enteio)
|
||||
- Mastodon: [@ente@fosstodon.org](https://fosstodon.org/@ente)
|
||||
- Bluesky: [ente.io](https://bsky.app/profile/ente.io)
|
||||
- Instagram: [ente.app](https://www.instagram.com/ente.app)
|
||||
- Website:
|
||||
- [Blog](https://ente.io/blog)
|
||||
- [RSS](https://ente.io/blog/rss.xml)
|
||||
|
||||
## Getting Help
|
||||
|
||||
If you encounter any issues with any of the products that's not answered by our
|
||||
documentation, please reach out to our team by sending an email to
|
||||
[support@ente.io](mailto:support@ente.io).
|
||||
|
||||
For community support, please post your queries on our
|
||||
[Discord](https://discord.gg/z2YVKkycX3) server.
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
---
|
||||
title: Community
|
||||
description: >
|
||||
Information regarding Ente's community channels
|
||||
---
|
||||
|
||||
# Community
|
||||
|
||||
## Blog
|
||||
|
||||
To stay up to date with new product launches, and behind the scenes details of
|
||||
how we're building Ente, you can read our [blog](https://ente.io/blog) (or
|
||||
subscribe to it via [RSS](https://ente.io/blog/rss.xml))
|
||||
|
||||
## Community
|
||||
|
||||
Or if you'd just like to hang out, join our
|
||||
[Discord](https://discord.gg/z2YVKkycX3), follow us on
|
||||
[Twitter](https://twitter.com/enteio) or give us a shout out on
|
||||
[Mastodon](https://mstdn.social/@ente)
|
||||
@@ -1,23 +0,0 @@
|
||||
---
|
||||
title: Contribute
|
||||
description: Details about how to contribute to Ente
|
||||
---
|
||||
|
||||
# Contributing
|
||||
|
||||
## Suggest a feature
|
||||
|
||||
To suggest new features and/or offer your perspective on how we should design
|
||||
(planned and upcoming features), use our
|
||||
[GitHub discussions](https://github.com/ente-io/ente/discussions)
|
||||
|
||||
## Documentation
|
||||
|
||||
To contribute to these docs, you can use the "Edit this page" button at the
|
||||
bottom of each page. This will allow you to directly edit the markdown file that
|
||||
is used to generate this documentation and open a quick pull request directly
|
||||
from GitHub's UI.
|
||||
|
||||
If you're more comfortable in contributing with your text editor, see the
|
||||
`docs/` folder of our GitHub repository,
|
||||
[github.com/ente-io/ente](https://github.com/ente-io/ente).
|
||||
@@ -1,13 +0,0 @@
|
||||
---
|
||||
title: Help
|
||||
description: Get help from Ente via customer support and community
|
||||
---
|
||||
|
||||
# Help
|
||||
|
||||
If you encounter any issues with any of the products that's not answered by our
|
||||
[documentation](/), please reach out to our Customer Support by sending an email
|
||||
to [support@ente.io](mailto:support@ente.io)
|
||||
|
||||
For community support, please post your queries on
|
||||
[Discord](https://discord.gg/z2YVKkycX3)
|
||||
@@ -1,50 +0,0 @@
|
||||
---
|
||||
title: Introduction
|
||||
description: >
|
||||
An overview of Ente: the company, and the people behind it, and the products
|
||||
that we make.
|
||||
---
|
||||
|
||||
# About
|
||||
|
||||
Ente (pronounced en-_tay_. Like ca<i>fe</i>) is a end-to-end encrypted platform
|
||||
for privately, reliably, and securely storing your data on the cloud. On top of
|
||||
this platform, Ente offers two products:
|
||||
|
||||
- **Ente Photos** - An alternative to Google Photos and Apple Photos
|
||||
|
||||
- **Ente Auth** - A free 2FA alternative to Authy
|
||||
|
||||
Both these apps are available for all desktop (Linux, Mac, Windows) and mobile
|
||||
(Android and iOS) platforms. They also work directly in your web browser without
|
||||
you needing to install anything.
|
||||
|
||||
More products are in the pipeline.
|
||||
|
||||
## History
|
||||
|
||||
Ente was the founded by Vishnu Mohandas (he's also Ente's CEO) in response to
|
||||
privacy concerns with major tech companies. The underlying motivation was the
|
||||
understanding that big tech had no incentive to fix their act, but with
|
||||
end-to-end encrypted cross platform apps, there was a way for people to take
|
||||
back control over their own data without sacrificing on features.
|
||||
|
||||
### What does Ente mean?
|
||||
|
||||
In Malayalam, Vishnu's native language, "ente" means "mine". Thus "Ente Photos"
|
||||
has the literal meaning "my photos".
|
||||
|
||||
This was a good name, but still Vishnu looked around for better ones. But one
|
||||
day, he discovered that "ente" means "duck" in German. This unexpected
|
||||
connection sealed the deal. We should ask him why he likes ducks so much, but
|
||||
apparently he does, so this dual meaning ("mine" / "duck") led him to finalize
|
||||
the name, and also led to the adoption of "Ducky", Ente's mascot:
|
||||
|
||||
<div align="center">
|
||||
|
||||
{width=200px}
|
||||
|
||||
</div>
|
||||
|
||||
For the full origin story of Ducky you can check out
|
||||
[this blog post](https://ente.io/blog/ducky/).
|
||||
@@ -47,8 +47,20 @@ device.
|
||||
The indexes are synced across all your devices automatically using the same
|
||||
end-to-end encrypted security that we use for syncing your photos.
|
||||
|
||||
Note that the desktop app does not currently support modifying the face
|
||||
groupings, that is only supported by the mobile app.
|
||||
---
|
||||
|
||||
#### Local indexing on mobile
|
||||
|
||||
In general the machine learning is optimized to work well on most mobile device.
|
||||
However, devices with low RAM (4-6GB) and large photo libraries might struggle
|
||||
to complete the indexing without affecting performance of the app. In such case,
|
||||
you might want to disable local indexing and let the desktop run it instead.
|
||||
|
||||
You can disable local indexing from the settings, under
|
||||
`General > Advanced > Machine learning > Configuration`. This way, you can
|
||||
continue to use the ML features without your phone performance taking any hit.
|
||||
|
||||
---
|
||||
|
||||
For more information on how to use Machine Learning for face recognition please
|
||||
check out [the FAQ](../faq/face-recognition).
|
||||
|
||||
33
docs/docs/photos/features/notifications.md
Normal file
@@ -0,0 +1,33 @@
|
||||
---
|
||||
title: Notifications
|
||||
description: Details about notifications in Ente
|
||||
---
|
||||
|
||||
# Notifications
|
||||
|
||||
The Ente app can send notifications to notify you of an update, or just to
|
||||
remind you of some sweet or helpful memory at the right time.
|
||||
|
||||
## New shared photos
|
||||
|
||||
Receive notifications when someone adds a photo to a shared album that you're a
|
||||
part of.
|
||||
|
||||
## "On this day" memories
|
||||
|
||||
Receive reminders about memories from this day in previous years. These
|
||||
reminders will only be shown if there are enough photos taken across previous
|
||||
years of the specific day.
|
||||
|
||||
## Birthday notifications
|
||||
|
||||
Receive reminders when it's someone's birthday. Tapping on the notification will
|
||||
take you to photos of the birthday person. This requires you to first add a
|
||||
birthday to a person, and will only be shown if there are enough photos of that
|
||||
person.
|
||||
|
||||
## Notification permission
|
||||
|
||||
By default all notification categories are enabled if you give notification
|
||||
permission. You can disable all of the above notification categories from
|
||||
`Settings > Notifications`. Notifications currently only work on mobile.
|
||||
@@ -66,5 +66,4 @@ If you run into any issues during your data export, please reach out to
|
||||
|
||||
Note that we also provide a
|
||||
[CLI tool](https://github.com/ente-io/ente/tree/main/cli#export) to export your
|
||||
data. You can find more information about the export in the
|
||||
[export FAQ](/photos/faq/export).
|
||||
data.
|
||||
|
||||
BIN
docs/docs/public/developer-settings-endpoint.png
Normal file
|
After Width: | Height: | Size: 122 KiB |
BIN
docs/docs/public/developer-settings.png
Normal file
|
After Width: | Height: | Size: 154 KiB |
|
Before Width: | Height: | Size: 87 KiB After Width: | Height: | Size: 87 KiB |
BIN
docs/docs/public/onboarding.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
docs/docs/public/sign-up.png
Normal file
|
After Width: | Height: | Size: 29 KiB |
47
docs/docs/self-hosting/administration/backup.md
Normal file
@@ -0,0 +1,47 @@
|
||||
---
|
||||
title: Backups - Self-hosting
|
||||
description: General introduction to backing up your self hosted Ente instance
|
||||
---
|
||||
|
||||
# Backing up your Ente instance
|
||||
|
||||
A functional Ente backend needs three things:
|
||||
|
||||
1. Museum (the API server)
|
||||
2. Postgres (the database)
|
||||
3. Object storage (any S3-compatible object storage)
|
||||
|
||||
Thus, when thinking about backups:
|
||||
|
||||
1. For Museum, you should backup your `museum.yaml`, `credentials.yaml` or any
|
||||
other custom configuration that you created.
|
||||
2. The entire data volume needs to be backed up for the database and object
|
||||
storage.
|
||||
|
||||
A common oversight is taking a lot of care for backing up the object storage,
|
||||
even going as far as enabling replication and backing up the the multiple object
|
||||
storage volumes, but not applying the same care to the database backup.
|
||||
|
||||
While the actual encrypted photos are indeed stored in the object storage,
|
||||
**this encrypted data will not be usable without the database** since the
|
||||
database contains information like a file specific encryption key.
|
||||
|
||||
Viewed differently, to decrypt your data you need three pieces of information:
|
||||
|
||||
1. The encrypted file data itself (which comes from the object storage backup).
|
||||
2. The encrypted file and collection specific encryption keys (which come from
|
||||
the database backup).
|
||||
3. The master key (which comes from your password).
|
||||
|
||||
If you're starting out with self hosting, we recommend keeping plaintext backup
|
||||
of your photos.
|
||||
|
||||
[You can use the CLI or the desktop app to automate this](/photos/faq/export).
|
||||
|
||||
Once you get more comfortable with the various parts, you can try backing up
|
||||
your instance.
|
||||
|
||||
If you rely on your instance backup, ensure that you do full restoration to
|
||||
verify that you are able to access your data.
|
||||
|
||||
As the industry saying goes, a backup without a restore is no backup at all.
|
||||
83
docs/docs/self-hosting/administration/cli.md
Normal file
@@ -0,0 +1,83 @@
|
||||
---
|
||||
title: Ente CLI for Self-hosted Instance - Self-hosting
|
||||
description: Guide to configuring Ente CLI for Self Hosted Instance
|
||||
---
|
||||
|
||||
# Ente CLI for self-hosted instance
|
||||
|
||||
If you are self-hosting, you can configure Ente CLI to export data & perform
|
||||
basic administrative actions.
|
||||
|
||||
## Step 1: Configure endpoint
|
||||
|
||||
To do this, first configure the CLI to use your server's endpoint.
|
||||
|
||||
Define `config.yaml` and place it in `~/.ente/` or directory specified by
|
||||
`ENTE_CLI_CONFIG_DIR` or directory where Ente CLI is present.
|
||||
|
||||
```yaml
|
||||
# Set the API endpoint to your domain where Museum is being served.
|
||||
endpoint:
|
||||
api: http://localhost:8080
|
||||
```
|
||||
|
||||
## Step 2: Whitelist admins
|
||||
|
||||
You can whitelist administrator users by following this
|
||||
[guide](/self-hosting/administration/users#whitelist-admins).
|
||||
|
||||
## Step 3: Add an account
|
||||
|
||||
::: info You can not create new accounts using Ente CLI.
|
||||
|
||||
You can only log in to your existing accounts.
|
||||
|
||||
To create a new account, use Ente Photos (or Ente Auth) web application, desktop
|
||||
or mobile.
|
||||
|
||||
:::
|
||||
|
||||
You can add your existing account using Ente CLI.
|
||||
|
||||
```shell
|
||||
ente account add
|
||||
```
|
||||
|
||||
This should prompt you for authentication details and export directory. Your
|
||||
account should be added after successful authentication.
|
||||
|
||||
It can be used for exporting data (for plain-text backup), managing Ente Auth
|
||||
and performing administrative actions.
|
||||
|
||||
## Step 4: Increase storage and account validity
|
||||
|
||||
You can use `ente admin update-subscription` to increase storage quota and
|
||||
account validity (duration).
|
||||
|
||||
For infinite storage and validity, use the following command:
|
||||
|
||||
```shell
|
||||
ente admin update-subscription -a <admin-user-mail> -u <user-email-to-update> --no-limit
|
||||
|
||||
# Set a limit
|
||||
ente admin update-subscription -a <admin-user-mail> -u <user-email-to-update> --no-limit False
|
||||
```
|
||||
|
||||
::: info The users must be registered on the server with same e-mail address.
|
||||
|
||||
If the commands are failing, ensure:
|
||||
|
||||
1. `<admin-user-mail>` is whitelisted as administrator user in `museum.yaml`.
|
||||
For more information, check this
|
||||
[guide](/self-hosting/administration/users#whitelist-admins).
|
||||
2. `<user-email-to-update>` is a registered user with completed verification.
|
||||
|
||||
:::
|
||||
|
||||
For more information, check out the documentation for setting
|
||||
[storage and account validity](https://github.com/ente-io/ente/blob/main/cli/docs/generated/ente_admin_update-subscription.md)
|
||||
using the CLI.
|
||||
|
||||
## References
|
||||
|
||||
1. [Ente CLI Documentation](https://github.com/ente-io/ente/blob/main/cli/docs/generated)
|
||||
139
docs/docs/self-hosting/administration/object-storage.md
Normal file
@@ -0,0 +1,139 @@
|
||||
---
|
||||
title: Configuring Object Storage - Self-hosting
|
||||
description:
|
||||
Configure Object Storage for storing files along with some troubleshooting
|
||||
tips
|
||||
---
|
||||
|
||||
# Configuring Object Storage
|
||||
|
||||
Ente relies on [S3-compatible](https://docs.aws.amazon.com/s3/) cloud storage
|
||||
for storing files (photos, thumbnails and videos) as objects.
|
||||
|
||||
Ente ships MinIO as S3-compatible storage by default in quickstart and Docker
|
||||
Compose for quick testing.
|
||||
|
||||
This document outlines configuration of S3 buckets and enabling replication for
|
||||
further usage.
|
||||
|
||||
## Museum
|
||||
|
||||
The S3-compatible buckets have to be configured in `museum.yaml` file.
|
||||
|
||||
### General Configuration
|
||||
|
||||
Some of the common configuration that can be done at top-level are:
|
||||
|
||||
1. **SSL Configuration:** If you need to configure SSL (i. e., the buckets are
|
||||
accessible via HTTPS), you'll need to set `s3.are_local_buckets` to `false`.
|
||||
2. **Path-style URLs:** Disabling `s3.are_local_buckets` also switches to the
|
||||
subdomain-style URLs for the buckets. However, some S3 providers such as
|
||||
MinIO do not support this.
|
||||
|
||||
Set `s3.use_path_style_urls` to `true` for such cases.
|
||||
|
||||
### Replication
|
||||
|
||||
> [!IMPORTANT]
|
||||
>
|
||||
> Replication works only if all 3 storage buckets are configured (2 hot and 1
|
||||
> cold storage).
|
||||
>
|
||||
> For more information, check
|
||||
> [this discussion](https://github.com/ente-io/ente/discussions/3167#discussioncomment-10585970)
|
||||
> and our article on ensuring [reliability](https://ente.io/reliability/).
|
||||
|
||||
Replication is disabled by default in self-hosted instance. Only the first
|
||||
bucket (`b2-eu-cen`) is used.
|
||||
|
||||
Only the names are specifically fixed, you can put any other keys in
|
||||
configuration body.
|
||||
|
||||
Use the `s3.hot_storage.primary` option if you'd like to set one of the other
|
||||
pre-defined buckets as the primary bucket.
|
||||
|
||||
### Bucket configuration
|
||||
|
||||
The keys `b2-eu-cen` (primary storage), `wasabi-eu-central-2-v3` (secondary
|
||||
storage) and `scw-eu-fr-v3` (cold storage) are hardcoded, however, the keys and
|
||||
secret can be anything.
|
||||
|
||||
It has no relation to Backblaze, Wasabi or Scaleway.
|
||||
|
||||
Each bucket's endpoint, region, key and secret should be configured accordingly
|
||||
if using an external bucket.
|
||||
|
||||
Additionally, you can enable SSL and path-style URL for specific buckets, which
|
||||
provides flexibility for storage. If this is not configured, top level
|
||||
configuration (`s3.are_local_buckets` and `s3.use_path_style_urls`) is used.
|
||||
|
||||
A sample configuration for `b2-eu-cen` is provided, which can be used for other
|
||||
2 buckets as well:
|
||||
|
||||
```yaml
|
||||
b2-eu-cen:
|
||||
are_local_buckets: true
|
||||
use_path_style_urls: true
|
||||
key: <key>
|
||||
secret: <secret>
|
||||
endpoint: localhost:3200
|
||||
region: eu-central-2
|
||||
bucket: b2-eu-cen
|
||||
```
|
||||
|
||||
## CORS (Cross-Origin Resource Sharing)
|
||||
|
||||
If you cannot upload a photo due to CORS error, you need to fix the CORS
|
||||
configuration of your bucket.
|
||||
|
||||
Use the content provided below for creating a `cors.json` file:
|
||||
|
||||
```json
|
||||
{
|
||||
"CORSRules": [
|
||||
{
|
||||
"AllowedOrigins": ["*"],
|
||||
"AllowedHeaders": ["*"],
|
||||
"AllowedMethods": ["GET", "HEAD", "POST", "PUT", "DELETE"],
|
||||
"MaxAgeSeconds": 3000,
|
||||
"ExposeHeaders": ["Etag"]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
You may have to change the `AllowedOrigins` to allow only certain origins (your
|
||||
Ente web apps and Museum) for security.
|
||||
|
||||
Assuming you have AWS CLI on your system and that you have configured it with
|
||||
your access key and secret, you can execute the below command to set bucket
|
||||
CORS. Make sure to enter the right path for the `cors.json` file.
|
||||
|
||||
```shell
|
||||
aws s3api put-bucket-cors --bucket YOUR_S3_BUCKET --cors-configuration /path/to/cors.json
|
||||
```
|
||||
|
||||
### MinIO
|
||||
|
||||
Assuming you have configured an alias for MinIO account using the command:
|
||||
|
||||
```shell
|
||||
mc alias set storage-account-alias minio-endpoint minio-key minio-secret
|
||||
```
|
||||
|
||||
where,
|
||||
|
||||
1. `storage-account-alias` is a valid storage account alias name
|
||||
2. `minio-endpoint` is the endpoint where MinIO is being served without the
|
||||
protocol (http or https). Example: `localhost:3200`
|
||||
3. `minio-key` is the MinIO username defined in `MINIO_ROOT_USER`
|
||||
4. `minio-secret` is the MinIO password defined in `MINIO_PASSWORD`
|
||||
|
||||
To set the `AllowedOrigins` Header, you can use the following command:.
|
||||
|
||||
```shell
|
||||
mc admin config set storage-account-alias api cors_allow_origin="*"
|
||||
```
|
||||
|
||||
You can create also `.csv` file and dump the list of origins you would like to
|
||||
allow and replace the `*` with path to the CSV file.
|
||||
101
docs/docs/self-hosting/administration/reverse-proxy.md
Normal file
@@ -0,0 +1,101 @@
|
||||
---
|
||||
Title: Configuring Reverse Proxy - Self-hosting
|
||||
Description: Configuring reverse proxy for Museum and other services
|
||||
---
|
||||
|
||||
# Reverse proxy
|
||||
|
||||
Reverse proxy helps in making application services accessible via the Internet
|
||||
without exposing multiple ports for various services.
|
||||
|
||||
It also allows configuration of HTTPS through SSL certificate management.
|
||||
|
||||
We highly recommend using HTTPS for Museum (Ente's server). For security
|
||||
reasons, Museum will not accept incoming HTTP traffic.
|
||||
|
||||
## Pre-requisites
|
||||
|
||||
1. **Reverse Proxy:** We recommend using Caddy for simplicity of configuration
|
||||
and automatic certificate generation and management, although you can use
|
||||
other alternatives such as NGINX, Traefik, etc.
|
||||
|
||||
Install Caddy using the following command on Debian/Ubuntu-based systems:
|
||||
|
||||
```shell
|
||||
sudo apt install caddy
|
||||
```
|
||||
|
||||
Start the service and enable it to start upon system boot.
|
||||
|
||||
```shell
|
||||
sudo systemctl start caddy
|
||||
sudo systemctl enable caddy
|
||||
```
|
||||
|
||||
## Step 1: Configure A or AAAA records
|
||||
|
||||
Set up the appropriate records for the endpoints in your DNS management
|
||||
dashboard (usually associated with your domain registrar).
|
||||
|
||||
`A` or `AAAA` records pointing to your server's IP address are sufficient.
|
||||
|
||||
DNS propagation can take a few minutes to take effect.
|
||||
|
||||

|
||||
|
||||
## Step 2: Configure reverse proxy
|
||||
|
||||
After installing Caddy, `Caddyfile` is created at `/etc/caddy/`. Edit
|
||||
`/etc/caddy/Caddyfile` to configure reverse proxies.
|
||||
|
||||
You can edit the minimal configuration provided below for your own needs.
|
||||
|
||||
> yourdomain.tld is an example. Replace it with your own domain.
|
||||
|
||||
```groovy
|
||||
# For Museum
|
||||
api.ente.yourdomain.tld {
|
||||
reverse_proxy http://localhost:8080
|
||||
}
|
||||
|
||||
# For Ente Photos web app
|
||||
web.ente.yourdomain.tld {
|
||||
reverse_proxy http://localhost:3000
|
||||
}
|
||||
|
||||
# For Ente Accounts web app
|
||||
accounts.ente.yourdomain.tld {
|
||||
reverse_proxy http://localhost:3001
|
||||
}
|
||||
|
||||
# For Ente Albums web app
|
||||
albums.ente.yourdomain.tld {
|
||||
reverse_proxy http://localhost:3002
|
||||
}
|
||||
|
||||
# For Ente Auth web app
|
||||
auth.ente.yourdomain.tld {
|
||||
reverse_proxy http://localhost:3003
|
||||
}
|
||||
|
||||
# For Ente Cast web app
|
||||
cast.ente.yourdomain.tld {
|
||||
reverse_proxy http://localhost:3004
|
||||
}
|
||||
```
|
||||
|
||||
## Step 3: Reload reverse proxy
|
||||
|
||||
Reload Caddy for changes to take effect.
|
||||
|
||||
```shell
|
||||
sudo systemctl caddy reload
|
||||
```
|
||||
|
||||
## Step 4: Verify the setup
|
||||
|
||||
Ente Photos web app should be up on https://web.ente.yourdomain.tld and Museum
|
||||
at https://api.ente.yourdomain.tld.
|
||||
|
||||
> [!TIP] If you are using other reverse proxy servers such as NGINX, Traefik,
|
||||
> etc., please check out their documentation.
|
||||
139
docs/docs/self-hosting/administration/users.md
Normal file
@@ -0,0 +1,139 @@
|
||||
---
|
||||
title: User Management - Self-hosting
|
||||
description: Guide to configuring Ente CLI for Self Hosted Instance
|
||||
---
|
||||
|
||||
# User Management
|
||||
|
||||
You may wish to self-host Ente for your family or close circle. In such cases,
|
||||
you may wish to enable administrative access for few users, disable new
|
||||
registrations, manage one-time tokens (OTTs), etc.
|
||||
|
||||
This document covers the details on how you can administer users on your server.
|
||||
|
||||
## Whitelist admins
|
||||
|
||||
The administrator users have to be explicitly whitelisted in `museum.yaml`. You
|
||||
can achieve this the following steps:
|
||||
|
||||
1. Connect to `ente_db` (the database used for storing data related to Ente).
|
||||
|
||||
```shell
|
||||
# Change the DB name and DB user name if you use different
|
||||
# values.
|
||||
# If using Docker
|
||||
|
||||
docker exec -it <postgres-ente-container-name>
|
||||
psql -U pguser -d ente_db
|
||||
|
||||
# Or when using psql directly
|
||||
psql -U pguser -d ente_db
|
||||
```
|
||||
|
||||
2. Get the user ID of the first user by running the following SQL query:
|
||||
|
||||
```sql
|
||||
SELECT * from users;
|
||||
```
|
||||
|
||||
3. Edit `internal.admins` or `internal.admin` (if you wish to whitelist only
|
||||
single user) in `museum.yaml` to add the user ID you wish to whitelist.
|
||||
|
||||
- For multiple admins:
|
||||
|
||||
```yaml
|
||||
internal:
|
||||
admins:
|
||||
- <user_id>
|
||||
```
|
||||
|
||||
- For single admin:
|
||||
|
||||
```yaml
|
||||
internal:
|
||||
admin: <user_id>
|
||||
```
|
||||
|
||||
4. Restart Museum by restarting the cluster
|
||||
|
||||
::: tip Restart your Compose clusters whenever you make changes
|
||||
|
||||
If you have edited the Compose file or configuration file (`museum.yaml`), make
|
||||
sure to recreate the cluster's containers.
|
||||
|
||||
You can do this by the following command:
|
||||
|
||||
```shell
|
||||
docker compose down && docker compose up -d
|
||||
```
|
||||
|
||||
:::
|
||||
|
||||
## Increase storage and account validity
|
||||
|
||||
You can use Ente CLI for increasing storage quota and account validity for users
|
||||
on your instance. Check this guide for more
|
||||
[information](/self-hosting/administration/cli#step-4-increase-storage-and-account-validity)
|
||||
|
||||
## Handle user verification codes
|
||||
|
||||
Ente currently relies on verification codes for completion of registration.
|
||||
|
||||
These are accessible in server logs. If using Docker Compose, they can be
|
||||
accessed by running `sudo docker compose logs` in the cluster folder where
|
||||
Compose file resides.
|
||||
|
||||
However, you may wish to streamline this workflow. You can follow one of the 2
|
||||
methods if you wish to have many users in the system.
|
||||
|
||||
### Use hardcoded OTTs
|
||||
|
||||
You can configure to use hardcoded OTTs only for specific emails, or based on
|
||||
suffix.
|
||||
|
||||
A sample configuration for the same is provided below, which is to be used in
|
||||
`museum.yaml`:
|
||||
|
||||
```yaml
|
||||
internal:
|
||||
hardcoded-ott:
|
||||
emails:
|
||||
- "example@example.org,123456"
|
||||
local-domain-suffix: "@example.org"
|
||||
local-domain-value: 012345
|
||||
```
|
||||
|
||||
This sets OTT to 123456 for the email address example@example.com and 012345 for
|
||||
emails having @example.com as suffix.
|
||||
|
||||
### Send email with verification code
|
||||
|
||||
You can configure SMTP for sending verification code e-mails to users, which is
|
||||
efficient if you do not know mail addresses of people for who you want to
|
||||
hardcode OTTs or if you are serving larger audience.
|
||||
|
||||
Set the host and port accordingly with your credentials in `museum.yaml`
|
||||
|
||||
```yaml
|
||||
smtp:
|
||||
host:
|
||||
port:
|
||||
# Optional username and password if using local relay server
|
||||
username:
|
||||
password:
|
||||
# Email address used for sending emails (this mail's credentials have to be provided)
|
||||
email:
|
||||
# Optional name for sender
|
||||
sender-name:
|
||||
```
|
||||
|
||||
## Disable registrations
|
||||
|
||||
For security purposes, you may choose to disable registrations on your instance.
|
||||
You can disable new registrations by using the following configuration in
|
||||
`museum.yaml`.
|
||||
|
||||
```yaml
|
||||
internal:
|
||||
disable-registration: true
|
||||
```
|
||||
@@ -1,27 +0,0 @@
|
||||
---
|
||||
title: Creating accounts
|
||||
description: Creating accounts on your deployment
|
||||
---
|
||||
|
||||
# Creating accounts
|
||||
|
||||
Once Ente is up and running, the Ente Photos web app will be accessible on
|
||||
`http://localhost:3000`. Open this URL in your browser and proceed with creating
|
||||
an account.
|
||||
|
||||
The default API endpoint for museum will be `localhost:8080`.
|
||||
|
||||

|
||||
|
||||
To complete your account registration you will need to enter a 6-digit
|
||||
verification code.
|
||||
|
||||
This code can be found in the server logs, which should already be shown in your
|
||||
quickstart terminal. Alternatively, you can open the server logs with the
|
||||
following command from inside the `my-ente` folder:
|
||||
|
||||
```sh
|
||||
sudo docker compose logs
|
||||
```
|
||||
|
||||

|
||||
@@ -1,65 +0,0 @@
|
||||
---
|
||||
title: Backups
|
||||
description: General introduction to backing up your self hosted Ente instance
|
||||
---
|
||||
|
||||
# Backing up your Ente instance
|
||||
|
||||
> [!WARNING]
|
||||
>
|
||||
> This is not meant to be a comprehensive and bullet proof guide. There are many
|
||||
> moving parts, and small mistakes might make your backups unusable.
|
||||
>
|
||||
> Please treat this only as a general introduction. And remember to test your
|
||||
> restores.
|
||||
|
||||
At the minimum, a functional Ente backend needs three things:
|
||||
|
||||
1. Museum (the API server)
|
||||
2. Postgres (the database)
|
||||
3. Object storage (any S3-compatible object storage)
|
||||
|
||||
When thinking about backups, this translates into backing up the relevant state
|
||||
from each of these:
|
||||
|
||||
1. For museum, you'd want to backup your `museum.yaml`, `credentials.yaml` or
|
||||
any other custom configuration that you created. In particular, you should
|
||||
backup the
|
||||
[secrets that are specific to your instance](https://github.com/ente-io/ente/blob/74377a93d8e20e969d9a2531f32f577b5f0ef090/server/configurations/local.yaml#L188)
|
||||
(`key.encryption`, `key.hash` and `jwt.secret`).
|
||||
|
||||
2. For postgres, the entire data volume needs to be backed up.
|
||||
|
||||
3. For object storage, the entire data volume needs to be backed up.
|
||||
|
||||
A common oversight is taking a lot of care for backing up the object storage,
|
||||
even going as far as enabling replication and backing up the the multiple object
|
||||
storage volumes, but not applying the same care to the database backup.
|
||||
|
||||
While the actual encrypted photos are indeed stored in the object storage,
|
||||
**this encrypted data will not be usable without the database** since the
|
||||
database contains information like a file specific encryption key.
|
||||
|
||||
Viewed differently, to decrypt your data you need three pieces of information:
|
||||
|
||||
1. The encrypted file data itself (which comes from the object storage backup).
|
||||
|
||||
2. The ([encrypted](https://ente.io/architecture/)) file and collection specific
|
||||
encryption keys (which come from the database backup).
|
||||
|
||||
3. The master key (which comes from your password).
|
||||
|
||||
---
|
||||
|
||||
If you're starting out with self hosting, our recommendation is to start by
|
||||
keeping a plaintext backup of your photos.
|
||||
[You can use the CLI or the desktop app to automate this](/photos/faq/export).
|
||||
|
||||
Once you get more comfortable with the various parts, you can try backing up
|
||||
your instance. As a reference,
|
||||
[this document outlines how Ente itself treats backups](https://ente.io/reliability).
|
||||
|
||||
If you stop doing plaintext backups and instead rely on your instance backup,
|
||||
ensure that you do the full restore process also to verify you can get back your
|
||||
data. As the industry saying goes, a backup without a restore is no backup at
|
||||
all.
|
||||
@@ -1,52 +0,0 @@
|
||||
---
|
||||
title: "Environment Variables and Ports"
|
||||
description:
|
||||
"Information about all the Environment Variables needed to run Ente"
|
||||
---
|
||||
|
||||
# Environment variables and ports
|
||||
|
||||
A self-hosted Ente instance requires specific endpoints in both Museum (the
|
||||
server) and web apps. This document outlines the essential environment variables
|
||||
and port mappings of the web apps.
|
||||
|
||||
Here's the list of important variables that a self hoster should know about:
|
||||
|
||||
### Museum
|
||||
|
||||
1. `NEXT_PUBLIC_ENTE_ENDPOINT`
|
||||
|
||||
The above environment variable is used to configure Museums endpoint. Where
|
||||
Museum is running and which port it is listening on. This endpoint should be
|
||||
configured for all the apps to connect to your self hosted endpoint.
|
||||
|
||||
All the apps (regardless of platform) by default connect to api.ente.io - which
|
||||
is our production instance of Museum.
|
||||
|
||||
### Web Apps
|
||||
|
||||
> [!IMPORTANT] Web apps don't need to be configured with the below endpoints.
|
||||
> Web app environment variables are being documented here just so that the users
|
||||
> know everything in detail. Checkout
|
||||
> [Configuring your Server](/self-hosting/museum) to configure endpoints for
|
||||
> particular app.
|
||||
|
||||
In Ente, all the web apps are separate NextJS applications. Therefore, they are
|
||||
all configured via environment variables. The photos app (Ente Photos) has
|
||||
information about and connects to other web apps like albums, cast, etc.
|
||||
|
||||
1. `NEXT_PUBLIC_ENTE_ALBUMS_ENDPOINT`
|
||||
|
||||
This environment variable is used to configure and declare the endpoint for the
|
||||
Albums web app.
|
||||
|
||||
## Ports
|
||||
|
||||
The below format is according to how ports are mapped in Docker.
|
||||
Typically,`<host>:<container-port>`
|
||||
|
||||
1. `8080:8080`: Museum (Ente's server)
|
||||
2. `3000:3000`: Ente Photos web app
|
||||
3. `3001:3001`: Ente Accounts web app
|
||||
4. `3003:3003`: [Ente Auth web app](https://ente.io/auth/)
|
||||
5. `3004:3004`: [Ente Cast web app](http://ente.io/cast)
|
||||
@@ -1,47 +0,0 @@
|
||||
---
|
||||
title: FAQ - Self hosting
|
||||
description: Frequently asked questions about self hosting Ente
|
||||
---
|
||||
|
||||
# Frequently Asked Questions
|
||||
|
||||
### Do Ente Photos and Ente Auth share the same backend?
|
||||
|
||||
Yes. The apps share the same backend, the same database and the same object
|
||||
storage namespace. The same user account works for both of them.
|
||||
|
||||
### Can I just self host Ente Auth?
|
||||
|
||||
Yes, if you wish, you can self-host the server and use it only for the 2FA auth
|
||||
app. The starter Docker compose will work fine for either Photos or Auth (or
|
||||
both!).
|
||||
|
||||
> You currently don't need to configure the S3 object storage (e.g. minio
|
||||
> containers) if you're only using your self hosted Ente instance for auth.
|
||||
|
||||
### Can I use the server with _X_ as the object storage?
|
||||
|
||||
Yes. As long as whatever X you're using provides an S3 compatible API, you can
|
||||
use it as the underlying object storage. For example, the starter self-hosting
|
||||
Docker compose file we offer uses MinIO, and on our production deployments we
|
||||
use Backblaze/Wasabi/Scaleway. But that's not the full list - as long as the
|
||||
service you intend to use has a S3 compatible API, it can be used.
|
||||
|
||||
### How do I increase storage space for users on my self hosted instance?
|
||||
|
||||
See the [guide for administering your server](/self-hosting/guides/admin). In
|
||||
particular, you can use the `ente admin update-subscription` CLI command to
|
||||
increase the
|
||||
[storage and account validity](https://github.com/ente-io/ente/blob/main/cli/docs/generated/ente_admin_update-subscription.md)
|
||||
of accounts on your instance.
|
||||
|
||||
### How can I become an admin on my self hosted instance?
|
||||
|
||||
The first user you create on your instance is treated as an admin.
|
||||
|
||||
If you want, you can modify this behaviour by providing an explicit list of
|
||||
admins in the [configuration](/self-hosting/guides/admin#becoming-an-admin).
|
||||
|
||||
### Can I disable registration of new accounts on my self hosted instance?
|
||||
|
||||
Yes. See `internal.disable-registration` in local.yaml.
|
||||
@@ -1,45 +0,0 @@
|
||||
---
|
||||
title: Verification code
|
||||
description: Getting the OTP for a self hosted Ente
|
||||
---
|
||||
|
||||
# Verification code
|
||||
|
||||
The self-hosted Ente by default does not send out emails, so you can pick the
|
||||
verification code by:
|
||||
|
||||
- Getting it from the server logs, or
|
||||
|
||||
- Reading it from the DB (otts table)
|
||||
|
||||
The easiest option when getting started is to look for it in the server (museum)
|
||||
logs. If you're already running the docker compose cluster using the quickstart
|
||||
script, you should be already seeing the logs in your terminal. Otherwise you
|
||||
can go to the folder (e.g. `my-ente`) where your `compose.yaml` is, then run
|
||||
`docker compose logs museum --follow`. Once you can see the logs, look for a
|
||||
line like:
|
||||
|
||||
```
|
||||
... Skipping sending email to email@example.com: *Verification code: 112089*
|
||||
```
|
||||
|
||||
That is the verification code.
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> You can also configure your instance to send out emails so that you can get
|
||||
> your verification code via emails by using the `smtp` section in the config.
|
||||
|
||||
You can also set pre-defined hardcoded OTTs for certain users when running
|
||||
locally by creating a `museum.yaml` and adding the `internal.hardcoded-ott`
|
||||
configuration setting to it. See
|
||||
[local.yaml](https://github.com/ente-io/ente/blob/main/server/configurations/local.yaml)
|
||||
in the server source code for details about how to define this.
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> If you're not able to get the OTP with the above methods, make sure that you
|
||||
> are actually connecting to your self hosted instance and not to Ente's
|
||||
> production servers. e.g. you can use the network requests tab in the browser
|
||||
> console to verify that the API requests are going to your server instead of
|
||||
> `api.ente.io`.
|
||||
@@ -1,104 +0,0 @@
|
||||
---
|
||||
title: Album sharing
|
||||
description: Getting album sharing to work using an self-hosted Ente
|
||||
---
|
||||
|
||||
# Is public sharing available for self-hosted instances?
|
||||
|
||||
Yes.
|
||||
|
||||
You'll need to run two instances of the web app, one is regular web app, but
|
||||
another one is the same code but running on a different origin (i.e. on a
|
||||
different hostname or different port).
|
||||
|
||||
Then, you need to tell the regular web app to use your second instance to
|
||||
service public links. You can do this by setting the
|
||||
`NEXT_PUBLIC_ENTE_ALBUMS_ENDPOINT` to point to your second instance when running
|
||||
or building the regular web app.
|
||||
|
||||
For more details, see
|
||||
[.env](https://github.com/ente-io/ente/blob/main/web/apps/photos/.env) and
|
||||
[.env.development](https://github.com/ente-io/ente/blob/main/web/apps/photos/.env.development).
|
||||
|
||||
As a concrete example, assuming we have a Ente server running on
|
||||
`localhost:8080`, we can start two instances of the web app, passing them
|
||||
`NEXT_PUBLIC_ENTE_ALBUMS_ENDPOINT` that points to the origin
|
||||
("scheme://host[:port]") of the second "albums" instance.
|
||||
|
||||
The first one, the normal web app
|
||||
|
||||
```sh
|
||||
NEXT_PUBLIC_ENTE_ENDPOINT=http://localhost:8080 \
|
||||
NEXT_PUBLIC_ENTE_ALBUMS_ENDPOINT=http://localhost:3002 \
|
||||
yarn dev:photos
|
||||
```
|
||||
|
||||
The second one, the same code but acting as the "albums" app (the only
|
||||
difference is the port it is running on):
|
||||
|
||||
```sh
|
||||
NEXT_PUBLIC_ENTE_ENDPOINT=http://localhost:8080 \
|
||||
NEXT_PUBLIC_ENTE_ALBUMS_ENDPOINT=http://localhost:3002 \
|
||||
yarn dev:albums
|
||||
```
|
||||
|
||||
If you also want to change the prefix (the origin) in the generated public
|
||||
links, to use your custom albums endpoint in the generated public link instead
|
||||
of albums.ente.io, set `apps.public-albums` property in museum's configuration
|
||||
|
||||
For example, when running using the starter docker compose file, you can do this
|
||||
by creating a `museum.yaml` and defining the following configuration there:
|
||||
|
||||
```yaml
|
||||
apps:
|
||||
public-albums: http://localhost:3002
|
||||
```
|
||||
|
||||
(For more details, see
|
||||
[local.yaml](https://github.com/ente-io/ente/blob/main/server/configurations/local.yaml)
|
||||
in the server's source code).
|
||||
|
||||
## Dockerfile example
|
||||
|
||||
Here is an example of a Dockerfile by @Dylanger on our community Discord. This
|
||||
runs a standalone self-hosted version of the public albums app in production
|
||||
mode.
|
||||
|
||||
```Dockerfile
|
||||
FROM node:20-alpine as builder
|
||||
|
||||
WORKDIR /app
|
||||
COPY . .
|
||||
|
||||
ARG NEXT_PUBLIC_ENTE_ENDPOINT=https://your.ente.example.org
|
||||
ARG NEXT_PUBLIC_ENTE_ALBUMS_ENDPOINT=https://your.albums.example.org
|
||||
|
||||
RUN yarn install && yarn build
|
||||
|
||||
FROM node:20-alpine
|
||||
|
||||
WORKDIR /app
|
||||
COPY --from=builder /app/apps/photos/out .
|
||||
|
||||
RUN npm install -g serve
|
||||
|
||||
ENV PORT=3000
|
||||
EXPOSE ${PORT}
|
||||
|
||||
CMD serve -s . -l tcp://0.0.0.0:${PORT}
|
||||
```
|
||||
|
||||
Note that this only runs the public albums app, but the same principle can be
|
||||
used to run both the normal Ente photos app and the public albums app. There is
|
||||
a slightly more involved example showing how to do this also provided by in a
|
||||
community contributed guide about
|
||||
[configuring external S3](/self-hosting/guides/external-s3).
|
||||
|
||||
You will also want to tell museum about your custom shared albums endpoint so
|
||||
that it uses that instead of the default URL when creating share links. You can
|
||||
configure that in museum's `config.yaml`:
|
||||
|
||||
```
|
||||
apps:
|
||||
public-albums: https://your.albums.example.org
|
||||
```
|
||||
@@ -1,88 +0,0 @@
|
||||
---
|
||||
title: Server admin
|
||||
description: Administering your custom self-hosted Ente instance using the CLI
|
||||
---
|
||||
|
||||
## Becoming an admin
|
||||
|
||||
By default, the first user (and only the first user) created on the system is
|
||||
considered as an admin.
|
||||
|
||||
This facility is provided as a convenience for people who are getting started
|
||||
with self hosting. For more serious deployments, we recommend creating an
|
||||
explicit whitelist of admins.
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> The first user is only treated as the admin if the list of admins in the
|
||||
> configuration is empty.
|
||||
>
|
||||
> Also, if at some point you delete the first user, then you will need to define
|
||||
> a whitelist to make some other user as the admin if you wish (since the first
|
||||
> account has been deleted).
|
||||
|
||||
To whitelist the user IDs that can perform admin actions on the server, use the
|
||||
following steps:
|
||||
|
||||
- Create a `museum.yaml` in the directory where you're starting museum from. For
|
||||
example, if you're running using `docker compose up`, then this file should be
|
||||
in the same directory as `compose.yaml` (generally, `server/museum.yaml`).
|
||||
|
||||
> Docker might've created an empty `museum.yaml` _directory_ on your machine
|
||||
> previously. If so, delete that empty directory and create a new file named
|
||||
> `museum.yaml`.
|
||||
|
||||
- In this `museum.yaml` we can add overrides over the default configuration.
|
||||
|
||||
For whitelisting the admin userIDs we need to define an `internal.admins`. See
|
||||
the "internal" section in
|
||||
[local.yaml](https://github.com/ente-io/ente/blob/main/server/configurations/local.yaml)
|
||||
in the server source code for details about how to define this.
|
||||
|
||||
Here is an example. Suppose we wanted to whitelist a user with ID
|
||||
`1580559962386440`, we can create the following `museum.yaml`
|
||||
|
||||
```yaml
|
||||
internal:
|
||||
admins:
|
||||
- 1580559962386440
|
||||
```
|
||||
|
||||
You can use
|
||||
[account list](https://github.com/ente-io/ente/blob/main/cli/docs/generated/ente_account_list.md)
|
||||
command to find the user id of any account.
|
||||
|
||||
# Administering your custom server
|
||||
|
||||
> [!NOTE] For the first user (admin) to perform administrative actions using the
|
||||
> CLI, their userID must be whitelisted in the `museum.yaml` configuration file
|
||||
> under `internal.admins`. While the first user is automatically granted admin
|
||||
> privileges on the server, this additional step is required for CLI operations.
|
||||
|
||||
You can use
|
||||
[Ente's CLI](https://github.com/ente-io/ente/releases?q=tag%3Acli-v0) to
|
||||
administer your self hosted server.
|
||||
|
||||
First we need to get your CLI to connect to your custom server. Define a
|
||||
config.yaml and put it either in the same directory as CLI or path defined in
|
||||
env variable `ENTE_CLI_CONFIG_PATH`
|
||||
|
||||
```yaml
|
||||
endpoint:
|
||||
api: "http://localhost:8080"
|
||||
```
|
||||
|
||||
Now you should be able to
|
||||
[add an account](https://github.com/ente-io/ente/blob/main/cli/docs/generated/ente_account_add.md),
|
||||
and subsequently increase the
|
||||
[storage and account validity](https://github.com/ente-io/ente/blob/main/cli/docs/generated/ente_admin_update-subscription.md)
|
||||
using the CLI.
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> The CLI command to add an account does not create Ente accounts. It only adds
|
||||
> existing accounts to the list of (existing) accounts that the CLI can use.
|
||||
|
||||
## Backups
|
||||
|
||||
See this [FAQ](/self-hosting/faq/backup).
|
||||
@@ -1,123 +0,0 @@
|
||||
---
|
||||
title: Configuring S3 buckets
|
||||
description:
|
||||
Configure S3 endpoints to fix upload errors or use your self hosted ente
|
||||
from outside localhost
|
||||
---
|
||||
|
||||
# Architecture
|
||||
|
||||

|
||||
|
||||
There are three components involved in uploading a file:
|
||||
|
||||
1. The client (e.g. the web app or the mobile app)
|
||||
2. Ente's server (museum)
|
||||
3. The S3-compatible object storage (e.g. MinIO in the default starter)
|
||||
|
||||
For the uploads to work, all three of them need to be able to reach each other.
|
||||
This is because the client uploads directly to the object storage.
|
||||
|
||||
A file upload flows as follows:
|
||||
|
||||
1. Client that wants to upload a file asks museum where it should upload the
|
||||
file to
|
||||
2. museum creates pre-signed URLs for the S3 bucket that was configured
|
||||
3. Client directly uploads to the S3 buckets these URLs
|
||||
4. Client finally informs museum that a file has been uploaded to this URL
|
||||
|
||||
The upshot of this is that _both_ the client and museum should be able to reach
|
||||
your S3 bucket.
|
||||
|
||||
## Configuring S3
|
||||
|
||||
The URL for the S3 bucket is configured in
|
||||
[scripts/compose/credentials.yaml](https://github.com/ente-io/ente/blob/main/server/scripts/compose/credentials.yaml#L10).
|
||||
|
||||
You can edit this file directly while testing, though it is more robust to
|
||||
create a `museum.yaml` (in the same folder as the Docker compose file) and to
|
||||
setup your custom configuration there.
|
||||
|
||||
> [!TIP] For more details about these configuration objects, see the
|
||||
> documentation for the `s3` object in
|
||||
> [configurations/local.yaml](https://github.com/ente-io/ente/blob/main/server/configurations/local.yaml).
|
||||
|
||||
By default, you only need to configure the endpoint for the first bucket.
|
||||
|
||||
The Docker compose file is shipped with MinIO as the self hosted S3 compatible
|
||||
storage. By default, MinIO server is served on `localhost:3200` and the MinIO UI
|
||||
on `localhost:3201`.
|
||||
|
||||
For example, in a localhost network situation, the way this connection works is,
|
||||
museum (`1`) and MinIO (`2`) run on the same Docker network and the web app
|
||||
(`3`) will also be hosted on your localhost. This enables all the three
|
||||
components of the setup to communicate with each other seamlessly.
|
||||
|
||||
The same principle applies if you're deploying to your custom domain.
|
||||
|
||||
## Replication
|
||||
|
||||

|
||||
|
||||
<p align="center">Community contributed diagram of Ente's replication process</p>
|
||||
|
||||
> [!IMPORTANT]
|
||||
>
|
||||
> As of now, replication works only if all the 3 storage type needs are
|
||||
> fulfilled (1 hot, 1 cold and 1 glacier storage).
|
||||
>
|
||||
> [Reference](https://github.com/ente-io/ente/discussions/3167#discussioncomment-10585970)
|
||||
|
||||
If you're wondering why there are 3 buckets on the MinIO UI - that's because our
|
||||
production instance uses these to perform
|
||||
[replication](https://ente.io/reliability/).
|
||||
|
||||
If you're also wondering about why the bucket names are specifically what they
|
||||
are, it's because that is exactly what we are using on our production instance.
|
||||
We use `b2-eu-cen` as hot, `wasabi-eu-central-2-v3` as cold (also the secondary
|
||||
hot) and `scw-eu-fr-v3` as glacier storage. As of now, all of this is hardcoded.
|
||||
Hence, the same hardcoded configuration is applied when you self host Ente.
|
||||
|
||||
In a self hosted Ente instance replication is turned off by default. When
|
||||
replication is turned off, only the first bucket (`b2-eu-cen`) is used, and the
|
||||
other two are ignored. Only the names here are specifically fixed, but in the
|
||||
configuration body you can put any other keys. It does not have any relation
|
||||
with `b2`, `wasabi` or even `scaleway`.
|
||||
|
||||
Use the `s3.hot_storage.primary` option if you'd like to set one of the other
|
||||
predefined buckets as the primary bucket.
|
||||
|
||||
## SSL Configuration
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> If you need to configure SSL, you'll need to turn off `s3.are_local_buckets`
|
||||
> (which disables SSL in the default starter compose template).
|
||||
|
||||
Disabling `s3.are_local_buckets` also switches to the subdomain style URLs for
|
||||
the buckets. However, not all S3 providers support these. In particular, MinIO
|
||||
does not work with these in default configuration. So in such cases you'll also
|
||||
need to enable `s3.use_path_style_urls`.
|
||||
|
||||
## Summary
|
||||
|
||||
Set the S3 bucket `endpoint` in `credentials.yaml` to a `yourserverip:3200` or
|
||||
some such IP / hostname that is accessible from both where you are running the
|
||||
Ente clients (e.g. the mobile app) and also from within the Docker compose
|
||||
cluster.
|
||||
|
||||
### Example
|
||||
|
||||
An example `museum.yaml` when you're trying to connect to museum running on your
|
||||
computer from your phone on the same WiFi network:
|
||||
|
||||
```yaml
|
||||
s3:
|
||||
are_local_buckets: true
|
||||
b2-eu-cen:
|
||||
key: test
|
||||
secret: testtest
|
||||
endpoint: http://<YOUR-WIFI-IP>:3200
|
||||
region: eu-central-2
|
||||
bucket: b2-eu-cen
|
||||
```
|
||||
@@ -1,115 +0,0 @@
|
||||
---
|
||||
title: Custom server
|
||||
description: Using a custom self-hosted server with Ente client apps and CLI
|
||||
---
|
||||
|
||||
# Connecting to a custom server
|
||||
|
||||
You can modify various Ente client apps and CLI to connect to a self hosted
|
||||
custom server endpoint.
|
||||
|
||||
[[toc]]
|
||||
|
||||
## Mobile
|
||||
|
||||
The pre-built Ente apps from GitHub / App Store / Play Store / F-Droid can be
|
||||
easily configured to use a custom server.
|
||||
|
||||
You can tap 7 times on the onboarding screen to bring up a page where you can
|
||||
configure the endpoint the app should be connecting to.
|
||||
|
||||

|
||||
|
||||
## Desktop and web
|
||||
|
||||
Same as the mobile app, you can tap 7 times on the onboarding screen to
|
||||
configure the endpoint the app should connect to.
|
||||
|
||||
<div align="center">
|
||||
|
||||
{width=400px}
|
||||
|
||||
</div>
|
||||
|
||||
This works on both the desktop app and web app (if you deploy on your own).
|
||||
|
||||
To make it easier to identify when a custom server is being used, app will
|
||||
thereafter show the endpoint in use (if not Ente's production server) at the
|
||||
bottom of the login prompt:
|
||||
|
||||

|
||||
|
||||
Similarly, it'll be shown at other screens during the login flow. After login,
|
||||
you can also see it at the bottom of the sidebar.
|
||||
|
||||
Note that the custom server configured this way is cleared when you reset the
|
||||
state during logout. In particular, the app also does a reset when you press the
|
||||
change email button during the login flow.
|
||||
|
||||
### Building from source
|
||||
|
||||
Alternatively (e.g. if you don't wish to configure this setting and just want to
|
||||
change the endpoint the client connects to by default), you can build the app
|
||||
from source and use the `NEXT_PUBLIC_ENTE_ENDPOINT` environment variable to tell
|
||||
it which server to connect to. For example:
|
||||
|
||||
```sh
|
||||
NEXT_PUBLIC_ENTE_ENDPOINT=http://localhost:8080 yarn dev:photos
|
||||
```
|
||||
|
||||
For more details, see
|
||||
[hosting the web app](https://help.ente.io/self-hosting/guides/web-app).
|
||||
|
||||
## CLI
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> You can download the CLI from
|
||||
> [here](https://github.com/ente-io/ente/releases?q=tag%3Acli-v0)
|
||||
|
||||
Define a config.yaml and put it either in the same directory as where you run
|
||||
the CLI from ("current working directory"), or in the path defined in env
|
||||
variable `ENTE_CLI_CONFIG_PATH`:
|
||||
|
||||
```yaml
|
||||
endpoint:
|
||||
api: "http://localhost:8080"
|
||||
```
|
||||
|
||||
(Another
|
||||
[example](https://github.com/ente-io/ente/blob/main/cli/config.yaml.example))
|
||||
|
||||
## Find the hostname of your server
|
||||
|
||||
If you want to access your museum within your own network, you can use the
|
||||
`hostname` command to find a addressable local network hostname or IP for your
|
||||
computer, and then use it by suffixing it with the port number.
|
||||
|
||||
First, run
|
||||
|
||||
```sh
|
||||
hostname
|
||||
```
|
||||
|
||||
The result will look something like this
|
||||
|
||||
```sh
|
||||
my-computer.local
|
||||
```
|
||||
|
||||
You will need to replace the server endpoint with an address that uses your
|
||||
server's hostname and the port number. Here's an example:
|
||||
|
||||
```
|
||||
http://my-computer.local:8080
|
||||
```
|
||||
|
||||
Note that this will only work within your network. To access it from outside the
|
||||
network, you need to use the public IP or hostname.
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> If you're having trouble uploading from your mobile app, it is likely that
|
||||
> museum is not able to connect to your S3 storage. See the
|
||||
> [Configuring S3](/self-hosting/guides/configuring-s3) guide for more details.
|
||||
@@ -1,158 +0,0 @@
|
||||
---
|
||||
title: DB Migration
|
||||
description:
|
||||
Migrating your self hosted Postgres 12 database to newer Postgres versions
|
||||
---
|
||||
|
||||
# Migrating Postgres 12 to 15
|
||||
|
||||
The old sample docker compose file used Postgres 12, which is now nearing end of
|
||||
life, so we've updated it to Postgres 15. Postgres major versions changes
|
||||
require a migration step. This document mentions some approaches you can use.
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> Ente itself does not use any specific Postgres 12 or Postgres 15 features, and
|
||||
> will talk to either happily. It should also work with newer Postgres versions,
|
||||
> but let us know if you run into any problems and we'll update this page.
|
||||
|
||||
### Taking a backup
|
||||
|
||||
`docker compose exec` allows us to run a command against a running container. We
|
||||
can use it to run the `pg_dumpall` command on the postgres container to create a
|
||||
plaintext backup.
|
||||
|
||||
Assuming your cluster is already running, and you are in the `ente/server`
|
||||
directory, you can run the following (this command uses the default credentials,
|
||||
you'll need to change these to match your setup):
|
||||
|
||||
```sh
|
||||
docker compose exec postgres env PGPASSWORD=pgpass PGUSER=pguser PG_DB=ente_db pg_dumpall >pg12.backup.sql
|
||||
```
|
||||
|
||||
This will produce a `pg12.backup.sql` in your current directory. You can open it
|
||||
in a text editor (it can be huge!) to verify that it looks correct.
|
||||
|
||||
We won't be needing this file, this backup is recommended just in case something
|
||||
goes amiss with the actual migration.
|
||||
|
||||
> If you need to restore from this plaintext backup, you could subsequently run
|
||||
> something like:
|
||||
>
|
||||
> ```sh
|
||||
> docker compose up postgres
|
||||
> cat pg12.backup.sql | docker compose exec -T postgres env PGPASSWORD=pgpass psql -U pguser -d ente_db
|
||||
> ```
|
||||
|
||||
## The migration
|
||||
|
||||
At the high level, the steps are
|
||||
|
||||
1. Stop your cluster.
|
||||
|
||||
2. Start just the postgres container after changing the image to
|
||||
`pgautoupgrade/pgautoupgrade:15-bookworm`.
|
||||
|
||||
3. Once the in-place migration completes, stop the container, and change the
|
||||
image to `postgres:15`.
|
||||
|
||||
#### 1. Stop the cluster
|
||||
|
||||
Stop your running Ente cluster.
|
||||
|
||||
```sh
|
||||
docker compose down
|
||||
```
|
||||
|
||||
#### 2. Run `pgautoupgrade`
|
||||
|
||||
Modify your `compose.yaml`, changing the image for the "postgres" container from
|
||||
"postgres:12" to "pgautoupgrade/pgautoupgrade:15-bookworm"
|
||||
|
||||
```diff
|
||||
diff a/server/compose.yaml b/server/compose.yaml
|
||||
|
||||
postgres:
|
||||
- image: postgres:12
|
||||
+ image: pgautoupgrade/pgautoupgrade:15-bookworm
|
||||
ports:
|
||||
```
|
||||
|
||||
[pgautoupgrade](https://github.com/pgautoupgrade/docker-pgautoupgrade) is a
|
||||
community docker image that performs an in-place migration.
|
||||
|
||||
After making the change, run only the `postgres` container in the cluster
|
||||
|
||||
```sh
|
||||
docker compose up postgres
|
||||
```
|
||||
|
||||
The container will start and peform an in-place migration. Once it is done, it
|
||||
will start postgres normally. You should see something like this is the logs
|
||||
|
||||
```
|
||||
postgres-1 | Automatic upgrade process finished with no errors reported
|
||||
...
|
||||
postgres-1 | ... starting PostgreSQL 15...
|
||||
```
|
||||
|
||||
At this point, you can stop the container (`CTRL-C`).
|
||||
|
||||
#### 3. Finish by changing image
|
||||
|
||||
Modify `compose.yaml` again, changing the image to "postgres:15".
|
||||
|
||||
```diff
|
||||
diff a/server/compose.yaml b/server/compose.yaml
|
||||
|
||||
postgres:
|
||||
- image: pgautoupgrade/pgautoupgrade:15-bookworm
|
||||
+ image: postgres:15
|
||||
ports:
|
||||
```
|
||||
|
||||
And cleanup the temporary containers by
|
||||
|
||||
```sh
|
||||
docker compose down --remove-orphans
|
||||
```
|
||||
|
||||
Migration is now complete. You can start your Ente cluster normally.
|
||||
|
||||
```sh
|
||||
docker compose up
|
||||
```
|
||||
|
||||
## Migration elsewhere
|
||||
|
||||
The above instructions are for Postgres running inside docker, as the sample
|
||||
docker compose file does. There are myriad other ways to run Postgres, and the
|
||||
migration sequence then will depend on your exact setup.
|
||||
|
||||
Two common approaches are
|
||||
|
||||
1. Backup and restore, the `pg_dumpall` + `psql` import sequence described in
|
||||
[Taking a backup](#taking-a-backup) above.
|
||||
|
||||
2. In place migrations using `pg_upgrade`, which is what the
|
||||
[pgautoupgrade](#the-migration) migration above does under the hood.
|
||||
|
||||
The first method, backup and restore, is low tech and will work similarly in
|
||||
most setups. The second method is more efficient, but requires a bit more
|
||||
careful preparation.
|
||||
|
||||
As another example, here is how one can migrate 12 to 15 when running Postgres
|
||||
on macOS, installed using Homebrew.
|
||||
|
||||
1. Stop your postgres. Make sure there are no more commands shown by
|
||||
`ps aux | grep '[p]ostgres'`.
|
||||
|
||||
2. Install postgres15.
|
||||
|
||||
3. Migrate data using `pg_upgrade`:
|
||||
|
||||
```sh
|
||||
/opt/homebrew/Cellar/postgresql@15/15.8/bin/pg_upgrade -b /opt/homebrew/Cellar/postgresql@12/12.18_1/bin -B /opt/homebrew/Cellar/postgresql@15/15.8/bin/ -d /opt/homebrew/var/postgresql@12 -D /opt/homebrew/var/postgresql@15
|
||||
```
|
||||
|
||||
4. Start postgres 15 and verify version using `SELECT VERSION()`.
|
||||
@@ -1,261 +0,0 @@
|
||||
---
|
||||
title: External S3 buckets
|
||||
description:
|
||||
Self hosting Ente's server and photos web app when using an external S3
|
||||
bucket
|
||||
---
|
||||
|
||||
# Hosting server and web app using external S3
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> This is a community contributed guide, and some of these steps ~~might be~~
|
||||
> ARE out of sync with the upstream changes. This document is retained for
|
||||
> reference purposes, but if something is not working correctly, please see the
|
||||
> latest [READMEs](https://github.com/ente-io/ente/blob/main/server/README.md)
|
||||
> in the repository and/or other guides in [self-hosting](/self-hosting/).
|
||||
|
||||
This guide is for self hosting the server and the web application of Ente Photos
|
||||
using docker compose and an external S3 bucket. So we assume that you already
|
||||
have the keys and secrets for the S3 bucket. The plan is as follows:
|
||||
|
||||
1. Create a `compose.yaml` file
|
||||
2. Set up the `.credentials.env` file
|
||||
3. Run `docker-compose up`
|
||||
4. Create an account and increase storage quota
|
||||
5. Fix potential CORS issue with your bucket
|
||||
|
||||
## 1. Create a `compose.yaml` file
|
||||
|
||||
After cloning the main repository with
|
||||
|
||||
```bash
|
||||
git clone https://github.com/ente-io/ente.git
|
||||
# Or git clone git@github.com:ente-io/ente.git
|
||||
cd ente
|
||||
```
|
||||
|
||||
Create a `compose.yaml` file at the root of the project with the following
|
||||
content (there is nothing to change here):
|
||||
|
||||
```yaml
|
||||
services:
|
||||
museum:
|
||||
build:
|
||||
context: server
|
||||
args:
|
||||
GIT_COMMIT: local
|
||||
ports:
|
||||
- 8080:8080 # API
|
||||
- 2112:2112 # Prometheus metrics
|
||||
depends_on:
|
||||
postgres:
|
||||
condition: service_healthy
|
||||
|
||||
# Wait for museum to ping pong before starting the webapp.
|
||||
healthcheck:
|
||||
test: [
|
||||
"CMD",
|
||||
"echo",
|
||||
"1", # I don't know what to put here
|
||||
]
|
||||
environment:
|
||||
# no need to touch these
|
||||
ENTE_DB_HOST: postgres
|
||||
ENTE_DB_PORT: 5432
|
||||
ENTE_DB_NAME: ente_db
|
||||
ENTE_DB_USER: pguser
|
||||
ENTE_DB_PASSWORD: pgpass
|
||||
env_file:
|
||||
- ./.credentials.env
|
||||
volumes:
|
||||
- custom-logs:/var/logs
|
||||
- museum.yaml:/museum.yaml:ro
|
||||
networks:
|
||||
- internal
|
||||
|
||||
web:
|
||||
build:
|
||||
context: web
|
||||
ports:
|
||||
- 8081:80
|
||||
- 8082:80
|
||||
depends_on:
|
||||
museum:
|
||||
condition: service_healthy
|
||||
env_file:
|
||||
- ./.credentials.env
|
||||
|
||||
postgres:
|
||||
image: postgres:12
|
||||
ports:
|
||||
- 5432:5432
|
||||
environment:
|
||||
POSTGRES_USER: pguser
|
||||
POSTGRES_PASSWORD: pgpass
|
||||
POSTGRES_DB: ente_db
|
||||
# Wait for postgres to be accept connections before starting museum.
|
||||
healthcheck:
|
||||
test: ["CMD", "pg_isready", "-q", "-d", "ente_db", "-U", "pguser"]
|
||||
interval: 1s
|
||||
timeout: 5s
|
||||
retries: 20
|
||||
volumes:
|
||||
- postgres-data:/var/lib/postgresql/data
|
||||
networks:
|
||||
- internal
|
||||
volumes:
|
||||
custom-logs:
|
||||
postgres-data:
|
||||
networks:
|
||||
internal:
|
||||
```
|
||||
|
||||
It maybe be added in the future, but if it does not exist, create a `Dockerfile`
|
||||
in the `web` directory with the following content:
|
||||
|
||||
```Dockerfile
|
||||
# syntax=docker/dockerfile:1
|
||||
FROM node:21-bookworm-slim as ente-builder
|
||||
WORKDIR /app
|
||||
RUN apt update && apt install -y ca-certificates && rm -rf /var/lib/apt/lists/*
|
||||
COPY . .
|
||||
RUN yarn install
|
||||
ENV NEXT_PUBLIC_ENTE_ENDPOINT=DOCKER_RUNTIME_REPLACE_ENDPOINT
|
||||
ENV NEXT_PUBLIC_ENTE_ALBUMS_ENDPOINT=DOCKER_RUNTIME_REPLACE_ALBUMS_ENDPOINT
|
||||
RUN yarn build
|
||||
|
||||
|
||||
FROM nginx:1.25-alpine-slim
|
||||
COPY --from=ente-builder /app/apps/photos/out /usr/share/nginx/html
|
||||
COPY <<EOF /etc/nginx/conf.d/default.conf
|
||||
server {
|
||||
listen 80 default_server;
|
||||
root /usr/share/nginx/html;
|
||||
location / {
|
||||
try_files \$uri \$uri.html \$uri/ =404;
|
||||
}
|
||||
error_page 404 /404.html;
|
||||
location = /404.html {
|
||||
internal;
|
||||
}
|
||||
}
|
||||
EOF
|
||||
ARG ENDPOINT="http://localhost:8080"
|
||||
ENV ENDPOINT "$ENDPOINT"
|
||||
ARG ALBUMS_ENDPOINT="http://localhost:8082"
|
||||
ENV ALBUMS_ENDPOINT "$ALBUMS_ENDPOINT"
|
||||
COPY <<EOF /docker-entrypoint.d/replace_ente_endpoints.sh
|
||||
echo "Replacing endpoints"
|
||||
echo " Endpoint: \$ENDPOINT"
|
||||
echo " Albums Endpoint: \$ALBUMS_ENDPOINT"
|
||||
|
||||
replace_enpoints() {
|
||||
sed -i -e 's,DOCKER_RUNTIME_REPLACE_ENDPOINT,'"\$ENDPOINT"',g' \$1
|
||||
sed -i -e 's,DOCKER_RUNTIME_REPLACE_ALBUMS_ENDPOINT,'"\$ALBUMS_ENDPOINT"',g' \$1
|
||||
}
|
||||
for jsfile in `find '/usr/share/nginx/html' -type f -name '*.js'`
|
||||
do
|
||||
replace_enpoints "\$jsfile"
|
||||
done
|
||||
EOF
|
||||
|
||||
RUN chmod +x /docker-entrypoint.d/replace_ente_endpoints.sh
|
||||
```
|
||||
|
||||
This runs nginx inside to handle both the web & album URLs so we don't have to
|
||||
make two web images with different port.
|
||||
|
||||
- `DOCKER_RUNTIME_REPLACE_ENDPOINT` this is your public museum API URL.
|
||||
- `DOCKER_RUNTIME_REPLACE_ALBUMS_ENDPOINT` this is the shared albums URL (for
|
||||
more details about configuring shared albums, see
|
||||
[faq/sharing](/self-hosting/faq/sharing)).
|
||||
|
||||
Note how above we had updated the `compose.yaml` file for the server with
|
||||
|
||||
```yaml
|
||||
web:
|
||||
build:
|
||||
context: web
|
||||
ports:
|
||||
- 8081:80
|
||||
- 8082:80
|
||||
```
|
||||
|
||||
so that web and album both point to the same container and nginx will handle it.
|
||||
|
||||
## 2. Set up the `.credentials.env` file
|
||||
|
||||
Create a `.credentials.env` file at the root of the project with the following
|
||||
content (here you need to set the correct value of each variable):
|
||||
|
||||
<!-- The following code block should have language env, but vitepress currently
|
||||
doesn't support that language, so use sh as a reasonable fallback instead. -->
|
||||
|
||||
```sh
|
||||
# run `go run tools/gen-random-keys/main.go` in the server directory to generate the keys
|
||||
ENTE_KEY_ENCRYPTION=
|
||||
ENTE_KEY_HASH=
|
||||
ENTE_JWT_SECRET=
|
||||
|
||||
# if you deploy it on a server under a domain, you need to set the correct value of the following variables
|
||||
# it can be changed later
|
||||
|
||||
# The backend server URL (Museum) to be used by the webapp
|
||||
ENDPOINT=http://localhost:8080
|
||||
# The URL of the public albums webapp (also need to be updated in museum.yml so the correct links are generated)
|
||||
ALBUMS_ENDPOINT=http://localhost:8082
|
||||
```
|
||||
|
||||
Create the `museum.yaml` with additional configuration, this will be mounted
|
||||
(read-only) into the container:
|
||||
|
||||
```yaml
|
||||
s3:
|
||||
are_local_buckets: false
|
||||
# For some self-hosted S3 deployments you (e.g. Minio) you might need to disable bucket subdomains
|
||||
use_path_style_urls: true
|
||||
# The key must be named like so
|
||||
b2-eu-cen:
|
||||
key: $YOUR_S3_KEY
|
||||
secret: $YOUR_S3_SECRET
|
||||
endpoint: $YOUR_S3_ENDPOINT
|
||||
region: $YOUR_S3_REGION
|
||||
bucket: $YOUR_S3_BUCKET_NAME
|
||||
# The same value as the one specified in ALBUMS_ENDPOINT
|
||||
apps:
|
||||
public-albums: http://localhost:8082
|
||||
```
|
||||
|
||||
## 3. Run `docker-compose up`
|
||||
|
||||
Run `docker-compose up` at the root of the project (add `-d` to run it in the
|
||||
background).
|
||||
|
||||
## 4. Create an account and increase storage quota
|
||||
|
||||
Open `http://localhost:8080` or whatever Endpoint you mentioned for the web app
|
||||
and create an account. If your SMTP related configurations are all set and
|
||||
right, you will receive an email with your OTT in it. There are two work arounds
|
||||
to retrieve the OTP, checkout
|
||||
[this document](https://help.ente.io/self-hosting/faq/otp) for getting your
|
||||
OTT's..
|
||||
|
||||
If you successfully log in, select any plan and increase the storage quota with
|
||||
the following command:
|
||||
|
||||
```bash
|
||||
docker compose exec -i postgres psql -U pguser -d ente_db -c "INSERT INTO storage_bonus (bonus_id, user_id, storage, type, valid_till) VALUES ('self-hosted-myself', (SELECT user_id FROM users), 1099511627776, 'ADD_ON_SUPPORT', 0)"
|
||||
```
|
||||
|
||||
After few reloads, you should see 1 To of quota.
|
||||
|
||||
## Related
|
||||
|
||||
Some other users have also shared their setups.
|
||||
|
||||
- [Using Traefik](https://github.com/ente-io/ente/pull/3663)
|
||||
|
||||
- [Building custom images from source (Linux)](https://github.com/ente-io/ente/discussions/3778)
|
||||
|
||||
- [Troubleshooting Bucket CORS](/self-hosting/troubleshooting/bucket-cors)
|
||||
@@ -1,228 +0,0 @@
|
||||
---
|
||||
title: Ente from Source
|
||||
description: Getting started self hosting Ente Photos and/or Ente Auth
|
||||
---
|
||||
|
||||
# Ente from Source
|
||||
|
||||
> [!WARNING] NOTE The below documentation will cover instructions about
|
||||
> self-hosting the web app manually. If you want to deploy Ente hassle free, use
|
||||
> the [one line](https://ente.io/blog/self-hosting-quickstart/) command to setup
|
||||
> Ente. This guide might be deprecated in the near future.
|
||||
|
||||
## Installing Docker
|
||||
|
||||
Refer to
|
||||
[How to install Docker from the APT repository](https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository)
|
||||
for detailed instructions.
|
||||
|
||||
## Start the server
|
||||
|
||||
```sh
|
||||
git clone https://github.com/ente-io/ente
|
||||
cd ente/server
|
||||
docker compose up --build
|
||||
```
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> You can also use a pre-built Docker image from `ghcr.io/ente-io/server`
|
||||
> ([More info](https://github.com/ente-io/ente/blob/main/server/docs/docker.md))
|
||||
|
||||
Install the necessary dependencies for running the web client
|
||||
|
||||
```sh
|
||||
# installing npm and yarn
|
||||
|
||||
sudo apt update
|
||||
sudo apt install nodejs npm
|
||||
sudo npm install -g yarn // to install yarn globally
|
||||
```
|
||||
|
||||
Then in a separate terminal, you can run (e.g) the web client
|
||||
|
||||
```sh
|
||||
cd ente/web
|
||||
git submodule update --init --recursive
|
||||
yarn install
|
||||
NEXT_PUBLIC_ENTE_ENDPOINT=http://localhost:8080 yarn dev
|
||||
```
|
||||
|
||||
That's about it. If you open http://localhost:3000, you will be able to create
|
||||
an account on a Ente Photos web app running on your machine, and this web app
|
||||
will be connecting to the server running on your local machine at
|
||||
`localhost:8080`.
|
||||
|
||||
For the mobile apps, you don't even need to build, and can install normal Ente
|
||||
apps and configure them to use your
|
||||
[custom self-hosted server](/self-hosting/guides/custom-server/).
|
||||
|
||||
> If you want to build the mobile apps from source, see the instructions
|
||||
> [here](/self-hosting/guides/mobile-build).
|
||||
|
||||
## Web app with Docker and Compose
|
||||
|
||||
The instructoins in previous section were just a temporary way to run the web
|
||||
app locally. To run the web apps as services, the user has to build a docker
|
||||
image manually.
|
||||
|
||||
> [!IMPORTANT]
|
||||
>
|
||||
> Recurring changes might be made by the team or from community if more
|
||||
> improvements can be made so that we are able to build a full-fledged docker
|
||||
> image.
|
||||
|
||||
```dockerfile
|
||||
FROM node:20-bookworm-slim as builder
|
||||
|
||||
WORKDIR ./ente
|
||||
|
||||
COPY . .
|
||||
COPY apps/ .
|
||||
|
||||
# Will help default to yarn versoin 1.22.22
|
||||
RUN corepack enable
|
||||
|
||||
# Endpoint for Ente Server
|
||||
ENV NEXT_PUBLIC_ENTE_ENDPOINT=https://your-ente-endpoint.com
|
||||
ENV NEXT_PUBLIC_ENTE_ALBUMS_ENDPOINT=https://your-albums-endpoint.com
|
||||
|
||||
RUN yarn cache clean
|
||||
RUN yarn install --network-timeout 1000000000
|
||||
RUN yarn build:photos && yarn build:accounts && yarn build:auth && yarn build:cast
|
||||
|
||||
FROM node:20-bookworm-slim
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY --from=builder /ente/apps/photos/out /app/photos
|
||||
COPY --from=builder /ente/apps/accounts/out /app/accounts
|
||||
COPY --from=builder /ente/apps/auth/out /app/auth
|
||||
COPY --from=builder /ente/apps/cast/out /app/cast
|
||||
|
||||
RUN npm install -g serve
|
||||
|
||||
ENV PHOTOS=3000
|
||||
EXPOSE ${PHOTOS}
|
||||
|
||||
ENV ACCOUNTS=3001
|
||||
EXPOSE ${ACCOUNTS}
|
||||
|
||||
ENV AUTH=3002
|
||||
EXPOSE ${AUTH}
|
||||
|
||||
ENV CAST=3003
|
||||
EXPOSE ${CAST}
|
||||
|
||||
# The albums app does not have navigable pages on it, but the
|
||||
# port will be exposed in-order to self up the albums endpoint
|
||||
# `apps.public-albums` in museum.yaml configuration file.
|
||||
ENV ALBUMS=3004
|
||||
EXPOSE ${ALBUMS}
|
||||
|
||||
CMD ["sh", "-c", "serve /app/photos -l tcp://0.0.0.0:${PHOTOS} & serve /app/accounts -l tcp://0.0.0.0:${ACCOUNTS} & serve /app/auth -l tcp://0.0.0.0:${AUTH} & serve /app/cast -l tcp://0.0.0.0:${CAST}"]
|
||||
```
|
||||
|
||||
The above is a multi-stage Dockerfile which creates a production ready static
|
||||
output of the 4 apps (Photos, Accounts, Auth and Cast) and serves the static
|
||||
content with Caddy.
|
||||
|
||||
Looking at 2 different node base-images doing different tasks in the same
|
||||
Dockerfile would not make sense, but the Dockerfile is divided into two just to
|
||||
improve the build efficiency as building this Dockerfile will arguably take more
|
||||
time.
|
||||
|
||||
Lets build a Docker image from the above Dockerfile. Copy and paste the above
|
||||
Dockerfile contents in the root of your web directory which is inside
|
||||
`ente/web`. Execute the below command to create an image from this Dockerfile.
|
||||
|
||||
```sh
|
||||
# Build the image
|
||||
docker build -t <image-name>:<tag> --no-cache --progress plain .
|
||||
```
|
||||
|
||||
You can always edit the Dockerfile and remove the steps for apps which you do
|
||||
not intend to install on your system (like auth or cast) and opt out of those.
|
||||
|
||||
Regarding Albums App, take a note that they are not apps with navigable pages,
|
||||
if accessed on the web-browser they will simply redirect to ente.web.io.
|
||||
|
||||
## compose.yaml
|
||||
|
||||
Moving ahead, we need to paste the below contents into the compose.yaml inside
|
||||
`ente/server/compose.yaml` under the services section.
|
||||
|
||||
```yaml
|
||||
ente-web:
|
||||
image: <image-name> # name of the image you used while building
|
||||
ports:
|
||||
- 3000:3000
|
||||
- 3001:3001
|
||||
- 3002:3002
|
||||
- 3003:3003
|
||||
- 3004:3004
|
||||
environment:
|
||||
- NODE_ENV=development
|
||||
restart: always
|
||||
```
|
||||
|
||||
Now, we're good to go. All we are left to do now is start the containers.
|
||||
|
||||
```sh
|
||||
docker compose up -d # --build
|
||||
|
||||
# Accessing the logs
|
||||
docker compose logs <container-name>
|
||||
```
|
||||
|
||||
## Configure App Endpoints
|
||||
|
||||
> [!NOTE] Previously, this was dependent on the env variables
|
||||
> `NEXT_ENTE_PUBLIC_ACCOUNTS_ENDPOINT` and etc. Please check the below
|
||||
> documentation to update your setup configurations
|
||||
|
||||
You can configure the web endpoints for the other apps including Accounts,
|
||||
Albums Family and Cast in your `museum.yaml` configuration file. Checkout
|
||||
[`local.yaml`](https://github.com/ente-io/ente/blob/543411254b2bb55bd00a0e515dcafa12d12d3b35/server/configurations/local.yaml#L76-L89)
|
||||
to configure the endpoints. Make sure to setup up your DNS Records accordingly
|
||||
to the similar URL's you set up in `museum.yaml`.
|
||||
|
||||
Next part is to configure the web server.
|
||||
|
||||
# Web server configuration
|
||||
|
||||
The last step ahead is configuring reverse_proxy for the ports on which the apps
|
||||
are being served (you will have to make changes, if you have cusotmized the
|
||||
ports). The web server of choice in this guide is
|
||||
[Caddy](https://caddyserver.com) because with caddy you don't have to manually
|
||||
configure/setup SSL ceritifcates as caddy will take care of that.
|
||||
|
||||
```sh
|
||||
photos.yourdomain.com {
|
||||
reverse_proxy http://localhost:3001
|
||||
# for logging
|
||||
log {
|
||||
level error
|
||||
}
|
||||
}
|
||||
|
||||
auth.yourdomain.com {
|
||||
reverse_proxy http://localhost:3002
|
||||
}
|
||||
# and so on ...
|
||||
```
|
||||
|
||||
Next, start the caddy server :).
|
||||
|
||||
```sh
|
||||
# If caddy service is not enabled
|
||||
sudo systemctl enable caddy
|
||||
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl start caddy
|
||||
```
|
||||
|
||||
## Contributing
|
||||
|
||||
Please start a discussion on the Github Repo if you have any suggestions for the
|
||||
Dockerfile, You can also share your setups on Github Discussions.
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
title: Self Hosting
|
||||
title: Guides - Self-hosting
|
||||
description: Guides for self hosting Ente Photos and/or Ente Auth
|
||||
---
|
||||
|
||||
@@ -10,14 +10,12 @@ walkthroughs, tutorials and other FAQ pages in this directory.
|
||||
|
||||
See the sidebar for existing guides. In particular:
|
||||
|
||||
- If you're just looking to get started, see
|
||||
[configure custom server](custom-server/).
|
||||
- If you're just looking to get started, see installation.
|
||||
|
||||
- For various admin related tasks, e.g. increasing the storage quota on your
|
||||
self hosted instance, see [administering your custom server](admin).
|
||||
- For various administrative tasks, e.g. increasing the storage quota for user
|
||||
on your self-hosted instance, see
|
||||
[user management](/self-hosting/administration/users).
|
||||
|
||||
- For configuring your S3 buckets to get the object storage to work from your
|
||||
mobile device or for fixing an upload errors, see
|
||||
[configuring S3](configuring-s3). There is also a longer
|
||||
[community contributed guide](external-s3) for a more self hosted setup of
|
||||
both the server and web app using external S3 buckets for object storage.
|
||||
[object storage](/self-hosting/administration/object-storage).
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
---
|
||||
title: CLI for Self Hosted Instance
|
||||
description: Guide to configuring Ente CLI for Self Hosted Instance
|
||||
---
|
||||
|
||||
## Self Hosting
|
||||
|
||||
If you are self-hosting the server, you can still configure CLI to export data &
|
||||
perform basic admin actions.
|
||||
|
||||
To do this, first configure the CLI to point to your server. Define a
|
||||
config.yaml and put it either in the same directory as CLI binary or path
|
||||
defined in env variable `ENTE_CLI_CONFIG_DIR`
|
||||
|
||||
```yaml
|
||||
endpoint:
|
||||
api: "http://localhost:8080"
|
||||
```
|
||||
|
||||
You should be able to
|
||||
[add an account](https://github.com/ente-io/ente/blob/main/cli/docs/generated/ente_account_add.md),
|
||||
and subsequently increase the
|
||||
[storage and account validity](https://github.com/ente-io/ente/blob/main/cli/docs/generated/ente_admin_update-subscription.md)
|
||||
using the CLI.
|
||||
|
||||
For the admin actions, you first need to whitelist admin users. You can create
|
||||
`server/museum.yaml`, and whitelist add the admin userID `internal.admins`. See
|
||||
[local.yaml](https://github.com/ente-io/ente/blob/main/server/configurations/local.yaml#L211C1-L232C1)
|
||||
in the server source code for details about how to define this.
|
||||
|
||||
You can use
|
||||
[account list](https://github.com/ente-io/ente/blob/main/cli/docs/generated/ente_account_list.md)
|
||||
command to find the user id of any account.
|
||||
|
||||
```yaml
|
||||
internal:
|
||||
admins:
|
||||
# - 1580559962386440
|
||||
```
|
||||
@@ -1,116 +0,0 @@
|
||||
---
|
||||
title: Installing Ente Standalone (without Docker)
|
||||
description: Installing and setting up Ente standalone without docker.
|
||||
---
|
||||
|
||||
# Installing and Deploying Ente Standalone (without Docker)
|
||||
|
||||
## Running Museum (Ente's server) without Docker
|
||||
|
||||
First, start by installing all the dependencies to get your machine ready for
|
||||
development.
|
||||
|
||||
```sh
|
||||
# For MacOS
|
||||
brew tap homebrew/core
|
||||
brew update
|
||||
brew install go
|
||||
|
||||
# For Ubuntu based distros
|
||||
sudo apt update && sudo apt upgrade
|
||||
sudo apt install golang-go
|
||||
```
|
||||
|
||||
Alternatively, you can also download the latest binaries from
|
||||
['All Release'](https://go.dev/dl/) page from the official website.
|
||||
|
||||
```sh
|
||||
brew install postgres@15
|
||||
# Link the postgres keg
|
||||
brew link postgresql@15
|
||||
|
||||
brew install libsodium
|
||||
|
||||
# For Ubuntu based distros
|
||||
sudo apt install postgresql
|
||||
sudo apt install libsodium23 libsodium-dev
|
||||
```
|
||||
|
||||
The package `libsodium23` might be installed already in some cases.
|
||||
|
||||
Installing pkg-config
|
||||
|
||||
```sh
|
||||
brew install pkg-config
|
||||
|
||||
# For Ubuntu based distros
|
||||
sudo apt install pkg-config
|
||||
```
|
||||
|
||||
## Starting Postgres
|
||||
|
||||
### With pg_ctl
|
||||
|
||||
```sh
|
||||
pg_ctl -D /usr/local/var/postgres -l logfile start
|
||||
```
|
||||
|
||||
Dependeing on the Operating System type the path for postgres binary or
|
||||
configuration file might be different, please check if the command keeps failing
|
||||
for you.
|
||||
|
||||
Ideally, if you are on a Linux system with systemd as the init. You can also
|
||||
start postgres as a systemd service. After Installation execute the following
|
||||
commands:
|
||||
|
||||
```sh
|
||||
sudo systemctl enable postgresql
|
||||
sudo systemctl daemon-reload && sudo systemctl start postgresql
|
||||
```
|
||||
|
||||
### Create user
|
||||
|
||||
```sh
|
||||
createuser -s postgres
|
||||
```
|
||||
|
||||
## Start Museum
|
||||
|
||||
Start by cloning ente to your system.
|
||||
|
||||
```sh
|
||||
git clone https://github.com/ente-io/ente
|
||||
```
|
||||
|
||||
```sh
|
||||
export ENTE_DB_USER=postgres
|
||||
cd ente/server
|
||||
go run cmd/museum/main.go
|
||||
```
|
||||
|
||||
You can also add the export line to your shell's RC file, to avoid exporting the
|
||||
environment variable every time.
|
||||
|
||||
For live reloads, install [air](https://github.com/air-verse/air#installation).
|
||||
Then you can just call air after declaring the required environment variables.
|
||||
For example,
|
||||
|
||||
```sh
|
||||
ENTE_DB_USER=postgres
|
||||
air
|
||||
```
|
||||
|
||||
## Museum as a background service
|
||||
|
||||
Please check the below links if you want to run Museum as a service, both of
|
||||
them are battle tested.
|
||||
|
||||
1. [How to run museum as a systemd service](https://gist.github.com/mngshm/a0edb097c91d1dc45aeed755af310323)
|
||||
2. [Museum.service](https://github.com/ente-io/ente/blob/23e678889189157ecc389c258267685934b83631/server/scripts/deploy/museum.service#L4)
|
||||
|
||||
Once you are done with setting and running Museum, all you are left to do is run
|
||||
the web app and reverse_proxy it with a webserver. You can check the following
|
||||
resources for Deploying your web app.
|
||||
|
||||
1. [Hosting the Web App](https://help.ente.io/self-hosting/guides/web-app).
|
||||
2. [Running Ente Web app as a systemd Service](https://gist.github.com/mngshm/72e32bd483c2129621ed0d74412492fd)
|
||||
@@ -1,14 +0,0 @@
|
||||
---
|
||||
title: System requirements
|
||||
description: System requirements for running Ente's server
|
||||
---
|
||||
|
||||
# System requirements
|
||||
|
||||
There aren't any "minimum" system requirements as such, the server process is
|
||||
very light weight - it's just a single go binary, and it doesn't do any server
|
||||
side ML, so I feel it should be able to run on anything reasonable.
|
||||
|
||||
We've used the server quite easily on small cloud instances, old laptops etc. A
|
||||
community member also reported being able to run the server on
|
||||
[very low-end embedded devices](https://github.com/ente-io/ente/discussions/594).
|
||||
23
docs/docs/self-hosting/guides/systemd.md
Normal file
@@ -0,0 +1,23 @@
|
||||
---
|
||||
title: Running Ente using systemd - Self-hosting
|
||||
description: Running Ente services (Museum and web application) via systemd
|
||||
---
|
||||
|
||||
# Running Ente using `systemd`
|
||||
|
||||
On Linux distributions using `systemd` as initialization system, Ente can be
|
||||
configured to run as a background service, upon system startup by service files.
|
||||
|
||||
## Museum as a background service
|
||||
|
||||
Please check the below links if you want to run Museum as a service, both of
|
||||
them are battle tested.
|
||||
|
||||
1. [How to run museum as a systemd service](https://gist.github.com/mngshm/a0edb097c91d1dc45aeed755af310323)
|
||||
2. [Museum.service](https://github.com/ente-io/ente/blob/23e678889189157ecc389c258267685934b83631/server/scripts/deploy/museum.service#L4)
|
||||
|
||||
Once you are done with setting and running Museum, all you are left to do is run
|
||||
the web app and set up reverse proxy. Check out the documentation for
|
||||
[more information](/self-hosting/installation/manual#step-3-configure-web-application).
|
||||
|
||||
> **Credits:** [mngshm](https://github.com/mngshm)
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
title: Self Hosting with Tailscale (Community)
|
||||
title: Self-hosting with Tailscale - Self-hosting
|
||||
description: Guides for self-hosting Ente Photos and/or Ente Auth with Tailscale
|
||||
---
|
||||
|
||||
@@ -18,13 +18,6 @@ Before getting start keep the following NOTE in mind.
|
||||
> and uploading will not work. This is not necessary for those who are not
|
||||
> behing CGNAT. This guide also work on docker rootless and normal.
|
||||
|
||||
> [!CAUTION] Remember that current docker update 28.0.0 has some bug and cannot
|
||||
> connect to external network. Make sure to install docker-ce 27.5.0,
|
||||
> docker-ce-rootless-extras 27.5.0 and docker-ce-cli 27.5.0. Hopefully docker
|
||||
> 28.1.0 will resolve this issue in next week. Refrence links are
|
||||
> [Moby Github Repo Issues 49511](https://github.com/moby/moby/issues/49511) and
|
||||
> [Moby Github Repo Issues 49519](https://github.com/moby/moby/issues/49519)
|
||||
|
||||
> [!IMPORTANT] For Docker rootless, the user must have local permissions for all
|
||||
> directories required by the Ente-photos self-hosted server. This can be
|
||||
> achieved by running `sudo chown -R 1000:1000 /home/ubuntu/docker/ente`. In the
|
||||
@@ -38,7 +31,7 @@ Before getting start keep the following NOTE in mind.
|
||||
> net.ipv4.ping_group_range = 0 2147483647
|
||||
> ```
|
||||
>
|
||||
> than run `sudo sysctl --system`. Create
|
||||
> then run `sudo sysctl --system`. Create
|
||||
> `~/.config/systemd/user/docker.service.d/override.conf` with the following
|
||||
> content:
|
||||
>
|
||||
@@ -55,7 +48,7 @@ Before getting start keep the following NOTE in mind.
|
||||
## GETTING START WITH SETUP
|
||||
|
||||
First of all create a directory
|
||||
`sudo mkdir -p /home/ubuntu/docker/tsdproxy/config` than `cd docker/tsdproxy`
|
||||
`sudo mkdir -p /home/ubuntu/docker/tsdproxy/config` then `cd docker/tsdproxy`
|
||||
and create compose.yaml file by running `sudo nano compose.yaml`. Populate it
|
||||
with the following:
|
||||
|
||||
@@ -354,3 +347,5 @@ This will list all account details. Copy Acount ID.
|
||||
> ente-museum-1 container from linux terminal. Run
|
||||
> `docker restart ente-museum-1`. All well, now you will have 100TB storage.
|
||||
> Repeat if for any other accounts you want to give unlimited storage access.
|
||||
|
||||
> **Credits:** [A4alli](https://github.com/A4alli)
|
||||
@@ -1,195 +0,0 @@
|
||||
---
|
||||
title: Hosting the web apps
|
||||
description:
|
||||
Building and hosting Ente's web apps, connecting it to your self-hosted
|
||||
server
|
||||
---
|
||||
|
||||
> [!WARNING] NOTE This page covers documentation around self-hosting the web app
|
||||
> manually. If you want to deploy Ente hassle free, please use the
|
||||
> [one line](https://ente.io/blog/self-hosting-quickstart/) command to setup
|
||||
> Ente. This guide might be deprecated in the near future.
|
||||
|
||||
# Web app
|
||||
|
||||
The getting started instructions mention using `yarn dev` (which is an alias of
|
||||
`yarn dev:photos`) to serve your web app.
|
||||
|
||||
> [!IMPORTANT] Please note that Ente's Web App supports the Yarn version 1.22.xx
|
||||
> or 1.22.22 specifically. Make sure to install the right version or modify your
|
||||
> yarn installation to meet the requirements. The user might end up into unknown
|
||||
> version and dependency related errors if yarn is on different version.
|
||||
|
||||
```sh
|
||||
cd ente/web
|
||||
yarn install
|
||||
NEXT_PUBLIC_ENTE_ENDPOINT=http://localhost:8080 yarn dev:photos
|
||||
```
|
||||
|
||||
This is fine for trying the web app and verifying that your self-hosted server
|
||||
is working as expected etc. But if you would like to use the web app for a
|
||||
longer term, then it is recommended to follow the Docker approach.
|
||||
|
||||
## With Docker/Docker Compose (Recommended)
|
||||
|
||||
> [!IMPORTANT]
|
||||
>
|
||||
> Recurring changes might be made by the team or from community if more
|
||||
> improvements can be made so that we are able to build a full-fledged docker
|
||||
> image.
|
||||
|
||||
```dockerfile
|
||||
FROM node:20-bookworm-slim as builder
|
||||
|
||||
WORKDIR ./ente
|
||||
|
||||
COPY . .
|
||||
COPY apps/ .
|
||||
|
||||
# Will help default to yarn versoin 1.22.22
|
||||
RUN corepack enable
|
||||
|
||||
# Endpoint for Ente Server
|
||||
ENV NEXT_PUBLIC_ENTE_ENDPOINT=https://changeme.com
|
||||
ENV NEXT_PUBLIC_ENTE_ALBUMS_ENDPOINT=https://changeme.com
|
||||
|
||||
RUN yarn cache clean
|
||||
RUN yarn install --network-timeout 1000000000
|
||||
RUN yarn build:photos && yarn build:accounts && yarn build:auth && yarn build:cast
|
||||
|
||||
FROM node:20-bookworm-slim
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY --from=builder /ente/apps/photos/out /app/photos
|
||||
COPY --from=builder /ente/apps/accounts/out /app/accounts
|
||||
COPY --from=builder /ente/apps/auth/out /app/auth
|
||||
COPY --from=builder /ente/apps/cast/out /app/cast
|
||||
|
||||
RUN npm install -g serve
|
||||
|
||||
ENV PHOTOS=3000
|
||||
EXPOSE ${PHOTOS}
|
||||
|
||||
ENV ACCOUNTS=3001
|
||||
EXPOSE ${ACCOUNTS}
|
||||
|
||||
ENV AUTH=3002
|
||||
EXPOSE ${AUTH}
|
||||
|
||||
ENV CAST=3003
|
||||
EXPOSE ${CAST}
|
||||
|
||||
# The albums app does not have navigable pages on it, but the
|
||||
# port will be exposed in-order to self up the albums endpoint
|
||||
# `apps.public-albums` in museum.yaml configuration file.
|
||||
ENV ALBUMS=3004
|
||||
EXPOSE ${ALBUMS}
|
||||
|
||||
CMD ["sh", "-c", "serve /app/photos -l tcp://0.0.0.0:${PHOTOS} & serve /app/accounts -l tcp://0.0.0.0:${ACCOUNTS} & serve /app/auth -l tcp://0.0.0.0:${AUTH} & serve /app/cast -l tcp://0.0.0.0:${CAST}"]
|
||||
```
|
||||
|
||||
The above is a multi-stage Dockerfile which creates a production ready static
|
||||
output of the 4 apps (Photos, Accounts, Auth and Cast) and serves the static
|
||||
content with Caddy.
|
||||
|
||||
Looking at 2 different node base-images doing different tasks in the same
|
||||
Dockerfile would not make sense, but the Dockerfile is divided into two just to
|
||||
improve the build efficiency as building this Dockerfile will arguably take more
|
||||
time.
|
||||
|
||||
Lets build a Docker image from the above Dockerfile. Copy and paste the above
|
||||
Dockerfile contents in the root of your web directory which is inside
|
||||
`ente/web`. Execute the below command to create an image from this Dockerfile.
|
||||
|
||||
```sh
|
||||
# Build the image
|
||||
docker build -t <image-name>:<tag> --no-cache --progress plain .
|
||||
```
|
||||
|
||||
You can always edit the Dockerfile and remove the steps for apps which you do
|
||||
not intend to install on your system (like auth or cast) and opt out of those.
|
||||
|
||||
Regarding Albums App, please take a note that they are not web pages with
|
||||
navigable pages, if accessed on the web-browser they will simply redirect to
|
||||
ente.web.io.
|
||||
|
||||
## compose.yaml
|
||||
|
||||
Moving ahead, we need to paste the below contents into the compose.yaml inside
|
||||
`ente/server/compose.yaml` under the services section.
|
||||
|
||||
```yaml
|
||||
ente-web:
|
||||
image: <image-name> # name of the image you used while building
|
||||
ports:
|
||||
- 3000:3000
|
||||
- 3001:3001
|
||||
- 3002:3002
|
||||
- 3003:3003
|
||||
- 3004:3004
|
||||
environment:
|
||||
- NODE_ENV=development
|
||||
restart: always
|
||||
```
|
||||
|
||||
Now, we're good to go. All we are left to do now is start the containers.
|
||||
|
||||
```sh
|
||||
docker compose up -d # --build
|
||||
|
||||
# Accessing the logs
|
||||
docker compose logs <container-name>
|
||||
```
|
||||
|
||||
## Configure App Endpoints
|
||||
|
||||
> [!NOTE] Previously, this was dependent on the env variables
|
||||
> `NEXT_ENTE_PUBLIC_ACCOUNTS_ENDPOINT` and etc. Please check the below
|
||||
> documentation to update your setup configurations
|
||||
|
||||
You can configure the web endpoints for the other apps including Accounts,
|
||||
Albums Family and Cast in your `museum.yaml` configuration file. Checkout
|
||||
[`local.yaml`](https://github.com/ente-io/ente/blob/543411254b2bb55bd00a0e515dcafa12d12d3b35/server/configurations/local.yaml#L76-L89)
|
||||
to configure the endpoints. Make sure to setup up your DNS Records accordingly
|
||||
to the similar URL's you set up in `museum.yaml`.
|
||||
|
||||
Next part is to configure the web server.
|
||||
|
||||
# Web server configuration
|
||||
|
||||
The last step ahead is configuring reverse_proxy for the ports on which the apps
|
||||
are being served (you will have to make changes, if you have cusotmized the
|
||||
ports). The web server of choice in this guide is
|
||||
[Caddy](https://caddyserver.com) because with caddy you don't have to manually
|
||||
configure/setup SSL ceritifcates as caddy will take care of that.
|
||||
|
||||
```sh
|
||||
photos.yourdomain.com {
|
||||
reverse_proxy http://localhost:3001
|
||||
# for logging
|
||||
log {
|
||||
level error
|
||||
}
|
||||
}
|
||||
|
||||
auth.yourdomain.com {
|
||||
reverse_proxy http://localhost:3002
|
||||
}
|
||||
# and so on ...
|
||||
```
|
||||
|
||||
Next, start the caddy server :).
|
||||
|
||||
```sh
|
||||
# If caddy service is not enabled
|
||||
sudo systemctl enable caddy
|
||||
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl start caddy
|
||||
```
|
||||
|
||||
## Contributing
|
||||
|
||||
Please start a discussion on the Github Repo if you have any suggestions for the
|
||||
Dockerfile, You can also share your setups on Github Discussions.
|
||||
@@ -1,25 +1,29 @@
|
||||
---
|
||||
title: Self Hosting
|
||||
description: Getting started self hosting Ente Photos and/or Ente Auth
|
||||
title: Quickstart - Self-hosting
|
||||
description: Getting started with self-hosting Ente
|
||||
---
|
||||
|
||||
# Self Hosting
|
||||
# Quickstart
|
||||
|
||||
The entire source code for Ente is open source, including the servers. This is
|
||||
the same code we use for our own cloud service.
|
||||
If you're looking to spin up Ente on your server, you are in the right place!
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> You might find our [blog post](https://ente.io/blog/open-sourcing-our-server/)
|
||||
> announcing the open sourcing of our server useful.
|
||||
Our entire source code
|
||||
([including the server](https://ente.io/blog/open-sourcing-our-server/)) is open
|
||||
source. This is the same code we use on production.
|
||||
|
||||
## System requirements
|
||||
For a quick preview, make sure your system meets the requirements mentioned
|
||||
below. After trying the preview, you can explore other ways of self-hosting Ente
|
||||
on your server as described in the documentation.
|
||||
|
||||
The server has minimal resource requirements, running as a lightweight Go
|
||||
binary. It performs well on small cloud instances, old laptops, and even
|
||||
[low-end embedded devices](https://github.com/ente-io/ente/discussions/594).
|
||||
## Requirements
|
||||
|
||||
## Getting started
|
||||
- A system with at least 1 GB of RAM and 1 CPU core
|
||||
- [Docker Compose](https://docs.docker.com/compose/)
|
||||
|
||||
> For more details, check out the
|
||||
> [requirements page](/self-hosting/installation/requirements).
|
||||
|
||||
## Set up the server
|
||||
|
||||
Run this command on your terminal to setup Ente.
|
||||
|
||||
@@ -27,12 +31,57 @@ Run this command on your terminal to setup Ente.
|
||||
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ente-io/ente/main/server/quickstart.sh)"
|
||||
```
|
||||
|
||||
The above `curl` command pulls the Docker image, creates a directory `my-ente`
|
||||
in the current working directory and starts all containers required to run Ente.
|
||||
This creates a directory `my-ente` in the current working directory, prompts to
|
||||
start the cluster with needed containers after pulling the images required to
|
||||
run Ente.
|
||||
|
||||

|
||||
::: note Make sure to modify the default values in `compose.yaml` and
|
||||
`museum.yaml` if you wish to change endpoints, bucket configuration or server
|
||||
configuration. :::
|
||||
|
||||

|
||||
## Try the web app
|
||||
|
||||
Open Ente Photos web app at `http://<machine-ip>:3000` (or
|
||||
`http://localhost:3000` if using on same local machine). Select **Don't have an
|
||||
account?** to create a new user.
|
||||
|
||||
Follow the prompts to sign up.
|
||||
|
||||
<div style="display: flex; gap: 10px;">
|
||||
<img alt="Onboarding screen" src="/onboarding.png" style="width: 50%; height: auto;">
|
||||
<img alt="Sign up page" src="/sign-up.png" style="width: 50%; height: auto;">
|
||||
</div>
|
||||
|
||||
Enter the verification code by checking the cluster logs using
|
||||
`sudo docker compose logs`.
|
||||
|
||||

|
||||
|
||||
Upload a picture via the web user interface.
|
||||
|
||||
Alternatively, if using Ente Auth, get started by adding an account (assuming
|
||||
you are running Ente Auth at `http://<machine-ip>:3002` or
|
||||
`http://localhost:3002`).
|
||||
|
||||
## Try the mobile app
|
||||
|
||||
You can install Ente Photos from [here](/photos/faq/installing) and Ente Auth
|
||||
from [here](/auth/faq/installing).
|
||||
|
||||
Connect to your server from
|
||||
[mobile apps](/self-hosting/installation/post-install/#step-6-configure-apps-to-use-your-server).
|
||||
|
||||
## What next?
|
||||
|
||||
You may wish to install using a different way for your needs. Check the
|
||||
"Installation" section for information regarding that.
|
||||
|
||||
You can import your pictures from Google Takeout or from other services to Ente
|
||||
Photos. For more information, check out our
|
||||
[migration guide](/photos/migration/) for more information.
|
||||
|
||||
You can import your codes from other authenticator providers to Ente Auth. Check
|
||||
out our [migration guide](/auth/migration/) for more information.
|
||||
|
||||
## Queries?
|
||||
|
||||
|
||||
64
docs/docs/self-hosting/installation/compose.md
Normal file
@@ -0,0 +1,64 @@
|
||||
---
|
||||
title: Docker Compose - Self-hosting
|
||||
description: Running Ente with Docker Compose from source
|
||||
---
|
||||
|
||||
# Docker Compose
|
||||
|
||||
If you wish to run Ente via Docker Compose from source, do the following:
|
||||
|
||||
## Requirements
|
||||
|
||||
Check out the [requirements](/self-hosting/installation/requirements) page to
|
||||
get started.
|
||||
|
||||
## Step 1: Clone the repository
|
||||
|
||||
Clone the repository. Change into the `server/config` directory of the
|
||||
repository, where the Compose file for running the cluster is present.
|
||||
|
||||
Run the following command for the same:
|
||||
|
||||
```sh
|
||||
git clone https://github.com/ente-io/ente
|
||||
cd ente/server/config
|
||||
```
|
||||
|
||||
## Step 2: Populate the configuration file and environment variables
|
||||
|
||||
In order to run the cluster, you will have to provide environment variable
|
||||
values.
|
||||
|
||||
Copy the configuration files for modification by the following command inside
|
||||
`server/config` directory of the repository.
|
||||
|
||||
This allows you to modify configuration without having to face hassle while
|
||||
pulling in latest changes.
|
||||
|
||||
```shell
|
||||
# Inside the cloned repository's directory (usually `ente`)
|
||||
cd server/config
|
||||
cp example.env .env
|
||||
cp example.yaml museum.yaml
|
||||
```
|
||||
|
||||
Change the values present in `.env` file along with `museum.yaml` file
|
||||
accordingly.
|
||||
|
||||
## Step 3: Start the cluster
|
||||
|
||||
Start the cluster by running the following command:
|
||||
|
||||
```sh
|
||||
docker compose up --build
|
||||
```
|
||||
|
||||
This builds Museum and web applications based on the Dockerfile and starts the
|
||||
containers needed for Ente.
|
||||
|
||||
::: tip
|
||||
|
||||
Check out [post-installations steps](/self-hosting/installation/post-install/)
|
||||
for further usage.
|
||||
|
||||
:::
|
||||
206
docs/docs/self-hosting/installation/config.md
Normal file
@@ -0,0 +1,206 @@
|
||||
---
|
||||
title: Configuration - Self-hosting
|
||||
description:
|
||||
"Information about all the configuration variables needed to run Ente with
|
||||
museum.yaml"
|
||||
---
|
||||
|
||||
# Configuration
|
||||
|
||||
Museum is designed to be configured either via environment variables or via
|
||||
YAML. We recommend using YAML for maintaining your configuration as it can be
|
||||
backed up easily, helping in restoration.
|
||||
|
||||
## Configuration File
|
||||
|
||||
Museum's configuration file (`museum.yaml`) is responsible for making database
|
||||
configuration, bucket configuration, internal configuration, etc. accessible for
|
||||
other internal services.
|
||||
|
||||
By default, Museum runs in local environment, thus `local.yaml` configuration is
|
||||
loaded.
|
||||
|
||||
If `ENVIRONMENT` environment variable is set (say, to `production`), Museum will
|
||||
attempt to load `configurations/production.yaml`.
|
||||
|
||||
If `credentials-file` is defined and found, it overrides the defaults.
|
||||
|
||||
Use `museum.yaml` file for declaring configuration over `local.yaml`.
|
||||
|
||||
All configuration values can be overridden via environment variables using the
|
||||
`ENTE_` prefix and replacing dots (`.`) or hyphens (`-`) with underscores (`_`).
|
||||
|
||||
Museum reads configuration from `museum.yaml`. Any environment variables
|
||||
prefixed with `ENTE_` takes precedence.
|
||||
|
||||
For example,
|
||||
|
||||
```yaml
|
||||
s3:
|
||||
b2-eu-cen:
|
||||
endpoint:
|
||||
```
|
||||
|
||||
in `museum.yaml` is read as `s3.b2-eu-cen.endpoint` by Museum.
|
||||
|
||||
`ENTE_S3_B2_EU_CEN_ENDPOINT` declared as environment variable is same as the
|
||||
above and `ENTE_S3_B2_EU_CEN_ENDPOINT` overrides `s3.b2-eu-cen.endpoint`.
|
||||
|
||||
### General Settings
|
||||
|
||||
| Variable | Description | Default |
|
||||
| ------------------ | --------------------------------------------------------- | ------------------ |
|
||||
| `credentials-file` | Path to optional credentials override file | `credentials.yaml` |
|
||||
| `credentials-dir` | Directory to look for credentials (TLS, service accounts) | `credentials/` |
|
||||
| `log-file` | Log output path. Required in production. | `""` |
|
||||
|
||||
### HTTP
|
||||
|
||||
| Variable | Description | Default |
|
||||
| -------------- | --------------------------------- | ------- |
|
||||
| `http.use-tls` | Enables TLS and binds to port 443 | `false` |
|
||||
|
||||
### App Endpoints
|
||||
|
||||
The web apps for Ente (Auth, Cast, Albums) use different endpoints.
|
||||
|
||||
These endpoints are configurable in `museum.yaml` under the apps.\* section.
|
||||
|
||||
Upon configuration, the application will start utilizing the specified endpoints
|
||||
instead of Ente's production instances or local endpoints (overridden values
|
||||
used for Compose and quickstart for ease of use.)
|
||||
|
||||
| Variable | Description | Default |
|
||||
| -------------------- | ------------------------------------------------------- | -------------------------- |
|
||||
| `apps.public-albums` | Albums app base endpoint for public sharing | `https://albums.ente.io` |
|
||||
| `apps.cast` | Cast app base endpoint | `https://cast.ente.io` |
|
||||
| `apps.accounts` | Accounts app base endpoint (used for passkey-based 2FA) | `https://accounts.ente.io` |
|
||||
|
||||
### Database
|
||||
|
||||
| Variable | Description | Default |
|
||||
| ------------- | -------------------------- | ----------- |
|
||||
| `db.host` | DB hostname | `localhost` |
|
||||
| `db.port` | DB port | `5432` |
|
||||
| `db.name` | Database name | `ente_db` |
|
||||
| `db.sslmode` | SSL mode for DB connection | `disable` |
|
||||
| `db.user` | Database username | |
|
||||
| `db.password` | Database password | |
|
||||
| `db.extra` | Additional DSN parameters | |
|
||||
|
||||
### Object Storage
|
||||
|
||||
The `s3` section within `museum.yaml` is by default configured to use local
|
||||
MinIO buckets when using `quickstart.sh` or Docker Compose.
|
||||
|
||||
If you wish to use an external S3 provider, you can edit the configuration with
|
||||
your provider's credentials, and set `are_local_buckets` to `false`.
|
||||
|
||||
MinIO uses the port `3200` for API Endpoints. Web Console can be accessed at
|
||||
http://localhost:3201 by enabling port `3201` in the Compose file.
|
||||
|
||||
If you face any issues related to uploads then check out
|
||||
[CORS](/self-hosting/administration/object-storage#cors-cross-origin-resource-sharing)
|
||||
and [troubleshooting](/self-hosting/troubleshooting/uploads) sections.
|
||||
|
||||
| Variable | Description | Default |
|
||||
| -------------------------------------- | -------------------------------------------- | ------- |
|
||||
| `s3.b2-eu-cen` | Primary hot storage S3 config | |
|
||||
| `s3.wasabi-eu-central-2-v3.compliance` | Whether to disable compliance lock on delete | `true` |
|
||||
| `s3.scw-eu-fr-v3` | Optional secondary S3 config | |
|
||||
| `s3.wasabi-eu-central-2-derived` | Derived data storage | |
|
||||
| `s3.are_local_buckets` | Use local MinIO-compatible storage | `false` |
|
||||
| `s3.use_path_style_urls` | Enable path-style URLs for MinIO | `false` |
|
||||
|
||||
### Encryption Keys
|
||||
|
||||
These values are used for encryption of user e-mails. Default values are
|
||||
provided by Museum.
|
||||
|
||||
They are generated by random in quickstart script, so no intervention is
|
||||
necessary if using quickstart.
|
||||
|
||||
However, if you are using Ente for long-term needs and you have not installed
|
||||
Ente via quickstart, consider generating values for these along with [JWT](#jwt)
|
||||
by following the steps described below:
|
||||
|
||||
```shell
|
||||
# If you have not cloned already
|
||||
git clone https://github.com/ente-io/ente
|
||||
|
||||
# Generate the values
|
||||
cd ente/server
|
||||
go run tools/gen-random-keys/main.go
|
||||
```
|
||||
|
||||
| Variable | Description | Default |
|
||||
| ---------------- | ------------------------------ | ----------- |
|
||||
| `key.encryption` | Key for encrypting user emails | Pre-defined |
|
||||
| `key.hash` | Hash key | Pre-defined |
|
||||
|
||||
### JWT
|
||||
|
||||
| Variable | Description | Default |
|
||||
| ------------ | ----------------------- | ---------- |
|
||||
| `jwt.secret` | Secret for signing JWTs | Predefined |
|
||||
|
||||
### Email
|
||||
|
||||
| Variable | Description | Default |
|
||||
| ------------------ | ---------------------------- | ------- |
|
||||
| `smtp.host` | SMTP server host | |
|
||||
| `smtp.port` | SMTP server port | |
|
||||
| `smtp.username` | SMTP auth username | |
|
||||
| `smtp.password` | SMTP auth password | |
|
||||
| `smtp.email` | Sender email address | |
|
||||
| `smtp.sender-name` | Custom name for email sender | |
|
||||
| `transmail.key` | Zeptomail API key | |
|
||||
|
||||
### WebAuthn Passkey Support
|
||||
|
||||
| Variable | Description | Default |
|
||||
| -------------------- | ---------------------------- | --------------------------- |
|
||||
| `webauthn.rpid` | Relying Party ID | `localhost` |
|
||||
| `webauthn.rporigins` | Allowed origins for WebAuthn | `["http://localhost:3001"]` |
|
||||
|
||||
### Internal
|
||||
|
||||
| Variable | Description | Default |
|
||||
| -------------------------------------------- | --------------------------------------------- | ------- |
|
||||
| `internal.silent` | Suppress external effects (e.g. email alerts) | `false` |
|
||||
| `internal.health-check-url` | External healthcheck URL | |
|
||||
| `internal.hardcoded-ott` | Predefined OTPs for testing | |
|
||||
| `internal.hardcoded-ott.emails` | E-mail addresses with hardcoded OTTs | `[]` |
|
||||
| `internal.hardcoded-ott.local-domain-suffix` | Suffix for which hardcoded OTT is to be used | |
|
||||
| `internal.hardcoded-ott.local-domain-value` | Hardcoded OTT value for the above suffix | |
|
||||
| `internal.admins` | List of admin user IDs | `[]` |
|
||||
| `internal.admin` | Single admin user ID | |
|
||||
| `internal.disable-registration` | Disable user registration | `false` |
|
||||
|
||||
### Replication
|
||||
|
||||
By default, replication of objects (photos, thumbnails, videos) is disabled and
|
||||
only one bucket is used.
|
||||
|
||||
To enable replication, set `replication.enabled` to `true`. For this to work, 3
|
||||
buckets have to be configured in total.
|
||||
|
||||
| Variable | Description | Default |
|
||||
| -------------------------- | ------------------------------------ | ----------------- |
|
||||
| `replication.enabled` | Enable replication across buckets | `false` |
|
||||
| `replication.worker-url` | Cloudflare Worker for replication | |
|
||||
| `replication.worker-count` | Number of goroutines for replication | `6` |
|
||||
| `replication.tmp-storage` | Temp directory for replication | `tmp/replication` |
|
||||
|
||||
### Background Jobs
|
||||
|
||||
This configuration is for enabling background cron jobs for tasks such as
|
||||
sending mails, removing unused objects (clean up) and worker configuration for
|
||||
the same.
|
||||
|
||||
| Variable | Description | Default |
|
||||
| --------------------------------------------- | --------------------------------------- | ------- |
|
||||
| `jobs.cron.skip` | Skip all cron jobs | `false` |
|
||||
| `jobs.remove-unreported-objects.worker-count` | Workers for removing unreported objects | `1` |
|
||||
| `jobs.clear-orphan-objects.enabled` | Enable orphan cleanup | `false` |
|
||||
| `jobs.clear-orphan-objects.prefix` | Prefix filter for orphaned objects | |
|
||||
53
docs/docs/self-hosting/installation/env-var.md
Normal file
@@ -0,0 +1,53 @@
|
||||
---
|
||||
title: Environment variables and defaults - Self-hosting
|
||||
description:
|
||||
"Information about all the configuration variables needed to run Ente along
|
||||
with description on default configuration"
|
||||
---
|
||||
|
||||
# Environment variables and defaults
|
||||
|
||||
The environment variables needed for running Ente and the default configuration
|
||||
are documented below:
|
||||
|
||||
## Environment Variables
|
||||
|
||||
A self-hosted Ente instance has to specify endpoints for both Museum (the
|
||||
server) and web apps.
|
||||
|
||||
This document outlines the essential environment variables and port mappings of
|
||||
the web apps.
|
||||
|
||||
Here's the list of environment variables that is used by the cluster:
|
||||
|
||||
| Service | Environment Variable | Description | Default Value |
|
||||
| ---------- | --------------------- | ----------------------------------------------------------------------------------------------- | ------------------------------- |
|
||||
| `web` | `ENTE_API_ORIGIN` | Alias for `NEXT_PUBLIC_ENTE_ENDPOINT`. API Endpoint for Ente's API (Museum). | http://localhost:8080 |
|
||||
| `web` | `ENTE_ALBUMS_ORIGIN` | Alias for `NEXT_PUBLIC_ENTE_ALBUMS_ENDPOINT`. Base URL for Ente Album, used for public sharing. | http://localhost:3002 |
|
||||
| `postgres` | `POSTGRES_USER` | Username for PostgreSQL database | `pguser` |
|
||||
| `postgres` | `POSTGRES_DB` | Name of database for use with Ente | `ente_db` |
|
||||
| `postgres` | `POSTGRES_PASSWORD` | Password for PostgreSQL database's user | Randomly generated (quickstart) |
|
||||
| `minio` | `MINIO_ROOT_USER` | Username for MinIO | Randomly generated (quickstart) |
|
||||
| `minio` | `MINIO_ROOT_PASSWORD` | Password for MinIO | Randomly generated (quickstart) |
|
||||
|
||||
## Default Configuration
|
||||
|
||||
Self-hosted Ente clusters have certain default configuration for ease of use,
|
||||
which is documented below to understand its behavior:
|
||||
|
||||
### Ports
|
||||
|
||||
The below format is according to how ports are mapped in Docker when using the
|
||||
quickstart script. The mapping is of the format `<host-port>:<container-port>`
|
||||
in `ports` in compose file.
|
||||
|
||||
| Service | Type | Host Port | Container Port |
|
||||
| ------------------------------------------------------- | -------- | --------- | -------------- |
|
||||
| Museum | Server | 8080 | 8080 |
|
||||
| Ente Photos | Web | 3000 | 3000 |
|
||||
| Ente Accounts | Web | 3001 | 3001 |
|
||||
| Ente Albums | Web | 3002 | 3002 |
|
||||
| [Ente Auth](https://ente.io/auth/) | Web | 3003 | 3003 |
|
||||
| [Ente Cast](https://help.ente.io/photos/features/cast/) | Web | 3004 | 3004 |
|
||||
| MinIO | S3 | 3200 | 3200 |
|
||||
| PostgreSQL | Database | | 5432 |
|
||||
215
docs/docs/self-hosting/installation/manual.md
Normal file
@@ -0,0 +1,215 @@
|
||||
---
|
||||
title: Manual setup (without Docker) - Self-hosting
|
||||
description: Installing and setting up Ente without Docker
|
||||
---
|
||||
|
||||
# Manual setup (without Docker)
|
||||
|
||||
If you wish to run Ente from source without using Docker, follow the steps
|
||||
described below:
|
||||
|
||||
## Requirements
|
||||
|
||||
1. **Go:** Install Go on your system. This is needed for building Museum (Ente's
|
||||
server)
|
||||
|
||||
```shell
|
||||
sudo apt update && sudo apt upgrade
|
||||
sudo apt install golang-go
|
||||
```
|
||||
|
||||
Alternatively, you can also download the latest binaries from the
|
||||
[official website](https://go.dev/dl/).
|
||||
|
||||
2. **PostgreSQL and `libsodium`:** Install PostgreSQL (database) and `libsodium`
|
||||
(high level API for encryption) via package manager.
|
||||
|
||||
```shell
|
||||
sudo apt install postgresql
|
||||
sudo apt install libsodium23 libsodium-dev
|
||||
```
|
||||
|
||||
Start the database using `systemd` automatically when the system starts.
|
||||
|
||||
```shell
|
||||
sudo systemctl enable postgresql
|
||||
sudo systemctl start postgresql
|
||||
```
|
||||
|
||||
Ensure the database is running using
|
||||
|
||||
```shell
|
||||
sudo systemctl status postgresql
|
||||
```
|
||||
|
||||
3. **`pkg-config`:** Install `pkg-config` for dependency handling.
|
||||
|
||||
```shell
|
||||
sudo apt install pkg-config
|
||||
```
|
||||
|
||||
4. **yarn, npm and Node.js:** Needed for building the web application.
|
||||
|
||||
Install npm and Node using your package manager.
|
||||
|
||||
```shell
|
||||
sudo apt install npm nodejs
|
||||
```
|
||||
|
||||
Install yarn by following the
|
||||
[official documentation](https://yarnpkg.com/getting-started/install)
|
||||
|
||||
5. **Git:** Needed for cloning the repository and pulling in latest changes
|
||||
|
||||
6. **Caddy:** Used for setting reverse proxy and file servers
|
||||
|
||||
7. **Object Storage:** Ensure you have an object storage configured for usage,
|
||||
needed for storing files. You can choose to run MinIO or Garage locally
|
||||
without Docker, however, an external bucket will be reliable and suited for
|
||||
long-term storage.
|
||||
|
||||
## Step 1: Clone the repository
|
||||
|
||||
Start by cloning Ente's repository from GitHub to your local machine.
|
||||
|
||||
```shell
|
||||
git clone https://github.com/ente-io/ente
|
||||
```
|
||||
|
||||
## Step 2: Configure Museum (Ente's server)
|
||||
|
||||
1. Install all the needed dependencies for the server.
|
||||
|
||||
```shell
|
||||
# Change into server directory, where the source code for Museum is
|
||||
# present inside the repo
|
||||
cd ente/server
|
||||
|
||||
# Install the needed dependencies
|
||||
go mod tidy
|
||||
```
|
||||
|
||||
2. Build the server. The server binary should be available as `./main` relative
|
||||
to `server` directory
|
||||
|
||||
``` shell
|
||||
go build cmd/museum/main.go
|
||||
```
|
||||
|
||||
3. Create `museum.yaml` file inside `server` for configuring the needed
|
||||
variables. You can copy the templated configuration file for editing with
|
||||
ease.
|
||||
|
||||
```shell
|
||||
cp config/example.yaml ./museum.yaml
|
||||
```
|
||||
|
||||
4. Run the server
|
||||
|
||||
```shell
|
||||
./main
|
||||
```
|
||||
|
||||
Museum should be accessible at `http://localhost:8080`
|
||||
|
||||
## Step 3: Configure Web Application
|
||||
|
||||
1. Install the dependencies for web application. Enable corepack if prompted.
|
||||
|
||||
```shell
|
||||
# Change into web directory, this is where all the applications
|
||||
# will be managed and built
|
||||
cd web
|
||||
|
||||
# Install dependencies
|
||||
yarn install
|
||||
```
|
||||
|
||||
2. Configure the environment variables in your corresponding shell's
|
||||
configuration file (`.bashrc`, `.zshrc`)
|
||||
```shell
|
||||
# Replace this with actual endpoint for Museum
|
||||
export NEXT_PUBLIC_ENTE_ENDPOINT=http://localhost:8080
|
||||
# Replace this with actual endpoint for Albums
|
||||
export NEXT_PUBLIC_ENTE_ALBUMS_ENDPOINT=http://localhost:3002
|
||||
```
|
||||
3. Build the needed applications (Photos, Accounts, Auth, Cast) as per your
|
||||
needs:
|
||||
|
||||
```shell
|
||||
# These commands are executed inside web directory
|
||||
# Build photos. Build output to be served is present at apps/photos/out
|
||||
yarn build
|
||||
|
||||
# Build accounts. Build output to be served is present at apps/accounts/out
|
||||
yarn build:accounts
|
||||
|
||||
# Build auth. Build output to be served is present at apps/auth/out
|
||||
yarn build:auth
|
||||
|
||||
# Build cast. Build output to be served is present at apps/cast/out
|
||||
yarn build:cast
|
||||
```
|
||||
|
||||
4. Copy the output files to `/var/www/ente/apps` for easier management.
|
||||
|
||||
```shell
|
||||
mkdir -p /var/www/ente/apps
|
||||
|
||||
# Photos
|
||||
sudo cp -r apps/photos/out /var/www/ente/apps/photos
|
||||
# Accounts
|
||||
sudo cp -r apps/accounts/out /var/www/ente/apps/accounts
|
||||
# Auth
|
||||
sudo cp -r apps/auth/out /var/www/ente/apps/auth
|
||||
# Cast
|
||||
sudo cp -r apps/cast/out /var/www/ente/apps/cast
|
||||
```
|
||||
|
||||
5. Set up file server using Caddy by editing `Caddyfile`, present at
|
||||
`/etc/caddy/Caddyfile`.
|
||||
|
||||
```groovy
|
||||
# Replace the ports with domain names if you have subdomains configured and need HTTPS
|
||||
:3000 {
|
||||
root * /var/www/ente/apps/out/photos
|
||||
file_server
|
||||
try_files {path} {path}.html /index.html
|
||||
}
|
||||
|
||||
:3001 {
|
||||
root * /var/www/ente/apps/out/accounts
|
||||
file_server
|
||||
try_files {path} {path}.html /index.html
|
||||
}
|
||||
|
||||
:3002 {
|
||||
root * /var/www/ente/apps/out/photos
|
||||
file_server
|
||||
try_files {path} {path}.html /index.html
|
||||
}
|
||||
|
||||
:3003 {
|
||||
root * /var/www/ente/apps/out/auth
|
||||
file_server
|
||||
try_files {path} {path}.html /index.html
|
||||
}
|
||||
|
||||
:3004 {
|
||||
root * /var/www/ente/apps/out/cast
|
||||
file_server
|
||||
try_files {path} {path}.html /index.html
|
||||
}
|
||||
```
|
||||
|
||||
The web application for Ente Photos should be accessible at
|
||||
http://localhost:3000, check out the
|
||||
[default ports](/self-hosting/installation/env-var#ports) for more
|
||||
information.
|
||||
|
||||
::: tip
|
||||
|
||||
Check out [post-installations steps](/self-hosting/installation/post-install/)
|
||||
for further usage.
|
||||
|
||||
:::
|
||||
|
Before Width: | Height: | Size: 246 KiB After Width: | Height: | Size: 246 KiB |
172
docs/docs/self-hosting/installation/post-install/index.md
Normal file
@@ -0,0 +1,172 @@
|
||||
---
|
||||
title: Post-installation steps - Self-hosting
|
||||
description: Steps to be followed post-installation for smooth experience
|
||||
---
|
||||
|
||||
# Post-installation steps
|
||||
|
||||
A list of steps that should be done after installing Ente are described below:
|
||||
|
||||
## Step 1: Creating first user
|
||||
|
||||
The first user to be created will be treated as an admin user by default.
|
||||
|
||||
Once Ente is up and running, the Ente Photos web app will be accessible on
|
||||
`http://localhost:3000`.
|
||||
|
||||
Select **Don't have an account?** to create a new user. Follow the prompts to
|
||||
sign up.
|
||||
|
||||
<div style="display: flex; gap: 10px;">
|
||||
<img alt="Onboarding screen" src="/onboarding.png" style="width: 50%; height: auto;">
|
||||
<img alt="Sign up page" src="/sign-up.png" style="width: 50%; height: auto;">
|
||||
</div>
|
||||
|
||||
Enter the verification code to complete registration.
|
||||
|
||||
This code can be found in the server logs, which should be shown in your
|
||||
terminal where you started the Docker Compose cluster.
|
||||
|
||||
If not, access the server logs inside the folder where Compose file resides.
|
||||
|
||||
```shell
|
||||
sudo docker compose logs
|
||||
```
|
||||
|
||||
If running Museum without Docker, the code should be visible in the terminal
|
||||
(stdout).
|
||||
|
||||

|
||||
|
||||
## Step 2: Whitelist admins
|
||||
|
||||
1. Connect to `ente_db` (the database used for storing data related to Ente).
|
||||
|
||||
```shell
|
||||
# Change the DB name and DB user name if you use different
|
||||
# values.
|
||||
|
||||
# If using Docker docker exec -it <postgres-ente-container-name>
|
||||
psql -U pguser -d ente_db
|
||||
|
||||
# Or when using psql directly
|
||||
psql -U pguser -d ente_db
|
||||
```
|
||||
|
||||
2. Get the user ID of the first user by running the following PSQL command:
|
||||
|
||||
```sql
|
||||
SELECT * from users;
|
||||
```
|
||||
|
||||
3. Edit `internal.admins` or `internal.admin` (if you wish to whitelist only
|
||||
single user) in `museum.yaml` to add the user ID you wish to whitelist.
|
||||
|
||||
- For multiple admins:
|
||||
|
||||
```yaml
|
||||
internal:
|
||||
admins:
|
||||
- <user_id>
|
||||
```
|
||||
|
||||
- For single admin:
|
||||
|
||||
```yaml
|
||||
internal:
|
||||
admin: <user_id>
|
||||
```
|
||||
|
||||
4. Restart Museum by restarting the cluster
|
||||
|
||||
::: tip Restart your Compose clusters whenever you make changes
|
||||
|
||||
If you have edited the Compose file or configuration file (`museum.yaml`), make
|
||||
sure to recreate the cluster's containers.
|
||||
|
||||
You can do this by the following command:
|
||||
|
||||
```shell
|
||||
docker compose down && docker compose up -d
|
||||
```
|
||||
|
||||
:::
|
||||
|
||||
## Step 3: Configure application endpoints
|
||||
|
||||
You may wish to access some of the applications such as Auth, Albums, Cast via
|
||||
your instance's endpoints through the application instead of our production
|
||||
instances.
|
||||
|
||||
You can do so by editing the `apps` section in `museum.yaml` to use the base
|
||||
endpoints of the corresponding web applications.
|
||||
|
||||
```yaml
|
||||
# Replace yourdomain.tld with actual domain
|
||||
apps:
|
||||
public-albums: https://albums.ente.yourdomain.tld
|
||||
cast: https://cast.ente.yourdomain.tld
|
||||
auth: https://auth.ente.yourdomain.tld
|
||||
```
|
||||
|
||||
## Step 4: Make it publicly accessible
|
||||
|
||||
You may wish to access Ente on public Internet. You can do so by configuring a
|
||||
reverse proxy with software such as Caddy, NGINX, Traefik.
|
||||
|
||||
Check out our [documentation](/self-hosting/administration/reverse-proxy) for
|
||||
more information.
|
||||
|
||||
If you do not wish to make it accessible via Internet, we recommend you to use
|
||||
[Tailscale](/self-hosting/guides/tailscale) for convenience. Alternately, you
|
||||
can use your IP address for accessing the application in your local network,
|
||||
though this poses challenges with respect to object storage.
|
||||
|
||||
## Step 5: Download mobile and desktop app
|
||||
|
||||
You can install Ente Photos by following the
|
||||
[installation section](/photos/faq/installing).
|
||||
|
||||
You can also install Ente Auth (if you are planning to use Auth) by following
|
||||
the [installation section](/auth/faq/installing).
|
||||
|
||||
## Step 6: Configure apps to use your server
|
||||
|
||||
You can modify Ente mobile apps and CLI to connect to your server.
|
||||
|
||||
### Mobile
|
||||
|
||||
Tap the onboarding screen 7 times to modify developer settings. Enter your Ente
|
||||
server's endpoint.
|
||||
|
||||
<div style="display: flex; gap: 10px;">
|
||||
<img src="/developer-settings.png" alt="Developer Settings" height="50%" width="50%" />
|
||||
<img src="/developer-settings-endpoint.png" alt="Developer Settings - Server Endpoint" height="50%" width="50%" />
|
||||
</div>
|
||||
|
||||
### Desktop
|
||||
|
||||
Tap 7 times on the onboarding screen to configure the server endpoint to be
|
||||
used.
|
||||
|
||||
<div align="center">
|
||||
|
||||
{width=400px}
|
||||
|
||||
</div>
|
||||
|
||||
## Step 7: Configure Ente CLI
|
||||
|
||||
You can download Ente CLI from
|
||||
[here](https://github.com/ente-io/ente/releases?q=tag%3Acli)
|
||||
|
||||
Check our [documentation](/self-hosting/administration/cli) on how to use Ente
|
||||
CLI for managing self-hosted instances.
|
||||
|
||||
::: info For upgrading
|
||||
|
||||
Check out our [upgrading documentation](/self-hosting/installation/upgrade) for
|
||||
various installation methods.
|
||||
|
||||
:::
|
||||
|
Before Width: | Height: | Size: 231 KiB After Width: | Height: | Size: 231 KiB |
|
Before Width: | Height: | Size: 138 KiB After Width: | Height: | Size: 138 KiB |
42
docs/docs/self-hosting/installation/quickstart.md
Normal file
@@ -0,0 +1,42 @@
|
||||
---
|
||||
title: Quickstart script (Recommended) - Self-hosting
|
||||
description: Self-hosting Ente with quickstart script
|
||||
---
|
||||
|
||||
# Quickstart script (Recommended)
|
||||
|
||||
We provide a quickstart script which can be used for self-hosting Ente on your
|
||||
machine in less than a minute.
|
||||
|
||||
## Requirements
|
||||
|
||||
Check out the [requirements](/self-hosting/installation/requirements) page to
|
||||
get started.
|
||||
|
||||
## Getting started
|
||||
|
||||
Run this command on your terminal to setup Ente.
|
||||
|
||||
```sh
|
||||
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ente-io/ente/main/server/quickstart.sh)"
|
||||
```
|
||||
|
||||
The above `curl` command does the following:
|
||||
|
||||
1. Creates a directory `./my-ente` in working directory.
|
||||
2. Starts the containers required to run Ente upon prompting.
|
||||
|
||||
You should be able to access the web application at
|
||||
[http://localhost:3000](http://localhost:3000) or
|
||||
[http://machine-ip:3000](http://<machine-ip>:3000)
|
||||
|
||||
The data accessed by Museum is stored in `./data` folder inside `my-ente`
|
||||
directory. It contains extra configuration files that is to be used (push
|
||||
notification credentials, etc.)
|
||||
|
||||
::: tip
|
||||
|
||||
Check out [post-installation steps](/self-hosting/installation/post-install/)
|
||||
for further usage.
|
||||
|
||||
:::
|
||||
41
docs/docs/self-hosting/installation/requirements.md
Normal file
@@ -0,0 +1,41 @@
|
||||
---
|
||||
title: Requirements - Self-hosting
|
||||
description: Requirements for self-hosting Ente
|
||||
---
|
||||
|
||||
# Requirements
|
||||
|
||||
Ensure your system meets these requirements and has the needed software
|
||||
installed for a smooth experience.
|
||||
|
||||
## Hardware
|
||||
|
||||
The server is capable of running on minimal resource requirements as a
|
||||
lightweight Go binary, since most of the intensive computational tasks are done
|
||||
on the client. It performs well on small cloud instances, old laptops, and even
|
||||
[low-end embedded devices](https://github.com/ente-io/ente/discussions/594).
|
||||
|
||||
- **Storage:** An Unix-compatible filesystem such as ZFS, EXT4, BTRFS, etc. if
|
||||
using PostgreSQL container as it requires a filesystem that supports
|
||||
user/group permissions.
|
||||
- **RAM:** A minimum of 1 GB of RAM is required for running the cluster (if
|
||||
using quickstart script).
|
||||
- **CPU:** A minimum of 1 CPU core is required.
|
||||
|
||||
## Software
|
||||
|
||||
- **Operating System:** Any Linux or \*nix operating system, Ubuntu or Debian is
|
||||
recommended to have a good Docker experience. Non-Linux operating systems tend
|
||||
to provide poor experience with Docker and difficulty with troubleshooting and
|
||||
assistance.
|
||||
|
||||
- **Docker:** Required for running Ente's server, web application and dependent
|
||||
services (database and object storage). Ente also requires **Docker Compose
|
||||
plugin** to be installed.
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> Ente requires **Docker Compose version 2.30 or higher**.
|
||||
>
|
||||
> Furthermore, Ente uses the command `docker compose`, `docker-compose` is no
|
||||
> longer supported.
|
||||
77
docs/docs/self-hosting/installation/upgrade.md
Normal file
@@ -0,0 +1,77 @@
|
||||
---
|
||||
title: Upgrade - Self-hosting
|
||||
description: Upgrading self-hosted Ente
|
||||
---
|
||||
|
||||
# Upgrade your server
|
||||
|
||||
Upgrading Ente depends on the method of installation you have chosen.
|
||||
|
||||
## Quickstart
|
||||
|
||||
::: tip For Docker users
|
||||
|
||||
You can free up some disk space by deleting older images that were used by
|
||||
obsolette containers.
|
||||
|
||||
```shell
|
||||
docker image prune
|
||||
```
|
||||
|
||||
:::
|
||||
|
||||
Pull in the latest images in the directory where the Compose file resides.
|
||||
Restart the cluster to recreate containers with newer images.
|
||||
|
||||
Run the following command inside `my-ente` directory (default name used in
|
||||
quickstart):
|
||||
|
||||
```shell
|
||||
docker compose pull && docker compose up -d
|
||||
```
|
||||
|
||||
## Docker Compose
|
||||
|
||||
You can pull in the latest source code from Git and build a new cluster based on
|
||||
the updated source code.
|
||||
|
||||
1. Pull the latest changes from `main`.
|
||||
|
||||
```shell
|
||||
# Assuming you have cloned repository to ente
|
||||
cd ente
|
||||
# Pull changes
|
||||
git pull
|
||||
```
|
||||
|
||||
2. Recreate the cluster.
|
||||
```shell
|
||||
cd server/config
|
||||
# Stop and remove containers if they are running
|
||||
docker compose down
|
||||
# Build with latest code
|
||||
docker compose up --build
|
||||
```
|
||||
|
||||
## Manual Setup
|
||||
|
||||
You can pull in the latest source code from Git and build a new cluster based on
|
||||
the updated source code.
|
||||
|
||||
1. Pull the latest changes from `main`.
|
||||
|
||||
```shell
|
||||
# Assuming you have cloned repository to ente
|
||||
cd ente
|
||||
|
||||
# Pull changes and only keep changes from remote.
|
||||
# This is needed to keep yarn.lock up-to-date.
|
||||
# This resets all changes made in the local repository.
|
||||
# Make sure to stash changes if you have made any.
|
||||
git fetch origin
|
||||
git reset --hard main
|
||||
```
|
||||
|
||||
2. Follow the steps described in
|
||||
[manual setup](/self-hosting/installation/manual#step-3-configure-web-application)
|
||||
for Museum and web applications.
|
||||
@@ -1,77 +0,0 @@
|
||||
---
|
||||
title: Configuring your server
|
||||
description: Guide to writing a museum.yaml
|
||||
---
|
||||
|
||||
# Configuring your server
|
||||
|
||||
Ente's monolithic server is called **museum**.
|
||||
|
||||
`museum.yaml` is a YAML configuration file used to configure museum. By default,
|
||||
[`local.yaml`](https://github.com/ente-io/ente/tree/main/server/configurations/local.yaml)
|
||||
is provided, but its settings are overridden with those from `museum.yaml`.
|
||||
|
||||
If you used our quickstart script, your `my-ente` directory will include a
|
||||
`museum.yaml` file with preset configurations for encryption keys, secrets,
|
||||
PostgreSQL and MinIO.
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> Always do `docker compose down` inside your `my-ente` directory. If you've
|
||||
> made changes to `museum.yaml`, restart the containers with
|
||||
> `docker compose up -d ` to see your changes in action.
|
||||
|
||||
## S3 buckets
|
||||
|
||||
The `s3` section within `museum.yaml` is by default configured to use local
|
||||
MinIO buckets.
|
||||
|
||||
If you wish to use an external S3 provider, you can edit the configuration with
|
||||
your provider's credentials, and set `are_local_buckets` to `false`.
|
||||
|
||||
Check out [Configuring S3](/self-hosting/guides/configuring-s3.md) to understand
|
||||
more about configuring S3 buckets.
|
||||
|
||||
MinIO uses the port `3200` for API Endpoints and their web app runs over
|
||||
`:3201`. You can login to MinIO Web Console by opening `localhost:3201` in your
|
||||
browser.
|
||||
|
||||
If you face any issues related to uploads then checkout
|
||||
[Troubleshooting bucket CORS](/self-hosting/troubleshooting/bucket-cors) and
|
||||
[Frequently encountered S3 errors](/self-hosting/guides/configuring-s3#frequently-encountered-errors).
|
||||
|
||||
## Web apps
|
||||
|
||||
The web apps for Ente Photos is divided into multiple sub-apps like albums,
|
||||
cast, auth, etc. These endpoints are configurable in `museum.yaml` under the
|
||||
`apps.*` section.
|
||||
|
||||
For example,
|
||||
|
||||
```yaml
|
||||
apps:
|
||||
public-albums: https://albums.myente.xyz
|
||||
cast: https://cast.myente.xyz
|
||||
accounts: https://accounts.myente.xyz
|
||||
family: https://family.myente.xyz
|
||||
```
|
||||
|
||||
> [!IMPORTANT] By default, all the values redirect to our publicly hosted
|
||||
> production services. For example, if `public-albums` is not configured your
|
||||
> shared album will use the `albums.ente.io` URL.
|
||||
|
||||
After you are done with filling the values, restart museum and the app will
|
||||
start utilizing those endpoints instead of Ente's production instances.
|
||||
|
||||
Once you have configured all the necessary endpoints, `cd` into `my-ente` and
|
||||
stop all the Docker containers with `docker compose down` and restart them with
|
||||
`docker compose up -d`.
|
||||
|
||||
Similarly, you can use the default
|
||||
[`local.yaml`](https://github.com/ente-io/ente/tree/main/server/configurations/local.yaml)
|
||||
as a reference for building a functioning `museum.yaml` for many other
|
||||
functionalities like SMTP, Discord notifications, Hardcoded-OTTs, etc.
|
||||
|
||||
## References
|
||||
|
||||
- [Environment variables and ports](/self-hosting/faq/environment)
|
||||
@@ -1,46 +0,0 @@
|
||||
---
|
||||
Title: Configuring Reverse Proxy
|
||||
Description: configuring reverse proxy for Museum and other endpoints
|
||||
---
|
||||
|
||||
# Reverse proxy
|
||||
|
||||
Ente's server (museum) runs on port `:8080`, web app on `:3000` and the other
|
||||
apps from ports `3001-3004`.
|
||||
|
||||
We highly recommend using HTTPS for Museum (`8080`). For security reasons museum
|
||||
will not accept incoming HTTP traffic.
|
||||
|
||||
Head over to your DNS management dashboard and setup the appropriate records for
|
||||
the endpoints. Mostly, `A` or `AAAA` records targeting towards your server's IP
|
||||
address should be sufficient. The rest of the work will be done by the web
|
||||
server on your machine.
|
||||
|
||||

|
||||
|
||||
### Caddy
|
||||
|
||||
Setting up a reverse proxy with Caddy is easy and straightforward.
|
||||
|
||||
Firstly, install Caddy on your server.
|
||||
|
||||
```sh
|
||||
sudo apt install caddy
|
||||
```
|
||||
|
||||
After the installation is complete, a `Caddyfile` is created on the path
|
||||
`/etc/caddy/`. This file is used to configure reverse proxies among other
|
||||
things.
|
||||
|
||||
```yaml
|
||||
# Caddyfile - myente.xyz is just an example.
|
||||
api.myente.xyz { reverse_proxy http://localhost:8080 } ente.myente.xyz {
|
||||
reverse_proxy http://localhost:3000 }
|
||||
#...and so on for other endpoints
|
||||
```
|
||||
|
||||
After a hard-reload, the Ente Photos web app should be up on
|
||||
https://ente.myente.xyz.
|
||||
|
||||
If you are using a different tool for reverse proxy (like nginx), please check
|
||||
out their documentation.
|
||||
@@ -1,70 +0,0 @@
|
||||
---
|
||||
title: Bucket CORS
|
||||
description: Troubleshooting CORS issues with S3 Buckets
|
||||
---
|
||||
|
||||
# Fix potential CORS issues with your Buckets
|
||||
|
||||
## For AWS S3
|
||||
|
||||
If you cannot upload a photo due to a CORS issue, you need to fix the CORS
|
||||
configuration of your bucket.
|
||||
|
||||
Create a `cors.json` file with the following content:
|
||||
|
||||
```json
|
||||
{
|
||||
"CORSRules": [
|
||||
{
|
||||
"AllowedOrigins": ["*"],
|
||||
"AllowedHeaders": ["*"],
|
||||
"AllowedMethods": ["GET", "HEAD", "POST", "PUT", "DELETE"],
|
||||
"MaxAgeSeconds": 3000,
|
||||
"ExposeHeaders": ["Etag"]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
You may want to change the `AllowedOrigins` to a more restrictive value.
|
||||
|
||||
If you are using AWS for S3, you can execute the below command to get rid of
|
||||
CORS. Make sure to enter the right path for the `cors.json` file.
|
||||
|
||||
```bash
|
||||
aws s3api put-bucket-cors --bucket YOUR_S3_BUCKET --cors-configuration /path/to/cors.json
|
||||
```
|
||||
|
||||
## For Self-hosted Minio Instance
|
||||
|
||||
::: warning
|
||||
|
||||
- MinIO does not support bucket CORS in the community edition which is used by
|
||||
default. For more information, check
|
||||
[this discussion](https://github.com/minio/minio/discussions/20841). However,
|
||||
global CORS configuration is possible.
|
||||
- MinIO does not take JSON CORS file as the input, instead you will have to
|
||||
build a CORS.xml file or just convert the above `cors.json` to XML.
|
||||
|
||||
:::
|
||||
|
||||
A minor requirement here is the tool `mc` for managing buckets via command line
|
||||
interface. Checkout the `mc set alias` document to configure alias for your
|
||||
instance and bucket. After this you will be prompted for your AccessKey and
|
||||
Secret, which is your username and password.
|
||||
|
||||
```sh
|
||||
mc cors set <your-minio>/<your-bucket-name /path/to/cors.xml
|
||||
```
|
||||
|
||||
or, if you just want to just set the `AllowedOrigins` Header, you can use the
|
||||
following command to do so.
|
||||
|
||||
```sh
|
||||
mc admin config set <your-minio>/<your-bucket-name> api cors_allow_origin="*"
|
||||
```
|
||||
|
||||
You can create also `.csv` file and dump the list of origins you would like to
|
||||
allow and replace the `*` with `path` to the CSV file.
|
||||
|
||||
Now, uploads should be working fine.
|
||||
@@ -1,19 +1,19 @@
|
||||
---
|
||||
title: Docker Errors
|
||||
description: Fixing docker related errors when trying to self host Ente
|
||||
title: Troubleshooting Docker-related errors - Self-hosting
|
||||
description: Fixing Docker-related errors when trying to self-host Ente
|
||||
---
|
||||
|
||||
# Docker
|
||||
# Troubleshooting Docker-related errors
|
||||
|
||||
## configs
|
||||
|
||||
Remember to restart your cluster to ensure changes that you make in the
|
||||
`configs` section in `compose.yaml` get picked up.
|
||||
|
||||
```sh
|
||||
docker compose down
|
||||
docker compose up
|
||||
```
|
||||
> [!TIP] Restart after changes
|
||||
>
|
||||
> Remember to restart your cluster to ensure changes that you make in the
|
||||
> `compose.yaml` and `museum.yaml` get picked up.
|
||||
>
|
||||
> ```shell
|
||||
> docker compose down
|
||||
> docker compose up
|
||||
> ```
|
||||
|
||||
## post_start
|
||||
|
||||
@@ -45,15 +45,12 @@ minio-provision:
|
||||
entrypoint: |
|
||||
sh -c '
|
||||
#!/bin/sh
|
||||
|
||||
while ! mc config host add h0 http://minio:3200 changeme changeme1234
|
||||
while ! mc alias set h0 http://minio:3200 your_minio_user your_minio_pass
|
||||
do
|
||||
echo "waiting for minio..."
|
||||
sleep 0.5
|
||||
done
|
||||
|
||||
cd /data
|
||||
|
||||
mc mb -p b2-eu-cen
|
||||
mc mb -p wasabi-eu-central-2-v3
|
||||
mc mb -p scw-eu-fr-v3
|
||||
@@ -90,48 +87,82 @@ museum-1 | /etc/ente/cmd/museum/main.go:124 +0x44c
|
||||
museum-1 exited with code 2
|
||||
```
|
||||
|
||||
Then the issue is that the password you're using is not the password postgres is
|
||||
expecting (duh), and a potential scenario where that can happen is something
|
||||
like this:
|
||||
Then the issue is that the password you're using is not the password PostgreSQL
|
||||
is expecting.
|
||||
|
||||
1. On a machine, you create a new cluster with `quickstart.sh`.
|
||||
There are 2 possibilities:
|
||||
|
||||
2. Later you delete that folder, but then create another cluster with
|
||||
`quickstart.sh`. Each time `quickstart.sh` runs, it creates new credentials,
|
||||
and then when it tries to spin up the docker compose cluster, use them to
|
||||
connect to the postgres running within.
|
||||
1. When you have created a cluster in `my-ente` directory on running
|
||||
`quickstart.sh` and later deleted it, only to create another cluster with
|
||||
same `my-ente` directory.
|
||||
|
||||
3. However, you would already have a docker volume from the first run of
|
||||
`quickstart.sh`. Since the folder name is the same in both cases `my-ente`,
|
||||
Docker will reuse the existing volumes (`my-ente_postgres-data`,
|
||||
`my-ente_minio-data`). So your postgres is running off the old credentials,
|
||||
and you're trying to connect to it using the new ones, and the error arises.
|
||||
However, by deleting the directory, the Docker volumes are not deleted.
|
||||
|
||||
The solution is to delete the stale docker volume. **Be careful**, this will
|
||||
delete all data in those volumes (any thing you uploaded etc), so first
|
||||
understand if this is the exact problem you are facing before deleting those
|
||||
volumes.
|
||||
Thus the older volumes with previous cluster's credentials are used for new
|
||||
cluster and the error arises.
|
||||
|
||||
If you're sure of what you're doing, the volumes can be deleted by
|
||||
Deletion of the stale Docker volume can solve this. **Be careful**, this
|
||||
will delete all data in those volumes (any thing you uploaded etc). Do this
|
||||
if you are sure this is the exact problem.
|
||||
|
||||
```sh
|
||||
docker volume ls
|
||||
```shell
|
||||
docker volume ls
|
||||
```
|
||||
|
||||
to list them, and then delete the ones that begin with `my-ente` using
|
||||
`docker volume rm`. You can delete all stale volumes by using
|
||||
`docker system prune` with the `--volumes` flag, but be _really_ careful,
|
||||
that'll delete all volumes (Ente or otherwise) on your machine that are not
|
||||
currently in use by a running Docker container.
|
||||
|
||||
An alternative way is to delete the volumes along with removal of cluster's
|
||||
containers using `docker compose` inside `my-ente` directory.
|
||||
|
||||
```sh
|
||||
docker compose down --volumes
|
||||
```
|
||||
|
||||
If you're unsure about removing volumes, another alternative is to rename
|
||||
your `my-ente` folder. Docker uses the folder name to determine the volume
|
||||
name prefix, so giving it a different name will cause Docker to create a
|
||||
volume afresh for it.
|
||||
|
||||
## MinIO provisioning error
|
||||
|
||||
MinIO has deprecated the `mc config` command in favor of `mc alias set`
|
||||
resulting in failure in execution of the command for creating bucket using
|
||||
`post_start` hook.
|
||||
|
||||
You may encounter similar logs while trying to start the cluster if you are
|
||||
using the older command (provided by default in `quickstart.sh`):
|
||||
|
||||
```
|
||||
my-ente-minio-1 -> | Waiting for minio...
|
||||
my-ente-minio-1 -> | Waiting for minio...
|
||||
my-ente-minio-1 -> | Waiting for minio...
|
||||
```
|
||||
|
||||
to list them, and then delete the ones that begin with `my-ente` using
|
||||
`docker volume rm`. You can delete all stale volumes by using
|
||||
`docker system prune` with the `--volumes` flag, but be _really_ careful,
|
||||
that'll delete all volumes (Ente or otherwise) on your machine that are not
|
||||
currently in use by a running docker container.
|
||||
This can be resolved by changing
|
||||
`mc config host h0 add http://minio:3200 $minio_user $minio_pass` to
|
||||
`mc alias set h0 http://minio:3200 $minio_user $minio_pass`
|
||||
|
||||
An alternative way is to delete the volumes along with removal of cluster's
|
||||
containers using `docker compose` inside `my-ente` directory.
|
||||
Thus the updated `post_start` will look as follows for `minio` service:
|
||||
|
||||
```sh
|
||||
docker compose down --volumes
|
||||
```yaml
|
||||
minio:
|
||||
...
|
||||
post_start:
|
||||
- command: |
|
||||
sh -c '
|
||||
#!/bin/sh
|
||||
while ! mc alias set h0 http://minio:3200 your_minio_user your_minio_pass 2>/dev/null
|
||||
do
|
||||
echo "Waiting for minio..."
|
||||
sleep 0.5
|
||||
done
|
||||
cd /data
|
||||
mc mb -p b2-eu-cen
|
||||
mc mb -p wasabi-eu-central-2-v3
|
||||
mc mb -p scw-eu-fr-v3
|
||||
'
|
||||
```
|
||||
|
||||
If you're unsure about removing volumes, another alternative is to rename your
|
||||
`my-ente` folder. Docker uses the folder name to determine the volume name
|
||||
prefix, so giving it a different name will cause Docker to create a volume
|
||||
afresh for it.
|
||||
|
||||