- 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.
287 lines
6.3 KiB
Markdown
287 lines
6.3 KiB
Markdown
# 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)
|
|
|
|
```bash
|
|
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:
|
|
1. Checks if Node 22 is installed
|
|
2. If not, sets up NodeSource repository and installs it
|
|
3. Installs all system packages, tools, and npm globals
|
|
4. Creates systemd services
|
|
5. Verifies everything works
|
|
|
|
**No manual Node installation needed!**
|
|
|
|
### Coming from nvm?
|
|
|
|
```bash
|
|
# 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:
|
|
|
|
```bash
|
|
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:**
|
|
```bash
|
|
bun dev
|
|
```
|
|
|
|
**Production (with PM2):**
|
|
```bash
|
|
pm2 start ecosystem.config.cjs
|
|
pm2 logs officer
|
|
```
|
|
|
|
**Production (with systemd):**
|
|
```bash
|
|
sudo systemctl start officer
|
|
sudo systemctl status officer
|
|
```
|
|
|
|
---
|
|
|
|
## Multi-User Scenarios
|
|
|
|
### Scenario A: Server with Multiple Users
|
|
|
|
All users automatically get access to:
|
|
- `node` command (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.
|
|
|
|
```bash
|
|
# 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:
|
|
|
|
```bash
|
|
# 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:
|
|
|
|
```bash
|
|
# 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"
|
|
|
|
```bash
|
|
# 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.
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
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:
|
|
1. Check troubleshooting section above
|
|
2. Verify system Node is installed: `node --version`
|
|
3. Check service logs: `journalctl -u officer-pty-sidecar`
|
|
4. Re-run setup script: `bash scripts/setup.sh`
|