Critical requirements for successful Mac Mini server setup
- 1Password CLI: Install via
brew install 1password-cli- Must be authenticated:
op signin - Requires access to configured vault with server credentials
- Must be authenticated:
- Core command-line tools:
jq,openssl(pre-installed on macOS) - SSH keys: Must exist at
~/.ssh/id_ed25519and~/.ssh/id_ed25519.pub- Generate if missing:
ssh-keygen -t ed25519 -C "your_email@example.com"
- Generate if missing:
Required 1Password login items in your configured vault:
-
Operator Account (item name configurable via
ONEPASSWORD_OPERATOR_ITEM)- Username:
operator(or configured value) - Password: Will be auto-generated if item doesn't exist
- Username:
-
TimeMachine (item name configurable via
ONEPASSWORD_TIMEMACHINE_ITEM)- Username: NAS username for Time Machine backups
- Password: NAS password
- URL field: NAS hostname or SMB URL
-
Plex NAS (item name configurable via
ONEPASSWORD_PLEX_NAS_ITEM)- Username: NAS username for media access
- Password: NAS password
- URL field: NAS hostname (optional, for reference)
-
Apple ID (item name configurable via
ONEPASSWORD_APPLEID_ITEM)- Username: Apple ID email
- Password: Apple ID password
-
OpenSubtitles (item name configurable via
ONEPASSWORD_OPENSUBTITLES_ITEM)- Username: OpenSubtitles account
- Password: OpenSubtitles password
- Copy
config/config.conf.templatetoconfig/config.conf - Customize
SERVER_NAME,ONEPASSWORD_VAULT, and other settings - All 1Password item names are configurable via this file
- Administrator privileges required for:
- WiFi keychain access during prep-airdrop.sh
- External keychain creation and management
- Fresh macOS installation (macOS 15.x recommended)
- Complete Setup Assistant with administrator account created
- FileVault disabled (will be disabled during setup if enabled)
- MUST run from local GUI session (Terminal.app on the Mac Mini)
- CANNOT run via SSH - many operations require GUI access
- Session type must be
Aqua(verified automatically)
- Apple Silicon Mac Mini (Intel may work but untested)
- Network connectivity for package downloads
- Sufficient disk space for applications and packages
- 1Password CLI installed and authenticated (
op whoamisucceeds) - All required 1Password vault items exist and accessible
- SSH keys exist at
~/.ssh/id_ed25519* -
config/config.conffile created and customized - Sufficient disk space for deployment package creation
- Fresh macOS installation completed
- Setup Assistant completed with admin account
- Connected to network with internet access
- Logged in to local GUI session (not SSH)
- FileVault disabled (or willing to disable during setup)
Run these commands on your development machine before starting:
# Verify 1Password CLI authentication
op whoami
# Verify vault access
op vault get "${ONEPASSWORD_VAULT}"
# Check for required 1Password items
op item list --vault "${ONEPASSWORD_VAULT}" | grep -E "operator|TimeMachine|Plex NAS|Apple|OpenSubtitles"
# Verify SSH keys
ls -la ~/.ssh/id_ed25519*
# Check configuration file
test -f config/config.conf && echo "✅ Config file exists" || echo "❌ Create config/config.conf from template"- Ensure you're signed in:
op signin - Check vault name in config.conf matches actual vault
- Verify you have access to all required items
- Generate keys if missing:
ssh-keygen -t ed25519 - Ensure both public and private keys exist
- Keys will be deployed to both admin and operator accounts
- first-boot.sh will detect FileVault and offer to disable it
- Can be disabled manually:
sudo fdesetup disable - Required for automatic login functionality
- first-boot.sh checks session type automatically
- Must be run from Terminal.app on the Mac Mini desktop
- SSH sessions will be rejected with clear error message
- Credentials transferred via encrypted external keychain
- Hardware UUID used as keychain password
- Temporary credential files automatically cleaned up
- All sensitive variables cleared from memory
- SSH keys deployed for secure remote access
- Firewall configured with SSH allowlist
- Password authentication disabled for SSH
- TouchID sudo configured for local administration
- Operator account has limited sudo privileges
- Administrator account retains full system access
- Automatic login configured only for operator account
- Hardware fingerprint prevents wrong-machine execution