# AgentiCo One como servicio de systemd, con un usuario sin privilegios. # instalar-servicio.sh reemplaza los valores @...@ y lo copia a # /etc/systemd/system/agentico.service. [Unit] Description=AgentiCo One After=network-online.target Wants=network-online.target [Service] Type=simple User=@USER@ Group=@USER@ WorkingDirectory=@DIR@ # Antes de arrancar, y como root ("+"), deja la carpeta de trabajo lista: la # crea si falta (por ejemplo, si se reemplazó la carpeta del binario) y le # devuelve al servicio lo que haya quedado de otro dueño (por ejemplo, tras # ejecutar el binario con sudo). Sin esto, el servicio no arranca. ExecStartPre=+/usr/bin/install -d -o @USER@ -g @USER@ -m 0750 @WORKSPACE@ @WORKSPACE@-projects ExecStartPre=+/usr/bin/find @WORKSPACE@ @WORKSPACE@-projects ! -user @USER@ -exec chown -h @USER@:@USER@ {} + ExecStart=@DIR@/agentico-one @ARGS@ -workspace @WORKSPACE@ Environment=HOME=@HOME@ # Variables propias (claves, URL pública…). Se editan en la sección Cloud de la # web o con sudo; el guion inicial las hace opcionales. EnvironmentFile=-/etc/agentico/agentico.env Restart=on-failure RestartSec=5 UMask=0027 # Solo puede escribir en sus datos y en su carpeta personal (cachés de PI, Go, # npm). El resto del sistema, incluidos el binario y setup.json, queda en solo # lectura, y /root y /home no son visibles. Si AgentiCo One está bajo /home, # /home queda vacío salvo esa carpeta, que se monta en el mismo lugar. # setup.json y users.json se cambian desde la web a través de agentico-host. ProtectSystem=strict ReadWritePaths=@WORKSPACE@ -@WORKSPACE@-projects @HOME@ # /var/lib/agentico es disco local del servicio (systemd la crea con su # dueño): ahí va la sesión de WhatsApp (whatsapp.dataDir) cuando el workspace # está en una unidad montada, donde SQLite no funciona bien. StateDirectory=agentico StateDirectoryMode=0750 ProtectHome=@PROTECT_HOME@ @BIND_PATHS@ PrivateTmp=yes NoNewPrivileges=yes CapabilityBoundingSet= AmbientCapabilities= RestrictSUIDSGID=yes ProtectKernelTunables=yes ProtectKernelModules=yes ProtectKernelLogs=yes ProtectControlGroups=yes ProtectClock=yes ProtectHostname=yes LockPersonality=yes RestrictRealtime=yes # Sin acceso al servicio de metadatos de Azure: ni el agente ni los comandos que # ejecuta pueden pedir tokens de la identidad administrada de la VM. IPAddressDeny=169.254.169.254/32 [Install] WantedBy=multi-user.target