Compare commits

...

179 Commits

Author SHA1 Message Date
93d2c935c7 Update Immich docs with storage architecture and B2 backup 2026-01-31 23:18:35 +01:00
eae97886d7 docs: add Immich Photo Library documentation 2026-01-31 02:54:23 +01:00
Lionel
0b8061460c Auto-sync Tue 13 Jan 16:05:02 CET 2026 2026-01-13 16:05:02 +01:00
Lionel
ee538cbc50 Auto-sync Tue 13 Jan 16:00:01 CET 2026 2026-01-13 16:00:01 +01:00
Lionel
008421a344 Auto-sync Mon 12 Jan 20:10:01 CET 2026 2026-01-12 20:10:01 +01:00
Lionel
4e8cae74ba Auto-sync Mon 12 Jan 20:05:01 CET 2026 2026-01-12 20:05:01 +01:00
Lionel
0ee9ecb8d4 Auto-sync Thu 8 Jan 21:30:01 CET 2026 2026-01-08 21:30:01 +01:00
Lionel
35349c3e51 Auto-sync Tue 6 Jan 02:10:01 CET 2026 2026-01-06 02:10:01 +01:00
Lionel
48d7aff548 Auto-sync Sat 3 Jan 02:25:01 CET 2026 2026-01-03 02:25:01 +01:00
Lionel
56b4726dd6 Auto-sync Fri 2 Jan 15:35:02 CET 2026 2026-01-02 15:35:02 +01:00
Lionel
09e8a2d0c5 Auto-sync Fri 2 Jan 13:35:01 CET 2026 2026-01-02 13:35:01 +01:00
Lionel
6a755ee4fb fix: exclude sync.log from git to stop restart loop 2026-01-02 12:34:35 +01:00
Lionel
5ae9c9f922 Auto-sync Fri 2 Jan 12:30:01 CET 2026 2026-01-02 12:30:01 +01:00
Lionel
588d31315d Auto-sync Fri 2 Jan 12:25:01 CET 2026 2026-01-02 12:25:01 +01:00
Lionel
7eeb3d8fe7 Auto-sync Fri 2 Jan 12:20:01 CET 2026 2026-01-02 12:20:01 +01:00
Lionel
fc76a00e80 Auto-sync Fri 2 Jan 12:15:01 CET 2026 2026-01-02 12:15:01 +01:00
Lionel
decba0d4d0 Auto-sync Fri 2 Jan 12:10:02 CET 2026 2026-01-02 12:10:02 +01:00
Lionel
825eab0926 Auto-sync Fri 2 Jan 12:05:01 CET 2026 2026-01-02 12:05:01 +01:00
Lionel
cb4a318b4b Auto-sync Fri 2 Jan 12:00:01 CET 2026 2026-01-02 12:00:01 +01:00
Lionel
dfc3b735b1 Auto-sync Fri 2 Jan 11:55:01 CET 2026 2026-01-02 11:55:01 +01:00
Lionel
811434c7fb Auto-sync Fri 2 Jan 11:50:01 CET 2026 2026-01-02 11:50:01 +01:00
Lionel
3b5590faa1 Auto-sync Fri 2 Jan 11:45:01 CET 2026 2026-01-02 11:45:01 +01:00
Lionel
030ee39261 Auto-sync Fri 2 Jan 11:40:01 CET 2026 2026-01-02 11:40:01 +01:00
Lionel
31889c41dc Auto-sync Fri 2 Jan 11:35:01 CET 2026 2026-01-02 11:35:01 +01:00
Lionel
393646f532 Auto-sync Fri 2 Jan 11:30:01 CET 2026 2026-01-02 11:30:01 +01:00
Lionel
4953ab88b7 Auto-sync Fri 2 Jan 11:25:01 CET 2026 2026-01-02 11:25:01 +01:00
Lionel
c7115b9b67 Auto-sync Fri 2 Jan 11:20:01 CET 2026 2026-01-02 11:20:01 +01:00
Lionel
e0b97cd02e Auto-sync Fri 2 Jan 11:15:01 CET 2026 2026-01-02 11:15:01 +01:00
Lionel
9b51d5bf1c Auto-sync Fri 2 Jan 11:10:01 CET 2026 2026-01-02 11:10:01 +01:00
Lionel
12fb1af988 Auto-sync Fri 2 Jan 11:05:01 CET 2026 2026-01-02 11:05:01 +01:00
Lionel
a16ca8ad63 Auto-sync Fri 2 Jan 11:00:01 CET 2026 2026-01-02 11:00:01 +01:00
Lionel
169f4d63fe Auto-sync Fri 2 Jan 10:55:01 CET 2026 2026-01-02 10:55:01 +01:00
Lionel
ccd4961db9 Auto-sync Fri 2 Jan 10:50:01 CET 2026 2026-01-02 10:50:01 +01:00
Lionel
f5a457c954 Auto-sync Fri 2 Jan 10:45:01 CET 2026 2026-01-02 10:45:01 +01:00
Lionel
7c68a8fcfa Auto-sync Fri 2 Jan 10:40:01 CET 2026 2026-01-02 10:40:01 +01:00
Lionel
8419a45929 Auto-sync Fri 2 Jan 10:35:01 CET 2026 2026-01-02 10:35:01 +01:00
Lionel
7b5f379008 Auto-sync Fri 2 Jan 10:30:01 CET 2026 2026-01-02 10:30:01 +01:00
Lionel
9e865f4d18 Auto-sync Fri 2 Jan 10:25:01 CET 2026 2026-01-02 10:25:01 +01:00
Lionel
a3547256f0 Auto-sync Fri 2 Jan 10:20:01 CET 2026 2026-01-02 10:20:01 +01:00
Lionel
931493744e Auto-sync Fri 2 Jan 10:15:01 CET 2026 2026-01-02 10:15:01 +01:00
Lionel
b9e99ff845 Auto-sync Fri 2 Jan 10:10:01 CET 2026 2026-01-02 10:10:01 +01:00
Lionel
f2ecb370b5 Auto-sync Fri 2 Jan 10:05:01 CET 2026 2026-01-02 10:05:01 +01:00
Lionel
dfb83c26f3 Auto-sync Fri 2 Jan 10:00:01 CET 2026 2026-01-02 10:00:01 +01:00
Lionel
c1b7dca205 Auto-sync Fri 2 Jan 09:55:01 CET 2026 2026-01-02 09:55:01 +01:00
Lionel
a7dd55132c Auto-sync Fri 2 Jan 09:50:01 CET 2026 2026-01-02 09:50:01 +01:00
Lionel
654d4cbdd0 Auto-sync Fri 2 Jan 09:45:01 CET 2026 2026-01-02 09:45:01 +01:00
Lionel
13792dfbd1 Auto-sync Fri 2 Jan 09:40:01 CET 2026 2026-01-02 09:40:01 +01:00
Lionel
cf7e246911 Auto-sync Fri 2 Jan 09:35:01 CET 2026 2026-01-02 09:35:01 +01:00
Lionel
7bb7509f18 Auto-sync Fri 2 Jan 09:30:01 CET 2026 2026-01-02 09:30:01 +01:00
Lionel
bcfdbea3a9 Auto-sync Fri 2 Jan 09:25:01 CET 2026 2026-01-02 09:25:01 +01:00
Lionel
7a1d7adc70 Auto-sync Fri 2 Jan 09:20:01 CET 2026 2026-01-02 09:20:01 +01:00
Lionel
ca7d193414 Auto-sync Fri 2 Jan 09:15:01 CET 2026 2026-01-02 09:15:01 +01:00
Lionel
dff60a92e0 Auto-sync Fri 2 Jan 09:10:01 CET 2026 2026-01-02 09:10:01 +01:00
Lionel
b4dad6e2b5 Auto-sync Fri 2 Jan 09:05:01 CET 2026 2026-01-02 09:05:01 +01:00
Lionel
9b2dde78d2 Auto-sync Fri 2 Jan 09:00:01 CET 2026 2026-01-02 09:00:01 +01:00
Lionel
1b327fcf2b Auto-sync Fri 2 Jan 08:55:01 CET 2026 2026-01-02 08:55:01 +01:00
Lionel
a5bdd3ac26 Auto-sync Fri 2 Jan 08:50:02 CET 2026 2026-01-02 08:50:02 +01:00
Lionel
0d89133e97 Auto-sync Fri 2 Jan 08:45:01 CET 2026 2026-01-02 08:45:01 +01:00
Lionel
1831058fbd Auto-sync Fri 2 Jan 08:40:01 CET 2026 2026-01-02 08:40:01 +01:00
Lionel
9196ad1c34 Auto-sync Fri 2 Jan 08:35:01 CET 2026 2026-01-02 08:35:01 +01:00
Lionel
67101db6bf Auto-sync Fri 2 Jan 08:30:01 CET 2026 2026-01-02 08:30:01 +01:00
Lionel
38cfebdc48 Auto-sync Fri 2 Jan 08:25:01 CET 2026 2026-01-02 08:25:01 +01:00
Lionel
859abe704e Auto-sync Fri 2 Jan 08:20:01 CET 2026 2026-01-02 08:20:01 +01:00
Lionel
972ea9ade5 Auto-sync Fri 2 Jan 08:15:01 CET 2026 2026-01-02 08:15:01 +01:00
Lionel
671bea2a50 Auto-sync Fri 2 Jan 08:10:01 CET 2026 2026-01-02 08:10:01 +01:00
Lionel
6926bfd79c Auto-sync Fri 2 Jan 08:05:01 CET 2026 2026-01-02 08:05:01 +01:00
Lionel
d54555fc65 Auto-sync Fri 2 Jan 08:00:01 CET 2026 2026-01-02 08:00:01 +01:00
Lionel
84185cc712 Auto-sync Fri 2 Jan 07:55:01 CET 2026 2026-01-02 07:55:01 +01:00
Lionel
ebed10c53f Auto-sync Fri 2 Jan 07:50:01 CET 2026 2026-01-02 07:50:01 +01:00
Lionel
44ab90f6d1 Auto-sync Fri 2 Jan 07:45:01 CET 2026 2026-01-02 07:45:01 +01:00
Lionel
ea13c046f1 Auto-sync Fri 2 Jan 07:40:01 CET 2026 2026-01-02 07:40:01 +01:00
Lionel
a20ea3b40c Auto-sync Fri 2 Jan 07:35:01 CET 2026 2026-01-02 07:35:01 +01:00
Lionel
24a36f92b9 Auto-sync Fri 2 Jan 07:30:01 CET 2026 2026-01-02 07:30:01 +01:00
Lionel
f8ca87e34e Auto-sync Fri 2 Jan 07:25:01 CET 2026 2026-01-02 07:25:01 +01:00
Lionel
b910072e02 Auto-sync Fri 2 Jan 07:20:02 CET 2026 2026-01-02 07:20:02 +01:00
Lionel
f391013031 Auto-sync Fri 2 Jan 07:15:01 CET 2026 2026-01-02 07:15:01 +01:00
Lionel
aada745ca9 Auto-sync Fri 2 Jan 07:10:01 CET 2026 2026-01-02 07:10:01 +01:00
Lionel
86a987e37e Auto-sync Fri 2 Jan 07:05:01 CET 2026 2026-01-02 07:05:01 +01:00
Lionel
b690fff900 Auto-sync Fri 2 Jan 07:00:01 CET 2026 2026-01-02 07:00:01 +01:00
Lionel
62f9b6b775 Auto-sync Fri 2 Jan 06:55:01 CET 2026 2026-01-02 06:55:01 +01:00
Lionel
cf8aacb71d Auto-sync Fri 2 Jan 06:50:02 CET 2026 2026-01-02 06:50:02 +01:00
Lionel
6184b34bd7 Auto-sync Fri 2 Jan 06:45:01 CET 2026 2026-01-02 06:45:01 +01:00
Lionel
1dc5c76559 Auto-sync Fri 2 Jan 06:40:01 CET 2026 2026-01-02 06:40:01 +01:00
Lionel
cce18ad0bf Auto-sync Fri 2 Jan 06:35:01 CET 2026 2026-01-02 06:35:01 +01:00
Lionel
931d636064 Auto-sync Fri 2 Jan 06:30:01 CET 2026 2026-01-02 06:30:01 +01:00
Lionel
84dac6625a Auto-sync Fri 2 Jan 06:25:01 CET 2026 2026-01-02 06:25:01 +01:00
Lionel
70831a35e4 Auto-sync Fri 2 Jan 06:20:01 CET 2026 2026-01-02 06:20:01 +01:00
Lionel
0e264f948b Auto-sync Fri 2 Jan 06:15:01 CET 2026 2026-01-02 06:15:01 +01:00
Lionel
b5e9293677 Auto-sync Fri 2 Jan 06:10:01 CET 2026 2026-01-02 06:10:01 +01:00
Lionel
10545b8239 Auto-sync Fri 2 Jan 06:05:01 CET 2026 2026-01-02 06:05:01 +01:00
Lionel
a4fcb5b255 Auto-sync Fri 2 Jan 06:00:01 CET 2026 2026-01-02 06:00:01 +01:00
Lionel
1a8fe0a0b9 Auto-sync Fri 2 Jan 05:55:01 CET 2026 2026-01-02 05:55:01 +01:00
Lionel
a8e2559439 Auto-sync Fri 2 Jan 05:50:01 CET 2026 2026-01-02 05:50:01 +01:00
Lionel
dffc7dcba9 Auto-sync Fri 2 Jan 05:45:01 CET 2026 2026-01-02 05:45:01 +01:00
Lionel
45216d67c4 Auto-sync Fri 2 Jan 05:40:01 CET 2026 2026-01-02 05:40:01 +01:00
Lionel
786a5af9ac Auto-sync Fri 2 Jan 05:35:01 CET 2026 2026-01-02 05:35:01 +01:00
Lionel
6c49dcd17d Auto-sync Fri 2 Jan 05:30:01 CET 2026 2026-01-02 05:30:01 +01:00
Lionel
294e0c8336 Auto-sync Fri 2 Jan 05:25:01 CET 2026 2026-01-02 05:25:01 +01:00
Lionel
24af169523 Auto-sync Fri 2 Jan 05:20:01 CET 2026 2026-01-02 05:20:01 +01:00
Lionel
69fe3fcfb7 Auto-sync Fri 2 Jan 05:15:01 CET 2026 2026-01-02 05:15:01 +01:00
Lionel
2b5b7f9e35 Auto-sync Fri 2 Jan 05:10:01 CET 2026 2026-01-02 05:10:01 +01:00
Lionel
05844bd049 Auto-sync Fri 2 Jan 05:05:01 CET 2026 2026-01-02 05:05:01 +01:00
Lionel
3608964801 Auto-sync Fri 2 Jan 05:00:01 CET 2026 2026-01-02 05:00:01 +01:00
Lionel
f27994b6bf Auto-sync Fri 2 Jan 04:55:01 CET 2026 2026-01-02 04:55:01 +01:00
Lionel
331a04e5ba Auto-sync Fri 2 Jan 04:50:01 CET 2026 2026-01-02 04:50:01 +01:00
Lionel
08145c88e5 Auto-sync Fri 2 Jan 04:45:01 CET 2026 2026-01-02 04:45:01 +01:00
Lionel
2d5c4de975 Auto-sync Fri 2 Jan 04:40:01 CET 2026 2026-01-02 04:40:01 +01:00
Lionel
6f901ceb44 Auto-sync Fri 2 Jan 04:35:01 CET 2026 2026-01-02 04:35:01 +01:00
Lionel
b153fc4858 Auto-sync Fri 2 Jan 04:30:01 CET 2026 2026-01-02 04:30:01 +01:00
Lionel
f7f4f66646 Auto-sync Fri 2 Jan 04:25:01 CET 2026 2026-01-02 04:25:01 +01:00
Lionel
d932ffef97 Auto-sync Fri 2 Jan 04:20:01 CET 2026 2026-01-02 04:20:01 +01:00
Lionel
79d3f58666 Auto-sync Fri 2 Jan 04:15:01 CET 2026 2026-01-02 04:15:01 +01:00
Lionel
89788fafa0 Auto-sync Fri 2 Jan 04:10:01 CET 2026 2026-01-02 04:10:01 +01:00
Lionel
0c73b0a432 Auto-sync Fri 2 Jan 04:05:01 CET 2026 2026-01-02 04:05:01 +01:00
Lionel
4f72234ef8 Auto-sync Fri 2 Jan 04:00:02 CET 2026 2026-01-02 04:00:02 +01:00
Lionel
7cc120a10e Auto-sync Fri 2 Jan 03:55:01 CET 2026 2026-01-02 03:55:01 +01:00
Lionel
4676837b33 Auto-sync Fri 2 Jan 03:50:01 CET 2026 2026-01-02 03:50:01 +01:00
Lionel
be311b54e1 Auto-sync Fri 2 Jan 03:45:01 CET 2026 2026-01-02 03:45:01 +01:00
Lionel
c40d617213 Auto-sync Fri 2 Jan 03:40:01 CET 2026 2026-01-02 03:40:01 +01:00
Lionel
42fbda879e Auto-sync Fri 2 Jan 03:35:01 CET 2026 2026-01-02 03:35:01 +01:00
Lionel
c0de15ca0e Auto-sync Fri 2 Jan 03:30:01 CET 2026 2026-01-02 03:30:01 +01:00
Lionel
186898f102 Auto-sync Fri 2 Jan 03:25:01 CET 2026 2026-01-02 03:25:01 +01:00
Lionel
0162453fba Auto-sync Fri 2 Jan 03:20:01 CET 2026 2026-01-02 03:20:01 +01:00
Lionel
89e4cc8fb5 Auto-sync Fri 2 Jan 03:15:01 CET 2026 2026-01-02 03:15:01 +01:00
Lionel
5d7943b8ad Auto-sync Fri 2 Jan 03:10:01 CET 2026 2026-01-02 03:10:01 +01:00
Lionel
41c12e10f9 Auto-sync Fri 2 Jan 03:05:02 CET 2026 2026-01-02 03:05:02 +01:00
Lionel
cd8567d58a Auto-sync Fri 2 Jan 03:00:02 CET 2026 2026-01-02 03:00:02 +01:00
Lionel
48dbbd052a Auto-sync Fri 2 Jan 02:55:01 CET 2026 2026-01-02 02:55:01 +01:00
Lionel
ef655580c1 Auto-sync Fri 2 Jan 02:50:01 CET 2026 2026-01-02 02:50:01 +01:00
Lionel
e81c2b3af3 Auto-sync Fri 2 Jan 02:45:01 CET 2026 2026-01-02 02:45:01 +01:00
Lionel
0aba94f674 Auto-sync Fri 2 Jan 02:40:01 CET 2026 2026-01-02 02:40:01 +01:00
Lionel
36fe2a05f0 Auto-sync Fri 2 Jan 02:35:01 CET 2026 2026-01-02 02:35:01 +01:00
Lionel
7a2a07475b Auto-sync Fri 2 Jan 02:30:01 CET 2026 2026-01-02 02:30:01 +01:00
Lionel
44dcebd2d3 Auto-sync Fri 2 Jan 02:25:01 CET 2026 2026-01-02 02:25:01 +01:00
Lionel
1104eb99a0 Auto-sync Fri 2 Jan 02:20:01 CET 2026 2026-01-02 02:20:01 +01:00
Lionel
07fefb073a Auto-sync Fri 2 Jan 02:15:01 CET 2026 2026-01-02 02:15:01 +01:00
Lionel
e47d3f9cc6 Auto-sync Fri 2 Jan 02:10:01 CET 2026 2026-01-02 02:10:01 +01:00
Lionel
a98c44e3c4 Auto-sync Fri 2 Jan 02:05:01 CET 2026 2026-01-02 02:05:01 +01:00
Lionel
87c153f623 Auto-sync Fri 2 Jan 02:00:01 CET 2026 2026-01-02 02:00:01 +01:00
Lionel
a13125bb16 Auto-sync Fri 2 Jan 01:55:01 CET 2026 2026-01-02 01:55:01 +01:00
Lionel
7cdf3d62cf Auto-sync Fri 2 Jan 01:50:01 CET 2026 2026-01-02 01:50:01 +01:00
Lionel
00464076ef Auto-sync Fri 2 Jan 01:45:01 CET 2026 2026-01-02 01:45:01 +01:00
Lionel
47c6081be8 Auto-sync Fri 2 Jan 01:40:01 CET 2026 2026-01-02 01:40:01 +01:00
Lionel
96a42d7d9c Auto-sync Fri 2 Jan 01:35:01 CET 2026 2026-01-02 01:35:01 +01:00
Lionel
dbc3f8f9fd Auto-sync Fri 2 Jan 01:30:01 CET 2026 2026-01-02 01:30:01 +01:00
Lionel
f4f5d93cc0 Auto-sync Fri 2 Jan 01:25:01 CET 2026 2026-01-02 01:25:01 +01:00
Lionel
322c0bd668 feat: Add DNS redundancy - Annecy as secondary DNS
- dnsmasq on Annecy (Synology) as DNS slave
- network_mode: host + bind-interfaces for Synology OVS
- Document architecture in network.md
- Config files in configs/annecy-dns/
2026-01-02 01:20:48 +01:00
Lionel
627a4c9d4e Auto-sync Fri 2 Jan 01:20:01 CET 2026 2026-01-02 01:20:01 +01:00
Lionel
12b3048a88 Auto-sync Fri 2 Jan 01:15:01 CET 2026 2026-01-02 01:15:01 +01:00
Lionel
2062bff480 Auto-sync Fri 2 Jan 01:10:01 CET 2026 2026-01-02 01:10:01 +01:00
Lionel
8df0d1532b Auto-sync Fri 2 Jan 01:05:01 CET 2026 2026-01-02 01:05:01 +01:00
Lionel
759c635472 Auto-sync Fri 2 Jan 01:00:01 CET 2026 2026-01-02 01:00:01 +01:00
Lionel
e9c0a4073c Auto-sync Fri 2 Jan 00:55:01 CET 2026 2026-01-02 00:55:01 +01:00
Lionel
983b5add62 Auto-sync Fri 2 Jan 00:50:01 CET 2026 2026-01-02 00:50:01 +01:00
Lionel
8555aa460f Auto-sync Fri 2 Jan 00:45:01 CET 2026 2026-01-02 00:45:01 +01:00
Lionel
f7e7d19ab2 Auto-sync Fri 2 Jan 00:40:01 CET 2026 2026-01-02 00:40:01 +01:00
Lionel
9046dbf6ae docs: Add SSD NVMe migration documentation
- Document migration from SD card to NVMe SSD (512GB)
- Include benchmark results (1108x improvement on 4K random writes)
- Add fallback configuration with SD card as backup
- Update mkdocs navigation

Migration completed: 2026-01-01
2026-01-01 16:41:19 +01:00
Lionel
cf5669b1fa Documentation complète: infrastructure, réseau, issues, recommandations 2025-12-31 20:38:04 +01:00
Lionel
891d5f1a7d Auto-sync Wed 31 Dec 20:35:01 CET 2025 2025-12-31 20:35:01 +01:00
Lionel
d48ff47807 Auto-sync Wed 31 Dec 20:30:01 CET 2025 2025-12-31 20:30:01 +01:00
Lionel
00335c19fb Auto-sync Wed 31 Dec 20:25:01 CET 2025 2025-12-31 20:25:01 +01:00
Lionel
6515a3cafe Auto-sync Wed 31 Dec 20:20:01 CET 2025 2025-12-31 20:20:01 +01:00
Lionel
1eb661db20 Auto-sync Wed 31 Dec 20:15:01 CET 2025 2025-12-31 20:15:01 +01:00
Lionel
2b88fdaa9b Auto-sync Wed 31 Dec 20:10:01 CET 2025 2025-12-31 20:10:01 +01:00
Lionel
0d595a331e Auto-sync Wed 31 Dec 20:05:01 CET 2025 2025-12-31 20:05:01 +01:00
Lionel
5127eba291 Auto-sync Wed 31 Dec 20:00:01 CET 2025 2025-12-31 20:00:01 +01:00
Lionel
80f74198c2 Auto-sync Wed 31 Dec 19:55:01 CET 2025 2025-12-31 19:55:01 +01:00
Lionel
e4008c0a3e Auto-sync Wed 31 Dec 19:50:01 CET 2025 2025-12-31 19:50:01 +01:00
Lionel
44c4216249 Auto-sync Wed 31 Dec 19:45:01 CET 2025 2025-12-31 19:45:01 +01:00
Lionel
026adb65d9 Auto-sync Wed 31 Dec 19:40:01 CET 2025 2025-12-31 19:40:01 +01:00
Lionel
aaad3ab7c8 Auto-sync Wed 31 Dec 19:35:01 CET 2025 2025-12-31 19:35:01 +01:00
Lionel
5d0152101e Auto-sync Wed 31 Dec 19:30:01 CET 2025 2025-12-31 19:30:01 +01:00
Lionel
f208bb58a5 Auto-sync Wed 31 Dec 19:25:01 CET 2025 2025-12-31 19:25:01 +01:00
Lionel
5d370fbb4d Auto-sync Wed 31 Dec 19:20:01 CET 2025 2025-12-31 19:20:01 +01:00
Lionel
7e5d75f411 Auto-sync Wed 31 Dec 19:15:01 CET 2025 2025-12-31 19:15:01 +01:00
Lionel
4023f48a2a Auto-sync Wed 31 Dec 19:10:01 CET 2025 2025-12-31 19:10:01 +01:00
Lionel
8107224f77 Auto-sync Wed 31 Dec 19:05:01 CET 2025 2025-12-31 19:05:01 +01:00
Lionel
4bb7349e5d Auto-sync Wed 31 Dec 19:00:01 CET 2025 2025-12-31 19:00:01 +01:00
Lionel
d700aff572 Auto-sync Wed 31 Dec 18:55:01 CET 2025 2025-12-31 18:55:01 +01:00
101 changed files with 56955 additions and 818 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
sync.log

View File

@@ -0,0 +1,34 @@
# DNSMASQ SECONDAIRE - ANNECY
# Slave de Talloires pour redondance DNS
# === Machines Tailscale ===
address=/talloires/100.116.198.105
address=/annecy/100.69.227.96
address=/olympou/100.125.242.58
address=/pentamodi/100.78.237.78
address=/perce/100.69.7.78
# === Machines LAN ===
address=/talloires.lan/10.171.171.7
address=/annecy.lan/10.171.171.50
address=/theseus.lan/10.171.171.1
# === Wildcard services Talloires ===
address=/.talloires.local/100.116.198.105
# === Go-links ===
address=/go/100.116.198.105
# === Bind explicite sur IP LAN (requis pour Synology OVS) ===
listen-address=10.171.171.50,10.171.171.51,127.0.0.1
bind-interfaces
port=53
# === Upstream DNS ===
server=10.171.171.7#53
server=1.1.1.1
server=8.8.8.8
cache-size=1000
log-queries
log-facility=-

View File

@@ -0,0 +1,14 @@
# DNS Secondaire pour Annecy (Synology)
# Déployer: sudo docker compose up -d
services:
dnsmasq:
image: andyshinn/dnsmasq:latest
container_name: dnsmasq
restart: unless-stopped
network_mode: host
cap_add:
- NET_ADMIN
volumes:
- ./dnsmasq.conf:/etc/dnsmasq.conf:ro
command: ["--log-facility=-", "--log-queries"]

16
docker-compose.yml Normal file
View File

@@ -0,0 +1,16 @@
networks:
lake_net:
external: true
services:
mkdocs:
image: squidfunk/mkdocs-material:latest
container_name: mkdocs
restart: unless-stopped
networks:
- lake_net
volumes:
- .:/docs
command: serve --dev-addr=0.0.0.0:8000
environment:
- TZ=Europe/Luxembourg

23
docs/404.md Normal file
View File

@@ -0,0 +1,23 @@
# 🔍 Page introuvable
La page que vous cherchez n'existe pas ou a été déplacée.
## Go Links - Accès rapides
| Go Link | Service | Description |
|---------|---------|-------------|
| [go/jellyfin](https://go.talloires.local/jellyfin){:target="_blank"} | Jellyfin | Media streaming |
| [go/git](https://go.talloires.local/git){:target="_blank"} | Gitea | Git repositories |
| [go/ha](https://go.talloires.local/ha){:target="_blank"} | Home Assistant | Domotique |
| [go/torrent](https://go.talloires.local/torrent){:target="_blank"} | Transmission | BitTorrent |
| [go/docs](https://go.talloires.local/docs){:target="_blank"} | MkDocs | Documentation |
| [go/docker](https://go.talloires.local/docker){:target="_blank"} | Arcane | Docker management |
| [go/logs](https://go.talloires.local/logs){:target="_blank"} | Dozzle | Container logs |
| [go/shlink](https://go.talloires.local/shlink){:target="_blank"} | Shlink | URL shortener admin |
| [go/netdata](https://go.talloires.local/netdata){:target="_blank"} | Netdata | System monitoring |
## Navigation
- [🏠 Accueil](index.md)
- [📊 Services](services/overview.md)
- [🔧 Infrastructure](infra/overview.md)

View File

@@ -0,0 +1,40 @@
# 2026-01-03 - Sécurisation Transmission
## Résumé
Transmission est maintenant accessible uniquement via Tailscale avec authentification Authelia.
## Changements
### Sécurité Transmission
- **Accès LAN bloqué** : `transmission.talloires.local` retourne 403
- **Accès Tailscale uniquement** : `transmission.talloires.tailfd281f.ts.net`
- **Go-links mis à jour** : `go/torrent`, `go/trn`, `go/transmission` redirigent vers le FQDN Tailscale
- **Auth native désactivée** : Authelia gère l'authentification
### Infrastructure
- **Caddy** : Ajout du socket Tailscale pour certificats `.ts.net`
- **WireGuard** : Kill switch inclut `172.19.0.0/16` (lake_net)
## Fichiers modifiés
| Fichier | Changement |
|---------|------------|
| `/mnt/mediaserver/caddy/Caddyfile` | Séparation .local (403) / .ts.net (Authelia) |
| `~/lake/infra/docker-compose.yml` | Mount tailscaled.sock dans Caddy |
| `~/lake/p2p/docker-compose.yml` | Suppression USER/PASS env vars |
| `~/lake/p2p/transmission/settings.json` | `rpc-authentication-required: false` |
## Shlink go-links
```
go/torrent → https://transmission.talloires.tailfd281f.ts.net
go/trn → https://transmission.talloires.tailfd281f.ts.net
go/transmission → https://transmission.talloires.tailfd281f.ts.net
```
## Documentation
- Nouvelle page : [Services > Transmission](../services/transmission.md)

View File

@@ -0,0 +1,96 @@
# Changelog 2026-01-12
## Servarr Stack — Migration VPN Complète
### Contexte
La stack Servarr avait initialement Transmission derrière le VPN (gluetun), mais Prowlarr, Sonarr et Radarr étaient exposés directement sur le réseau Docker, sans protection VPN.
### Changements
#### Architecture réseau
| Service | Avant | Après |
|---------|-------|-------|
| Transmission | ✅ Via VPN | ✅ Via VPN |
| Prowlarr | ❌ Direct | ✅ Via VPN |
| Sonarr | ❌ Direct | ✅ Via VPN |
| Radarr | ❌ Direct | ✅ Via VPN |
#### Configuration Docker
Tous les services utilisent maintenant `network_mode: "service:gluetun"` :
```yaml
services:
gluetun:
ports:
- "9091:9091" # Transmission
- "9696:9696" # Prowlarr
- "7878:7878" # Radarr
- "8989:8989" # Sonarr
environment:
- FIREWALL_OUTBOUND_SUBNETS=192.168.0.0/16,100.64.0.0/10
prowlarr:
network_mode: "service:gluetun"
depends_on:
gluetun:
condition: service_healthy
sonarr:
network_mode: "service:gluetun"
# ...
radarr:
network_mode: "service:gluetun"
# ...
```
#### Configuration des apps
Les connexions internes ont été mises à jour dans les bases SQLite :
| App | Setting | Ancienne valeur | Nouvelle valeur |
|-----|---------|-----------------|-----------------|
| Prowlarr | Download Client | `gluetun:9091` | `localhost:9091` |
| Prowlarr | Sonarr App | `http://sonarr:8989` | `http://localhost:8989` |
| Prowlarr | Radarr App | `http://radarr:7878` | `http://localhost:7878` |
| Sonarr | Download Client | `gluetun:9091` | `localhost:9091` |
| Radarr | Download Client | `gluetun:9091` | `localhost:9091` |
### Avantages
1. **Kill switch intégré** : Si gluetun tombe, aucun service n'a accès Internet
2. **IP unique** : Tous les services apparaissent avec la même IP ProtonVPN
3. **Sécurité renforcée** : Les indexeurs et API sont protégés par le VPN
4. **Cohérence** : Architecture uniforme pour toute la stack
### Vérification
```bash
# Vérifier l'IP VPN
docker exec gluetun wget -qO- https://ipinfo.io/ip
# Résultat: 5.253.204.x (ProtonVPN Luxembourg)
# Tester la connectivité interne
docker exec gluetun sh -c 'wget -qO- http://localhost:9696/ping'
# Résultat: {"status":"OK"}
```
### Fichiers modifiés
- `~/lake/servarr/docker-compose.yml` — nouvelle architecture
- `~/lake/servarr/prowlarr/prowlarr.db` — connexions internes
- `~/lake/servarr/sonarr/sonarr.db` — connexions internes
- `~/lake/servarr/radarr/radarr.db` — connexions internes
### Backup
Ancien compose sauvegardé : `~/lake/servarr/docker-compose.yml.bak`
### Notes
- Caddy continue de proxyfier via `gluetun:PORT`
- Le Caddyfile existant était déjà correct, seul un `caddy reload` était nécessaire
- Le cache DNS de Caddy peut nécessiter un restart complet du container après modifications

View File

@@ -1,152 +1,130 @@
# 🏔️ Talloires v2.0 Documentation
# Talloires Infrastructure v2
Bienvenue dans la documentation de l'infrastructure Talloires v2.0 - Migration complétée le 30 décembre 2025.
Documentation complète de l'infrastructure Talloires hébergée sur Raspberry Pi 5.
---
## Quick Links
## 🚀 Quick Links (Go-Links)
### Core Infrastructure
Accès rapide aux services via les go-links:
| Service | URL | Go Link | Description |
|---------|-----|---------|-------------|
| Authelia | [auth.talloires.local](https://auth.talloires.local){:target="_blank"} | [go/auth](https://go.talloires.local/auth){:target="_blank"} | SSO / Authentication |
| MkDocs | [docs.talloires.local](https://docs.talloires.local){:target="_blank"} | [go/docs](https://go.talloires.local/docs){:target="_blank"} | Documentation |
| Go-Link | Service | Description |
|---------|---------|-------------|
| [**go**](https://go){:target="_blank"} | Shlink Web | Gestion des liens courts |
| [**go/jf**](https://go/jf){:target="_blank"} | Jellyfin | Serveur média (films, séries) |
| [**go/trn**](https://go/trn){:target="_blank"} | Transmission | Client BitTorrent (VPN) |
| [**go/git**](https://go/git){:target="_blank"} | Gitea | Hébergement Git |
| [**go/docs**](https://go/docs){:target="_blank"} | MkDocs | Cette documentation |
| [**go/ha**](https://go/ha){:target="_blank"} | Home Assistant | Domotique |
| [**go/net**](https://go/net){:target="_blank"} | Netdata | Monitoring système |
| [**go/sig**](https://go/sig){:target="_blank"} | Signal API | Notifications |
| [**go/arcane**](https://go/arcane){:target="_blank"} | 🆕 Arcane | Docker Management UI |
| [**go/logs**](https://go/logs){:target="_blank"} | 🆕 Dozzle | Docker Logs Viewer |
### Media & Downloads
---
| Service | URL | Go Link | Description |
|---------|-----|---------|-------------|
| Jellyfin | [jellyfin.talloires.local](https://jellyfin.talloires.local){:target="_blank"} | [go/jellyfin](https://go.talloires.local/jellyfin){:target="_blank"} | Media streaming |
| Transmission | [transmission.talloires.tailfd281f.ts.net](https://transmission.talloires.tailfd281f.ts.net){:target="_blank"} | [go/torrent](https://go.talloires.local/torrent){:target="_blank"} | BitTorrent via VPN (Tailscale only) |
## 📊 Architecture v2.0
### Tools & Productivity
### Infrastructure
- **Serveur**: Raspberry Pi 5 (8GB) - Talloires
- **Stockage**: Synology DS620slim - Annecy (NFS)
- **VPN**: Tailscale (WireGuard)
- **Réseau**: UniFi Dream Router 7 (Theseus)
| Service | URL | Go Link | Description |
|---------|-----|---------|-------------|
| Gitea | [git.talloires.local](https://git.talloires.local){:target="_blank"} | [go/git](https://go.talloires.local/git){:target="_blank"} | Git repositories |
| MicroBin | [paste.talloires.local](https://paste.talloires.local){:target="_blank"} | [go/paste](https://go.talloires.local/paste){:target="_blank"} | Simple pastebin |
| PrivateBin | [spaste.talloires.local](https://spaste.talloires.local){:target="_blank"} | [go/spaste](https://go.talloires.local/spaste){:target="_blank"} | E2E encrypted pastebin |
| Shlink | [go.talloires.local](https://go.talloires.local){:target="_blank"} | [go/shlink](https://go.talloires.local/shlink){:target="_blank"} | URL shortener |
### Stack Logicielle
- **Containerisation**: Docker + Docker Compose
- **Reverse Proxy**: Caddy (HTTPS local)
- **DNS Local**: dnsmasq
- **VPN Tunnel**: ProtonVPN (WireGuard)
- **Management**: Arcane (Web UI) + Lazydocker (TUI)
### RSS Readers
---
| Service | URL | Go Link | Description |
|---------|-----|---------|-------------|
| Miniflux | [rss.talloires.local](https://rss.talloires.local){:target="_blank"} | [go/rss](https://go.talloires.local/rss){:target="_blank"} | Minimal RSS reader |
| FreshRSS | [freshrss.talloires.local](https://freshrss.talloires.local){:target="_blank"} | [go/freshrss](https://go.talloires.local/freshrss){:target="_blank"} | Full-featured RSS reader |
## 🗂️ Sections
### Automation
### [Services](services/overview.md)
Documentation détaillée de chaque service déployé.
### [Infrastructure](infra/overview.md)
Configuration réseau, VPN, DNS, backups.
### [Vault v1.0](vault/index-v1.md)
Archive de la documentation v1.0 (référence historique).
---
## 📈 Migration v1.0 → v2.0
**Date**: 30 décembre 2025
**Durée**: ~3h30
**Downtime**: ~30 minutes
**Services migrés**: 10/10 (100%)
**Réduction infrastructure**: 60% (de 25 à 10 services)
### Services Déployés (v2.0)
✅ [**Jellyfin**](https://go/jf){:target="_blank"} - Serveur média (2.3 GB restauré)
✅ [**Transmission + WireGuard**](https://go/trn){:target="_blank"} - BitTorrent avec VPN kill-switch
✅ [**Gitea**](https://go/git){:target="_blank"} - Hébergement Git (repos restaurés)
✅ [**Home Assistant**](https://go/ha){:target="_blank"} - Domotique (nouvelle installation)
✅ [**MkDocs**](https://go/docs){:target="_blank"} - Documentation (cette page!)
✅ [**Netdata**](https://go/net){:target="_blank"} - Monitoring système
✅ [**Signal API**](https://go/sig){:target="_blank"} - Notifications
✅ [**Shlink**](https://go){:target="_blank"} - URL shortener
✅ [**Caddy**] - Reverse proxy HTTPS
### 🆕 Services Ajoutés (31 décembre 2025)
✅ [**Arcane**](https://go/arcane){:target="_blank"} - Docker Management UI (BSD-3-Clause)
✅ [**Dozzle**](https://go/logs){:target="_blank"} - Real-time Docker Logs Viewer (MIT)
**Lazydocker** - Terminal UI pour Docker (MIT) - Installé sur Talloires & Annecy
### Services Retirés
**Authelia** - Remplacé par auth native de chaque service
**Portainer** - Remplacé par Arcane (open source BSD-3)
**Crowdsec** - Simplification sécurité
**Dockge** - Remplacé par Arcane + Lazydocker
**15+ autres services** - Nettoyage architecture
---
## 🔐 Sécurité
- ✅ VPN WireGuard actif (ProtonVPN Luxembourg)
- ✅ Kill-switch Transmission (network_mode)
- ✅ Accès Tailscale uniquement (pas d'exposition Internet)
- ✅ Firewall UFW actif
- ✅ Certificats HTTPS locaux (Caddy)
- ✅ Backup automatique vers Annecy (NFS)
---
## 🛠️ Maintenance
### Docker Management
**Web UI** - [Arcane](https://go/arcane){:target="_blank"}
- Gestion containers, images, volumes, networks
- Interface moderne SvelteKit
- Templates Docker Compose
- Monitoring en temps réel
**Logs** - [Dozzle](https://go/logs){:target="_blank"}
- Logs en temps réel multi-containers
- Search & filter
- Ultra-léger
**Terminal UI** - Lazydocker
```bash
# Sur Talloires
ssh lionel@talloires.local
lazydocker
# Sur Annecy (Synology)
ssh lionel@100.69.227.96
~/.local/bin/lazydocker
```
### Backups
- **Location**: `/mnt/annecy/talloires/`
- **Fréquence**: Quotidien (automatique)
- **Rétention**: 30 jours
- **Services backupés**: Jellyfin, Gitea, MkDocs, Configurations
| Service | URL | Go Link | Description |
|---------|-----|---------|-------------|
| Home Assistant | [homeassistant.talloires.local](https://homeassistant.talloires.local){:target="_blank"} | [go/ha](https://go.talloires.local/ha){:target="_blank"} | Home automation |
| ESPHome | [esphome.talloires.local](https://esphome.talloires.local){:target="_blank"} | — | ESP device management |
### Monitoring
- **Netdata**: [go/net](https://go/net){:target="_blank"}
- **Arcane**: [go/arcane](https://go/arcane){:target="_blank"}
- **Dozzle**: [go/logs](https://go/logs){:target="_blank"}
- **Logs Docker**: `docker logs <container>`
- **Health checks**: Docker healthchecks
---
| Service | URL | Go Link | Description |
|---------|-----|---------|-------------|
| Arcane | [arcane.talloires.local](https://arcane.talloires.local){:target="_blank"} | [go/docker](https://go.talloires.local/docker){:target="_blank"} | Docker management |
| Dozzle | [dozzle.talloires.local](https://dozzle.talloires.local){:target="_blank"} | [go/logs](https://go.talloires.local/logs){:target="_blank"} | Container logs |
| Netdata | [netdata.talloires.local](https://netdata.talloires.local){:target="_blank"} | [go/netdata](https://go.talloires.local/netdata){:target="_blank"} | System monitoring |
## 📞 Contact
## Architecture
**Administrateur**: Lionel
**Infrastructure**: Talloires (production)
**Backup**: Annecy (NAS Synology)
```
┌─────────────────────────────────────────────────────────────────┐
│ INTERNET │
└─────────────────────────────────────────────────────────────────┘
┌─────────┴─────────┐
│ UniFi DR7 │
│ (Theseus) │
│ 10.171.171.1 │
└─────────┬─────────┘
┌────────────────────┼────────────────────┐
│ │ │
┌────────┴────────┐ ┌────────┴────────┐ ┌───────┴───────┐
│ Raspberry Pi 5 │ │ Synology NAS │ │ Clients │
│ (Talloires) │ │ (Annecy) │ │ Mac/iOS │
│ 10.171.171.7 │ │ 10.171.171.50 │ │ │
│ TS: 100.116... │ │ TS: 100.69... │ │ │
└─────────────────┘ └─────────────────┘ └───────────────┘
```
---
## Docker Stacks
*Dernière mise à jour: 31 décembre 2025 - Ajout Arcane, Dozzle, Lazydocker*
| Stack | Location | Containers |
|-------|----------|------------|
| **infra** | `~/lake/infra/` | caddy, authelia |
| **media** | `~/lake/media/` | jellyfin |
| **monitoring** | `~/lake/monitoring/` | arcane, dozzle, netdata |
| **p2p** | `~/lake/p2p/` | wireguard, transmission |
| **tools** | `~/lake/tools/` | gitea, mkdocs, shlink, shlink-web, microbin, miniflux, miniflux-db, privatebin, freshrss |
| **automation** | `~/lake/automation/` | homeassistant, signal-api, esphome, tgv-tracker |
## Sections
- [Infrastructure](infra/overview.md) - Architecture détaillée
- [Services](services/overview.md) - Configuration des services
- [Changelog](changelog/2025-12-31.md) - Journal des modifications
- [Vault](vault/README.md) - Configurations et secrets
## Go Links Reference
Tous les services sont accessibles via des liens courts `go/xxx` :
```
# Core
go/auth → Authelia SSO
go/docs → Documentation
# Media
go/jellyfin → Jellyfin media server
go/jf → Jellyfin (alias)
go/torrent → Transmission (Tailscale only)
# Tools
go/git → Gitea repositories
go/paste → MicroBin (simple paste)
go/bin → MicroBin (alias)
go/spaste → PrivateBin (encrypted)
go/securepaste → PrivateBin (alias)
go/shlink → Shlink admin
# RSS
go/rss → Miniflux
go/feeds → Miniflux (alias)
go/freshrss → FreshRSS
go/frss → FreshRSS (alias)
# Automation
go/ha → Home Assistant
# Monitoring
go/docker → Arcane
go/arcane → Arcane (alias)
go/logs → Dozzle
go/dz → Dozzle (alias)
go/netdata → Netdata
```

View File

@@ -0,0 +1,145 @@
# Problèmes rencontrés - 31 décembre 2025
Session de maintenance majeure pour réparer l'infrastructure après réorganisation.
## 1. Shlink - URLs cassées
**Symptôme** : Les short URLs (`go/ts`, `go/ui`, etc.) ne fonctionnaient plus.
**Cause** : Le Caddyfile contenait des redirections manuelles au lieu d'un reverse proxy vers Shlink.
**Solution** :
```caddyfile
# AVANT (cassé)
go.talloires.local {
redir /ts https://tailscale.com permanent
redir /ui https://unifi.ui.com permanent
}
# APRÈS (fonctionnel)
go.talloires.local {
reverse_proxy shlink:8080
}
```
**Fichiers modifiés** :
- `/mnt/mediaserver/talloires/caddy/Caddyfile`
- `/home/lionel/talloires-v2/shlink-web/servers.json`
---
## 2. Arcane - Crash loop
**Symptôme** : Container en restart permanent.
**Cause** : `ENCRYPTION_KEY` invalide (31 caractères au lieu de 32+).
**Solution** :
```bash
# Générer nouvelles clés
openssl rand -base64 32
# Mettre à jour docker-compose.yml
ENCRYPTION_KEY=fY+ln5hq7XMkDR+cU/pxu3Kf11LgUkjYXdM+QSwU3jM=
SESSION_SECRET=QDGWo1nA9Qa4fRT2ektsjQ0oUbuAwUz4V8xsBfZYiWw=
```
**Note** : Authelia désactivé temporairement pour Arcane.
---
## 3. Jellyfin - Médias non montés
**Symptôme** : Bibliothèques vides, médias inaccessibles.
**Cause** : Volumes Docker pointaient vers `/mnt/annecy` au lieu de `/mnt/mediaserver`.
**Solution** : Correction des bind mounts dans `docker-compose.yml`.
---
## 4. Gitea + Authelia - OIDC cassé
**Symptôme** : `500 Internal Server Error` lors du login Authelia.
**Cause** : Gitea ne faisait pas confiance au certificat SSL de Caddy (nouveau CA après régénération).
**Solution** :
```bash
# Copier le CA dans Gitea
docker exec caddy cat /data/caddy/pki/authorities/local/root.crt > /tmp/caddy-root.crt
docker cp /tmp/caddy-root.crt gitea:/usr/local/share/ca-certificates/
docker exec gitea update-ca-certificates
docker restart gitea
```
---
## 5. Authelia - Base de données read-only
**Symptôme** : `Could not save the consent session`
**Cause** : Le dossier `/home/lionel/docker/authelia/config/` avait été supprimé lors du nettoyage, mais le container montait encore ce chemin.
**Solution** :
```bash
# Restaurer depuis l'archive
tar xzf /mnt/mediaserver/backups/docker-v1-archive-20251231.tar.gz \
-C /home/lionel docker/authelia
docker restart authelia
```
---
## 6. Home Assistant - Onboarding inattendu
**Symptôme** : Page de création de compte au lieu du login.
**Cause** : Le container montait `/mnt/mediaserver/talloires/homeassistant` mais la config restaurée était dans `/home/lionel/talloires-v2/homeassistant`.
**Solution** :
```bash
# Copier la config restaurée vers le bon emplacement
cp -a /home/lionel/talloires-v2/homeassistant /mnt/mediaserver/talloires/homeassistant
docker restart homeassistant
```
---
## 7. Transmission - HTTP 502
**Symptôme** : Bad Gateway lors de l'accès.
**Cause** : Caddy cherchait `transmission:9091` mais Transmission utilise `network_mode: service:wireguard`.
**Solution** :
```caddyfile
# Dans Caddyfile
reverse_proxy wireguard:9091 # Pas transmission:9091
```
---
## 8. Dozzle - Non accessible
**Symptôme** : URL ne fonctionnait pas.
**Cause** : Dozzle n'était pas configuré dans le Caddyfile.
**Solution** :
```caddyfile
dozzle.talloires.local, dozzle.talloires.tailfd281f.ts.net {
import authelia
reverse_proxy dozzle:8080
import internal_tls
}
```
---
## Leçons apprises
1. **Toujours vérifier les points de montage** avant de supprimer des dossiers
2. **Les certificats CA** doivent être installés dans chaque container qui fait des requêtes HTTPS internes
3. **Documenter les chemins réels** utilisés par chaque service
4. **Garder une archive** avant toute réorganisation majeure

141
docs/infra/network.md Normal file
View File

@@ -0,0 +1,141 @@
# Réseau & Accès
## Tailscale VPN
Tailscale remplace ZeroTier depuis décembre 2025 pour le mesh VPN.
### Configuration
| Machine | IP Tailscale | Hostname |
|---------|--------------|----------|
| Talloires (RPi5) | 10.171.171.1 | talloires.tailfd281f.ts.net |
| Annecy (Synology) | 10.171.171.50 | annecy.tailfd281f.ts.net |
| Mac Lionel | 100.x.x.x | (dynamique) |
### DNS MagicDNS
Tailscale fournit la résolution DNS automatique :
```
*.talloires.tailfd281f.ts.net → Services Talloires
```
### Accès aux services
Tous les services sont accessibles via deux domaines :
| Type | Domaine | Exemple |
|------|---------|---------|
| LAN | `*.talloires.local` | `jellyfin.talloires.local` |
| Tailscale | `*.talloires.tailfd281f.ts.net` | `jellyfin.talloires.tailfd281f.ts.net` |
## Accès LAN
### Prérequis
1. **Certificat CA Caddy** installé sur le client
2. **DNS local** configuré (dnsmasq ou /etc/hosts)
### Installation du certificat
```bash
# Sur Talloires
docker exec caddy cat /data/caddy/pki/authorities/local/root.crt > caddy-root.crt
# Sur Mac
sudo security add-trusted-cert -d -r trustRoot \
-k /Library/Keychains/System.keychain caddy-root.crt
```
### Configuration DNS
Option 1 : **dnsmasq** sur le routeur
```
address=/talloires.local/10.171.171.7
```
Option 2 : **/etc/hosts** sur chaque client
```
10.171.171.7 jellyfin.talloires.local
10.171.171.7 git.talloires.local
10.171.171.7 homeassistant.talloires.local
# etc.
```
## Ports exposés
| Port | Service | Protocole |
|------|---------|-----------|
| 443 | Caddy (HTTPS) | TCP |
| 80 | Caddy (HTTP → HTTPS) | TCP |
| 2222 | Gitea SSH | TCP |
| 8123 | Home Assistant (interne) | TCP |
## Sécurité
### Authelia SSO
La plupart des services sont protégés par Authelia :
```
Client → Caddy → Authelia → Service
```
Services protégés par Authelia :
- Transmission
- Netdata
- Dozzle
- Cockpit
Services avec auth propre (bypass Authelia) :
- Jellyfin (auth interne)
- Gitea (OIDC via Authelia)
- Home Assistant (auth interne)
- Arcane (désactivé temporairement)
### ProtonVPN (WireGuard)
Transmission utilise un tunnel WireGuard vers ProtonVPN :
```
Transmission → WireGuard container → ProtonVPN → Internet
Kill switch intégré
(network_mode: service:wireguard)
```
Vérification IP :
```bash
# IP Transmission (doit être ProtonVPN)
docker exec transmission curl -s ifconfig.me
# IP locale
curl -s ifconfig.me
```
## DNS Redondant
### Architecture
| Serveur | IP | Rôle | Upstream |
|---------|-----|------|----------|
| Talloires | 100.116.198.105 | Primaire | AdGuard DoH |
| Annecy | 10.171.171.50 | Secondaire | Talloires → 1.1.1.1 |
### Configuration
**Talloires** (`/etc/dnsmasq.d/tailscale.conf`):
- Écoute: 127.0.0.1, 100.116.198.105
- Forward: cloudflared (AdGuard DoH)
**Annecy** (`/volume1/docker/dnsmasq/`):
- Container: `andyshinn/dnsmasq`
- Mode: `network_mode: host` + `bind-interfaces`
- Écoute: 10.171.171.50, 10.171.171.51
- Forward: Talloires → 1.1.1.1 → 8.8.8.8
### Test
```bash
dig @10.171.171.50 talloires.local +short # Annecy
dig @100.116.198.105 go +short # Talloires
```

View File

@@ -1,382 +1,168 @@
# Infrastructure Talloires v2.0
# Infrastructure Overview
Documentation de l'infrastructure réseau, VPN, DNS, et backups.
## Hardware
---
### Talloires (Raspberry Pi 5 - 8GB)
## 🖥️ Serveurs
| Composant | Détails |
|-----------|---------|
| CPU | Broadcom BCM2712 (4x Cortex-A76 @ 2.4GHz) |
| RAM | 8 GB LPDDR4X |
| Stockage | SD Card 64GB + SSD 4TB USB |
| Réseau | Ethernet 1Gbps |
| OS | Raspberry Pi OS (Debian 12 Bookworm) |
### Talloires (Production)
- **Type**: Raspberry Pi 5 (8GB RAM)
- **OS**: Raspberry Pi OS (Debian 12)
- **IP Tailscale**: `100.116.198.105`
- **Hostname**: `talloires.tailfd281f.ts.net`
- **Rôle**: Serveur principal (Docker)
### Annecy (Synology DS620slim)
### Annecy (Storage)
- **Type**: Synology DS620slim
- **OS**: DSM 7.x
- **IP Tailscale**: `100.69.227.96`
- **Hostname**: `annecy.tailfd281f.ts.net`
- **Rôle**: NAS, Backups
| Composant | Détails |
|-----------|---------|
| Stockage | 6x SSD en RAID |
| Rôle | NAS backup, stockage long terme |
| Accès | NFS via Tailscale |
### Theseus (Network)
- **Type**: UniFi Dream Router 7
- **Rôle**: Gateway, Firewall, DHCP
### Theseus (UniFi Dream Router 7)
---
| Rôle | Détails |
|------|---------|
| Routeur | Gateway réseau domestique |
| WiFi | WiFi 7 (BE) |
| DHCP | 10.171.171.0/24 |
## 🐳 Outils Docker Management
## Points de montage
### 🎨 Arcane - Web UI
**URL**: [go/arcane](https://go/arcane)
**License**: BSD-3-Clause
**Status**: ✅ Opérationnel
**Fonctionnalités:**
- Gestion containers, images, volumes, networks
- Docker Compose templates & projects
- Monitoring temps réel (CPU/RAM)
- Interface moderne & responsive
- Multi-serveurs (via agents)
**Usage:**
```bash
# Accès web
https://go/arcane
# SD Card (OS + configs)
/dev/mmcblk0p2 → / # 58 GB
# Credentials par défaut
Username: arcane
Password: arcane-admin
# SSD externe (données)
/dev/sda1 → /mnt/mediaserver # 4 TB
# NFS Synology (backups)
annecy:/volume1/Backups → /mnt/annecy
```
**Alternative à:** Portainer (proprietary), Dockge (unstable)
---
### 📋 Dozzle - Logs Viewer
**URL**: [go/logs](https://go/logs)
**License**: MIT
**Status**: ✅ Opérationnel
**Fonctionnalités:**
- Real-time log streaming
- Multi-container view
- Search & filter
- Ultra-léger (~30 MB RAM)
- Aucune base de données
**Usage:**
```bash
# Accès web
https://go/logs
# Pas d'authentification requise (Tailscale VPN only)
```
**Use cases:** Debug, troubleshooting, monitoring logs
---
### ⚡ Lazydocker - Terminal UI
**License**: MIT
**Status**: ✅ Installé sur Talloires & Annecy
**Version**: 0.24.3
**Installation:**
```bash
# Talloires
lazydocker --version
# Location: /usr/local/bin/lazydocker
# Annecy (Synology)
~/.local/bin/lazydocker --version
```
**Fonctionnalités:**
- TUI (Terminal User Interface)
- Stats en temps réel (CPU/RAM)
- Logs interactifs
- Actions rapides (start/stop/restart)
- Fonctionne via SSH
**Usage:**
```bash
# Sur Talloires
ssh lionel@talloires.local
lazydocker
# Sur Annecy
ssh lionel@100.69.227.96
~/.local/bin/lazydocker
```
**Navigation:**
- `↑/↓`: Sélection
- `Enter`: Actions
- `l`: Logs
- `e`: Exec shell
- `q`: Quitter
---
### 📊 Comparaison Outils
| Feature | Arcane | Dozzle | Lazydocker |
|---------|--------|--------|------------|
| **Type** | Web UI | Web UI | TUI |
| **Containers** | ✅ Full mgmt | ❌ View only | ✅ Full mgmt |
| **Logs** | ✅ | ✅ | ✅ |
| **Compose** | ✅ Templates | ❌ | ✅ View |
| **Stats** | ✅ | ❌ | ✅ |
| **Remote** | ✅ Multi-host | ❌ Single | ❌ Single |
| **SSH** | ❌ | ❌ | ✅ Works |
| **RAM** | ~100 MB | ~30 MB | ~50 MB |
**Recommandations:**
- **Arcane**: Gestion quotidienne, templates, multi-serveurs
- **Dozzle**: Quick log inspection, debugging
- **Lazydocker**: SSH access, TUI lovers, remote management
---
## 🌐 Réseau
### Tailscale VPN
- **Type**: WireGuard mesh VPN
- **MagicDNS**: Désactivé (dnsmasq preferred)
- **Subnet**: `100.64.0.0/10`
### DNS Local (dnsmasq)
**Config**: `/etc/dnsmasq.d/tailscale.conf`
## Structure ~/lake/
```
# Machines
address=/talloires.local/100.116.198.105
address=/annecy.local/100.69.227.96
# Wildcards
address=/.talloires.local/100.116.198.105
# Go-links
address=/go/100.116.198.105
# Upstream DNS
server=127.0.0.1#5053
~/lake/
├── automation/ # Home Assistant, ESPHome, Signal, TGV-tracker
│ ├── homeassistant/
│ ├── esphome/
│ ├── signal/
│ └── tgv-tracker/
├── infra/ # Caddy, Authelia
│ ├── caddy/
│ └── authelia/
├── media/ # Jellyfin
│ └── jellyfin/
├── monitoring/ # Arcane, Dozzle, Netdata
│ ├── arcane/
│ ├── dozzle/
│ └── netdata/
├── p2p/ # Legacy (voir servarr)
│ ├── transmission/
│ └── wireguard/
├── servarr/ # Stack média automatisée (VPN)
│ ├── gluetun/
│ ├── transmission/
│ ├── prowlarr/
│ ├── radarr/
│ └── sonarr/
└── tools/ # Gitea, Shlink, MkDocs, Glance, etc.
├── gitea/
├── shlink/
├── mkdocs/
└── glance/
```
### AdGuard DNS (DoH)
- **Port**: 5053
- **Upstream**: AdGuard DNS-over-HTTPS
- **Config**: `cloudflared` tunnel
## Réseaux Docker
---
## 🔐 VPN Tunnel (ProtonVPN)
### Configuration WireGuard
- **Server**: Luxembourg (LU#44)
- **Public IP**: 5.253.204.190
- **Endpoint**: 5.253.204.162:51820
- **Config**: `/home/lionel/talloires-v2/transmission/wireguard/wg0.conf`
### Kill-Switch
Transmission utilise `network_mode: service:wireguard` → Impossible de leak l'IP réelle.
### Monitoring VPN
- Vérification automatique IP publique
- Alertes Telegram si VPN down (<30s)
- Health checks Docker
---
## 💾 Backups
### Structure NFS
```
/mnt/annecy/talloires/
├── migration-v2/ # Backups migration
│ ├── jellyfin-config-*.tar.gz # 2.3 GB
│ ├── gitea-data-*.tar.gz # Repos Git
│ ├── mkdocs-v1-archive-*.tar.gz # 12 KB
│ └── critical-configs-*.tar.gz # 3.5 KB
└── daily/ # Backups quotidiens (TODO)
```mermaid
flowchart LR
subgraph lake_net[lake_net - Réseau principal]
CADDY[Caddy]
AUTH[Authelia]
JELLYFIN[Jellyfin]
GITEA[Gitea]
HA[Home Assistant]
MKDOCS[MkDocs]
GLUETUN[Gluetun]
end
subgraph gluetun_ns[Namespace Gluetun]
TRANS[Transmission]
PROWLARR[Prowlarr]
SONARR[Sonarr]
RADARR[Radarr]
end
CADDY --> AUTH
CADDY --> JELLYFIN
CADDY --> GITEA
CADDY --> HA
CADDY --> MKDOCS
CADDY --> GLUETUN
GLUETUN --> gluetun_ns
```
### NFS Mount
```bash
sudo mount -t nfs 100.69.227.96:/volume1/talloires /mnt/annecy -o rw,hard,intr,rsize=8192,wsize=8192
| Réseau | CIDR | Usage |
|--------|------|-------|
| `lake_net` | 172.19.0.0/16 | Réseau principal, tous les services |
| `gluetun namespace` | localhost | Services Servarr via VPN |
## Services actifs
| Service | Stack | Port | URL |
|---------|-------|------|-----|
| Caddy | infra | 80, 443 | - |
| Authelia | infra | 9091 | auth.talloires.local |
| Jellyfin | media | 8096 | jellyfin.talloires.local |
| Home Assistant | automation | 8123 | homeassistant.talloires.local |
| ESPHome | automation | 6052 | - |
| Gitea | tools | 3000 | git.talloires.local |
| MkDocs | tools | 8000 | docs.talloires.local |
| Shlink | tools | 8080 | go.talloires.local |
| Arcane | monitoring | 3552 | arcane.talloires.local |
| Dozzle | monitoring | 8080 | dozzle.talloires.local |
| Netdata | monitoring | 19999 | netdata.talloires.local |
| Gluetun | servarr | 8000 | - |
| Transmission | servarr | 9091 | transmission.talloires.tailfd281f.ts.net |
| Prowlarr | servarr | 9696 | prowlarr.talloires.local |
| Sonarr | servarr | 8989 | sonarr.talloires.local |
| Radarr | servarr | 7878 | radarr.talloires.local |
## Adresses IP
| Machine | IP LAN | IP Tailscale |
|---------|--------|--------------|
| Talloires | 10.171.171.7 | talloires.tailfd281f.ts.net |
| Annecy | 10.171.171.50 | annecy.tailfd281f.ts.net |
| Olympou (Mac) | 10.171.171.x | olympou.tailfd281f.ts.net |
## Domaines
| Domaine | Usage |
|---------|-------|
| `*.talloires.local` | Accès LAN |
| `*.talloires.tailfd281f.ts.net` | Accès Tailscale |
## Stockage média
```
/mnt/mediaserver/
├── servarr/
│ ├── torrents/ # Downloads Transmission
│ └── media/
│ ├── movies/ # Films (Radarr)
│ └── tv/ # Séries (Sonarr)
├── jellyfin/
│ ├── movies/ # Bibliothèque legacy
│ ├── series/ # Bibliothèque legacy
│ ├── lionel/ # Médias Lionel
│ └── fiona/ # Médias Fiona
└── jellyfin-cache/ # Cache transcoding
```
**Fstab**:
```
100.69.227.96:/volume1/talloires /mnt/annecy nfs rw,hard,intr,rsize=8192,wsize=8192 0 0
```
## Dernière mise à jour
### Backup Automatique (Cron)
TODO: Mettre à jour cron pour v2.0 structure.
---
## 🔒 Sécurité
### Firewall (UFW)
```bash
sudo ufw status
```
Ports ouverts:
- 80, 443: HTTP/HTTPS (Caddy)
- 2222: SSH Gitea
- 8096: Jellyfin (direct access)
- 22: SSH (Tailscale only)
### Certificats HTTPS
- **CA**: Caddy Local Authority
- **Cert**: `/data/caddy/pki/authorities/local/root.crt`
- **Installation**: Importer dans macOS Keychain → Always Trust
### Accès
- Tailscale VPN uniquement
- Pas d'exposition Internet directe
- SSH keys only (no password)
---
## 📊 Monitoring
### Stack Monitoring
**Netdata** - System metrics
- **URL**: `https://go/net`
- **Métriques**: CPU, RAM, Disk, Network, Docker
- **Alertes**: À configurer (optionnel)
**Arcane** - Docker monitoring
- **URL**: `https://go/arcane`
- **Métriques**: Containers stats (CPU/RAM)
- **Features**: Dashboard, projects, logs
**Dozzle** - Logs viewer
- **URL**: `https://go/logs`
- **Features**: Real-time logs, search, filter
**Lazydocker** - Terminal monitoring
```bash
ssh lionel@talloires.local
lazydocker
```
### Docker Health Checks
Tous les containers ont des health checks configurés.
### Logs
```bash
# CLI
docker logs <container>
docker logs <container> --follow
docker logs <container> --tail 100
# Web UI (Dozzle)
https://go/logs
# TUI (Lazydocker)
lazydocker
```
---
## 🛠️ Maintenance
### Docker Management
**Via Arcane (Web):**
```
https://go/arcane
→ Containers → Start/Stop/Restart
→ Images → Pull/Delete
→ Projects → Manage Compose stacks
```
**Via Lazydocker (TUI):**
```bash
ssh lionel@talloires.local
lazydocker
# Navigate avec arrows, Enter pour actions
```
**Via CLI:**
```bash
# Update containers
cd /home/lionel/talloires-v2/core
docker compose pull
docker compose up -d
# Restart service
docker restart <container>
# View logs
docker logs <container> --tail 100
```
### Backup Manuel
```bash
# Jellyfin
tar -czf /mnt/annecy/talloires/manual/jellyfin-$(date +%Y%m%d).tar.gz \\
/home/lionel/talloires-v2/jellyfin/config
# Gitea
tar -czf /mnt/annecy/talloires/manual/gitea-$(date +%Y%m%d).tar.gz \\
/home/lionel/talloires-v2/gitea/
# Arcane database
tar -czf /mnt/annecy/talloires/manual/arcane-$(date +%Y%m%d).tar.gz \\
/home/lionel/talloires-v2/docker-mgmt/arcane-data
```
### Restart Services
```bash
docker restart <container>
docker compose restart
```
---
## 📁 Fichiers de Configuration
### Docker Management
```
/home/lionel/talloires-v2/docker-mgmt/
├── docker-compose.yml # Arcane + Dozzle
└── arcane-data/ # Arcane database
```
### Caddy
```
/home/lionel/talloires-v2/caddy/
├── Caddyfile # Reverse proxy config
└── Caddyfile.backup-* # Backups automatiques
```
### Services
```
/home/lionel/talloires-v2/
├── core/ # Caddy, Shlink
├── jellyfin/ # Media server
├── transmission/ # BitTorrent + WireGuard
├── gitea/ # Git hosting
├── homeassistant/ # Domotique
├── mkdocs/ # Documentation
├── netdata/ # Monitoring
├── signal-api/ # Notifications
└── docker-mgmt/ # Arcane + Dozzle
```
---
*Voir [Services](../services/overview.md) pour configuration applicative.*
*Dernière mise à jour: 31 décembre 2025*
- **2026-01-12** : Documentation de l'architecture VPN complète pour Servarr

View File

@@ -0,0 +1,136 @@
# Recommandations & Next Steps
## Priorité haute 🔴
### 1. Migration SD → SSD 512GB
**Situation actuelle** :
- SD Card 64GB : 69% utilisé (OS + configs)
- SSD 4TB : données uniquement
**Recommandation** : Boot sur SSD 512GB pour :
- Meilleure fiabilité (SD cards = points de défaillance)
- Meilleures performances I/O
- Plus d'espace pour les configs Docker
**Étapes** :
```bash
# 1. Cloner la SD vers le SSD
sudo dd if=/dev/mmcblk0 of=/dev/sdX bs=4M status=progress
# 2. Étendre la partition
sudo raspi-config # Advanced > Expand Filesystem
# 3. Configurer le boot USB
sudo raspi-config # Advanced > Boot Order > USB Boot
# 4. Modifier /boot/cmdline.txt si nécessaire
```
### 2. Migrer Jellyfin config vers SSD
**Situation** : 3.6 GB de config Jellyfin sur SD card
```bash
# Déplacer vers SSD
mv /home/lionel/talloires-v2/jellyfin /mnt/mediaserver/talloires/jellyfin
# Mettre à jour docker-compose.yml
volumes:
- /mnt/mediaserver/talloires/jellyfin:/config
```
### 3. Réactiver Authelia pour Arcane
Actuellement désactivé pour contourner un problème d'accès.
```caddyfile
# Dans Caddyfile, réactiver :
arcane.talloires.local {
import authelia # Décommenter
reverse_proxy arcane:3000
}
```
---
## Priorité moyenne 🟡
### 4. Corriger l'erreur SMTP Home Assistant
```yaml
# configuration.yaml - utiliser un app password ProtonMail
notify:
- platform: smtp
server: 127.0.0.1 # Via ProtonMail Bridge
port: 1025
sender: xxx@protonmail.com
username: xxx
password: !secret smtp_password
```
### 5. Unifier les chemins de configuration
Actuellement dispersés entre :
- `/home/lionel/talloires-v2/` (configs Docker Compose)
- `/mnt/mediaserver/talloires/` (données services)
- `/home/lionel/docker/` (ancien, à migrer)
**Recommandation** : Tout consolider sur le SSD après migration.
### 6. Backup automatisé des configs
```bash
# Ajouter au cron
0 4 * * * tar czf /mnt/annecy/talloires-config-$(date +%Y%m%d).tar.gz \
/home/lionel/talloires-v2 \
/mnt/mediaserver/talloires
```
### 7. Monitoring des backups
Ajouter des alertes si les backups échouent :
- Healthchecks.io pour le cron
- Telegram bot pour alertes critiques
---
## Priorité basse 🟢
### 8. SNMP monitoring Synology
Ajouter le monitoring RAID et disques du NAS Annecy.
### 9. Documentation continue
- Mettre à jour MkDocs après chaque modification
- Sync bidirectionnelle avec Gitea fonctionne ✅
### 10. Nettoyer les anciennes archives
```bash
# Après validation de la migration SSD
rm /mnt/mediaserver/backups/docker-v1-archive-20251231.tar.gz
```
---
## Améliorations futures
### Infrastructure
- [ ] Cluster Raspberry Pi pour haute disponibilité
- [ ] Déploiement distribué chez famille (Paris, Annecy)
- [ ] Cache intelligent multi-sites pour Jellyfin
### Sécurité
- [ ] Audit Lynis régulier (actuellement 63/100)
- [ ] Fail2ban pour les services exposés
- [ ] Rotation automatique des secrets
### Services
- [ ] Upgrade Gitea → dernière version
- [ ] Ajouter Vaultwarden (password manager)
- [ ] Intégration DevonThink si Mac Mini M1

162
docs/infra/ssd-migration.md Normal file
View File

@@ -0,0 +1,162 @@
# Migration SD → SSD NVMe
!!! success "Migration réussie le 1er janvier 2026"
Talloires boot désormais sur un SSD NVMe de 512GB, avec la carte SD comme fallback automatique.
## Contexte
Le Raspberry Pi 5 fonctionnait sur une carte SD de 64GB, ce qui posait plusieurs problèmes :
- **Performance I/O limitée** : Les écritures aléatoires 4K plafonnaient à ~300 IOPS
- **Espace disque contraint** : Seulement 17GB libres pour les services Docker
- **Usure de la SD** : Les écritures fréquentes (logs, métriques) usent prématurément les cartes SD
## Matériel
| Composant | Modèle | Capacité |
|-----------|--------|----------|
| SSD NVMe | Acer MA200 | 512 GB |
| HAT NVMe | (intégré Pi 5) | PCIe 2.0 x1 |
| Carte SD (backup) | SanDisk | 64 GB |
## Procédure de migration
### 1. Backup préalable
```bash
# Backup complet vers Annecy (NAS)
~/backup-to-annecy.sh
```
Le script sauvegarde `~/talloires-v2/` (3.7GB, 19,427 fichiers) vers `/mnt/annecy/talloires/`.
### 2. Préparation du SSD
Le SSD était déjà partitionné avec une installation précédente :
```
/dev/nvme0n1p1 511M boot (FAT32)
/dev/nvme0n1p2 468G root (ext4)
```
### 3. Synchronisation avec rsync
```bash
# Sync root filesystem
sudo rsync -axHAWXS --numeric-ids --info=progress2 --delete \
--exclude="/boot/firmware/*" \
--exclude="/dev/*" \
--exclude="/proc/*" \
--exclude="/sys/*" \
--exclude="/tmp/*" \
--exclude="/run/*" \
--exclude="/mnt/*" \
--exclude="/media/*" \
--exclude="/lost+found" \
/ /mnt/ssd-root/
# Sync boot partition
sudo rsync -avx /boot/firmware/ /mnt/ssd-boot/
```
### 4. Configuration des PARTUUIDs
Mise à jour de `/etc/fstab` sur le SSD :
```
PARTUUID=e4c047f7-01 /boot/firmware vfat defaults 0 2
PARTUUID=e4c047f7-02 / ext4 defaults,noatime 0 1
```
Mise à jour de `/boot/firmware/cmdline.txt` :
```
root=PARTUUID=e4c047f7-02
```
### 5. Configuration EEPROM boot order
```bash
# Avant: 0xf461 (SD → NVMe → USB)
# Après: 0xf416 (NVMe → SD → USB)
sudo rpi-eeprom-config --edit
# Modifier BOOT_ORDER=0xf416
```
| Code | Signification |
|------|---------------|
| 6 | NVMe (prioritaire) |
| 1 | SD card (fallback) |
| 4 | USB |
| f | Restart loop |
## Résultats benchmark
### Écriture séquentielle (128MB)
| Device | Vitesse | Ratio |
|--------|---------|-------|
| SD Card | 8.9 MB/s | 1x |
| SSD NVMe | 2,100 MB/s | **236x** |
### I/O aléatoires 4K (le plus important)
| Device | Read IOPS | Write IOPS |
|--------|-----------|------------|
| SD Card | 3,288 | 302 |
| SSD NVMe | 315,076 | 334,367 |
| **Gain** | **96x** | **1,108x** 🔥 |
!!! info "Pourquoi les IOPS 4K comptent"
Les écritures aléatoires 4K sont critiques pour :
- Démarrage des containers Docker
- Journaux système et logs applicatifs
- Bases de données (Gitea, Home Assistant)
- Métriques Prometheus/Grafana
## État actuel
```bash
# Vérifier le device de boot
findmnt -n -o SOURCE /
# /dev/nvme0n1p2
# Espace disponible
df -h /
# 468G total, 406G libres (87%)
# Boot order
sudo rpi-eeprom-config | grep BOOT_ORDER
# BOOT_ORDER=0xf416
```
## Fallback automatique
La carte SD reste branchée et contient un système fonctionnel. Si le SSD a un problème :
1. Le Pi essaie de booter sur NVMe → échec
2. Le Pi boot automatiquement sur SD → succès
3. On peut diagnostiquer/réparer le SSD
Pour forcer le boot SD (debug) :
```bash
# Temporairement changer le boot order
sudo rpi-eeprom-config --edit
# BOOT_ORDER=0xf461 (SD first)
sudo reboot
```
## Scripts associés
- `~/backup-to-annecy.sh` : Backup quotidien vers NAS (cron 3h)
- Healthchecks.io : Monitoring du backup
## Historique
| Date | Action |
|------|--------|
| 2026-01-01 | Migration SD → SSD NVMe |
| 2026-01-01 | Correction script backup (source: talloires-v2) |
| 2026-01-01 | Benchmark et documentation |

137
docs/services/helmarr.md Normal file
View File

@@ -0,0 +1,137 @@
# Helmarr (iOS)
Application iOS native pour gérer les services Servarr depuis iPhone/iPad.
## Présentation
Helmarr est une app iOS/iPadOS/macOS pour contrôler Radarr, Sonarr, Prowlarr, Transmission et autres services *arr depuis mobile. Interface native, widgets Home Screen, notifications push.
!!! info "App Store"
[Helmarr sur l'App Store](https://apps.apple.com/app/helmarr/id1638624921) — Gratuit
## Services supportés
| Service | Fonction | Supporté |
|---------|----------|----------|
| Sonarr | Séries TV | ✅ |
| Radarr | Films | ✅ |
| Lidarr | Musique | ✅ |
| Prowlarr | Indexeurs | ✅ |
| Transmission | Torrents | ✅ |
| Tautulli | Stats Plex | ✅ |
| Overseerr/Jellyseerr | Requêtes | ✅ |
| SABnzbd/NZBGet | Usenet | ✅ |
## Configuration Talloires
### URLs et API Keys
| Service | URL Tailscale | API Key |
|---------|---------------|---------|
| **Radarr** | `https://radarr.talloires.tailfd281f.ts.net` | `b87fbcc6737e4d6a8c3c64f91bb81cef` |
| **Sonarr** | `https://sonarr.talloires.tailfd281f.ts.net` | `eb2cc87743de4ff18944d684f7e33da2` |
| **Prowlarr** | `https://prowlarr.talloires.tailfd281f.ts.net` | `813a9853a8bc468c8d6a4f013373cff7` |
| **Transmission** | `https://transmission.talloires.tailfd281f.ts.net` | *(auth basique)* |
!!! warning "Sécurité"
Ces API keys donnent un accès complet aux services. Ne pas partager.
### Étapes de configuration
1. **Installer Helmarr** depuis l'App Store
2. **Ajouter Radarr** :
- Tap `+``Radarr`
- **Host** : `radarr.talloires.tailfd281f.ts.net`
- **Port** : `443`
- **API Key** : `b87fbcc6737e4d6a8c3c64f91bb81cef`
- **SSL** : ✅ Activé
- **Validate Certificate** : ✅ (certificat Tailscale valide)
3. **Ajouter Sonarr** :
- Tap `+``Sonarr`
- **Host** : `sonarr.talloires.tailfd281f.ts.net`
- **Port** : `443`
- **API Key** : `eb2cc87743de4ff18944d684f7e33da2`
- **SSL** : ✅ Activé
4. **Ajouter Prowlarr** :
- Tap `+``Prowlarr`
- **Host** : `prowlarr.talloires.tailfd281f.ts.net`
- **Port** : `443`
- **API Key** : `813a9853a8bc468c8d6a4f013373cff7`
- **SSL** : ✅ Activé
5. **Ajouter Transmission** :
- Tap `+``Transmission`
- **Host** : `transmission.talloires.tailfd281f.ts.net`
- **Port** : `443`
- **SSL** : ✅ Activé
### Multi-réseau (LAN + Tailscale)
Helmarr supporte plusieurs hôtes avec basculement automatique :
| Réseau | URL | Quand |
|--------|-----|-------|
| **Tailscale** | `*.talloires.tailfd281f.ts.net` | Partout (recommandé) |
| **LAN** | `*.talloires.local` | À la maison uniquement |
!!! tip "Configuration recommandée"
Utiliser uniquement les URLs Tailscale — fonctionne partout tant que Tailscale est connecté sur l'iPhone.
## Fonctionnalités
### Widgets Home Screen
- **Calendrier** : Prochaines sorties séries/films
- **Téléchargements** : Queue active
- **Statistiques** : Taille bibliothèque
### Notifications Push
Configurer dans chaque *arr app → Settings → Connect → Webhook :
```
URL: https://helmarr.app/webhook/<votre_token>
Events: On Download, On Upgrade
```
### Recherche interactive
- Parcourir IMDb Most Popular
- Rechercher et ajouter directement
- Interactive search pour choisir la release
## Authentification
!!! success "Pas d'Authelia requis"
Les endpoints `/api/*` sont configurés sans Authelia dans Caddy.
Helmarr accède directement aux APIs avec la clé API.
## Alternatives
| App | Prix | Avantages |
|-----|------|-----------|
| **Helmarr** | Gratuit | Interface unifiée, widgets |
| **Ruddarr** | Gratuit (premium $6/an) | Plus joli, open source |
| **LunaSea** | Gratuit, open source | Plus d'apps supportées |
## Dépannage
### "Unable to connect"
1. Vérifier que Tailscale est connecté sur l'iPhone
2. Tester l'URL dans Safari : `https://radarr.talloires.tailfd281f.ts.net/api/v3/system/status?apikey=...`
3. Vérifier que le service tourne : `docker ps | grep radarr`
### Certificat invalide
Les certificats Tailscale sont valides. Si erreur :
- Désactiver temporairement "Validate Certificate"
- Vérifier que l'heure iPhone est correcte
### Lenteur
Les services tournent derrière gluetun (VPN). Latence normale ~100-200ms.

145
docs/services/homarr.md Normal file
View File

@@ -0,0 +1,145 @@
# Homarr
Dashboard self-hosted pour organiser et accéder aux services homelab.
## Présentation
Homarr est un dashboard moderne pour centraliser l'accès à tous les services. Intégration native avec les *arr apps, widgets temps réel, personnalisation poussée.
!!! info "Projet"
[GitHub Homarr](https://github.com/ajnart/homarr) — Open source, MIT License
## Déploiement
### Docker Compose
Créer `~/lake/tools/homarr/docker-compose.yml` :
```yaml
services:
homarr:
image: ghcr.io/ajnart/homarr:latest
container_name: homarr
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./configs:/app/data/configs
- ./icons:/app/public/icons
- ./data:/data
ports:
- "7575:7575"
environment:
- TZ=Europe/Luxembourg
networks:
- lake_net
networks:
lake_net:
external: true
```
### Démarrage
```bash
cd ~/lake/tools/homarr
docker compose up -d
```
### Caddy (reverse proxy)
Ajouter dans `~/lake/infra/caddy/Caddyfile` :
```caddyfile
homarr.talloires.local, homarr.talloires.tailfd281f.ts.net {
import authelia
reverse_proxy homarr:7575
import internal_tls
}
```
Recharger Caddy :
```bash
docker exec caddy caddy reload --config /etc/caddy/Caddyfile
```
## Configuration
### Services à ajouter
| Service | URL interne | Icône |
|---------|-------------|-------|
| Jellyfin | `http://jellyfin:8096` | jellyfin |
| Radarr | `http://gluetun:7878` | radarr |
| Sonarr | `http://gluetun:8989` | sonarr |
| Prowlarr | `http://gluetun:9696` | prowlarr |
| Transmission | `http://gluetun:9091` | transmission |
| Home Assistant | `http://homeassistant:8123` | home-assistant |
| Gitea | `http://gitea:3000` | gitea |
| Grafana | `http://grafana:3000` | grafana |
| Portainer | `http://portainer:9000` | portainer |
### Intégrations *arr
Homarr peut afficher des widgets avec stats en temps réel :
1. **Ajouter un service** → Radarr
2. **Integration** → Activer
3. **API Key** : `b87fbcc6737e4d6a8c3c64f91bb81cef`
4. Les widgets afficheront : films en queue, espace disque, activité
### Widgets disponibles
| Widget | Fonction |
|--------|----------|
| **Calendar** | Prochaines sorties (Sonarr/Radarr) |
| **Download Queue** | Torrents actifs |
| **System Health** | CPU, RAM, disque |
| **Docker** | Status containers |
| **Weather** | Météo locale |
| **Bookmarks** | Liens rapides |
## Structure des données
```
~/lake/tools/homarr/
├── docker-compose.yml
├── configs/ # Configuration dashboard
│ └── default.json
├── icons/ # Icônes custom
└── data/ # Données persistantes
```
## Accès
| Réseau | URL |
|--------|-----|
| LAN | [homarr.talloires.local](https://homarr.talloires.local) |
| Tailscale | [homarr.talloires.tailfd281f.ts.net](https://homarr.talloires.tailfd281f.ts.net) |
## Alternatives
| Dashboard | Avantages | Inconvénients |
|-----------|-----------|---------------|
| **Homarr** | Intégrations *arr, moderne | Ressources |
| **Homepage** | Léger, YAML config | Moins de widgets |
| **Heimdall** | Simple | Pas d'intégrations |
| **Organizr** | Tabs, auth intégrée | Complexe |
## Dépannage
### Docker socket permission
```bash
# Si erreur de permission
sudo chmod 666 /var/run/docker.sock
```
### Icônes manquantes
Télécharger depuis [Dashboard Icons](https://github.com/walkxcode/dashboard-icons) :
```bash
cd ~/lake/tools/homarr/icons
wget https://raw.githubusercontent.com/walkxcode/dashboard-icons/main/png/radarr.png
```

25
docs/services/immich.md Normal file
View File

@@ -0,0 +1,25 @@
---
title: "Photos - Immich"
weight: 5
---
# Photos - Immich
## Overview
Immich is the self-hosted photo and video management solution for LakeNet.
**URL**: https://photos.serval-nase.ts.net
## Storage Architecture
- **HOT** (Talloires NVMe): PostgreSQL, Redis, ML cache, Thumbs
- **LUKEWARM** (Annecy photoserver 4TB): originals, encoded-video, library
- **COLD** (B2 encrypted): Daily backup at 05:00
## B2 Backup (Encrypted)
- Bucket: ldu-photos-cold-storage
- Encryption: AES-256 rclone crypt
- Script: ~/scripts/backup-immich-b2.sh
- Cron: Daily 05:00

View File

@@ -1,272 +1,119 @@
# Services Talloires v2.0
# Services
Documentation des services déployés sur l'infrastructure v2.0.
## Vue d'ensemble
---
| Service | Stack | Port interne | Auth |
|---------|-------|--------------|------|
| Caddy | infra | 443, 80 | - |
| Authelia | infra | 9091 | - |
| Jellyfin | media | 8096 | Propre |
| Gitea | tools | 3000 | OIDC Authelia |
| Shlink | tools | 8080 | - |
| Shlink-web | tools | 8080 | - |
| Home Assistant | automation | 8123 | Propre |
| Transmission | transmission | 9091 | Authelia |
| WireGuard | transmission | - | - |
| Netdata | monitoring | 19999 | Authelia |
| Dozzle | monitoring | 8080 | Authelia |
| Arcane | docker-mgmt | 3000 | Désactivé |
| MkDocs | mkdocs | 8000 | - |
| Signal-API | tools | 8080 | - |
## 🐳 Arcane - Docker Management UI
## Docker Compose Stacks
**URL**: `https://go/arcane`
**Port Direct**: `3552`
**Status**: ✅ Opérationnel
**License**: BSD-3-Clause (Open Source)
### Fonctionnalités
- ✅ Gestion containers (start/stop/restart/delete)
- ✅ Gestion images (pull/delete/inspect)
- ✅ Gestion volumes & networks
- ✅ Docker Compose templates
- ✅ Monitoring temps réel (CPU/RAM)
- ✅ Interface moderne SvelteKit
- ✅ Mobile responsive
### Credentials
```
Username: arcane
Password: arcane-admin
```
**⚠️ Important**: Changer le mot de passe par défaut lors de la première connexion.
### Configuration
### infra (`/home/lionel/talloires-v2/infra/`)
```yaml
# /home/lionel/talloires-v2/docker-mgmt/docker-compose.yml
services:
arcane:
image: ghcr.io/getarcaneapp/arcane:latest
container_name: arcane
networks:
- talloires_net
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./arcane-data:/app/data
environment:
- APP_ENV=production
- PUBLIC_SESSION_SECRET=<generated>
- ENCRYPTION_KEY=<generated>
- TZ=Europe/Luxembourg
- caddy # Reverse proxy + SSL
- authelia # SSO
```
### Features Clés
- **Projects**: Organiser les stacks Docker Compose
- **Templates**: Déploiement rapide de services
- **Logs**: Vue intégrée des logs containers
- **Stats**: Métriques CPU/RAM en temps réel
- **Remote Hosts**: Support multi-serveurs (via agents)
### Alternative À
- ❌ Portainer (proprietary license)
- ❌ Dockge (stability issues)
- ✅ Arcane = Open source + moderne + stable
---
## 📋 Dozzle - Docker Logs Viewer
**URL**: `https://go/logs`
**Port Direct**: `8080`
**Status**: ✅ Opérationnel
**License**: MIT (Open Source)
### Fonctionnalités
- ✅ Logs en temps réel (live tailing)
- ✅ Multi-container view
- ✅ Search & filter
- ✅ Dark/light mode
- ✅ Ultra-léger (~30 MB RAM)
- ✅ Aucune base de données requise
### Configuration
### media (`/home/lionel/talloires-v2/media/`)
```yaml
# /home/lionel/talloires-v2/docker-mgmt/docker-compose.yml
services:
dozzle:
image: amir20/dozzle:latest
container_name: dozzle
networks:
- talloires_net
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
- DOZZLE_LEVEL=info
- DOZZLE_FILTER=status=running
- TZ=Europe/Luxembourg
- jellyfin # Media server
```
### Use Cases
- 🔍 Debugging rapide de containers
- 📊 Monitoring logs en temps réel
- 🐛 Troubleshooting incidents
- 📈 Analyse de patterns
### tools (`/home/lionel/talloires-v2/tools/`)
```yaml
services:
- gitea # Git server
- shlink # URL shortener
- shlink-web # Shlink UI
- signal-api # Signal messaging
```
### Features
- **Real-time**: Logs streaming instantané
- **Search**: Recherche textuelle puissante
- **Filter**: Par container, niveau, temps
- **Lightweight**: Aucun overhead
### automation (`/home/lionel/talloires-v2/automation/`)
```yaml
services:
- homeassistant
```
---
### transmission (`/home/lionel/talloires-v2/transmission/`)
```yaml
services:
- wireguard # VPN tunnel
- transmission # BitTorrent client
```
## 🎬 Jellyfin - Serveur Média
### monitoring (`/home/lionel/talloires-v2/monitoring/`)
```yaml
services:
- netdata
- dozzle
```
**URL**: `https://go/jf`
**Port Direct**: `8096`
**Status**: ✅ Opérationnel
**Data**: 2.3 GB restauré depuis v1.0
### docker-mgmt (`/home/lionel/talloires-v2/docker-mgmt/`)
```yaml
services:
- arcane
```
### Configuration
- Accès Infuse: `100.116.198.105:8096`
- Authentification: Compte Jellyfin (lionel)
- Backup: Quotidien vers Annecy
### mkdocs (`/home/lionel/talloires-v2/mkdocs/`)
```yaml
services:
- mkdocs
```
---
## Dépendances
## 📥 Transmission - BitTorrent
```mermaid
graph TD
Internet --> Caddy
Caddy --> Authelia
Caddy --> Jellyfin
Caddy --> Gitea
Caddy --> HomeAssistant[Home Assistant]
Caddy --> Transmission
Caddy --> Netdata
Caddy --> Dozzle
Caddy --> Arcane
Caddy --> MkDocs
Caddy --> Shlink
Authelia --> |OIDC| Gitea
Authelia --> |Forward Auth| Transmission
Authelia --> |Forward Auth| Netdata
Authelia --> |Forward Auth| Dozzle
Transmission --> WireGuard
WireGuard --> ProtonVPN
Gitea --> |Sync| MkDocs
```
**URL**: `https://go/trn`
**Status**: ✅ Opérationnel + VPN Kill-switch
**VPN**: ProtonVPN Luxembourg (LU#44)
## Commandes utiles
### Sécurité VPN
- Network mode: `service:wireguard`
- Public IP: 5.253.204.190 (ProtonVPN)
- Kill-switch: Actif (pas de leak possible)
- Monitoring: Alertes Telegram si VPN down
### Configuration
- Watch directory: `/config/watch`
- Downloads: `/downloads`
- Web UI: Port 9091 (via WireGuard container)
---
## 💾 Gitea - Hébergement Git
**URL**: `https://go/git`
**SSH Port**: `2222`
**Status**: ✅ Opérationnel
### Comptes
- **admin**: lionel.dupre@pm.me (Admin)
- **lionel**: dflected@dflected.org (User)
### Clonage SSH
```bash
git clone ssh://git@talloires.local:2222/user/repo.git
# Status de tous les containers
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
# Redémarrer un service
docker restart jellyfin
# Logs en temps réel
docker logs -f jellyfin
# Entrer dans un container
docker exec -it jellyfin bash
```
### Données Restaurées
- Tous les repositories v1.0
- Clés SSH utilisateurs
- Configuration complète
---
## 🏠 Home Assistant
**URL**: `https://go/ha`
**Status**: ✅ Nouvelle installation (config requise)
### Configuration Initiale
1. Ouvrir `https://go/ha`
2. Créer compte admin
3. Configurer devices
---
## 📚 MkDocs - Documentation
**URL**: `https://go/docs`
**Status**: ✅ Opérationnel v2.0
### Structure
- Documentation v2.0 (active)
- Archive v1.0 (vault/)
---
## 📊 Netdata - Monitoring
**URL**: `https://go/net`
**Status**: ✅ Opérationnel
### Métriques Disponibles
- CPU, RAM, Disk I/O
- Network traffic
- Docker containers
- System load
### Netdata Cloud
Optionnel - Nécessite `NETDATA_CLAIM_TOKEN`
---
## 📱 Signal API - Notifications
**URL**: `https://go/sig`
**Port Direct**: `8080`
**Status**: ✅ Opérationnel
### Utilisation
```bash
# Envoyer notification
curl -X POST https://go/sig/v2/send \\
-H "Content-Type: application/json" \\
-d '{"message":"Test","number":"+33...","recipients":["+33..."]}'
```
---
## 🔗 Shlink - URL Shortener
**Web UI**: `https://go`
**API**: `https://api.shlink.talloires.local`
**Status**: ✅ Opérationnel
### Features
- Liens courts personnalisés
- Statistiques de clics
- QR codes
- API REST
---
## 🌐 Caddy - Reverse Proxy
**Status**: ✅ Opérationnel
**Protocole**: HTTPS (certificats internes)
### Fonctions
- Reverse proxy pour tous les services
- HTTPS automatique (certificats Caddy)
- Go-links routing
- Gestion certificats
### Configuration
```bash
/home/lionel/talloires-v2/caddy/Caddyfile
```
---
## 📊 Récapitulatif Services
| Service | URL | License | Status |
|---------|-----|---------|--------|
| **Arcane** | go/arcane | BSD-3 | ✅ |
| **Dozzle** | go/logs | MIT | ✅ |
| Jellyfin | go/jf | GPL-2 | ✅ |
| Transmission | go/trn | GPL-2 | ✅ |
| Gitea | go/git | MIT | ✅ |
| Home Assistant | go/ha | Apache-2 | ✅ |
| MkDocs | go/docs | BSD-2 | ✅ |
| Netdata | go/net | GPL-3 | ✅ |
| Signal API | go/sig | AGPL-3 | ✅ |
| Shlink | go | MIT | ✅ |
| Caddy | - | Apache-2 | ✅ |
**Total**: 11 services opérationnels
---
*Dernière mise à jour: 31 décembre 2025*

210
docs/services/servarr.md Normal file
View File

@@ -0,0 +1,210 @@
# Servarr Stack
Stack complet et isolé pour la gestion automatisée des médias, entièrement routé via VPN.
## Architecture
```mermaid
flowchart TB
subgraph Internet
PROTON[ProtonVPN LU<br/>WireGuard]
end
subgraph Gluetun[gluetun - VPN Container]
TRANS[Transmission<br/>localhost:9091]
PROWLARR[Prowlarr<br/>localhost:9696]
RADARR[Radarr<br/>localhost:7878]
SONARR[Sonarr<br/>localhost:8989]
end
subgraph Caddy[Reverse Proxy]
CADDY[Caddy + Authelia SSO]
end
subgraph Storage[/mnt/mediaserver/servarr]
TORRENTS[torrents/]
MEDIA[media/]
end
PROTON <--> Gluetun
CADDY -->|gluetun:*| Gluetun
TRANS --> TORRENTS
PROWLARR --> TRANS
RADARR --> TRANS
SONARR --> TRANS
RADARR --> MEDIA
SONARR --> MEDIA
```
!!! success "Kill Switch Intégré"
Tous les services partagent le namespace réseau de gluetun via `network_mode: service:gluetun`.
Si le VPN tombe, **aucun service n'a accès à Internet**.
## Services
| Service | Port interne | Fonction | URL |
|---------|--------------|----------|-----|
| **Gluetun** | 8000 (control) | VPN container (ProtonVPN LU) | - |
| **Transmission** | 9091 | Client BitTorrent | [transmission.talloires.tailfd281f.ts.net](https://transmission.talloires.tailfd281f.ts.net) |
| **Prowlarr** | 9696 | Gestionnaire d'indexeurs | [prowlarr.talloires.tailfd281f.ts.net](https://prowlarr.talloires.tailfd281f.ts.net) |
| **Radarr** | 7878 | Gestion des films | [radarr.talloires.tailfd281f.ts.net](https://radarr.talloires.tailfd281f.ts.net) |
| **Sonarr** | 8989 | Gestion des séries | [sonarr.talloires.tailfd281f.ts.net](https://sonarr.talloires.tailfd281f.ts.net) |
!!! note "Accès LAN également disponible"
- `prowlarr.talloires.local`
- `sonarr.talloires.local`
- `radarr.talloires.local`
- `transmission.talloires.local`**bloqué** (Tailscale uniquement)
## Structure des données
```
/mnt/mediaserver/servarr/
├── torrents/
│ ├── incomplete/ # Downloads en cours
│ └── complete/ # Downloads terminés
└── media/
├── movies/ # Films (Radarr → Jellyfin)
└── tv/ # Séries (Sonarr → Jellyfin)
```
!!! tip "Hardlinks"
Tous les services voient `/data/` qui pointe vers `/mnt/mediaserver/servarr/`.
Cela permet les **hardlinks** — pas de copie, déplacement instantané.
## Configuration réseau
### network_mode: service:gluetun
Tous les services utilisent `network_mode: "service:gluetun"`, ce qui signifie :
- Ils partagent le **même namespace réseau** que gluetun
- Ils communiquent entre eux via **localhost**
- Les ports sont exposés **uniquement par gluetun**
- Pas d'accès direct au réseau Docker
```yaml
# Exemple de configuration
services:
gluetun:
ports:
- "9091:9091" # Transmission
- "9696:9696" # Prowlarr
- "7878:7878" # Radarr
- "8989:8989" # Sonarr
environment:
- FIREWALL_OUTBOUND_SUBNETS=192.168.0.0/16,100.64.0.0/10
prowlarr:
network_mode: "service:gluetun"
depends_on:
gluetun:
condition: service_healthy
```
### Configuration interne des apps
| App | Setting | Valeur |
|-----|---------|--------|
| **Prowlarr** | Download Client → Transmission | `localhost:9091` |
| **Prowlarr** | Apps → Sonarr | `localhost:8989` |
| **Prowlarr** | Apps → Radarr | `localhost:7878` |
| **Sonarr** | Download Client → Transmission | `localhost:9091` |
| **Radarr** | Download Client → Transmission | `localhost:9091` |
!!! warning "Important"
Ne pas utiliser les noms de containers (`prowlarr`, `sonarr`, etc.) car ils ne sont pas résolvables dans ce mode réseau.
## VPN Configuration
### ProtonVPN WireGuard
```bash
# Vérifier l'IP VPN
docker exec gluetun wget -qO- https://ipinfo.io/ip
# Doit retourner une IP ProtonVPN Luxembourg (5.253.204.x)
```
| Paramètre | Valeur |
|-----------|--------|
| Provider | ProtonVPN |
| Type | WireGuard |
| Serveur | Luxembourg (LU#9) |
| Peer Port | 51413 (Transmission) |
### Firewall
```yaml
environment:
# Autorise accès depuis LAN et Tailscale
- FIREWALL_OUTBOUND_SUBNETS=192.168.0.0/16,100.64.0.0/10
# Port forwarding pour seeding
- FIREWALL_VPN_INPUT_PORTS=51413
```
## Caddy / Reverse Proxy
Les services sont exposés via Caddy avec Authelia SSO :
```caddyfile
prowlarr.talloires.local, prowlarr.talloires.tailfd281f.ts.net {
@api path /api/*
handle @api {
reverse_proxy gluetun:9696
}
handle {
import authelia
reverse_proxy gluetun:9696
}
import internal_tls
}
```
!!! info "API sans auth"
Les endpoints `/api/*` sont accessibles sans Authelia pour permettre la communication inter-apps.
## Vérifications
### VPN actif
```bash
docker exec gluetun wget -qO- https://ipinfo.io
```
Doit afficher une IP ProtonVPN (M247/Datacamp), pas ton IP réelle.
### Connectivité interne
```bash
# Depuis gluetun, tester tous les services
docker exec gluetun sh -c 'wget -qO- http://localhost:9696/ping' # Prowlarr
docker exec gluetun sh -c 'wget -qO- http://localhost:8989/ping' # Sonarr
docker exec gluetun sh -c 'wget -qO- http://localhost:7878/ping' # Radarr
```
### Statut des containers
```bash
cd ~/lake/servarr && docker compose ps
```
### Health check gluetun
```bash
docker inspect gluetun --format='{{.State.Health.Status}}'
# Doit retourner: healthy
```
## Fichiers
| Fichier | Chemin |
|---------|--------|
| Docker Compose | `~/lake/servarr/docker-compose.yml` |
| Environment | `~/lake/servarr/.env` |
| Backup | `~/lake/servarr/docker-compose.yml.bak` |
| Données | `/mnt/mediaserver/servarr/` |
## Historique
- **2026-01-12** : Migration complète — tous les services via VPN (network_mode: service:gluetun)
- **2026-01-08** : Déploiement initial avec Gluetun, Transmission, Prowlarr, Radarr, Sonarr

View File

@@ -0,0 +1,162 @@
# Transmission
Service BitTorrent sécurisé via VPN ProtonVPN.
## Accès
| Méthode | URL | Statut |
|---------|-----|--------|
| **Tailscale** | [transmission.talloires.tailfd281f.ts.net](https://transmission.talloires.tailfd281f.ts.net){:target="_blank"} | ✅ Autorisé |
| **LAN** | transmission.talloires.local | ❌ Bloqué |
| **Go-link** | [go/torrent](https://go.talloires.local/torrent){:target="_blank"} | ✅ Redirige vers TS |
## Architecture de sécurité
```
┌─────────────────────────────────────────────────────────────────┐
│ INTERNET │
└─────────────────────────────────────────────────────────────────┘
│ ▲
│ Torrent traffic │ VPN tunnel
▼ │
┌─────────────────┐ ┌─────────────────┐
│ ProtonVPN LU │◄───────────────►│ WireGuard │
│ 5.253.204.x │ encrypted │ container │
└─────────────────┘ └────────┬────────┘
┌────────┴────────┐
│ Transmission │
│ container │
│ (network_mode: │
│ wireguard) │
└────────┬────────┘
┌──────────────┴──────────────┐
│ │
┌─────────┴─────────┐ ┌────────┴────────┐
│ Tailscale DNS │ │ LAN DNS │
│ .ts.net résolu │ │ .local résolu │
│ uniquement sur │ │ sur réseau │
│ devices TS │ │ local │
└─────────┬─────────┘ └────────┬────────┘
│ │
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│ Authelia │ │ 403 Blocked │
│ + Transmission │ │ "Use Tailscale"│
└─────────────────┘ └─────────────────┘
```
## Pourquoi cette configuration ?
### 1. VPN obligatoire (WireGuard → ProtonVPN)
Transmission utilise `network_mode: service:wireguard`. Tout le trafic réseau passe par le conteneur WireGuard, qui :
- Chiffre tout le trafic vers ProtonVPN Luxembourg
- Applique un **kill switch** : si le VPN tombe, aucun trafic ne sort
- Masque l'IP réelle du serveur aux trackers et peers
**IP publique visible** : `5.253.204.x` (ProtonVPN LU)
### 2. Accès Tailscale uniquement
| Risque | Mitigation |
|--------|------------|
| Quelqu'un sur le LAN voit les torrents | Accès LAN bloqué (403) |
| Quelqu'un sur le LAN ajoute des torrents | Accès LAN bloqué (403) |
| Quelqu'un hors Tailscale accède | DNS `.ts.net` non résolvable hors TS |
| Quelqu'un sur Tailscale non autorisé | Authelia (login requis) |
**Principe** : Le DNS `*.tailfd281f.ts.net` n'est résolvable que par les devices connectés au tailnet. C'est une première couche de sécurité "gratuite". Authelia ajoute l'authentification.
### 3. Pourquoi pas d'accès LAN ?
Le LAN est considéré **moins sûr** que Tailscale pour Transmission :
- Un appareil compromis sur le LAN pourrait scanner les ports
- Les guests WiFi pourraient potentiellement accéder
- Pas de logs d'authentification côté LAN
Tailscale garantit que seuls les **devices explicitement autorisés** dans le tailnet peuvent même résoudre le nom DNS.
## Risques résiduels
| Risque | Probabilité | Impact | Mitigation |
|--------|-------------|--------|------------|
| Compromission d'un device TS | Faible | Moyen | Authelia 2FA recommandé |
| Fuite IP si WireGuard crash | Très faible | Élevé | Kill switch iptables |
| Contenu illégal téléchargé | Variable | Élevé | Responsabilité utilisateur |
| DMCA notice | Faible (VPN) | Faible | ProtonVPN no-logs policy |
## Configuration technique
### WireGuard kill switch
```bash
# /home/lionel/lake/p2p/wireguard/wg_confs/wg0.conf
PostUp = iptables -I OUTPUT -o eth0 -d 5.253.204.162 -j ACCEPT
PostUp = iptables -I OUTPUT -o eth0 -d 172.18.0.0/16 -j ACCEPT
PostUp = iptables -I OUTPUT -o eth0 -d 172.19.0.0/16 -j ACCEPT
PostUp = iptables -A OUTPUT -o eth0 -j REJECT
```
Seuls autorisés :
- L'endpoint VPN ProtonVPN
- Les réseaux Docker internes (pour que Caddy puisse atteindre Transmission)
### Caddy configuration
```caddyfile
# LAN - Bloqué
transmission.talloires.local {
respond "Access denied - Use Tailscale" 403
}
# Tailscale - Authelia + Transmission
transmission.talloires.tailfd281f.ts.net {
import authelia
reverse_proxy wireguard:9091
}
```
### Docker network
```yaml
# Transmission utilise le réseau de WireGuard
transmission:
network_mode: service:wireguard
depends_on:
- wireguard
# WireGuard est sur lake_net pour être joignable par Caddy
wireguard:
networks:
- lake_net
```
## Utilisation
1. Aller sur [go/torrent](https://go.talloires.local/torrent){:target="_blank"} (depuis un device Tailscale)
2. S'authentifier via Authelia
3. Ajouter un torrent via l'interface web (magnet link ou fichier .torrent)
4. Les téléchargements arrivent dans `/mnt/mediaserver/transmission/downloads/`
## Vérification VPN
Pour confirmer que le trafic passe bien par le VPN :
```bash
# IP publique vue par Transmission
docker exec wireguard curl -s https://ifconfig.me
# Devrait retourner 5.253.204.x (ProtonVPN LU)
```
## Fichiers
| Fichier | Description |
|---------|-------------|
| `~/lake/p2p/docker-compose.yml` | Config Docker WireGuard + Transmission |
| `~/lake/p2p/wireguard/wg_confs/wg0.conf` | Config WireGuard + kill switch |
| `~/lake/p2p/transmission/settings.json` | Config Transmission |
| `/mnt/mediaserver/transmission/downloads/` | Dossier téléchargements |

View File

@@ -1,68 +1,58 @@
site_name: Talloires v2.0 Documentation
site_description: Documentation infrastructure Talloires v2.0
site_name: Talloires Documentation
site_description: Infrastructure documentation for Talloires homelab
site_author: Lionel
site_url: http://docs.talloires.local
theme:
name: material
language: fr
palette:
# Light mode
- media: "(prefers-color-scheme: light)"
scheme: default
primary: indigo
accent: indigo
toggle:
icon: material/brightness-7
name: Switch to dark mode
# Dark mode
- media: "(prefers-color-scheme: dark)"
scheme: slate
primary: indigo
accent: indigo
toggle:
icon: material/brightness-4
name: Switch to light mode
scheme: slate
primary: blue
accent: cyan
features:
- navigation.instant
- navigation.tracking
- navigation.tabs
- navigation.sections
- navigation.expand
- navigation.top
- search.suggest
- search.highlight
- content.code.copy
markdown_extensions:
- admonition
- pymdownx.details
- pymdownx.superfences
- pymdownx.tabbed:
alternate_style: true
- pymdownx.emoji:
emoji_index: !!python/name:material.extensions.emoji.twemoji
emoji_generator: !!python/name:material.extensions.emoji.to_svg
- tables
- toc:
permalink: true
- attr_list # Enable target="_blank" for links
- toc.integrate
custom_dir: overrides
nav:
- Changelog:
- 2025-12-31: changelog/2025-12-31.md
- Accueil: index.md
- Services:
- Vue d'ensemble: services/overview.md
- Home: index.md
- Infrastructure:
- Vue d'ensemble: infra/overview.md
- Vault (v1.0):
- Archive v1.0: vault/README.md
- Documentation v1.0: vault/index-v1.md
- Services v1.0: vault/services-v1/overview.md
- Configuration v1.0: vault/config/docker-stacks.md
- Overview: infra/overview.md
- Réseau & Accès: infra/network.md
- Problèmes 2025-12-31: infra/issues-2025-12-31.md
- Recommandations: infra/recommendations.md
- Migration SSD: infra/ssd-migration.md
- Services:
- Overview: services/overview.md
- Transmission: services/transmission.md
- Servarr: services/servarr.md
- Helmarr: services/helmarr.md
- Homarr: services/homarr.md
- Changelog:
- 2026-01-12: changelog/2026-01-12.md
- 2026-01-03: changelog/2026-01-03.md
- 2025-12-31: changelog/2025-12-31.md
- Vault:
- README: vault/README.md
- Config:
- Caddy: vault/config/caddy.md
- Docker Stacks: vault/config/docker-stacks.md
- Network: vault/config/network.md
- Troubleshooting: vault/config/troubleshooting.md
- Reference:
- Commands: vault/reference/commands.md
- Ports: vault/reference/ports.md
- Scripts: vault/reference/scripts.md
extra:
social:
- icon: fontawesome/brands/github
link: https://git.talloires.local
markdown_extensions:
- pymdownx.highlight
- pymdownx.superfences:
custom_fences:
- name: mermaid
class: mermaid
format: !!python/name:pymdownx.superfences.fence_code_format
- pymdownx.tabbed
- admonition
- tables
- attr_list

19
overrides/404.html Normal file
View File

@@ -0,0 +1,19 @@
{% extends "base.html" %}
{% block content %}
<h1>🔍 Page introuvable</h1>
<p>La page que vous cherchez n'existe pas.</p>
<h2>Go Links - Accès rapides</h2>
<table>
<tr><th>Go Link</th><th>Service</th></tr>
<tr><td><a href="https://go.talloires.local/jellyfin" target="_blank">go/jellyfin</a></td><td>Media streaming</td></tr>
<tr><td><a href="https://go.talloires.local/git" target="_blank">go/git</a></td><td>Git repositories</td></tr>
<tr><td><a href="https://go.talloires.local/ha" target="_blank">go/ha</a></td><td>Home Assistant</td></tr>
<tr><td><a href="https://go.talloires.local/docs" target="_blank">go/docs</a></td><td>Documentation</td></tr>
<tr><td><a href="https://go.talloires.local/docker" target="_blank">go/docker</a></td><td>Docker management</td></tr>
<tr><td><a href="https://go.talloires.local/logs" target="_blank">go/logs</a></td><td>Container logs</td></tr>
<tr><td><a href="https://go.talloires.local/netdata" target="_blank">go/netdata</a></td><td>Monitoring</td></tr>
</table>
<p><a href="/">🏠 Retour à l'accueil</a></p>
{% endblock %}

1247
site/404.html Normal file

File diff suppressed because it is too large Load Diff

1317
site/404/index.html Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,18 @@
/*!
* Lunr languages, `Danish` language
* https://github.com/MihaiValentin/lunr-languages
*
* Copyright 2014, Mihai Valentin
* http://www.mozilla.org/MPL/
*/
/*!
* based on
* Snowball JavaScript Library v0.3
* http://code.google.com/p/urim/
* http://snowball.tartarus.org/
*
* Copyright 2010, Oleg Mazko
* http://www.mozilla.org/MPL/
*/
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.da=function(){this.pipeline.reset(),this.pipeline.add(e.da.trimmer,e.da.stopWordFilter,e.da.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.da.stemmer))},e.da.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA--",e.da.trimmer=e.trimmerSupport.generateTrimmer(e.da.wordCharacters),e.Pipeline.registerFunction(e.da.trimmer,"trimmer-da"),e.da.stemmer=function(){var r=e.stemmerSupport.Among,i=e.stemmerSupport.SnowballProgram,n=new function(){function e(){var e,r=f.cursor+3;if(d=f.limit,0<=r&&r<=f.limit){for(a=r;;){if(e=f.cursor,f.in_grouping(w,97,248)){f.cursor=e;break}if(f.cursor=e,e>=f.limit)return;f.cursor++}for(;!f.out_grouping(w,97,248);){if(f.cursor>=f.limit)return;f.cursor++}d=f.cursor,d<a&&(d=a)}}function n(){var e,r;if(f.cursor>=d&&(r=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,e=f.find_among_b(c,32),f.limit_backward=r,e))switch(f.bra=f.cursor,e){case 1:f.slice_del();break;case 2:f.in_grouping_b(p,97,229)&&f.slice_del()}}function t(){var e,r=f.limit-f.cursor;f.cursor>=d&&(e=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,f.find_among_b(l,4)?(f.bra=f.cursor,f.limit_backward=e,f.cursor=f.limit-r,f.cursor>f.limit_backward&&(f.cursor--,f.bra=f.cursor,f.slice_del())):f.limit_backward=e)}function s(){var e,r,i,n=f.limit-f.cursor;if(f.ket=f.cursor,f.eq_s_b(2,"st")&&(f.bra=f.cursor,f.eq_s_b(2,"ig")&&f.slice_del()),f.cursor=f.limit-n,f.cursor>=d&&(r=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,e=f.find_among_b(m,5),f.limit_backward=r,e))switch(f.bra=f.cursor,e){case 1:f.slice_del(),i=f.limit-f.cursor,t(),f.cursor=f.limit-i;break;case 2:f.slice_from("løs")}}function o(){var e;f.cursor>=d&&(e=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,f.out_grouping_b(w,97,248)?(f.bra=f.cursor,u=f.slice_to(u),f.limit_backward=e,f.eq_v_b(u)&&f.slice_del()):f.limit_backward=e)}var a,d,u,c=[new r("hed",-1,1),new r("ethed",0,1),new r("ered",-1,1),new r("e",-1,1),new r("erede",3,1),new r("ende",3,1),new r("erende",5,1),new r("ene",3,1),new r("erne",3,1),new r("ere",3,1),new r("en",-1,1),new r("heden",10,1),new r("eren",10,1),new r("er",-1,1),new r("heder",13,1),new r("erer",13,1),new r("s",-1,2),new r("heds",16,1),new r("es",16,1),new r("endes",18,1),new r("erendes",19,1),new r("enes",18,1),new r("ernes",18,1),new r("eres",18,1),new r("ens",16,1),new r("hedens",24,1),new r("erens",24,1),new r("ers",16,1),new r("ets",16,1),new r("erets",28,1),new r("et",-1,1),new r("eret",30,1)],l=[new r("gd",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1)],m=[new r("ig",-1,1),new r("lig",0,1),new r("elig",1,1),new r("els",-1,1),new r("løst",-1,2)],w=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],p=[239,254,42,3,0,0,0,0,0,0,0,0,0,0,0,0,16],f=new i;this.setCurrent=function(e){f.setCurrent(e)},this.getCurrent=function(){return f.getCurrent()},this.stem=function(){var r=f.cursor;return e(),f.limit_backward=r,f.cursor=f.limit,n(),f.cursor=f.limit,t(),f.cursor=f.limit,s(),f.cursor=f.limit,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}}(),e.Pipeline.registerFunction(e.da.stemmer,"stemmer-da"),e.da.stopWordFilter=e.generateStopWordFilter("ad af alle alt anden at blev blive bliver da de dem den denne der deres det dette dig din disse dog du efter eller en end er et for fra ham han hans har havde have hende hendes her hos hun hvad hvis hvor i ikke ind jeg jer jo kunne man mange med meget men mig min mine mit mod ned noget nogle nu når og også om op os over på selv sig sin sine sit skal skulle som sådan thi til ud under var vi vil ville vor være været".split(" ")),e.Pipeline.registerFunction(e.da.stopWordFilter,"stopWordFilter-da")}});

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.hi=function(){this.pipeline.reset(),this.pipeline.add(e.hi.trimmer,e.hi.stopWordFilter,e.hi.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.hi.stemmer))},e.hi.wordCharacters="ऀ-ःऄ-एऐ-टठ-यर-िी-ॏॐ-य़ॠ-९॰-ॿa-zA-Z--0-9-",e.hi.trimmer=e.trimmerSupport.generateTrimmer(e.hi.wordCharacters),e.Pipeline.registerFunction(e.hi.trimmer,"trimmer-hi"),e.hi.stopWordFilter=e.generateStopWordFilter("अत अपना अपनी अपने अभी अंदर आदि आप इत्यादि इन इनका इन्हीं इन्हें इन्हों इस इसका इसकी इसके इसमें इसी इसे उन उनका उनकी उनके उनको उन्हीं उन्हें उन्हों उस उसके उसी उसे एक एवं एस ऐसे और कई कर करता करते करना करने करें कहते कहा का काफ़ी कि कितना किन्हें किन्हों किया किर किस किसी किसे की कुछ कुल के को कोई कौन कौनसा गया घर जब जहाँ जा जितना जिन जिन्हें जिन्हों जिस जिसे जीधर जैसा जैसे जो तक तब तरह तिन तिन्हें तिन्हों तिस तिसे तो था थी थे दबारा दिया दुसरा दूसरे दो द्वारा न नके नहीं ना निहायत नीचे ने पर पहले पूरा पे फिर बनी बही बहुत बाद बाला बिलकुल भी भीतर मगर मानो मे में यदि यह यहाँ यही या यिह ये रखें रहा रहे ऱ्वासा लिए लिये लेकिन व वग़ैरह वर्ग वह वहाँ वहीं वाले वुह वे वो सकता सकते सबसे सभी साथ साबुत साभ सारा से सो संग ही हुआ हुई हुए है हैं हो होता होती होते होना होने".split(" ")),e.hi.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var r=e.wordcut;r.init(),e.hi.tokenizer=function(i){if(!arguments.length||null==i||void 0==i)return[];if(Array.isArray(i))return i.map(function(r){return isLunr2?new e.Token(r.toLowerCase()):r.toLowerCase()});var t=i.toString().toLowerCase().replace(/^\s+/,"");return r.cut(t).split("|")},e.Pipeline.registerFunction(e.hi.stemmer,"stemmer-hi"),e.Pipeline.registerFunction(e.hi.stopWordFilter,"stopWordFilter-hi")}});

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.hy=function(){this.pipeline.reset(),this.pipeline.add(e.hy.trimmer,e.hy.stopWordFilter)},e.hy.wordCharacters="[A-Za-z԰-֏ff-ﭏ]",e.hy.trimmer=e.trimmerSupport.generateTrimmer(e.hy.wordCharacters),e.Pipeline.registerFunction(e.hy.trimmer,"trimmer-hy"),e.hy.stopWordFilter=e.generateStopWordFilter("դու և եք էիր էիք հետո նաև նրանք որը վրա է որ պիտի են այս մեջ ն իր ու ի այդ որոնք այն կամ էր մի ես համար այլ իսկ էին ենք հետ ին թ էինք մենք նրա նա դուք եմ էի ըստ որպես ում".split(" ")),e.Pipeline.registerFunction(e.hy.stopWordFilter,"stopWordFilter-hy"),e.hy.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}(),e.Pipeline.registerFunction(e.hy.stemmer,"stemmer-hy")}});

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r="2"==e.version[0];e.ja=function(){this.pipeline.reset(),this.pipeline.add(e.ja.trimmer,e.ja.stopWordFilter,e.ja.stemmer),r?this.tokenizer=e.ja.tokenizer:(e.tokenizer&&(e.tokenizer=e.ja.tokenizer),this.tokenizerFn&&(this.tokenizerFn=e.ja.tokenizer))};var t=new e.TinySegmenter;e.ja.tokenizer=function(i){var n,o,s,p,a,u,m,l,c,f;if(!arguments.length||null==i||void 0==i)return[];if(Array.isArray(i))return i.map(function(t){return r?new e.Token(t.toLowerCase()):t.toLowerCase()});for(o=i.toString().toLowerCase().replace(/^\s+/,""),n=o.length-1;n>=0;n--)if(/\S/.test(o.charAt(n))){o=o.substring(0,n+1);break}for(a=[],s=o.length,c=0,l=0;c<=s;c++)if(u=o.charAt(c),m=c-l,u.match(/\s/)||c==s){if(m>0)for(p=t.segment(o.slice(l,c)).filter(function(e){return!!e}),f=l,n=0;n<p.length;n++)r?a.push(new e.Token(p[n],{position:[f,p[n].length],index:a.length})):a.push(p[n]),f+=p[n].length;l=c+1}return a},e.ja.stemmer=function(){return function(e){return e}}(),e.Pipeline.registerFunction(e.ja.stemmer,"stemmer-ja"),e.ja.wordCharacters="一二三四五六七八九十百千万億兆一-龠々〆ヵヶぁ-んァ-ヴーア-ン゙a-zA-Z--0-9-",e.ja.trimmer=e.trimmerSupport.generateTrimmer(e.ja.wordCharacters),e.Pipeline.registerFunction(e.ja.trimmer,"trimmer-ja"),e.ja.stopWordFilter=e.generateStopWordFilter("これ それ あれ この その あの ここ そこ あそこ こちら どこ だれ なに なん 何 私 貴方 貴方方 我々 私達 あの人 あのかた 彼女 彼 です あります おります います は が の に を で え から まで より も どの と し それで しかし".split(" ")),e.Pipeline.registerFunction(e.ja.stopWordFilter,"stopWordFilter-ja"),e.jp=e.ja,e.Pipeline.registerFunction(e.jp.stemmer,"stemmer-jp"),e.Pipeline.registerFunction(e.jp.trimmer,"trimmer-jp"),e.Pipeline.registerFunction(e.jp.stopWordFilter,"stopWordFilter-jp")}});

View File

@@ -0,0 +1 @@
module.exports=require("./lunr.ja");

View File

@@ -0,0 +1 @@
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.kn=function(){this.pipeline.reset(),this.pipeline.add(e.kn.trimmer,e.kn.stopWordFilter,e.kn.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.kn.stemmer))},e.kn.wordCharacters="ಀ-಄ಅ-ಔಕ-ಹಾ-ೌ಼-ಽೕ-ೖೝ-ೞೠ-ೡೢ-ೣ೤೥೦-೯ೱ-ೳ",e.kn.trimmer=e.trimmerSupport.generateTrimmer(e.kn.wordCharacters),e.Pipeline.registerFunction(e.kn.trimmer,"trimmer-kn"),e.kn.stopWordFilter=e.generateStopWordFilter("ಮತ್ತು ಈ ಒಂದು ರಲ್ಲಿ ಹಾಗೂ ಎಂದು ಅಥವಾ ಇದು ರ ಅವರು ಎಂಬ ಮೇಲೆ ಅವರ ತನ್ನ ಆದರೆ ತಮ್ಮ ನಂತರ ಮೂಲಕ ಹೆಚ್ಚು ನ ಆ ಕೆಲವು ಅನೇಕ ಎರಡು ಹಾಗು ಪ್ರಮುಖ ಇದನ್ನು ಇದರ ಸುಮಾರು ಅದರ ಅದು ಮೊದಲ ಬಗ್ಗೆ ನಲ್ಲಿ ರಂದು ಇತರ ಅತ್ಯಂತ ಹೆಚ್ಚಿನ ಸಹ ಸಾಮಾನ್ಯವಾಗಿ ನೇ ಹಲವಾರು ಹೊಸ ದಿ ಕಡಿಮೆ ಯಾವುದೇ ಹೊಂದಿದೆ ದೊಡ್ಡ ಅನ್ನು ಇವರು ಪ್ರಕಾರ ಇದೆ ಮಾತ್ರ ಕೂಡ ಇಲ್ಲಿ ಎಲ್ಲಾ ವಿವಿಧ ಅದನ್ನು ಹಲವು ರಿಂದ ಕೇವಲ ದ ದಕ್ಷಿಣ ಗೆ ಅವನ ಅತಿ ನೆಯ ಬಹಳ ಕೆಲಸ ಎಲ್ಲ ಪ್ರತಿ ಇತ್ಯಾದಿ ಇವು ಬೇರೆ ಹೀಗೆ ನಡುವೆ ಇದಕ್ಕೆ ಎಸ್ ಇವರ ಮೊದಲು ಶ್ರೀ ಮಾಡುವ ಇದರಲ್ಲಿ ರೀತಿಯ ಮಾಡಿದ ಕಾಲ ಅಲ್ಲಿ ಮಾಡಲು ಅದೇ ಈಗ ಅವು ಗಳು ಎ ಎಂಬುದು ಅವನು ಅಂದರೆ ಅವರಿಗೆ ಇರುವ ವಿಶೇಷ ಮುಂದೆ ಅವುಗಳ ಮುಂತಾದ ಮೂಲ ಬಿ ಮೀ ಒಂದೇ ಇನ್ನೂ ಹೆಚ್ಚಾಗಿ ಮಾಡಿ ಅವರನ್ನು ಇದೇ ಯ ರೀತಿಯಲ್ಲಿ ಜೊತೆ ಅದರಲ್ಲಿ ಮಾಡಿದರು ನಡೆದ ಆಗ ಮತ್ತೆ ಪೂರ್ವ ಆತ ಬಂದ ಯಾವ ಒಟ್ಟು ಇತರೆ ಹಿಂದೆ ಪ್ರಮಾಣದ ಗಳನ್ನು ಕುರಿತು ಯು ಆದ್ದರಿಂದ ಅಲ್ಲದೆ ನಗರದ ಮೇಲಿನ ಏಕೆಂದರೆ ರಷ್ಟು ಎಂಬುದನ್ನು ಬಾರಿ ಎಂದರೆ ಹಿಂದಿನ ಆದರೂ ಆದ ಸಂಬಂಧಿಸಿದ ಮತ್ತೊಂದು ಸಿ ಆತನ ".split(" ")),e.kn.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var r=e.wordcut;r.init(),e.kn.tokenizer=function(t){if(!arguments.length||null==t||void 0==t)return[];if(Array.isArray(t))return t.map(function(r){return isLunr2?new e.Token(r.toLowerCase()):r.toLowerCase()});var n=t.toString().toLowerCase().replace(/^\s+/,"");return r.cut(n).split("|")},e.Pipeline.registerFunction(e.kn.stemmer,"stemmer-kn"),e.Pipeline.registerFunction(e.kn.stopWordFilter,"stopWordFilter-kn")}});

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
!function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(e.lunr)}(this,function(){return function(e){e.multiLanguage=function(){for(var t=Array.prototype.slice.call(arguments),i=t.join("-"),r="",n=[],s=[],p=0;p<t.length;++p)"en"==t[p]?(r+="\\w",n.unshift(e.stopWordFilter),n.push(e.stemmer),s.push(e.stemmer)):(r+=e[t[p]].wordCharacters,e[t[p]].stopWordFilter&&n.unshift(e[t[p]].stopWordFilter),e[t[p]].stemmer&&(n.push(e[t[p]].stemmer),s.push(e[t[p]].stemmer)));var o=e.trimmerSupport.generateTrimmer(r);return e.Pipeline.registerFunction(o,"lunr-multi-trimmer-"+i),n.unshift(o),function(){this.pipeline.reset(),this.pipeline.add.apply(this.pipeline,n),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add.apply(this.searchPipeline,s))}}}});

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,18 @@
/*!
* Lunr languages, `Norwegian` language
* https://github.com/MihaiValentin/lunr-languages
*
* Copyright 2014, Mihai Valentin
* http://www.mozilla.org/MPL/
*/
/*!
* based on
* Snowball JavaScript Library v0.3
* http://code.google.com/p/urim/
* http://snowball.tartarus.org/
*
* Copyright 2010, Oleg Mazko
* http://www.mozilla.org/MPL/
*/
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.no=function(){this.pipeline.reset(),this.pipeline.add(e.no.trimmer,e.no.stopWordFilter,e.no.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.no.stemmer))},e.no.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA--",e.no.trimmer=e.trimmerSupport.generateTrimmer(e.no.wordCharacters),e.Pipeline.registerFunction(e.no.trimmer,"trimmer-no"),e.no.stemmer=function(){var r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,i=new function(){function e(){var e,r=w.cursor+3;if(a=w.limit,0<=r||r<=w.limit){for(s=r;;){if(e=w.cursor,w.in_grouping(d,97,248)){w.cursor=e;break}if(e>=w.limit)return;w.cursor=e+1}for(;!w.out_grouping(d,97,248);){if(w.cursor>=w.limit)return;w.cursor++}a=w.cursor,a<s&&(a=s)}}function i(){var e,r,n;if(w.cursor>=a&&(r=w.limit_backward,w.limit_backward=a,w.ket=w.cursor,e=w.find_among_b(m,29),w.limit_backward=r,e))switch(w.bra=w.cursor,e){case 1:w.slice_del();break;case 2:n=w.limit-w.cursor,w.in_grouping_b(c,98,122)?w.slice_del():(w.cursor=w.limit-n,w.eq_s_b(1,"k")&&w.out_grouping_b(d,97,248)&&w.slice_del());break;case 3:w.slice_from("er")}}function t(){var e,r=w.limit-w.cursor;w.cursor>=a&&(e=w.limit_backward,w.limit_backward=a,w.ket=w.cursor,w.find_among_b(u,2)?(w.bra=w.cursor,w.limit_backward=e,w.cursor=w.limit-r,w.cursor>w.limit_backward&&(w.cursor--,w.bra=w.cursor,w.slice_del())):w.limit_backward=e)}function o(){var e,r;w.cursor>=a&&(r=w.limit_backward,w.limit_backward=a,w.ket=w.cursor,e=w.find_among_b(l,11),e?(w.bra=w.cursor,w.limit_backward=r,1==e&&w.slice_del()):w.limit_backward=r)}var s,a,m=[new r("a",-1,1),new r("e",-1,1),new r("ede",1,1),new r("ande",1,1),new r("ende",1,1),new r("ane",1,1),new r("ene",1,1),new r("hetene",6,1),new r("erte",1,3),new r("en",-1,1),new r("heten",9,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",12,1),new r("s",-1,2),new r("as",14,1),new r("es",14,1),new r("edes",16,1),new r("endes",16,1),new r("enes",16,1),new r("hetenes",19,1),new r("ens",14,1),new r("hetens",21,1),new r("ers",14,1),new r("ets",14,1),new r("et",-1,1),new r("het",25,1),new r("ert",-1,3),new r("ast",-1,1)],u=[new r("dt",-1,-1),new r("vt",-1,-1)],l=[new r("leg",-1,1),new r("eleg",0,1),new r("ig",-1,1),new r("eig",2,1),new r("lig",2,1),new r("elig",4,1),new r("els",-1,1),new r("lov",-1,1),new r("elov",7,1),new r("slov",7,1),new r("hetslov",9,1)],d=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],c=[119,125,149,1],w=new n;this.setCurrent=function(e){w.setCurrent(e)},this.getCurrent=function(){return w.getCurrent()},this.stem=function(){var r=w.cursor;return e(),w.limit_backward=r,w.cursor=w.limit,i(),w.cursor=w.limit,t(),w.cursor=w.limit,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}}(),e.Pipeline.registerFunction(e.no.stemmer,"stemmer-no"),e.no.stopWordFilter=e.generateStopWordFilter("alle at av bare begge ble blei bli blir blitt både båe da de deg dei deim deira deires dem den denne der dere deres det dette di din disse ditt du dykk dykkar då eg ein eit eitt eller elles en enn er et ett etter for fordi fra før ha hadde han hans har hennar henne hennes her hjå ho hoe honom hoss hossen hun hva hvem hver hvilke hvilken hvis hvor hvordan hvorfor i ikke ikkje ikkje ingen ingi inkje inn inni ja jeg kan kom korleis korso kun kunne kva kvar kvarhelst kven kvi kvifor man mange me med medan meg meget mellom men mi min mine mitt mot mykje ned no noe noen noka noko nokon nokor nokre nå når og også om opp oss over på samme seg selv si si sia sidan siden sin sine sitt sjøl skal skulle slik so som som somme somt så sånn til um upp ut uten var vart varte ved vere verte vi vil ville vore vors vort vår være være vært å".split(" ")),e.Pipeline.registerFunction(e.no.stopWordFilter,"stopWordFilter-no")}});

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.sa=function(){this.pipeline.reset(),this.pipeline.add(e.sa.trimmer,e.sa.stopWordFilter,e.sa.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.sa.stemmer))},e.sa.wordCharacters="ऀ-ःऄ-एऐ-टठ-यर-िी-ॏॐ-य़ॠ-९॰-ॿ꣠-꣱ꣲ-ꣷ꣸-ꣻ꣼-ꣽꣾ-ꣿᆰ0-ᆰ9",e.sa.trimmer=e.trimmerSupport.generateTrimmer(e.sa.wordCharacters),e.Pipeline.registerFunction(e.sa.trimmer,"trimmer-sa"),e.sa.stopWordFilter=e.generateStopWordFilter('तथा अयम्‌ एकम्‌ इत्यस्मिन्‌ तथा तत्‌ वा अयम्‌ इत्यस्य ते आहूत उपरि तेषाम्‌ किन्तु तेषाम्‌ तदा इत्यनेन अधिकः इत्यस्य तत्‌ केचन बहवः द्वि तथा महत्वपूर्णः अयम्‌ अस्य विषये अयं अस्ति तत्‌ प्रथमः विषये इत्युपरि इत्युपरि इतर अधिकतमः अधिकः अपि सामान्यतया ठ इतरेतर नूतनम्‌ द न्यूनम्‌ कश्चित्‌ वा विशालः द सः अस्ति तदनुसारम् तत्र अस्ति केवलम्‌ अपि अत्र सर्वे विविधाः तत्‌ बहवः यतः इदानीम्‌ द दक्षिण इत्यस्मै तस्य उपरि नथ अतीव कार्यम्‌ सर्वे एकैकम्‌ इत्यादि। एते सन्ति उत इत्थम्‌ मध्ये एतदर्थं . स कस्य प्रथमः श्री. करोति अस्मिन् प्रकारः निर्मिता कालः तत्र कर्तुं समान अधुना ते सन्ति स एकः अस्ति सः अर्थात् तेषां कृते . स्थितम् विशेषः अग्रिम तेषाम्‌ समान स्रोतः ख म समान इदानीमपि अधिकतया करोतु ते समान इत्यस्य वीथी सह यस्मिन् कृतवान्‌ धृतः तदा पुनः पूर्वं सः आगतः किम्‌ कुल इतर पुरा मात्रा स विषये उ अतएव अपि नगरस्य उपरि यतः प्रतिशतं कतरः कालः साधनानि भूत तथापि जात सम्बन्धि अन्यत्‌ ग अतः अस्माकं स्वकीयाः अस्माकं इदानीं अन्तः इत्यादयः भवन्तः इत्यादयः एते एताः तस्य अस्य इदम् एते तेषां तेषां तेषां तान् तेषां तेषां तेषां समानः सः एकः च तादृशाः बहवः अन्ये च वदन्ति यत् कियत् कस्मै कस्मै यस्मै यस्मै यस्मै यस्मै न अतिनीचः किन्तु प्रथमं सम्पूर्णतया ततः चिरकालानन्तरं पुस्तकं सम्पूर्णतया अन्तः किन्तु अत्र वा इह इव श्रद्धाय अवशिष्यते परन्तु अन्ये वर्गाः सन्ति ते सन्ति शक्नुवन्ति सर्वे मिलित्वा सर्वे एकत्र"'.split(" ")),e.sa.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var r=e.wordcut;r.init(),e.sa.tokenizer=function(t){if(!arguments.length||null==t||void 0==t)return[];if(Array.isArray(t))return t.map(function(r){return isLunr2?new e.Token(r.toLowerCase()):r.toLowerCase()});var i=t.toString().toLowerCase().replace(/^\s+/,"");return r.cut(i).split("|")},e.Pipeline.registerFunction(e.sa.stemmer,"stemmer-sa"),e.Pipeline.registerFunction(e.sa.stopWordFilter,"stopWordFilter-sa")}});

View File

@@ -0,0 +1 @@
!function(r,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(r.lunr)}(this,function(){return function(r){r.stemmerSupport={Among:function(r,t,i,s){if(this.toCharArray=function(r){for(var t=r.length,i=new Array(t),s=0;s<t;s++)i[s]=r.charCodeAt(s);return i},!r&&""!=r||!t&&0!=t||!i)throw"Bad Among initialisation: s:"+r+", substring_i: "+t+", result: "+i;this.s_size=r.length,this.s=this.toCharArray(r),this.substring_i=t,this.result=i,this.method=s},SnowballProgram:function(){var r;return{bra:0,ket:0,limit:0,cursor:0,limit_backward:0,setCurrent:function(t){r=t,this.cursor=0,this.limit=t.length,this.limit_backward=0,this.bra=this.cursor,this.ket=this.limit},getCurrent:function(){var t=r;return r=null,t},in_grouping:function(t,i,s){if(this.cursor<this.limit){var e=r.charCodeAt(this.cursor);if(e<=s&&e>=i&&(e-=i,t[e>>3]&1<<(7&e)))return this.cursor++,!0}return!1},in_grouping_b:function(t,i,s){if(this.cursor>this.limit_backward){var e=r.charCodeAt(this.cursor-1);if(e<=s&&e>=i&&(e-=i,t[e>>3]&1<<(7&e)))return this.cursor--,!0}return!1},out_grouping:function(t,i,s){if(this.cursor<this.limit){var e=r.charCodeAt(this.cursor);if(e>s||e<i)return this.cursor++,!0;if(e-=i,!(t[e>>3]&1<<(7&e)))return this.cursor++,!0}return!1},out_grouping_b:function(t,i,s){if(this.cursor>this.limit_backward){var e=r.charCodeAt(this.cursor-1);if(e>s||e<i)return this.cursor--,!0;if(e-=i,!(t[e>>3]&1<<(7&e)))return this.cursor--,!0}return!1},eq_s:function(t,i){if(this.limit-this.cursor<t)return!1;for(var s=0;s<t;s++)if(r.charCodeAt(this.cursor+s)!=i.charCodeAt(s))return!1;return this.cursor+=t,!0},eq_s_b:function(t,i){if(this.cursor-this.limit_backward<t)return!1;for(var s=0;s<t;s++)if(r.charCodeAt(this.cursor-t+s)!=i.charCodeAt(s))return!1;return this.cursor-=t,!0},find_among:function(t,i){for(var s=0,e=i,n=this.cursor,u=this.limit,o=0,h=0,c=!1;;){for(var a=s+(e-s>>1),f=0,l=o<h?o:h,_=t[a],m=l;m<_.s_size;m++){if(n+l==u){f=-1;break}if(f=r.charCodeAt(n+l)-_.s[m])break;l++}if(f<0?(e=a,h=l):(s=a,o=l),e-s<=1){if(s>0||e==s||c)break;c=!0}}for(;;){var _=t[s];if(o>=_.s_size){if(this.cursor=n+_.s_size,!_.method)return _.result;var b=_.method();if(this.cursor=n+_.s_size,b)return _.result}if((s=_.substring_i)<0)return 0}},find_among_b:function(t,i){for(var s=0,e=i,n=this.cursor,u=this.limit_backward,o=0,h=0,c=!1;;){for(var a=s+(e-s>>1),f=0,l=o<h?o:h,_=t[a],m=_.s_size-1-l;m>=0;m--){if(n-l==u){f=-1;break}if(f=r.charCodeAt(n-1-l)-_.s[m])break;l++}if(f<0?(e=a,h=l):(s=a,o=l),e-s<=1){if(s>0||e==s||c)break;c=!0}}for(;;){var _=t[s];if(o>=_.s_size){if(this.cursor=n-_.s_size,!_.method)return _.result;var b=_.method();if(this.cursor=n-_.s_size,b)return _.result}if((s=_.substring_i)<0)return 0}},replace_s:function(t,i,s){var e=s.length-(i-t),n=r.substring(0,t),u=r.substring(i);return r=n+s+u,this.limit+=e,this.cursor>=i?this.cursor+=e:this.cursor>t&&(this.cursor=t),e},slice_check:function(){if(this.bra<0||this.bra>this.ket||this.ket>this.limit||this.limit>r.length)throw"faulty slice operation"},slice_from:function(r){this.slice_check(),this.replace_s(this.bra,this.ket,r)},slice_del:function(){this.slice_from("")},insert:function(r,t,i){var s=this.replace_s(r,t,i);r<=this.bra&&(this.bra+=s),r<=this.ket&&(this.ket+=s)},slice_to:function(){return this.slice_check(),r.substring(this.bra,this.ket)},eq_v_b:function(r){return this.eq_s_b(r.length,r)}}}},r.trimmerSupport={generateTrimmer:function(r){var t=new RegExp("^[^"+r+"]+"),i=new RegExp("[^"+r+"]+$");return function(r){return"function"==typeof r.update?r.update(function(r){return r.replace(t,"").replace(i,"")}):r.replace(t,"").replace(i,"")}}}}});

View File

@@ -0,0 +1,18 @@
/*!
* Lunr languages, `Swedish` language
* https://github.com/MihaiValentin/lunr-languages
*
* Copyright 2014, Mihai Valentin
* http://www.mozilla.org/MPL/
*/
/*!
* based on
* Snowball JavaScript Library v0.3
* http://code.google.com/p/urim/
* http://snowball.tartarus.org/
*
* Copyright 2010, Oleg Mazko
* http://www.mozilla.org/MPL/
*/
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.sv=function(){this.pipeline.reset(),this.pipeline.add(e.sv.trimmer,e.sv.stopWordFilter,e.sv.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.sv.stemmer))},e.sv.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA--",e.sv.trimmer=e.trimmerSupport.generateTrimmer(e.sv.wordCharacters),e.Pipeline.registerFunction(e.sv.trimmer,"trimmer-sv"),e.sv.stemmer=function(){var r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,t=new function(){function e(){var e,r=w.cursor+3;if(o=w.limit,0<=r||r<=w.limit){for(a=r;;){if(e=w.cursor,w.in_grouping(l,97,246)){w.cursor=e;break}if(w.cursor=e,w.cursor>=w.limit)return;w.cursor++}for(;!w.out_grouping(l,97,246);){if(w.cursor>=w.limit)return;w.cursor++}o=w.cursor,o<a&&(o=a)}}function t(){var e,r=w.limit_backward;if(w.cursor>=o&&(w.limit_backward=o,w.cursor=w.limit,w.ket=w.cursor,e=w.find_among_b(u,37),w.limit_backward=r,e))switch(w.bra=w.cursor,e){case 1:w.slice_del();break;case 2:w.in_grouping_b(d,98,121)&&w.slice_del()}}function i(){var e=w.limit_backward;w.cursor>=o&&(w.limit_backward=o,w.cursor=w.limit,w.find_among_b(c,7)&&(w.cursor=w.limit,w.ket=w.cursor,w.cursor>w.limit_backward&&(w.bra=--w.cursor,w.slice_del())),w.limit_backward=e)}function s(){var e,r;if(w.cursor>=o){if(r=w.limit_backward,w.limit_backward=o,w.cursor=w.limit,w.ket=w.cursor,e=w.find_among_b(m,5))switch(w.bra=w.cursor,e){case 1:w.slice_del();break;case 2:w.slice_from("lös");break;case 3:w.slice_from("full")}w.limit_backward=r}}var a,o,u=[new r("a",-1,1),new r("arna",0,1),new r("erna",0,1),new r("heterna",2,1),new r("orna",0,1),new r("ad",-1,1),new r("e",-1,1),new r("ade",6,1),new r("ande",6,1),new r("arne",6,1),new r("are",6,1),new r("aste",6,1),new r("en",-1,1),new r("anden",12,1),new r("aren",12,1),new r("heten",12,1),new r("ern",-1,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",18,1),new r("or",-1,1),new r("s",-1,2),new r("as",21,1),new r("arnas",22,1),new r("ernas",22,1),new r("ornas",22,1),new r("es",21,1),new r("ades",26,1),new r("andes",26,1),new r("ens",21,1),new r("arens",29,1),new r("hetens",29,1),new r("erns",21,1),new r("at",-1,1),new r("andet",-1,1),new r("het",-1,1),new r("ast",-1,1)],c=[new r("dd",-1,-1),new r("gd",-1,-1),new r("nn",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1),new r("tt",-1,-1)],m=[new r("ig",-1,1),new r("lig",0,1),new r("els",-1,1),new r("fullt",-1,3),new r("löst",-1,2)],l=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,24,0,32],d=[119,127,149],w=new n;this.setCurrent=function(e){w.setCurrent(e)},this.getCurrent=function(){return w.getCurrent()},this.stem=function(){var r=w.cursor;return e(),w.limit_backward=r,w.cursor=w.limit,t(),w.cursor=w.limit,i(),w.cursor=w.limit,s(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return t.setCurrent(e),t.stem(),t.getCurrent()}):(t.setCurrent(e),t.stem(),t.getCurrent())}}(),e.Pipeline.registerFunction(e.sv.stemmer,"stemmer-sv"),e.sv.stopWordFilter=e.generateStopWordFilter("alla allt att av blev bli blir blivit de dem den denna deras dess dessa det detta dig din dina ditt du där då efter ej eller en er era ert ett från för ha hade han hans har henne hennes hon honom hur här i icke ingen inom inte jag ju kan kunde man med mellan men mig min mina mitt mot mycket ni nu när någon något några och om oss på samma sedan sig sin sina sitta själv skulle som så sådan sådana sådant till under upp ut utan vad var vara varför varit varje vars vart vem vi vid vilka vilkas vilken vilket vår våra vårt än är åt över".split(" ")),e.Pipeline.registerFunction(e.sv.stopWordFilter,"stopWordFilter-sv")}});

View File

@@ -0,0 +1 @@
!function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ta=function(){this.pipeline.reset(),this.pipeline.add(e.ta.trimmer,e.ta.stopWordFilter,e.ta.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ta.stemmer))},e.ta.wordCharacters="஀-உஊ-ஏஐ-ஙச-ட஠-னப-யர-ஹ஺-ிீ-௉ொ-௏ௐ-௙௚-௟௠-௩௪-௯௰-௹௺-௿a-zA-Z--0-9-",e.ta.trimmer=e.trimmerSupport.generateTrimmer(e.ta.wordCharacters),e.Pipeline.registerFunction(e.ta.trimmer,"trimmer-ta"),e.ta.stopWordFilter=e.generateStopWordFilter("அங்கு அங்கே அது அதை அந்த அவர் அவர்கள் அவள் அவன் அவை ஆக ஆகவே ஆகையால் ஆதலால் ஆதலினால் ஆனாலும் ஆனால் இங்கு இங்கே இது இதை இந்த இப்படி இவர் இவர்கள் இவள் இவன் இவை இவ்வளவு உனக்கு உனது உன் உன்னால் எங்கு எங்கே எது எதை எந்த எப்படி எவர் எவர்கள் எவள் எவன் எவை எவ்வளவு எனக்கு எனது எனவே என் என்ன என்னால் ஏது ஏன் தனது தன்னால் தானே தான் நாங்கள் நாம் நான் நீ நீங்கள்".split(" ")),e.ta.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var t=e.wordcut;t.init(),e.ta.tokenizer=function(r){if(!arguments.length||null==r||void 0==r)return[];if(Array.isArray(r))return r.map(function(t){return isLunr2?new e.Token(t.toLowerCase()):t.toLowerCase()});var i=r.toString().toLowerCase().replace(/^\s+/,"");return t.cut(i).split("|")},e.Pipeline.registerFunction(e.ta.stemmer,"stemmer-ta"),e.Pipeline.registerFunction(e.ta.stopWordFilter,"stopWordFilter-ta")}});

View File

@@ -0,0 +1 @@
!function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.te=function(){this.pipeline.reset(),this.pipeline.add(e.te.trimmer,e.te.stopWordFilter,e.te.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.te.stemmer))},e.te.wordCharacters="ఀ-ఄఅ-ఔక-హా-ౌౕ-ౖౘ-ౚౠ-ౡౢ-ౣ౦-౯౸-౿఼ఽ్ౝ౷౤౥",e.te.trimmer=e.trimmerSupport.generateTrimmer(e.te.wordCharacters),e.Pipeline.registerFunction(e.te.trimmer,"trimmer-te"),e.te.stopWordFilter=e.generateStopWordFilter("అందరూ అందుబాటులో అడగండి అడగడం అడ్డంగా అనుగుణంగా అనుమతించు అనుమతిస్తుంది అయితే ఇప్పటికే ఉన్నారు ఎక్కడైనా ఎప్పుడు ఎవరైనా ఎవరో ఏ ఏదైనా ఏమైనప్పటికి ఒక ఒకరు కనిపిస్తాయి కాదు కూడా గా గురించి చుట్టూ చేయగలిగింది తగిన తర్వాత దాదాపు దూరంగా నిజంగా పై ప్రకారం ప్రక్కన మధ్య మరియు మరొక మళ్ళీ మాత్రమే మెచ్చుకో వద్ద వెంట వేరుగా వ్యతిరేకంగా సంబంధం".split(" ")),e.te.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var t=e.wordcut;t.init(),e.te.tokenizer=function(r){if(!arguments.length||null==r||void 0==r)return[];if(Array.isArray(r))return r.map(function(t){return isLunr2?new e.Token(t.toLowerCase()):t.toLowerCase()});var i=r.toString().toLowerCase().replace(/^\s+/,"");return t.cut(i).split("|")},e.Pipeline.registerFunction(e.te.stemmer,"stemmer-te"),e.Pipeline.registerFunction(e.te.stopWordFilter,"stopWordFilter-te")}});

View File

@@ -0,0 +1 @@
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r="2"==e.version[0];e.th=function(){this.pipeline.reset(),this.pipeline.add(e.th.trimmer),r?this.tokenizer=e.th.tokenizer:(e.tokenizer&&(e.tokenizer=e.th.tokenizer),this.tokenizerFn&&(this.tokenizerFn=e.th.tokenizer))},e.th.wordCharacters="[฀-๿]",e.th.trimmer=e.trimmerSupport.generateTrimmer(e.th.wordCharacters),e.Pipeline.registerFunction(e.th.trimmer,"trimmer-th");var t=e.wordcut;t.init(),e.th.tokenizer=function(i){if(!arguments.length||null==i||void 0==i)return[];if(Array.isArray(i))return i.map(function(t){return r?new e.Token(t):t});var n=i.toString().replace(/^\s+/,"");return t.cut(n).split("|")}}});

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.vi=function(){this.pipeline.reset(),this.pipeline.add(e.vi.stopWordFilter,e.vi.trimmer)},e.vi.wordCharacters="[A-Za-ẓ̀͐́͑̉̃̓ÂâÊêÔôĂ-ăĐ-đƠ-ơƯ-ư]",e.vi.trimmer=e.trimmerSupport.generateTrimmer(e.vi.wordCharacters),e.Pipeline.registerFunction(e.vi.trimmer,"trimmer-vi"),e.vi.stopWordFilter=e.generateStopWordFilter("là cái nhưng mà".split(" "))}});

View File

@@ -0,0 +1 @@
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r(require("@node-rs/jieba")):r()(e.lunr)}(this,function(e){return function(r,t){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var i="2"==r.version[0];r.zh=function(){this.pipeline.reset(),this.pipeline.add(r.zh.trimmer,r.zh.stopWordFilter,r.zh.stemmer),i?this.tokenizer=r.zh.tokenizer:(r.tokenizer&&(r.tokenizer=r.zh.tokenizer),this.tokenizerFn&&(this.tokenizerFn=r.zh.tokenizer))},r.zh.tokenizer=function(n){if(!arguments.length||null==n||void 0==n)return[];if(Array.isArray(n))return n.map(function(e){return i?new r.Token(e.toLowerCase()):e.toLowerCase()});t&&e.load(t);var o=n.toString().trim().toLowerCase(),s=[];e.cut(o,!0).forEach(function(e){s=s.concat(e.split(" "))}),s=s.filter(function(e){return!!e});var u=0;return s.map(function(e,t){if(i){var n=o.indexOf(e,u),s={};return s.position=[n,e.length],s.index=t,u=n,new r.Token(e,s)}return e})},r.zh.wordCharacters="\\w一-龥",r.zh.trimmer=r.trimmerSupport.generateTrimmer(r.zh.wordCharacters),r.Pipeline.registerFunction(r.zh.trimmer,"trimmer-zh"),r.zh.stemmer=function(){return function(e){return e}}(),r.Pipeline.registerFunction(r.zh.stemmer,"stemmer-zh"),r.zh.stopWordFilter=r.generateStopWordFilter("的 一 不 在 人 有 是 为 為 以 于 於 上 他 而 后 後 之 来 來 及 了 因 下 可 到 由 这 這 与 與 也 此 但 并 並 个 個 其 已 无 無 小 我 们 們 起 最 再 今 去 好 只 又 或 很 亦 某 把 那 你 乃 它 吧 被 比 别 趁 当 當 从 從 得 打 凡 儿 兒 尔 爾 该 該 各 给 給 跟 和 何 还 還 即 几 幾 既 看 据 據 距 靠 啦 另 么 麽 每 嘛 拿 哪 您 凭 憑 且 却 卻 让 讓 仍 啥 如 若 使 谁 誰 虽 雖 随 隨 同 所 她 哇 嗡 往 些 向 沿 哟 喲 用 咱 则 則 怎 曾 至 致 着 著 诸 諸 自".split(" ")),r.Pipeline.registerFunction(r.zh.stopWordFilter,"stopWordFilter-zh")}});

View File

@@ -0,0 +1,206 @@
/**
* export the module via AMD, CommonJS or as a browser global
* Export code from https://github.com/umdjs/umd/blob/master/returnExports.js
*/
;(function (root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(factory)
} else if (typeof exports === 'object') {
/**
* Node. Does not work with strict CommonJS, but
* only CommonJS-like environments that support module.exports,
* like Node.
*/
module.exports = factory()
} else {
// Browser globals (root is window)
factory()(root.lunr);
}
}(this, function () {
/**
* Just return a value to define the module export.
* This example returns an object, but the module
* can return a function as the exported value.
*/
return function(lunr) {
// TinySegmenter 0.1 -- Super compact Japanese tokenizer in Javascript
// (c) 2008 Taku Kudo <taku@chasen.org>
// TinySegmenter is freely distributable under the terms of a new BSD licence.
// For details, see http://chasen.org/~taku/software/TinySegmenter/LICENCE.txt
function TinySegmenter() {
var patterns = {
"[一二三四五六七八九十百千万億兆]":"M",
"[一-龠々〆ヵヶ]":"H",
"[ぁ-ん]":"I",
"[ァ-ヴーア-ン゙ー]":"K",
"[a-zA-Z--]":"A",
"[0-9-]":"N"
}
this.chartype_ = [];
for (var i in patterns) {
var regexp = new RegExp(i);
this.chartype_.push([regexp, patterns[i]]);
}
this.BIAS__ = -332
this.BC1__ = {"HH":6,"II":2461,"KH":406,"OH":-1378};
this.BC2__ = {"AA":-3267,"AI":2744,"AN":-878,"HH":-4070,"HM":-1711,"HN":4012,"HO":3761,"IA":1327,"IH":-1184,"II":-1332,"IK":1721,"IO":5492,"KI":3831,"KK":-8741,"MH":-3132,"MK":3334,"OO":-2920};
this.BC3__ = {"HH":996,"HI":626,"HK":-721,"HN":-1307,"HO":-836,"IH":-301,"KK":2762,"MK":1079,"MM":4034,"OA":-1652,"OH":266};
this.BP1__ = {"BB":295,"OB":304,"OO":-125,"UB":352};
this.BP2__ = {"BO":60,"OO":-1762};
this.BQ1__ = {"BHH":1150,"BHM":1521,"BII":-1158,"BIM":886,"BMH":1208,"BNH":449,"BOH":-91,"BOO":-2597,"OHI":451,"OIH":-296,"OKA":1851,"OKH":-1020,"OKK":904,"OOO":2965};
this.BQ2__ = {"BHH":118,"BHI":-1159,"BHM":466,"BIH":-919,"BKK":-1720,"BKO":864,"OHH":-1139,"OHM":-181,"OIH":153,"UHI":-1146};
this.BQ3__ = {"BHH":-792,"BHI":2664,"BII":-299,"BKI":419,"BMH":937,"BMM":8335,"BNN":998,"BOH":775,"OHH":2174,"OHM":439,"OII":280,"OKH":1798,"OKI":-793,"OKO":-2242,"OMH":-2402,"OOO":11699};
this.BQ4__ = {"BHH":-3895,"BIH":3761,"BII":-4654,"BIK":1348,"BKK":-1806,"BMI":-3385,"BOO":-12396,"OAH":926,"OHH":266,"OHK":-2036,"ONN":-973};
this.BW1__ = {",と":660,",同":727,"B1あ":1404,"B1同":542,"、と":660,"、同":727,"」と":1682,"あっ":1505,"いう":1743,"いっ":-2055,"いる":672,"うし":-4817,"うん":665,"から":3472,"がら":600,"こう":-790,"こと":2083,"こん":-1262,"さら":-4143,"さん":4573,"した":2641,"して":1104,"すで":-3399,"そこ":1977,"それ":-871,"たち":1122,"ため":601,"った":3463,"つい":-802,"てい":805,"てき":1249,"でき":1127,"です":3445,"では":844,"とい":-4915,"とみ":1922,"どこ":3887,"ない":5713,"なっ":3015,"など":7379,"なん":-1113,"にし":2468,"には":1498,"にも":1671,"に対":-912,"の一":-501,"の中":741,"ませ":2448,"まで":1711,"まま":2600,"まる":-2155,"やむ":-1947,"よっ":-2565,"れた":2369,"れで":-913,"をし":1860,"を見":731,"亡く":-1886,"京都":2558,"取り":-2784,"大き":-2604,"大阪":1497,"平方":-2314,"引き":-1336,"日本":-195,"本当":-2423,"毎日":-2113,"目指":-724,"B1あ":1404,"B1同":542,"」と":1682};
this.BW2__ = {"..":-11822,"11":-669,"――":-5730,"":-13175,"いう":-1609,"うか":2490,"かし":-1350,"かも":-602,"から":-7194,"かれ":4612,"がい":853,"がら":-3198,"きた":1941,"くな":-1597,"こと":-8392,"この":-4193,"させ":4533,"され":13168,"さん":-3977,"しい":-1819,"しか":-545,"した":5078,"して":972,"しな":939,"その":-3744,"たい":-1253,"たた":-662,"ただ":-3857,"たち":-786,"たと":1224,"たは":-939,"った":4589,"って":1647,"っと":-2094,"てい":6144,"てき":3640,"てく":2551,"ては":-3110,"ても":-3065,"でい":2666,"でき":-1528,"でし":-3828,"です":-4761,"でも":-4203,"とい":1890,"とこ":-1746,"とと":-2279,"との":720,"とみ":5168,"とも":-3941,"ない":-2488,"なが":-1313,"など":-6509,"なの":2614,"なん":3099,"にお":-1615,"にし":2748,"にな":2454,"によ":-7236,"に対":-14943,"に従":-4688,"に関":-11388,"のか":2093,"ので":-7059,"のに":-6041,"のの":-6125,"はい":1073,"はが":-1033,"はず":-2532,"ばれ":1813,"まし":-1316,"まで":-6621,"まれ":5409,"めて":-3153,"もい":2230,"もの":-10713,"らか":-944,"らし":-1611,"らに":-1897,"りし":651,"りま":1620,"れた":4270,"れて":849,"れば":4114,"ろう":6067,"われ":7901,"を通":-11877,"んだ":728,"んな":-4115,"一人":602,"一方":-1375,"一日":970,"一部":-1051,"上が":-4479,"会社":-1116,"出て":2163,"分の":-7758,"同党":970,"同日":-913,"大阪":-2471,"委員":-1250,"少な":-1050,"年度":-8669,"年間":-1626,"府県":-2363,"手権":-1982,"新聞":-4066,"日新":-722,"日本":-7068,"日米":3372,"曜日":-601,"朝鮮":-2355,"本人":-2697,"東京":-1543,"然と":-1384,"社会":-1276,"立て":-990,"第に":-1612,"米国":-4268,"":-669};
this.BW3__ = {"あた":-2194,"あり":719,"ある":3846,"い.":-1185,"い。":-1185,"いい":5308,"いえ":2079,"いく":3029,"いた":2056,"いっ":1883,"いる":5600,"いわ":1527,"うち":1117,"うと":4798,"えと":1454,"か.":2857,"か。":2857,"かけ":-743,"かっ":-4098,"かに":-669,"から":6520,"かり":-2670,"が,":1816,"が、":1816,"がき":-4855,"がけ":-1127,"がっ":-913,"がら":-4977,"がり":-2064,"きた":1645,"けど":1374,"こと":7397,"この":1542,"ころ":-2757,"さい":-714,"さを":976,"し,":1557,"し、":1557,"しい":-3714,"した":3562,"して":1449,"しな":2608,"しま":1200,"す.":-1310,"す。":-1310,"する":6521,"ず,":3426,"ず、":3426,"ずに":841,"そう":428,"た.":8875,"た。":8875,"たい":-594,"たの":812,"たり":-1183,"たる":-853,"だ.":4098,"だ。":4098,"だっ":1004,"った":-4748,"って":300,"てい":6240,"てお":855,"ても":302,"です":1437,"でに":-1482,"では":2295,"とう":-1387,"とし":2266,"との":541,"とも":-3543,"どう":4664,"ない":1796,"なく":-903,"など":2135,"に,":-1021,"に、":-1021,"にし":1771,"にな":1906,"には":2644,"の,":-724,"の、":-724,"の子":-1000,"は,":1337,"は、":1337,"べき":2181,"まし":1113,"ます":6943,"まっ":-1549,"まで":6154,"まれ":-793,"らし":1479,"られ":6820,"るる":3818,"れ,":854,"れ、":854,"れた":1850,"れて":1375,"れば":-3246,"れる":1091,"われ":-605,"んだ":606,"んで":798,"カ月":990,"会議":860,"入り":1232,"大会":2217,"始め":1681,"市":965,"新聞":-5055,"日,":974,"日、":974,"社会":2024,"カ月":990};
this.TC1__ = {"AAA":1093,"HHH":1029,"HHM":580,"HII":998,"HOH":-390,"HOM":-331,"IHI":1169,"IOH":-142,"IOI":-1015,"IOM":467,"MMH":187,"OOI":-1832};
this.TC2__ = {"HHO":2088,"HII":-1023,"HMM":-1154,"IHI":-1965,"KKH":703,"OII":-2649};
this.TC3__ = {"AAA":-294,"HHH":346,"HHI":-341,"HII":-1088,"HIK":731,"HOH":-1486,"IHH":128,"IHI":-3041,"IHO":-1935,"IIH":-825,"IIM":-1035,"IOI":-542,"KHH":-1216,"KKA":491,"KKH":-1217,"KOK":-1009,"MHH":-2694,"MHM":-457,"MHO":123,"MMH":-471,"NNH":-1689,"NNO":662,"OHO":-3393};
this.TC4__ = {"HHH":-203,"HHI":1344,"HHK":365,"HHM":-122,"HHN":182,"HHO":669,"HIH":804,"HII":679,"HOH":446,"IHH":695,"IHO":-2324,"IIH":321,"III":1497,"IIO":656,"IOO":54,"KAK":4845,"KKA":3386,"KKK":3065,"MHH":-405,"MHI":201,"MMH":-241,"MMM":661,"MOM":841};
this.TQ1__ = {"BHHH":-227,"BHHI":316,"BHIH":-132,"BIHH":60,"BIII":1595,"BNHH":-744,"BOHH":225,"BOOO":-908,"OAKK":482,"OHHH":281,"OHIH":249,"OIHI":200,"OIIH":-68};
this.TQ2__ = {"BIHH":-1401,"BIII":-1033,"BKAK":-543,"BOOO":-5591};
this.TQ3__ = {"BHHH":478,"BHHM":-1073,"BHIH":222,"BHII":-504,"BIIH":-116,"BIII":-105,"BMHI":-863,"BMHM":-464,"BOMH":620,"OHHH":346,"OHHI":1729,"OHII":997,"OHMH":481,"OIHH":623,"OIIH":1344,"OKAK":2792,"OKHH":587,"OKKA":679,"OOHH":110,"OOII":-685};
this.TQ4__ = {"BHHH":-721,"BHHM":-3604,"BHII":-966,"BIIH":-607,"BIII":-2181,"OAAA":-2763,"OAKK":180,"OHHH":-294,"OHHI":2446,"OHHO":480,"OHIH":-1573,"OIHH":1935,"OIHI":-493,"OIIH":626,"OIII":-4007,"OKAK":-8156};
this.TW1__ = {"につい":-4681,"東京都":2026};
this.TW2__ = {"ある程":-2049,"いった":-1256,"ころが":-2434,"しょう":3873,"その後":-4430,"だって":-1049,"ていた":1833,"として":-4657,"ともに":-4517,"もので":1882,"一気に":-792,"初めて":-1512,"同時に":-8097,"大きな":-1255,"対して":-2721,"社会党":-3216};
this.TW3__ = {"いただ":-1734,"してい":1314,"として":-4314,"につい":-5483,"にとっ":-5989,"に当た":-6247,"ので,":-727,"ので、":-727,"のもの":-600,"れから":-3752,"十二月":-2287};
this.TW4__ = {"いう.":8576,"いう。":8576,"からな":-2348,"してい":2958,"たが,":1516,"たが、":1516,"ている":1538,"という":1349,"ました":5543,"ません":1097,"ようと":-4258,"よると":5865};
this.UC1__ = {"A":484,"K":93,"M":645,"O":-505};
this.UC2__ = {"A":819,"H":1059,"I":409,"M":3987,"N":5775,"O":646};
this.UC3__ = {"A":-1370,"I":2311};
this.UC4__ = {"A":-2643,"H":1809,"I":-1032,"K":-3450,"M":3565,"N":3876,"O":6646};
this.UC5__ = {"H":313,"I":-1238,"K":-799,"M":539,"O":-831};
this.UC6__ = {"H":-506,"I":-253,"K":87,"M":247,"O":-387};
this.UP1__ = {"O":-214};
this.UP2__ = {"B":69,"O":935};
this.UP3__ = {"B":189};
this.UQ1__ = {"BH":21,"BI":-12,"BK":-99,"BN":142,"BO":-56,"OH":-95,"OI":477,"OK":410,"OO":-2422};
this.UQ2__ = {"BH":216,"BI":113,"OK":1759};
this.UQ3__ = {"BA":-479,"BH":42,"BI":1913,"BK":-7198,"BM":3160,"BN":6427,"BO":14761,"OI":-827,"ON":-3212};
this.UW1__ = {",":156,"、":156,"「":-463,"あ":-941,"う":-127,"が":-553,"き":121,"こ":505,"で":-201,"と":-547,"ど":-123,"に":-789,"の":-185,"は":-847,"も":-466,"や":-470,"よ":182,"ら":-292,"り":208,"れ":169,"を":-446,"ん":-137,"・":-135,"主":-402,"京":-268,"区":-912,"午":871,"国":-460,"大":561,"委":729,"市":-411,"日":-141,"理":361,"生":-408,"県":-386,"都":-718,"「":-463,"・":-135};
this.UW2__ = {",":-829,"、":-829,"":892,"「":-645,"」":3145,"あ":-538,"い":505,"う":134,"お":-502,"か":1454,"が":-856,"く":-412,"こ":1141,"さ":878,"ざ":540,"し":1529,"す":-675,"せ":300,"そ":-1011,"た":188,"だ":1837,"つ":-949,"て":-291,"で":-268,"と":-981,"ど":1273,"な":1063,"に":-1764,"の":130,"は":-409,"ひ":-1273,"べ":1261,"ま":600,"も":-1263,"や":-402,"よ":1639,"り":-579,"る":-694,"れ":571,"を":-2516,"ん":2095,"ア":-587,"カ":306,"キ":568,"ッ":831,"三":-758,"不":-2150,"世":-302,"中":-968,"主":-861,"事":492,"人":-123,"会":978,"保":362,"入":548,"初":-3025,"副":-1566,"北":-3414,"区":-422,"大":-1769,"天":-865,"太":-483,"子":-1519,"学":760,"実":1023,"小":-2009,"市":-813,"年":-1060,"強":1067,"手":-1519,"揺":-1033,"政":1522,"文":-1355,"新":-1682,"日":-1815,"明":-1462,"最":-630,"朝":-1843,"本":-1650,"東":-931,"果":-665,"次":-2378,"民":-180,"気":-1740,"理":752,"発":529,"目":-1584,"相":-242,"県":-1165,"立":-763,"第":810,"米":509,"自":-1353,"行":838,"西":-744,"見":-3874,"調":1010,"議":1198,"込":3041,"開":1758,"間":-1257,"「":-645,"」":3145,"ッ":831,"ア":-587,"カ":306,"キ":568};
this.UW3__ = {",":4889,"1":-800,"":-1723,"、":4889,"々":-2311,"":5827,"」":2670,"〓":-3573,"あ":-2696,"い":1006,"う":2342,"え":1983,"お":-4864,"か":-1163,"が":3271,"く":1004,"け":388,"げ":401,"こ":-3552,"ご":-3116,"さ":-1058,"し":-395,"す":584,"せ":3685,"そ":-5228,"た":842,"ち":-521,"っ":-1444,"つ":-1081,"て":6167,"で":2318,"と":1691,"ど":-899,"な":-2788,"に":2745,"の":4056,"は":4555,"ひ":-2171,"ふ":-1798,"へ":1199,"ほ":-5516,"ま":-4384,"み":-120,"め":1205,"も":2323,"や":-788,"よ":-202,"ら":727,"り":649,"る":5905,"れ":2773,"わ":-1207,"を":6620,"ん":-518,"ア":551,"グ":1319,"ス":874,"ッ":-1350,"ト":521,"ム":1109,"ル":1591,"ロ":2201,"ン":278,"・":-3794,"一":-1619,"下":-1759,"世":-2087,"両":3815,"中":653,"主":-758,"予":-1193,"二":974,"人":2742,"今":792,"他":1889,"以":-1368,"低":811,"何":4265,"作":-361,"保":-2439,"元":4858,"党":3593,"全":1574,"公":-3030,"六":755,"共":-1880,"円":5807,"再":3095,"分":457,"初":2475,"別":1129,"前":2286,"副":4437,"力":365,"動":-949,"務":-1872,"化":1327,"北":-1038,"区":4646,"千":-2309,"午":-783,"協":-1006,"口":483,"右":1233,"各":3588,"合":-241,"同":3906,"和":-837,"員":4513,"国":642,"型":1389,"場":1219,"外":-241,"妻":2016,"学":-1356,"安":-423,"実":-1008,"家":1078,"小":-513,"少":-3102,"州":1155,"市":3197,"平":-1804,"年":2416,"広":-1030,"府":1605,"度":1452,"建":-2352,"当":-3885,"得":1905,"思":-1291,"性":1822,"戸":-488,"指":-3973,"政":-2013,"教":-1479,"数":3222,"文":-1489,"新":1764,"日":2099,"旧":5792,"昨":-661,"時":-1248,"曜":-951,"最":-937,"月":4125,"期":360,"李":3094,"村":364,"東":-805,"核":5156,"森":2438,"業":484,"氏":2613,"民":-1694,"決":-1073,"法":1868,"海":-495,"無":979,"物":461,"特":-3850,"生":-273,"用":914,"町":1215,"的":7313,"直":-1835,"省":792,"県":6293,"知":-1528,"私":4231,"税":401,"立":-960,"第":1201,"米":7767,"系":3066,"約":3663,"級":1384,"統":-4229,"総":1163,"線":1255,"者":6457,"能":725,"自":-2869,"英":785,"見":1044,"調":-562,"財":-733,"費":1777,"車":1835,"軍":1375,"込":-1504,"通":-1136,"選":-681,"郎":1026,"郡":4404,"部":1200,"金":2163,"長":421,"開":-1432,"間":1302,"関":-1282,"雨":2009,"電":-1045,"非":2066,"駅":1620,"":-800,"」":2670,"・":-3794,"ッ":-1350,"ア":551,"グ":1319,"ス":874,"ト":521,"ム":1109,"ル":1591,"ロ":2201,"ン":278};
this.UW4__ = {",":3930,".":3508,"―":-4841,"、":3930,"。":3508,"":4999,"「":1895,"」":3798,"〓":-5156,"あ":4752,"い":-3435,"う":-640,"え":-2514,"お":2405,"か":530,"が":6006,"き":-4482,"ぎ":-3821,"く":-3788,"け":-4376,"げ":-4734,"こ":2255,"ご":1979,"さ":2864,"し":-843,"じ":-2506,"す":-731,"ず":1251,"せ":181,"そ":4091,"た":5034,"だ":5408,"ち":-3654,"っ":-5882,"つ":-1659,"て":3994,"で":7410,"と":4547,"な":5433,"に":6499,"ぬ":1853,"ね":1413,"の":7396,"は":8578,"ば":1940,"ひ":4249,"び":-4134,"ふ":1345,"へ":6665,"べ":-744,"ほ":1464,"ま":1051,"み":-2082,"む":-882,"め":-5046,"も":4169,"ゃ":-2666,"や":2795,"ょ":-1544,"よ":3351,"ら":-2922,"り":-9726,"る":-14896,"れ":-2613,"ろ":-4570,"わ":-1783,"を":13150,"ん":-2352,"カ":2145,"コ":1789,"セ":1287,"ッ":-724,"ト":-403,"メ":-1635,"ラ":-881,"リ":-541,"ル":-856,"ン":-3637,"・":-4371,"ー":-11870,"一":-2069,"中":2210,"予":782,"事":-190,"井":-1768,"人":1036,"以":544,"会":950,"体":-1286,"作":530,"側":4292,"先":601,"党":-2006,"共":-1212,"内":584,"円":788,"初":1347,"前":1623,"副":3879,"力":-302,"動":-740,"務":-2715,"化":776,"区":4517,"協":1013,"参":1555,"合":-1834,"和":-681,"員":-910,"器":-851,"回":1500,"国":-619,"園":-1200,"地":866,"場":-1410,"塁":-2094,"士":-1413,"多":1067,"大":571,"子":-4802,"学":-1397,"定":-1057,"寺":-809,"小":1910,"屋":-1328,"山":-1500,"島":-2056,"川":-2667,"市":2771,"年":374,"庁":-4556,"後":456,"性":553,"感":916,"所":-1566,"支":856,"改":787,"政":2182,"教":704,"文":522,"方":-856,"日":1798,"時":1829,"最":845,"月":-9066,"木":-485,"来":-442,"校":-360,"業":-1043,"氏":5388,"民":-2716,"気":-910,"沢":-939,"済":-543,"物":-735,"率":672,"球":-1267,"生":-1286,"産":-1101,"田":-2900,"町":1826,"的":2586,"目":922,"省":-3485,"県":2997,"空":-867,"立":-2112,"第":788,"米":2937,"系":786,"約":2171,"経":1146,"統":-1169,"総":940,"線":-994,"署":749,"者":2145,"能":-730,"般":-852,"行":-792,"規":792,"警":-1184,"議":-244,"谷":-1000,"賞":730,"車":-1481,"軍":1158,"輪":-1433,"込":-3370,"近":929,"道":-1291,"選":2596,"郎":-4866,"都":1192,"野":-1100,"銀":-2213,"長":357,"間":-2344,"院":-2297,"際":-2604,"電":-878,"領":-1659,"題":-792,"館":-1984,"首":1749,"高":2120,"「":1895,"」":3798,"・":-4371,"ッ":-724,"ー":-11870,"カ":2145,"コ":1789,"セ":1287,"ト":-403,"メ":-1635,"ラ":-881,"リ":-541,"ル":-856,"ン":-3637};
this.UW5__ = {",":465,".":-299,"1":-514,"E2":-32768,"]":-2762,"、":465,"。":-299,"「":363,"あ":1655,"い":331,"う":-503,"え":1199,"お":527,"か":647,"が":-421,"き":1624,"ぎ":1971,"く":312,"げ":-983,"さ":-1537,"し":-1371,"す":-852,"だ":-1186,"ち":1093,"っ":52,"つ":921,"て":-18,"で":-850,"と":-127,"ど":1682,"な":-787,"に":-1224,"の":-635,"は":-578,"べ":1001,"み":502,"め":865,"ゃ":3350,"ょ":854,"り":-208,"る":429,"れ":504,"わ":419,"を":-1264,"ん":327,"イ":241,"ル":451,"ン":-343,"中":-871,"京":722,"会":-1153,"党":-654,"務":3519,"区":-901,"告":848,"員":2104,"大":-1296,"学":-548,"定":1785,"嵐":-1304,"市":-2991,"席":921,"年":1763,"思":872,"所":-814,"挙":1618,"新":-1682,"日":218,"月":-4353,"査":932,"格":1356,"機":-1508,"氏":-1347,"田":240,"町":-3912,"的":-3149,"相":1319,"省":-1052,"県":-4003,"研":-997,"社":-278,"空":-813,"統":1955,"者":-2233,"表":663,"語":-1073,"議":1219,"選":-1018,"郎":-368,"長":786,"間":1191,"題":2368,"館":-689,"":-514,"":-32768,"「":363,"イ":241,"ル":451,"ン":-343};
this.UW6__ = {",":227,".":808,"1":-270,"E1":306,"、":227,"。":808,"あ":-307,"う":189,"か":241,"が":-73,"く":-121,"こ":-200,"じ":1782,"す":383,"た":-428,"っ":573,"て":-1014,"で":101,"と":-105,"な":-253,"に":-149,"の":-417,"は":-236,"も":-206,"り":187,"る":-135,"を":195,"ル":-673,"ン":-496,"一":-277,"中":201,"件":-800,"会":624,"前":302,"区":1792,"員":-1212,"委":798,"学":-960,"市":887,"広":-695,"後":535,"業":-697,"相":753,"社":-507,"福":974,"空":-822,"者":1811,"連":463,"郎":1082,"":-270,"":306,"ル":-673,"ン":-496};
return this;
}
TinySegmenter.prototype.ctype_ = function(str) {
for (var i in this.chartype_) {
if (str.match(this.chartype_[i][0])) {
return this.chartype_[i][1];
}
}
return "O";
}
TinySegmenter.prototype.ts_ = function(v) {
if (v) { return v; }
return 0;
}
TinySegmenter.prototype.segment = function(input) {
if (input == null || input == undefined || input == "") {
return [];
}
var result = [];
var seg = ["B3","B2","B1"];
var ctype = ["O","O","O"];
var o = input.split("");
for (i = 0; i < o.length; ++i) {
seg.push(o[i]);
ctype.push(this.ctype_(o[i]))
}
seg.push("E1");
seg.push("E2");
seg.push("E3");
ctype.push("O");
ctype.push("O");
ctype.push("O");
var word = seg[3];
var p1 = "U";
var p2 = "U";
var p3 = "U";
for (var i = 4; i < seg.length - 3; ++i) {
var score = this.BIAS__;
var w1 = seg[i-3];
var w2 = seg[i-2];
var w3 = seg[i-1];
var w4 = seg[i];
var w5 = seg[i+1];
var w6 = seg[i+2];
var c1 = ctype[i-3];
var c2 = ctype[i-2];
var c3 = ctype[i-1];
var c4 = ctype[i];
var c5 = ctype[i+1];
var c6 = ctype[i+2];
score += this.ts_(this.UP1__[p1]);
score += this.ts_(this.UP2__[p2]);
score += this.ts_(this.UP3__[p3]);
score += this.ts_(this.BP1__[p1 + p2]);
score += this.ts_(this.BP2__[p2 + p3]);
score += this.ts_(this.UW1__[w1]);
score += this.ts_(this.UW2__[w2]);
score += this.ts_(this.UW3__[w3]);
score += this.ts_(this.UW4__[w4]);
score += this.ts_(this.UW5__[w5]);
score += this.ts_(this.UW6__[w6]);
score += this.ts_(this.BW1__[w2 + w3]);
score += this.ts_(this.BW2__[w3 + w4]);
score += this.ts_(this.BW3__[w4 + w5]);
score += this.ts_(this.TW1__[w1 + w2 + w3]);
score += this.ts_(this.TW2__[w2 + w3 + w4]);
score += this.ts_(this.TW3__[w3 + w4 + w5]);
score += this.ts_(this.TW4__[w4 + w5 + w6]);
score += this.ts_(this.UC1__[c1]);
score += this.ts_(this.UC2__[c2]);
score += this.ts_(this.UC3__[c3]);
score += this.ts_(this.UC4__[c4]);
score += this.ts_(this.UC5__[c5]);
score += this.ts_(this.UC6__[c6]);
score += this.ts_(this.BC1__[c2 + c3]);
score += this.ts_(this.BC2__[c3 + c4]);
score += this.ts_(this.BC3__[c4 + c5]);
score += this.ts_(this.TC1__[c1 + c2 + c3]);
score += this.ts_(this.TC2__[c2 + c3 + c4]);
score += this.ts_(this.TC3__[c3 + c4 + c5]);
score += this.ts_(this.TC4__[c4 + c5 + c6]);
// score += this.ts_(this.TC5__[c4 + c5 + c6]);
score += this.ts_(this.UQ1__[p1 + c1]);
score += this.ts_(this.UQ2__[p2 + c2]);
score += this.ts_(this.UQ3__[p3 + c3]);
score += this.ts_(this.BQ1__[p2 + c2 + c3]);
score += this.ts_(this.BQ2__[p2 + c3 + c4]);
score += this.ts_(this.BQ3__[p3 + c2 + c3]);
score += this.ts_(this.BQ4__[p3 + c3 + c4]);
score += this.ts_(this.TQ1__[p2 + c1 + c2 + c3]);
score += this.ts_(this.TQ2__[p2 + c2 + c3 + c4]);
score += this.ts_(this.TQ3__[p3 + c1 + c2 + c3]);
score += this.ts_(this.TQ4__[p3 + c2 + c3 + c4]);
var p = "O";
if (score > 0) {
result.push(word);
word = "";
p = "B";
}
p1 = p2;
p2 = p3;
p3 = p;
word += seg[i];
}
result.push(word);
return result;
}
lunr.TinySegmenter = TinySegmenter;
};
}));

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
{"version":3,"sources":["src/templates/assets/stylesheets/palette/_scheme.scss","../../../../src/templates/assets/stylesheets/palette.scss","src/templates/assets/stylesheets/palette/_accent.scss","src/templates/assets/stylesheets/palette/_primary.scss","src/templates/assets/stylesheets/utilities/_break.scss"],"names":[],"mappings":"AA2BA,cAGE,6BAME,sDAAA,CACA,6DAAA,CACA,+DAAA,CACA,gEAAA,CACA,mDAAA,CACA,6DAAA,CACA,+DAAA,CACA,gEAAA,CAGA,mDAAA,CACA,gDAAA,CACA,yDAAA,CACA,4DAAA,CAGA,0BAAA,CACA,mCAAA,CAGA,iCAAA,CACA,kCAAA,CACA,mCAAA,CACA,mCAAA,CACA,kCAAA,CACA,iCAAA,CACA,+CAAA,CACA,6DAAA,CACA,gEAAA,CACA,4DAAA,CACA,4DAAA,CACA,6DAAA,CAGA,6CAAA,CAGA,+CAAA,CAGA,uDAAA,CACA,6DAAA,CACA,2DAAA,CAGA,iCAAA,CAGA,yDAAA,CACA,iEAAA,CAGA,mDAAA,CACA,mDAAA,CAGA,qDAAA,CACA,uDAAA,CAGA,8DAAA,CAKA,8DAAA,CAKA,0DAAA,CAzEA,iBCiBF,CD6DE,kHAEE,YC3DJ,CDkFE,yDACE,4BChFJ,CD+EE,2DACE,4BC7EJ,CD4EE,gEACE,4BC1EJ,CDyEE,2DACE,4BCvEJ,CDsEE,yDACE,4BCpEJ,CDmEE,0DACE,4BCjEJ,CDgEE,gEACE,4BC9DJ,CD6DE,0DACE,4BC3DJ,CD0DE,2OACE,4BC/CJ,CDsDA,+FAGE,iCCpDF,CACF,CCjDE,2BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCD6CN,CCvDE,4BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDoDN,CC9DE,8BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCD2DN,CCrEE,mCACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDkEN,CC5EE,8BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDyEN,CCnFE,4BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDgFN,CC1FE,kCACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDuFN,CCjGE,4BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCD8FN,CCxGE,4BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDqGN,CC/GE,6BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCD4GN,CCtHE,mCACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDmHN,CC7HE,4BACE,4BAAA,CACA,2CAAA,CAIE,8BAAA,CACA,qCD6HN,CCpIE,8BACE,4BAAA,CACA,2CAAA,CAIE,8BAAA,CACA,qCDoIN,CC3IE,6BACE,yBAAA,CACA,2CAAA,CAIE,8BAAA,CACA,qCD2IN,CClJE,8BACE,4BAAA,CACA,2CAAA,CAIE,8BAAA,CACA,qCDkJN,CCzJE,mCACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDsJN,CE3JE,4BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFwJN,CEnKE,6BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFgKN,CE3KE,+BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFwKN,CEnLE,oCACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFgLN,CE3LE,+BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFwLN,CEnME,6BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFgMN,CE3ME,mCACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFwMN,CEnNE,6BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFgNN,CE3NE,6BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFwNN,CEnOE,8BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFgON,CE3OE,oCACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFwON,CEnPE,6BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAIE,+BAAA,CACA,sCFmPN,CE3PE,+BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAIE,+BAAA,CACA,sCF2PN,CEnQE,8BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAIE,+BAAA,CACA,sCFmQN,CE3QE,+BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAIE,+BAAA,CACA,sCF2QN,CEnRE,oCACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFgRN,CE3RE,8BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFwRN,CEnSE,6BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCAAA,CAKA,4BF4RN,CE5SE,kCACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCAAA,CAKA,4BFqSN,CEtRE,sEACE,4BFyRJ,CE1RE,+DACE,4BF6RJ,CE9RE,iEACE,4BFiSJ,CElSE,gEACE,4BFqSJ,CEtSE,iEACE,4BFySJ,CEhSA,8BACE,mDAAA,CACA,4DAAA,CACA,0DAAA,CACA,oDAAA,CACA,2DAAA,CAGA,4BFiSF,CE9RE,yCACE,+BFgSJ,CE7RI,kDAEE,0CAAA,CACA,sCAAA,CAFA,mCFiSN,CG7MI,mCD1EA,+CACE,8CF0RJ,CEvRI,qDACE,8CFyRN,CEpRE,iEACE,mCFsRJ,CACF,CGxNI,sCDvDA,uCACE,oCFkRJ,CACF,CEzQA,8BACE,kDAAA,CACA,4DAAA,CACA,wDAAA,CACA,oDAAA,CACA,6DAAA,CAGA,4BF0QF,CEvQE,yCACE,+BFyQJ,CEtQI,kDAEE,0CAAA,CACA,sCAAA,CAFA,mCF0QN,CEnQE,yCACE,6CFqQJ,CG9NI,0CDhCA,8CACE,gDFiQJ,CACF,CGnOI,0CDvBA,iFACE,6CF6PJ,CACF,CG3PI,sCDKA,uCACE,6CFyPJ,CACF","file":"palette.css"}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

1703
site/index.html Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

3
site/sitemap.xml Normal file
View File

@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
</urlset>

BIN
site/sitemap.xml.gz Normal file

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

1489
site/vault/index.html Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,7 @@
document.addEventListener('DOMContentLoaded', function() {
var links = document.querySelectorAll('a[href^="http"]');
links.forEach(function(link) {
link.setAttribute('target', '_blank');
link.setAttribute('rel', 'noopener noreferrer');
});
});

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,21 +0,0 @@
Fri 19 Dec 16:19:29 CET 2025: Pulled new changes
Fri 19 Dec 16:20:07 CET 2025: Pulled new changes
Fri 19 Dec 17:56:02 CET 2025: Pulled new changes
Fri 19 Dec 17:59:01 CET 2025: Pulled new changes
Tue 23 Dec 03:25:01 CET 2025: Pulled new changes
Tue 23 Dec 03:25:01 CET 2025: Triggered MkDocs rebuild
: Pushed local changes to Gitea
: Triggered MkDocs rebuild
date: extra operand %H:%M
Try 'date --help' for more information.
[main bb4c8dd] Auto-sync:
1 file changed, 2 insertions(+)
date: extra operand %H:%M:%S
Try 'date --help' for more information.
: Pushed local changes to Gitea
mkdocs
date: extra operand %H:%M:%S
Try 'date --help' for more information.
: Triggered MkDocs rebuild
Wed 31 Dec 18:45:09 CET 2025: Pushed local changes to Gitea
Wed 31 Dec 18:45:09 CET 2025: Triggered MkDocs rebuild

Some files were not shown because too many files have changed in this diff Show More