feat(install): modo --user-service, instalación sin privilegios
El instalador solo necesitaba root por dos razones circunstanciales: el PREFIX por omisión en /opt y el unit en /etc/systemd/system. El agente en sí no lo necesita — su unit corre como el usuario que instala, y las rutas de data_folder las escribe SQL Server vía las cláusulas MOVE del T-SQL, no el agente. --user-service instala donde apunte PREFIX (escribible por el usuario, típicamente bajo su home) y registra el unit en ~/.config/systemd/user/. Para que sobreviva al cierre de sesión intenta habilitar lingering; si el destino no lo permite, cae a una entrada @reboot en el crontab del usuario más un vigilante cada 5 min que cubre lo que en systemd hace Restart=always. Ninguno de los dos mecanismos requiere root. Con esto, el instalador remoto del panel puede actualizar un servidor cuya cuenta SSH no es root ni tiene sudo sin contraseña, sin pasarle nunca la contraseña a sudo. Detalles que costaron una prueba cada uno: - `pgrep -f "$PREFIX/$BIN_NAME"` se auto-detectaba: la línea de cron del vigilante contiene esa ruta, así que el `sh -c` que la ejecuta hacía match consigo mismo y el vigilante nunca rearrancaba. Va anclado con `^`. - El sed de la plantilla sustituía los marcadores dentro de su propio comentario, dejando rutas absolutas en un texto sin sentido. - El bootstrap de 20 s era el único hijo que heredaba el stdin del canal SSH; ahora lleva `</dev/null`, lo que hace estructural que no pueda consumir nada de él. Reinstalar es idempotente: no duplica entradas de cron.
This commit is contained in:
22
packaging/linux/cloudrestoreas-user.service
Normal file
22
packaging/linux/cloudrestoreas-user.service
Normal file
@@ -0,0 +1,22 @@
|
||||
[Unit]
|
||||
Description=CloudRestoreAS - Restauración automática SQL Server (servicio de usuario)
|
||||
# Sin After=mssql-server.service: un unit de usuario no puede ordenarse respecto de units del
|
||||
# sistema. El agente reintenta la conexión a SQL Server, así que arrancar antes no lo rompe.
|
||||
After=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
# Sin User=: en un unit de usuario lo prohíbe systemd (ya corre como el dueño de la sesión).
|
||||
# Los marcadores de abajo los sustituye install.sh al instalar; no nombrarlos en los comentarios,
|
||||
# porque el sed los reemplazaría aquí también y dejaría rutas absolutas en un texto sin sentido.
|
||||
WorkingDirectory=__WORKDIR__
|
||||
# Servidor headless: plataforma Qt offscreen (sin display) y motor auto-inicio.
|
||||
Environment=QT_QPA_PLATFORM=offscreen
|
||||
ExecStart=__EXEC__ --start-engine --headless
|
||||
Restart=always
|
||||
RestartSec=5
|
||||
# El binario es autocontenido (Qt, ODBC, 7-Zip embebidos): no necesita libs del sistema.
|
||||
|
||||
[Install]
|
||||
# default.target, no multi-user.target: en la instancia de usuario ese es el objetivo de arranque.
|
||||
WantedBy=default.target
|
||||
Reference in New Issue
Block a user