Proxmox - Initial Setup

Proxmox Initial Install & Provisioning#

This guide contains the steps performed immediately after installing Proxmox VE. These steps are designed to be integrated into the ultimate_master_restore.sh script.


1 System Maintenance#

1.1 Update System (Included in Restore script)#

apt update && apt full-upgrade -y
apt autoremove && apt autoclean

2 SSH Configuration#

2.1 Configure SSH Public Key (Included in Restore script)#

Edit authorized keys:

nano ~/.ssh/authorized_keys

Paste SSH keys for [1Password Private note](https://start.1password.com/open/i?a=G7ECSBBRRFHWPDIM7F7J6TWP7I&v=4bxn4d3worhhq7rc6m3usjciia&i=6hoe6ndejfr5evqpatwk2xsatq&h=my.1password.com)

Restart SSH:

AI - Gemini CLI - Proxmox MCP

Proxmox MCP Installation (Sillicon Mac) Intel below#

This guide details the process for installing the Proxmox Model Context Protocol (MCP) server and integrating it with Gemini-CLI to manage virtual machines and containers directly from the terminal.

1 Prerequisites#

  • Proxmox VE: Access to a Proxmox cluster or node.
  • Gemini-CLI: Installed via Homebrew or npm.
  • Python 3.10+: Required for the MCP server environment.
  • API Token: Created in Proxmox (Datacenter > Permissions > API Tokens). Ensure the token has sufficient permissions (e.g., PVEAuditor or PVEVMAdmin) and ‘Privilege Separation’ is unchecked.

2 Server Installation#

Run the following commands to clone the repository and set up the Python environment in a dedicated directory.

Proxmox - Postfix Notification Cleanup

Tag

Postfix Notification Management Guide#

This guide breaks down the process into manual steps. Each block contains specific commands to audit, remove, or verify your mail configuration.


1. Part 1: Test if Configuration is Present#

These commands verify if the Gmail relay and header rewriting are currently active on the server.

1.1. Check Service and Dependencies#

Verify if Postfix is active and if the relay-specific modules are installed.

systemctl is-active postfix
dpkg -l | grep -E 'libsasl2-modules|mailutils|postfix-pcre'

1.2. Locate Credential and Mapping Files#

Check for the existence of the SASL password database and the header check configuration.

AI - Claude Code CLI

Local AI Coding Agent Setup#

This guide documents the steps taken to install and configure Claude Code to run 100% locally on the Mac Studio M4 (64GB) using Ollama, ensuring complete privacy for local folders and Obsidian vaults.


1. Prerequisites (Mac Studio)#

  • Hardware: Mac Studio M4 (64GB Unified Memory).
  • Environment: Node.js v25.8.0 installed.
  • Local Brain: Ollama installed and running.

2. Install Claude Code (Native)#

Instead of using npm, we used the official native installer from Anthropic for better performance and signed binary security.

Obsidian Plugins

Obsidian Plugins#


1 Obsidian Git (Multi-Device Sync)#

We sync our vaults between desktop and laptop computers directly using the Obsidian Git plugin connecting to GitHub.

  • Repository: git@github.com:marcoue/obsidian-homelab.git
  • Shortcuts:
    • Cmd + S: Commit & Push local changes.
    • Cmd + Shift + S: Pull remote changes.
  • Auto-Syncing: Configured to pull on startup, pull updates in background every 5 minutes, and backup (commit/push) in background every 10 minutes.

1.1 [RETIRED] Self-Hosted LiveSync (CouchDB)#

Note: The CouchDB Docker container on MMDocker (10.1.2.230) has been stopped and disabled, and the plugin has been uninstalled from all vaults to avoid sync storms and deletion loops.#

2 Obsidian Terminal Plugin: Configuration Guide#

This guide details the setup for the Obsidian Terminal Plugin on a MacStudio (macOS) to ensure it correctly utilizes the modern Python environment and integrated Zsh shell.

1Password CLI & Docker Deployment Guide

1Password CLI & Docker Deployment Guide#


2026-08-03 Troubleshooting popups for MCP server with account tokens - To implement on VM’s using OP: agy –conversation=22663bf8-df61-4167-99ad-7a3d9884c879 1

1. Installation#

1.1. Install 1Password CLI (Linux VM)#

# 1. Add the key
curl -sS [https://downloads.1password.com/linux/keys/1password.asc](https://downloads.1password.com/linux/keys/1password.asc) | sudo gpg --dearmor --output /usr/share/keyrings/1password-archive-keyring.gpg

# 2. Add the repository
echo 'deb [arch=amd64 signed-by=/usr/share/keyrings/1password-archive-keyring.gpg] [https://downloads.1password.com/linux/debian/amd64](https://downloads.1password.com/linux/debian/amd64) stable main' | sudo tee /etc/apt/sources.list.d/1password.list

# 3. Update and Install
sudo apt update && sudo apt install 1password-cli

1.2. Install 1Password CLI (LXC)#

# 1. Add the key
# 1. Ensure system initialization package is present
sudo apt update && sudo apt install systemd-sysv -y

# 2. Add the key securely
curl -sS [https://downloads.1password.com/linux/keys/1password.asc](https://downloads.1password.com/linux/keys/1password.asc) | sudo gpg --dearmor --output /usr/share/keyrings/1password-archive-keyring.gpg

# 3. Add the official repository
echo 'deb [arch=amd64 signed-by=/usr/share/keyrings/1password-archive-keyring.gpg] [https://downloads.1password.com/linux/debian/amd64](https://downloads.1password.com/linux/debian/amd64) stable main' | sudo tee /etc/apt/sources.list.d/1password.list

# 4. Update repositories and install the CLI
sudo apt update && sudo apt install 1password-cli -y

1.3. Install 1Password CLI (macOS)#

# Install via Homebrew
brew install 1password-cli

2. Authentication & Account Setup#

2.1. Initial Account Setup (One-time)#

To add your 1Password account to the CLI manually:

AI

1. Prompts#

#gemini

1.1. AI Instructions - Models#

Provide in Markdown. Wrap the entire output—frontmatter and all—inside a single code block using FOUR backticks (````) so that the internal triple-backticks do not break the block. I want one single 'Copy' button for the entire file.
Format the following text into the Proxmox Markdown model below. Wrap the entire output—frontmatter and all—inside a single code block using FOUR backticks (````) so that the internal triple-backticks do not break the block. I want one single 'Copy' button for the entire file.
#Antigravity - Start a new chat
Read the MISSON.md file to bring you up to date. Tell me what you understand from the project. We will do minor corrections during this sessions. Wait for my prompts, do not modify any files now.

#gemini-cli 
   In /Users/marc/Antigravity/GenDash, overwrite codebase.md using a single run_shell_command with a bash loop for maximum speed. Do not use sub-agents. Include ONLY: MISSION.md and these files from the GenDash/ folder: GeneratorProfile.swift, GeneratorRun.swift, HAServer.swift, GeneratorEnums.swift, ConsumptionEngine.swift, EnvironmentalPhysics.swift, HAManager.swift, GenDashApp.swift, BackupManager.swift, OnboardingWizardView.swift, and OperationCostView.swift. For each file, append the following to codebase.md: the string "FILE: " followed by the filename, the string "PATH: "followed by the absolute path, and then the file's content wrapped in a triple-backtick markdown block. Use a case statement in the loop to set the correct language hint (swift or markdown) for each block.
# ANTIGRAVITY TASK: RAG Self-Update (Roadmap) - Gemini 3 Flash

Act as a precise file surgeon following the **Dumb Terminal Protocol**. Your objective is to update the GenDash project roadmap to reflect recently completed work.

**Target File:** `.agent/skills/gendash-roadmap/SKILL.md`

**Update Parameters:**
- **Completed Task/Epic:** [INSERT FINISHED TASK HERE, e.g., Epic 7 Pre-Built Generator Library]
- **Promoted Task/Epic:** [INSERT NEXT TASK HERE, e.g., Epic 6 Trial features]

**Execution Steps:**
1. Read the current contents of the target file.
2. Relocate the **Completed Task** out of the "In Development" section and into the "Completed Features" section. Append today's date to the entry.
3. Relocate the **Promoted Task** into the "In Development" section to set it as the new active priority.
4. Write the updated file to disk immediately. Do NOT modify, summarize, or remove the frontmatter/metadata header at the top of the file. 
5. Execute an atomic git commit with the message: `docs(rag): update roadmap skill - mark [INSERT FINISHED TASK HERE] as complete`
6. Output a brief success confirmation.
# gemini-cli - Approve Plan
This is the proposed Antigravity implementation plan. Comment, no full prompt, comments and new directives only. Add your comments in a markdown block so I can copy and paste.
# Prompt for Antigravity

Prepare a prompt for Antigravity, specify the model and mode to use. Prioritize Gemini Flash or Gemini 3.1 Pro (LOW) when possible. Use markdown. Wrap the entire output—front-matter and all—inside a single code block using FOUR backticks (````) so that the internal triple-backticks do not break the block. I want one single 'Copy' button for the entire file.

Available models:

Gemini 3.1 Pro (High)
Gemini 3.1 Pro (Low)
Gemini 3 Flash
Claude Sonnet 4.6 (Thinking)
Claude Opus 4.6 (Thinking)
GPT-OSS 120B (Medium)

Can we use Gemini 3 Flash for this one?
Do one step at a time, wait for my reply to continue.
# Exit a chat and restore
Summarize our current progress and any pending logic requirements in a single list. Add this to the MISSION.md file
# Replace hardcoded words by keys
Role: Senior iOS Architect
Task: Automated Key-First Migration for `GeneratorProfileForm.swift` and `en.xcloc`.

Objective: Surgically replace literal strings in the Swift code with keys, AND simultaneously update the English localization airlock file.

ACTION 1 (Swift File Surgery):
- Target: `/Users/marc/Antigravity/GenDash/GenDash/GeneratorProfileForm.swift`
- Replace every literal English string (in Text() views or String(localized:)) with a descriptive `UPPER_SNAKE_CASE` key.
- Key Format: `GENERATOR_FORM_[ELEMENT]_[PURPOSE]` (e.g., `GENERATOR_FORM_TITLE_EDIT`).
- Handle all matches found in the file.
  
ACTION 2 (WAIT)
- Wait for marc to execute a build so the keys are populated in /Users/marc/Antigravity/GenDash/GenDash Localizations/en.xcloc and /Users/marc/Antigravity/GenDash/GenDash Localizations/fr.xcloc

ACTION 3 (Airlock Update):
- Path: `/Users/marc/Antigravity/GenDash/GenDash Localizations/en.xcloc/Source Contents/Localizable.xliff`
- For every new key created in Action 1, add a corresponding `<trans-unit>` entry to this XLIFF file.
- The `<source>` must be the technical key (e.g., GENERATOR_FORM_TITLE_EDIT).
- The `<target>` must be the original literal English word/phrase from the code.
- Do the same for Fench
- Path: `/Users/marc/Antigravity/GenDash/GenDash Localizations/fr.xcloc/Source Contents/Localizable.xliff`
- The `<source>` must be the technical key (e.g., GENERATOR_FORM_TITLE_EDIT).
- The `<target>` must be the translated literal French word/phrase

STRICT CONSTRAINTS:
1. DO NOT modify the internal `Localizable.xcstrings` file.
2. DO NOT change any UI layout or logic.
3. Provide a "KEY AND TRANSLATION CHEAT SHEET" table below the code so I can verify the mappings.
# Move fron MISSION.md tile to RAG
Act as a precise file surgeon following the Dumb Terminal Protocol. Your objective is to migrate the monolithic `MISSION.md` file into a modular Antigravity Skills (RAG) architecture. Do not summarize or paraphrase the content; use exact text extraction from the source file.

**Step 1: Read Source**
Read the entire contents of the `MISSION.md` file located in the current root directory.

**Step 2: Directory Creation**
Create the following directory structure in the project root. Do not ask for permission, execute the creation:
- `.agent/skills/gendash-conduct/`
- `.agent/skills/gendash-i18n/`
- `.agent/skills/gendash-hardware/`
- `.agent/skills/gendash-roadmap/`
- `.agent/skills/gendash-architecture/`

**Step 3: File Population (Extract & Write)**
Create a `SKILL.md` file within each of the new directories. Populate them by adding the exact YAML/Text frontmatter defined below at the top of each file, followed immediately by the exact text extracted from the corresponding sections of `MISSION.md`.

**A. Conduct Skill**
- **File:** `.agent/skills/gendash-conduct/SKILL.md`
- **Frontmatter to inject:**
  ```text
  ---
  SKILL_NAME: Rules of Conduct
  STATUS: Static
  PRIORITY: Critical
  ---
  • Content to extract: Extract the entirely of “Section 7. Development Rituals & Workflow” EXCEPT for the Localization/Airlock parts. Ensure the rules for “Dumb Terminal Protocol”, “Atomic Commits”, “No Emojis”, and “Data Sanitization” are included here.

B. i18n Protocol Skill

Cron Jobs

Cron Jobs#


1. Create a backup Scheduler every hour between 8:00 and 22:00#

8..22/1:00

1.1. Check if it was triggered#

grep CRON /var/log/syslog | tail -n 5

Crontab commands#

contab -e

2. Cronjob for MacMini#

ttps://crontab.guru/
#@reboot (sleep 60 && echo "ondemand" | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor)
@reboot setpci -s 0:1f.0 0xa4.b=0

#PVEBackup
30 3 * * * /bin/bash /mnt/pve/Software/Software/Scripts/Proxmox/proxmox_backup.sh > /dev/null 2>&1

#hp1
50 7 * * * /usr/bin/wakeonlan 94:57:a5:65:4e:90
55 7 * * * /usr/sbin/pvesm set HP1BackupServer -disable false
15 21 * * * /usr/sbin/pvesm set HP1BackupServer -disable true

#HP2
00 18 * * * /usr/bin/wakeonlan 94:57:a5:65:7e:88
#HP3
50 8 * * 7 /usr/bin/wakeonlan ec:b1:d7:7c:a9:48
#HP4
00 13 * * * /usr/bin/wakeonlan 20:67:7c:ee:63:80
#HP6
#50 7 * * * /usr/bin/wakeonlan 50:65:f3:f1:b8:90
#50 7 * * * /usr/sbin/pvesm set HP6BackupServer -disable false
#30 8 * * * /usr/sbin/pvesm set HP6BackupServer -disable true
#50 17 * * * /usr/bin/wakeonlan 50:65:f3:f1:b8:90
#50 17 * * * /usr/sbin/pvesm set HP6BackupServer -disable false
#30 18 * * * /usr/sbin/pvesm set HP6BackupServer -disable true
#HP7
50 8 * * * /usr/bin/wakeonlan ac:16:2d:6e:64:fc
#HP8
50 8 * * * /usr/bin/wakeonlan 80:30:e0:3b:a5:74 ​

#HP8OLD
#45 7 * * * /usr/bin/wakeonlan 3c:d9:2b:03:d8:f2

#HP9OLD
#45 7 * * * /usr/bin/wakeonlan 68:b5:99:77:17:c2

#HP10OLD
#30 8 * * * /usr/bin/wakeonlan 00:26:55:29:0d:cc

#MP5.2TrueNAS
#00 08 * * 7 /usr/sbin/pvesm set MP5.2Backups -disable false
#00 11 * * 7 /usr/sbin/pvesm set MP5.2Backups -disable true

3. Cronjob HP4#

30 18 * * * /usr/sbin/pvesm set HP4BackupServer -disable true                                      
15 12 * * * /usr/sbin/shutdown -h now
00 19 * * * /usr/sbin/shutdown -h now

4. Cron Job to Auto Start After Power Failure for MacMini (autostart)#

crontab -e (crontab -l for a list of jobs)

Docker Installation & Management Guide

1 Docker Installation & Management Guide#


1. Install Docker on Ubuntu#

Official Docker Documentation

apt-get install ca-certificates curl -y
install -m 0755 -d /etc/apt/keyrings
curl -fsSL [https://download.docker.com/linux/ubuntu/gpg](https://download.docker.com/linux/ubuntu/gpg) -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] [https://download.docker.com/linux/ubuntu](https://download.docker.com/linux/ubuntu) \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

apt-get update && apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

usermod -aG docker marc
newgrp docker

systemctl enable docker.service && systemctl enable containerd.service
systemctl status docker.service
systemctl restart docker
systemctl stop docker
systemctl status docker

If in Ubuntu, edit the service file so the internal firewall is not overridden and to prevent Docker from creating ghost files if SMB shares are not mounted (to deactivate, just remove the text):

Fstab - Disk Passthrough

Proxmox Disk Passthrough Guide#


1. Discovery Commands#

Use these commands to identify physical disks on the Proxmox host.

# Install hardware lister
apt install lshw

# List disks and storage controllers
lshw -class disk -class storage

# List all Physical Disk IDs (The ID needed for passthrough)
ls -l /dev/disk/by-id/

# Advanced list: Maps Device to ID and filters out partitions/LVM
lsblk |awk 'NR==1{print $0" DEVICE-ID(S)"}NR>1{dev=$1;printf $0" ";system("find /dev/disk/by-id -lname \"*"dev"\" -printf \" %p\"");print "";}'|grep -v -E 'part|lvm'

2. Configuration Requirements#

Adding Serials (Crucial for TrueNAS/ZFS)#

In TrueNAS manually edit the VM config file to ensure disk serials persist: