Compare commits
179 Commits
0980b54721
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 93d2c935c7 | |||
| eae97886d7 | |||
|
|
0b8061460c | ||
|
|
ee538cbc50 | ||
|
|
008421a344 | ||
|
|
4e8cae74ba | ||
|
|
0ee9ecb8d4 | ||
|
|
35349c3e51 | ||
|
|
48d7aff548 | ||
|
|
56b4726dd6 | ||
|
|
09e8a2d0c5 | ||
|
|
6a755ee4fb | ||
|
|
5ae9c9f922 | ||
|
|
588d31315d | ||
|
|
7eeb3d8fe7 | ||
|
|
fc76a00e80 | ||
|
|
decba0d4d0 | ||
|
|
825eab0926 | ||
|
|
cb4a318b4b | ||
|
|
dfc3b735b1 | ||
|
|
811434c7fb | ||
|
|
3b5590faa1 | ||
|
|
030ee39261 | ||
|
|
31889c41dc | ||
|
|
393646f532 | ||
|
|
4953ab88b7 | ||
|
|
c7115b9b67 | ||
|
|
e0b97cd02e | ||
|
|
9b51d5bf1c | ||
|
|
12fb1af988 | ||
|
|
a16ca8ad63 | ||
|
|
169f4d63fe | ||
|
|
ccd4961db9 | ||
|
|
f5a457c954 | ||
|
|
7c68a8fcfa | ||
|
|
8419a45929 | ||
|
|
7b5f379008 | ||
|
|
9e865f4d18 | ||
|
|
a3547256f0 | ||
|
|
931493744e | ||
|
|
b9e99ff845 | ||
|
|
f2ecb370b5 | ||
|
|
dfb83c26f3 | ||
|
|
c1b7dca205 | ||
|
|
a7dd55132c | ||
|
|
654d4cbdd0 | ||
|
|
13792dfbd1 | ||
|
|
cf7e246911 | ||
|
|
7bb7509f18 | ||
|
|
bcfdbea3a9 | ||
|
|
7a1d7adc70 | ||
|
|
ca7d193414 | ||
|
|
dff60a92e0 | ||
|
|
b4dad6e2b5 | ||
|
|
9b2dde78d2 | ||
|
|
1b327fcf2b | ||
|
|
a5bdd3ac26 | ||
|
|
0d89133e97 | ||
|
|
1831058fbd | ||
|
|
9196ad1c34 | ||
|
|
67101db6bf | ||
|
|
38cfebdc48 | ||
|
|
859abe704e | ||
|
|
972ea9ade5 | ||
|
|
671bea2a50 | ||
|
|
6926bfd79c | ||
|
|
d54555fc65 | ||
|
|
84185cc712 | ||
|
|
ebed10c53f | ||
|
|
44ab90f6d1 | ||
|
|
ea13c046f1 | ||
|
|
a20ea3b40c | ||
|
|
24a36f92b9 | ||
|
|
f8ca87e34e | ||
|
|
b910072e02 | ||
|
|
f391013031 | ||
|
|
aada745ca9 | ||
|
|
86a987e37e | ||
|
|
b690fff900 | ||
|
|
62f9b6b775 | ||
|
|
cf8aacb71d | ||
|
|
6184b34bd7 | ||
|
|
1dc5c76559 | ||
|
|
cce18ad0bf | ||
|
|
931d636064 | ||
|
|
84dac6625a | ||
|
|
70831a35e4 | ||
|
|
0e264f948b | ||
|
|
b5e9293677 | ||
|
|
10545b8239 | ||
|
|
a4fcb5b255 | ||
|
|
1a8fe0a0b9 | ||
|
|
a8e2559439 | ||
|
|
dffc7dcba9 | ||
|
|
45216d67c4 | ||
|
|
786a5af9ac | ||
|
|
6c49dcd17d | ||
|
|
294e0c8336 | ||
|
|
24af169523 | ||
|
|
69fe3fcfb7 | ||
|
|
2b5b7f9e35 | ||
|
|
05844bd049 | ||
|
|
3608964801 | ||
|
|
f27994b6bf | ||
|
|
331a04e5ba | ||
|
|
08145c88e5 | ||
|
|
2d5c4de975 | ||
|
|
6f901ceb44 | ||
|
|
b153fc4858 | ||
|
|
f7f4f66646 | ||
|
|
d932ffef97 | ||
|
|
79d3f58666 | ||
|
|
89788fafa0 | ||
|
|
0c73b0a432 | ||
|
|
4f72234ef8 | ||
|
|
7cc120a10e | ||
|
|
4676837b33 | ||
|
|
be311b54e1 | ||
|
|
c40d617213 | ||
|
|
42fbda879e | ||
|
|
c0de15ca0e | ||
|
|
186898f102 | ||
|
|
0162453fba | ||
|
|
89e4cc8fb5 | ||
|
|
5d7943b8ad | ||
|
|
41c12e10f9 | ||
|
|
cd8567d58a | ||
|
|
48dbbd052a | ||
|
|
ef655580c1 | ||
|
|
e81c2b3af3 | ||
|
|
0aba94f674 | ||
|
|
36fe2a05f0 | ||
|
|
7a2a07475b | ||
|
|
44dcebd2d3 | ||
|
|
1104eb99a0 | ||
|
|
07fefb073a | ||
|
|
e47d3f9cc6 | ||
|
|
a98c44e3c4 | ||
|
|
87c153f623 | ||
|
|
a13125bb16 | ||
|
|
7cdf3d62cf | ||
|
|
00464076ef | ||
|
|
47c6081be8 | ||
|
|
96a42d7d9c | ||
|
|
dbc3f8f9fd | ||
|
|
f4f5d93cc0 | ||
|
|
322c0bd668 | ||
|
|
627a4c9d4e | ||
|
|
12b3048a88 | ||
|
|
2062bff480 | ||
|
|
8df0d1532b | ||
|
|
759c635472 | ||
|
|
e9c0a4073c | ||
|
|
983b5add62 | ||
|
|
8555aa460f | ||
|
|
f7e7d19ab2 | ||
|
|
9046dbf6ae | ||
|
|
cf5669b1fa | ||
|
|
891d5f1a7d | ||
|
|
d48ff47807 | ||
|
|
00335c19fb | ||
|
|
6515a3cafe | ||
|
|
1eb661db20 | ||
|
|
2b88fdaa9b | ||
|
|
0d595a331e | ||
|
|
5127eba291 | ||
|
|
80f74198c2 | ||
|
|
e4008c0a3e | ||
|
|
44c4216249 | ||
|
|
026adb65d9 | ||
|
|
aaad3ab7c8 | ||
|
|
5d0152101e | ||
|
|
f208bb58a5 | ||
|
|
5d370fbb4d | ||
|
|
7e5d75f411 | ||
|
|
4023f48a2a | ||
|
|
8107224f77 | ||
|
|
4bb7349e5d | ||
|
|
d700aff572 |
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
sync.log
|
||||
34
configs/annecy-dns/dnsmasq.conf
Normal file
34
configs/annecy-dns/dnsmasq.conf
Normal 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=-
|
||||
14
configs/annecy-dns/docker-compose.yml
Normal file
14
configs/annecy-dns/docker-compose.yml
Normal 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
16
docker-compose.yml
Normal 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
23
docs/404.md
Normal 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)
|
||||
40
docs/changelog/2026-01-03.md
Normal file
40
docs/changelog/2026-01-03.md
Normal 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)
|
||||
96
docs/changelog/2026-01-12.md
Normal file
96
docs/changelog/2026-01-12.md
Normal 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
|
||||
244
docs/index.md
244
docs/index.md
@@ -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
|
||||
```
|
||||
|
||||
145
docs/infra/issues-2025-12-31.md
Normal file
145
docs/infra/issues-2025-12-31.md
Normal 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
141
docs/infra/network.md
Normal 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
|
||||
```
|
||||
@@ -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
|
||||
|
||||
136
docs/infra/recommendations.md
Normal file
136
docs/infra/recommendations.md
Normal 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
162
docs/infra/ssd-migration.md
Normal 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
137
docs/services/helmarr.md
Normal 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
145
docs/services/homarr.md
Normal 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
25
docs/services/immich.md
Normal 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
|
||||
@@ -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
210
docs/services/servarr.md
Normal 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
|
||||
162
docs/services/transmission.md
Normal file
162
docs/services/transmission.md
Normal 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 |
|
||||
100
mkdocs.yml
100
mkdocs.yml
@@ -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
19
overrides/404.html
Normal 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
1247
site/404.html
Normal file
File diff suppressed because it is too large
Load Diff
1317
site/404/index.html
Normal file
1317
site/404/index.html
Normal file
File diff suppressed because it is too large
Load Diff
BIN
site/assets/images/favicon.png
Normal file
BIN
site/assets/images/favicon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.8 KiB |
16
site/assets/javascripts/bundle.79ae519e.min.js
vendored
Normal file
16
site/assets/javascripts/bundle.79ae519e.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
7
site/assets/javascripts/bundle.79ae519e.min.js.map
Normal file
7
site/assets/javascripts/bundle.79ae519e.min.js.map
Normal file
File diff suppressed because one or more lines are too long
1
site/assets/javascripts/lunr/min/lunr.ar.min.js
vendored
Normal file
1
site/assets/javascripts/lunr/min/lunr.ar.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
18
site/assets/javascripts/lunr/min/lunr.da.min.js
vendored
Normal file
18
site/assets/javascripts/lunr/min/lunr.da.min.js
vendored
Normal 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-Za-z",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")}});
|
||||
18
site/assets/javascripts/lunr/min/lunr.de.min.js
vendored
Normal file
18
site/assets/javascripts/lunr/min/lunr.de.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
18
site/assets/javascripts/lunr/min/lunr.du.min.js
vendored
Normal file
18
site/assets/javascripts/lunr/min/lunr.du.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
site/assets/javascripts/lunr/min/lunr.el.min.js
vendored
Normal file
1
site/assets/javascripts/lunr/min/lunr.el.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
18
site/assets/javascripts/lunr/min/lunr.es.min.js
vendored
Normal file
18
site/assets/javascripts/lunr/min/lunr.es.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
18
site/assets/javascripts/lunr/min/lunr.fi.min.js
vendored
Normal file
18
site/assets/javascripts/lunr/min/lunr.fi.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
18
site/assets/javascripts/lunr/min/lunr.fr.min.js
vendored
Normal file
18
site/assets/javascripts/lunr/min/lunr.fr.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
site/assets/javascripts/lunr/min/lunr.he.min.js
vendored
Normal file
1
site/assets/javascripts/lunr/min/lunr.he.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
site/assets/javascripts/lunr/min/lunr.hi.min.js
vendored
Normal file
1
site/assets/javascripts/lunr/min/lunr.hi.min.js
vendored
Normal 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-Za-zA-Z0-90-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")}});
|
||||
18
site/assets/javascripts/lunr/min/lunr.hu.min.js
vendored
Normal file
18
site/assets/javascripts/lunr/min/lunr.hu.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
site/assets/javascripts/lunr/min/lunr.hy.min.js
vendored
Normal file
1
site/assets/javascripts/lunr/min/lunr.hy.min.js
vendored
Normal 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")}});
|
||||
18
site/assets/javascripts/lunr/min/lunr.it.min.js
vendored
Normal file
18
site/assets/javascripts/lunr/min/lunr.it.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
site/assets/javascripts/lunr/min/lunr.ja.min.js
vendored
Normal file
1
site/assets/javascripts/lunr/min/lunr.ja.min.js
vendored
Normal 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-Za-zA-Z0-90-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")}});
|
||||
1
site/assets/javascripts/lunr/min/lunr.jp.min.js
vendored
Normal file
1
site/assets/javascripts/lunr/min/lunr.jp.min.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
module.exports=require("./lunr.ja");
|
||||
1
site/assets/javascripts/lunr/min/lunr.kn.min.js
vendored
Normal file
1
site/assets/javascripts/lunr/min/lunr.kn.min.js
vendored
Normal 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")}});
|
||||
1
site/assets/javascripts/lunr/min/lunr.ko.min.js
vendored
Normal file
1
site/assets/javascripts/lunr/min/lunr.ko.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
site/assets/javascripts/lunr/min/lunr.multi.min.js
vendored
Normal file
1
site/assets/javascripts/lunr/min/lunr.multi.min.js
vendored
Normal 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))}}}});
|
||||
18
site/assets/javascripts/lunr/min/lunr.nl.min.js
vendored
Normal file
18
site/assets/javascripts/lunr/min/lunr.nl.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
18
site/assets/javascripts/lunr/min/lunr.no.min.js
vendored
Normal file
18
site/assets/javascripts/lunr/min/lunr.no.min.js
vendored
Normal 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-Za-z",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")}});
|
||||
18
site/assets/javascripts/lunr/min/lunr.pt.min.js
vendored
Normal file
18
site/assets/javascripts/lunr/min/lunr.pt.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
18
site/assets/javascripts/lunr/min/lunr.ro.min.js
vendored
Normal file
18
site/assets/javascripts/lunr/min/lunr.ro.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
18
site/assets/javascripts/lunr/min/lunr.ru.min.js
vendored
Normal file
18
site/assets/javascripts/lunr/min/lunr.ru.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
site/assets/javascripts/lunr/min/lunr.sa.min.js
vendored
Normal file
1
site/assets/javascripts/lunr/min/lunr.sa.min.js
vendored
Normal 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")}});
|
||||
1
site/assets/javascripts/lunr/min/lunr.stemmer.support.min.js
vendored
Normal file
1
site/assets/javascripts/lunr/min/lunr.stemmer.support.min.js
vendored
Normal 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,"")}}}}});
|
||||
18
site/assets/javascripts/lunr/min/lunr.sv.min.js
vendored
Normal file
18
site/assets/javascripts/lunr/min/lunr.sv.min.js
vendored
Normal 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-Za-z",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")}});
|
||||
1
site/assets/javascripts/lunr/min/lunr.ta.min.js
vendored
Normal file
1
site/assets/javascripts/lunr/min/lunr.ta.min.js
vendored
Normal 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-Za-zA-Z0-90-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")}});
|
||||
1
site/assets/javascripts/lunr/min/lunr.te.min.js
vendored
Normal file
1
site/assets/javascripts/lunr/min/lunr.te.min.js
vendored
Normal 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")}});
|
||||
1
site/assets/javascripts/lunr/min/lunr.th.min.js
vendored
Normal file
1
site/assets/javascripts/lunr/min/lunr.th.min.js
vendored
Normal 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("|")}}});
|
||||
18
site/assets/javascripts/lunr/min/lunr.tr.min.js
vendored
Normal file
18
site/assets/javascripts/lunr/min/lunr.tr.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
site/assets/javascripts/lunr/min/lunr.vi.min.js
vendored
Normal file
1
site/assets/javascripts/lunr/min/lunr.vi.min.js
vendored
Normal 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(" "))}});
|
||||
1
site/assets/javascripts/lunr/min/lunr.zh.min.js
vendored
Normal file
1
site/assets/javascripts/lunr/min/lunr.zh.min.js
vendored
Normal 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")}});
|
||||
206
site/assets/javascripts/lunr/tinyseg.js
Normal file
206
site/assets/javascripts/lunr/tinyseg.js
Normal 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-Za-zA-Z]":"A",
|
||||
"[0-90-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,"11":-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,"1":-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,"1":-514,"E2":-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,"1":-270,"E1":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;
|
||||
};
|
||||
|
||||
}));
|
||||
6708
site/assets/javascripts/lunr/wordcut.js
Normal file
6708
site/assets/javascripts/lunr/wordcut.js
Normal file
File diff suppressed because one or more lines are too long
42
site/assets/javascripts/workers/search.2c215733.min.js
vendored
Normal file
42
site/assets/javascripts/workers/search.2c215733.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1
site/assets/stylesheets/main.484c7ddc.min.css
vendored
Normal file
1
site/assets/stylesheets/main.484c7ddc.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
1
site/assets/stylesheets/main.484c7ddc.min.css.map
Normal file
1
site/assets/stylesheets/main.484c7ddc.min.css.map
Normal file
File diff suppressed because one or more lines are too long
1
site/assets/stylesheets/palette.ab4e12ef.min.css
vendored
Normal file
1
site/assets/stylesheets/palette.ab4e12ef.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
1
site/assets/stylesheets/palette.ab4e12ef.min.css.map
Normal file
1
site/assets/stylesheets/palette.ab4e12ef.min.css.map
Normal 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"}
|
||||
1602
site/changelog/2025-12-31/index.html
Normal file
1602
site/changelog/2025-12-31/index.html
Normal file
File diff suppressed because it is too large
Load Diff
1438
site/changelog/2026-01-03/index.html
Normal file
1438
site/changelog/2026-01-03/index.html
Normal file
File diff suppressed because it is too large
Load Diff
1574
site/changelog/2026-01-12/index.html
Normal file
1574
site/changelog/2026-01-12/index.html
Normal file
File diff suppressed because it is too large
Load Diff
1703
site/index.html
Normal file
1703
site/index.html
Normal file
File diff suppressed because it is too large
Load Diff
1497
site/infra/issues-2025-12-31/index.html
Normal file
1497
site/infra/issues-2025-12-31/index.html
Normal file
File diff suppressed because it is too large
Load Diff
1684
site/infra/network/index.html
Normal file
1684
site/infra/network/index.html
Normal file
File diff suppressed because it is too large
Load Diff
1781
site/infra/overview/index.html
Normal file
1781
site/infra/overview/index.html
Normal file
File diff suppressed because it is too large
Load Diff
1614
site/infra/recommendations/index.html
Normal file
1614
site/infra/recommendations/index.html
Normal file
File diff suppressed because it is too large
Load Diff
1701
site/infra/ssd-migration/index.html
Normal file
1701
site/infra/ssd-migration/index.html
Normal file
File diff suppressed because it is too large
Load Diff
1
site/search/search_index.json
Normal file
1
site/search/search_index.json
Normal file
File diff suppressed because one or more lines are too long
1733
site/services/helmarr/index.html
Normal file
1733
site/services/helmarr/index.html
Normal file
File diff suppressed because it is too large
Load Diff
1703
site/services/homarr/index.html
Normal file
1703
site/services/homarr/index.html
Normal file
File diff suppressed because it is too large
Load Diff
1614
site/services/overview/index.html
Normal file
1614
site/services/overview/index.html
Normal file
File diff suppressed because it is too large
Load Diff
1785
site/services/servarr/index.html
Normal file
1785
site/services/servarr/index.html
Normal file
File diff suppressed because it is too large
Load Diff
1689
site/services/transmission/index.html
Normal file
1689
site/services/transmission/index.html
Normal file
File diff suppressed because it is too large
Load Diff
3
site/sitemap.xml
Normal file
3
site/sitemap.xml
Normal 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
BIN
site/sitemap.xml.gz
Normal file
Binary file not shown.
1447
site/vault/config/caddy/index.html
Normal file
1447
site/vault/config/caddy/index.html
Normal file
File diff suppressed because it is too large
Load Diff
1454
site/vault/config/docker-stacks/index.html
Normal file
1454
site/vault/config/docker-stacks/index.html
Normal file
File diff suppressed because it is too large
Load Diff
1548
site/vault/config/network/index.html
Normal file
1548
site/vault/config/network/index.html
Normal file
File diff suppressed because it is too large
Load Diff
1431
site/vault/config/troubleshooting/index.html
Normal file
1431
site/vault/config/troubleshooting/index.html
Normal file
File diff suppressed because it is too large
Load Diff
1475
site/vault/index-v1/index.html
Normal file
1475
site/vault/index-v1/index.html
Normal file
File diff suppressed because it is too large
Load Diff
1489
site/vault/index.html
Normal file
1489
site/vault/index.html
Normal file
File diff suppressed because it is too large
Load Diff
7
site/vault/javascripts/external-links.js
Normal file
7
site/vault/javascripts/external-links.js
Normal 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');
|
||||
});
|
||||
});
|
||||
1485
site/vault/reference/commands/index.html
Normal file
1485
site/vault/reference/commands/index.html
Normal file
File diff suppressed because it is too large
Load Diff
1756
site/vault/reference/ports/index.html
Normal file
1756
site/vault/reference/ports/index.html
Normal file
File diff suppressed because it is too large
Load Diff
1369
site/vault/reference/scripts/index.html
Normal file
1369
site/vault/reference/scripts/index.html
Normal file
File diff suppressed because it is too large
Load Diff
1548
site/vault/services-v1/authelia/index.html
Normal file
1548
site/vault/services-v1/authelia/index.html
Normal file
File diff suppressed because it is too large
Load Diff
1336
site/vault/services-v1/backup/index.html
Normal file
1336
site/vault/services-v1/backup/index.html
Normal file
File diff suppressed because it is too large
Load Diff
1254
site/vault/services-v1/grafana/index.html
Normal file
1254
site/vault/services-v1/grafana/index.html
Normal file
File diff suppressed because it is too large
Load Diff
1645
site/vault/services-v1/overview/index.html
Normal file
1645
site/vault/services-v1/overview/index.html
Normal file
File diff suppressed because it is too large
Load Diff
1427
site/vault/services-v1/shlink/index.html
Normal file
1427
site/vault/services-v1/shlink/index.html
Normal file
File diff suppressed because it is too large
Load Diff
1417
site/vault/services-v1/transmission/index.html
Normal file
1417
site/vault/services-v1/transmission/index.html
Normal file
File diff suppressed because it is too large
Load Diff
21
sync.log
21
sync.log
@@ -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
Reference in New Issue
Block a user