mirror of
https://github.com/photoprism/photoprism.git
synced 2025-10-17 22:30:55 +08:00
Compare commits
627 Commits
scratch/fr
...
release
Author | SHA1 | Date | |
---|---|---|---|
![]() |
d28b3101e0 | ||
![]() |
8fcc2a232b | ||
![]() |
5ad7f6318b | ||
![]() |
cedc8799d3 | ||
![]() |
5860b01248 | ||
![]() |
f80ac62e6b | ||
![]() |
57349bdb99 | ||
![]() |
0fc3ec8183 | ||
![]() |
b582133df7 | ||
![]() |
037c0351d9 | ||
![]() |
ff6151f84a | ||
![]() |
3ff0ec01be | ||
![]() |
595b116ae6 | ||
![]() |
73374cb325 | ||
![]() |
77ac3b545f | ||
![]() |
c49ba11288 | ||
![]() |
395ee8426e | ||
![]() |
d43ec9492a | ||
![]() |
20a82df0e8 | ||
![]() |
55704fea58 | ||
![]() |
02d8525ade | ||
![]() |
4b1cc5d424 | ||
![]() |
829611c37f | ||
![]() |
cb208bc09f | ||
![]() |
24b7b03f7b | ||
![]() |
1b4b478067 | ||
![]() |
76f6f2d52f | ||
![]() |
5b152ac542 | ||
![]() |
d7298eeb80 | ||
![]() |
c18d04e104 | ||
![]() |
8b5b06d116 | ||
![]() |
7fb447897e | ||
![]() |
9c5470744f | ||
![]() |
bd4ca7b848 | ||
![]() |
3a74db145a | ||
![]() |
6bf5e03336 | ||
![]() |
24025524ab | ||
![]() |
80ba7e9934 | ||
![]() |
a5c50b1301 | ||
![]() |
318d38a1da | ||
![]() |
08ae7b0229 | ||
![]() |
ee0f104262 | ||
![]() |
a30c04bab6 | ||
![]() |
056c6f3917 | ||
![]() |
10f15431ff | ||
![]() |
1709f708ed | ||
![]() |
4475a8d914 | ||
![]() |
00d1cddf37 | ||
![]() |
a39c1d3248 | ||
![]() |
dec24ece73 | ||
![]() |
fd33e54c20 | ||
![]() |
af3357bfdc | ||
![]() |
761cf6a47e | ||
![]() |
7e2d55ece4 | ||
![]() |
0e66db223c | ||
![]() |
22e865c66a | ||
![]() |
3679c11c34 | ||
![]() |
55575623c5 | ||
![]() |
40df1d71cf | ||
![]() |
c2d981e4d1 | ||
![]() |
aadde256eb | ||
![]() |
60cb5684c2 | ||
![]() |
8cef088bba | ||
![]() |
7a2cb27c1f | ||
![]() |
033cfc4922 | ||
![]() |
bcbbbcd7b3 | ||
![]() |
baa5f2d9a0 | ||
![]() |
7d1c453960 | ||
![]() |
4dc703c855 | ||
![]() |
58ffaf1bfa | ||
![]() |
d1c6efa2b6 | ||
![]() |
595e528258 | ||
![]() |
95cb881f56 | ||
![]() |
702b83870f | ||
![]() |
e201e27842 | ||
![]() |
a965c32188 | ||
![]() |
982f864cc0 | ||
![]() |
b054a1e09a | ||
![]() |
b3bdd5d8ce | ||
![]() |
47f9a509b1 | ||
![]() |
a49181f75d | ||
![]() |
1d8fa4e3ea | ||
![]() |
758d86f903 | ||
![]() |
a82d657b6b | ||
![]() |
985e2febf4 | ||
![]() |
40be3cc290 | ||
![]() |
087594161e | ||
![]() |
a9d0f3e9a4 | ||
![]() |
44c85a8a46 | ||
![]() |
55b8042c98 | ||
![]() |
2596fe0252 | ||
![]() |
1e89fa5d32 | ||
![]() |
7d05ecab9a | ||
![]() |
f7218f67e2 | ||
![]() |
cdcfc69e05 | ||
![]() |
d57ee7b7ab | ||
![]() |
fd056913d8 | ||
![]() |
c8ce9ec772 | ||
![]() |
6a65f86bf9 | ||
![]() |
42a22f1377 | ||
![]() |
86fe4404ef | ||
![]() |
6fa0ab4734 | ||
![]() |
7759aad68f | ||
![]() |
47a4d1ab0a | ||
![]() |
38c8fec985 | ||
![]() |
e9a76efc3b | ||
![]() |
cf7aaa5059 | ||
![]() |
dc265085a8 | ||
![]() |
03f5bb322d | ||
![]() |
2e2ebab433 | ||
![]() |
a45d9d30b9 | ||
![]() |
7a1929797c | ||
![]() |
1ac9a8a3bf | ||
![]() |
f98f2bcc8e | ||
![]() |
eda33e2032 | ||
![]() |
cf9258949a | ||
![]() |
ae530fec1b | ||
![]() |
3bcc415c06 | ||
![]() |
72fdd05358 | ||
![]() |
798c77464e | ||
![]() |
69600fdbe3 | ||
![]() |
03dba1fe20 | ||
![]() |
2499b13f51 | ||
![]() |
af832247fc | ||
![]() |
a5aef038ef | ||
![]() |
fce886f077 | ||
![]() |
876a421ad7 | ||
![]() |
8292f97469 | ||
![]() |
f5ee512a70 | ||
![]() |
0ecc08750b | ||
![]() |
4326523194 | ||
![]() |
465245eb85 | ||
![]() |
7ab90720ff | ||
![]() |
b642be2c91 | ||
![]() |
cfc8bac26f | ||
![]() |
e754af0e08 | ||
![]() |
bf37bf44c7 | ||
![]() |
9a39adebae | ||
![]() |
bdaab4b412 | ||
![]() |
e89efc9d39 | ||
![]() |
699cff429c | ||
![]() |
f6908837ee | ||
![]() |
9c16bb11b8 | ||
![]() |
e02f543808 | ||
![]() |
0e74afa358 | ||
![]() |
53d43f7933 | ||
![]() |
0597269fc4 | ||
![]() |
1554d52b00 | ||
![]() |
3c09bb9475 | ||
![]() |
43238cf6e4 | ||
![]() |
7958239f7e | ||
![]() |
2eb731e721 | ||
![]() |
ade2c5e269 | ||
![]() |
2ddfa5c9a1 | ||
![]() |
1a794da1fe | ||
![]() |
dd1f3b820f | ||
![]() |
39e8b5b9ad | ||
![]() |
cccb0ca00a | ||
![]() |
ade59eebf0 | ||
![]() |
7b2a9a11c3 | ||
![]() |
2e626b8221 | ||
![]() |
4f04ffe133 | ||
![]() |
b5d2d1c7fb | ||
![]() |
d18be7e76c | ||
![]() |
2787059411 | ||
![]() |
5e4d258860 | ||
![]() |
79b6a75703 | ||
![]() |
723dee6620 | ||
![]() |
cbcee62444 | ||
![]() |
4349087272 | ||
![]() |
83717bda02 | ||
![]() |
333c54f3a2 | ||
![]() |
80e6d02509 | ||
![]() |
4484b885d4 | ||
![]() |
2b788fd258 | ||
![]() |
c4ddc4a119 | ||
![]() |
3d325015af | ||
![]() |
f50bae84b1 | ||
![]() |
a55b3ecc9c | ||
![]() |
6bd86d6032 | ||
![]() |
ca843987f7 | ||
![]() |
fdea09518c | ||
![]() |
b6d031a4ba | ||
![]() |
3d730884ce | ||
![]() |
b20f9d6e50 | ||
![]() |
5973aeca5f | ||
![]() |
dd6e17e97e | ||
![]() |
b423b1980b | ||
![]() |
43ff8b2a8d | ||
![]() |
c80f703ecd | ||
![]() |
bd4b7b3ad3 | ||
![]() |
6f3f1fd392 | ||
![]() |
6b4a32a1b3 | ||
![]() |
033a956e21 | ||
![]() |
a23058ce4b | ||
![]() |
b61f3063d9 | ||
![]() |
d530ab4f23 | ||
![]() |
4677579f9a | ||
![]() |
4a992dc350 | ||
![]() |
fb0c22fb4b | ||
![]() |
607b285443 | ||
![]() |
de14b30570 | ||
![]() |
06529c3854 | ||
![]() |
8faf3fc918 | ||
![]() |
a7d927a83b | ||
![]() |
060924c19a | ||
![]() |
bb67dca507 | ||
![]() |
9526f1d4dc | ||
![]() |
8ce192ceba | ||
![]() |
d0f7393ebe | ||
![]() |
fe3071ba18 | ||
![]() |
a64e2ea445 | ||
![]() |
138cc3c458 | ||
![]() |
aeaa39969b | ||
![]() |
ba8d38a761 | ||
![]() |
05b68db22d | ||
![]() |
3f2f0a7e67 | ||
![]() |
eb4fc032ff | ||
![]() |
27ec7a1282 | ||
![]() |
9ab1772b64 | ||
![]() |
a3883c1cd4 | ||
![]() |
591ec1fad7 | ||
![]() |
a7ee4a6cff | ||
![]() |
98f2cbd51b | ||
![]() |
eb9c64772f | ||
![]() |
8fbe03ee1b | ||
![]() |
21ddba4595 | ||
![]() |
cbc415d32b | ||
![]() |
71a623b5e0 | ||
![]() |
eddb096adb | ||
![]() |
f73b703123 | ||
![]() |
9e39b2f81d | ||
![]() |
fed0cfff6a | ||
![]() |
cc5a4a6fd8 | ||
![]() |
7c7f89b2ac | ||
![]() |
2a2a55b9fa | ||
![]() |
451c172a70 | ||
![]() |
5648469247 | ||
![]() |
c6e571aab1 | ||
![]() |
f2a89063c6 | ||
![]() |
e59fdded1b | ||
![]() |
56ba9f1ee5 | ||
![]() |
5e77c6a3bb | ||
![]() |
4c7ca93dcc | ||
![]() |
947e7a0fb1 | ||
![]() |
d96b8027bd | ||
![]() |
8e17a8780b | ||
![]() |
36afc4a215 | ||
![]() |
c4d4b91488 | ||
![]() |
b9dda9337a | ||
![]() |
5cd2c25489 | ||
![]() |
598be273aa | ||
![]() |
2a9741e826 | ||
![]() |
44a3a9dcba | ||
![]() |
da7af617f7 | ||
![]() |
4bd4d17c5c | ||
![]() |
20036b5de0 | ||
![]() |
582fc5d359 | ||
![]() |
c9777b39ed | ||
![]() |
3bf5e59c63 | ||
![]() |
bb8d835034 | ||
![]() |
f8563adbcc | ||
![]() |
e616ced26e | ||
![]() |
264a1d67f6 | ||
![]() |
7d56a454dc | ||
![]() |
a86d64b828 | ||
![]() |
ddf5924917 | ||
![]() |
f50d833a0e | ||
![]() |
91ebcfab33 | ||
![]() |
27b72aa1e9 | ||
![]() |
e7bb9bfb56 | ||
![]() |
bbac7b91f0 | ||
![]() |
ecf8af193b | ||
![]() |
ca1f5cf781 | ||
![]() |
140dc7b23c | ||
![]() |
f0629cb151 | ||
![]() |
d60a4c5767 | ||
![]() |
555936d939 | ||
![]() |
79ceeb1ada | ||
![]() |
e811422c44 | ||
![]() |
4a0f285a2c | ||
![]() |
a746cc1779 | ||
![]() |
ac8ee9e4dd | ||
![]() |
9e521b244d | ||
![]() |
eb228b0e45 | ||
![]() |
b64ba76bc5 | ||
![]() |
bdf97fff58 | ||
![]() |
fa3d7d831d | ||
![]() |
da4e9d57c1 | ||
![]() |
d7ea086c5d | ||
![]() |
9e56672019 | ||
![]() |
7dad78eb91 | ||
![]() |
d15c6e59fa | ||
![]() |
1c086455e2 | ||
![]() |
9b78cc3406 | ||
![]() |
c83d5f2f17 | ||
![]() |
53c853dae5 | ||
![]() |
b6423e5090 | ||
![]() |
5877be38df | ||
![]() |
7da6a97d15 | ||
![]() |
2b66db8216 | ||
![]() |
46e4810391 | ||
![]() |
f7b80bf34d | ||
![]() |
9c33235a83 | ||
![]() |
04ac2a383e | ||
![]() |
dff52f8ca0 | ||
![]() |
23a1182d00 | ||
![]() |
b3a38224af | ||
![]() |
1b519fbc33 | ||
![]() |
49e84c4a7f | ||
![]() |
557a25a6b5 | ||
![]() |
a440eb6bc7 | ||
![]() |
5f32d75700 | ||
![]() |
dddfee3920 | ||
![]() |
e21bdc3b22 | ||
![]() |
3f5e040a5a | ||
![]() |
4096583b1c | ||
![]() |
33afc04d86 | ||
![]() |
6ee74461ed | ||
![]() |
a446218933 | ||
![]() |
35e0e112bd | ||
![]() |
f28aaac518 | ||
![]() |
fbcd210578 | ||
![]() |
fcd17f8859 | ||
![]() |
af7c71e762 | ||
![]() |
e1b9946448 | ||
![]() |
7f4f63775d | ||
![]() |
208ff18a5d | ||
![]() |
c22b118dd6 | ||
![]() |
96dbb5ccbc | ||
![]() |
2c47644ea8 | ||
![]() |
161b18e5e8 | ||
![]() |
55394d4137 | ||
![]() |
a89d386541 | ||
![]() |
eb39662e36 | ||
![]() |
b2a36c24dc | ||
![]() |
0b390f356f | ||
![]() |
61ceed0726 | ||
![]() |
60e41b425b | ||
![]() |
41d9dd7c21 | ||
![]() |
c3741cb912 | ||
![]() |
ac8db75a3f | ||
![]() |
65fcb25952 | ||
![]() |
ab31f20508 | ||
![]() |
38155190c5 | ||
![]() |
66b7d83d7e | ||
![]() |
d4becb575f | ||
![]() |
bc4f1f3080 | ||
![]() |
328938d268 | ||
![]() |
f8bf1d45fc | ||
![]() |
f09aa7749b | ||
![]() |
914476ffe7 | ||
![]() |
41abde5db8 | ||
![]() |
916276e36a | ||
![]() |
8189503a69 | ||
![]() |
e5916b98b9 | ||
![]() |
1d77c2306f | ||
![]() |
e6ec733303 | ||
![]() |
6f3ad2dea3 | ||
![]() |
377c7ed1d5 | ||
![]() |
128df65f54 | ||
![]() |
8068e471d1 | ||
![]() |
494f75917c | ||
![]() |
52cc9b1cd3 | ||
![]() |
06de8e2b66 | ||
![]() |
b03f06a1a2 | ||
![]() |
1831261cfd | ||
![]() |
43c794d242 | ||
![]() |
7d39c51e31 | ||
![]() |
d0a23491df | ||
![]() |
36c5b7012f | ||
![]() |
26b552bb58 | ||
![]() |
285c0f4543 | ||
![]() |
6d6671c356 | ||
![]() |
6088ebd617 | ||
![]() |
6c05e02077 | ||
![]() |
63fb46578a | ||
![]() |
07e22b0c14 | ||
![]() |
63d72ee867 | ||
![]() |
f2ffb0fdce | ||
![]() |
7925ab205d | ||
![]() |
35bfe0694b | ||
![]() |
bd634c828b | ||
![]() |
720d83ef3a | ||
![]() |
c14be8f57e | ||
![]() |
76757811cb | ||
![]() |
f80acab4c2 | ||
![]() |
5b8be2f5d4 | ||
![]() |
6fcce84623 | ||
![]() |
068ee52301 | ||
![]() |
627f4f8d21 | ||
![]() |
0304ed37c3 | ||
![]() |
190be2a1b5 | ||
![]() |
caf3ae1ab5 | ||
![]() |
ecef34a8da | ||
![]() |
204ce2b100 | ||
![]() |
eaea3a416d | ||
![]() |
cf3b933e59 | ||
![]() |
7f1041c434 | ||
![]() |
42897bde35 | ||
![]() |
0f76186663 | ||
![]() |
d304509c0d | ||
![]() |
2a6b9fb237 | ||
![]() |
9d648f74dd | ||
![]() |
f3e066af45 | ||
![]() |
907850cb80 | ||
![]() |
c6b6bfde70 | ||
![]() |
ae735f6a1e | ||
![]() |
fd0baeb5a4 | ||
![]() |
bfdb839d01 | ||
![]() |
35e9294d87 | ||
![]() |
b791896fc6 | ||
![]() |
043f6c2569 | ||
![]() |
332e57d59f | ||
![]() |
a3456637cd | ||
![]() |
5650ea29b5 | ||
![]() |
c9e305808b | ||
![]() |
efe36603f8 | ||
![]() |
96fdd1a41a | ||
![]() |
0b9233f44b | ||
![]() |
5a9e3a8645 | ||
![]() |
3900573a7c | ||
![]() |
d9c260b865 | ||
![]() |
a97d66d6e4 | ||
![]() |
5256a7f276 | ||
![]() |
eed7bfff73 | ||
![]() |
d6c215c9c6 | ||
![]() |
b6ca5a1717 | ||
![]() |
1350eff0f5 | ||
![]() |
bf66a9e19a | ||
![]() |
5a1ca738f6 | ||
![]() |
63d6902605 | ||
![]() |
de89979e45 | ||
![]() |
fe424d8966 | ||
![]() |
b0e42bebf1 | ||
![]() |
cf3b7f8d18 | ||
![]() |
83c30987eb | ||
![]() |
1cf69e231f | ||
![]() |
6d776c8a97 | ||
![]() |
974369966a | ||
![]() |
cdc1866720 | ||
![]() |
4915840035 | ||
![]() |
0ff942342f | ||
![]() |
990a0a40ba | ||
![]() |
405c9e7650 | ||
![]() |
dc2370ebf3 | ||
![]() |
439d683fdb | ||
![]() |
15e6ea0a4d | ||
![]() |
c9a8d8f89d | ||
![]() |
e9a6973d16 | ||
![]() |
8a537755a0 | ||
![]() |
ff47ff7366 | ||
![]() |
53feb26fa9 | ||
![]() |
f8e32d260e | ||
![]() |
bb60ea028e | ||
![]() |
fb040de538 | ||
![]() |
e76bf0c4da | ||
![]() |
db77ddce0f | ||
![]() |
1ed65ba8f6 | ||
![]() |
0fc7aa3767 | ||
![]() |
f8d2cfd1f2 | ||
![]() |
252784c029 | ||
![]() |
e6fecc5020 | ||
![]() |
c973d4edd6 | ||
![]() |
2dc1baf2e8 | ||
![]() |
b0e3ff1231 | ||
![]() |
17154e33d2 | ||
![]() |
37d609c2bd | ||
![]() |
e78414ac1e | ||
![]() |
f3dddef6a4 | ||
![]() |
3d66556acf | ||
![]() |
433d726d75 | ||
![]() |
6596474389 | ||
![]() |
7b5f295a9b | ||
![]() |
5ff21ad589 | ||
![]() |
8cd1de6b64 | ||
![]() |
f4fa80a8cf | ||
![]() |
00e12b8bd8 | ||
![]() |
083c59550a | ||
![]() |
b5c1c6b974 | ||
![]() |
0dd2639d97 | ||
![]() |
e2d74220d5 | ||
![]() |
f0959c2796 | ||
![]() |
6b26974ce7 | ||
![]() |
a6b4378533 | ||
![]() |
512f044ec6 | ||
![]() |
67c99fb322 | ||
![]() |
57d0869e65 | ||
![]() |
64f051ece3 | ||
![]() |
eba878dea1 | ||
![]() |
a2825be165 | ||
![]() |
8f8d901787 | ||
![]() |
80f93b471a | ||
![]() |
36a359eb6f | ||
![]() |
0dc3e1c8a4 | ||
![]() |
17dbe15dc2 | ||
![]() |
72435cd0e8 | ||
![]() |
a12323cf2e | ||
![]() |
ecbcb8f63c | ||
![]() |
ebc013a204 | ||
![]() |
f861bbece8 | ||
![]() |
86113d1429 | ||
![]() |
9f8c8b4c10 | ||
![]() |
1ec6562799 | ||
![]() |
b729f53d9d | ||
![]() |
cd630536e2 | ||
![]() |
cdbb4eefcc | ||
![]() |
b015abf85f | ||
![]() |
a9e6874fe0 | ||
![]() |
47a5412eeb | ||
![]() |
70402ba46f | ||
![]() |
d3c8af196d | ||
![]() |
955fd1d247 | ||
![]() |
995da0f611 | ||
![]() |
9c79f54994 | ||
![]() |
5a3aa9db18 | ||
![]() |
e637034a8c | ||
![]() |
62987fbbe1 | ||
![]() |
5dbbf340a0 | ||
![]() |
31ae58435e | ||
![]() |
1ff381d0b7 | ||
![]() |
16777de1a9 | ||
![]() |
24adfcb9f2 | ||
![]() |
9e036d259f | ||
![]() |
df5695a220 | ||
![]() |
aa687ade0b | ||
![]() |
422256122d | ||
![]() |
2ebac920f2 | ||
![]() |
b678bf384c | ||
![]() |
9a4773610a | ||
![]() |
d895affffa | ||
![]() |
1a207e3543 | ||
![]() |
7bc4417eff | ||
![]() |
7afffe1809 | ||
![]() |
4080901576 | ||
![]() |
deeb8b987a | ||
![]() |
f142a9d52c | ||
![]() |
7bc9347909 | ||
![]() |
c6176d0b1e | ||
![]() |
cef91e442a | ||
![]() |
45e0504dab | ||
![]() |
ad5baf2823 | ||
![]() |
a89f186f40 | ||
![]() |
0951720512 | ||
![]() |
0d251a9d43 | ||
![]() |
e025f22553 | ||
![]() |
a76bbba2a6 | ||
![]() |
a24b385560 | ||
![]() |
2934319591 | ||
![]() |
ca708c3f56 | ||
![]() |
15668ee7b5 | ||
![]() |
47e740fd88 | ||
![]() |
ae0b63eb50 | ||
![]() |
9de641eb66 | ||
![]() |
9aff925c94 | ||
![]() |
02bc6b6bce | ||
![]() |
5fe3c34167 | ||
![]() |
4ea2ab0ddb | ||
![]() |
ed06bbda9d | ||
![]() |
7c70c247b9 | ||
![]() |
0761be3258 | ||
![]() |
4329b43b76 | ||
![]() |
8836f90251 | ||
![]() |
a36e8b19f8 | ||
![]() |
0d487b6490 | ||
![]() |
4ab9b14bcb | ||
![]() |
fc0aac9877 | ||
![]() |
3ec92af160 | ||
![]() |
7fe8ad9b35 | ||
![]() |
58d55f820f | ||
![]() |
9927eb62eb | ||
![]() |
8b89c60418 | ||
![]() |
62eff7c4c3 | ||
![]() |
858130da9c | ||
![]() |
a62d3d0e57 | ||
![]() |
2df077df26 | ||
![]() |
4176303d6f | ||
![]() |
dce754182e | ||
![]() |
a2186f3fa4 | ||
![]() |
dc15a4aabe | ||
![]() |
b0eb7aacdd | ||
![]() |
6f08d7f5b9 | ||
![]() |
4996c2db0d | ||
![]() |
9e95c7e71c | ||
![]() |
1f36d35d23 | ||
![]() |
3acd41027b | ||
![]() |
ff5135c2a3 | ||
![]() |
7de72bd99a | ||
![]() |
b771e86f8d | ||
![]() |
b25209f114 | ||
![]() |
0a58484d6d | ||
![]() |
c702699f45 | ||
![]() |
99653613ee | ||
![]() |
4acba7de18 | ||
![]() |
8765cf4d3f | ||
![]() |
c78b023675 | ||
![]() |
c9f0c5f475 | ||
![]() |
33867d4d1f | ||
![]() |
6e07d42a1b | ||
![]() |
67811d87fa | ||
![]() |
d9924010d4 | ||
![]() |
0ddc179737 | ||
![]() |
a125219751 | ||
![]() |
93b53214f6 | ||
![]() |
50b0e8babf | ||
![]() |
06d6a370b7 | ||
![]() |
4890447787 | ||
![]() |
0bf2c5c580 | ||
![]() |
00359b1a4e | ||
![]() |
c6225f7117 | ||
![]() |
173fa526e9 | ||
![]() |
555d5cdbbe | ||
![]() |
4ed7c6c242 | ||
![]() |
9a01ace34d | ||
![]() |
6e20ad6edb | ||
![]() |
68d1bbb359 | ||
![]() |
c081155c4f | ||
![]() |
0b02c5d17c | ||
![]() |
cd577f5108 | ||
![]() |
d3882edebc | ||
![]() |
cf8fbf5870 | ||
![]() |
3b6efc1786 | ||
![]() |
cd427c66be | ||
![]() |
9467dd89bf | ||
![]() |
57590c48bb | ||
![]() |
f4b3ed33a2 | ||
![]() |
8af26827de |
9
.codespellrc
Normal file
9
.codespellrc
Normal file
@@ -0,0 +1,9 @@
|
||||
[codespell]
|
||||
# Ref: https://github.com/codespell-project/codespell#using-a-config-file
|
||||
skip = .git*,*.svg,go.sum,package-lock.json,*.css,.codespellrc,locales,stopwords.*,shortwords.*,countries.*,keywords.json,smallwords.*
|
||||
check-hidden = true
|
||||
# ACRONYMS and generally mixed case/Capitalized words
|
||||
# Also ignore some German
|
||||
ignore-regex = ^(SMethod=shal|biuld: build)$|https://\S+|\b([A-Z][a-zA-Z]+|ist auf)\b|"(datin|alis|hel)"|\bfixe == false\b
|
||||
# common variables or other tricky cases
|
||||
ignore-words-list = renderd,nd,folde,crate,ue,fo,ist,alo,mot,te,admiraal
|
@@ -7,6 +7,10 @@
|
||||
/assets/facenet
|
||||
/assets/nasnet
|
||||
/assets/nsfw
|
||||
/assets/efficientnet
|
||||
/assets/imagenet
|
||||
/assets/resnet
|
||||
/assets/vision
|
||||
/storage
|
||||
/build
|
||||
/photoprism
|
||||
|
10
.github/ISSUE_TEMPLATE/question.md
vendored
10
.github/ISSUE_TEMPLATE/question.md
vendored
@@ -1,18 +1,18 @@
|
||||
---
|
||||
name: Question
|
||||
about: You have a general question or need assistance
|
||||
title: 'STOP! DO NOT PROCEED, USE GITHUB DISCUSSIONS INSTEAD - THANK YOU'
|
||||
labels: technical-support
|
||||
title: 'PLEASE DO NOT OPEN AN ISSUE FOR YOUR QUESTION, AND USE GITHUB DISCUSSIONS OR OUR COMMUNITY CHAT INSTEAD'
|
||||
labels: question
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
FOR GENERAL QUESTIONS, TECHNICAL SUPPORT, AND TO GET TO KNOW OTHER COMMUNITY MEMBERS:
|
||||
|
||||
<https://github.com/photoprism/photoprism/discussions>
|
||||
<https://github.com/photoprism/photoprism/discussions>
|
||||
|
||||
OUR TROUBLESHOOTING CHECKLISTS HELP YOU QUICKLY DIAGNOSE AND FIX COMMON PROBLEMS:
|
||||
|
||||
<https://docs.photoprism.app/getting-started/troubleshooting/>
|
||||
<https://docs.photoprism.app/getting-started/troubleshooting/>
|
||||
|
||||
DO NOT PROCEED, THANK YOU!
|
||||
PLEASE DO NOT OPEN AN ISSUE FOR YOUR QUESTION, AND USE GITHUB DISCUSSIONS OR OUR COMMUNITY CHAT INSTEAD. THANK YOU VERY MUCH!
|
||||
|
57
.github/PULL_REQUEST_TEMPLATE.md
vendored
57
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -1,33 +1,34 @@
|
||||
<!--
|
||||
|
||||
Thank you for your interest in contributing!
|
||||
|
||||
Because we want to create the best possible product for our users, we have a set of criteria to ensure that all submissions are acceptable, see https://docs.photoprism.app/developer-guide/pull-requests/ for details.
|
||||
|
||||
(1) Please provide a concise description of your pull request.
|
||||
|
||||
- What does it implement / fix / improve? Why?
|
||||
- Are the changes related to an existing issue?
|
||||
|
||||
(2) After you submit your first pull request, you will be asked to accept our CLA, see https://www.photoprism.app/cla.
|
||||
|
||||
(3) Finally, please confirm that the following criteria are met by replacing "[ ]" with "[x]" (also possible at a later time).
|
||||
|
||||
-->
|
||||
|
||||
Acceptance Criteria:
|
||||
|
||||
- [ ] Features and enhancements must be fully implemented so that they can be released at any time without additional work
|
||||
- [ ] Automated unit and/or acceptance tests are mandatory to ensure the changes work as expected and to reduce repetitive manual work
|
||||
- [ ] Frontend components must be responsive to work and look properly on phones, tablets, and desktop computers; you must have tested them on all major browsers and different devices
|
||||
- [ ] Documentation and translation updates should be provided if needed
|
||||
- [ ] In case you submit database-related changes, they must be tested and compatible with SQLite 3 and MariaDB 10.5.12+
|
||||
### Description
|
||||
|
||||
<!--
|
||||
We appreciate your interest in contributing! Please provide a brief description of your changes so that we know what is included in this pull request, and confirm that it meets the acceptance criteria:
|
||||
|
||||
Since reviewing, testing and finally merging pull requests requires significant resources on our side, this can take several months if it's not just a small fix, especially if extensive testing is required to prevent bugs from getting into our stable version.
|
||||
|
||||
We thank you for your patience! :)
|
||||
|
||||
What does it aim to implement, fix or improve? Why?
|
||||
-->
|
||||
|
||||
These changes implement/fix/improve...
|
||||
|
||||
#### Related Issues
|
||||
|
||||
- Links to issues that this PR fixes, implements, or is otherwise related to...
|
||||
|
||||
### Acceptance Criteria
|
||||
|
||||
<!-- You may add additional criteria and/or remove criteria that do not apply, e.g. because your PR does not include frontend changes: -->
|
||||
|
||||
- [ ] New features or enhancements are fully implemented and do not break existing functionality, so that they can be released at any time without requiring additional work
|
||||
- [ ] Automated unit and/or acceptance tests are included to ensure that changes work as expected and to reduce repetitive manual work
|
||||
- [ ] Documentation has been / will be updated, especially as it relates to new configuration options or potentially disruptive changes
|
||||
- [ ] The user interface has been tested on Chrome, Safari, and Firefox and is fully responsive for use on phones, tablets, and desktop computers
|
||||
- [ ] Database-related changes have been successfully tested with SQLite 3 and MariaDB 10.5.12+
|
||||
|
||||
<!--
|
||||
Contribution Agreement:
|
||||
|
||||
After submitting your first pull request, you will be asked to confirm our contribution agreement. This allows us to safely use your Contribution in all our projects without risking unexpected legal disputes or having to repeatedly ask for permission.
|
||||
The agreement is solely for our protection and that of our users. It does not grant us exclusive rights to your code.
|
||||
|
||||
PhotoPrism UG ("PhotoPrism", "we" or "us") hereby confirms to you that, to the fullest extent permitted by applicable law, this Contribution is provided "AS IS" WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES OR CONDITIONS OF NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. You have no obligation to provide support, maintenance, or other services for your Contribution.
|
||||
|
||||
Thank you very much! 🌈💎✨
|
||||
-->
|
9
.gitignore
vendored
9
.gitignore
vendored
@@ -25,7 +25,10 @@ venv
|
||||
.venv
|
||||
.env
|
||||
.tmp
|
||||
.nv
|
||||
.eslintcache
|
||||
/pro
|
||||
/plus
|
||||
/tmp/
|
||||
/test/
|
||||
*-lock.json
|
||||
@@ -37,6 +40,7 @@ venv
|
||||
/frontend/src/locales/*.mo
|
||||
/frontend/tests_output
|
||||
frontend/coverage/
|
||||
**/__screenshots__/
|
||||
/photoprism
|
||||
/photoprism-*
|
||||
/photos/originals/*
|
||||
@@ -48,8 +52,9 @@ frontend/coverage/
|
||||
/assets/nasnet
|
||||
/assets/nsfw
|
||||
/assets/static/build/
|
||||
/pro
|
||||
/plus
|
||||
/assets/static/maps/
|
||||
/assets/*net
|
||||
/assets/vision
|
||||
|
||||
# Files created automatically by editors and/or operating systems:
|
||||
.DS_Store
|
||||
|
335
.qdrant.yaml
Normal file
335
.qdrant.yaml
Normal file
@@ -0,0 +1,335 @@
|
||||
log_level: INFO
|
||||
|
||||
# Logging configuration
|
||||
# Qdrant logs to stdout. You may configure to also write logs to a file on disk.
|
||||
# Be aware that this file may grow indefinitely.
|
||||
# logger:
|
||||
# # Logging format, supports `text` and `json`
|
||||
# format: text
|
||||
# on_disk:
|
||||
# enabled: true
|
||||
# log_file: path/to/log/file.log
|
||||
# log_level: INFO
|
||||
# # Logging format, supports `text` and `json`
|
||||
# format: text
|
||||
|
||||
storage:
|
||||
# Where to store all the data
|
||||
storage_path: ./storage
|
||||
|
||||
# Where to store snapshots
|
||||
snapshots_path: ./snapshots
|
||||
|
||||
snapshots_config:
|
||||
# "local" or "s3" - where to store snapshots
|
||||
snapshots_storage: local
|
||||
# s3_config:
|
||||
# bucket: ""
|
||||
# region: ""
|
||||
# access_key: ""
|
||||
# secret_key: ""
|
||||
|
||||
# Where to store temporary files
|
||||
# If null, temporary snapshots are stored in: storage/snapshots_temp/
|
||||
temp_path: null
|
||||
|
||||
# If true - point payloads will not be stored in memory.
|
||||
# It will be read from the disk every time it is requested.
|
||||
# This setting saves RAM by (slightly) increasing the response time.
|
||||
# Note: those payload values that are involved in filtering and are indexed - remain in RAM.
|
||||
#
|
||||
# Default: true
|
||||
on_disk_payload: true
|
||||
|
||||
# Maximum number of concurrent updates to shard replicas
|
||||
# If `null` - maximum concurrency is used.
|
||||
update_concurrency: null
|
||||
|
||||
# Write-ahead-log related configuration
|
||||
wal:
|
||||
# Size of a single WAL segment
|
||||
wal_capacity_mb: 32
|
||||
|
||||
# Number of WAL segments to create ahead of actual data requirement
|
||||
wal_segments_ahead: 0
|
||||
|
||||
# Normal node - receives all updates and answers all queries
|
||||
node_type: "Normal"
|
||||
|
||||
# Listener node - receives all updates, but does not answer search/read queries
|
||||
# Useful for setting up a dedicated backup node
|
||||
# node_type: "Listener"
|
||||
|
||||
performance:
|
||||
# Number of parallel threads used for search operations. If 0 - auto selection.
|
||||
max_search_threads: 0
|
||||
|
||||
# Max number of threads (jobs) for running optimizations across all collections, each thread runs one job.
|
||||
# If 0 - have no limit and choose dynamically to saturate CPU.
|
||||
# Note: each optimization job will also use `max_indexing_threads` threads by itself for index building.
|
||||
max_optimization_threads: 0
|
||||
|
||||
# CPU budget, how many CPUs (threads) to allocate for an optimization job.
|
||||
# If 0 - auto selection, keep 1 or more CPUs unallocated depending on CPU size
|
||||
# If negative - subtract this number of CPUs from the available CPUs.
|
||||
# If positive - use this exact number of CPUs.
|
||||
optimizer_cpu_budget: 0
|
||||
|
||||
# Prevent DDoS of too many concurrent updates in distributed mode.
|
||||
# One external update usually triggers multiple internal updates, which breaks internal
|
||||
# timings. For example, the health check timing and consensus timing.
|
||||
# If null - auto selection.
|
||||
update_rate_limit: null
|
||||
|
||||
# Limit for number of incoming automatic shard transfers per collection on this node, does not affect user-requested transfers.
|
||||
# The same value should be used on all nodes in a cluster.
|
||||
# Default is to allow 1 transfer.
|
||||
# If null - allow unlimited transfers.
|
||||
#incoming_shard_transfers_limit: 1
|
||||
|
||||
# Limit for number of outgoing automatic shard transfers per collection on this node, does not affect user-requested transfers.
|
||||
# The same value should be used on all nodes in a cluster.
|
||||
# Default is to allow 1 transfer.
|
||||
# If null - allow unlimited transfers.
|
||||
#outgoing_shard_transfers_limit: 1
|
||||
|
||||
# Enable async scorer which uses io_uring when rescoring.
|
||||
# Only supported on Linux, must be enabled in your kernel.
|
||||
# See: <https://qdrant.tech/articles/io_uring/#and-what-about-qdrant>
|
||||
#async_scorer: false
|
||||
|
||||
optimizers:
|
||||
# The minimal fraction of deleted vectors in a segment, required to perform segment optimization
|
||||
deleted_threshold: 0.2
|
||||
|
||||
# The minimal number of vectors in a segment, required to perform segment optimization
|
||||
vacuum_min_vector_number: 1000
|
||||
|
||||
# Target amount of segments optimizer will try to keep.
|
||||
# Real amount of segments may vary depending on multiple parameters:
|
||||
# - Amount of stored points
|
||||
# - Current write RPS
|
||||
#
|
||||
# It is recommended to select default number of segments as a factor of the number of search threads,
|
||||
# so that each segment would be handled evenly by one of the threads.
|
||||
# If `default_segment_number = 0`, will be automatically selected by the number of available CPUs
|
||||
default_segment_number: 0
|
||||
|
||||
# Do not create segments larger this size (in KiloBytes).
|
||||
# Large segments might require disproportionately long indexation times,
|
||||
# therefore it makes sense to limit the size of segments.
|
||||
#
|
||||
# If indexation speed have more priority for your - make this parameter lower.
|
||||
# If search speed is more important - make this parameter higher.
|
||||
# Note: 1Kb = 1 vector of size 256
|
||||
# If not set, will be automatically selected considering the number of available CPUs.
|
||||
max_segment_size_kb: null
|
||||
|
||||
# Maximum size (in KiloBytes) of vectors to store in-memory per segment.
|
||||
# Segments larger than this threshold will be stored as read-only memmapped file.
|
||||
# To enable memmap storage, lower the threshold
|
||||
# Note: 1Kb = 1 vector of size 256
|
||||
# To explicitly disable mmap optimization, set to `0`.
|
||||
# If not set, will be disabled by default.
|
||||
memmap_threshold_kb: null
|
||||
|
||||
# Maximum size (in KiloBytes) of vectors allowed for plain index.
|
||||
# Default value based on https://github.com/google-research/google-research/blob/master/scann/docs/algorithms.md
|
||||
# Note: 1Kb = 1 vector of size 256
|
||||
# To explicitly disable vector indexing, set to `0`.
|
||||
# If not set, the default value will be used.
|
||||
indexing_threshold_kb: 20000
|
||||
|
||||
# Interval between forced flushes.
|
||||
flush_interval_sec: 5
|
||||
|
||||
# Max number of threads (jobs) for running optimizations per shard.
|
||||
# Note: each optimization job will also use `max_indexing_threads` threads by itself for index building.
|
||||
# If null - have no limit and choose dynamically to saturate CPU.
|
||||
# If 0 - no optimization threads, optimizations will be disabled.
|
||||
max_optimization_threads: null
|
||||
|
||||
# This section has the same options as 'optimizers' above. All values specified here will overwrite the collections
|
||||
# optimizers configs regardless of the config above and the options specified at collection creation.
|
||||
#optimizers_overwrite:
|
||||
# deleted_threshold: 0.2
|
||||
# vacuum_min_vector_number: 1000
|
||||
# default_segment_number: 0
|
||||
# max_segment_size_kb: null
|
||||
# memmap_threshold_kb: null
|
||||
# indexing_threshold_kb: 20000
|
||||
# flush_interval_sec: 5
|
||||
# max_optimization_threads: null
|
||||
|
||||
# Default parameters of HNSW Index. Could be overridden for each collection or named vector individually
|
||||
hnsw_index:
|
||||
# Number of edges per node in the index graph. Larger the value - more accurate the search, more space required.
|
||||
m: 16
|
||||
|
||||
# Number of neighbours to consider during the index building. Larger the value - more accurate the search, more time required to build index.
|
||||
ef_construct: 100
|
||||
|
||||
# Minimal size (in KiloBytes) of vectors for additional payload-based indexing.
|
||||
# If payload chunk is smaller than `full_scan_threshold_kb` additional indexing won't be used -
|
||||
# in this case full-scan search should be preferred by query planner and additional indexing is not required.
|
||||
# Note: 1Kb = 1 vector of size 256
|
||||
full_scan_threshold_kb: 10000
|
||||
|
||||
# Number of parallel threads used for background index building.
|
||||
# If 0 - automatically select.
|
||||
# Best to keep between 8 and 16 to prevent likelihood of building broken/inefficient HNSW graphs.
|
||||
# On small CPUs, less threads are used.
|
||||
max_indexing_threads: 0
|
||||
|
||||
# Store HNSW index on disk. If set to false, index will be stored in RAM. Default: false
|
||||
on_disk: false
|
||||
|
||||
# Custom M param for hnsw graph built for payload index. If not set, default M will be used.
|
||||
payload_m: null
|
||||
|
||||
# Default shard transfer method to use if none is defined.
|
||||
# If null - don't have a shard transfer preference, choose automatically.
|
||||
# If stream_records, snapshot or wal_delta - prefer this specific method.
|
||||
# More info: https://qdrant.tech/documentation/guides/distributed_deployment/#shard-transfer-method
|
||||
shard_transfer_method: null
|
||||
|
||||
# Default parameters for collections
|
||||
collection:
|
||||
# Number of replicas of each shard that network tries to maintain
|
||||
replication_factor: 1
|
||||
|
||||
# How many replicas should apply the operation for us to consider it successful
|
||||
write_consistency_factor: 1
|
||||
|
||||
# Default parameters for vectors.
|
||||
vectors:
|
||||
# Whether vectors should be stored in memory or on disk.
|
||||
on_disk: null
|
||||
|
||||
# shard_number_per_node: 1
|
||||
|
||||
# Default quantization configuration.
|
||||
# More info: https://qdrant.tech/documentation/guides/quantization
|
||||
quantization: null
|
||||
|
||||
# Default strict mode parameters for newly created collections.
|
||||
strict_mode:
|
||||
# Whether strict mode is enabled for a collection or not.
|
||||
enabled: false
|
||||
|
||||
# Max allowed `limit` parameter for all APIs that don't have their own max limit.
|
||||
max_query_limit: null
|
||||
|
||||
# Max allowed `timeout` parameter.
|
||||
max_timeout: null
|
||||
|
||||
# Allow usage of unindexed fields in retrieval based (eg. search) filters.
|
||||
unindexed_filtering_retrieve: null
|
||||
|
||||
# Allow usage of unindexed fields in filtered updates (eg. delete by payload).
|
||||
unindexed_filtering_update: null
|
||||
|
||||
# Max HNSW value allowed in search parameters.
|
||||
search_max_hnsw_ef: null
|
||||
|
||||
# Whether exact search is allowed or not.
|
||||
search_allow_exact: null
|
||||
|
||||
# Max oversampling value allowed in search.
|
||||
search_max_oversampling: null
|
||||
|
||||
service:
|
||||
# Maximum size of POST data in a single request in megabytes
|
||||
max_request_size_mb: 32
|
||||
|
||||
# Number of parallel workers used for serving the api. If 0 - equal to the number of available cores.
|
||||
# If missing - Same as storage.max_search_threads
|
||||
max_workers: 0
|
||||
|
||||
# Host to bind the service on
|
||||
host: 0.0.0.0
|
||||
|
||||
# HTTP(S) port to bind the service on
|
||||
http_port: 6333
|
||||
|
||||
# gRPC port to bind the service on.
|
||||
# If `null` - gRPC is disabled. Default: null
|
||||
# Comment to disable gRPC:
|
||||
grpc_port: 6334
|
||||
|
||||
# Enable CORS headers in REST API.
|
||||
# If enabled, browsers would be allowed to query REST endpoints regardless of query origin.
|
||||
# More info: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
|
||||
# Default: true
|
||||
enable_cors: true
|
||||
|
||||
# Enable HTTPS for the REST and gRPC API
|
||||
enable_tls: false
|
||||
|
||||
# Check user HTTPS client certificate against CA file specified in tls config
|
||||
verify_https_client_certificate: false
|
||||
|
||||
# Set an api-key.
|
||||
# If set, all requests must include a header with the api-key.
|
||||
# example header: `api-key: <API-KEY>`
|
||||
#
|
||||
# If you enable this you should also enable TLS.
|
||||
# (Either above or via an external service like nginx.)
|
||||
# Sending an api-key over an unencrypted channel is insecure.
|
||||
#
|
||||
# Uncomment to enable.
|
||||
# api_key: your_secret_api_key_here
|
||||
|
||||
# Set an api-key for read-only operations.
|
||||
# If set, all requests must include a header with the api-key.
|
||||
# example header: `api-key: <API-KEY>`
|
||||
#
|
||||
# If you enable this you should also enable TLS.
|
||||
# (Either above or via an external service like nginx.)
|
||||
# Sending an api-key over an unencrypted channel is insecure.
|
||||
#
|
||||
# Uncomment to enable.
|
||||
# read_only_api_key: your_secret_read_only_api_key_here
|
||||
|
||||
# Uncomment to enable JWT Role Based Access Control (RBAC).
|
||||
# If enabled, you can generate JWT tokens with fine-grained rules for access control.
|
||||
# Use generated token instead of API key.
|
||||
#
|
||||
# jwt_rbac: true
|
||||
|
||||
# Hardware reporting adds information to the API responses with a
|
||||
# hint on how many resources were used to execute the request.
|
||||
#
|
||||
# Uncomment to enable.
|
||||
# hardware_reporting: true
|
||||
|
||||
cluster:
|
||||
# Use `enabled: true` to run Qdrant in distributed deployment mode
|
||||
enabled: false
|
||||
|
||||
# Configuration of the inter-cluster communication
|
||||
p2p:
|
||||
# Port for internal communication between peers
|
||||
port: 6335
|
||||
|
||||
# Use TLS for communication between peers
|
||||
enable_tls: false
|
||||
|
||||
# Configuration related to distributed consensus algorithm
|
||||
consensus:
|
||||
# How frequently peers should ping each other.
|
||||
# Setting this parameter to lower value will allow consensus
|
||||
# to detect disconnected nodes earlier, but too frequent
|
||||
# tick period may create significant network and CPU overhead.
|
||||
# We encourage you NOT to change this parameter unless you know what you are doing.
|
||||
tick_period_ms: 100
|
||||
|
||||
# Compact consensus operations once we have this amount of applied
|
||||
# operations. Allows peers to join quickly with a consensus snapshot without
|
||||
# replaying a huge amount of operations.
|
||||
# If 0 - disable compaction
|
||||
compact_wal_entries: 128
|
||||
|
||||
# Set to true to prevent service from sending usage statistics to the developers.
|
||||
# Read more: https://qdrant.tech/documentation/guides/telemetry
|
||||
telemetry_disabled: true
|
@@ -1,8 +1,9 @@
|
||||
# Ubuntu 24.10 (Oracular Oriole)
|
||||
FROM photoprism/develop:250317-oracular
|
||||
# Ubuntu 25.04 (Plucky Puffin)
|
||||
FROM photoprism/develop:250703-plucky
|
||||
|
||||
## Alternative Environments:
|
||||
# FROM photoprism/develop:armv7 # ARMv7 (32bit)
|
||||
# FROM photoprism/develop:plucky # Ubuntu 25.04 (Plucky Puffin)
|
||||
# FROM photoprism/develop:oracular # Ubuntu 24.10 (Oracular Oriole)
|
||||
# FROM photoprism/develop:noble # Ubuntu 24.04 LTS (Noble Numbat)
|
||||
# FROM photoprism/develop:mantic # Ubuntu 23.10 (Mantic Minotaur)
|
||||
@@ -19,3 +20,5 @@ WORKDIR "/go/src/github.com/photoprism/photoprism"
|
||||
# Copy source to image.
|
||||
COPY . .
|
||||
COPY --chown=root:root /scripts/dist/ /scripts/
|
||||
|
||||
RUN sudo /scripts/install-yt-dlp.sh
|
168
Makefile
168
Makefile
@@ -7,17 +7,19 @@ export GO111MODULE=on
|
||||
|
||||
-include .semver
|
||||
-include .env
|
||||
export
|
||||
|
||||
# Binary file names.
|
||||
BINARY_NAME=photoprism
|
||||
GOIMPORTS=goimports
|
||||
|
||||
# Build version.
|
||||
SEMVER_MAJOR ?= 0
|
||||
# Build version string.
|
||||
SEMVER_MAJOR ?= 1
|
||||
export SEMVER_MAJOR
|
||||
SEMVER_MINOR ?= $(shell date -u +%y%m)
|
||||
export SEMVER_MINOR
|
||||
SEMVER_PATCH ?= $(shell date -u +%d)
|
||||
SEMVER_VERSION ?= $(SEMVER_MAJOR).$(SEMVER_MINOR).$(SEMVER_PATCH)
|
||||
export SEMVER_VERSION
|
||||
|
||||
# Build parameters.
|
||||
BUILD_PATH ?= $(shell realpath "./build")
|
||||
@@ -25,9 +27,12 @@ BUILD_DATE ?= $(shell date -u +%y%m%d)
|
||||
REPORT_DATE ?= $(shell date -u +%Y-%m-%d)
|
||||
BUILD_VERSION ?= $(shell git describe --always)
|
||||
BUILD_TAG ?= $(BUILD_DATE)-$(BUILD_VERSION)
|
||||
export BUILD_TAG
|
||||
BUILD_OS ?= $(shell uname -s)
|
||||
BUILD_ARCH ?= $(shell scripts/dist/arch.sh)
|
||||
BUILD_ARCH ?= $(shell ./scripts/dist/arch.sh)
|
||||
export BUILD_ARCH
|
||||
JS_BUILD_PATH ?= $(shell realpath "./assets/static/build")
|
||||
TF_VERSION ?= 2.18.0
|
||||
|
||||
# Install parameters.
|
||||
INSTALL_PATH ?= $(BUILD_PATH)/photoprism-ce_$(BUILD_TAG)-$(shell echo $(BUILD_OS) | tr '[:upper:]' '[:lower:]')-$(BUILD_ARCH)
|
||||
@@ -69,6 +74,7 @@ test: test-js test-go
|
||||
test-go: reset-sqlite run-test-go
|
||||
test-pkg: reset-sqlite run-test-pkg
|
||||
test-api: reset-sqlite run-test-api
|
||||
test-video: reset-sqlite run-test-video
|
||||
test-entity: reset-sqlite run-test-entity
|
||||
test-commands: reset-sqlite run-test-commands
|
||||
test-photoprism: reset-sqlite run-test-photoprism
|
||||
@@ -146,10 +152,12 @@ clean:
|
||||
[ ! -d "frontend/node_modules" ] || rm -rf frontend/node_modules
|
||||
[ ! -d "$(BUILD_PATH)" ] || rm -rf --preserve-root $(BUILD_PATH)
|
||||
[ ! -d "$(JS_BUILD_PATH)" ] || rm -rf --preserve-root $(JS_BUILD_PATH)
|
||||
clean-build:
|
||||
[ ! -d "$(BUILD_PATH)" ] || rm -rf --preserve-root $(BUILD_PATH)
|
||||
tar.gz:
|
||||
$(info Creating tar.gz archives from the directories in "$(BUILD_PATH)"...)
|
||||
find "$(BUILD_PATH)" -maxdepth 1 -mindepth 1 -type d -name "photoprism*" -exec tar --exclude='.[^/]*' -C {} -czf {}.tar.gz . \;
|
||||
pkg: pkg-amd64 pkg-arm64 pkg-armv7
|
||||
pkg: pkg-amd64 pkg-arm64
|
||||
pkg-amd64:
|
||||
docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" photoprism/develop:jammy make all install tar.gz
|
||||
pkg-arm64:
|
||||
@@ -188,15 +196,15 @@ acceptance-sqlite-restart:
|
||||
rm -rf storage/acceptance/originals/2011
|
||||
rm -rf storage/acceptance/originals/2013
|
||||
rm -rf storage/acceptance/originals/2017
|
||||
./photoprism --auth-mode="public" -c "./storage/acceptance/config-sqlite" --test start -d
|
||||
./photoprism --auth-mode="public" -c "./storage/acceptance/config-sqlite" start -d
|
||||
acceptance-sqlite-stop:
|
||||
./photoprism --auth-mode="public" -c "./storage/acceptance/config-sqlite" --test stop
|
||||
./photoprism --auth-mode="public" -c "./storage/acceptance/config-sqlite" stop
|
||||
acceptance-auth-sqlite-restart:
|
||||
cp -f storage/acceptance/backup.db storage/acceptance/index.db
|
||||
cp -f storage/acceptance/config-sqlite/settingsBackup.yml storage/acceptance/config-sqlite/settings.yml
|
||||
./photoprism --auth-mode="password" -c "./storage/acceptance/config-sqlite" --test start -d
|
||||
./photoprism --auth-mode="password" -c "./storage/acceptance/config-sqlite" start -d
|
||||
acceptance-auth-sqlite-stop:
|
||||
./photoprism --auth-mode="password" -c "./storage/acceptance/config-sqlite" --test stop
|
||||
./photoprism --auth-mode="password" -c "./storage/acceptance/config-sqlite" stop
|
||||
start:
|
||||
./photoprism start -d
|
||||
stop:
|
||||
@@ -232,6 +240,8 @@ dep-npm:
|
||||
sudo npm install -g npm
|
||||
dep-js:
|
||||
(cd frontend && npm ci --no-update-notifier --no-audit)
|
||||
# TODO: If in the future we want to test in a real browser environment, add this (Playwright)
|
||||
# (cd frontend && npx playwright install chromium)
|
||||
dep-go:
|
||||
go build -v ./...
|
||||
dep-upgrade:
|
||||
@@ -271,36 +281,48 @@ build-static:
|
||||
scripts/build.sh static $(BINARY_NAME)
|
||||
build-libheif: build-libheif-amd64 build-libheif-arm64 build-libheif-armv7
|
||||
build-libheif-amd64:
|
||||
docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:oracular ./scripts/dist/build-libheif.sh v1.19.5
|
||||
docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:noble ./scripts/dist/build-libheif.sh v1.19.5
|
||||
docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:jammy ./scripts/dist/build-libheif.sh v1.19.5
|
||||
docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:bookworm ./scripts/dist/build-libheif.sh v1.19.5
|
||||
docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:plucky ./scripts/dist/build-libheif.sh v1.19.7
|
||||
docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:oracular ./scripts/dist/build-libheif.sh v1.19.7
|
||||
docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:noble ./scripts/dist/build-libheif.sh v1.19.7
|
||||
docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:jammy ./scripts/dist/build-libheif.sh v1.19.7
|
||||
docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:bookworm ./scripts/dist/build-libheif.sh v1.19.7
|
||||
build-libheif-arm64:
|
||||
docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:oracular ./scripts/dist/build-libheif.sh v1.19.5
|
||||
docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:noble ./scripts/dist/build-libheif.sh v1.19.5
|
||||
docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:jammy ./scripts/dist/build-libheif.sh v1.19.5
|
||||
docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:bookworm ./scripts/dist/build-libheif.sh v1.19.5
|
||||
docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:plucky ./scripts/dist/build-libheif.sh v1.19.7
|
||||
docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:oracular ./scripts/dist/build-libheif.sh v1.19.7
|
||||
docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:noble ./scripts/dist/build-libheif.sh v1.19.7
|
||||
docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:jammy ./scripts/dist/build-libheif.sh v1.19.7
|
||||
docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:bookworm ./scripts/dist/build-libheif.sh v1.19.7
|
||||
build-libheif-armv7:
|
||||
docker run --rm -u $(UID) --platform=arm --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm -e SYSTEM_ARCH=arm photoprism/develop:armv7 ./scripts/dist/build-libheif.sh v1.19.5
|
||||
docker run --rm -u $(UID) --platform=arm --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm -e SYSTEM_ARCH=arm photoprism/develop:jammy ./scripts/dist/build-libheif.sh v1.19.5
|
||||
docker run --rm -u $(UID) --platform=arm --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm -e SYSTEM_ARCH=arm photoprism/develop:armv7 ./scripts/dist/build-libheif.sh v1.19.7
|
||||
docker run --rm -u $(UID) --platform=arm --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm -e SYSTEM_ARCH=arm photoprism/develop:jammy ./scripts/dist/build-libheif.sh v1.19.7
|
||||
build-libheif-latest: build-libheif-amd64-latest build-libheif-arm64-latest build-libheif-armv7-latest
|
||||
build-libheif-amd64-latest:
|
||||
docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:plucky ./scripts/dist/build-libheif.sh
|
||||
docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:oracular ./scripts/dist/build-libheif.sh
|
||||
docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:noble ./scripts/dist/build-libheif.sh
|
||||
docker run --rm -u $(UID) --platform=amd64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/develop:jammy ./scripts/dist/build-libheif.sh
|
||||
build-libheif-arm64-latest:
|
||||
docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:plucky ./scripts/dist/build-libheif.sh
|
||||
docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:oracular ./scripts/dist/build-libheif.sh
|
||||
docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:noble ./scripts/dist/build-libheif.sh
|
||||
docker run --rm -u $(UID) --platform=arm64 --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/develop:jammy ./scripts/dist/build-libheif.sh
|
||||
build-libheif-armv7-latest:
|
||||
docker run --rm -u $(UID) --platform=arm --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm -e SYSTEM_ARCH=arm photoprism/develop:armv7 ./scripts/dist/build-libheif.sh
|
||||
docker run --rm -u $(UID) --platform=arm --pull=always -v ".:/go/src/github.com/photoprism/photoprism" -e BUILD_ARCH=arm -e SYSTEM_ARCH=arm photoprism/develop:jammy ./scripts/dist/build-libheif.sh
|
||||
build-tensorflow:
|
||||
docker build -t photoprism/tensorflow:build docker/tensorflow
|
||||
docker run -ti photoprism/tensorflow:build bash
|
||||
build-tensorflow-arm64:
|
||||
docker build -t photoprism/tensorflow:arm64 docker/tensorflow/arm64
|
||||
docker run -ti photoprism/tensorflow:arm64 bash
|
||||
build-tensorflow: docker-tensorflow-amd64
|
||||
docker-tensorflow: docker-tensorflow-amd64
|
||||
docker-tensorflow-amd64:
|
||||
docker build --pull --no-cache -t photoprism/tensorflow:latest -t photoprism/tensorflow:amd64 -t photoprism/tensorflow:$(TF_VERSION)-amd64 --build-arg TF_VERSION=$(TF_VERSION) docker/tensorflow
|
||||
terminal-tensorflow: terminal-tensorflow-amd64
|
||||
terminal-tensorflow-amd64:
|
||||
mkdir -p ./build
|
||||
docker run --rm --pull missing -ti --platform=amd64 -v "./build:/build" -e BUILD_ARCH=amd64 -e SYSTEM_ARCH=amd64 photoprism/tensorflow:amd64 bash
|
||||
build-tensorflow-arm64: docker-tensorflow-arm64
|
||||
docker-tensorflow-arm64:
|
||||
docker build --pull --no-cache -t photoprism/tensorflow:arm64 -t photoprism/tensorflow:$(TF_VERSION)-arm64 --build-arg TF_VERSION=$(TF_VERSION) docker/tensorflow/arm64
|
||||
terminal-tensorflow-arm64:
|
||||
mkdir -p ./build
|
||||
docker run --rm --pull missing -ti --platform=arm64 -v "./build:/build" -e BUILD_ARCH=arm64 -e SYSTEM_ARCH=arm64 photoprism/tensorflow:arm64 bash
|
||||
watch-js:
|
||||
(cd frontend && env BUILD_ENV=development NODE_ENV=production npm run watch)
|
||||
test-js:
|
||||
@@ -324,6 +346,21 @@ acceptance-auth-short:
|
||||
acceptance-auth-firefox:
|
||||
$(info Running JS acceptance-auth tests in Firefox...)
|
||||
(cd frontend && npm run testcafe -- firefox:headless --test-grep "^(Common|Core)\:*" --test-meta mode=auth --config-file ./testcaferc.json --disable-native-automation "tests/acceptance")
|
||||
vitest:
|
||||
$(info Running Vitest unit tests...)
|
||||
(cd frontend && npm run vitest)
|
||||
vitest-watch:
|
||||
$(info Running Vitest unit tests in watch mode...)
|
||||
(cd frontend && npm run vitest-watch)
|
||||
vitest-coverage:
|
||||
$(info Running Vitest unit tests with coverage...)
|
||||
(cd frontend && npm run vitest-coverage)
|
||||
vitest-component:
|
||||
$(info Running Vitest component tests...)
|
||||
(cd frontend && npm run vitest-component)
|
||||
vitest-ui:
|
||||
$(info Opening Vitest UI...)
|
||||
(cd frontend && npm run vitest-ui)
|
||||
reset-mariadb:
|
||||
$(info Resetting photoprism database...)
|
||||
mysql < scripts/sql/reset-photoprism.sql
|
||||
@@ -357,6 +394,9 @@ run-test-pkg:
|
||||
run-test-api:
|
||||
$(info Running all API tests...)
|
||||
$(GOTEST) -parallel 2 -count 1 -cpu 2 -tags="slow,develop" -timeout 20m ./internal/api/...
|
||||
run-test-video:
|
||||
$(info Running all video tests...)
|
||||
$(GOTEST) -parallel 2 -count 1 -cpu 2 -tags="slow,develop" -timeout 20m ./internal/ffmpeg/... ./internal/photoprism/dl/... ./pkg/media/...
|
||||
run-test-entity:
|
||||
$(info Running all Entity tests...)
|
||||
$(GOTEST) -parallel 2 -count 1 -cpu 2 -tags="slow,develop" -timeout 20m ./internal/entity/...
|
||||
@@ -385,26 +425,38 @@ docker-pull:
|
||||
$(DOCKER_COMPOSE) -f compose.latest.yaml pull --ignore-pull-failures
|
||||
docker-build:
|
||||
$(DOCKER_COMPOSE) --profile=all pull --ignore-pull-failures
|
||||
$(DOCKER_COMPOSE) down --remove-orphans
|
||||
$(DOCKER_COMPOSE) build --pull
|
||||
docker-nvidia: docker-nvidia-up
|
||||
docker-nvidia-up:
|
||||
docker compose -f compose.nvidia.yaml up
|
||||
docker-local-up:
|
||||
$(DOCKER_COMPOSE) -f compose.local.yaml up --force-recreate
|
||||
docker-local-down:
|
||||
$(DOCKER_COMPOSE) -f compose.local.yaml down -V
|
||||
nvidia: nvidia-up
|
||||
nvidia-build:
|
||||
$(DOCKER_COMPOSE) --profile=qdrant -f compose.nvidia.yaml pull --ignore-pull-failures
|
||||
$(DOCKER_COMPOSE) --profile=qdrant -f compose.nvidia.yaml build
|
||||
nvidia-up:
|
||||
$(DOCKER_COMPOSE) --profile=qdrant -f compose.nvidia.yaml pull --ignore-pull-failures
|
||||
$(DOCKER_COMPOSE) --profile=qdrant -f compose.nvidia.yaml up --remove-orphans
|
||||
nvidia-down:
|
||||
$(DOCKER_COMPOSE) --profile=qdrant -f compose.nvidia.yaml down --remove-orphans
|
||||
intel: intel-up
|
||||
intel-build:
|
||||
$(DOCKER_COMPOSE) -f compose.intel.yaml pull --ignore-pull-failures
|
||||
$(DOCKER_COMPOSE) -f compose.intel.yaml build
|
||||
intel-up:
|
||||
$(DOCKER_COMPOSE) -f compose.intel.yaml pull --ignore-pull-failures
|
||||
$(DOCKER_COMPOSE) -f compose.intel.yaml up --remove-orphans
|
||||
intel-down:
|
||||
$(DOCKER_COMPOSE) -f compose.intel.yaml down --remove-orphans
|
||||
develop: docker-develop
|
||||
docker-develop: docker-develop-latest
|
||||
docker-develop-all: docker-develop-latest docker-develop-other
|
||||
docker-develop-latest: docker-develop-ubuntu
|
||||
docker-develop-debian: docker-develop-bookworm docker-develop-bookworm-slim
|
||||
docker-develop-ubuntu: docker-develop-oracular docker-develop-oracular-slim
|
||||
docker-develop-ubuntu: docker-develop-plucky docker-develop-plucky-slim
|
||||
docker-develop-other: docker-develop-debian docker-develop-bullseye docker-develop-bullseye-slim docker-develop-buster
|
||||
docker-develop-bookworm:
|
||||
docker pull --platform=amd64 debian:bookworm-slim
|
||||
docker pull --platform=arm64 debian:bookworm-slim
|
||||
docker pull --platform=arm debian:bookworm-slim
|
||||
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64,linux/arm bookworm /bookworm "-t photoprism/develop:debian"
|
||||
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 bookworm /bookworm "-t photoprism/develop:debian"
|
||||
docker-develop-bookworm-slim:
|
||||
docker pull --platform=amd64 debian:bookworm-slim
|
||||
docker pull --platform=arm64 debian:bookworm-slim
|
||||
@@ -413,7 +465,7 @@ docker-develop-bullseye:
|
||||
docker pull --platform=amd64 golang:1-bullseye
|
||||
docker pull --platform=arm64 golang:1-bullseye
|
||||
docker pull --platform=arm golang:1-bullseye
|
||||
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64,linux/arm bullseye /bullseye
|
||||
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 bullseye /bullseye
|
||||
docker-develop-bullseye-slim:
|
||||
docker pull --platform=amd64 debian:bullseye-slim
|
||||
docker pull --platform=arm64 debian:bullseye-slim
|
||||
@@ -433,8 +485,7 @@ docker-develop-impish:
|
||||
docker-develop-jammy:
|
||||
docker pull --platform=amd64 ubuntu:jammy
|
||||
docker pull --platform=arm64 ubuntu:jammy
|
||||
docker pull --platform=arm ubuntu:jammy
|
||||
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64,linux/arm jammy /jammy
|
||||
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 jammy /jammy
|
||||
docker-develop-jammy-slim:
|
||||
docker pull --platform=amd64 ubuntu:jammy
|
||||
docker pull --platform=arm64 ubuntu:jammy
|
||||
@@ -466,11 +517,19 @@ docker-develop-noble-slim:
|
||||
docker-develop-oracular:
|
||||
docker pull --platform=amd64 ubuntu:oracular
|
||||
docker pull --platform=arm64 ubuntu:oracular
|
||||
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 oracular /oracular "-t photoprism/develop:latest -t photoprism/develop:ubuntu"
|
||||
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 oracular /oracular
|
||||
docker-develop-oracular-slim:
|
||||
docker pull --platform=amd64 ubuntu:oracular
|
||||
docker pull --platform=arm64 ubuntu:oracular
|
||||
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 oracular-slim /oracular-slim
|
||||
docker-develop-plucky:
|
||||
docker pull --platform=amd64 ubuntu:plucky
|
||||
docker pull --platform=arm64 ubuntu:plucky
|
||||
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 plucky /plucky "-t photoprism/develop:latest -t photoprism/develop:ubuntu"
|
||||
docker-develop-plucky-slim:
|
||||
docker pull --platform=amd64 ubuntu:plucky
|
||||
docker pull --platform=arm64 ubuntu:plucky
|
||||
scripts/docker/buildx-multi.sh develop linux/amd64,linux/arm64 plucky-slim /plucky-slim
|
||||
unstable: docker-unstable
|
||||
docker-unstable: docker-unstable-mantic
|
||||
docker-unstable-jammy:
|
||||
@@ -488,10 +547,10 @@ docker-unstable-mantic:
|
||||
preview: docker-preview-ce
|
||||
docker-preview: docker-preview-ce
|
||||
docker-preview-all: docker-preview-latest docker-preview-other
|
||||
docker-preview-ce: docker-preview-oracular
|
||||
docker-preview-ce: docker-preview-plucky
|
||||
docker-preview-latest: docker-preview-ubuntu
|
||||
docker-preview-debian: docker-preview-bookworm
|
||||
docker-preview-ubuntu: docker-preview-oracular
|
||||
docker-preview-ubuntu: docker-preview-plucky
|
||||
docker-preview-other: docker-preview-debian docker-preview-bullseye
|
||||
docker-preview-arm: docker-preview-arm64 docker-preview-armv7
|
||||
docker-preview-bookworm:
|
||||
@@ -556,12 +615,18 @@ docker-preview-oracular:
|
||||
docker pull --platform=arm64 photoprism/develop:oracular
|
||||
docker pull --platform=arm64 photoprism/develop:oracular-slim
|
||||
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 preview-ce /oracular
|
||||
docker-preview-plucky:
|
||||
docker pull --platform=amd64 photoprism/develop:plucky
|
||||
docker pull --platform=amd64 photoprism/develop:plucky-slim
|
||||
docker pull --platform=arm64 photoprism/develop:plucky
|
||||
docker pull --platform=arm64 photoprism/develop:plucky-slim
|
||||
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 preview-ce /plucky
|
||||
release: docker-release
|
||||
docker-release: docker-release-latest
|
||||
docker-release-all: docker-release-latest docker-release-other
|
||||
docker-release-latest: docker-release-ubuntu
|
||||
docker-release-debian: docker-release-bookworm
|
||||
docker-release-ubuntu: docker-release-oracular
|
||||
docker-release-ubuntu: docker-release-plucky
|
||||
docker-release-other: docker-release-debian docker-release-bullseye
|
||||
docker-release-arm: docker-release-arm64 docker-release-armv7
|
||||
docker-release-bookworm:
|
||||
@@ -626,6 +691,12 @@ docker-release-oracular:
|
||||
docker pull --platform=arm64 photoprism/develop:oracular
|
||||
docker pull --platform=arm64 photoprism/develop:oracular-slim
|
||||
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 ce /oracular
|
||||
docker-release-plucky:
|
||||
docker pull --platform=amd64 photoprism/develop:plucky
|
||||
docker pull --platform=amd64 photoprism/develop:plucky-slim
|
||||
docker pull --platform=arm64 photoprism/develop:plucky
|
||||
docker pull --platform=arm64 photoprism/develop:plucky-slim
|
||||
scripts/docker/buildx-multi.sh photoprism linux/amd64,linux/arm64 ce /plucky
|
||||
start-local:
|
||||
$(DOCKER_COMPOSE) -f compose.local.yaml up -d --wait
|
||||
stop-local:
|
||||
@@ -668,8 +739,12 @@ terminal-preview:
|
||||
$(DOCKER_COMPOSE) -f compose.preview.yaml exec photoprism-preview bash
|
||||
logs-preview:
|
||||
$(DOCKER_COMPOSE) -f compose.preview.yaml logs -f photoprism-preview
|
||||
docker-local: docker-local-oracular
|
||||
docker-local-all: docker-local-oracular docker-local-noble docker-local-mantic docker-local-lunar docker-local-jammy docker-local-bookworm docker-local-bullseye docker-local-buster
|
||||
docker-local: docker-local-plucky
|
||||
docker-local-up:
|
||||
$(DOCKER_COMPOSE) -f compose.local.yaml up --force-recreate
|
||||
docker-local-down:
|
||||
$(DOCKER_COMPOSE) -f compose.local.yaml down --remove-orphans
|
||||
docker-local-all: docker-local-plucky docker-local-oracular docker-local-noble docker-local-mantic docker-local-lunar docker-local-jammy docker-local-bookworm docker-local-bullseye docker-local-buster
|
||||
docker-local-bookworm:
|
||||
docker pull photoprism/develop:bookworm
|
||||
docker pull photoprism/develop:bookworm-slim
|
||||
@@ -706,6 +781,10 @@ docker-local-oracular:
|
||||
docker pull photoprism/develop:oracular
|
||||
docker pull ubuntu:oracular
|
||||
scripts/docker/build.sh photoprism ce-oracular /oracular "-t photoprism/photoprism:local"
|
||||
docker-local-plucky:
|
||||
docker pull photoprism/develop:plucky
|
||||
docker pull ubuntu:plucky
|
||||
scripts/docker/build.sh photoprism ce-plucky /plucky "-t photoprism/photoprism:local"
|
||||
local-develop: docker-local-develop
|
||||
docker-local-develop: docker-local-develop-oracular
|
||||
docker-local-develop-all: docker-local-develop-oracular docker-local-develop-noble docker-local-develop-mantic docker-local-develop-lunar docker-local-develop-jammy docker-local-develop-bookworm docker-local-develop-bullseye docker-local-develop-buster docker-local-develop-impish
|
||||
@@ -736,6 +815,9 @@ docker-local-develop-noble:
|
||||
docker-local-develop-oracular:
|
||||
docker pull ubuntu:oracular
|
||||
scripts/docker/build.sh develop oracular /oracular
|
||||
docker-local-develop-plucky:
|
||||
docker pull ubuntu:plucky
|
||||
scripts/docker/build.sh develop plucky /plucky
|
||||
docker-ddns:
|
||||
docker pull golang:alpine
|
||||
scripts/docker/buildx-multi.sh ddns linux/amd64,linux/arm64 $(BUILD_DATE)
|
||||
|
34
README.md
34
README.md
@@ -12,7 +12,7 @@ PhotoPrism® is an AI-Powered Photos App for the [Decentralized Web](https://en.
|
||||
It makes use of the latest technologies to tag and find pictures automatically without getting in your way.
|
||||
You can run it at home, on a private server, or in the cloud.
|
||||
|
||||

|
||||

|
||||
|
||||
To get a first impression, you are welcome to play with our [public demo](https://try.photoprism.app/). Please be careful not to upload any private, unlawful or offensive pictures.
|
||||
|
||||
@@ -20,23 +20,21 @@ To get a first impression, you are welcome to play with our [public demo](https:
|
||||
|
||||
**Our mission is to provide the most user- and privacy-friendly solution to keep your pictures organized and accessible.** That's why PhotoPrism was built from the ground up to run wherever you need it, without compromising freedom, privacy, or functionality:
|
||||
|
||||
* Browse [all your photos](https://docs.photoprism.app/user-guide/organize/browse/) and [videos](https://try.photoprism.app/library/videos) without worrying about [RAW conversion, duplicates or video formats](https://docs.photoprism.app/user-guide/settings/library/)
|
||||
* Easily find specific pictures using [powerful search filters](https://try.photoprism.app/library/browse?view=cards&q=flower%20color%3Ared)
|
||||
* Recognizes [the faces of your family and friends](https://try.photoprism.app/library/people)
|
||||
* [Automatic classification](https://try.photoprism.app/library/labels) of pictures based on their content and location
|
||||
* [Play Live Photos](https://try.photoprism.app/library/live) by hovering over them in [albums](https://try.photoprism.app/library/albums) and [search results](https://try.photoprism.app/library/browse?view=cards&q=type%3Alive)
|
||||
* Since the [User Interface](https://try.photoprism.app/) is a [Progressive Web App](https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps),
|
||||
it provides a native app-like experience, and you can conveniently install it on the home screen of all major operating systems and mobile devices
|
||||
* Includes four high-resolution [World Maps](https://try.photoprism.app/library/places) to bring back the memories of your favorite trips
|
||||
* Metadata is extracted and merged from Exif, XMP, and other sources such as Google Photos
|
||||
* Many more image properties like [Colors](https://try.photoprism.app/library/browse?view=cards&q=color:red), [Chroma](https://try.photoprism.app/library/browse?view=cards&q=mono%3Atrue), and [Quality](https://try.photoprism.app/library/review) can be searched as well
|
||||
* Use [PhotoSync](https://link.photoprism.app/photosync) to securely backup iOS and Android phones in the background
|
||||
* WebDAV clients such as Microsoft's Windows Explorer and Apple's Finder [can connect directly](https://docs.photoprism.app/user-guide/sync/webdav/) to PhotoPrism, allowing you to open, edit, and delete files from your computer as if they were local
|
||||
<img align="right" height="270" src="https://dl.photoprism.app/img/ui/2025/iphone-crocus-540px.png">
|
||||
|
||||
* Browse [all your pictures](https://docs.photoprism.app/user-guide/organize/browse/) without worrying about [RAW images](https://www.photoprism.app/kb/file-formats) or [video formats](https://docs.photoprism.app/user-guide/organize/video/)
|
||||
* Whether you're using a phone, tablet, or desktop computer, our [intuitive PWA](https://try.photoprism.app/) provides a native app-like experience and can be [easily installed](https://docs.photoprism.app/user-guide/pwa/) on your home screen
|
||||
* Quickly find specific photos and videos with [powerful search filters](https://docs.photoprism.app/user-guide/search/filters/) that can be combined and are available for [many different properties](https://docs.photoprism.app/user-guide/search/filters/#filter-reference), including [labels](https://try.photoprism.app/library/labels), [location](https://try.photoprism.app/library/places?q=s2:47a85a63f764), [resolution](https://try.photoprism.app/library/browse?view=cards&q=mp:4), [color](https://try.photoprism.app/library/browse?view=cards&q=color:red), [chroma](https://try.photoprism.app/library/browse?view=cards&q=mono%3Atrue), and [quality](https://try.photoprism.app/library/review)
|
||||
* [Automatically labels your pictures](https://try.photoprism.app/library/labels) based on content and location, and recognizes the faces of [your family and friends](https://try.photoprism.app/library/people/new)
|
||||
* [Live Photos](https://try.photoprism.app/library/live) start playing when you [hover over them](https://try.photoprism.app/library/browse?view=cards&q=type%3Alive) and when viewing a slideshow
|
||||
* Six high-resolution [World Maps](https://try.photoprism.app/library/places) and our [privacy-preserving geocoding service](https://docs.photoprism.app/getting-started/#maps-places) help bring back memories of your favorite trips and let you explore the world
|
||||
* Metadata can be extracted and merged from Exif, XMP, and other sources like Google Photos
|
||||
* [Use compatible apps](https://docs.photoprism.app/user-guide/native-apps/) like [PhotoSync](https://link.photoprism.app/photosync) to back up iOS and Android phones in the background
|
||||
* WebDAV clients such as [Microsoft's Windows Explorer](https://docs.photoprism.app/user-guide/sync/webdav/#__tabbed_1_2) and [Apple's Finder](https://docs.photoprism.app/user-guide/sync/webdav/#connect-to-a-webdav-server) can [connect directly to PhotoPrism](https://docs.photoprism.app/user-guide/sync/webdav/), allowing you to open, edit, and delete files from your computer as if they were local
|
||||
|
||||
Being completely [**self-funded and independent**](https://link.photoprism.app/membership), we can promise you that we will [never sell your data](https://www.photoprism.app/privacy) and that we will [always be transparent](https://www.photoprism.app/terms) about our software and services. Your data will never be shared with Google, Amazon, Microsoft or Apple unless you intentionally upload files to one of their services. 🔒
|
||||
|
||||
## Getting Started ##
|
||||
<img align="right" width="25%" src="https://www.photoprism.app/user/pages/01.home/03._screenshots/iphone-maps-hybrid-540px.png">
|
||||
|
||||
Step-by-step [installation instructions](https://docs.photoprism.app/getting-started/) for our self-hosted [community edition](https://link.photoprism.app/personal-editions) can be found on [docs.photoprism.app](https://docs.photoprism.app/getting-started/) - all you need is a Web browser and [Docker](https://docs.docker.com/get-docker/) to run the server. It is available for Mac, Linux, and Windows.
|
||||
|
||||
@@ -79,11 +77,15 @@ Common problems can be quickly diagnosed and solved using our [Troubleshooting C
|
||||
|
||||
## Upcoming Features and Enhancements ##
|
||||
|
||||
<a href="https://github.com/orgs/photoprism/projects/5"><img align="right" height="240" src="https://dl.photoprism.app/img/ui/2025/upcoming-features-240px.png"></a>
|
||||
|
||||
Our [Project Roadmap](https://link.photoprism.app/roadmap) shows what tasks are in progress and what features will be implemented next. You are invited to give ideas you like a thumbs-up, so we know what's most popular.
|
||||
|
||||
Be aware that we have a zero-bug policy and do our best to help users when they need support or have other questions. This comes at a price though, as we can't give exact release dates for new features. Our team receives many more requests than can be implemented, so we want to emphasize that we are in no way obligated to implement the features, enhancements, or other changes you request. We do, however, appreciate your feedback and carefully consider all requests.
|
||||
|
||||
**Because sustained funding is key to quickly releasing new features, we encourage you to support our mission by [signing up as a sponsor](https://link.photoprism.app/sponsor) or purchasing a [commercial license](https://www.photoprism.app/teams). Ultimately, that's what's best for the product and the community.**
|
||||
**Because sustained funding is key to quickly releasing new features, we encourage you to support our mission by [signing up for a personal membership](https://link.photoprism.app/membership) or [purchasing a commercial license](https://www.photoprism.app/teams#compare).**
|
||||
|
||||
[Become a Member ›](https://link.photoprism.app/membership)
|
||||
|
||||
## GitHub Issues ⚠️ ##
|
||||
|
||||
@@ -96,6 +98,8 @@ We kindly ask you not to report bugs via GitHub Issues **unless you are certain
|
||||
|
||||
## Connect with the Community ##
|
||||
|
||||
<a href="https://link.photoprism.app/chat"><img align="right" width="144" height="144" src="https://dl.photoprism.app/img/brands/element-logo.svg"></a>
|
||||
|
||||
Follow us on [Mastodon](https://floss.social/@photoprism), [Bluesky](https://bsky.app/profile/photoprism.app), or join the [Community Chat](https://link.photoprism.app/chat) to get regular updates, connect with other users, and discuss your ideas. Our [Code of Conduct](https://www.photoprism.app/code-of-conduct) explains the "dos and don’ts" when interacting with other community members.
|
||||
|
||||
As a [contributor](CONTRIBUTING.md), you are also welcome to [contact us directly](https://www.photoprism.app/contact) if you have something on your mind that you don't want to discuss publicly. Please note, however, that due to the high volume of emails we receive, our team may be unable to get back to you immediately. We do our best to respond within five business days or less.
|
||||
|
@@ -30,6 +30,8 @@ You are [welcome to contact us](https://www.photoprism.app/contact) for change r
|
||||
|
||||
**[Andreas Krizek](https://github.com/Cosmic314)** (January 2025)
|
||||
|
||||
**[Jason Grim](https://github.com/jgrim)** (June 2025)
|
||||
|
||||
## Gold Sponsors ##
|
||||
|
||||
[**Simen Eriksen**](https://github.com/dennorske) (GitHub Sponsors, December 2019)
|
||||
|
@@ -1,4 +1,8 @@
|
||||
examples
|
||||
efficientnet
|
||||
imagenet
|
||||
resnet
|
||||
vision
|
||||
README.md
|
||||
docs
|
||||
.*
|
BIN
assets/examples/bear.m2ts
Normal file
BIN
assets/examples/bear.m2ts
Normal file
Binary file not shown.
BIN
assets/examples/cat_224.jpeg
Normal file
BIN
assets/examples/cat_224.jpeg
Normal file
Binary file not shown.
After Width: | Height: | Size: 16 KiB |
BIN
assets/examples/cat_720.jpeg
Normal file
BIN
assets/examples/cat_720.jpeg
Normal file
Binary file not shown.
After Width: | Height: | Size: 98 KiB |
BIN
assets/examples/example.zip
Normal file
BIN
assets/examples/example.zip
Normal file
Binary file not shown.
BIN
assets/examples/green.jpg
Normal file
BIN
assets/examples/green.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 22 KiB |
BIN
assets/examples/m2ts.mp4
Normal file
BIN
assets/examples/m2ts.mp4
Normal file
Binary file not shown.
@@ -2,25 +2,25 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-03-11 19:22+0000\n"
|
||||
"PO-Revision-Date: 2025-03-11 19:36+0000\n"
|
||||
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
|
||||
"POT-Creation-Date: 2025-03-15 12:54+0000\n"
|
||||
"PO-Revision-Date: 2025-05-12 23:50+0000\n"
|
||||
"Last-Translator: Admin <hello@photoprism.app>\n"
|
||||
"Language-Team: Japanese <https://translate.photoprism.app/projects/"
|
||||
"photoprism/backend/ja/>\n"
|
||||
"Language: ja_JP\n"
|
||||
"Language: ja\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Weblate 5.9.2\n"
|
||||
"X-Generator: Weblate 5.11.1\n"
|
||||
|
||||
#: messages.go:103
|
||||
msgid "Something went wrong, try again"
|
||||
msgstr "問題が発生しました。もう一度やり直してください"
|
||||
msgstr "何かが間違っています。もう一度やり直してください"
|
||||
|
||||
#: messages.go:104
|
||||
msgid "Unable to do that"
|
||||
msgstr "実行できませんでした"
|
||||
msgstr "その操作はできません"
|
||||
|
||||
#: messages.go:105
|
||||
msgid "Changes could not be saved"
|
||||
@@ -45,7 +45,7 @@ msgstr "ファイルが見つかりませんでした"
|
||||
|
||||
#: messages.go:110
|
||||
msgid "File too large"
|
||||
msgstr "ファイルサイズが大きすぎます"
|
||||
msgstr "ファイルが大きすぎます"
|
||||
|
||||
#: messages.go:111
|
||||
msgid "Unsupported"
|
||||
@@ -53,7 +53,7 @@ msgstr "サポートされていません"
|
||||
|
||||
#: messages.go:112
|
||||
msgid "Unsupported type"
|
||||
msgstr "サポートされていないタイプ"
|
||||
msgstr "サポートされていない形式です"
|
||||
|
||||
#: messages.go:113
|
||||
msgid "Unsupported format"
|
||||
@@ -61,7 +61,7 @@ msgstr "非対応のフォーマットです"
|
||||
|
||||
#: messages.go:114
|
||||
msgid "Originals folder is empty"
|
||||
msgstr "Originalsフォルダーが空です"
|
||||
msgstr "Originals フォルダーは空です"
|
||||
|
||||
#: messages.go:115
|
||||
msgid "Selection not found"
|
||||
@@ -73,19 +73,19 @@ msgstr "エンティティが見つかりません"
|
||||
|
||||
#: messages.go:117
|
||||
msgid "Account not found"
|
||||
msgstr "アカウントは存在しません"
|
||||
msgstr "アカウントが存在しません"
|
||||
|
||||
#: messages.go:118
|
||||
msgid "User not found"
|
||||
msgstr "ユーザは存在しません"
|
||||
msgstr "ユーザーが存在しません"
|
||||
|
||||
#: messages.go:119
|
||||
msgid "Label not found"
|
||||
msgstr "ラベルは存在しません"
|
||||
msgstr "ラベルが存在しません"
|
||||
|
||||
#: messages.go:120
|
||||
msgid "Album not found"
|
||||
msgstr "アルバムは存在しません"
|
||||
msgstr "アルバムが存在しません"
|
||||
|
||||
#: messages.go:121
|
||||
msgid "Subject not found"
|
||||
@@ -113,7 +113,7 @@ msgstr "アカウントにログインしてください"
|
||||
|
||||
#: messages.go:127
|
||||
msgid "Permission denied"
|
||||
msgstr "アクセス拒否"
|
||||
msgstr "アクセスが拒否されました"
|
||||
|
||||
#: messages.go:128
|
||||
msgid "Upload might be offensive"
|
||||
@@ -121,7 +121,7 @@ msgstr "アップロードされた項目に過激なものが含まれている
|
||||
|
||||
#: messages.go:129
|
||||
msgid "Upload failed"
|
||||
msgstr "アップロード失敗"
|
||||
msgstr "アップロードに失敗しました"
|
||||
|
||||
#: messages.go:130
|
||||
msgid "No items selected"
|
||||
@@ -129,15 +129,15 @@ msgstr "項目が選択されていません"
|
||||
|
||||
#: messages.go:131
|
||||
msgid "Failed creating file, please check permissions"
|
||||
msgstr "ファイルの作成に失敗しました、権限を確認してください"
|
||||
msgstr "ファイルの作成に失敗しました。権限を確認してください"
|
||||
|
||||
#: messages.go:132
|
||||
msgid "Failed creating folder, please check permissions"
|
||||
msgstr "フォルダの作成に失敗しました、権限を確認してください"
|
||||
msgstr "フォルダの作成に失敗しました。権限を確認してください"
|
||||
|
||||
#: messages.go:133
|
||||
msgid "Could not connect, please try again"
|
||||
msgstr "接続できませんでした、再度試してみてください"
|
||||
msgstr "接続できませんでした。もう一度お試しください"
|
||||
|
||||
#: messages.go:134
|
||||
msgid "Enter verification code"
|
||||
@@ -149,7 +149,7 @@ msgstr "認証コードが無効です。もう一度お試しください"
|
||||
|
||||
#: messages.go:136
|
||||
msgid "Invalid password, please try again"
|
||||
msgstr "不正なパスワードです、再度試してみてください"
|
||||
msgstr "不正なパスワードです。もう一度お試しください"
|
||||
|
||||
#: messages.go:137
|
||||
msgid "Feature disabled"
|
||||
@@ -173,28 +173,28 @@ msgstr "zip ファイルの作成に失敗しました"
|
||||
|
||||
#: messages.go:142
|
||||
msgid "Invalid credentials"
|
||||
msgstr "不正な認証情報"
|
||||
msgstr "正しくない認証情報です"
|
||||
|
||||
#: messages.go:143
|
||||
msgid "Invalid link"
|
||||
msgstr "不正なリンク"
|
||||
msgstr "正しくないリンクです"
|
||||
|
||||
#: messages.go:144
|
||||
msgid "Invalid name"
|
||||
msgstr "無効なバケット名"
|
||||
msgstr "無効な名前です"
|
||||
|
||||
#: messages.go:145
|
||||
msgid "Busy, please try again later"
|
||||
msgstr "混雑しています、後で再試行してください"
|
||||
msgstr "他の処理中です。後で再試行してください"
|
||||
|
||||
#: messages.go:146
|
||||
#, c-format
|
||||
msgid "The wakeup interval is %s, but must be 1h or less"
|
||||
msgstr "ウェイクアップ間隔は%sであるが、1h以下でなければならない"
|
||||
msgstr "ウェイクアップ間隔は %s ですが、1時間以内で指定する必要があります"
|
||||
|
||||
#: messages.go:147
|
||||
msgid "Your account could not be connected"
|
||||
msgstr "お客様のアカウントに接続できませんでした"
|
||||
msgstr "アカウントに接続できませんでした"
|
||||
|
||||
#: messages.go:148
|
||||
msgid "Too many requests"
|
||||
@@ -202,7 +202,7 @@ msgstr "リクエストが多すぎます"
|
||||
|
||||
#: messages.go:149
|
||||
msgid "Insufficient storage"
|
||||
msgstr "ストレージ不足"
|
||||
msgstr "ストレージが不足しています"
|
||||
|
||||
#: messages.go:150
|
||||
msgid "Quota exceeded"
|
||||
@@ -214,16 +214,16 @@ msgstr "変更が正常に保存されました"
|
||||
|
||||
#: messages.go:154
|
||||
msgid "Album created"
|
||||
msgstr "アルバムを作成しました"
|
||||
msgstr "アルバムが作成されました"
|
||||
|
||||
#: messages.go:155
|
||||
msgid "Album saved"
|
||||
msgstr "アルバムを保存しました"
|
||||
msgstr "アルバムが保存されました"
|
||||
|
||||
#: messages.go:156
|
||||
#, c-format
|
||||
msgid "Album %s deleted"
|
||||
msgstr "アルバム %s を削除しました"
|
||||
msgstr "アルバム %s が削除されました"
|
||||
|
||||
#: messages.go:157
|
||||
msgid "Album contents cloned"
|
||||
@@ -298,7 +298,7 @@ msgstr "インデックスが %d 秒で完了しました"
|
||||
|
||||
#: messages.go:173
|
||||
msgid "Indexing originals..."
|
||||
msgstr "オリジナルの項目をインデックスしています..."
|
||||
msgstr "originals をインデックスしています..."
|
||||
|
||||
#: messages.go:174
|
||||
#, c-format
|
||||
@@ -338,7 +338,7 @@ msgstr "保存対象"
|
||||
|
||||
#: messages.go:182
|
||||
msgid "Subject deleted"
|
||||
msgstr "件名 削除"
|
||||
msgstr "件名を削除しました"
|
||||
|
||||
#: messages.go:183
|
||||
msgid "Person saved"
|
||||
@@ -346,11 +346,11 @@ msgstr "保存された人"
|
||||
|
||||
#: messages.go:184
|
||||
msgid "Person deleted"
|
||||
msgstr "削除された人"
|
||||
msgstr "人を削除しました"
|
||||
|
||||
#: messages.go:185
|
||||
msgid "File uploaded"
|
||||
msgstr "アップロードされたファイル"
|
||||
msgstr "ファイルがアップロードされました"
|
||||
|
||||
#: messages.go:186
|
||||
#, c-format
|
||||
@@ -363,7 +363,7 @@ msgstr "アップロードの処理..."
|
||||
|
||||
#: messages.go:188
|
||||
msgid "Upload has been processed"
|
||||
msgstr "アップロードが処理されました"
|
||||
msgstr "アップロードが完了しました"
|
||||
|
||||
#: messages.go:189
|
||||
msgid "Selection approved"
|
||||
@@ -379,7 +379,7 @@ msgstr "選択した項目が復元されました"
|
||||
|
||||
#: messages.go:192
|
||||
msgid "Selection marked as private"
|
||||
msgstr "選択した項目をプライベートにしました"
|
||||
msgstr "選択した項目がプライベートに設定されました"
|
||||
|
||||
#: messages.go:193
|
||||
msgid "Albums deleted"
|
||||
@@ -392,7 +392,7 @@ msgstr "%d 秒で zip ファイルを作成しました"
|
||||
|
||||
#: messages.go:195
|
||||
msgid "Permanently deleted"
|
||||
msgstr "永久に削除"
|
||||
msgstr "完全に削除されました"
|
||||
|
||||
#: messages.go:196
|
||||
#, c-format
|
@@ -28,8 +28,8 @@
|
||||
<div class="splash-logo">
|
||||
{{template "logo.gohtml" .}}
|
||||
</div>
|
||||
<progress id="progress" class="html-progress" max="100"></progress>
|
||||
<progress id="progress" class="html-progress" role="progressbar" max="100"></progress>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="busy-overlay"><div class="splash-center"><progress id="busy-progress" class="html-progress" max="100"></progress></div></div>
|
||||
<div id="busy-overlay"><div class="splash-center"><progress id="busy-progress" class="html-progress" role="progressbar" max="100"></progress></div></div>
|
@@ -62,12 +62,12 @@ services:
|
||||
# PHOTOPRISM_THUMB_SIZE: 4096 # Retina 4K, DCI 4K (requires more storage); 7680 for 8K Ultra HD
|
||||
PHOTOPRISM_THUMB_SIZE_UNCACHED: 7680 # On-demand rendering size limit (default 7680, min 720, max 7680)
|
||||
PHOTOPRISM_JPEG_SIZE: 7680 # Size limit for converted image files in pixels (720-30000)
|
||||
TF_CPP_MIN_LOG_LEVEL: 0 # Show TensorFlow log messages for development
|
||||
TF_CPP_MIN_LOG_LEVEL: 1 # Show TensorFlow log messages for development
|
||||
## Enable TensorFlow AVX2 support for modern Intel CPUs (requires starting the container as root):
|
||||
# PHOTOPRISM_INIT: "tensorflow-amd64-avx2"
|
||||
## Hardware video transcoding config (optional):
|
||||
# PHOTOPRISM_FFMPEG_BUFFERS: "64" # FFmpeg capture buffers (default: 32)
|
||||
# PHOTOPRISM_FFMPEG_BITRATE: "32" # FFmpeg encoding bitrate limit in Mbit/s (default: 50)
|
||||
# PHOTOPRISM_FFMPEG_BITRATE: "32" # FFmpeg encoding bitrate limit in Mbps (default: 60)
|
||||
# PHOTOPRISM_FFMPEG_ENCODER: "h264_v4l2m2m" # Use Video4Linux for AVC transcoding (default: libx264)
|
||||
# PHOTOPRISM_FFMPEG_ENCODER: "h264_qsv" # Use Intel Quick Sync Video for AVC transcoding (default: libx264)
|
||||
# PHOTOPRISM_INIT: "intel-graphics tensorflow-amd64-avx2" # Enable TensorFlow AVX2 & Intel Graphics support
|
||||
|
174
compose.intel.yaml
Normal file
174
compose.intel.yaml
Normal file
@@ -0,0 +1,174 @@
|
||||
services:
|
||||
## PhotoPrism (Development Environment for Intel QSV hardware transcoding)
|
||||
photoprism:
|
||||
build: .
|
||||
image: photoprism/photoprism:develop
|
||||
depends_on:
|
||||
- mariadb
|
||||
- dummy-webdav
|
||||
- dummy-oidc
|
||||
stop_grace_period: 10s
|
||||
privileged: true
|
||||
security_opt:
|
||||
- seccomp:unconfined
|
||||
- apparmor:unconfined
|
||||
## Expose HTTP and debug ports
|
||||
ports:
|
||||
- "2342:2342" # Default HTTP port (host:container)
|
||||
- "2443:2443" # Default TLS port (host:container)
|
||||
- "2343:2343" # Acceptance Test HTTP port (host:container)
|
||||
- "40000:40000" # Go Debugger (host:container)
|
||||
shm_size: "2gb"
|
||||
## Set links and labels for use with Traefik reverse proxy
|
||||
links:
|
||||
- "traefik:localssl.dev"
|
||||
- "traefik:app.localssl.dev"
|
||||
- "traefik:keycloak.localssl.dev"
|
||||
- "traefik:dummy-oidc.localssl.dev"
|
||||
- "traefik:dummy-webdav.localssl.dev"
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.services.photoprism.loadbalancer.server.port=2342"
|
||||
- "traefik.http.services.photoprism.loadbalancer.server.scheme=http"
|
||||
- "traefik.http.routers.photoprism.entrypoints=websecure"
|
||||
- "traefik.http.routers.photoprism.rule=Host(`localssl.dev`) || HostRegexp(`^.+\\.localssl\\.dev`)"
|
||||
- "traefik.http.routers.photoprism.priority=2"
|
||||
- "traefik.http.routers.photoprism.tls.domains[0].main=localssl.dev"
|
||||
- "traefik.http.routers.photoprism.tls.domains[0].sans=*.localssl.dev"
|
||||
- "traefik.http.routers.photoprism.tls=true"
|
||||
## Configure development environment
|
||||
environment:
|
||||
## Run as a non-root user after initialization (supported: 0, 33, 50-99, 500-600, and 900-1200):
|
||||
PHOTOPRISM_UID: ${UID:-1000} # user id, should match your host user id
|
||||
PHOTOPRISM_GID: ${GID:-1000} # group id
|
||||
## Access Management:
|
||||
PHOTOPRISM_ADMIN_USER: "admin" # admin login username
|
||||
PHOTOPRISM_ADMIN_PASSWORD: "photoprism" # initial admin password (8-72 characters)
|
||||
PHOTOPRISM_AUTH_MODE: "password" # authentication mode (public, password)
|
||||
PHOTOPRISM_REGISTER_URI: "https://keycloak.localssl.dev/admin/"
|
||||
PHOTOPRISM_PASSWORD_RESET_URI: "https://keycloak.localssl.dev/realms/master/login-actions/reset-credentials"
|
||||
PHOTOPRISM_USAGE_INFO: "true"
|
||||
PHOTOPRISM_FILES_QUOTA: "100"
|
||||
## Customization:
|
||||
PHOTOPRISM_DEFAULT_LOCALE: "en" # default user interface language, e.g. "en" or "de"
|
||||
PHOTOPRISM_PLACES_LOCALE: "local" # location details language, e.g. "local", "en", or
|
||||
## OpenID Connect (pre-configured for local tests):
|
||||
## see https://keycloak.localssl.dev/realms/master/.well-known/openid-configuration
|
||||
PHOTOPRISM_OIDC_URI: "https://keycloak.localssl.dev/realms/master"
|
||||
PHOTOPRISM_OIDC_CLIENT: "photoprism-develop"
|
||||
PHOTOPRISM_OIDC_SECRET: "9d8351a0-ca01-4556-9c37-85eb634869b9"
|
||||
PHOTOPRISM_OIDC_PROVIDER: "Keycloak"
|
||||
PHOTOPRISM_OIDC_REGISTER: "true"
|
||||
PHOTOPRISM_OIDC_WEBDAV: "true"
|
||||
PHOTOPRISM_DISABLE_OIDC: "false"
|
||||
## LDAP Authentication (pre-configured for local tests):
|
||||
PHOTOPRISM_LDAP_URI: "ldap://dummy-ldap:389"
|
||||
PHOTOPRISM_LDAP_INSECURE: "true"
|
||||
PHOTOPRISM_LDAP_SYNC: "true"
|
||||
PHOTOPRISM_LDAP_BIND: "simple"
|
||||
PHOTOPRISM_LDAP_BIND_DN: "cn"
|
||||
PHOTOPRISM_LDAP_BASE_DN: "dc=localssl,dc=dev"
|
||||
PHOTOPRISM_LDAP_ROLE: ""
|
||||
PHOTOPRISM_LDAP_ROLE_DN: "ou=photoprism-*,ou=groups,dc=localssl,dc=dev"
|
||||
PHOTOPRISM_LDAP_WEBDAV_DN: "ou=photoprism-webdav,ou=groups,dc=localssl,dc=dev"
|
||||
## HTTPS/TLS Options:
|
||||
## see https://docs.photoprism.app/getting-started/using-https/
|
||||
PHOTOPRISM_DISABLE_TLS: "true"
|
||||
PHOTOPRISM_DEFAULT_TLS: "true"
|
||||
## Site Information:
|
||||
PHOTOPRISM_SITE_URL: "https://app.localssl.dev/" # server URL in the format "http(s)://domain.name(:port)/(path)"
|
||||
PHOTOPRISM_SITE_CAPTION: "AI-Powered Photos App"
|
||||
PHOTOPRISM_SITE_DESCRIPTION: "Tags and finds pictures without getting in your way!"
|
||||
PHOTOPRISM_SITE_AUTHOR: "@photoprism_app"
|
||||
PHOTOPRISM_DEBUG: "true"
|
||||
PHOTOPRISM_READONLY: "false"
|
||||
PHOTOPRISM_EXPERIMENTAL: "true"
|
||||
PHOTOPRISM_HTTP_MODE: "debug"
|
||||
PHOTOPRISM_HTTP_HOST: "0.0.0.0"
|
||||
PHOTOPRISM_HTTP_PORT: 2342
|
||||
PHOTOPRISM_HTTP_COMPRESSION: "gzip" # improves transfer speed and bandwidth utilization (none or gzip)
|
||||
PHOTOPRISM_DATABASE_DRIVER: "mysql"
|
||||
PHOTOPRISM_DATABASE_SERVER: "mariadb:4001"
|
||||
PHOTOPRISM_DATABASE_NAME: "photoprism"
|
||||
PHOTOPRISM_DATABASE_USER: "root"
|
||||
PHOTOPRISM_DATABASE_PASSWORD: "photoprism"
|
||||
PHOTOPRISM_TEST_DRIVER: "sqlite"
|
||||
# PHOTOPRISM_TEST_DSN_MYSQL8: "root:photoprism@tcp(mysql:4001)/photoprism?charset=utf8mb4,utf8&collation=utf8mb4_unicode_ci&parseTime=true&timeout=15s"
|
||||
PHOTOPRISM_ASSETS_PATH: "/go/src/github.com/photoprism/photoprism/assets"
|
||||
PHOTOPRISM_STORAGE_PATH: "/go/src/github.com/photoprism/photoprism/storage"
|
||||
PHOTOPRISM_ORIGINALS_PATH: "/go/src/github.com/photoprism/photoprism/storage/originals"
|
||||
PHOTOPRISM_ORIGINALS_LIMIT: 128000 # sets originals file size limit to 128 GB
|
||||
PHOTOPRISM_IMPORT_PATH: "/go/src/github.com/photoprism/photoprism/storage/import"
|
||||
PHOTOPRISM_DISABLE_CHOWN: "false" # disables updating storage permissions via chmod and chown on startup
|
||||
PHOTOPRISM_DISABLE_BACKUPS: "false" # disables backing up albums and photo metadata to YAML files
|
||||
PHOTOPRISM_DISABLE_WEBDAV: "false" # disables built-in WebDAV server
|
||||
PHOTOPRISM_DISABLE_SETTINGS: "false" # disables settings UI and API
|
||||
PHOTOPRISM_DISABLE_PLACES: "false" # disables reverse geocoding and maps
|
||||
PHOTOPRISM_DISABLE_EXIFTOOL: "false" # disables creating JSON metadata sidecar files with ExifTool
|
||||
PHOTOPRISM_DISABLE_TENSORFLOW: "false" # disables all features depending on TensorFlow
|
||||
PHOTOPRISM_DISABLE_RAW: "false" # disables indexing and conversion of RAW images
|
||||
PHOTOPRISM_RAW_PRESETS: "false" # enables applying user presets when converting RAW images (reduces performance)
|
||||
PHOTOPRISM_DETECT_NSFW: "false" # automatically flags photos as private that MAY be offensive (requires TensorFlow)
|
||||
PHOTOPRISM_UPLOAD_NSFW: "false" # allows uploads that MAY be offensive (no effect without TensorFlow)
|
||||
PHOTOPRISM_THUMB_LIBRARY: "auto" # image processing library to be used for generating thumbnails (auto, imaging, vips)
|
||||
PHOTOPRISM_THUMB_FILTER: "auto" # downscaling filter (imaging best to worst: blackman, lanczos, cubic, linear, nearest)
|
||||
PHOTOPRISM_THUMB_UNCACHED: "true" # enables on-demand thumbnail rendering (high memory and cpu usage)
|
||||
TF_CPP_MIN_LOG_LEVEL: 1 # show TensorFlow log messages for development
|
||||
## Intel Quick Sync Video (QSV) (https://docs.photoprism.app/getting-started/advanced/transcoding/#intel-quick-sync):
|
||||
PHOTOPRISM_FFMPEG_ENCODER: "intel" # H.264/AVC encoder (software, intel, nvidia, apple, raspberry, or vaapi)
|
||||
PHOTOPRISM_FFMPEG_SIZE: "1920" # video size limit in pixels (720-7680) (default: 3840)
|
||||
# PHOTOPRISM_FFMPEG_BITRATE: "60" # video bitrate limit in Mbps (default: 60)
|
||||
## Run/install on first startup (options: update tensorflow https intel gpu davfs yt-dlp):
|
||||
PHOTOPRISM_INIT: "https intel tensorflow yt-dlp"
|
||||
## Share hardware devices with FFmpeg for hardware video transcoding:
|
||||
devices:
|
||||
- "/dev/dri:/dev/dri"
|
||||
working_dir: "/go/src/github.com/photoprism/photoprism"
|
||||
volumes:
|
||||
- ".:/go/src/github.com/photoprism/photoprism"
|
||||
- "./storage:/photoprism"
|
||||
- "go-mod:/go/pkg/mod"
|
||||
|
||||
mariadb:
|
||||
extends:
|
||||
file: ./compose.yaml
|
||||
service: mariadb
|
||||
qdrant:
|
||||
extends:
|
||||
file: ./compose.yaml
|
||||
service: qdrant
|
||||
photoprism-vision:
|
||||
extends:
|
||||
file: ./compose.yaml
|
||||
service: photoprism-vision
|
||||
traefik:
|
||||
extends:
|
||||
file: ./compose.yaml
|
||||
service: traefik
|
||||
dummy-webdav:
|
||||
extends:
|
||||
file: ./compose.yaml
|
||||
service: dummy-webdav
|
||||
dummy-oidc:
|
||||
extends:
|
||||
file: ./compose.yaml
|
||||
service: dummy-oidc
|
||||
dummy-ldap:
|
||||
extends:
|
||||
file: ./compose.yaml
|
||||
service: dummy-ldap
|
||||
keycloak:
|
||||
extends:
|
||||
file: ./compose.yaml
|
||||
service: keycloak
|
||||
prometheus:
|
||||
extends:
|
||||
file: ./compose.yaml
|
||||
service: prometheus
|
||||
|
||||
## Create named volume for Go module cache
|
||||
volumes:
|
||||
go-mod:
|
||||
driver: local
|
||||
mariadb:
|
||||
driver: local
|
@@ -57,7 +57,7 @@ services:
|
||||
# PHOTOPRISM_THUMB_SIZE: 4096 # Retina 4K, DCI 4K (requires more storage); 7680 for 8K Ultra HD
|
||||
PHOTOPRISM_THUMB_SIZE_UNCACHED: 7680 # on-demand rendering size limit (default 7680, min 720, max 7680)
|
||||
PHOTOPRISM_JPEG_SIZE: 7680 # size limit for converted image files in pixels (720-30000)
|
||||
TF_CPP_MIN_LOG_LEVEL: 0 # show TensorFlow log messages for development
|
||||
TF_CPP_MIN_LOG_LEVEL: 1 # show TensorFlow log messages for development
|
||||
working_dir: "/photoprism"
|
||||
volumes:
|
||||
- "./storage:/photoprism/storage"
|
||||
|
@@ -58,7 +58,7 @@ services:
|
||||
# PHOTOPRISM_THUMB_SIZE: 4096 # Retina 4K, DCI 4K (requires more storage); 7680 for 8K Ultra HD
|
||||
PHOTOPRISM_THUMB_SIZE_UNCACHED: 7680 # on-demand rendering size limit (default 7680, min 720, max 7680)
|
||||
PHOTOPRISM_JPEG_SIZE: 7680 # size limit for converted image files in pixels (720-30000)
|
||||
TF_CPP_MIN_LOG_LEVEL: 0 # show TensorFlow log messages for development
|
||||
TF_CPP_MIN_LOG_LEVEL: 1 # show TensorFlow log messages for development
|
||||
# PHOTOPRISM_INIT: "http gpu tensorflow" # Options: "update https gpu tensorflow davfs clitools clean"
|
||||
PHOTOPRISM_FFMPEG_ENCODER: "nvidia" # Options: "software", "intel", "nvidia", "apple", "raspberry"
|
||||
PHOTOPRISM_STORAGE_PATH: "/photoprism/storage"
|
||||
|
@@ -3,11 +3,13 @@ services:
|
||||
photoprism:
|
||||
build: .
|
||||
image: photoprism/photoprism:develop
|
||||
runtime: nvidia
|
||||
depends_on:
|
||||
- mariadb
|
||||
- dummy-webdav
|
||||
- dummy-oidc
|
||||
stop_grace_period: 10s
|
||||
privileged: true
|
||||
security_opt:
|
||||
- seccomp:unconfined
|
||||
- apparmor:unconfined
|
||||
@@ -22,6 +24,8 @@ services:
|
||||
links:
|
||||
- "traefik:localssl.dev"
|
||||
- "traefik:app.localssl.dev"
|
||||
- "traefik:vision.localssl.dev"
|
||||
- "traefik:qdrant.localssl.dev"
|
||||
- "traefik:keycloak.localssl.dev"
|
||||
- "traefik:dummy-oidc.localssl.dev"
|
||||
- "traefik:dummy-webdav.localssl.dev"
|
||||
@@ -48,6 +52,9 @@ services:
|
||||
PHOTOPRISM_PASSWORD_RESET_URI: "https://keycloak.localssl.dev/realms/master/login-actions/reset-credentials"
|
||||
PHOTOPRISM_USAGE_INFO: "true"
|
||||
PHOTOPRISM_FILES_QUOTA: "100"
|
||||
## Customization:
|
||||
PHOTOPRISM_DEFAULT_LOCALE: "en" # default user interface language, e.g. "en" or "de"
|
||||
PHOTOPRISM_PLACES_LOCALE: "local" # location details language, e.g. "local", "en", or
|
||||
## OpenID Connect (pre-configured for local tests):
|
||||
## see https://keycloak.localssl.dev/realms/master/.well-known/openid-configuration
|
||||
PHOTOPRISM_OIDC_URI: "https://keycloak.localssl.dev/realms/master"
|
||||
@@ -109,15 +116,15 @@ services:
|
||||
PHOTOPRISM_THUMB_LIBRARY: "auto" # image processing library to be used for generating thumbnails (auto, imaging, vips)
|
||||
PHOTOPRISM_THUMB_FILTER: "auto" # downscaling filter (imaging best to worst: blackman, lanczos, cubic, linear, nearest)
|
||||
PHOTOPRISM_THUMB_UNCACHED: "true" # enables on-demand thumbnail rendering (high memory and cpu usage)
|
||||
TF_CPP_MIN_LOG_LEVEL: 0 # show TensorFlow log messages for development
|
||||
TF_CPP_MIN_LOG_LEVEL: 1 # show TensorFlow log messages for development
|
||||
## Nvidia Video Transcoding (https://docs.photoprism.app/getting-started/advanced/transcoding/#nvidia-container-toolkit):
|
||||
NVIDIA_VISIBLE_DEVICES: "all"
|
||||
NVIDIA_DRIVER_CAPABILITIES: "compute,video,utility"
|
||||
NVIDIA_DRIVER_CAPABILITIES: "all"
|
||||
PHOTOPRISM_FFMPEG_ENCODER: "nvidia" # H.264/AVC encoder (software, intel, nvidia, apple, raspberry, or vaapi)
|
||||
PHOTOPRISM_FFMPEG_SIZE: "1920" # video size limit in pixels (720-7680) (default: 3840)
|
||||
PHOTOPRISM_FFMPEG_BITRATE: "50" # video bitrate limit in Mbit/s (default: 50)
|
||||
## Run/install on first startup (options: update https gpu ffmpeg tensorflow davfs clitools clean):
|
||||
PHOTOPRISM_INIT: "https tensorflow"
|
||||
# PHOTOPRISM_FFMPEG_BITRATE: "60" # video bitrate limit in Mbps (default: 60)
|
||||
## Run/install on first startup (options: update tensorflow https intel gpu davfs yt-dlp):
|
||||
PHOTOPRISM_INIT: "https tensorflow-gpu yt-dlp"
|
||||
## Share hardware devices with FFmpeg and TensorFlow (optional):
|
||||
# devices:
|
||||
# - "/dev/dri:/dev/dri" # Intel QSV (Broadwell and later) or VAAPI (Haswell and earlier)
|
||||
@@ -138,12 +145,21 @@ services:
|
||||
reservations:
|
||||
devices:
|
||||
- driver: "nvidia"
|
||||
count: 1
|
||||
capabilities: [ gpu ]
|
||||
capabilities: [gpu]
|
||||
count: "all"
|
||||
|
||||
mariadb:
|
||||
extends:
|
||||
file: ./compose.yaml
|
||||
service: mariadb
|
||||
qdrant:
|
||||
extends:
|
||||
file: ./compose.yaml
|
||||
service: qdrant
|
||||
photoprism-vision:
|
||||
extends:
|
||||
file: ./compose.yaml
|
||||
service: photoprism-vision
|
||||
traefik:
|
||||
extends:
|
||||
file: ./compose.yaml
|
||||
@@ -175,9 +191,3 @@ volumes:
|
||||
driver: local
|
||||
mariadb:
|
||||
driver: local
|
||||
|
||||
## Create shared "photoprism-develop" network for connecting with services in other compose.yaml files
|
||||
networks:
|
||||
default:
|
||||
name: photoprism
|
||||
driver: bridge
|
||||
|
@@ -24,7 +24,6 @@ services:
|
||||
- "go-mod:/go/pkg/mod"
|
||||
shm_size: "2gb"
|
||||
environment:
|
||||
PHOTOPRISM_INIT: "https"
|
||||
PHOTOPRISM_ADMIN_USER: "admin" # admin login username
|
||||
PHOTOPRISM_ADMIN_PASSWORD: "photoprism" # initial admin password (8-72 characters)
|
||||
PHOTOPRISM_AUTH_MODE: "password" # authentication mode (public, password)
|
||||
@@ -65,8 +64,9 @@ services:
|
||||
# PHOTOPRISM_THUMB_SIZE: 4096 # Retina 4K, DCI 4K (requires more storage); 7680 for 8K Ultra HD
|
||||
PHOTOPRISM_THUMB_SIZE_UNCACHED: 7680 # on-demand rendering size limit (default 7680, min 720, max 7680)
|
||||
PHOTOPRISM_JPEG_SIZE: 7680 # size limit for converted image files in pixels (720-30000)
|
||||
TF_CPP_MIN_LOG_LEVEL: 0 # show TensorFlow log messages for development
|
||||
|
||||
TF_CPP_MIN_LOG_LEVEL: 1 # show TensorFlow log messages for development
|
||||
## Run/install on first startup (options: update tensorflow https intel gpu davfs yt-dlp):
|
||||
PHOTOPRISM_INIT: "https yt-dlp"
|
||||
## PostgreSQL Database Server
|
||||
## Docs: https://www.postgresql.org/docs/
|
||||
postgres:
|
||||
|
@@ -57,7 +57,7 @@ services:
|
||||
# PHOTOPRISM_THUMB_SIZE: 4096 # Retina 4K, DCI 4K (requires more storage); 7680 for 8K Ultra HD
|
||||
PHOTOPRISM_THUMB_SIZE_UNCACHED: 7680 # on-demand rendering size limit (default 7680, min 720, max 7680)
|
||||
PHOTOPRISM_JPEG_SIZE: 7680 # size limit for converted image files in pixels (720-30000)
|
||||
TF_CPP_MIN_LOG_LEVEL: 0 # show TensorFlow log messages for development
|
||||
TF_CPP_MIN_LOG_LEVEL: 1 # show TensorFlow log messages for development
|
||||
working_dir: "/photoprism"
|
||||
volumes:
|
||||
- "./storage:/photoprism/storage"
|
||||
|
72
compose.yaml
72
compose.yaml
@@ -25,6 +25,8 @@ services:
|
||||
links:
|
||||
- "traefik:localssl.dev"
|
||||
- "traefik:app.localssl.dev"
|
||||
- "traefik:vision.localssl.dev"
|
||||
- "traefik:qdrant.localssl.dev"
|
||||
- "traefik:keycloak.localssl.dev"
|
||||
- "traefik:dummy-oidc.localssl.dev"
|
||||
- "traefik:dummy-webdav.localssl.dev"
|
||||
@@ -55,6 +57,9 @@ services:
|
||||
PHOTOPRISM_PASSWORD_RESET_URI: "https://keycloak.localssl.dev/realms/master/login-actions/reset-credentials"
|
||||
PHOTOPRISM_USAGE_INFO: "true"
|
||||
PHOTOPRISM_FILES_QUOTA: "100"
|
||||
## Customization:
|
||||
PHOTOPRISM_DEFAULT_LOCALE: "en" # default user interface language, e.g. "en" or "de"
|
||||
PHOTOPRISM_PLACES_LOCALE: "local" # location details language, e.g. "local", "en", or "de"
|
||||
## OpenID Connect (pre-configured for local tests):
|
||||
## see https://keycloak.localssl.dev/realms/master/.well-known/openid-configuration
|
||||
PHOTOPRISM_OIDC_URI: "https://keycloak.localssl.dev/realms/master"
|
||||
@@ -116,14 +121,14 @@ services:
|
||||
PHOTOPRISM_THUMB_LIBRARY: "auto" # image processing library to be used for generating thumbnails (auto, imaging, vips)
|
||||
PHOTOPRISM_THUMB_FILTER: "auto" # downscaling filter (imaging best to worst: blackman, lanczos, cubic, linear, nearest)
|
||||
PHOTOPRISM_THUMB_UNCACHED: "true" # enables on-demand thumbnail rendering (high memory and cpu usage)
|
||||
TF_CPP_MIN_LOG_LEVEL: 0 # show TensorFlow log messages for development
|
||||
TF_CPP_MIN_LOG_LEVEL: 1 # show TensorFlow log messages for development
|
||||
## Video Transcoding (https://docs.photoprism.app/getting-started/advanced/transcoding/):
|
||||
# PHOTOPRISM_FFMPEG_ENCODER: "software" # H.264/AVC encoder (software, intel, nvidia, apple, raspberry, or vaapi)
|
||||
# PHOTOPRISM_FFMPEG_SIZE: "1920" # video size limit in pixels (720-7680) (default: 3840)
|
||||
# PHOTOPRISM_FFMPEG_BITRATE: "32" # video bitrate limit in Mbit/s (default: 50)
|
||||
# LIBVA_DRIVER_NAME: "i965" # For Intel architectures Haswell and older which do not support QSV yet but use VAAPI instead
|
||||
## Run/install on first startup (options: update https gpu ffmpeg tensorflow davfs clitools clean):
|
||||
PHOTOPRISM_INIT: "https tensorflow"
|
||||
PHOTOPRISM_FFMPEG_SIZE: "1920" # video size limit in pixels (720-7680) (default: 3840)
|
||||
# PHOTOPRISM_FFMPEG_BITRATE: "60" # video bitrate limit in Mbps (default: 60)
|
||||
## Run/install on first startup (options: update tensorflow https intel gpu davfs yt-dlp):
|
||||
PHOTOPRISM_INIT: "https yt-dlp"
|
||||
## Share hardware devices with FFmpeg and TensorFlow (optional):
|
||||
# devices:
|
||||
# - "/dev/dri:/dev/dri" # Intel QSV (Broadwell and later) or VAAPI (Haswell and earlier)
|
||||
@@ -164,6 +169,63 @@ services:
|
||||
MARIADB_PASSWORD: "photoprism"
|
||||
MARIADB_ROOT_PASSWORD: "photoprism"
|
||||
|
||||
## Qdrant (Vector Database)
|
||||
## Docs: https://qdrant.tech/documentation/guides/installation/#docker-compose
|
||||
## Release Notes: https://github.com/qdrant/qdrant/releases
|
||||
## Web UI: https://qdrant.localssl.dev/dashboard
|
||||
qdrant:
|
||||
image: qdrant/qdrant:latest
|
||||
profiles: ["all", "qdrant"]
|
||||
links:
|
||||
- "traefik:localssl.dev"
|
||||
- "traefik:app.localssl.dev"
|
||||
- "traefik:vision.localssl.dev"
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.services.qdrant.loadbalancer.server.port=6333"
|
||||
- "traefik.http.services.qdrant.loadbalancer.server.scheme=http"
|
||||
- "traefik.http.routers.qdrant.entrypoints=websecure"
|
||||
- "traefik.http.routers.qdrant.rule=Host(`qdrant.localssl.dev`)"
|
||||
- "traefik.http.routers.qdrant.priority=3"
|
||||
- "traefik.http.routers.qdrant.tls.domains[0].main=localssl.dev"
|
||||
- "traefik.http.routers.qdrant.tls.domains[0].sans=*.localssl.dev"
|
||||
- "traefik.http.routers.qdrant.tls=true"
|
||||
expose:
|
||||
- 6333
|
||||
- 6334
|
||||
- 6335
|
||||
volumes:
|
||||
- ./.qdrant.yaml:/qdrant/config/production.yaml
|
||||
- ./storage/qdrant:/qdrant/storage
|
||||
|
||||
## PhotoPrism® Computer Vision API
|
||||
## See: https://github.com/photoprism/photoprism-vision
|
||||
photoprism-vision:
|
||||
image: photoprism/vision:latest
|
||||
entrypoint: [ "/app/venv/bin/flask" ]
|
||||
command: [ "--app", "app", "run", "--debug", "--host", "0.0.0.0" ]
|
||||
profiles: ["all", "vision"]
|
||||
stop_grace_period: 5s
|
||||
working_dir: "/app"
|
||||
links:
|
||||
- "traefik:localssl.dev"
|
||||
- "traefik:app.localssl.dev"
|
||||
- "traefik:qdrant.localssl.dev"
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.services.qdrant.loadbalancer.server.port=5000"
|
||||
- "traefik.http.services.qdrant.loadbalancer.server.scheme=http"
|
||||
- "traefik.http.routers.qdrant.entrypoints=websecure"
|
||||
- "traefik.http.routers.qdrant.rule=Host(`vision.localssl.dev`)"
|
||||
- "traefik.http.routers.qdrant.priority=3"
|
||||
- "traefik.http.routers.qdrant.tls.domains[0].main=localssl.dev"
|
||||
- "traefik.http.routers.qdrant.tls.domains[0].sans=*.localssl.dev"
|
||||
- "traefik.http.routers.qdrant.tls=true"
|
||||
expose:
|
||||
- 5000
|
||||
environment:
|
||||
TF_CPP_MIN_LOG_LEVEL: 2
|
||||
|
||||
## Traefik v3 (Reverse Proxy)
|
||||
## includes "*.localssl.dev" SSL certificate for test environments
|
||||
## Docs: https://doc.traefik.io/traefik/
|
||||
|
@@ -1,8 +1,9 @@
|
||||
FROM photoprism/photoprism:preview-ce AS build
|
||||
|
||||
# Set environment variables
|
||||
ENV TF_CPP_MIN_LOG_LEVEL=2 \
|
||||
MALLOC_ARENA_MAX="4" \
|
||||
ENV TF_CPP_MIN_LOG_LEVEL=4 \
|
||||
TF_ENABLE_ONEDNN_OPTS=1 \
|
||||
MALLOC_ARENA_MAX=2 \
|
||||
PHOTOPRISM_STORAGE_PATH="/photoprism/storage" \
|
||||
PHOTOPRISM_DEBUG="false" \
|
||||
PHOTOPRISM_READONLY="false" \
|
||||
|
@@ -1,7 +1,6 @@
|
||||
services:
|
||||
demo:
|
||||
restart: always
|
||||
command: photoprism --public start
|
||||
image: photoprism/demo:latest
|
||||
container_name: demo
|
||||
depends_on:
|
||||
@@ -14,6 +13,8 @@ services:
|
||||
volumes:
|
||||
- "./config:/photoprism/storage/config"
|
||||
environment:
|
||||
PHOTOPRISM_DEMO: "true"
|
||||
PHOTOPRISM_PUBLIC: "true"
|
||||
PHOTOPRISM_SITE_URL: "https://demo.yourdomain.com/"
|
||||
# PHOTOPRISM_CDN_URL: "https://demo-cdn.yourdomain.com/"
|
||||
PHOTOPRISM_SITE_TITLE: "PhotoPrism"
|
||||
|
@@ -1,8 +1,9 @@
|
||||
FROM photoprism/photoprism:preview-ce-debian AS build
|
||||
|
||||
# Set environment variables
|
||||
ENV TF_CPP_MIN_LOG_LEVEL=2 \
|
||||
MALLOC_ARENA_MAX="4" \
|
||||
ENV TF_CPP_MIN_LOG_LEVEL=4 \
|
||||
TF_ENABLE_ONEDNN_OPTS=1 \
|
||||
MALLOC_ARENA_MAX=2 \
|
||||
PHOTOPRISM_STORAGE_PATH="/photoprism/storage" \
|
||||
PHOTOPRISM_DEBUG="false" \
|
||||
PHOTOPRISM_READONLY="false" \
|
||||
|
@@ -6,7 +6,7 @@ serversTransport:
|
||||
# Required to proxy services with self-signed HTTPS certificates:
|
||||
insecureSkipVerify: true
|
||||
|
||||
# Open ports ond protocols (HTTP will be redirected to HTTPS):
|
||||
# Open ports and protocols (HTTP will be redirected to HTTPS):
|
||||
entryPoints:
|
||||
web:
|
||||
address: ":80"
|
||||
|
@@ -1,8 +1,9 @@
|
||||
FROM photoprism/photoprism:preview-ce-ubuntu AS build
|
||||
|
||||
# Set environment variables
|
||||
ENV TF_CPP_MIN_LOG_LEVEL=2 \
|
||||
MALLOC_ARENA_MAX="4" \
|
||||
ENV TF_CPP_MIN_LOG_LEVEL=4 \
|
||||
TF_ENABLE_ONEDNN_OPTS=1 \
|
||||
MALLOC_ARENA_MAX=2 \
|
||||
PHOTOPRISM_STORAGE_PATH="/photoprism/storage" \
|
||||
PHOTOPRISM_DEBUG="false" \
|
||||
PHOTOPRISM_READONLY="false" \
|
||||
|
@@ -1,8 +1,9 @@
|
||||
FROM photoprism/photoprism:unstable-ce AS build
|
||||
|
||||
# Set environment variables
|
||||
ENV TF_CPP_MIN_LOG_LEVEL=2 \
|
||||
MALLOC_ARENA_MAX="4" \
|
||||
ENV TF_CPP_MIN_LOG_LEVEL=4 \
|
||||
TF_ENABLE_ONEDNN_OPTS=1 \
|
||||
MALLOC_ARENA_MAX=2 \
|
||||
PHOTOPRISM_STORAGE_PATH="/photoprism/storage" \
|
||||
PHOTOPRISM_DEBUG="false" \
|
||||
PHOTOPRISM_READONLY="false" \
|
||||
|
@@ -30,14 +30,16 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
|
||||
NODE_ENV="production" \
|
||||
DEBIAN_FRONTEND="noninteractive" \
|
||||
TMPDIR="/tmp" \
|
||||
TF_CPP_MIN_LOG_LEVEL="0" \
|
||||
MALLOC_ARENA_MAX="4" \
|
||||
TF_VERSION=1.15.2 \
|
||||
TF_CPP_MIN_LOG_LEVEL=1 \
|
||||
MALLOC_ARENA_MAX=2 \
|
||||
GOPATH="/go" \
|
||||
GOBIN="/usr/local/bin" \
|
||||
GO111MODULE="on" \
|
||||
CGO_CFLAGS="-g -O2 -Wno-return-local-addr" \
|
||||
PROG="photoprism" \
|
||||
S6_KEEP_ENV=1 \
|
||||
S6_VERBOSITY=0 \
|
||||
S6_LOGGING=0
|
||||
|
||||
# Copy scripts and package sources config.
|
||||
@@ -62,6 +64,7 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
|
||||
iputils-ping dnsutils \
|
||||
&& \
|
||||
/scripts/install-nodejs.sh && \
|
||||
/scripts/install-yt-dlp.sh && \
|
||||
/scripts/install-libheif.sh && \
|
||||
/scripts/install-tensorflow.sh && \
|
||||
echo "ALL ALL=(ALL) NOPASSWD:SETENV: ALL" >> /etc/sudoers.d/all && \
|
||||
|
@@ -29,8 +29,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
|
||||
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
|
||||
TMPDIR="/tmp" \
|
||||
DEBIAN_FRONTEND="noninteractive" \
|
||||
TF_CPP_MIN_LOG_LEVEL="2" \
|
||||
MALLOC_ARENA_MAX="4" \
|
||||
TF_CPP_MIN_LOG_LEVEL=4 \
|
||||
TF_ENABLE_ONEDNN_OPTS=1 \
|
||||
MALLOC_ARENA_MAX=2 \
|
||||
PROG="photoprism"
|
||||
|
||||
# Copy scripts and package sources config.
|
||||
|
@@ -30,8 +30,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
|
||||
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
|
||||
DEBIAN_FRONTEND="noninteractive" \
|
||||
TMPDIR="/tmp" \
|
||||
TF_CPP_MIN_LOG_LEVEL="0" \
|
||||
MALLOC_ARENA_MAX="4" \
|
||||
TF_CPP_MIN_LOG_LEVEL=1 \
|
||||
TF_ENABLE_ONEDNN_OPTS=1 \
|
||||
MALLOC_ARENA_MAX=2 \
|
||||
GOPATH="/go" \
|
||||
GOBIN="/usr/local/bin" \
|
||||
GO111MODULE="on" \
|
||||
|
@@ -29,8 +29,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
|
||||
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
|
||||
TMPDIR="/tmp" \
|
||||
DEBIAN_FRONTEND="noninteractive" \
|
||||
TF_CPP_MIN_LOG_LEVEL="2" \
|
||||
MALLOC_ARENA_MAX="4" \
|
||||
TF_CPP_MIN_LOG_LEVEL=4 \
|
||||
TF_ENABLE_ONEDNN_OPTS=1 \
|
||||
MALLOC_ARENA_MAX=2 \
|
||||
PROG="photoprism"
|
||||
|
||||
# copy scripts and debian backports sources list
|
||||
|
@@ -30,8 +30,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
|
||||
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
|
||||
DEBIAN_FRONTEND="noninteractive" \
|
||||
TMPDIR="/tmp" \
|
||||
TF_CPP_MIN_LOG_LEVEL="0" \
|
||||
MALLOC_ARENA_MAX="4" \
|
||||
TF_CPP_MIN_LOG_LEVEL=1 \
|
||||
TF_ENABLE_ONEDNN_OPTS=1 \
|
||||
MALLOC_ARENA_MAX=2 \
|
||||
GOPATH="/go" \
|
||||
GOBIN="/usr/local/bin" \
|
||||
GO111MODULE="on" \
|
||||
|
@@ -30,8 +30,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
|
||||
NODE_ENV="production" \
|
||||
DEBIAN_FRONTEND="noninteractive" \
|
||||
TMPDIR="/tmp" \
|
||||
TF_CPP_MIN_LOG_LEVEL="0" \
|
||||
MALLOC_ARENA_MAX="4" \
|
||||
TF_CPP_MIN_LOG_LEVEL=1 \
|
||||
TF_ENABLE_ONEDNN_OPTS=1 \
|
||||
MALLOC_ARENA_MAX=2 \
|
||||
GOPATH="/go" \
|
||||
GOBIN="/usr/local/bin" \
|
||||
GO111MODULE="on" \
|
||||
|
@@ -30,8 +30,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
|
||||
NODE_ENV="production" \
|
||||
DEBIAN_FRONTEND="noninteractive" \
|
||||
TMPDIR="/tmp" \
|
||||
TF_CPP_MIN_LOG_LEVEL="0" \
|
||||
MALLOC_ARENA_MAX="4" \
|
||||
TF_CPP_MIN_LOG_LEVEL=1 \
|
||||
TF_ENABLE_ONEDNN_OPTS=1 \
|
||||
MALLOC_ARENA_MAX=2 \
|
||||
GOPATH="/go" \
|
||||
GOBIN="/usr/local/bin" \
|
||||
GO111MODULE="on" \
|
||||
|
@@ -29,10 +29,12 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
|
||||
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
|
||||
TMPDIR="/tmp" \
|
||||
DEBIAN_FRONTEND="noninteractive" \
|
||||
TF_CPP_MIN_LOG_LEVEL="2" \
|
||||
MALLOC_ARENA_MAX="4" \
|
||||
TF_CPP_MIN_LOG_LEVEL=4 \
|
||||
TF_ENABLE_ONEDNN_OPTS=1 \
|
||||
MALLOC_ARENA_MAX=2 \
|
||||
PROG="photoprism" \
|
||||
S6_KEEP_ENV=1 \
|
||||
S6_KEEP_ENV=0 \
|
||||
S6_VERBOSITY=0 \
|
||||
S6_LOGGING=0
|
||||
|
||||
# Copy scripts and package sources config.
|
||||
@@ -48,13 +50,14 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
|
||||
apt-get update && apt-get -qq dist-upgrade && \
|
||||
apt-get -qq install \
|
||||
libc6 ca-certificates bash sudo nano avahi-utils jq lsof lshw \
|
||||
xz-utils exiftool sqlite3 tzdata gpg make zip unzip wget curl rsync \
|
||||
xz-utils exiftool sqlite3 postgresql-client tzdata gpg make zip unzip wget curl rsync \
|
||||
imagemagick libvips-dev rawtherapee ffmpeg libavcodec-extra x264 x265 libde265-dev \
|
||||
libaom-dev libvpx-dev libwebm-dev libjpeg-dev libmatroska-dev libdvdread-dev libebml5 libgav1-bin libatomic1 \
|
||||
iputils-ping dnsutils \
|
||||
va-driver-all libva2 iputils-ping dnsutils \
|
||||
&& \
|
||||
/scripts/install-mariadb.sh mariadb-client && \
|
||||
/scripts/install-darktable.sh && \
|
||||
/scripts/install-yt-dlp.sh && \
|
||||
/scripts/install-libheif.sh && \
|
||||
echo 'alias ll="ls -alh"' >> /etc/skel/.bashrc && \
|
||||
echo 'export PS1="\u@$DOCKER_TAG:\w\$ "' >> /etc/skel/.bashrc && \
|
||||
@@ -72,6 +75,8 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
|
||||
/photoprism/storage/config \
|
||||
/photoprism/storage/cache && \
|
||||
/scripts/install-s6.sh && \
|
||||
ln -sf /scripts/services/photoprism /etc/s6-overlay/s6-rc.d/photoprism && \
|
||||
touch /etc/s6-overlay/s6-rc.d/user/contents.d/photoprism && \
|
||||
/scripts/cleanup.sh
|
||||
|
||||
# Set default working directory.
|
||||
@@ -82,4 +87,3 @@ EXPOSE 2342 2442 2443
|
||||
|
||||
# Set default entrypoint and command.
|
||||
ENTRYPOINT ["/init"]
|
||||
CMD ["/scripts/cmd.sh", "tail", "-f", "/dev/null"]
|
@@ -30,14 +30,16 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
|
||||
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
|
||||
DEBIAN_FRONTEND="noninteractive" \
|
||||
TMPDIR="/tmp" \
|
||||
TF_CPP_MIN_LOG_LEVEL="0" \
|
||||
MALLOC_ARENA_MAX="4" \
|
||||
TF_CPP_MIN_LOG_LEVEL=1 \
|
||||
TF_ENABLE_ONEDNN_OPTS=1 \
|
||||
MALLOC_ARENA_MAX=2 \
|
||||
GOPATH="/go" \
|
||||
GOBIN="/usr/local/bin" \
|
||||
GO111MODULE="on" \
|
||||
CGO_CFLAGS="-g -O2 -Wno-return-local-addr" \
|
||||
PROG="photoprism" \
|
||||
S6_KEEP_ENV=1 \
|
||||
S6_VERBOSITY=0 \
|
||||
S6_LOGGING=0
|
||||
|
||||
# Copy scripts and package sources config.
|
||||
@@ -54,10 +56,10 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
|
||||
apt-get update && apt-get -qq dist-upgrade && \
|
||||
apt-get -qq install \
|
||||
libc6 ca-certificates bash sudo nano avahi-utils jq lsof lshw \
|
||||
xz-utils exiftool sqlite3 tzdata gpg make zip unzip wget curl rsync \
|
||||
xz-utils exiftool sqlite3 postgresql-client tzdata gpg make zip unzip wget curl rsync \
|
||||
imagemagick libvips-dev rawtherapee ffmpeg libavcodec-extra x264 x265 libde265-dev \
|
||||
libaom-dev libvpx-dev libwebm-dev libjpeg-dev libmatroska-dev libdvdread-dev libebml5 libgav1-bin libatomic1 \
|
||||
iputils-ping dnsutils \
|
||||
va-driver-all libva2 iputils-ping dnsutils \
|
||||
&& \
|
||||
apt-get -qq install \
|
||||
apt-utils pkg-config software-properties-common \
|
||||
@@ -72,6 +74,7 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
|
||||
/scripts/install-mariadb.sh mariadb-client && \
|
||||
/scripts/install-tensorflow.sh && \
|
||||
/scripts/install-darktable.sh && \
|
||||
/scripts/install-yt-dlp.sh && \
|
||||
/scripts/install-libheif.sh && \
|
||||
/scripts/install-chrome.sh && \
|
||||
echo "ALL ALL=(ALL) NOPASSWD:SETENV: ALL" >> /etc/sudoers.d/all && \
|
||||
|
@@ -29,8 +29,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
|
||||
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
|
||||
TMPDIR="/tmp" \
|
||||
DEBIAN_FRONTEND="noninteractive" \
|
||||
TF_CPP_MIN_LOG_LEVEL="2" \
|
||||
MALLOC_ARENA_MAX="4" \
|
||||
TF_CPP_MIN_LOG_LEVEL=4 \
|
||||
TF_ENABLE_ONEDNN_OPTS=1 \
|
||||
MALLOC_ARENA_MAX=2 \
|
||||
PROG="photoprism"
|
||||
|
||||
# Copy scripts and package sources config.
|
||||
|
@@ -30,8 +30,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
|
||||
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
|
||||
DEBIAN_FRONTEND="noninteractive" \
|
||||
TMPDIR="/tmp" \
|
||||
TF_CPP_MIN_LOG_LEVEL="0" \
|
||||
MALLOC_ARENA_MAX="4" \
|
||||
TF_CPP_MIN_LOG_LEVEL=1 \
|
||||
TF_ENABLE_ONEDNN_OPTS=1 \
|
||||
MALLOC_ARENA_MAX=2 \
|
||||
GOPATH="/go" \
|
||||
GOBIN="/usr/local/bin" \
|
||||
GO111MODULE="on" \
|
||||
|
@@ -29,8 +29,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
|
||||
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
|
||||
TMPDIR="/tmp" \
|
||||
DEBIAN_FRONTEND="noninteractive" \
|
||||
TF_CPP_MIN_LOG_LEVEL="2" \
|
||||
MALLOC_ARENA_MAX="4" \
|
||||
TF_CPP_MIN_LOG_LEVEL=4 \
|
||||
TF_ENABLE_ONEDNN_OPTS=1 \
|
||||
MALLOC_ARENA_MAX=2 \
|
||||
PROG="photoprism"
|
||||
|
||||
# Copy scripts and package sources config.
|
||||
|
@@ -30,8 +30,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
|
||||
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
|
||||
DEBIAN_FRONTEND="noninteractive" \
|
||||
TMPDIR="/tmp" \
|
||||
TF_CPP_MIN_LOG_LEVEL="0" \
|
||||
MALLOC_ARENA_MAX="4" \
|
||||
TF_CPP_MIN_LOG_LEVEL=1 \
|
||||
TF_ENABLE_ONEDNN_OPTS=1 \
|
||||
MALLOC_ARENA_MAX=2 \
|
||||
GOPATH="/go" \
|
||||
GOBIN="/usr/local/bin" \
|
||||
GO111MODULE="on" \
|
||||
|
@@ -29,8 +29,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
|
||||
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
|
||||
TMPDIR="/tmp" \
|
||||
DEBIAN_FRONTEND="noninteractive" \
|
||||
TF_CPP_MIN_LOG_LEVEL="2" \
|
||||
MALLOC_ARENA_MAX="4" \
|
||||
TF_CPP_MIN_LOG_LEVEL=4 \
|
||||
TF_ENABLE_ONEDNN_OPTS=1 \
|
||||
MALLOC_ARENA_MAX=2 \
|
||||
PROG="photoprism"
|
||||
|
||||
# Copy scripts and package sources config.
|
||||
@@ -46,7 +47,7 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
|
||||
apt-get update && apt-get -qq dist-upgrade && \
|
||||
apt-get -qq install \
|
||||
libc6 ca-certificates bash sudo nano tzdata gpg make zip unzip wget curl rsync \
|
||||
xz-utils avahi-utils jq lsof lshw libebml5 libgav1-bin libatomic1 exiftool sqlite3 \
|
||||
xz-utils avahi-utils jq lsof lshw libebml5 libgav1-bin libatomic1 exiftool sqlite3 postgresql-client \
|
||||
ffmpeg imagemagick libvips-dev rawtherapee libjxl-dev libjxl-tools libffmpeg-nvenc-dev librav1e-dev \
|
||||
libswscale-dev libavfilter-extra libavformat-extra libavcodec-extra x264 x265 libde265-dev libaom-dev \
|
||||
libvpx-dev libwebm-dev libjpeg-dev libmatroska-dev libdvdread-dev libdav1d-dev libsharpyuv0 \
|
||||
|
@@ -30,8 +30,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
|
||||
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
|
||||
DEBIAN_FRONTEND="noninteractive" \
|
||||
TMPDIR="/tmp" \
|
||||
TF_CPP_MIN_LOG_LEVEL="0" \
|
||||
MALLOC_ARENA_MAX="4" \
|
||||
TF_CPP_MIN_LOG_LEVEL=1 \
|
||||
TF_ENABLE_ONEDNN_OPTS=1 \
|
||||
MALLOC_ARENA_MAX=2 \
|
||||
GOPATH="/go" \
|
||||
GOBIN="/usr/local/bin" \
|
||||
GO111MODULE="on" \
|
||||
@@ -52,7 +53,7 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
|
||||
apt-get update && apt-get -qq dist-upgrade && \
|
||||
apt-get -qq install \
|
||||
libc6 libbsd-dev ca-certificates bash sudo nano tzdata gpg make zip unzip wget curl rsync \
|
||||
xz-utils avahi-utils jq lsof lshw libebml5 libgav1-bin libatomic1 exiftool sqlite3 \
|
||||
xz-utils avahi-utils jq lsof lshw libebml5 libgav1-bin libatomic1 exiftool sqlite3 postgresql-client \
|
||||
ffmpeg imagemagick libvips-dev rawtherapee libjxl-dev libjxl-tools libffmpeg-nvenc-dev librav1e-dev \
|
||||
libswscale-dev libavfilter-extra libavformat-extra libavcodec-extra x264 x265 libde265-dev libaom-dev \
|
||||
libvpx-dev libwebm-dev libjpeg-dev libmatroska-dev libdvdread-dev libdav1d-dev libsharpyuv0 \
|
||||
|
@@ -29,10 +29,12 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
|
||||
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
|
||||
TMPDIR="/tmp" \
|
||||
DEBIAN_FRONTEND="noninteractive" \
|
||||
TF_CPP_MIN_LOG_LEVEL="2" \
|
||||
MALLOC_ARENA_MAX="4" \
|
||||
TF_CPP_MIN_LOG_LEVEL=4 \
|
||||
TF_ENABLE_ONEDNN_OPTS=1 \
|
||||
MALLOC_ARENA_MAX=2 \
|
||||
PROG="photoprism" \
|
||||
S6_KEEP_ENV=1 \
|
||||
S6_KEEP_ENV=0 \
|
||||
S6_VERBOSITY=0 \
|
||||
S6_LOGGING=0
|
||||
|
||||
# Copy scripts and package sources config.
|
||||
@@ -48,7 +50,7 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
|
||||
apt-get update && apt-get -qq dist-upgrade && \
|
||||
apt-get -qq install \
|
||||
libc6 ca-certificates bash sudo nano tzdata gpg make zip unzip wget curl rsync \
|
||||
xz-utils avahi-utils jq lsof lshw libebml5 libgav1-bin libatomic1 exiftool sqlite3 \
|
||||
xz-utils avahi-utils jq lsof lshw libebml5 libgav1-bin libatomic1 exiftool sqlite3 postgresql-client \
|
||||
ffmpeg imagemagick libvips-dev rawtherapee libjxl-dev libjxl-tools libffmpeg-nvenc-dev librav1e-dev \
|
||||
libswscale-dev libavfilter-extra libavformat-extra libavcodec-extra x264 x265 libde265-dev libaom-dev \
|
||||
libvpx-dev libwebm-dev libjpeg-dev libmatroska-dev libdvdread-dev libdav1d-dev libsharpyuv0 \
|
||||
@@ -73,6 +75,8 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
|
||||
/photoprism/storage/config \
|
||||
/photoprism/storage/cache && \
|
||||
/scripts/install-s6.sh && \
|
||||
ln -sf /scripts/services/photoprism /etc/s6-overlay/s6-rc.d/photoprism && \
|
||||
touch /etc/s6-overlay/s6-rc.d/user/contents.d/photoprism && \
|
||||
/scripts/cleanup.sh
|
||||
|
||||
# Set default working directory.
|
||||
@@ -83,4 +87,3 @@ EXPOSE 2342 2442 2443
|
||||
|
||||
# Set default entrypoint and command.
|
||||
ENTRYPOINT ["/init"]
|
||||
CMD ["/scripts/cmd.sh", "tail", "-f", "/dev/null"]
|
||||
|
@@ -30,14 +30,16 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
|
||||
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
|
||||
DEBIAN_FRONTEND="noninteractive" \
|
||||
TMPDIR="/tmp" \
|
||||
TF_CPP_MIN_LOG_LEVEL="0" \
|
||||
MALLOC_ARENA_MAX="4" \
|
||||
TF_CPP_MIN_LOG_LEVEL=1 \
|
||||
TF_ENABLE_ONEDNN_OPTS=1 \
|
||||
MALLOC_ARENA_MAX=2 \
|
||||
GOPATH="/go" \
|
||||
GOBIN="/usr/local/bin" \
|
||||
GO111MODULE="on" \
|
||||
CGO_CFLAGS="-g -O2 -Wno-return-local-addr" \
|
||||
PROG="photoprism" \
|
||||
S6_KEEP_ENV=1 \
|
||||
S6_VERBOSITY=0 \
|
||||
S6_LOGGING=0
|
||||
|
||||
# Copy scripts and package sources config.
|
||||
@@ -54,7 +56,7 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
|
||||
apt-get update && apt-get -qq dist-upgrade && \
|
||||
apt-get -qq install \
|
||||
libc6 libbsd-dev ca-certificates bash sudo nano tzdata gpg make zip unzip wget curl rsync \
|
||||
xz-utils avahi-utils jq lsof lshw libebml5 libgav1-bin libatomic1 exiftool sqlite3 \
|
||||
xz-utils avahi-utils jq lsof lshw libebml5 libgav1-bin libatomic1 exiftool sqlite3 postgresql-client \
|
||||
ffmpeg imagemagick libvips-dev rawtherapee libjxl-dev libjxl-tools libffmpeg-nvenc-dev librav1e-dev \
|
||||
libswscale-dev libavfilter-extra libavformat-extra libavcodec-extra x264 x265 libde265-dev libaom-dev \
|
||||
libvpx-dev libwebm-dev libjpeg-dev libmatroska-dev libdvdread-dev libdav1d-dev libsharpyuv0 \
|
||||
|
91
docker/develop/plucky-slim/Dockerfile
Normal file
91
docker/develop/plucky-slim/Dockerfile
Normal file
@@ -0,0 +1,91 @@
|
||||
#### Base Image: Ubuntu 25.04 (Plucky Puffin)
|
||||
FROM ubuntu:plucky
|
||||
|
||||
# Copyright © 2018 - 2025 PhotoPrism UG. All rights reserved.
|
||||
#
|
||||
# Questions? Email us at hello@photoprism.app or visit our website to learn
|
||||
# more about our team, products and services: https://www.photoprism.app/
|
||||
|
||||
# Add Open Container Initiative (OCI) annotations.
|
||||
# See: https://github.com/opencontainers/image-spec/blob/main/annotations.md
|
||||
LABEL org.opencontainers.image.title="PhotoPrism® Base Image (Ubuntu 25.04)"
|
||||
LABEL org.opencontainers.image.description="Ubuntu 25.04 (Plucky Puffin)"
|
||||
LABEL org.opencontainers.image.url="https://hub.docker.com/repository/docker/photoprism/develop"
|
||||
LABEL org.opencontainers.image.source="https://github.com/photoprism/photoprism"
|
||||
LABEL org.opencontainers.image.documentation="https://docs.photoprism.app/developer-guide/setup/"
|
||||
LABEL org.opencontainers.image.authors="PhotoPrism UG <hello@photoprism.app>"
|
||||
LABEL org.opencontainers.image.vendor="PhotoPrism UG"
|
||||
|
||||
# Declare build parameters.
|
||||
ARG TARGETARCH
|
||||
ARG BUILD_TAG
|
||||
|
||||
# Set environment variables, see https://docs.photoprism.app/getting-started/config-options/.
|
||||
ENV PHOTOPRISM_ARCH=$TARGETARCH \
|
||||
DOCKER_TAG=$BUILD_TAG \
|
||||
DOCKER_ENV="prod" \
|
||||
PS1="\u@$BUILD_TAG:\w\$ " \
|
||||
PATH="/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin:/scripts:/opt/photoprism/bin" \
|
||||
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
|
||||
TMPDIR="/tmp" \
|
||||
DEBIAN_FRONTEND="noninteractive" \
|
||||
TF_CPP_MIN_LOG_LEVEL=4 \
|
||||
TF_ENABLE_ONEDNN_OPTS=1 \
|
||||
MALLOC_ARENA_MAX=2 \
|
||||
PROG="photoprism" \
|
||||
S6_KEEP_ENV=0 \
|
||||
S6_VERBOSITY=0 \
|
||||
S6_LOGGING=0
|
||||
|
||||
# Copy scripts and package sources config.
|
||||
COPY --chown=root:root --chmod=755 /scripts/dist/ /scripts/
|
||||
|
||||
# Update base image and add dependencies.
|
||||
RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
|
||||
echo 'APT::Install-Recommends "false";' > /etc/apt/apt.conf.d/80recommends && \
|
||||
echo 'APT::Install-Suggests "false";' > /etc/apt/apt.conf.d/80suggests && \
|
||||
echo 'APT::Get::Assume-Yes "true";' > /etc/apt/apt.conf.d/80forceyes && \
|
||||
echo 'APT::Get::Fix-Missing "true";' > /etc/apt/apt.conf.d/80fixmissing && \
|
||||
echo 'force-confold' > /etc/dpkg/dpkg.cfg.d/force-confold && \
|
||||
apt-get update && apt-get -qq dist-upgrade && \
|
||||
apt-get -qq install \
|
||||
libc6 ca-certificates bash sudo nano tzdata gpg make zip unzip wget curl rsync \
|
||||
xz-utils avahi-utils jq lsof lshw libebml5 libgav1-bin libatomic1 exiftool sqlite3 postgresql-client \
|
||||
ffmpeg imagemagick libvips-dev rawtherapee libjxl-dev libjxl-tools libffmpeg-nvenc-dev librav1e-dev \
|
||||
libswscale-dev libavfilter-extra libavformat-extra libavcodec-extra x264 x265 libde265-dev libaom-dev \
|
||||
libvpx-dev libwebm-dev libjpeg-dev libmatroska-dev libdvdread-dev libdav1d-dev libsharpyuv0 \
|
||||
va-driver-all libva2 iputils-ping dnsutils \
|
||||
&& \
|
||||
/scripts/install-mariadb.sh mariadb-client && \
|
||||
/scripts/install-darktable.sh && \
|
||||
/scripts/install-yt-dlp.sh && \
|
||||
/scripts/install-libheif.sh && \
|
||||
echo 'alias ll="ls -alh"' >> /etc/skel/.bashrc && \
|
||||
echo 'export PS1="\u@$DOCKER_TAG:\w\$ "' >> /etc/skel/.bashrc && \
|
||||
echo "ALL ALL=(ALL) NOPASSWD:SETENV: /scripts/entrypoint-init.sh" >> /etc/sudoers.d/init && \
|
||||
/scripts/install-dircolors.sh && \
|
||||
cp /etc/skel/.bashrc /root/.bashrc && \
|
||||
/scripts/create-users.sh && \
|
||||
install -d -m 0777 -o 1000 -g 1000 \
|
||||
/photoprism/originals \
|
||||
/photoprism/import \
|
||||
/photoprism/storage \
|
||||
/photoprism/storage/sidecar \
|
||||
/photoprism/storage/albums \
|
||||
/photoprism/storage/backups \
|
||||
/photoprism/storage/config \
|
||||
/photoprism/storage/cache && \
|
||||
/scripts/install-s6.sh && \
|
||||
ln -sf /scripts/services/photoprism /etc/s6-overlay/s6-rc.d/photoprism && \
|
||||
touch /etc/s6-overlay/s6-rc.d/user/contents.d/photoprism && \
|
||||
apt modernize-sources && \
|
||||
/scripts/cleanup.sh
|
||||
|
||||
# Set default working directory.
|
||||
WORKDIR /photoprism
|
||||
|
||||
# Expose default HTTP and HTTPS ports.
|
||||
EXPOSE 2342 2442 2443
|
||||
|
||||
# Set default entrypoint and command.
|
||||
ENTRYPOINT ["/init"]
|
127
docker/develop/plucky/Dockerfile
Normal file
127
docker/develop/plucky/Dockerfile
Normal file
@@ -0,0 +1,127 @@
|
||||
#### Base Image: Ubuntu 25.04 (Plucky Puffin)
|
||||
FROM ubuntu:plucky
|
||||
|
||||
# Copyright © 2018 - 2025 PhotoPrism UG. All rights reserved.
|
||||
#
|
||||
# Questions? Email us at hello@photoprism.app or visit our website to learn
|
||||
# more about our team, products and services: https://www.photoprism.app/
|
||||
|
||||
# Add Open Container Initiative (OCI) annotations.
|
||||
# See: https://github.com/opencontainers/image-spec/blob/main/annotations.md
|
||||
LABEL org.opencontainers.image.title="PhotoPrism® Build Image (Ubuntu 25.04)"
|
||||
LABEL org.opencontainers.image.description="Ubuntu 25.04 (Plucky Puffin)"
|
||||
LABEL org.opencontainers.image.url="https://hub.docker.com/repository/docker/photoprism/develop"
|
||||
LABEL org.opencontainers.image.source="https://github.com/photoprism/photoprism"
|
||||
LABEL org.opencontainers.image.documentation="https://docs.photoprism.app/developer-guide/setup/"
|
||||
LABEL org.opencontainers.image.authors="PhotoPrism UG <hello@photoprism.app>"
|
||||
LABEL org.opencontainers.image.vendor="PhotoPrism UG"
|
||||
|
||||
# Declare build parameters.
|
||||
ARG TARGETARCH
|
||||
ARG BUILD_TAG
|
||||
|
||||
# Set environment variables, see https://docs.photoprism.app/getting-started/config-options/.
|
||||
ENV PHOTOPRISM_ARCH=$TARGETARCH \
|
||||
DOCKER_TAG=$BUILD_TAG \
|
||||
DOCKER_ENV="develop" \
|
||||
NODE_ENV="production" \
|
||||
PS1="\u@$BUILD_TAG:\w\$ " \
|
||||
PATH="/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin:/scripts:/usr/local/go/bin:/go/bin:/opt/photoprism/bin" \
|
||||
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
|
||||
DEBIAN_FRONTEND="noninteractive" \
|
||||
TMPDIR="/tmp" \
|
||||
TF_CPP_MIN_LOG_LEVEL=1 \
|
||||
TF_ENABLE_ONEDNN_OPTS=1 \
|
||||
MALLOC_ARENA_MAX=2 \
|
||||
GOPATH="/go" \
|
||||
GOBIN="/usr/local/bin" \
|
||||
GO111MODULE="on" \
|
||||
CGO_CFLAGS="-g -O2 -Wno-return-local-addr" \
|
||||
PROG="photoprism" \
|
||||
S6_KEEP_ENV=1 \
|
||||
S6_VERBOSITY=0 \
|
||||
S6_LOGGING=0
|
||||
|
||||
# Copy scripts and package sources config.
|
||||
COPY --chown=root:root --chmod=755 /scripts/dist/ /scripts/
|
||||
COPY --chown=root:root --chmod=644 /.my.cnf /etc/my.cnf
|
||||
|
||||
# Update base image and add dependencies.
|
||||
RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
|
||||
echo 'APT::Install-Recommends "false";' > /etc/apt/apt.conf.d/80recommends && \
|
||||
echo 'APT::Install-Suggests "false";' > /etc/apt/apt.conf.d/80suggests && \
|
||||
echo 'APT::Get::Assume-Yes "true";' > /etc/apt/apt.conf.d/80forceyes && \
|
||||
echo 'APT::Get::Fix-Missing "true";' > /etc/apt/apt.conf.d/80fixmissing && \
|
||||
echo 'force-confold' > /etc/dpkg/dpkg.cfg.d/force-confold && \
|
||||
apt-get update && apt-get -qq dist-upgrade && \
|
||||
apt-get -qq install \
|
||||
libc6 libbsd-dev ca-certificates bash sudo nano tzdata gpg make zip unzip wget curl rsync \
|
||||
xz-utils avahi-utils jq lsof lshw libebml5 libgav1-bin libatomic1 exiftool sqlite3 postgresql-client \
|
||||
ffmpeg imagemagick libvips-dev rawtherapee libjxl-dev libjxl-tools libffmpeg-nvenc-dev librav1e-dev \
|
||||
libswscale-dev libavfilter-extra libavformat-extra libavcodec-extra x264 x265 libde265-dev libaom-dev \
|
||||
libvpx-dev libwebm-dev libjpeg-dev libmatroska-dev libdvdread-dev libdav1d-dev libsharpyuv0 \
|
||||
va-driver-all libva2 iputils-ping dnsutils \
|
||||
&& \
|
||||
apt-get -qq install \
|
||||
software-properties-common pkg-config apt-utils \
|
||||
build-essential gcc g++ git gettext davfs2 chrpath apache2-utils \
|
||||
autoconf automake cmake libtool libjpeg-dev libpng-dev libwebp-dev libavcodec-dev \
|
||||
libx264-dev libx265-dev libaom-dev libvpx-dev libwebm-dev libxft-dev \
|
||||
libc6-dev libhdf5-serial-dev libzmq3-dev libssl-dev libnss3 \
|
||||
libfreetype6 libfreetype6-dev libfontconfig1 libfontconfig1-dev fonts-roboto \
|
||||
librsvg2-bin ghostscript gsfonts pdf2svg ps2eps libsharpyuv-dev \
|
||||
&& \
|
||||
/scripts/install-nodejs.sh && \
|
||||
/scripts/install-mariadb.sh mariadb-client && \
|
||||
/scripts/install-tensorflow.sh && \
|
||||
/scripts/install-darktable.sh && \
|
||||
/scripts/install-yt-dlp.sh && \
|
||||
/scripts/install-libheif.sh && \
|
||||
/scripts/install-chrome.sh && \
|
||||
echo "ALL ALL=(ALL) NOPASSWD:SETENV: ALL" >> /etc/sudoers.d/all && \
|
||||
mkdir -p /etc/skel/.config/go/telemetry && \
|
||||
echo 'off 2025-01-03' > '/etc/skel/.config/go/telemetry/mode' && \
|
||||
cp -r /etc/skel/.config /root/.config && \
|
||||
/scripts/install-go.sh && \
|
||||
/scripts/install-go-tools.sh && \
|
||||
echo 'alias go=richgo ll="ls -alh"' >> /etc/skel/.bashrc && \
|
||||
echo 'export PS1="\u@$DOCKER_TAG:\w\$ "' >> /etc/skel/.bashrc && \
|
||||
/scripts/install-dircolors.sh && \
|
||||
cp /etc/skel/.bashrc /root/.bashrc && \
|
||||
cp /scripts/convert/policy.xml /etc/ImageMagick-7/policy.xml && \
|
||||
/scripts/create-users.sh && \
|
||||
install -d -m 0777 -o 1000 -g 1000 \
|
||||
/photoprism/originals \
|
||||
/photoprism/import \
|
||||
/photoprism/storage \
|
||||
/photoprism/storage/sidecar \
|
||||
/photoprism/storage/albums \
|
||||
/photoprism/storage/backups \
|
||||
/photoprism/storage/config \
|
||||
/photoprism/storage/cache && \
|
||||
/scripts/install-s6.sh && \
|
||||
apt modernize-sources && \
|
||||
/scripts/cleanup.sh
|
||||
|
||||
# Download machine learning models and test data.
|
||||
RUN mkdir /tmp/photoprism && \
|
||||
wget "https://dl.photoprism.app/tensorflow/nsfw.zip?${BUILD_TAG}" -O /tmp/photoprism/nsfw.zip && \
|
||||
wget "https://dl.photoprism.app/tensorflow/nasnet.zip?${BUILD_TAG}" -O /tmp/photoprism/nasnet.zip && \
|
||||
wget "https://dl.photoprism.app/tensorflow/facenet.zip?${BUILD_TAG}" -O /tmp/photoprism/facenet.zip && \
|
||||
wget "https://dl.photoprism.app/qa/testdata.zip?${BUILD_TAG}" -O /tmp/photoprism/testdata.zip
|
||||
|
||||
# Set default working directory.
|
||||
WORKDIR "/go/src/github.com/photoprism/photoprism"
|
||||
|
||||
# Expose the following container ports:
|
||||
# - 2342 (HTTP)
|
||||
# - 2343 (Acceptance Tests)
|
||||
# - 2442 (HTTP)
|
||||
# - 2443 (HTTPS)
|
||||
# - 9515 (Chromedriver)
|
||||
# - 40000 (Go Debugger)
|
||||
EXPOSE 2342 2343 2442 2443 9515 40000
|
||||
|
||||
# Set default entrypoint and command.
|
||||
ENTRYPOINT ["/init"]
|
||||
CMD ["/scripts/cmd.sh", "tail", "-f", "/dev/null"]
|
@@ -46,8 +46,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
|
||||
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
|
||||
TMPDIR="/tmp" \
|
||||
DEBIAN_FRONTEND="noninteractive" \
|
||||
TF_CPP_MIN_LOG_LEVEL="2" \
|
||||
MALLOC_ARENA_MAX="4" \
|
||||
TF_VERSION=1.15.2 \
|
||||
TF_CPP_MIN_LOG_LEVEL=4 \
|
||||
MALLOC_ARENA_MAX=2 \
|
||||
PROG="photoprism" \
|
||||
PHOTOPRISM_ASSETS_PATH="/opt/photoprism/assets" \
|
||||
PHOTOPRISM_IMPORT_PATH="/photoprism/import" \
|
||||
@@ -91,7 +92,8 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
|
||||
PHOTOPRISM_AUTO_INDEX="300" \
|
||||
PHOTOPRISM_AUTO_IMPORT="-1" \
|
||||
PHOTOPRISM_INIT="https" \
|
||||
S6_KEEP_ENV=1 \
|
||||
S6_KEEP_ENV=0 \
|
||||
S6_VERBOSITY=0 \
|
||||
S6_LOGGING=0
|
||||
|
||||
# Copy dist files, scripts, and debian backports sources list.
|
||||
@@ -114,6 +116,7 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
|
||||
libvpx-dev libwebm-dev libjpeg-dev libmatroska-dev libdvdread-dev libdav1d-dev libsharpyuv0 \
|
||||
iputils-ping dnsutils \
|
||||
&& \
|
||||
/scripts/install-yt-dlp.sh && \
|
||||
/scripts/install-libheif.sh && \
|
||||
echo 'alias ll="ls -alh"' >> /etc/skel/.bashrc && \
|
||||
echo 'export PS1="\u@$DOCKER_TAG:\w\$ "' >> /etc/skel/.bashrc && \
|
||||
@@ -131,6 +134,8 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
|
||||
/photoprism/storage/config \
|
||||
/photoprism/storage/cache && \
|
||||
/scripts/install-s6.sh && \
|
||||
ln -sf /scripts/services/photoprism /etc/s6-overlay/s6-rc.d/photoprism && \
|
||||
touch /etc/s6-overlay/s6-rc.d/user/contents.d/photoprism && \
|
||||
/scripts/cleanup.sh
|
||||
|
||||
# Set default working directory.
|
||||
@@ -141,4 +146,3 @@ EXPOSE 2342 2443
|
||||
|
||||
# Set default entrypoint and command.
|
||||
ENTRYPOINT ["/init"]
|
||||
CMD ["/scripts/cmd.sh", "/opt/photoprism/bin/photoprism", "start"]
|
||||
|
@@ -41,8 +41,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
|
||||
DOCKER_ENV="prod" \
|
||||
TMPDIR="/tmp" \
|
||||
DEBIAN_FRONTEND="noninteractive" \
|
||||
TF_CPP_MIN_LOG_LEVEL="2" \
|
||||
MALLOC_ARENA_MAX="4" \
|
||||
TF_CPP_MIN_LOG_LEVEL=4 \
|
||||
TF_ENABLE_ONEDNN_OPTS=1 \
|
||||
MALLOC_ARENA_MAX=2 \
|
||||
PROG="photoprism" \
|
||||
PHOTOPRISM_ASSETS_PATH="/opt/photoprism/assets" \
|
||||
PHOTOPRISM_IMPORT_PATH="/photoprism/import" \
|
||||
|
@@ -41,8 +41,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
|
||||
DOCKER_ENV="prod" \
|
||||
TMPDIR="/tmp" \
|
||||
DEBIAN_FRONTEND="noninteractive" \
|
||||
TF_CPP_MIN_LOG_LEVEL="2" \
|
||||
MALLOC_ARENA_MAX="4" \
|
||||
TF_CPP_MIN_LOG_LEVEL=4 \
|
||||
TF_ENABLE_ONEDNN_OPTS=1 \
|
||||
MALLOC_ARENA_MAX=2 \
|
||||
PROG="photoprism" \
|
||||
PHOTOPRISM_ASSETS_PATH="/opt/photoprism/assets" \
|
||||
PHOTOPRISM_IMPORT_PATH="/photoprism/import" \
|
||||
|
@@ -44,8 +44,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
|
||||
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
|
||||
TMPDIR="/tmp" \
|
||||
DEBIAN_FRONTEND="noninteractive" \
|
||||
TF_CPP_MIN_LOG_LEVEL="2" \
|
||||
MALLOC_ARENA_MAX="4" \
|
||||
TF_CPP_MIN_LOG_LEVEL=4 \
|
||||
TF_ENABLE_ONEDNN_OPTS=1 \
|
||||
MALLOC_ARENA_MAX=2 \
|
||||
PROG="photoprism" \
|
||||
PHOTOPRISM_ASSETS_PATH="/opt/photoprism/assets" \
|
||||
PHOTOPRISM_IMPORT_PATH="/photoprism/import" \
|
||||
|
@@ -44,8 +44,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
|
||||
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib" \
|
||||
TMPDIR="/tmp" \
|
||||
DEBIAN_FRONTEND="noninteractive" \
|
||||
TF_CPP_MIN_LOG_LEVEL="2" \
|
||||
MALLOC_ARENA_MAX="4" \
|
||||
TF_CPP_MIN_LOG_LEVEL=4 \
|
||||
TF_ENABLE_ONEDNN_OPTS=1 \
|
||||
MALLOC_ARENA_MAX=2 \
|
||||
PROG="photoprism" \
|
||||
PHOTOPRISM_ASSETS_PATH="/opt/photoprism/assets" \
|
||||
PHOTOPRISM_IMPORT_PATH="/photoprism/import" \
|
||||
|
@@ -42,8 +42,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
|
||||
DOCKER_ENV="prod" \
|
||||
TMPDIR="/tmp" \
|
||||
DEBIAN_FRONTEND="noninteractive" \
|
||||
TF_CPP_MIN_LOG_LEVEL="2" \
|
||||
MALLOC_ARENA_MAX="4" \
|
||||
TF_CPP_MIN_LOG_LEVEL=4 \
|
||||
TF_ENABLE_ONEDNN_OPTS=1 \
|
||||
MALLOC_ARENA_MAX=2 \
|
||||
PROG="photoprism" \
|
||||
PHOTOPRISM_ASSETS_PATH="/opt/photoprism/assets" \
|
||||
PHOTOPRISM_IMPORT_PATH="/photoprism/import" \
|
||||
@@ -90,6 +91,7 @@ COPY --chown=root:root --chmod=755 /scripts/dist/ /scripts/
|
||||
# Update pre-installed packages.
|
||||
RUN apt-get update && \
|
||||
apt-get -qq dist-upgrade && \
|
||||
yt-dlp -U && \
|
||||
/scripts/cleanup.sh
|
||||
|
||||
# Set default working directory.
|
||||
@@ -100,6 +102,3 @@ EXPOSE 2342 2443
|
||||
|
||||
# Copy app files.
|
||||
COPY --from=build --chown=root:root --chmod=755 /opt/photoprism/ /opt/photoprism
|
||||
|
||||
# Start app.
|
||||
CMD ["/scripts/cmd.sh", "/opt/photoprism/bin/photoprism", "start"]
|
@@ -42,8 +42,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
|
||||
DOCKER_ENV="prod" \
|
||||
TMPDIR="/tmp" \
|
||||
DEBIAN_FRONTEND="noninteractive" \
|
||||
TF_CPP_MIN_LOG_LEVEL="2" \
|
||||
MALLOC_ARENA_MAX="4" \
|
||||
TF_CPP_MIN_LOG_LEVEL=4 \
|
||||
TF_ENABLE_ONEDNN_OPTS=1 \
|
||||
MALLOC_ARENA_MAX=2 \
|
||||
PROG="photoprism" \
|
||||
PHOTOPRISM_ASSETS_PATH="/opt/photoprism/assets" \
|
||||
PHOTOPRISM_IMPORT_PATH="/photoprism/import" \
|
||||
|
@@ -42,8 +42,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
|
||||
DOCKER_ENV="prod" \
|
||||
TMPDIR="/tmp" \
|
||||
DEBIAN_FRONTEND="noninteractive" \
|
||||
TF_CPP_MIN_LOG_LEVEL="2" \
|
||||
MALLOC_ARENA_MAX="4" \
|
||||
TF_CPP_MIN_LOG_LEVEL=4 \
|
||||
TF_ENABLE_ONEDNN_OPTS=1 \
|
||||
MALLOC_ARENA_MAX=2 \
|
||||
PROG="photoprism" \
|
||||
PHOTOPRISM_ASSETS_PATH="/opt/photoprism/assets" \
|
||||
PHOTOPRISM_IMPORT_PATH="/photoprism/import" \
|
||||
|
@@ -42,8 +42,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
|
||||
DOCKER_ENV="prod" \
|
||||
TMPDIR="/tmp" \
|
||||
DEBIAN_FRONTEND="noninteractive" \
|
||||
TF_CPP_MIN_LOG_LEVEL="2" \
|
||||
MALLOC_ARENA_MAX="4" \
|
||||
TF_CPP_MIN_LOG_LEVEL=4 \
|
||||
TF_ENABLE_ONEDNN_OPTS=1 \
|
||||
MALLOC_ARENA_MAX=2 \
|
||||
PROG="photoprism" \
|
||||
PHOTOPRISM_ASSETS_PATH="/opt/photoprism/assets" \
|
||||
PHOTOPRISM_IMPORT_PATH="/photoprism/import" \
|
||||
|
@@ -42,8 +42,9 @@ ENV PHOTOPRISM_ARCH=$TARGETARCH \
|
||||
DOCKER_ENV="prod" \
|
||||
TMPDIR="/tmp" \
|
||||
DEBIAN_FRONTEND="noninteractive" \
|
||||
TF_CPP_MIN_LOG_LEVEL="2" \
|
||||
MALLOC_ARENA_MAX="4" \
|
||||
TF_CPP_MIN_LOG_LEVEL=4 \
|
||||
TF_ENABLE_ONEDNN_OPTS=1 \
|
||||
MALLOC_ARENA_MAX=2 \
|
||||
PROG="photoprism" \
|
||||
PHOTOPRISM_ASSETS_PATH="/opt/photoprism/assets" \
|
||||
PHOTOPRISM_IMPORT_PATH="/photoprism/import" \
|
||||
@@ -100,6 +101,3 @@ EXPOSE 2342 2443
|
||||
|
||||
# Copy app files.
|
||||
COPY --from=build --chown=root:root --chmod=755 /opt/photoprism/ /opt/photoprism
|
||||
|
||||
# Start app.
|
||||
CMD ["/scripts/cmd.sh", "/opt/photoprism/bin/photoprism", "start"]
|
104
docker/photoprism/plucky/Dockerfile
Normal file
104
docker/photoprism/plucky/Dockerfile
Normal file
@@ -0,0 +1,104 @@
|
||||
##################################################### BUILD STAGE ######################################################
|
||||
FROM photoprism/develop:plucky AS build
|
||||
|
||||
# Copyright © 2018 - 2025 PhotoPrism UG. All rights reserved.
|
||||
#
|
||||
# Questions? Email us at hello@photoprism.app or visit our website to learn
|
||||
# more about our team, products and services: https://www.photoprism.app/
|
||||
|
||||
# Declare build parameters.
|
||||
ARG TARGETARCH
|
||||
ARG TARGETPLATFORM
|
||||
ARG BUILD_TAG
|
||||
|
||||
# Copy source to image.
|
||||
WORKDIR "/go/src/github.com/photoprism/photoprism"
|
||||
COPY . .
|
||||
|
||||
# Build app.
|
||||
RUN make all install DESTDIR=/opt/photoprism
|
||||
|
||||
################################################## PRODUCTION STAGE ####################################################
|
||||
#### Base Image: Ubuntu 25.04 (Plucky Puffin)
|
||||
FROM photoprism/develop:plucky-slim
|
||||
|
||||
# Add Open Container Initiative (OCI) annotations.
|
||||
# See: https://github.com/opencontainers/image-spec/blob/main/annotations.md
|
||||
LABEL org.opencontainers.image.title="PhotoPrism® (Ubuntu 25.04)"
|
||||
LABEL org.opencontainers.image.description="Ubuntu 25.04 (Plucky Puffin)"
|
||||
LABEL org.opencontainers.image.url="https://hub.docker.com/r/photoprism/photoprism"
|
||||
LABEL org.opencontainers.image.source="https://github.com/photoprism/photoprism"
|
||||
LABEL org.opencontainers.image.documentation="https://docs.photoprism.app/getting-started/"
|
||||
LABEL org.opencontainers.image.authors="PhotoPrism UG <hello@photoprism.app>"
|
||||
LABEL org.opencontainers.image.vendor="PhotoPrism UG"
|
||||
|
||||
# Declare build parameters.
|
||||
ARG TARGETARCH
|
||||
ARG BUILD_TAG
|
||||
|
||||
# Set environment variables, see https://docs.photoprism.app/getting-started/config-options/.
|
||||
ENV PHOTOPRISM_ARCH=$TARGETARCH \
|
||||
DOCKER_TAG=$BUILD_TAG \
|
||||
DOCKER_ENV="prod" \
|
||||
TMPDIR="/tmp" \
|
||||
DEBIAN_FRONTEND="noninteractive" \
|
||||
TF_CPP_MIN_LOG_LEVEL=4 \
|
||||
TF_ENABLE_ONEDNN_OPTS=1 \
|
||||
MALLOC_ARENA_MAX=2 \
|
||||
PROG="photoprism" \
|
||||
PHOTOPRISM_ASSETS_PATH="/opt/photoprism/assets" \
|
||||
PHOTOPRISM_IMPORT_PATH="/photoprism/import" \
|
||||
PHOTOPRISM_ORIGINALS_PATH="/photoprism/originals" \
|
||||
PHOTOPRISM_STORAGE_PATH="/photoprism/storage" \
|
||||
PHOTOPRISM_BACKUP_PATH="/photoprism/storage/backups" \
|
||||
PHOTOPRISM_LOG_FILENAME="/photoprism/storage/photoprism.log" \
|
||||
PHOTOPRISM_PID_FILENAME="/photoprism/storage/photoprism.pid" \
|
||||
PHOTOPRISM_DEBUG="false" \
|
||||
PHOTOPRISM_PUBLIC="false" \
|
||||
PHOTOPRISM_READONLY="false" \
|
||||
PHOTOPRISM_UPLOAD_NSFW="true" \
|
||||
PHOTOPRISM_DETECT_NSFW="false" \
|
||||
PHOTOPRISM_EXPERIMENTAL="false" \
|
||||
PHOTOPRISM_SITE_URL="http://localhost:2342/" \
|
||||
PHOTOPRISM_SITE_CAPTION="AI-Powered Photos App" \
|
||||
PHOTOPRISM_SITE_DESCRIPTION="" \
|
||||
PHOTOPRISM_SITE_AUTHOR="" \
|
||||
PHOTOPRISM_HTTP_HOST="0.0.0.0" \
|
||||
PHOTOPRISM_HTTP_PORT=2342 \
|
||||
PHOTOPRISM_DATABASE_DRIVER="sqlite" \
|
||||
PHOTOPRISM_DATABASE_SERVER="" \
|
||||
PHOTOPRISM_DATABASE_NAME="photoprism" \
|
||||
PHOTOPRISM_DATABASE_USER="photoprism" \
|
||||
PHOTOPRISM_DATABASE_PASSWORD="" \
|
||||
PHOTOPRISM_DISABLE_CHOWN="false" \
|
||||
PHOTOPRISM_DISABLE_WEBDAV="false" \
|
||||
PHOTOPRISM_DISABLE_SETTINGS="false" \
|
||||
PHOTOPRISM_DISABLE_BACKUPS="false" \
|
||||
PHOTOPRISM_DISABLE_EXIFTOOL="false" \
|
||||
PHOTOPRISM_DISABLE_PLACES="false" \
|
||||
PHOTOPRISM_DISABLE_TENSORFLOW="false" \
|
||||
PHOTOPRISM_DISABLE_FACES="false" \
|
||||
PHOTOPRISM_DISABLE_CLASSIFICATION="false" \
|
||||
PHOTOPRISM_RAW_PRESETS="false" \
|
||||
PHOTOPRISM_THUMB_UNCACHED="false" \
|
||||
PHOTOPRISM_AUTO_INDEX="300" \
|
||||
PHOTOPRISM_AUTO_IMPORT="-1" \
|
||||
PHOTOPRISM_INIT="https"
|
||||
|
||||
# Copy scripts.
|
||||
COPY --chown=root:root --chmod=755 /scripts/dist/ /scripts/
|
||||
|
||||
# Update pre-installed packages.
|
||||
RUN apt-get update && \
|
||||
apt-get -qq dist-upgrade && \
|
||||
yt-dlp -U && \
|
||||
/scripts/cleanup.sh
|
||||
|
||||
# Set default working directory.
|
||||
WORKDIR /photoprism
|
||||
|
||||
# Expose HTTP(S) ports.
|
||||
EXPOSE 2342 2443
|
||||
|
||||
# Copy app files.
|
||||
COPY --from=build --chown=root:root --chmod=755 /opt/photoprism/ /opt/photoprism
|
@@ -1,27 +0,0 @@
|
||||
build --action_env PYTHON_BIN_PATH="/usr/bin/python3"
|
||||
build --action_env PYTHON_LIB_PATH="/usr/lib/python3/dist-packages"
|
||||
build --python_path="/usr/bin/python3"
|
||||
build --action_env TF_NEED_OPENCL_SYCL="0"
|
||||
build --action_env TF_NEED_ROCM="0"
|
||||
build --action_env TF_NEED_CUDA="0"
|
||||
build --action_env TF_NEED_TENSORRT="0"
|
||||
build --action_env CUDA_TOOLKIT_PATH="/usr/local/cuda"
|
||||
build --action_env TF_CUDA_COMPUTE_CAPABILITIES="5.3"
|
||||
build --action_env TF_CUDA_CLANG="0"
|
||||
build --action_env TF_CUDA_VERSION="10"
|
||||
build --action_env GCC_HOST_COMPILER_PATH="/usr/bin/gcc-4.8"
|
||||
build --verbose_failures
|
||||
build:opt --copt=-Wno-sign-compare
|
||||
build:opt --conlyopt=-std=c11
|
||||
build:opt --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0"
|
||||
build:opt --host_conlyopt=-std=c11
|
||||
build:opt --host_cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0"
|
||||
build:opt --host_copt=-Wno-sign-compare
|
||||
build:opt --define with_default_optimizations=true
|
||||
build:v2 --define=tf_api_version=2
|
||||
build:xla --define with_xla_support=true
|
||||
test --flaky_test_attempts=3
|
||||
test --test_size_filters=small,medium
|
||||
test --test_tag_filters=-benchmark-test,-no_oss,-oss_serial
|
||||
test --build_tag_filters=-benchmark-test,-no_oss
|
||||
build --action_env TF_CONFIGURE_IOS="0"
|
@@ -1,10 +1,13 @@
|
||||
FROM ubuntu:18.04
|
||||
FROM ubuntu:22.04
|
||||
|
||||
LABEL maintainer="PhotoPrism UG <hello@photoprism.app>"
|
||||
|
||||
ENV DEBIAN_FRONTEND noninteractive
|
||||
ENV TMP /tmp
|
||||
ENV EXTRA_BAZEL_ARGS "--host_javabase=@local_jdk//:jdk"
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
ENV TMP=/tmp
|
||||
|
||||
# see https://docs.docker.com/build/building/variables/#env-usage-example
|
||||
ARG TF_VERSION=2.18.0
|
||||
ENV TF_VERSION=$TF_VERSION
|
||||
|
||||
# apt default settings
|
||||
RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
|
||||
@@ -17,47 +20,32 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
|
||||
# Install dev / build dependencies
|
||||
RUN apt-get update && apt-get upgrade && \
|
||||
apt-get install \
|
||||
ca-certificates \
|
||||
build-essential \
|
||||
autoconf \
|
||||
automake \
|
||||
libtool \
|
||||
g++-4.8 \
|
||||
gcc-4.8 \
|
||||
libc6-dev \
|
||||
zlib1g-dev \
|
||||
libssl-dev \
|
||||
python3 \
|
||||
ca-certificates \
|
||||
curl \
|
||||
chrpath \
|
||||
pkg-config \
|
||||
unzip \
|
||||
zip \
|
||||
make \
|
||||
nano \
|
||||
wget \
|
||||
git \
|
||||
libtool \
|
||||
python3 \
|
||||
python3-git \
|
||||
openjdk-8-jdk
|
||||
lsb-release \
|
||||
software-properties-common \
|
||||
gnupg \
|
||||
jq \
|
||||
nano
|
||||
|
||||
# Use GCC 4.8 and Python 3 as default
|
||||
# See https://www.tensorflow.org/install/source#tested_build_configurations
|
||||
RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 10 && \
|
||||
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 10 && \
|
||||
update-alternatives --install /usr/bin/python python /usr/bin/python3.6 10
|
||||
# Install bazelisk and llvm
|
||||
RUN wget https://apt.llvm.org/llvm.sh && chmod u+x llvm.sh && \
|
||||
./llvm.sh 17 && rm llvm.sh && \
|
||||
ln -s /usr/bin/python3 /usr/bin/python && \
|
||||
ln -s /usr/bin/clang-17 /usr/bin/clang && \
|
||||
ln -s /usr/bin/clang++-17 /usr/bin/clang++ && \
|
||||
ln -s /usr/bin/clang-cpp /usr/bin/clang-cpp && \
|
||||
export BAZELISK_VERSION=$(curl -L https://api.github.com/repos/bazelbuild/bazelisk/releases/latest | jq -r .tag_name) && \
|
||||
curl -L https://github.com/bazelbuild/bazelisk/releases/download/${BAZELISK_VERSION}/bazelisk-linux-amd64 -o /usr/bin/bazel && \
|
||||
chmod +x /usr/bin/bazel && \
|
||||
mkdir -p /home/tensorflow
|
||||
|
||||
# Download Bazel & TensorFlow
|
||||
WORKDIR "/home/tensorflow"
|
||||
RUN wget https://github.com/tensorflow/tensorflow/archive/v1.15.2.tar.gz
|
||||
RUN tar -xzf v1.15.2.tar.gz
|
||||
|
||||
# Install Bazel
|
||||
RUN wget https://github.com/bazelbuild/bazel/releases/download/0.24.1/bazel-0.24.1-linux-x86_64
|
||||
RUN mv bazel-0.24.1-linux-x86_64 /usr/local/bin/bazel && chmod 755 /usr/local/bin/bazel
|
||||
|
||||
# Configure TensorFlow
|
||||
WORKDIR "/home/tensorflow/tensorflow-1.15.2"
|
||||
COPY ./*.sh ./
|
||||
COPY ./.tf_configure.bazelrc .tf_configure.bazelrc
|
||||
COPY ./Makefile Makefile
|
||||
|
@@ -1,20 +1,26 @@
|
||||
TF_VERSION=1.15.2
|
||||
|
||||
# -march see https://gcc.gnu.org/onlinedocs/gcc-4.8.5/gcc/i386-and-x86-64-Options.html
|
||||
|
||||
all: libtensorflow libtensorflow-avx libtensorflow-avx2
|
||||
patch:
|
||||
git apply tensorflow-$(TF_VERSION).diff
|
||||
all: libtensorflow libtensorflow-ssse3 libtensorflow-avx libtensorflow-avx2 libtensorflow-vnni libtensorflow-avx512
|
||||
# Downloads the TensorFlow source code from GitHub and extracts it to a subdirectory:
|
||||
download:
|
||||
wget https://github.com/tensorflow/tensorflow/archive/v$(TF_VERSION).tar.gz
|
||||
tar -xzf v$(TF_VERSION).tar.gz
|
||||
cp .tf_configure.bazelrc Makefile *.sh tensorflow-$(TF_VERSION)
|
||||
cp Makefile *.sh tensorflow-$(TF_VERSION)
|
||||
# Clang command line argument reference:
|
||||
# https://clang.llvm.org/docs/ClangCommandLineReference.html#x86
|
||||
libtensorflow:
|
||||
bazel build --jobs 2 --config=opt //tensorflow:libtensorflow.so
|
||||
./create_archive.sh linux-cpu $(TF_VERSION)
|
||||
bazel build -c opt //tensorflow:libtensorflow.so --copt=-O2 --copt=-mno-avx --copt=-mno-avx2 --copt=-mno-fma --copt=-march=x86-64
|
||||
./create_archive.sh amd64 $(TF_VERSION)
|
||||
libtensorflow-ssse3:
|
||||
bazel build -c opt //tensorflow:libtensorflow.so --copt=-O2 --copt=-mno-avx --copt=-mno-avx2 --copt=-mno-fma --copt=-march=core2
|
||||
./create_archive.sh amd64-ssse3 $(TF_VERSION)
|
||||
libtensorflow-avx:
|
||||
bazel build --jobs 2 --config=opt //tensorflow:libtensorflow.so --copt=-march=core-avx-i --host_copt=-march=core-avx-i
|
||||
./create_archive.sh linux-avx $(TF_VERSION)
|
||||
bazel build -c opt //tensorflow:libtensorflow.so --copt=-O2 --copt=-mavx
|
||||
./create_archive.sh amd64-avx $(TF_VERSION)
|
||||
libtensorflow-avx2:
|
||||
bazel build --jobs 2 --config=opt //tensorflow:libtensorflow.so --copt=-march=core-avx2 --host_copt=-march=core-avx2
|
||||
./create_archive.sh linux-avx2 $(TF_VERSION)
|
||||
bazel build -c opt //tensorflow:libtensorflow.so --copt=-O2 --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --copt=-msse4.2
|
||||
./create_archive.sh amd64-avx2 $(TF_VERSION)
|
||||
libtensorflow-vnni:
|
||||
bazel build -c opt //tensorflow:libtensorflow.so --copt=-O2 --copt=-mavx2 --copt=-mavxvnni --copt=-mfma --copt=-mfpmath=both --copt=-msse4.2
|
||||
./create_archive.sh amd64-vnni $(TF_VERSION)
|
||||
libtensorflow-avx512:
|
||||
bazel build -c opt //tensorflow:libtensorflow.so --copt=-O2 --copt=-mavx2 --copt=-mavx512f --copt=-mavx512vnni --copt=-mfma --copt=-mfpmath=both --copt=-msse4.2
|
||||
./create_archive.sh amd64-avx512 $(TF_VERSION)
|
||||
|
@@ -1,31 +0,0 @@
|
||||
build --action_env PYTHON_BIN_PATH="/usr/bin/python3"
|
||||
build --action_env PYTHON_LIB_PATH="/usr/lib/python3/dist-packages"
|
||||
build --python_path="/usr/bin/python3"
|
||||
build --action_env TF_NEED_OPENCL_SYCL="0"
|
||||
build --action_env TF_NEED_ROCM="0"
|
||||
build --action_env TF_NEED_CUDA="0"
|
||||
build --action_env TF_NEED_TENSORRT="0"
|
||||
build --action_env CUDA_TOOLKIT_PATH="/usr/local/cuda"
|
||||
build --action_env TF_CUDA_COMPUTE_CAPABILITIES="5.3"
|
||||
build --action_env TF_CUDA_CLANG="0"
|
||||
build --action_env TF_CUDA_VERSION="10"
|
||||
build --action_env GCC_HOST_COMPILER_PATH="/usr/bin/gcc-4.8"
|
||||
build --verbose_failures
|
||||
build:opt --copt=-march=armv8-a
|
||||
build:opt --copt=-Wno-sign-compare
|
||||
build:opt --conlyopt=-std=c11
|
||||
build:opt --conlyopt=-D_XOPEN_SOURCE=600
|
||||
build:opt --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0"
|
||||
build:opt --host_copt=-march=armv8-a
|
||||
build:opt --host_conlyopt=-std=c11
|
||||
build:opt --host_conlyopt=-D_XOPEN_SOURCE=600
|
||||
build:opt --host_cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0"
|
||||
build:opt --host_copt=-Wno-sign-compare
|
||||
build:opt --define with_default_optimizations=true
|
||||
build:v2 --define=tf_api_version=2
|
||||
build:xla --define with_xla_support=true
|
||||
test --flaky_test_attempts=3
|
||||
test --test_size_filters=small,medium
|
||||
test --test_tag_filters=-benchmark-test,-no_oss,-oss_serial
|
||||
test --build_tag_filters=-benchmark-test,-no_oss
|
||||
build --action_env TF_CONFIGURE_IOS="0"
|
@@ -1,10 +1,13 @@
|
||||
FROM ubuntu:18.04
|
||||
FROM ubuntu:22.04
|
||||
|
||||
LABEL maintainer="PhotoPrism UG <hello@photoprism.app>"
|
||||
|
||||
ENV DEBIAN_FRONTEND noninteractive
|
||||
ENV TMP /tmp
|
||||
ENV EXTRA_BAZEL_ARGS "--host_javabase=@local_jdk//:jdk"
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
ENV TMP=/tmp
|
||||
|
||||
# see https://docs.docker.com/build/building/variables/#env-usage-example
|
||||
ARG TF_VERSION=2.18.0
|
||||
ENV TF_VERSION=$TF_VERSION
|
||||
|
||||
# apt default settings
|
||||
RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
|
||||
@@ -17,48 +20,32 @@ RUN echo 'APT::Acquire::Retries "3";' > /etc/apt/apt.conf.d/80retries && \
|
||||
# Install dev / build dependencies
|
||||
RUN apt-get update && apt-get upgrade && \
|
||||
apt-get install \
|
||||
ca-certificates \
|
||||
build-essential \
|
||||
autoconf \
|
||||
automake \
|
||||
libtool \
|
||||
g++-4.8 \
|
||||
gcc-4.8 \
|
||||
libc6-dev \
|
||||
zlib1g-dev \
|
||||
libssl-dev \
|
||||
python3 \
|
||||
ca-certificates \
|
||||
curl \
|
||||
chrpath \
|
||||
pkg-config \
|
||||
unzip \
|
||||
zip \
|
||||
make \
|
||||
nano \
|
||||
wget \
|
||||
git \
|
||||
libtool \
|
||||
python3 \
|
||||
python3-git \
|
||||
openjdk-8-jdk
|
||||
lsb-release \
|
||||
software-properties-common \
|
||||
gnupg \
|
||||
jq \
|
||||
nano
|
||||
|
||||
# Use GCC 4.8 and Python 3 as default
|
||||
# See https://www.tensorflow.org/install/source#tested_build_configurations
|
||||
RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 10 && \
|
||||
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 10 && \
|
||||
update-alternatives --install /usr/bin/python python /usr/bin/python3.6 10
|
||||
# Install bazelisk and llvm
|
||||
RUN wget https://apt.llvm.org/llvm.sh && chmod u+x llvm.sh && \
|
||||
./llvm.sh 17 && rm llvm.sh && \
|
||||
ln -s /usr/bin/python3 /usr/bin/python && \
|
||||
ln -s /usr/bin/clang-17 /usr/bin/clang && \
|
||||
ln -s /usr/bin/clang++-17 /usr/bin/clang++ && \
|
||||
ln -s /usr/bin/clang-cpp /usr/bin/clang-cpp && \
|
||||
export BAZELISK_VERSION=$(curl -L https://api.github.com/repos/bazelbuild/bazelisk/releases/latest | jq -r .tag_name) && \
|
||||
curl -L https://github.com/bazelbuild/bazelisk/releases/download/${BAZELISK_VERSION}/bazelisk-linux-arm64 -o /usr/bin/bazel && \
|
||||
chmod +x /usr/bin/bazel && \
|
||||
mkdir -p /home/tensorflow
|
||||
|
||||
# Download Bazel & TensorFlow
|
||||
WORKDIR "/home/tensorflow"
|
||||
RUN wget https://github.com/tensorflow/tensorflow/archive/v1.15.2.tar.gz
|
||||
RUN tar -xzf v1.15.2.tar.gz
|
||||
|
||||
# Install Bazel
|
||||
# RUN wget https://github.com/bazelbuild/bazel/releases/download/0.24.1/bazel-0.24.1-linux-x86_64
|
||||
RUN wget https://github.com/guysoft/bazel-bin/raw/master/bazel-0.24.1-aarch64
|
||||
RUN mv bazel-0.24.1-aarch64 /usr/local/bin/bazel && chmod 755 /usr/local/bin/bazel
|
||||
|
||||
# Configure TensorFlow
|
||||
WORKDIR "/home/tensorflow/tensorflow-1.15.2"
|
||||
COPY ./*.sh ./
|
||||
COPY ./.tf_configure.bazelrc .tf_configure.bazelrc
|
||||
COPY ./Makefile Makefile
|
||||
COPY ./Makefile Makefile
|
||||
|
@@ -1,10 +1,11 @@
|
||||
TF_VERSION=1.15.2
|
||||
|
||||
# -march see https://gcc.gnu.org/onlinedocs/gcc-4.8.5/gcc/i386-and-x86-64-Options.html
|
||||
|
||||
all: libtensorflow
|
||||
patch:
|
||||
git apply tensorflow-$(TF_VERSION).diff
|
||||
# Downloads the TensorFlow source code from GitHub and extracts it to a subdirectory:
|
||||
download:
|
||||
wget https://github.com/tensorflow/tensorflow/archive/v$(TF_VERSION).tar.gz
|
||||
tar -xzf v$(TF_VERSION).tar.gz
|
||||
cp Makefile *.sh tensorflow-$(TF_VERSION)
|
||||
# Clang command line argument reference:
|
||||
# https://clang.llvm.org/docs/ClangCommandLineReference.html#aarch64
|
||||
libtensorflow:
|
||||
bazel build --jobs 2 --config=opt //tensorflow:libtensorflow.so --copt=-march=armv8-a --host_copt=-march=armv8-a
|
||||
bazel build -c opt //tensorflow:libtensorflow.so --copt=-O2 --copt=-march=armv8-a
|
||||
./create_archive.sh arm64 $(TF_VERSION)
|
||||
|
@@ -10,11 +10,17 @@ echo "Creating 'libtensorflow-$1-$2.tar.gz'...";
|
||||
rm -rf tmp
|
||||
mkdir -p tmp/lib/
|
||||
mkdir -p tmp/include/tensorflow/c/eager/
|
||||
cp bazel-bin/tensorflow/libtensorflow.so.$2 tmp/lib/libtensorflow.so
|
||||
cp bazel-bin/tensorflow/libtensorflow_framework.so.$2 tmp/lib/libtensorflow_framework.so
|
||||
cp tensorflow/c/eager/c_api.h tmp/include/tensorflow/c/eager/
|
||||
cp tensorflow/c/c_api.h tensorflow/c/c_api_experimental.h LICENSE tmp/include/tensorflow/c/
|
||||
(cd tmp && tar -czf ../libtensorflow-$1-$2.tar.gz .)
|
||||
du -h libtensorflow-$1-$2.tar.gz
|
||||
mkdir -p tmp/include/tensorflow/core/platform
|
||||
mkdir -p tmp/include/tsl/platform
|
||||
mkdir -p tmp/include/xla/tsl/c
|
||||
|
||||
echo "Done"
|
||||
cp -av bazel-bin/tensorflow/libtensorflow* tmp/lib/
|
||||
cp tensorflow/c/eager/*.h tmp/include/tensorflow/c/eager/
|
||||
cp tensorflow/c/*.h LICENSE tmp/include/tensorflow/c/
|
||||
cp tensorflow/core/platform/*.h tmp/include/tensorflow/core/platform
|
||||
cp third_party/xla/third_party/tsl/tsl/platform/*.h tmp/include/tsl/platform
|
||||
cp third_party/xla/xla/tsl/c/*.h tmp/include/xla/tsl/c
|
||||
(cd tmp && tar --exclude=*.params -czf /build/libtensorflow-$1-$2.tar.gz .)
|
||||
du -h /build/libtensorflow-$1-$2.tar.gz
|
||||
|
||||
echo "Done."
|
||||
|
@@ -10,11 +10,17 @@ echo "Creating 'libtensorflow-$1-$2.tar.gz'...";
|
||||
rm -rf tmp
|
||||
mkdir -p tmp/lib/
|
||||
mkdir -p tmp/include/tensorflow/c/eager/
|
||||
cp bazel-bin/tensorflow/libtensorflow.so.$2 tmp/lib/libtensorflow.so
|
||||
cp bazel-bin/tensorflow/libtensorflow_framework.so.$2 tmp/lib/libtensorflow_framework.so
|
||||
cp tensorflow/c/eager/c_api.h tmp/include/tensorflow/c/eager/
|
||||
cp tensorflow/c/c_api.h tensorflow/c/c_api_experimental.h LICENSE tmp/include/tensorflow/c/
|
||||
(cd tmp && tar -czf ../libtensorflow-$1-$2.tar.gz .)
|
||||
du -h libtensorflow-$1-$2.tar.gz
|
||||
mkdir -p tmp/include/tensorflow/core/platform
|
||||
mkdir -p tmp/include/tsl/platform
|
||||
mkdir -p tmp/include/xla/tsl/c
|
||||
|
||||
echo "Done"
|
||||
cp -av bazel-bin/tensorflow/libtensorflow* tmp/lib/
|
||||
cp tensorflow/c/eager/*.h tmp/include/tensorflow/c/eager/
|
||||
cp tensorflow/c/*.h LICENSE tmp/include/tensorflow/c/
|
||||
cp tensorflow/core/platform/*.h tmp/include/tensorflow/core/platform
|
||||
cp third_party/xla/third_party/tsl/tsl/platform/*.h tmp/include/tsl/platform
|
||||
cp third_party/xla/xla/tsl/c/*.h tmp/include/xla/tsl/c
|
||||
(cd tmp && tar --exclude=*.params -czf /build/libtensorflow-$1-$2.tar.gz .)
|
||||
du -h /build/libtensorflow-$1-$2.tar.gz
|
||||
|
||||
echo "Done."
|
||||
|
9
docker/tensorflow/cross/Dockerfile
Normal file
9
docker/tensorflow/cross/Dockerfile
Normal file
@@ -0,0 +1,9 @@
|
||||
ARG BUILDER_SHA2=06040763c500bd2ebaaa4585d4729c88d2c8ccec94baa7fbe9bbe3dc2827d79d
|
||||
FROM gcr.io/tensorflow-testing/ml-devinfra-linux-aarch64-cross-compile:infrastructure-public-image-${BUILDER_SHA2}
|
||||
|
||||
# see https://docs.docker.com/build/building/variables/#env-usage-example
|
||||
ARG TF_VERSION=2.18.0
|
||||
ENV TF_VERSION=$TF_VERSION
|
||||
|
||||
COPY ./create_archive.sh .
|
||||
COPY ./Makefile Makefile
|
10
docker/tensorflow/cross/Makefile
Normal file
10
docker/tensorflow/cross/Makefile
Normal file
@@ -0,0 +1,10 @@
|
||||
# -march see https://gcc.gnu.org/onlinedocs/gcc-4.8.5/gcc/i386-and-x86-64-Options.html
|
||||
|
||||
all: libtensorflow
|
||||
download:
|
||||
wget https://github.com/tensorflow/tensorflow/archive/v$(TF_VERSION).tar.gz
|
||||
tar -xzf v$(TF_VERSION).tar.gz
|
||||
cp Makefile *.sh tensorflow-$(TF_VERSION)
|
||||
libtensorflow:
|
||||
bazel build -c opt --config cross_compile_linux_arm64 //tensorflow:libtensorflow.so
|
||||
./create_archive.sh arm64 $(TF_VERSION)
|
14
docker/tensorflow/cross/build.sh
Executable file
14
docker/tensorflow/cross/build.sh
Executable file
@@ -0,0 +1,14 @@
|
||||
#!/bin/bash
|
||||
|
||||
DEFAULT_TF_VERSION=2.18.0
|
||||
|
||||
if [[ "$#" -ge 1 ]]; then
|
||||
TF_VERSION=$1
|
||||
elif [[ -z "$TF_VERSION" ]]; then
|
||||
TF_VERSION=$DEFAULT_TF_VERSION
|
||||
fi
|
||||
|
||||
SHA2_VERSION=$(curl -L https://raw.githubusercontent.com/tensorflow/tensorflow/refs/tags/v${TF_VERSION}/tensorflow/tools/toolchains/cross_compile/config/BUILD | \
|
||||
grep container-image | awk -F'@' '{ print $2 }' | awk -F':' '{ print $2 }' | tr -d '",')
|
||||
|
||||
docker build --build-arg BUILDER_SHA2=$SHA2_VERSION --build-arg TF_VERSION=$TF_VERSION -t photoprism/tensorflow:$TF_VERSION-cross .
|
26
docker/tensorflow/cross/create_archive.sh
Executable file
26
docker/tensorflow/cross/create_archive.sh
Executable file
@@ -0,0 +1,26 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
if [[ -z $1 ]] || [[ -z $2 ]]; then
|
||||
echo "Usage: $0 [platform] [tf-version]" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Creating 'libtensorflow-$1-$2.tar.gz'...";
|
||||
|
||||
rm -rf tmp
|
||||
mkdir -p tmp/lib/
|
||||
mkdir -p tmp/include/tensorflow/c/eager/
|
||||
mkdir -p tmp/include/tensorflow/core/platform
|
||||
mkdir -p tmp/include/tsl/platform
|
||||
mkdir -p tmp/include/xla/tsl/c
|
||||
|
||||
cp -av bazel-bin/tensorflow/libtensorflow* tmp/lib/
|
||||
cp tensorflow/c/eager/*.h tmp/include/tensorflow/c/eager/
|
||||
cp tensorflow/c/*.h LICENSE tmp/include/tensorflow/c/
|
||||
cp tensorflow/core/platform/*.h tmp/include/tensorflow/core/platform
|
||||
cp third_party/xla/third_party/tsl/tsl/platform/*.h tmp/include/tsl/platform
|
||||
cp third_party/xla/xla/tsl/c/*.h tmp/include/xla/tsl/c
|
||||
(cd tmp && tar --exclude=*.params -czf /build/libtensorflow-$1-$2.tar.gz .)
|
||||
du -h /build/libtensorflow-$1-$2.tar.gz
|
||||
|
||||
echo "Done."
|
@@ -1,36 +0,0 @@
|
||||
build --action_env PYTHON_BIN_PATH="/usr/bin/python"
|
||||
build --action_env PYTHON_LIB_PATH="/usr/lib/python2.7/dist-packages"
|
||||
build --python_path="/usr/bin/python"
|
||||
build --action_env TF_NEED_OPENCL_SYCL="0"
|
||||
build --action_env TF_NEED_ROCM="0"
|
||||
build --action_env TF_NEED_CUDA="1"
|
||||
build --action_env TF_NEED_TENSORRT="1"
|
||||
build --action_env CUDA_TOOLKIT_PATH="/usr/local/cuda"
|
||||
build --action_env TF_CUDA_COMPUTE_CAPABILITIES="5.3"
|
||||
build --action_env TF_CUDA_CLANG="0"
|
||||
build --action_env TF_CUDA_VERSION="10"
|
||||
build --action_env GCC_HOST_COMPILER_PATH="/usr/bin/gcc"
|
||||
build --config=cuda
|
||||
build --config=nonccl
|
||||
build --verbose_failures
|
||||
build --jobs 2
|
||||
build:opt --copt=-march=armv8-a
|
||||
build:opt --copt=-Wno-sign-compare
|
||||
build:opt --conlyopt=-std=c11
|
||||
build:opt --conlyopt=-D_XOPEN_SOURCE=600
|
||||
build:opt --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0"
|
||||
build:opt --host_copt=-march=armv8-a
|
||||
build:opt --host_conlyopt=-std=c11
|
||||
build:opt --host_conlyopt=-D_XOPEN_SOURCE=600
|
||||
build:opt --host_cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0"
|
||||
build:opt --host_copt=-Wno-sign-compare
|
||||
build:opt --define with_default_optimizations=true
|
||||
build:v2 --define=tf_api_version=2
|
||||
build:xla --define with_xla_support=true
|
||||
test --flaky_test_attempts=3
|
||||
test --test_size_filters=small,medium
|
||||
test --test_tag_filters=-benchmark-test,-no_oss,-oss_serial
|
||||
test --build_tag_filters=-benchmark-test,-no_oss
|
||||
test --test_tag_filters=-gpu
|
||||
test --build_tag_filters=-gpu
|
||||
build --action_env TF_CONFIGURE_IOS="0"
|
@@ -1,14 +1,10 @@
|
||||
TF_VERSION=1.15.2
|
||||
|
||||
# -march see https://gcc.gnu.org/onlinedocs/gcc-4.8.5/gcc/i386-and-x86-64-Options.html
|
||||
|
||||
all: libtensorflow
|
||||
patch:
|
||||
git apply tensorflow-$(TF_VERSION).diff
|
||||
download:
|
||||
wget https://github.com/tensorflow/tensorflow/archive/v$(TF_VERSION).tar.gz
|
||||
tar -xzf v$(TF_VERSION).tar.gz
|
||||
cp .tf_configure.bazelrc Makefile ../*.sh tensorflow-$(TF_VERSION)
|
||||
cp Makefile *.sh tensorflow-$(TF_VERSION)
|
||||
libtensorflow:
|
||||
bazel build --jobs 2 --config=opt //tensorflow:libtensorflow.so
|
||||
bazel build -c opt //tensorflow:libtensorflow.so --copt=-march=armv8-a
|
||||
./create_archive.sh jetson-nano $(TF_VERSION)
|
||||
|
26
docker/tensorflow/jetson-nano/create_archive.sh
Executable file
26
docker/tensorflow/jetson-nano/create_archive.sh
Executable file
@@ -0,0 +1,26 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
if [[ -z $1 ]] || [[ -z $2 ]]; then
|
||||
echo "Usage: $0 [platform] [tf-version]" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Creating 'libtensorflow-$1-$2.tar.gz'...";
|
||||
|
||||
rm -rf tmp
|
||||
mkdir -p tmp/lib/
|
||||
mkdir -p tmp/include/tensorflow/c/eager/
|
||||
mkdir -p tmp/include/tensorflow/core/platform
|
||||
mkdir -p tmp/include/tsl/platform
|
||||
mkdir -p tmp/include/xla/tsl/c
|
||||
|
||||
cp -av bazel-bin/tensorflow/libtensorflow* tmp/lib/
|
||||
cp tensorflow/c/eager/*.h tmp/include/tensorflow/c/eager/
|
||||
cp tensorflow/c/*.h LICENSE tmp/include/tensorflow/c/
|
||||
cp tensorflow/core/platform/*.h tmp/include/tensorflow/core/platform
|
||||
cp third_party/xla/third_party/tsl/tsl/platform/*.h tmp/include/tsl/platform
|
||||
cp third_party/xla/xla/tsl/c/*.h tmp/include/xla/tsl/c
|
||||
(cd tmp && tar --exclude=*.params -czf /build/libtensorflow-$1-$2.tar.gz .)
|
||||
du -h /build/libtensorflow-$1-$2.tar.gz
|
||||
|
||||
echo "Done."
|
@@ -1,27 +0,0 @@
|
||||
build --action_env PYTHON_BIN_PATH="/usr/local/bin/python3"
|
||||
build --action_env PYTHON_LIB_PATH="/usr/local/lib/python3.7/site-packages"
|
||||
build --python_path="/usr/local/bin/python3"
|
||||
build --action_env TF_NEED_OPENCL_SYCL="0"
|
||||
build --action_env TF_NEED_ROCM="0"
|
||||
build --action_env TF_NEED_CUDA="0"
|
||||
build --action_env TF_NEED_TENSORRT="0"
|
||||
build --action_env CUDA_TOOLKIT_PATH="/usr/local/cuda"
|
||||
build --action_env TF_CUDA_COMPUTE_CAPABILITIES="5.3"
|
||||
build --action_env TF_CUDA_CLANG="0"
|
||||
build --action_env TF_CUDA_VERSION="10"
|
||||
build --action_env GCC_HOST_COMPILER_PATH="/usr/bin/gcc"
|
||||
build --verbose_failures
|
||||
build:opt --copt=-Wno-sign-compare
|
||||
build:opt --conlyopt=-std=c11
|
||||
build:opt --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0"
|
||||
build:opt --host_conlyopt=-std=c11
|
||||
build:opt --host_cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0"
|
||||
build:opt --host_copt=-Wno-sign-compare
|
||||
build:opt --define with_default_optimizations=true
|
||||
build:v2 --define=tf_api_version=2
|
||||
build:xla --define with_xla_support=true
|
||||
test --flaky_test_attempts=3
|
||||
test --test_size_filters=small,medium
|
||||
test --test_tag_filters=-benchmark-test,-no_oss,-oss_serial
|
||||
test --build_tag_filters=-benchmark-test,-no_oss
|
||||
build --action_env TF_CONFIGURE_IOS="0"
|
@@ -1,20 +1,16 @@
|
||||
TF_VERSION=1.15.2
|
||||
|
||||
# -march see https://gcc.gnu.org/onlinedocs/gcc-4.8.5/gcc/i386-and-x86-64-Options.html
|
||||
|
||||
all: libtensorflow libtensorflow-avx libtensorflow-avx2
|
||||
patch:
|
||||
git apply tensorflow-$(TF_VERSION).diff
|
||||
download:
|
||||
wget https://github.com/tensorflow/tensorflow/archive/v$(TF_VERSION).tar.gz
|
||||
tar -xzf v$(TF_VERSION).tar.gz
|
||||
cp .tf_configure.bazelrc Makefile ../*.sh tensorflow-$(TF_VERSION)
|
||||
cp Makefile *.sh tensorflow-$(TF_VERSION)
|
||||
libtensorflow:
|
||||
bazel build --jobs 2 --config=opt //tensorflow:libtensorflow.so
|
||||
bazel build -c opt //tensorflow:libtensorflow.so
|
||||
./create_archive.sh osx-cpu $(TF_VERSION)
|
||||
libtensorflow-avx:
|
||||
bazel build --jobs 2 --config=opt //tensorflow:libtensorflow.so --copt=-march=core-avx-i --host_copt=-march=core-avx-i
|
||||
bazel build -c opt //tensorflow:libtensorflow.so --copt=-mavx
|
||||
./create_archive.sh osx-avx $(TF_VERSION)
|
||||
libtensorflow-avx2:
|
||||
bazel build --jobs 2 --config=opt //tensorflow:libtensorflow.so --copt=-march=core-avx2 --host_copt=-march=core-avx2
|
||||
./create_archive.sh osx-avx2 $(TF_VERSION)
|
||||
bazel build -c opt //tensorflow:libtensorflow.so --copt=-mavx2
|
||||
./create_archive.sh osx-avx2 $(TF_VERSION)
|
||||
|
@@ -1,14 +0,0 @@
|
||||
coverage/
|
||||
node_modules/
|
||||
tests/screenshots/
|
||||
tests/acceptance/screenshots/
|
||||
tests/upload-files/
|
||||
*.html
|
||||
.idea
|
||||
.github
|
||||
.tmp
|
||||
.local
|
||||
.cache
|
||||
.var
|
||||
|
||||
!**/.eslintrc.js
|
@@ -1,108 +0,0 @@
|
||||
module.exports = {
|
||||
env: {
|
||||
browser: true,
|
||||
commonjs: true,
|
||||
es2021: true,
|
||||
node: true,
|
||||
mocha: true,
|
||||
},
|
||||
extends: [
|
||||
"eslint:recommended",
|
||||
"plugin:vue/recommended",
|
||||
"plugin:prettier/recommended",
|
||||
"plugin:vue/base",
|
||||
"plugin:vuetify/base",
|
||||
],
|
||||
settings: {
|
||||
"prettier/prettier": {
|
||||
// Settings for how to process Vue SFC Blocks
|
||||
SFCBlocks: {
|
||||
template: false,
|
||||
script: false,
|
||||
style: false,
|
||||
},
|
||||
|
||||
// Use prettierrc for prettier options or not (default: `true`)
|
||||
usePrettierrc: true,
|
||||
|
||||
// Set the options for `prettier.getFileInfo`.
|
||||
// @see https://prettier.io/docs/en/api.html#prettiergetfileinfofilepath-options
|
||||
fileInfoOptions: {
|
||||
// Path to ignore file (default: `'.prettierignore'`)
|
||||
// Notice that the ignore file is only used for this plugin
|
||||
ignorePath: ".testignore",
|
||||
|
||||
// Process the files in `node_modules` or not (default: `false`)
|
||||
withNodeModules: false,
|
||||
},
|
||||
},
|
||||
},
|
||||
parserOptions: {
|
||||
ecmaVersion: "latest",
|
||||
sourceType: "module",
|
||||
},
|
||||
rules: {
|
||||
// 'comma-dangle': ['error', 'always-multiline'],
|
||||
"indent": ["error", 2, { SwitchCase: 1 }],
|
||||
"linebreak-style": ["error", "unix"],
|
||||
"quotes": [
|
||||
"off",
|
||||
"double",
|
||||
{
|
||||
avoidEscape: true,
|
||||
allowTemplateLiterals: true,
|
||||
},
|
||||
],
|
||||
"semi": ["error", "always"],
|
||||
"no-unused-vars": ["warn"],
|
||||
"no-console": 0,
|
||||
"no-case-declarations": 0,
|
||||
"no-prototype-builtins": 0,
|
||||
"vue/no-v-text-v-html-on-component": 0,
|
||||
"vue/no-v-model-argument": 0,
|
||||
"vue/valid-model-definition": 0,
|
||||
"vue/valid-attribute-name": 0,
|
||||
"vue/singleline-html-element-content-newline": [
|
||||
"off",
|
||||
{
|
||||
ignoreWhenNoAttributes: true,
|
||||
ignoreWhenEmpty: true,
|
||||
ignores: [
|
||||
"pre",
|
||||
"textarea",
|
||||
"span",
|
||||
"translate",
|
||||
"a",
|
||||
"v-icon",
|
||||
"v-text-field",
|
||||
"v-input",
|
||||
"v-select",
|
||||
"v-switch",
|
||||
"v-checkbox",
|
||||
"v-img",
|
||||
],
|
||||
externalIgnores: [],
|
||||
},
|
||||
],
|
||||
"vue/first-attribute-linebreak": [
|
||||
"error",
|
||||
{
|
||||
singleline: "ignore",
|
||||
multiline: "ignore",
|
||||
},
|
||||
],
|
||||
"prettier/prettier": [
|
||||
"warn",
|
||||
{
|
||||
printWidth: 120,
|
||||
semi: true,
|
||||
singleQuote: false,
|
||||
bracketSpacing: true,
|
||||
trailingComma: "es5",
|
||||
htmlWhitespaceSensitivity: "css",
|
||||
quoteProps: "consistent",
|
||||
proseWrap: "never",
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
@@ -16,7 +16,7 @@ install-npm:
|
||||
install-testcafe:
|
||||
npm install -g testcafe@latest
|
||||
install-eslint:
|
||||
npm install -g eslint@8 eslint-config-prettier eslint-config-standard eslint-formatter-pretty eslint-plugin-html eslint-plugin-import eslint-plugin-node eslint-plugin-prettier eslint-plugin-promise eslint-plugin-vue eslint-webpack-plugin vue-eslint-parser prettier
|
||||
npm install -g eslint globals @eslint/eslintrc @eslint/js eslint-config-prettier eslint-formatter-pretty eslint-plugin-html eslint-plugin-import eslint-plugin-node eslint-plugin-prettier eslint-plugin-promise eslint-plugin-vue eslint-webpack-plugin vue-eslint-parser prettier
|
||||
install:
|
||||
npm install --no-update-notifier --no-audit
|
||||
update:
|
||||
|
@@ -6,14 +6,26 @@ Package License Copyright
|
||||
@babel/preset-env MIT The Babel Team (https://babel.dev/team)
|
||||
@babel/register MIT The Babel Team (https://babel.dev/team)
|
||||
@babel/runtime MIT The Babel Team (https://babel.dev/team)
|
||||
@eslint/eslintrc MIT Nicholas C. Zakas
|
||||
@eslint/js MIT n/a
|
||||
@lcdp/offline-plugin MIT Le Comptoir Des Pharmacies <webmaster@lecomptoirdespharmacies.fr>
|
||||
@mdi/font Apache-2.0 Austin Andrews
|
||||
@testing-library/jest-dom MIT Ernesto Garcia <gnapse@gmail.com> (http://gnapse.github.io)
|
||||
@testing-library/react MIT Kent C. Dodds <me@kentcdodds.com> (https://kentcdodds.com)
|
||||
@vitejs/plugin-react MIT Evan You
|
||||
@vitejs/plugin-vue MIT Evan You
|
||||
@vitest/browser MIT n/a
|
||||
@vitest/coverage-v8 MIT Anthony Fu <anthonyfu117@hotmail.com>
|
||||
@vitest/ui MIT n/a
|
||||
@vue/compiler-sfc MIT Evan You
|
||||
@vue/language-server MIT n/a
|
||||
@vue/test-utils MIT Lachlan Miller lachlan.miller.1990@outlook.com
|
||||
@vvo/tzdb MIT Vincent Voyer <vincent@codeagain.com>
|
||||
axios MIT Matt Zabriskie
|
||||
axios-mock-adapter MIT Colin Timmermans <colintimmermans@gmail.com>
|
||||
babel-loader MIT Luis Couto <hello@luiscouto.pt>
|
||||
babel-plugin-istanbul BSD-3-Clause Thai Pangsakulyanont @dtinth
|
||||
babel-plugin-polyfill-corejs3 MIT n/a
|
||||
browserslist MIT Andrey Sitnik <andrey@sitnik.ru>
|
||||
chai MIT Jake Luer <jake@alogicalparadox.com>
|
||||
cheerio MIT Matt Mueller <mattmuelle@gmail.com>
|
||||
@@ -30,7 +42,6 @@ eslint-plugin-html ISC n/a
|
||||
eslint-plugin-import MIT Ben Mosher <me@benmosher.com>
|
||||
eslint-plugin-node MIT Toru Nagashima
|
||||
eslint-plugin-prettier MIT Teddy Katz
|
||||
eslint-plugin-promise ISC jden <jason@denizac.org>
|
||||
eslint-plugin-vue MIT Toru Nagashima (https://github.com/mysticatea)
|
||||
eslint-plugin-vuetify MIT Kael Watts-Deuchar <kaelwd@gmail.com>
|
||||
eslint-webpack-plugin MIT Ricardo Gobbo de Souza <ricardogobbosouza@yahoo.com.br>
|
||||
@@ -38,8 +49,10 @@ eventsource-polyfill MIT amvtek <devel@amvtek.com>
|
||||
file-loader MIT Tobias Koppers @sokra
|
||||
file-saver MIT Eli Grey <me@eligrey.com>
|
||||
floating-vue MIT Guillaume Chau <guillaume.b.chau@gmail.com>
|
||||
globals MIT Sindre Sorhus sindresorhus@gmail.com https://sindresorhus.com
|
||||
hls.js Apache-2.0 n/a
|
||||
i MIT Pavan Kumar Sunkara <pavan.sss1991@gmail.com> (pksunkara.github.com)
|
||||
jsdom MIT n/a
|
||||
karma MIT Vojta Jína <vojta.jina@gmail.com>
|
||||
karma-chrome-launcher MIT Vojta Jina <vojta.jina@gmail.com>
|
||||
karma-coverage-istanbul-reporter MIT Matt Lewis
|
||||
@@ -56,6 +69,7 @@ mocha MIT TJ Holowaychuk <tj@vision-media.
|
||||
node-storage-shim ISC Michael Nahkies
|
||||
passive-events-support MIT Ignas Damunskis <ignas3run@gmail.com>
|
||||
photoswipe MIT Dmytro Semenov (https://dimsemenov.com)
|
||||
playwright Apache-2.0 Microsoft Corporation
|
||||
postcss MIT Andrey Sitnik <andrey@sitnik.ru>
|
||||
postcss-import MIT Maxime Thirouin
|
||||
postcss-loader MIT Andrey Sitnik <andrey@sitnik.ru>
|
||||
@@ -71,12 +85,13 @@ sass MIT Natalie Weizenbaum nweiz@google.
|
||||
sass-loader MIT J. Tangelder
|
||||
server MIT Francisco Presencia <public@francisco.io> (https://francisco.io/)
|
||||
sockette MIT Luke Edwards luke.edwards05@gmail.com lukeed.com
|
||||
standard MIT Feross Aboukhadijeh feross@feross.org https://feross.org
|
||||
style-loader MIT Tobias Koppers @sokra
|
||||
svg-url-loader MIT Hovhannes Babayan
|
||||
tar ISC Isaac Z. Schlueter
|
||||
url-loader MIT Tobias Koppers @sokra
|
||||
util MIT Joyent http://www.joyent.com
|
||||
vite-tsconfig-paths MIT aleclarson
|
||||
vitest MIT Anthony Fu <anthonyfu117@hotmail.com>
|
||||
vue MIT Evan You
|
||||
vue-3-sanitize MIT Vannsl, Vanessa Otto <mail@vannsl.io>
|
||||
vue-loader MIT Evan You
|
||||
|
138
frontend/eslint.config.mjs
Normal file
138
frontend/eslint.config.mjs
Normal file
@@ -0,0 +1,138 @@
|
||||
import { defineConfig, globalIgnores } from "eslint/config";
|
||||
import globals from "globals";
|
||||
import path from "node:path";
|
||||
import { fileURLToPath } from "node:url";
|
||||
import js from "@eslint/js";
|
||||
import { FlatCompat } from "@eslint/eslintrc";
|
||||
|
||||
const __filename = fileURLToPath(import.meta.url);
|
||||
const __dirname = path.dirname(__filename);
|
||||
const compat = new FlatCompat({
|
||||
baseDirectory: __dirname,
|
||||
recommendedConfig: js.configs.recommended,
|
||||
allConfig: js.configs.all,
|
||||
});
|
||||
|
||||
export default defineConfig([
|
||||
globalIgnores([
|
||||
"**/coverage/",
|
||||
"**/node_modules/",
|
||||
"tests/screenshots/",
|
||||
"tests/acceptance/screenshots/",
|
||||
"tests/upload-files/",
|
||||
"**/*.html",
|
||||
"**/.idea",
|
||||
"**/.github",
|
||||
"**/.tmp",
|
||||
"**/.local",
|
||||
"**/.cache",
|
||||
"**/.var",
|
||||
]),
|
||||
{
|
||||
extends: compat.extends(
|
||||
"eslint:recommended",
|
||||
"plugin:vue/recommended",
|
||||
"plugin:prettier/recommended",
|
||||
"plugin:vue/base",
|
||||
"plugin:vuetify/base"
|
||||
),
|
||||
languageOptions: {
|
||||
globals: {
|
||||
...globals.browser,
|
||||
...globals.commonjs,
|
||||
...globals.node,
|
||||
...globals.mocha,
|
||||
},
|
||||
|
||||
ecmaVersion: "latest",
|
||||
sourceType: "module",
|
||||
},
|
||||
settings: {
|
||||
"prettier/prettier": {
|
||||
// Settings for how to process Vue SFC Blocks
|
||||
SFCBlocks: {
|
||||
template: false,
|
||||
script: false,
|
||||
style: false,
|
||||
},
|
||||
|
||||
// Use prettierrc for prettier options or not (default: `true`)
|
||||
usePrettierrc: true,
|
||||
|
||||
// Set the options for `prettier.getFileInfo`.
|
||||
// @see https://prettier.io/docs/en/api.html#prettiergetfileinfofilepath-options
|
||||
fileInfoOptions: {
|
||||
// Path to ignore file (default: `'.prettierignore'`)
|
||||
// Notice that the ignore file is only used for this plugin
|
||||
ignorePath: ".testignore",
|
||||
|
||||
// Process the files in `node_modules` or not (default: `false`)
|
||||
withNodeModules: false,
|
||||
},
|
||||
},
|
||||
},
|
||||
rules: {
|
||||
"indent": ["error", 2, { SwitchCase: 1 }],
|
||||
"linebreak-style": ["error", "unix"],
|
||||
"quotes": [
|
||||
"off",
|
||||
"double",
|
||||
{
|
||||
avoidEscape: true,
|
||||
allowTemplateLiterals: true,
|
||||
},
|
||||
],
|
||||
"semi": ["error", "always"],
|
||||
"no-unused-vars": ["warn"],
|
||||
"no-console": 0,
|
||||
"no-case-declarations": 0,
|
||||
"no-prototype-builtins": 0,
|
||||
"vue/no-v-text-v-html-on-component": 0,
|
||||
"vue/no-v-model-argument": 0,
|
||||
"vue/valid-model-definition": 0,
|
||||
"vue/valid-attribute-name": 0,
|
||||
"vue/singleline-html-element-content-newline": [
|
||||
"off",
|
||||
{
|
||||
ignoreWhenNoAttributes: true,
|
||||
ignoreWhenEmpty: true,
|
||||
ignores: [
|
||||
"pre",
|
||||
"textarea",
|
||||
"span",
|
||||
"translate",
|
||||
"a",
|
||||
"v-icon",
|
||||
"v-text-field",
|
||||
"v-input",
|
||||
"v-select",
|
||||
"v-switch",
|
||||
"v-checkbox",
|
||||
"v-img",
|
||||
],
|
||||
externalIgnores: [],
|
||||
},
|
||||
],
|
||||
"vue/first-attribute-linebreak": [
|
||||
"error",
|
||||
{
|
||||
singleline: "ignore",
|
||||
multiline: "ignore",
|
||||
},
|
||||
],
|
||||
"prettier/prettier": [
|
||||
"warn",
|
||||
{
|
||||
printWidth: 120,
|
||||
semi: true,
|
||||
singleQuote: false,
|
||||
bracketSpacing: true,
|
||||
trailingComma: "es5",
|
||||
htmlWhitespaceSensitivity: "css",
|
||||
quoteProps: "consistent",
|
||||
proseWrap: "never",
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
]);
|
21
frontend/gettext.config.js
Normal file
21
frontend/gettext.config.js
Normal file
@@ -0,0 +1,21 @@
|
||||
const glob = require("glob");
|
||||
const path = require("path");
|
||||
const poPath = path.resolve(__dirname, "src/locales");
|
||||
|
||||
// Generates a list of existing locales based on the files in src/locales.
|
||||
const languageCodes = glob.sync(poPath + "/*.po").map((filePath) => {
|
||||
const fileName = path.basename(filePath);
|
||||
return fileName.replace(".po", "");
|
||||
});
|
||||
|
||||
// Generates one JSON file per locale from the gettext *.po files located in src/locales.
|
||||
module.exports = {
|
||||
output: {
|
||||
path: path.resolve(__dirname, "src/locales"),
|
||||
potPath: "src/locales/translations.pot",
|
||||
jsonPath: "json",
|
||||
locales: languageCodes,
|
||||
splitJson: true,
|
||||
flat: true,
|
||||
},
|
||||
};
|
@@ -168,4 +168,7 @@ module.exports = (config) => {
|
||||
|
||||
singleRun: true,
|
||||
});
|
||||
|
||||
// Set default timezone.
|
||||
process.env.TZ = "UTC";
|
||||
};
|
||||
|
7832
frontend/package-lock.json
generated
7832
frontend/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -1,68 +1,90 @@
|
||||
{
|
||||
"name": "photoprism",
|
||||
"version": "1",
|
||||
"description": "AI-Powered Photos App",
|
||||
"author": "PhotoPrism UG",
|
||||
"license": "AGPL-3.0",
|
||||
"private": true,
|
||||
"description": "AI-Powered Photos App",
|
||||
"license": "AGPL-3.0",
|
||||
"author": "PhotoPrism UG",
|
||||
"scripts": {
|
||||
"watch": "webpack --watch",
|
||||
"build": "webpack --node-env=production",
|
||||
"build-dev": "webpack --node-env=development",
|
||||
"build-analyze": "webpack --node-env=analyze",
|
||||
"trace": "webpack --stats-children",
|
||||
"debug": "webpack --stats-error-details",
|
||||
"lint": "eslint --cache src/ *.js",
|
||||
"fmt": "eslint --cache --fix src/ *.js .eslintrc.js",
|
||||
"test": "karma start",
|
||||
"upgrade": "npm update && npm audit fix",
|
||||
"testcafe": "testcafe",
|
||||
"acceptance-local": "testcafe chromium --selector-timeout 5000 -S -s tests/acceptance/screenshots tests/acceptance",
|
||||
"build": "webpack --node-env=production",
|
||||
"build-analyze": "webpack --node-env=analyze",
|
||||
"build-dev": "webpack --node-env=development",
|
||||
"debug": "webpack --stats-error-details",
|
||||
"dep-list": "npx npm-check-updates",
|
||||
"fmt": "eslint --cache --fix src/ *.js eslint.config.mjs",
|
||||
"fmt-npm": "prettier --write package.json",
|
||||
"gettext-compile": "vue-gettext-compile",
|
||||
"gettext-extract": "gettext-extract --output src/locales/translations.pot $(find ${SRC:-src} -type f \\( -iname \\*.vue -o -iname \\*.js \\) -not -path src/common/gettext.js)",
|
||||
"gettext-compile": "gettext-compile --output src/locales/translations.json src/locales/*.po",
|
||||
"dep-list": "npx npm-check-updates"
|
||||
"lint": "eslint --cache src/ *.js",
|
||||
"test": "karma start",
|
||||
"vitest": "env TZ=UTC vitest run",
|
||||
"vitest-watch": "env TZ=UTC vitest --watch",
|
||||
"vitest-coverage": "env TZ=UTC vitest run --coverage",
|
||||
"vitest-component": "env TZ=UTC vitest run tests/vitest/component",
|
||||
"vitest-ui": "env TZ=UTC vitest --ui --watch",
|
||||
"testcafe": "testcafe",
|
||||
"trace": "webpack --stats-children",
|
||||
"upgrade": "npm update && npm audit fix",
|
||||
"watch": "webpack --watch"
|
||||
},
|
||||
"browserslist": [
|
||||
">0.25% and last 2 years"
|
||||
],
|
||||
"dependencies": {
|
||||
"@babel/cli": "^7.26.4",
|
||||
"@babel/core": "^7.26.10",
|
||||
"@babel/plugin-transform-runtime": "^7.26.10",
|
||||
"@babel/preset-env": "^7.26.9",
|
||||
"@babel/register": "^7.25.9",
|
||||
"@babel/runtime": "^7.26.10",
|
||||
"@babel/cli": "^7.28.0",
|
||||
"@babel/core": "^7.28.0",
|
||||
"@babel/plugin-transform-runtime": "^7.28.0",
|
||||
"@babel/preset-env": "^7.28.0",
|
||||
"@babel/register": "^7.27.1",
|
||||
"@babel/runtime": "^7.27.6",
|
||||
"@eslint/eslintrc": "^3.3.1",
|
||||
"@eslint/js": "^9.30.1",
|
||||
"@lcdp/offline-plugin": "^5.1.1",
|
||||
"@mdi/font": "^7.4.47",
|
||||
"@vue/compiler-sfc": "^3.5.13",
|
||||
"@vvo/tzdb": "^6.161.0",
|
||||
"axios": "^1.8.3",
|
||||
"@testing-library/jest-dom": "^6.6.3",
|
||||
"@testing-library/react": "^16.3.0",
|
||||
"@vitejs/plugin-react": "^4.6.0",
|
||||
"@vitejs/plugin-vue": "^6.0.0",
|
||||
"@vitest/browser": "^3.2.4",
|
||||
"@vitest/coverage-v8": "^3.2.4",
|
||||
"@vitest/ui": "^3.2.4",
|
||||
"@vue/compiler-sfc": "^3.5.17",
|
||||
"@vue/language-server": "^3.0.1",
|
||||
"@vue/test-utils": "^2.4.6",
|
||||
"@vvo/tzdb": "^6.176.0",
|
||||
"axios": "^1.10.0",
|
||||
"axios-mock-adapter": "^2.1.0",
|
||||
"babel-loader": "^9.2.1",
|
||||
"babel-loader": "^10.0.0",
|
||||
"babel-plugin-istanbul": "^7.0.0",
|
||||
"browserslist": "^4.24.4",
|
||||
"babel-plugin-polyfill-corejs3": "^0.13.0",
|
||||
"browserslist": "^4.25.1",
|
||||
"chai": "^5.2.0",
|
||||
"cheerio": "1.0.0-rc.12",
|
||||
"chrome-finder": "^1.0.7",
|
||||
"core-js": "^3.41.0",
|
||||
"core-js": "^3.43.0",
|
||||
"cross-env": "^7.0.3",
|
||||
"css-loader": "^7.1.2",
|
||||
"cssnano": "^7.0.6",
|
||||
"cssnano": "^7.0.7",
|
||||
"easygettext": "^2.17.0",
|
||||
"eslint": ">=8.57.0",
|
||||
"eslint-config-prettier": "^10.1.1",
|
||||
"eslint": "^9.30.1",
|
||||
"eslint-config-prettier": "^10.1.5",
|
||||
"eslint-formatter-pretty": "^6.0.1",
|
||||
"eslint-plugin-html": "^8.1.2",
|
||||
"eslint-plugin-import": "^2.31.0",
|
||||
"eslint-plugin-html": "^8.1.3",
|
||||
"eslint-plugin-import": "^2.32.0",
|
||||
"eslint-plugin-node": "^11.1.0",
|
||||
"eslint-plugin-prettier": "^5.2.3",
|
||||
"eslint-plugin-promise": "^7.2.1",
|
||||
"eslint-plugin-vue": "^9.32.0",
|
||||
"eslint-plugin-prettier": "^5.5.1",
|
||||
"eslint-plugin-vue": "^10.3.0",
|
||||
"eslint-plugin-vuetify": "^2.5.2",
|
||||
"eslint-webpack-plugin": "^4.2.0",
|
||||
"eslint-webpack-plugin": "^5.0.2",
|
||||
"eventsource-polyfill": "^0.9.6",
|
||||
"file-loader": "^6.2.0",
|
||||
"file-saver": "^2.0.5",
|
||||
"floating-vue": "^5.2.2",
|
||||
"hls.js": "^1.5.20",
|
||||
"globals": "^16.3.0",
|
||||
"hls.js": "^1.6.6",
|
||||
"i": "^0.3.7",
|
||||
"jsdom": "^26.1.0",
|
||||
"karma": "^6.4.4",
|
||||
"karma-chrome-launcher": "^3.2.0",
|
||||
"karma-coverage-istanbul-reporter": "^3.0.3",
|
||||
@@ -70,65 +92,60 @@
|
||||
"karma-mocha": "^2.0.1",
|
||||
"karma-verbose-reporter": "^0.0.8",
|
||||
"karma-webpack": "^5.0.1",
|
||||
"luxon": "^3.5.0",
|
||||
"maplibre-gl": "^5.2.0",
|
||||
"luxon": "^3.6.1",
|
||||
"maplibre-gl": "^5.6.1",
|
||||
"memoize-one": "^6.0.0",
|
||||
"mini-css-extract-plugin": "^2.9.2",
|
||||
"minimist": ">=1.2.8",
|
||||
"mocha": "^11.1.0",
|
||||
"mocha": "^11.7.1",
|
||||
"node-storage-shim": "^2.0.1",
|
||||
"passive-events-support": "^1.1.0",
|
||||
"photoswipe": "^5.4.4",
|
||||
"postcss": "^8.5.3",
|
||||
"postcss-import": "^16.1.0",
|
||||
"playwright": "^1.53.2",
|
||||
"postcss": "^8.5.6",
|
||||
"postcss-import": "^16.1.1",
|
||||
"postcss-loader": "^8.1.1",
|
||||
"postcss-preset-env": "^10.1.3",
|
||||
"postcss-preset-env": "^10.2.4",
|
||||
"postcss-reporter": "^7.1.0",
|
||||
"postcss-url": "^10.1.3",
|
||||
"prettier": "^3.5.3",
|
||||
"prettier": "^3.6.2",
|
||||
"pubsub-js": "^1.9.5",
|
||||
"regenerator-runtime": "^0.14.1",
|
||||
"resolve-url-loader": "^5.0.0",
|
||||
"sanitize-html": "^2.14.0",
|
||||
"sass": "^1.84.0",
|
||||
"sass-loader": "^16.0.4",
|
||||
"sanitize-html": "^2.17.0",
|
||||
"sass": "^1.89.2",
|
||||
"sass-loader": "^16.0.5",
|
||||
"server": "^1.0.41",
|
||||
"sockette": "^2.0.6",
|
||||
"standard": "^17.1.2",
|
||||
"style-loader": "^4.0.0",
|
||||
"svg-url-loader": "^8.0.0",
|
||||
"tar": "^7.4.3",
|
||||
"url-loader": "^4.1.1",
|
||||
"util": "^0.12.5",
|
||||
"vue": "^3.5.13",
|
||||
"vite-tsconfig-paths": "^5.1.4",
|
||||
"vitest": "^3.2.4",
|
||||
"vue": "^3.5.17",
|
||||
"vue-3-sanitize": "^0.1.4",
|
||||
"vue-loader": "^17.4.2",
|
||||
"vue-loader-plugin": "^1.3.0",
|
||||
"vue-luxon": "^0.10.0",
|
||||
"vue-router": "^4.5.0",
|
||||
"vue-router": "^4.5.1",
|
||||
"vue-sanitize-directive": "^0.2.1",
|
||||
"vue-style-loader": "^4.1.3",
|
||||
"vue3-gettext": "^2.4.0",
|
||||
"vuetify": "^3.7.18",
|
||||
"webpack": "^5.98.0",
|
||||
"vuetify": "^3.8.12",
|
||||
"webpack": "^5.99.9",
|
||||
"webpack-bundle-analyzer": "^4.10.2",
|
||||
"webpack-cli": "^5.1.4",
|
||||
"webpack-cli": "^6.0.1",
|
||||
"webpack-hot-middleware": "^2.26.1",
|
||||
"webpack-manifest-plugin": "^5.0.0",
|
||||
"webpack-manifest-plugin": "^5.0.1",
|
||||
"webpack-md5-hash": "^0.0.6",
|
||||
"webpack-merge": "^6.0.1",
|
||||
"webpack-plugin-vuetify": "^3.1.0"
|
||||
"webpack-plugin-vuetify": "^3.1.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 18.0.0",
|
||||
"npm": ">= 9.0.0",
|
||||
"yarn": "please use npm"
|
||||
},
|
||||
"browserslist": [
|
||||
">0.25% and last 2 years"
|
||||
],
|
||||
"devDependencies": {
|
||||
"@vue/language-server": "^2.2.0",
|
||||
"babel-plugin-polyfill-corejs3": "^0.11.1"
|
||||
}
|
||||
}
|
||||
|
@@ -1,3 +1,3 @@
|
||||
module.exports = {
|
||||
plugins: ["postcss-import", "postcss-preset-env", "cssnano"],
|
||||
plugins: [require("postcss-import"), require("postcss-preset-env"), require("cssnano")],
|
||||
};
|
||||
|
@@ -52,7 +52,6 @@ import VueLuxon from "vue-luxon";
|
||||
import { passiveSupport } from "passive-events-support/src/utils";
|
||||
import * as themes from "options/themes";
|
||||
import Hls from "hls.js";
|
||||
import "common/maptiler-lang";
|
||||
import { createGettext, T } from "common/gettext";
|
||||
import { Locale } from "locales";
|
||||
import * as offline from "@lcdp/offline-plugin/runtime";
|
||||
|
@@ -2,8 +2,6 @@
|
||||
<div id="photoprism" :class="['theme-' + themeName]">
|
||||
<p-loading-bar height="4"></p-loading-bar>
|
||||
|
||||
<p-notify></p-notify>
|
||||
|
||||
<v-app :class="appClass">
|
||||
<p-navigation></p-navigation>
|
||||
|
||||
@@ -13,6 +11,7 @@
|
||||
</v-app>
|
||||
|
||||
<p-dialogs></p-dialogs>
|
||||
<p-notify></p-notify>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
@@ -100,10 +100,18 @@ export default [
|
||||
meta: {
|
||||
title: $gettext("Settings"),
|
||||
requiresAuth: true,
|
||||
admin: true,
|
||||
settings: true,
|
||||
background: "background",
|
||||
},
|
||||
beforeEnter: (to, from, next) => {
|
||||
if ($session.loginRequired()) {
|
||||
next({ name: loginRoute });
|
||||
} else if ($config.deny("users", "access_all")) {
|
||||
next({ name: $session.getDefaultRoute() });
|
||||
} else {
|
||||
next();
|
||||
}
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "upgrade",
|
||||
@@ -222,11 +230,18 @@ export default [
|
||||
meta: { title: $gettext("Favorites"), requiresAuth: true },
|
||||
props: { staticFilter: { favorite: "true" } },
|
||||
},
|
||||
{
|
||||
name: "media",
|
||||
path: "/media",
|
||||
component: Photos,
|
||||
meta: { title: $gettext("Media"), requiresAuth: true },
|
||||
props: { staticFilter: { media: "true" } },
|
||||
},
|
||||
{
|
||||
name: "live",
|
||||
path: "/live",
|
||||
component: Photos,
|
||||
meta: { title: $gettext("Live"), requiresAuth: true },
|
||||
meta: { title: $gettext("Live Photos"), requiresAuth: true },
|
||||
props: { staticFilter: { live: "true" } },
|
||||
},
|
||||
{
|
||||
@@ -236,6 +251,20 @@ export default [
|
||||
meta: { title: $gettext("Videos"), requiresAuth: true },
|
||||
props: { staticFilter: { video: "true" } },
|
||||
},
|
||||
{
|
||||
name: "audio",
|
||||
path: "/audio",
|
||||
component: Photos,
|
||||
meta: { title: $gettext("Audio"), requiresAuth: true },
|
||||
props: { staticFilter: { audio: "true" } },
|
||||
},
|
||||
{
|
||||
name: "animated",
|
||||
path: "/animated",
|
||||
component: Photos,
|
||||
meta: { title: $gettext("Animated"), requiresAuth: true },
|
||||
props: { staticFilter: { animated: "true" } },
|
||||
},
|
||||
{
|
||||
name: "review",
|
||||
path: "/review",
|
||||
|
@@ -26,8 +26,7 @@ Additional information can be found in our Developer Guide:
|
||||
import $api from "common/api";
|
||||
import $event from "common/event";
|
||||
import * as themes from "options/themes";
|
||||
import translations from "locales/translations.json";
|
||||
import { Languages } from "options/options";
|
||||
import * as options from "options/options";
|
||||
import { Photo } from "model/photo";
|
||||
import { onInit, onSetTheme } from "common/hooks";
|
||||
import { ref, reactive } from "vue";
|
||||
@@ -48,7 +47,7 @@ export default class Config {
|
||||
this.updating = false;
|
||||
|
||||
this.$vuetify = null;
|
||||
this.translations = translations;
|
||||
this.translations = {};
|
||||
|
||||
if (!values || !values.siteTitle) {
|
||||
// Omit warning in unit tests.
|
||||
@@ -166,7 +165,7 @@ export default class Config {
|
||||
return this.updating;
|
||||
}
|
||||
|
||||
setValues(values) {
|
||||
async setValues(values) {
|
||||
if (!values || typeof values !== "object") {
|
||||
return;
|
||||
}
|
||||
@@ -175,6 +174,10 @@ export default class Config {
|
||||
$event.publish("dialog.update", { values });
|
||||
}
|
||||
|
||||
if (values.DefaultLocale && options.DefaultLocale !== values.DefaultLocale) {
|
||||
options.SetDefaultLocale(values.DefaultLocale);
|
||||
}
|
||||
|
||||
for (let key in values) {
|
||||
if (values.hasOwnProperty(key) && values[key] != null) {
|
||||
this.set(key, values[key]);
|
||||
@@ -185,7 +188,7 @@ export default class Config {
|
||||
|
||||
if (values.settings) {
|
||||
this.setBatchSize(values.settings);
|
||||
this.setLanguage(values.settings.ui.language, true);
|
||||
await this.setLanguage(this.getLanguageLocale(), true);
|
||||
this.setTheme(values.settings.ui.theme);
|
||||
}
|
||||
|
||||
@@ -292,14 +295,30 @@ export default class Config {
|
||||
this.values.count.all += data.count;
|
||||
this.values.count.photos += data.count;
|
||||
break;
|
||||
case "live":
|
||||
case "animated":
|
||||
this.values.count.all += data.count;
|
||||
this.values.count.live += data.count;
|
||||
this.values.count.media += data.count;
|
||||
this.values.count.animated += data.count;
|
||||
break;
|
||||
case "videos":
|
||||
this.values.count.all += data.count;
|
||||
this.values.count.media += data.count;
|
||||
this.values.count.videos += data.count;
|
||||
break;
|
||||
case "live":
|
||||
this.values.count.all += data.count;
|
||||
this.values.count.media += data.count;
|
||||
this.values.count.live += data.count;
|
||||
break;
|
||||
case "audio":
|
||||
this.values.count.all += data.count;
|
||||
this.values.count.media += data.count;
|
||||
this.values.count.audio += data.count;
|
||||
break;
|
||||
case "documents":
|
||||
this.values.count.all += data.count;
|
||||
this.values.count.documents += data.count;
|
||||
break;
|
||||
case "cameras":
|
||||
this.values.count.cameras += data.count;
|
||||
this.update();
|
||||
@@ -417,9 +436,29 @@ export default class Config {
|
||||
return !this.allowAny(resource, perm);
|
||||
}
|
||||
|
||||
// loadTranslation asynchronously loads the specified locale file.
|
||||
async loadTranslation(locale) {
|
||||
if (!locale || (this.translations && this.translations[locale])) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
// Dynamically import the translation JSON file.
|
||||
await import(
|
||||
/* webpackChunkName: "[request]" */
|
||||
/* webpackMode: "lazy" */
|
||||
`../locales/json/${locale}.json`
|
||||
).then((module) => {
|
||||
Object.assign(this.translations, module.default);
|
||||
});
|
||||
} catch (error) {
|
||||
console.error(`failed to load translations for locale ${locale}:`, error);
|
||||
}
|
||||
}
|
||||
|
||||
// setLanguage sets the ISO/IEC 15897 locale,
|
||||
// e.g. "en" or "zh_TW" (minimum 2 letters).
|
||||
setLanguage(locale, apply) {
|
||||
async setLanguage(locale, apply) {
|
||||
// Skip setting language if no locale is specified.
|
||||
if (!locale) {
|
||||
return this;
|
||||
@@ -427,6 +466,8 @@ export default class Config {
|
||||
|
||||
// Apply locale to browser window?
|
||||
if (apply) {
|
||||
await this.loadTranslation(locale);
|
||||
|
||||
// Update the Accept-Language header for XHR requests.
|
||||
if ($api) {
|
||||
$api.defaults.headers.common["Accept-Language"] = locale;
|
||||
@@ -468,18 +509,39 @@ export default class Config {
|
||||
// getLanguageLocale returns the ISO/IEC 15897 locale,
|
||||
// e.g. "en" or "zh_TW" (minimum 2 letters).
|
||||
getLanguageLocale() {
|
||||
let locale = "en";
|
||||
// Get default locale from web browser.
|
||||
let locale = navigator?.language;
|
||||
|
||||
// Override language locale with query parameter?
|
||||
if (window.location?.search) {
|
||||
const query = new URLSearchParams(window.location.search);
|
||||
const queryLocale = query.get("locale");
|
||||
if (queryLocale && queryLocale.length > 1 && queryLocale.length < 6) {
|
||||
// Change the locale settings.
|
||||
locale = options.FindLocale(queryLocale);
|
||||
this.storage.setItem(this.storageKey + ".locale", locale);
|
||||
if (this.values?.settings?.ui) {
|
||||
this.values.settings.ui.language = locale;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Get user locale from localStorage if settings have not yet been loaded from backend.
|
||||
if (this.loading()) {
|
||||
const stored = this.storage.getItem(this.storageKey + ".locale");
|
||||
if (stored) {
|
||||
locale = stored;
|
||||
|
||||
if (this.values?.settings?.ui) {
|
||||
this.values.settings.ui.language = locale;
|
||||
}
|
||||
}
|
||||
} else if (this.values.settings && this.values.settings.ui && this.values.settings.ui.language) {
|
||||
} else if (this.values?.settings?.ui?.language) {
|
||||
locale = this.values.settings.ui.language;
|
||||
}
|
||||
|
||||
return locale;
|
||||
// Find and return the best matching language locale that exists.
|
||||
return options.FindLocale(locale);
|
||||
}
|
||||
|
||||
// getLanguageCode returns the ISO 639-1 language code (2 letters),
|
||||
@@ -488,13 +550,22 @@ export default class Config {
|
||||
return this.getLanguageLocale().substring(0, 2);
|
||||
}
|
||||
|
||||
// getTimeZone returns user time zone.
|
||||
getTimeZone() {
|
||||
if (this.values?.settings?.ui?.timeZone) {
|
||||
return this.values?.settings?.ui?.timeZone;
|
||||
}
|
||||
|
||||
return "Local";
|
||||
}
|
||||
|
||||
// isRtl returns true if a right-to-left language is currently used.
|
||||
isRtl(locale) {
|
||||
if (!locale) {
|
||||
locale = this.getLanguageLocale();
|
||||
}
|
||||
|
||||
return Languages().some((l) => l.value === locale && l.rtl);
|
||||
return options.Languages().some((l) => l.value === locale && l.rtl);
|
||||
}
|
||||
|
||||
// dir returns the user interface direction (for the current locale if no argument is given).
|
||||
@@ -705,33 +776,24 @@ export default class Config {
|
||||
return;
|
||||
}
|
||||
|
||||
if (tokens.previewToken) {
|
||||
if (this.previewToken !== tokens.previewToken) {
|
||||
this.previewToken = tokens.previewToken;
|
||||
}
|
||||
|
||||
if (this.values.previewToken !== tokens.previewToken) {
|
||||
this.values.previewToken = tokens.previewToken;
|
||||
}
|
||||
if (tokens.previewToken && this.values?.previewToken !== tokens.previewToken) {
|
||||
this.values.previewToken = tokens.previewToken;
|
||||
}
|
||||
|
||||
if (tokens.downloadToken) {
|
||||
if (this.downloadToken !== tokens.downloadToken) {
|
||||
this.downloadToken = tokens.downloadToken;
|
||||
}
|
||||
|
||||
if ((this.values.downloadToken = tokens.downloadToken)) {
|
||||
this.values.downloadToken = tokens.downloadToken;
|
||||
}
|
||||
if (tokens.downloadToken && this.values?.downloadToken !== tokens.downloadToken) {
|
||||
this.values.downloadToken = tokens.downloadToken;
|
||||
}
|
||||
|
||||
this.updateTokens();
|
||||
}
|
||||
|
||||
// updateTokens updates the security tokens required to load thumbnails and download files from the server.
|
||||
updateTokens() {
|
||||
if (this.values["previewToken"]) {
|
||||
if (this.values?.previewToken && this.previewToken !== this.values.previewToken) {
|
||||
this.previewToken = this.values.previewToken;
|
||||
}
|
||||
if (this.values["downloadToken"]) {
|
||||
|
||||
if (this.values?.downloadToken && this.downloadToken !== this.values.downloadToken) {
|
||||
this.downloadToken = this.values.downloadToken;
|
||||
}
|
||||
}
|
||||
@@ -831,6 +893,10 @@ export default class Config {
|
||||
}
|
||||
|
||||
getIcon() {
|
||||
if (this.theme?.variables?.icon) {
|
||||
return this.theme.variables.icon;
|
||||
}
|
||||
|
||||
switch (this.get("appIcon")) {
|
||||
case "crisp":
|
||||
case "mint":
|
||||
@@ -841,6 +907,15 @@ export default class Config {
|
||||
}
|
||||
}
|
||||
|
||||
getLoginIcon() {
|
||||
const loginTheme = themes.Get("login");
|
||||
if (loginTheme?.variables?.icon) {
|
||||
return loginTheme?.variables?.icon;
|
||||
}
|
||||
|
||||
return this.getIcon();
|
||||
}
|
||||
|
||||
getVersion() {
|
||||
return this.version;
|
||||
}
|
||||
|
@@ -6,8 +6,8 @@ export class Lightbox {
|
||||
$event.publish("lightbox.open", options);
|
||||
}
|
||||
|
||||
openModels(models, index) {
|
||||
$event.publish("lightbox.open", { models, index });
|
||||
openModels(models, index, album) {
|
||||
$event.publish("lightbox.open", { models, index, album });
|
||||
}
|
||||
|
||||
openView(view, index) {
|
||||
|
23
frontend/src/common/map.js
Normal file
23
frontend/src/common/map.js
Normal file
@@ -0,0 +1,23 @@
|
||||
let loading = false;
|
||||
let maplibregl = null;
|
||||
|
||||
// Loads the maplibregl library.
|
||||
export async function load() {
|
||||
if (maplibregl !== null || loading) {
|
||||
return Promise.resolve(maplibregl);
|
||||
}
|
||||
|
||||
loading = true;
|
||||
|
||||
try {
|
||||
const module = await import("./maplibregl.js");
|
||||
maplibregl = module.default;
|
||||
loading = false;
|
||||
} catch (e) {
|
||||
loading = false;
|
||||
console.error("maps: failed to load maplibregl", e);
|
||||
return Promise.reject(e);
|
||||
}
|
||||
|
||||
return Promise.resolve(maplibregl);
|
||||
}
|
@@ -168,3 +168,5 @@ maplibregl.setRTLTextPlugin(
|
||||
`${$config.staticUri}/plugins/maplibre-gl-rtl-text/v0.2.3/maplibre-gl-rtl-text.js`,
|
||||
true // Lazy load the plugin
|
||||
);
|
||||
|
||||
export default maplibregl;
|
@@ -38,6 +38,7 @@ export const FormatWebmAv1 = "webm_av1";
|
||||
export const FormatMkvAv1 = "mkv_av1";
|
||||
export const FormatTheora = "ogg";
|
||||
export const FormatWebp = "webp";
|
||||
export const FormatM2TS = "m2t";
|
||||
|
||||
// Image file formats:
|
||||
export const FormatJpeg = "jpg";
|
||||
|
@@ -2,6 +2,7 @@ export const Auto = "";
|
||||
export const Default = "default";
|
||||
export const Manual = "manual";
|
||||
export const Estimate = "estimate";
|
||||
export const File = "file";
|
||||
export const Name = "name";
|
||||
export const Meta = "meta";
|
||||
export const Xmp = "xmp";
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user