- setup.sh now automatically installs Node 22 via NodeSource if not found - No more separate manual Node installation step required - Simplified to single command: bash scripts/setup.sh - Works for apt/pacman/brew systems - Updated SETUP_GUIDE.md with simplified instructions - Better logging during Node installation process Users can now simply run: bash scripts/setup.sh And everything (including Node 22) will be installed automatically.
6.3 KiB
Officer Setup Guide
Overview
Officer is a self-hosted AI intranet for teams. This guide covers fresh installation on Ubuntu/Debian servers.
Architecture
Officer uses system-wide Node.js v22 to ensure all users have consistent access:
System Node.js v22 (/usr/bin/node)
↓
All users automatically get:
├── node, npm, bun
├── pi, claude (coding agents)
├── go, rustc (compilers)
└── All tools and services
Systemd Services (use system Node)
├── officer-pty-sidecar
├── officer (main server)
└── (other services)
Benefits:
- One Node version for everyone (no conflicts)
- New users automatically get same setup
- Services use consistent environment
- Simple to maintain and troubleshoot
- Automatic installation (setup.sh handles it)
Installation Steps
Quick Start (One Command)
cd /path/to/officer/monorepo
bash scripts/setup.sh
That's it! The script will:
- Install Node.js 22 automatically (if not found)
- Install all dependencies
- Setup all services
- Verify everything works
What Happens Automatically
The setup script automatically:
- Checks if Node 22 is installed
- If not, sets up NodeSource repository and installs it
- Installs all system packages, tools, and npm globals
- Creates systemd services
- Verifies everything works
No manual Node installation needed!
Coming from nvm?
# If you previously installed via nvm, you can remove it
# (optional, won't interfere)
rm -rf ~/.nvm
# Or keep it for local dev, but system Node will take precedence for services
The system Node (installed by setup.sh) will be used by:
- All users
- All systemd services
- All npm global packages
- Officer server itself
This will:
- Install all system dependencies (git, build tools, ffmpeg, etc.)
- Install Bun, Go, Rust
- Install npm global packages (pi, claude-code, etc.)
- Setup PulseAudio for audio
- Setup remote desktop (XFCE + VNC)
- Configure PTY sidecar systemd service
- Verify everything works
Note: Setup script uses sudo for system-level installations. You'll be prompted for your password.
Verify Installation
After setup.sh completes, verify as any user:
node --version # v22.x.x
which pi # /usr/bin/pi
which claude # /usr/bin/claude
which bun # /usr/local/bin/bun
# Test Pi works
pi --list-models
# Test Officer can start
bun dev
# In another terminal, test API
curl http://localhost:5000/api/pi/models
Start Officer
Development:
bun dev
Production (with PM2):
pm2 start ecosystem.config.cjs
pm2 logs officer
Production (with systemd):
sudo systemctl start officer
sudo systemctl status officer
Multi-User Scenarios
Scenario A: Server with Multiple Users
All users automatically get access to:
nodecommand (system-wide)pi,claude(system-wide npm packages)- Officer web UI (via port/proxy)
No setup needed per user. Just install globally once as shown above.
# User 1
$ which node
/usr/bin/node
# User 2 (different terminal/server)
$ which node
/usr/bin/node
# Both work!
Scenario B: Development User Wants nvm
Important: For production, DON'T do this. But for dev, you can:
# As a user (not system-wide)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
nvm install 22
nvm use 22
# Now you can use nvm locally, but make sure system Node is also installed for services
which node # /home/user/.nvm/versions/node/v22.x.x/bin/node (your local override)
The officer-pty-sidecar systemd service will still use /usr/bin/node (system-wide).
Troubleshooting
"node: command not found"
This shouldn't happen if setup.sh ran successfully. But if it does:
# Run setup script again — it will install Node if missing
bash scripts/setup.sh
# Or manually install:
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt-get install -y nodejs
# Verify
node --version # Should be v22.x.x
"pi: command not found"
# Pi not installed
sudo npm install -g @mariozechner/pi-coding-agent
# Or use setup script
bash scripts/setup.sh
"Pi process exited with code 1" in chat
This usually means snap node was used. Don't use snap node for Officer.
# Check if snap node is installed
which node
# If output contains "/snap/bin/node", remove it:
sudo snap remove node
# Then install system Node
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt-get install -y nodejs
# Verify
which node # /usr/bin/node (NOT /snap/bin/node)
PTY Sidecar service won't start
# Check status
sudo systemctl status officer-pty-sidecar
# Check logs
journalctl -u officer-pty-sidecar -n 20
# Verify Node is installed
/usr/bin/node --version
# Restart
sudo systemctl restart officer-pty-sidecar
Files Changed/Created
scripts/setup.sh— Main installation script (updated to use system Node)scripts/setup-pty-sidecar.sh— PTY sidecar systemd service setup (updated)ecosystem.config.cjs— PM2 config (no changes, using systemd instead)SETUP_GUIDE.md— This file
What NOT To Do
❌ Don't use snap node
- It has file descriptor issues with piped processes
- Use system Node via NodeSource instead
❌ Don't mix Node versions per user
- For production: one Node version for everyone (system-wide)
- For dev: sure, use nvm, but keep system Node installed too
❌ Don't install npm packages locally for system services
- Services need system-wide packages (
sudo npm install -g) - Or use absolute paths in service files
✅ Do:
- Use system Node 22 via NodeSource
- Install global packages once with
sudo npm install -g - Use systemd services for daemons
- Let all users share the same tools
Quick Start
cd /path/to/officer/monorepo
bash scripts/setup.sh
bun dev
Open browser: http://localhost:5000 (or your configured port)
That's it! Everything is installed automatically.
Support
If you hit issues:
- Check troubleshooting section above
- Verify system Node is installed:
node --version - Check service logs:
journalctl -u officer-pty-sidecar - Re-run setup script:
bash scripts/setup.sh