57 lines
2.6 KiB
Bash
Executable File
57 lines
2.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
#
|
|
# Démarrage d'une instance Homarr sous un utilisateur non privilégié.
|
|
#
|
|
# À poser à la place du `run.sh` de l'instance (ou à viser directement depuis
|
|
# l'`ExecStart` de l'unité). Le `run.sh` du dépôt suppose root et un conteneur ;
|
|
# celui-ci suppose systemd et un utilisateur ordinaire. Les différences, et leur
|
|
# raison :
|
|
#
|
|
# - Pas de nginx. Écrire /etc/nginx/nginx.conf et écouter le port 80 exigent
|
|
# tous deux root. Le proxy inverse devient un service système distinct — il
|
|
# reste NÉCESSAIRE : le client se connecte à ws://<hôte>:<port>/websockets,
|
|
# sur la même origine que la page, alors que le serveur WebSocket écoute sur
|
|
# 3001. Sans proxy, l'application répond mais perd ses mises à jour en direct.
|
|
#
|
|
# - Pas de redis interne. `redis-server` est un service système ici
|
|
# (REDIS_IS_EXTERNAL=true), et le lancer depuis ce script le ferait tourner
|
|
# sous l'utilisateur du service, sans son répertoire d'état.
|
|
#
|
|
# - Pas de `mkdir` d'état. `StateDirectory=` dans l'unité crée le dossier ET
|
|
# le donne à l'utilisateur du service, ce qu'un `mkdir` lancé sans droits ne
|
|
# peut pas faire.
|
|
#
|
|
# - Pas de boucle de redémarrage ni de `trap`. `Restart=on-failure` le fait
|
|
# déjà, et mieux : il compte les échecs, applique un délai, et n'a pas de
|
|
# PID à perdre. D'où le `exec` final — le serveur Next devient le processus
|
|
# principal de l'unité, celui que systemd surveille et signale directement.
|
|
#
|
|
set -u
|
|
|
|
if [ "${DB_MIGRATIONS_DISABLED:-}" = "true" ]; then
|
|
echo "DB migrations are disabled, skipping"
|
|
else
|
|
echo "Running DB migrations"
|
|
if ! DISABLE_REDIS_LOGS=true node "./db/migrations/${DB_DIALECT}/migrate.cjs" "./db/migrations/${DB_DIALECT}"; then
|
|
echo "ERROR: DB migrations failed, aborting startup" >&2
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
# Requis par le cadre d'authentification, mais inutilisé : ni JWT ni hachage de
|
|
# courriel ici. Régénéré à chaque démarrage, comme dans l'image.
|
|
AUTH_SECRET="$(openssl rand -base64 32)"
|
|
export AUTH_SECRET
|
|
|
|
# L'image écoute sur 0.0.0.0 parce que le nom d'hôte que Docker fabrique n'est
|
|
# pas toujours résolvable. Derrière un proxy local, la boucle locale suffit et
|
|
# évite d'exposer le serveur applicatif directement.
|
|
#
|
|
# Le défaut se lit sur HOMARR_BIND_HOST et non sur HOSTNAME : bash initialise
|
|
# lui-même HOSTNAME au nom de la machine, donc `${HOSTNAME:-127.0.0.1}` ne
|
|
# prendrait jamais sa valeur par défaut — Next résoudrait ce nom et écouterait
|
|
# sur l'adresse du réseau, exactement ce qu'on veut éviter ici.
|
|
export HOSTNAME="${HOMARR_BIND_HOST:-127.0.0.1}"
|
|
|
|
exec node apps/nextjs/server.js
|