Files
platform/SETUP_GUIDE.md
T
pastilhas db6d4fe30f refactor: make Node.js installation automatic in setup.sh
- 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.
2026-03-04 02:13:49 +00:00

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:

  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?

# 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:

  • 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.

# 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:

  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