Table des matières

Installation d'une appli

192.168.1.78 cnest=2204
🚀 🧭 Procédure STANDARD pour ajouter un sous-domaine + app

👉 à faire dans cet ordre

🟢 1. Ajouter le domaine dans YunoHost
sudo yunohost domain add monapp.pascot.ca

✔ obligatoire
✔ YunoHost va gérer Nginx / SSL interne / app

🟢 2. Installer l’application dessus

👉 soit via interface web
👉 soit en CLI :

sudo yunohost app install NOM_APP -d monapp.pascot.ca

✔ exemple :

sudo yunohost app install dokuwiki -d aquarelles.pascot.ca
🟢 3. Ajouter le DNS Cloudflare (le tunnel)
cloudflared tunnel route dns yunohost monapp.pascot.ca

✔ ça crée automatiquement :

CNAME → cfargotunnel.com
🟢 4. Ajouter dans le tunnel (IMPORTANT 🔴)

👉 éditer :

sudo nano /etc/cloudflared/config.yml

👉 ajouter :

- hostname: monapp.pascot.ca

service: https://localhost:443
originRequest:
  noTLSVerify: true

🟢 5. Redémarrer le tunnel
sudo systemctl restart cloudflared
🧪 6. Tester
https://monapp.pascot.ca
🧠 🧩 Schéma mental (ultra important)

👉 pour CHAQUE sous-domaine il faut :

YunoHost ✔
DNS
Tunnel ✔

Si un des 3 manque → ça casse ❌

⚠️ Erreurs classiques (que tu viens d’éviter 👍)

❌ oublier config.yml → site introuvable
❌ conflit de domaine principal → redirections SSO cassées
❌ A record au lieu de tunnel → mauvais routage

💡 Astuce PRO (gain de temps énorme)

👉 tu peux simplifier config.yml avec wildcard :

- hostname: “*.pascot.ca”

service: https://localhost:443
originRequest:
  noTLSVerify: true

👉 comme ça :
✔ plus besoin d’ajouter chaque sous-domaine
✔ tout passe automatiquement

🎯 Résumé ultra court

👉 pour chaque nouvelle app :

yunohost domain add

installer app

cloudflared tunnel route dns

ajouter dans config.yml

restart tunnel

Installation du tunnel cloudflare avec Telus

🚀 🧭 INSTALLATION COMPLÈTE (propre dès zéro)
🟢 0. Pré-requis

✔ domaine pascot.ca ajouté dans Cloudflare
DNS Cloudflare actif (nameservers Cloudflare)
✔ Raspberry avec YunoHost fraîchement installé
✔ accès SSH OK

🟢 1. Installation initiale YunoHost

👉 depuis navigateur :

http://IP_DU_RASPBERRY

👉 config :

Domaine principal :

pascot.ca

utilisateur admin : au choix

🟢 2. Installer cloudflared
sudo apt update
sudo apt install cloudflared
🟢 3. Authentification Cloudflare
cloudflared tunnel login

👉 dans le navigateur :

choisir pascot.ca

autoriser

👉 vérifie :

ls ~/.cloudflared

✔ doit contenir :

cert.pem
🟢 4. Créer le tunnel
cloudflared tunnel create yunohost

👉 noter :

ID du tunnel (UUID)

fichier .json

🟢 5. Configurer le tunnel

Créer dossier :

sudo mkdir -p /etc/cloudflared

Créer config :

sudo nano /etc/cloudflared/config.yml

👉 contenu :

tunnel: ID_DU_TUNNEL
credentials-file: /home/USER/.cloudflared/ID_DU_TUNNEL.json

ingress:

  1. hostname: pascot.ca

service: https://localhost:443

  originRequest:
    noTLSVerify: true
  1. hostname: “*.pascot.ca”

service: https://localhost:443

  originRequest:
    noTLSVerify: true
  1. service: http_status:404

👉 remplace :

ID_DU_TUNNEL

USER (ex: dpt)

🟢 6. Créer les DNS
Domaine principal
cloudflared tunnel route dns yunohost pascot.ca
Wildcard (option recommandé ⭐)

👉 dans Cloudflare DNS ajouter :

Type Name Target
CNAME * ID.cfargotunnel.com

✔ Proxy activé ☁️

🟢 7. Démarrer le tunnel
sudo cloudflared service install
sudo systemctl enable cloudflared
sudo systemctl start cloudflared
🟢 8. Vérifier
sudo systemctl status cloudflared

✔ doit être :

active (running)
🟢 9. Test

👉 navigateur :

https://pascot.ca

✔ portail YunoHost

✔ sécurisé

Attention aux indentations : cat /etc/cloudflared/config.yml

tunnel: 31fda6d8-dd61-4bc9-bcee-2760f1acde1e
credentials-file: /home/dpt/.cloudflared/31fda6d8-dd61-4bc9-bcee-2760f1acde1e.json

ingress:
  - hostname: pascot.ca
    service: https://localhost:443
    originRequest:
      noTLSVerify: true

  - hostname: aquarelles.pascot.ca
    service: https://localhost:443
    originRequest:
      noTLSVerify: true

  - hostname: photos.pascot.ca
    service: https://localhost:443
    originRequest:
      noTLSVerify: true

  - hostname: partages.pascot.ca
    service: https://localhost:443
    originRequest:
      noTLSVerify: true
  - hostname: journal.pascot.ca
    service: https://localhost:443
    originRequest:
      noTLSVerify: true

  - hostname: carnet.pascot.ca
    service: https://localhost:443
    originRequest:
      noTLSVerify: true

  - service: http_status:404

document pdf

J’ai préparé :

le guide PDF : Guide_YunoHost_Cloudflare_Tunnel_pascot_ca.pdf

le script modèle : install_tunnel_yunohost_pascot.sh

Le guide suit la logique des tunnels Cloudflare gérés localement (cloudflared tunnel login, create, fichier config.yml, routes DNS, service systemd) telle que documentée par Cloudflare, ainsi que les commandes de gestion de domaines YunoHost actuelles.

Le script est pensé pour ton cas :

YunoHost déjà installé

pascot.ca déjà défini comme domaine principal

Raspberry en arm64

tunnel yunohost

wildcard *.pascot.ca dans config.yml pour simplifier les futurs sous-domaines.

Point important : le script s’arrête volontairement si cert.pem n’existe pas encore, afin que tu fasses d’abord l’autorisation navigateur avec cloudflared tunnel login, ce qui correspond au flux normal de Cloudflare pour un tunnel localement géré.

guide_yunohost_cloudflare_tunnel_pascot_ca.pdf

https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/do-more-with-tunnels/local-management/create-local-tunnel/?utm_source=chatgpt.com

script

#!/usr/bin/env bash
set -euo pipefail

# Installation automatique d'un tunnel Cloudflare pour YunoHost
# Hypothèses :
# - YunoHost est déjà installé
# - le domaine principal YunoHost est déjà: pascot.ca
# - vous lancez ce script avec l'utilisateur habituel (ex: dpt), pas root
# - vous ferez manuellement "cloudflared tunnel login" avant de relancer le script si cert.pem n'existe pas

DOMAIN="pascot.ca"
TUNNEL_NAME="yunohost"
CF_USER_HOME="${HOME}"
CF_DIR="${CF_USER_HOME}/.cloudflared"
CONFIG_DIR="/etc/cloudflared"
CONFIG_FILE="${CONFIG_DIR}/config.yml"

need_cmd() {
  command -v "$1" >/dev/null 2>&1 || { echo "Commande manquante: $1"; exit 1; }
}

need_cmd sudo
need_cmd curl
need_cmd awk
need_cmd grep
need_cmd cloudflared || true

echo "== Vérification domaine principal YunoHost =="
if ! sudo yunohost domain list | grep -q "main: ${DOMAIN}"; then
  echo "ERREUR: le domaine principal YunoHost n'est pas ${DOMAIN}."
  echo "Corrigez d'abord cela avant de continuer."
  exit 1
fi

echo "== Installation de cloudflared si nécessaire =="
if ! command -v cloudflared >/dev/null 2>&1; then
  tmpdeb="$(mktemp --suffix=.deb)"
  curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm64.deb -o "${tmpdeb}"
  sudo dpkg -i "${tmpdeb}" || sudo apt-get -f install -y
  rm -f "${tmpdeb}"
fi

echo "== Vérification cert.pem Cloudflare =="
mkdir -p "${CF_DIR}"
if [[ ! -f "${CF_DIR}/cert.pem" ]]; then
  echo "Le fichier ${CF_DIR}/cert.pem est absent."
  echo "Lancez maintenant la commande suivante, validez dans le navigateur, puis relancez ce script :"
  echo
  echo "    cloudflared tunnel login"
  echo
  exit 0
fi

echo "== Création ou récupération du tunnel =="
if cloudflared tunnel list 2>/dev/null | awk '{print $2}' | grep -qx "${TUNNEL_NAME}"; then
  echo "Tunnel ${TUNNEL_NAME} déjà présent."
else
  cloudflared tunnel create "${TUNNEL_NAME}"
fi

TUNNEL_JSON="$(find "${CF_DIR}" -maxdepth 1 -type f -name '*.json' | head -n 1 || true)"
if [[ -z "${TUNNEL_JSON}" ]]; then
  echo "Impossible de trouver le fichier JSON du tunnel dans ${CF_DIR}"
  exit 1
fi

TUNNEL_UUID="$(basename "${TUNNEL_JSON}" .json)"

echo "== Écriture de la configuration cloudflared =="
sudo mkdir -p "${CONFIG_DIR}"
sudo tee "${CONFIG_FILE}" >/dev/null <<EOF
tunnel: ${TUNNEL_UUID}
credentials-file: ${TUNNEL_JSON}

ingress:
  - hostname: ${DOMAIN}
    service: https://localhost:443
    originRequest:
      noTLSVerify: true

  - hostname: "*.${DOMAIN}"
    service: https://localhost:443
    originRequest:
      noTLSVerify: true

  - service: http_status:404
EOF

echo "== Validation de la configuration =="
cloudflared tunnel ingress validate

echo "== Création de la route DNS pour le domaine principal =="
if cloudflared tunnel route dns "${TUNNEL_NAME}" "${DOMAIN}"; then
  echo "Route DNS créée pour ${DOMAIN}"
else
  echo "La route DNS principale existe peut-être déjà. Vérifiez dans Cloudflare DNS."
fi

echo "== Installation et démarrage du service =="
sudo cloudflared service install || true
sudo systemctl enable cloudflared
sudo systemctl restart cloudflared

echo
echo "=== TERMINE ==="
echo "Tunnel UUID : ${TUNNEL_UUID}"
echo "Config      : ${CONFIG_FILE}"
echo
echo "Tests utiles :"
echo "  sudo systemctl status cloudflared"
echo "  https://${DOMAIN}"
echo "  https://${DOMAIN}/yunohost/admin"
echo
echo "Pour un nouveau sous-domaine d'application :"
echo "  sudo yunohost domain add monapp.${DOMAIN}"
echo "  cloudflared tunnel route dns ${TUNNEL_NAME} monapp.${DOMAIN}"
echo "  sudo yunohost app install NOM_DE_L_APP -d monapp.${DOMAIN}"