J5040 E1-E2 + préparation E3/E4 : durcissement .27, AdGuard déployé (config VM migrée), compose adguard/edge-j5040 (Caddy OVH), 09-j5040-dhcp.sh, 07d sans gzip, README/journal alignés
This commit is contained in:
@@ -61,6 +61,7 @@ g9-migration/
|
|||||||
│ ├── 07d-migrate-photoprism.sh ← T4.3 : PhotoPrism (copie 530 Go + indexation)
|
│ ├── 07d-migrate-photoprism.sh ← T4.3 : PhotoPrism (copie 530 Go + indexation)
|
||||||
│ ├── 07e-deploy-edge.sh ← T4.6 : edge Caddy (validate → up → ufw 443 → vérifs HTTPS/SNI)
|
│ ├── 07e-deploy-edge.sh ← T4.6 : edge Caddy (validate → up → ufw 443 → vérifs HTTPS/SNI)
|
||||||
│ ├── restic-notify.sh ← alerte Matrix des jobs restic (posée par 06)
|
│ ├── restic-notify.sh ← alerte Matrix des jobs restic (posée par 06)
|
||||||
|
│ ├── 09-j5040-dhcp.sh ← E3 : DHCP dnsmasq sur J5040 (pré-bascule bridge)
|
||||||
│ └── 08-decommission.sh ← T6.4 : décommissionnement xpenology [DESTRUCTIF]
|
│ └── 08-decommission.sh ← T6.4 : décommissionnement xpenology [DESTRUCTIF]
|
||||||
├── compose/ ← docker-compose.yml versionnés (stockés aussi dans Gitea)
|
├── compose/ ← docker-compose.yml versionnés (stockés aussi dans Gitea)
|
||||||
│ ├── vaultwarden/ ← T4.1
|
│ ├── vaultwarden/ ← T4.1
|
||||||
@@ -69,7 +70,9 @@ g9-migration/
|
|||||||
│ ├── gitea/ ← T4.4
|
│ ├── gitea/ ← T4.4
|
||||||
│ ├── n8n/ ← T4.5
|
│ ├── n8n/ ← T4.5
|
||||||
│ ├── jellyfin/ ← T4.5 (média par référence, /media:ro)
|
│ ├── jellyfin/ ← T4.5 (média par référence, /media:ro)
|
||||||
│ ├── edge/ ← T4.6 : Caddy (Caddyfile versionné = config)
|
│ ├── edge/ ← T4.6 : Caddy G9 (CA interne, edge transitoire)
|
||||||
|
│ ├── edge-j5040/ ← E4 : Caddy J5040 + plugin OVH (LE DNS-01, Caddyfile versionné)
|
||||||
|
│ ├── adguard/ ← E2 : AdGuard Home (DNS filtré, image épinglée digest)
|
||||||
│ └── watchtower/ ← S11.4 : Watchtower sélectif
|
│ └── watchtower/ ← S11.4 : Watchtower sélectif
|
||||||
└── configs/
|
└── configs/
|
||||||
├── fail2ban.local.conf ← config fail2ban (T2.1)
|
├── fail2ban.local.conf ← config fail2ban (T2.1)
|
||||||
@@ -83,8 +86,9 @@ g9-migration/
|
|||||||
| 1 | (xpenology) exclure stateful de Watchtower + inventaire | G4 |
|
| 1 | (xpenology) exclure stateful de Watchtower + inventaire | G4 |
|
||||||
| 2 | `01-hardening.sh` → `02-data.sh` → `03-docker.sh` → `03b-secrets.sh` → `04-smb.sh` → `05-beszel.sh` | — |
|
| 2 | `01-hardening.sh` → `02-data.sh` → `03-docker.sh` → `03b-secrets.sh` → `04-smb.sh` → `05-beszel.sh` | — |
|
||||||
| 3 | `06-restic-backup.sh` (backup + test restauration) | G2 |
|
| 3 | `06-restic-backup.sh` (backup + test restauration) | G2 |
|
||||||
| 4 | **par brique, dans l'ordre** — **après** `03b-secrets.sh` : `07b-migrate-vaultwarden.sh` (T4.1) → `07c-migrate-nextcloud.sh` (T4.2) → `07d-migrate-photoprism.sh` (T4.3, **reporté**) → `07a-migrate-gitea.sh` (T4.4) → Jellyfin (T4.5, frais) → `07e-deploy-edge.sh` (T4.6, Caddy TLS interne) → Watchtower (T4.7, scope stateless). `07-migrate-stateful.sh` = script **générique rsync**, inopérant sur le DSM (sshd refuse `rsync --server`/scp) ; transport réel des 07a–07d = **tar sur SSH** | G4 |
|
| 4 | **par brique, dans l'ordre** — **après** `03b-secrets.sh` : `07b-migrate-vaultwarden.sh` (T4.1) → `07c-migrate-nextcloud.sh` (T4.2) → `07d-migrate-photoprism.sh` (T4.3, **en cours 11/10** — copie 567 Go sans gzip) → `07a-migrate-gitea.sh` (T4.4) → Jellyfin (T4.5, frais) → `07e-deploy-edge.sh` (T4.6, Caddy TLS interne) → Watchtower (T4.7, scope stateless). `07-migrate-stateful.sh` = script **générique rsync**, inopérant sur le DSM (sshd refuse `rsync --server`/scp) ; transport réel des 07a–07d = **tar sur SSH** | G4 |
|
||||||
| 5 | restic 3-2-1 complet (G9 + PC IA → Freebox → 218play) | G2 |
|
| 5 | restic 3-2-1 complet (G9 + PC IA → Freebox → 218play) | G2 |
|
||||||
|
| E (J5040, parallèle) | **E1** durcissement + Docker (`01`/`03` paramétrés, .27) ✅ → **E2** AdGuard (VM Freebox .1 → .27, config migrée) ✅ déploiement, bascule DNS en attente → **E3** DHCP (`09-j5040-dhcp.sh`) + Freebox **mode bridge** (validation utilisateur G6) → **E4** Caddy OVH (`compose/edge-j5040`, LE DNS-01) + WireGuard, puis démontage edge G9 | G6, G7 |
|
||||||
| 6 | `06b-usb-media.sh` (T6.1) → Jellyfin (T6.2) → IP .24→.25 → `08-decommission.sh` | G3, G4, G5 |
|
| 6 | `06b-usb-media.sh` (T6.1) → Jellyfin (T6.2) → IP .24→.25 → `08-decommission.sh` | G3, G4, G5 |
|
||||||
| 7 | (G7) wipe DSM + Ubuntu neuf + boot test | G3, G10 |
|
| 7 | (G7) wipe DSM + Ubuntu neuf + boot test | G3, G10 |
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
# AdGuard Home — E2 (J5040 .27 → .1) : DNS filtré LAN (migration depuis VM Freebox Delta).
|
||||||
|
# Stateless (config = AdGuardHome.yaml versionnée dans le kit) → Watchtower ON (S11.4).
|
||||||
|
# Image épinglée par digest. UI = 8081 LAN-only (ufw), DNS = 53 tcp/udp LAN-only.
|
||||||
|
services:
|
||||||
|
adguard:
|
||||||
|
image: adguard/adguardhome@sha256:aba9e3bf0613be3ba3755e1fc311b126e2c24bec25e18b6483894a88283074f0
|
||||||
|
container_name: adguard
|
||||||
|
restart: unless-stopped
|
||||||
|
labels:
|
||||||
|
- "com.centurylinklabs.watchtower.enable=true"
|
||||||
|
volumes:
|
||||||
|
- /srv/adguard/work:/work
|
||||||
|
- /srv/adguard/data:/opt/adguardhome/conf
|
||||||
|
- /srv/adguard/state:/opt/adguardhome/work
|
||||||
|
ports:
|
||||||
|
- "0.0.0.0:53:53/tcp"
|
||||||
|
- "0.0.0.0:53:53/udp"
|
||||||
|
- "0.0.0.0:8081:80/tcp"
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
{
|
||||||
|
email admin@folzocorp.fr
|
||||||
|
# ACME staging désactivé = certs de production
|
||||||
|
}
|
||||||
|
|
||||||
|
(ovh_tls) {
|
||||||
|
tls {
|
||||||
|
dns ovh
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
(folzocorp) {
|
||||||
|
import ovh_tls
|
||||||
|
encode gzip
|
||||||
|
log {
|
||||||
|
output stdout
|
||||||
|
format console
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cloud.folzocorp.fr {
|
||||||
|
import folzocorp
|
||||||
|
redir 308 {
|
||||||
|
/ /login*
|
||||||
|
}
|
||||||
|
reverse_proxy 192.168.1.24:8080
|
||||||
|
}
|
||||||
|
|
||||||
|
pass.folzocorp.fr {
|
||||||
|
import folzocorp
|
||||||
|
reverse_proxy 192.168.1.24:8081
|
||||||
|
}
|
||||||
|
|
||||||
|
git.folzocorp.fr {
|
||||||
|
import folzocorp
|
||||||
|
reverse_proxy 192.168.1.24:3000
|
||||||
|
}
|
||||||
|
|
||||||
|
media.folzocorp.fr {
|
||||||
|
import folzocorp
|
||||||
|
reverse_proxy 192.168.1.24:8096
|
||||||
|
}
|
||||||
|
|
||||||
|
photos.folzocorp.fr {
|
||||||
|
import folzocorp
|
||||||
|
reverse_proxy 192.168.1.24:2342
|
||||||
|
}
|
||||||
|
|
||||||
|
n8n.folzocorp.fr {
|
||||||
|
import folzocorp
|
||||||
|
reverse_proxy 192.168.1.24:5678
|
||||||
|
}
|
||||||
|
|
||||||
|
matrix.folzocorp.fr {
|
||||||
|
import folzocorp
|
||||||
|
reverse_proxy 192.168.1.24:8008
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
# Edge J5040 (E4) : Caddy + plugin DNS OVH = Let's Encrypt par DNS-01 (achève T4.6/S9.1).
|
||||||
|
# Image épinglée (caddy 2.8.4 + dns.providers.ovh). Stateless → Watchtower ON.
|
||||||
|
# Remplace l'edge du G9 (CA interne) après bascule vérifiée. Secrets = ./secrets/ovh.env (600, hors git).
|
||||||
|
services:
|
||||||
|
caddy:
|
||||||
|
image: maxcryger/caddy-ovh@sha256:502996b5b60aec3ee565324143c14ee4a0c99ff55ace167629981c6c2f2eb597
|
||||||
|
container_name: caddy
|
||||||
|
restart: unless-stopped
|
||||||
|
labels:
|
||||||
|
- "com.centurylinklabs.watchtower.enable=true"
|
||||||
|
env_file:
|
||||||
|
- ./secrets/ovh.env
|
||||||
|
volumes:
|
||||||
|
- ./Caddyfile:/etc/caddy/Caddyfile:ro
|
||||||
|
- caddy_data:/data
|
||||||
|
- caddy_config:/config
|
||||||
|
ports:
|
||||||
|
- "0.0.0.0:80:80/tcp"
|
||||||
|
- "0.0.0.0:443:443/tcp"
|
||||||
|
- "0.0.0.0:443:443/udp"
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "caddy", "validate", "--config", "/etc/caddy/Caddyfile"]
|
||||||
|
interval: 60s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
caddy_data:
|
||||||
|
caddy_config:
|
||||||
@@ -104,3 +104,10 @@
|
|||||||
| 2026-10-11 14:10 | 4 (T4.6) | edge : Caddy déployé (reverse proxy LAN + HTTPS interne) | Briquage T4.6 : TLS interne pour vaultwarden/nextcloud/gitea/jellyfin/n8n/matrix, sous-domaines déjà configurés côté apps (DOMAIN/ROOT_URL/N8N_HOST) → aucune brique touchée | `caddy:2` (digest f2a1290d…) up healthy (healthcheck = `caddy validate`) ; **tls internal** = CA interne (LE + DNS challenge = suite S9.1 via AdGuard J5040) ; **PIÈGES mesurés** : (1) snippet `(name)` importé → « ambiguous site definition » si utilisé comme adresse ; (2) `request_id` nest PAS un directive site (validate KO) ; (3) Caddy logue les en-têtes **reçus du client**, pas ceux envoyés en amont → preuve X-Forwarded prise côté app ; ufw 443/tcp exposé WAN (seul, default deny protège les ports briques) + 80 redirect + 9980 LAN-only ; **Nextcloud** : merge config = `array_replace_recursive` (le dépôt dun 2e fichier *.config.php a été avalé par lentrée existante → résolu en écrivant g9-double-run.config.php = source de vérité du kit, monté :ro) → occ : overwritehost=cloud.folzocorp.fr, overwriteprotocol=https, trusted_proxies=[192.168.1.0/24, 172.16.0.0/12] ; **preuve côté app** : redirect `https://cloud.folzocorp.fr/` → Location `https://cloud.folzocorp.fr/index.php/login` (schéma https + host forwardé rendus par Nextcloud) ; curl -k via edge : pass 200 / git 200 / cloud 200 / media 200 / n8n 200 / matrix 302 / SNI IP 200 ; vaultwarden TRUSTED_HOSTS += 172.16.0.0/12 (aligné) | `docker compose -f /data/docker/edge/docker-compose.yml down` ; `ufw delete allow 443` ; supprimer g9-double-run.config.php (retour double-run http LAN) |
|
| 2026-10-11 14:10 | 4 (T4.6) | edge : Caddy déployé (reverse proxy LAN + HTTPS interne) | Briquage T4.6 : TLS interne pour vaultwarden/nextcloud/gitea/jellyfin/n8n/matrix, sous-domaines déjà configurés côté apps (DOMAIN/ROOT_URL/N8N_HOST) → aucune brique touchée | `caddy:2` (digest f2a1290d…) up healthy (healthcheck = `caddy validate`) ; **tls internal** = CA interne (LE + DNS challenge = suite S9.1 via AdGuard J5040) ; **PIÈGES mesurés** : (1) snippet `(name)` importé → « ambiguous site definition » si utilisé comme adresse ; (2) `request_id` nest PAS un directive site (validate KO) ; (3) Caddy logue les en-têtes **reçus du client**, pas ceux envoyés en amont → preuve X-Forwarded prise côté app ; ufw 443/tcp exposé WAN (seul, default deny protège les ports briques) + 80 redirect + 9980 LAN-only ; **Nextcloud** : merge config = `array_replace_recursive` (le dépôt dun 2e fichier *.config.php a été avalé par lentrée existante → résolu en écrivant g9-double-run.config.php = source de vérité du kit, monté :ro) → occ : overwritehost=cloud.folzocorp.fr, overwriteprotocol=https, trusted_proxies=[192.168.1.0/24, 172.16.0.0/12] ; **preuve côté app** : redirect `https://cloud.folzocorp.fr/` → Location `https://cloud.folzocorp.fr/index.php/login` (schéma https + host forwardé rendus par Nextcloud) ; curl -k via edge : pass 200 / git 200 / cloud 200 / media 200 / n8n 200 / matrix 302 / SNI IP 200 ; vaultwarden TRUSTED_HOSTS += 172.16.0.0/12 (aligné) | `docker compose -f /data/docker/edge/docker-compose.yml down` ; `ufw delete allow 443` ; supprimer g9-double-run.config.php (retour double-run http LAN) |
|
||||||
| 2026-10-11 14:20 | 4 (T4.7) | watchtower : vérification scope stateless + dry-run | S11.4 : MAJ auto uniquement des briques stateless ; leçon incident Nextcloud 06/10 = CLEANUP=false | Conteneur up healthy, image **nickfedor/watchtower épinglée par digest** sha256:45b54f6d… (fork : containrrr/watchtower:1 n'existe pas) ; env mesuré = POLL=3600, LABEL_ENABLE=true, CLEANUP=false, INCLUDE_STOPPED=false ; **labels vérifiés sur les 16 conteneurs .24** : stateful enable=false = nextcloud, collabora, jellyfin, nextcloud_db, nextcloud_redis, vaultwarden, gitea, gitea-db, valheim, n8n, element, synapse, couchdb, obsidian ; enable=true = edge (stateless, T4.6) + watchtower ; **dry-run** `docker run --rm -v /var/run/docker.sock nickfedor/watchtower@sha256:45b54f6d… --label-enable --monitor-only -R` → « Only checking containers with label … enable », **scanned=2 updated=0 failed=0** = les 14 stateful sont ignorés ; notification : webhook n8n testé en POST depuis le réseau Docker → **200** (le compose affichait un placeholder https://n8n.folzocorp.fr → aligné sur generic+http://n8n:5678, nom de service : l'edge n'écoute que 443) ; nickfedor : SCHEDULE et POLL exclusifs, pas de --once (=-R) | `docker compose -f /data/docker/watchtower/docker-compose.yml down` ; aucun effet sur les briques (label-driven) |
|
| 2026-10-11 14:20 | 4 (T4.7) | watchtower : vérification scope stateless + dry-run | S11.4 : MAJ auto uniquement des briques stateless ; leçon incident Nextcloud 06/10 = CLEANUP=false | Conteneur up healthy, image **nickfedor/watchtower épinglée par digest** sha256:45b54f6d… (fork : containrrr/watchtower:1 n'existe pas) ; env mesuré = POLL=3600, LABEL_ENABLE=true, CLEANUP=false, INCLUDE_STOPPED=false ; **labels vérifiés sur les 16 conteneurs .24** : stateful enable=false = nextcloud, collabora, jellyfin, nextcloud_db, nextcloud_redis, vaultwarden, gitea, gitea-db, valheim, n8n, element, synapse, couchdb, obsidian ; enable=true = edge (stateless, T4.6) + watchtower ; **dry-run** `docker run --rm -v /var/run/docker.sock nickfedor/watchtower@sha256:45b54f6d… --label-enable --monitor-only -R` → « Only checking containers with label … enable », **scanned=2 updated=0 failed=0** = les 14 stateful sont ignorés ; notification : webhook n8n testé en POST depuis le réseau Docker → **200** (le compose affichait un placeholder https://n8n.folzocorp.fr → aligné sur generic+http://n8n:5678, nom de service : l'edge n'écoute que 443) ; nickfedor : SCHEDULE et POLL exclusifs, pas de --once (=-R) | `docker compose -f /data/docker/watchtower/docker-compose.yml down` ; aucun effet sur les briques (label-driven) |
|
||||||
| 2026-10-11 14:25 | 4 (clôture) | Phase 4 consolidée + kit poussé sur Gitea | Clôture Phase 4 (critère 5) | `PHASE4-RECOLLEMENT.md` §0 ajouté : briques déployées + versions épinglées (vaultwarden 1.37.4, nextcloud 35.0.1/mariadb 10.11/redis 7/collabora 26.04.5.1.1, gitea 1.27.3/postgres 16, jellyfin 10.9.11, caddy 2 digest f2a1290d, watchtower digest 45b54f6d), **6 incidents + correctifs mesurés**, alignement proxy (trusted_proxies/overwrite/TRUSTED_HOSTS/ufw 443 seul WAN), état .25 (services relancés, dumps supprimés, rien de destructif) ; PhotoPrism T4.3 = **reportée** (script 07d prêt, copie 530 Go) ; README aligné (07e + compose/edge + jellyfin T4.5) ; **push gitea master : HEAD local 366c5ca == gitea/master 366c5ca** (API Gitea vérifiée) ; vault Obsidian = repo `g9ops/obsidian-vault` présent (47 Mo, import T4.4) ; **zéro secret dans git** : `git ls-files` (secrets/*.env/token/key/cred) = 0 fichier de secret, `git grep` des valeurs (token, hash jellyfin, Pw=) = 0, historique `-S token` = 0 ; durcissement : token retiré de l'URL du remote → `~/.git-credentials` 600 + credential.helper store | `git push gitea a1864c6:master` (fast-forward annulable) ; suppression de ~/.git-credentials |
|
| 2026-10-11 14:25 | 4 (clôture) | Phase 4 consolidée + kit poussé sur Gitea | Clôture Phase 4 (critère 5) | `PHASE4-RECOLLEMENT.md` §0 ajouté : briques déployées + versions épinglées (vaultwarden 1.37.4, nextcloud 35.0.1/mariadb 10.11/redis 7/collabora 26.04.5.1.1, gitea 1.27.3/postgres 16, jellyfin 10.9.11, caddy 2 digest f2a1290d, watchtower digest 45b54f6d), **6 incidents + correctifs mesurés**, alignement proxy (trusted_proxies/overwrite/TRUSTED_HOSTS/ufw 443 seul WAN), état .25 (services relancés, dumps supprimés, rien de destructif) ; PhotoPrism T4.3 = **reportée** (script 07d prêt, copie 530 Go) ; README aligné (07e + compose/edge + jellyfin T4.5) ; **push gitea master : HEAD local 366c5ca == gitea/master 366c5ca** (API Gitea vérifiée) ; vault Obsidian = repo `g9ops/obsidian-vault` présent (47 Mo, import T4.4) ; **zéro secret dans git** : `git ls-files` (secrets/*.env/token/key/cred) = 0 fichier de secret, `git grep` des valeurs (token, hash jellyfin, Pw=) = 0, historique `-S token` = 0 ; durcissement : token retiré de l'URL du remote → `~/.git-credentials` 600 + credential.helper store | `git push gitea a1864c6:master` (fast-forward annulable) ; suppression de ~/.git-credentials |
|
||||||
|
| 2026-10-11 15:49 | 4 | migrate:photoprism : backup restic pré-migration | Garde-fou G2 avant import PhotoPrism | snapshot restic Freebox (log /var/log/restic-daily.log) | restic forget <snapshot> && restic prune |
|
||||||
|
| 2026-10-11 15:56 | 4 | migrate:photoprism : backup restic pré-migration | Garde-fou G2 avant import PhotoPrism | snapshot restic Freebox (log /var/log/restic-daily.log) | restic forget <snapshot> && restic prune |
|
||||||
|
| 2026-10-11 16:21 | 4 | migrate:photoprism : backup restic pré-migration | Garde-fou G2 avant import PhotoPrism | snapshot restic Freebox (log /var/log/restic-daily.log) | restic forget <snapshot> && restic prune |
|
||||||
|
| 2026-10-11 16:10 | J5040 (E1) | durcissement J5040 .27 (01-hardening paramétré) | E1 : edge Ubuntu 26.04 neuf, RAM 8 Go test (décision utilisateur) | SSH keys-only + ufw actif (LAN-only 53/3000/8081 + WAN 80/443/51820) + unattended-upgrades + fail2ban ; sudo NOPASSWD folzo ; clés SSH pilot installées ; portable à ajouter via ssh-copy-id | restaurer sshd_config .bak + ufw disable |
|
||||||
|
| 2026-10-11 16:12 | J5040 (E1) | Docker + compose installés sur .27 | Runtime edge | docker 29.1.3 + compose 2.40.3, folzo dans groupe docker | apt-get remove docker.io docker-compose-v2 |
|
||||||
|
| 2026-10-11 16:14 | 07d : copie SANS gzip (photos déjà compressées) | gzip sur CPU NAS = 10-13 Mo/s mesuré → flux brut ~17 Mo/s | tar c|x (sans compression), copie relancée propre (originals purgés, rien de destructif sur .25) | restaurer le script depuis git |
|
||||||
|
| 2026-10-11 16:20 | J5040 (E2) | AdGuard Home déployé sur .27 (migration depuis VM Freebox .1) | E2 : DNS filtré sur l'edge | config VM récupérée en LECTURE SEULE (ssh master@.1, AdGuardHome.yaml 415 l. : 2 filtres 182128+6540 règles, safe_search, services bloqués parents, users bcrypt conservé) ; image épinglée digest aba9e3bf ; UI 8081 LAN, DNS 53 LAN ; systemd-resolved désactivé sur .27 ; tests : doubleclick→0.0.0.0, example.org résolu, UI 302 | docker compose down -v ; VM .1 intacte ; resolv.conf .27 restauré |
|
||||||
|
|||||||
@@ -68,22 +68,29 @@ ufw --force reset >/dev/null
|
|||||||
ufw default deny incoming
|
ufw default deny incoming
|
||||||
ufw default allow outgoing
|
ufw default allow outgoing
|
||||||
ufw allow OpenSSH
|
ufw allow OpenSSH
|
||||||
# Services LAN-only (G9 = LAN-only, l'exposition WAN passe par l'edge — S9.2/S9.3).
|
# Services LAN-only (LAN-only, l'exposition WAN passe par l'edge — S9.2/S9.3).
|
||||||
# Ports des services RÉELS sur .24 (n8n, synapse, element, couchdb, obsidian) +
|
# Listes paramétrables (défaut = G9 .24) : J5040 edge = TCP_LAN="53 3000 8081"
|
||||||
# briques famille futures + Valheim (TCP+UDP). Accessibles depuis le LAN uniquement.
|
# UDP_LAN="53" WAN_TCP="80 443" WAN_UDP="51820".
|
||||||
for port in 2342 3000 3100 5678 5984 8008 8009 8080 8081 8096 9980; do
|
TCP_LAN="${TCP_LAN:-2342 3000 3100 5678 5984 8008 8009 8080 8081 8096 9980}"
|
||||||
|
UDP_LAN="${UDP_LAN:-2456 2457 2458}"
|
||||||
|
WAN_TCP="${WAN_TCP:-443 80}"
|
||||||
|
WAN_UDP="${WAN_UDP:-}"
|
||||||
|
for port in $TCP_LAN; do
|
||||||
ufw allow from 192.168.1.0/24 to any port "$port" proto tcp
|
ufw allow from 192.168.1.0/24 to any port "$port" proto tcp
|
||||||
done
|
done
|
||||||
for port in 2456 2457 2458; do
|
for port in $UDP_LAN; do
|
||||||
ufw allow from 192.168.1.0/24 to any port "$port" proto tcp
|
ufw allow from 192.168.1.0/24 to any port "$port" proto tcp
|
||||||
ufw allow from 192.168.1.0/24 to any port "$port" proto udp
|
ufw allow from 192.168.1.0/24 to any port "$port" proto udp
|
||||||
done
|
done
|
||||||
# T4.6 edge (Caddy) : SEUL port exposé WAN = 443 (+ 80 = redirect ACME/HTTP→HTTPS).
|
# Edge : ports exposés WAN (443 service + 80 redirect ACME/HTTP→HTTPS ; 51820 = WireGuard).
|
||||||
# L'exposition WAN des briques passe par l'edge uniquement (S9.2/S9.3, default deny incoming).
|
for port in $WAN_TCP; do
|
||||||
ufw allow 443/tcp comment 'edge T4.6 (seul port exposé WAN)'
|
ufw allow "$port/tcp" comment "edge WAN ($port)"
|
||||||
ufw allow 80/tcp comment 'edge T4.6 (redirect ACME)'
|
done
|
||||||
|
for port in $WAN_UDP; do
|
||||||
|
ufw allow "$port/udp" comment "edge WAN ($port)"
|
||||||
|
done
|
||||||
ufw --force enable
|
ufw --force enable
|
||||||
journal "ufw activé" "Firewall LAN-only (G6)" "deny incoming, allow outgoing, OpenSSH + services LAN-only 192.168.1.0/24 (TCP 2342 3000 3100 5678 5984 8008 8009 8080 8081 8096 9980 + Valheim 2456-2458 TCP/UDP) + edge 443/80 exposés WAN (T4.6)" "ufw disable"
|
journal "ufw activé" "Firewall LAN-only (G6)" "deny incoming, allow outgoing, OpenSSH + TCP_LAN=[$TCP_LAN] + UDP_LAN=[$UDP_LAN] (LAN-only) + WAN_TCP=[$WAN_TCP] WAN_UDP=[$WAN_UDP]" "ufw disable"
|
||||||
|
|
||||||
# --- 3. unattended-upgrades ---
|
# --- 3. unattended-upgrades ---
|
||||||
log "unattended-upgrades : activation"
|
log "unattended-upgrades : activation"
|
||||||
|
|||||||
@@ -75,10 +75,14 @@ if [[ "${SKIP_COPY:-0}" != "1" ]]; then
|
|||||||
t0=$(date +%s)
|
t0=$(date +%s)
|
||||||
# Progression : tar GNU du G9 émet un pointage sur stderr tous les 50 000 enregistrements
|
# Progression : tar GNU du G9 émet un pointage sur stderr tous les 50 000 enregistrements
|
||||||
# (stderr relayé par ssh) → la copie de 530 Go n'est pas silencieuse pendant des heures.
|
# (stderr relayé par ssh) → la copie de 530 Go n'est pas silencieuse pendant des heures.
|
||||||
if ! $SSH_XP "sudo tar cz -C '$XP_PHOTO' ." | $SSH_G9 "tar xz --checkpoint=50000 --checkpoint-action=echo='[copie] %n enregistrements' -C $G9_DIR/originals"; then
|
# PAS de gzip : photos déjà compressées (JPEG/RAW), gzip sur le CPU du NAS = 10 Mo/s mesuré.
|
||||||
|
# Flux brut = lié par le réseau (~100 Mo/s).
|
||||||
|
if ! $SSH_XP "sudo tar c -C '$XP_PHOTO' ." | $SSH_G9 "tar x --checkpoint=50000 --checkpoint-action=echo='[copie] %n enregistrements' -C $G9_DIR/originals"; then
|
||||||
echo "ERREUR : flux tar interrompu"; exit 1
|
echo "ERREUR : flux tar interrompu"; exit 1
|
||||||
fi
|
fi
|
||||||
t=$(( $(date +%s) - t0 ))
|
t=$(( $(date +%s) - t0 ))
|
||||||
|
# DSM arrive avec des modes 0000/2700 (ACL Synology) → les dirs sont illisibles par folzo.
|
||||||
|
$SSH_G9 "sudo chmod -R u+rwX $G9_DIR/originals"
|
||||||
log " copie terminée en ${t} s"
|
log " copie terminée en ${t} s"
|
||||||
journal "copie photos .25 → G9" "530 Go, source en lecture seule (aucune écriture sur .25)" "tar/ssh relayé par le pilot, ${t} s ; $SRC_COUNT fichiers source" "rm -rf $G9_DIR/originals (source .25 intacte)"
|
journal "copie photos .25 → G9" "530 Go, source en lecture seule (aucune écriture sur .25)" "tar/ssh relayé par le pilot, ${t} s ; $SRC_COUNT fichiers source" "rm -rf $G9_DIR/originals (source .25 intacte)"
|
||||||
fi
|
fi
|
||||||
|
|||||||
Executable
+46
@@ -0,0 +1,46 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# 09-j5040-dhcp.sh — E3 : DHCP sur le J5040 (dnsmasq) en préparation du mode bridge Freebox.
|
||||||
|
#
|
||||||
|
# RÔLE : dnsmasq = DHCP uniquement (DNS coupé : port=0, le DNS LAN = AdGuard .27:53).
|
||||||
|
# Les baux statiques sont lus depuis /srv/dnsmasq/leases (format: MAC,IP,nom — 1 par ligne),
|
||||||
|
# repris de la config DHCP Freebox (baux statiques existants, mêmes IP → G6 : pas de changement d'IP).
|
||||||
|
#
|
||||||
|
# ⚠️ BASCULE (G6) : ce script active le DHCP sur le J5040. La bascule Freebox (DHCP off /
|
||||||
|
# mode bridge) est une ACTION UTILISATEUR explicite. Rollback = couper dnsmasq + rallumer
|
||||||
|
# le DHCP Freebox (baux statiques Freebox intacts, rien n'y a été supprimé).
|
||||||
|
#
|
||||||
|
# Usage : sudo bash 09-j5040-dhcp.sh [interface_LAN] (défaut : enp1s0)
|
||||||
|
set -euo pipefail
|
||||||
|
IFACE="${1:-enp1s0}"
|
||||||
|
LEASES=/srv/dnsmasq/leases
|
||||||
|
log() { echo -e "\n[dhcp] $*"; }
|
||||||
|
|
||||||
|
[[ $EUID -eq 0 ]] || { echo "ERREUR : sudo"; exit 1; }
|
||||||
|
[[ -f "$LEASES" ]] || { echo "ERREUR : $LEASES absent (copier la liste des baux statiques Freebox, format MAC,IP,nom)"; exit 1; }
|
||||||
|
|
||||||
|
log "installation dnsmasq"
|
||||||
|
apt-get update -qq
|
||||||
|
apt-get install -y -qq dnsmasq
|
||||||
|
systemctl disable --now dnsmasq 2>/dev/null || true
|
||||||
|
|
||||||
|
log "config dnsmasq (DHCP only, DNS coupé)"
|
||||||
|
cat > /etc/dnsmasq.conf << EOF
|
||||||
|
interface=$IFACE
|
||||||
|
bind-interfaces
|
||||||
|
port=0
|
||||||
|
dhcp-range=192.168.1.100,192.168.1.240,12h
|
||||||
|
dhcp-option=6,192.168.1.27
|
||||||
|
dhcp-option=3,192.168.1.27
|
||||||
|
no-resolv
|
||||||
|
strict-order
|
||||||
|
dhcp-lease-max=256
|
||||||
|
dhcp-no-override
|
||||||
|
conf-file=$LEASES
|
||||||
|
EOF
|
||||||
|
while IFS=, read -r mac ip name; do
|
||||||
|
[[ -z "${mac// }" || "$mac" == \#* ]] && continue
|
||||||
|
echo "dhcp-host=$mac,$ip,$name"
|
||||||
|
done < "$LEASES" >> /etc/dnsmasq.conf
|
||||||
|
dnsmasq --test && log "config dnsmasq valide"
|
||||||
|
systemctl enable --now dnsmasq
|
||||||
|
log "DHCP actif sur $IFACE (baux = $LEASES). Bascule Freebox = action utilisateur (mode bridge / DHCP off)."
|
||||||
Reference in New Issue
Block a user