4.2 KiB
4.2 KiB
Install Strategy
Goal
A one-liner installer that sets up the companion server beside an existing Hermes Agent install.
Target UX:
curl -fsSL https://hermes-mobile.molberg.cloud/install.sh | bash
or from Gitea release/raw if accessible without auth:
curl -fsSL https://git.molberg.cloud/bonzi/hermes-mobile/raw/branch/main/install.sh | bash
Because Zeb's Gitea raw URLs may require auth, release assets or a mirrored static install URL are safer for the public one-liner.
Installer Responsibilities
- Detect OS/package manager.
- Detect Hermes Agent:
command -v hermes~/.hermes/config.yaml- optional
HERMES_HOME
- Check Node.js version or install bundled binary/runtime.
- Download latest Hermes Mobile companion release.
- Create config.
- Create data directories.
- Install systemd service.
- Start service.
- Print pairing URL and one-time code.
Installation Modes
System mode (default for servers)
Paths:
/opt/hermes-mobile/ app bundle
/etc/hermes-mobile/config.yaml config
/var/lib/hermes-mobile/ DB/uploads/cache
/var/log/hermes-mobile/ logs if not journald-only
Service:
hermes-mobile-companion.service
Run user:
- Option A: current user/root if Hermes is root-installed.
- Option B:
hermes-mobileuser with group/read permissions to Hermes paths.
For Zeb's box, same user/root is simplest initially because Hermes files live under /root/.hermes.
User mode
curl ... | bash -s -- --user
Paths:
~/.local/opt/hermes-mobile/
~/.config/hermes-mobile/config.yaml
~/.local/share/hermes-mobile/
~/.config/systemd/user/hermes-mobile-companion.service
Service Unit Draft
[Unit]
Description=Hermes Mobile Companion Server
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/hermes-mobile
Environment=NODE_ENV=production
Environment=HERMES_MOBILE_CONFIG=/etc/hermes-mobile/config.yaml
ExecStart=/usr/bin/node /opt/hermes-mobile/server/index.js
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
Config Generation
Installer should write:
server:
host: 0.0.0.0
port: 8787
public_url: ""
hermes:
home: /root/.hermes
cli_bin: /root/.local/bin/hermes
mode: python
api_base_url: http://127.0.0.1:18793/v1
storage:
data_dir: /var/lib/hermes-mobile
max_upload_mb: 512
auth:
pairing_enabled: true
notifications:
provider: webpush
Pairing Output
After start:
Hermes Mobile installed.
Open this on your phone:
http://SERVER-IP:8787/pair?code=123-456
Pairing code:
123-456
Service:
systemctl status hermes-mobile-companion
Logs:
journalctl -u hermes-mobile-companion -f
Update
curl -fsSL https://hermes-mobile.molberg.cloud/install.sh | bash -s -- --update
Should:
- Download latest release.
- Preserve config and data.
- Restart service.
- Run DB migrations.
Uninstall
curl -fsSL https://hermes-mobile.molberg.cloud/install.sh | bash -s -- --uninstall
Should ask/flag whether to keep data:
--keep-data--purge
Release Layout
Build artifact:
hermes-mobile-linux-x64.tar.gz
server/
index.js
package.json
node_modules/ or bundled single executable
public/
PWA assets
scripts/
hermes_worker.py
migrations/
Better later:
- single static binary via Bun/Node SEA if stable enough.
- Docker image optional but not the primary install path.
One-liner Safety
Installer should:
- Show what it will do.
- Avoid deleting data unless explicitly asked.
- Not overwrite existing config without backup.
- Use
set -euo pipefail. - Log to temp file.
- Verify download checksum if release metadata supports it.
Development Install
From cloned repo:
pnpm install
pnpm dev
Companion dev server:
pnpm --filter companion dev
Mobile dev server:
pnpm --filter mobile dev --host 0.0.0.0
Future Cloudflare/Tailscale
Expose options:
- Tailscale only: bind to
100.xIP or localhost behindtailscale serve. - Cloudflare Tunnel: companion prints local port and expected reverse proxy config.
- Nginx/Caddy snippets generated by installer.