aipackage/autoinstall/user-data-workstation
Jino Jose 10b66569b6 Add dedicated Nexus One AI Workstation ISO build path
- New build-iso-workstation.sh / autoinstall/user-data-workstation: writes
  the workstation tier marker (/opt/cezen/tier), reuses the Server S
  (starter) hardware profile and Ansible playbook under the hood
- firstboot-setup.sh: additive WORKSTATION_MODE branch (gated on
  CEZEN_TIER=workstation) skips the Server tier-selection menu entirely —
  Workstation is never offered as a Server S/M/L/Max choice. Non-workstation
  installs are unaffected. Also relabels the Server tier menu to
  Server S/M/L/Max, matching the earlier portal rename
- install.sh and the Ansible playbooks are unchanged; only the pre/post
  marker files differ between a Server S and Workstation install
- README.md + MIGRATION_NOTES.md updated with the new build path and what
  is still manual (CEZEN_TIER isn't yet templated into the deployed
  cezen-api systemd unit — tracked as follow-up)
2026-07-08 15:10:34 +05:30

157 lines
6.1 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#cloud-config
# ─────────────────────────────────────────────────────────────
# Nexus One AI — Workstation Autoinstall
# Hardware target: personal AI appliance (Mini-ITX / SFF / DGX Spark class)
# GPU: NVIDIA DGX Spark, RTX 5090 Workstation, or RTX PRO 6000
# Workstation (1 GPU)
# RAM: 64 GB DDR5
# Storage: 1× 2 TB NVMe SSD (single drive — simple LVM)
# Network: 2.5 GbE (single interface)
# Users: 1-3 active, 5 max — not a shared server, no HA
#
# This reuses the same compact single-GPU install profile as the Server S
# ("starter") image below — same hardware class, same Ansible playbook
# (ansible/starter.yml) — but is a distinct, standalone product category
# (Nexus One AI Workstation), not part of the Server S/M/L/Max ladder.
# See cezen_license.WORKSTATION_TIER / TIER_MATRIX["workstation"].
# ─────────────────────────────────────────────────────────────
autoinstall:
version: 1
# ── Locale & keyboard ──────────────────────────
locale: en_IN.UTF-8
keyboard:
layout: us
# ── Network: DHCP during install; static config applied post-install ──
network:
network:
version: 2
ethernets:
any-en:
dhcp4: true
match:
name: "en*"
any-eth:
dhcp4: true
match:
name: "eth*"
# ── Storage: single 2 TB NVMe, simple LVM ─────
# Workstations have one drive — no RAID needed.
storage:
layout:
name: lvm
match:
size: largest
# ── Identity ──────────────────────────────────
identity:
hostname: cezenai-workstation
username: cezen
# Default password: cezen@123 (change via first-boot wizard)
password: "$6$I5VA.42G1xTeVhCv$KCLzqIKg/kbNHZyiTEMAY4FZsJMDDwoS90k6Ffb9VEwmcK.wuzlJNe3ceiEfLrzYzXEvqjYsLc7klAbeGPGab."
# ── SSH ───────────────────────────────────────
ssh:
install-server: true
allow-pw: true
# ── Base packages ─────────────────────────────
packages:
- git
- curl
- wget
- python3
- whiptail
- openssh-server
- nvme-cli # NVMe health / SMART monitoring
# ── Late commands ─────────────────────────────
late-commands:
# Expand LVM to fill the full 2 TB NVMe
- lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv || true
- resize2fs /dev/ubuntu-vg/ubuntu-lv || true
# Passwordless sudo for cezen (needed by install.sh + first-boot wizard)
- echo "cezen ALL=(ALL) NOPASSWD:ALL" > /target/etc/sudoers.d/cezen
- chmod 440 /target/etc/sudoers.d/cezen
# Replace installer netplan with simple DHCP target config.
# The first-boot wizard will switch to static if desired.
- rm -f /target/etc/netplan/50-cloud-init.yaml /target/etc/netplan/00-installer-config.yaml || true
- |
cat > /target/etc/netplan/99-cezen-dhcp.yaml << 'EOF'
network:
version: 2
ethernets:
any-en:
dhcp4: true
match:
name: "en*"
any-eth:
dhcp4: true
match:
name: "eth*"
EOF
# Disable cdrom APT source
- sed -i 's/^deb cdrom:/# deb cdrom:/' /target/etc/apt/sources.list || true
# Pull the Nexus One AI installer from cgit. The ISO intentionally does not
# bundle the full package, keeping the image small and the installed code
# current at deployment time.
- mkdir -p /target/opt/aipackage
- git clone https://cgit.cezentech.com/jinojose/aipackage.git /target/opt/aipackage
# Write tier marker — used by install.sh (as a fallback default only;
# the first-boot wizard always passes --tier=starter explicitly for
# Ansible routing) and by the portal branding/entitlement system, which
# reads "workstation" here to show Nexus One AI Workstation branding and
# the workstation feature set (TIER_MATRIX["workstation"]) instead of a
# Server tier. install.sh never writes to this file, so it persists
# unchanged through Phase 1 and Phase 2.
- mkdir -p /target/opt/cezen
- echo "workstation" > /target/opt/cezen/tier
# Deploy first-boot TUI wizard
- cp /target/opt/aipackage/autoinstall/firstboot-setup.sh /target/opt/cezen/firstboot-setup.sh
- chmod +x /target/opt/cezen/firstboot-setup.sh
# Set hostname
- echo "cezenai-workstation" > /target/etc/hostname
- sed -i 's/aiserver/cezenai-workstation/g' /target/etc/hosts || true
# Systemd service: run first-boot wizard on tty1 once.
# CEZEN_TIER=workstation tells firstboot-setup.sh to skip the Server
# tier-selection menu (Step 3) — Workstation is never offered there.
- |
cat > /target/etc/systemd/system/cezen-setup.service << 'EOF'
[Unit]
Description=Nexus One AI — Console Setup Wizard (Workstation)
After=cloud-final.service cloud-init.target network-online.target
Wants=cloud-init.target network-online.target
ConditionPathExists=!/opt/cezen/.setup-done
OnFailure=getty@tty1.service
[Service]
Type=oneshot
WorkingDirectory=/opt/cezen
ExecStartPre=-/bin/systemctl stop getty@tty1.service
ExecStartPre=-/usr/bin/chvt 1
ExecStart=/bin/bash -lc 'clear >/dev/tty1 2>/dev/null || true; /usr/bin/openvt -c 1 -f -w -- env TERM=linux CEZEN_TIER=workstation /opt/cezen/firstboot-setup.sh'
ExecStartPost=-/bin/systemctl start getty@tty1.service
StandardOutput=journal+console
StandardError=journal+console
Restart=no
[Install]
WantedBy=cloud-init.target
EOF
- curtin in-target -- systemctl enable ssh
- curtin in-target -- systemctl enable cezen-setup.service
user-data:
disable_root: false