Reorganize proxmox documentation into subdirectories per LXC/VM
- Create cluster/ for Proxmox cluster infrastructure (SSH guide, HA monitor, UPS) - Create lxc108-oracle/ for Oracle Database documentation and scripts - Create vm201-windows/ for Windows 11 VM docs and SSL certificate scripts - Add SSL certificate monitoring scripts (check-ssl-certificates.ps1, monitor-ssl-certificates.sh) - Remove archived VM107 references (decommissioned) - Update all cross-references between files - Update main README.md with new structure and navigation Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
451
proxmox/vm201-windows/README.md
Normal file
451
proxmox/vm201-windows/README.md
Normal file
@@ -0,0 +1,451 @@
|
||||
# VM 201 - Windows 11 (roacentral)
|
||||
|
||||
## 📌 Informații Generale
|
||||
|
||||
- **VMID:** 201
|
||||
- **Nume:** roacentral
|
||||
- **OS:** Windows 11 Pro (24H2)
|
||||
- **Host Proxmox:** pvemini (10.0.20.201)
|
||||
- **Storage:** local-zfs (ZFS pool)
|
||||
- **Status:** Running (onboot: enabled)
|
||||
- **Rol:** Client aplicații Windows, SQL*Plus client, Reverse proxy IIS, Monitorizare UPS
|
||||
|
||||
---
|
||||
|
||||
## 💻 Configurație Hardware
|
||||
|
||||
### Resurse Alocate
|
||||
- **CPU:** 2 cores (Intel CPU host)
|
||||
- **RAM:** 4 GB
|
||||
- **Storage:** 500 GB (local-zfs)
|
||||
- **Network:** virtio (DHCP)
|
||||
- **Display:** VirtIO-GPU (spice)
|
||||
|
||||
### Storage Details
|
||||
```bash
|
||||
# Verificare disk usage
|
||||
ssh root@10.0.20.201 "qm config 201 | grep -E 'efidisk|virtio'"
|
||||
|
||||
# Output:
|
||||
# efidisk0: local-zfs:vm-201-disk-1,efitype=4m,pre-enrolled-keys=1,size=528K
|
||||
# virtio0: local-zfs:vm-201-disk-3,size=500G
|
||||
```
|
||||
|
||||
**Discuri active:**
|
||||
- `vm-201-disk-1` - EFI disk (528K)
|
||||
- `vm-201-disk-3` - Disk principal Windows (500GB, ~89GB utilizat)
|
||||
|
||||
### Network Configuration
|
||||
- **Interface:** net0 - virtio bridge=vmbr0
|
||||
- **IP Assignment:** DHCP (managed by network DHCP server)
|
||||
- **MAC Address:** Auto-generated by Proxmox
|
||||
- **Hostname:** roacentral
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Rol și Utilizare
|
||||
|
||||
### Funcții Principale
|
||||
|
||||
#### 1. Client Aplicații Windows
|
||||
- **Aplicații ROMFAST** - Client desktop pentru aplicații contabilitate
|
||||
- **SQL*Plus Client** - Conexiuni la Oracle Database (LXC 108)
|
||||
- **Management Tools** - Administrare Windows pentru infrastructură
|
||||
|
||||
#### 2. Reverse Proxy IIS
|
||||
- **IIS (Internet Information Services)** - Reverse proxy către servicii interne
|
||||
- **SSL/TLS Termination** - Certificate Let's Encrypt pentru domenii externe
|
||||
- **SNI (Server Name Indication)** - Multiple certificate pe același IP
|
||||
- **Domenii gestionate:**
|
||||
- roa.romfast.ro
|
||||
- dokploy.romfast.ro
|
||||
- gitea.romfast.ro
|
||||
|
||||
**Documentație:** Vezi `vm201-certificat-letsencrypt-iis.md`
|
||||
|
||||
#### 3. Monitorizare UPS
|
||||
- **WinNUT Client** - Monitorizare vizuală status UPS în timp real
|
||||
- **Server NUT:** 10.0.20.201:3493 (pvemini)
|
||||
- **UPS:** nutdev1 (INNO TECH USB UPS)
|
||||
- **Polling:** 15 secunde
|
||||
|
||||
**Documentație:** Vezi `ups/docs/INSTALARE-WINNUT.md`
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Servicii Instalate
|
||||
|
||||
### Software Principal
|
||||
|
||||
#### 1. Oracle SQL*Plus Client
|
||||
- **Versiune:** Oracle Instant Client (compatible cu Oracle XE 21c)
|
||||
- **Conexiuni:**
|
||||
```cmd
|
||||
sqlplus sys/romfastsoft@10.0.20.121:1521/roa as sysdba
|
||||
sqlplus CONTAFIN_ORACLE/OraclePass123@10.0.20.121:1521/roa
|
||||
```
|
||||
- **JDBC Driver:** oracle.jdbc.driver.OracleDriver
|
||||
- **Connection String:** `jdbc:oracle:thin:@10.0.20.121:1521/roa`
|
||||
|
||||
#### 2. IIS (Internet Information Services)
|
||||
- **Versiune:** IIS 10.0 (Windows 11)
|
||||
- **Features Enabled:**
|
||||
- Web Server (IIS)
|
||||
- ASP.NET 4.8
|
||||
- WebSockets Protocol
|
||||
- HTTP Redirect
|
||||
- URL Rewrite Module
|
||||
- **Sites:**
|
||||
- Default Web Site (roa.romfast.ro)
|
||||
- Dokploy (dokploy.romfast.ro)
|
||||
- Gitea (gitea.romfast.ro)
|
||||
|
||||
**Configurare SSL:** Vezi `vm201-certificat-letsencrypt-iis.md`
|
||||
|
||||
#### 3. Win-ACME
|
||||
- **Versiune:** v2.2.9.1701
|
||||
- **Locație:** `C:\Tools\win-acme\`
|
||||
- **Scop:** Certificate Let's Encrypt automate
|
||||
- **Task Scheduler:** Reînnoire automată zilnică (verificare)
|
||||
- **Certificate Storage:** LocalMachine\My (Certificate Store)
|
||||
|
||||
#### 4. WinNUT Client
|
||||
- **Versiune:** WinNUT-Client-2.x
|
||||
- **Configurare:**
|
||||
- Server: 10.0.20.201
|
||||
- Port: 3493
|
||||
- UPS: nutdev1
|
||||
- User: admin
|
||||
- Password: parola99
|
||||
- Polling: 15s
|
||||
- **Scop:** Monitorizare vizuală UPS (NU controlează shutdown)
|
||||
|
||||
#### 5. Remote Desktop
|
||||
- **RDP Enabled:** Da
|
||||
- **Port:** 3389 (default)
|
||||
- **Network Level Authentication:** Enabled
|
||||
- **Acces:** `mstsc /v:roacentral` (din rețea locală)
|
||||
|
||||
---
|
||||
|
||||
## 🌐 Configurare Rețea
|
||||
|
||||
### Network Settings
|
||||
- **Adapter Type:** virtio (paravirtualized)
|
||||
- **Bridge:** vmbr0 (Proxmox bridge)
|
||||
- **IP Assignment:** DHCP
|
||||
- **DNS:** Managed by DHCP
|
||||
- **Hostname:** roacentral
|
||||
|
||||
### Firewall Rules (Windows Firewall)
|
||||
```powershell
|
||||
# Permite RDP
|
||||
Enable-NetFirewallRule -DisplayGroup "Remote Desktop"
|
||||
|
||||
# Permite IIS HTTP/HTTPS
|
||||
New-NetFirewallRule -DisplayName "IIS HTTP" -Direction Inbound -Protocol TCP -LocalPort 80 -Action Allow
|
||||
New-NetFirewallRule -DisplayName "IIS HTTPS" -Direction Inbound -Protocol TCP -LocalPort 443 -Action Allow
|
||||
|
||||
# Permite ping (ICMP)
|
||||
Enable-NetFirewallRule -DisplayName "File and Printer Sharing (Echo Request - ICMPv4-In)"
|
||||
```
|
||||
|
||||
### Network Troubleshooting
|
||||
```powershell
|
||||
# Verificare IP și gateway
|
||||
ipconfig /all
|
||||
|
||||
# Test conectivitate Oracle
|
||||
Test-NetConnection -ComputerName 10.0.20.121 -Port 1521
|
||||
|
||||
# Test conectivitate NUT server
|
||||
Test-NetConnection -ComputerName 10.0.20.201 -Port 3493
|
||||
|
||||
# Flush DNS cache
|
||||
ipconfig /flushdns
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 💾 Backup și Recovery
|
||||
|
||||
### Backup Job Proxmox
|
||||
- **Frecvență:** Zilnic la 02:00 (part of backup job-10dfdb0d-fb47)
|
||||
- **Storage:** backup (`/mnt/backup` pe pvemini)
|
||||
- **Tip:** Snapshot (Proxmox VZDump)
|
||||
- **Retention:** keep-all=1 (păstrează toate backup-urile)
|
||||
- **Format:** `.vma.zst` (compressed)
|
||||
|
||||
### Backup Manual
|
||||
```bash
|
||||
# Backup complet VM 201
|
||||
ssh root@10.0.20.201 "vzdump 201 --storage backup --mode snapshot --compress zstd"
|
||||
|
||||
# Verificare backup-uri existente
|
||||
ssh root@10.0.20.201 "ls -lh /mnt/backup/dump/vzdump-qemu-201-*.vma.zst"
|
||||
```
|
||||
|
||||
### Recovery VM 201
|
||||
```bash
|
||||
# Listare backup-uri disponibile
|
||||
ssh root@10.0.20.201 "pvesm list backup | grep 201"
|
||||
|
||||
# Restore din backup (creează VM nou cu VMID 202)
|
||||
ssh root@10.0.20.201 "qmrestore /mnt/backup/dump/vzdump-qemu-201-YYYY_MM_DD-HH_MM_SS.vma.zst 202"
|
||||
|
||||
# Sau restore peste VM existent (ATENȚIE: șterge VM curent)
|
||||
ssh root@10.0.20.201 "qm stop 201 && qmrestore /mnt/backup/dump/vzdump-qemu-201-*.vma.zst 201 --force"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚨 Troubleshooting Comun
|
||||
|
||||
### VM Nu Pornește
|
||||
|
||||
**Diagnostic:**
|
||||
```bash
|
||||
# Status VM
|
||||
ssh root@10.0.20.201 "qm status 201"
|
||||
|
||||
# Verificare lock-uri
|
||||
ssh root@10.0.20.201 "qm config 201 | grep lock"
|
||||
|
||||
# Verificare proces KVM
|
||||
ssh root@10.0.20.201 "ps aux | grep 'qm\|kvm' | grep 201"
|
||||
```
|
||||
|
||||
**Rezolvare:**
|
||||
```bash
|
||||
# Unlock VM (dacă are lock de backup)
|
||||
ssh root@10.0.20.201 "qm unlock 201"
|
||||
|
||||
# Start VM
|
||||
ssh root@10.0.20.201 "qm start 201"
|
||||
```
|
||||
|
||||
**Referință:** Vezi `vm201-troubleshooting-backup-nfs.md` pentru incident similar
|
||||
|
||||
### VM Locked după Backup Eșuat
|
||||
|
||||
**Verificare:**
|
||||
```bash
|
||||
ssh root@10.0.20.201 "qm config 201 | grep lock"
|
||||
```
|
||||
|
||||
**Rezolvare:**
|
||||
```bash
|
||||
ssh root@10.0.20.201 "qm unlock 201"
|
||||
```
|
||||
|
||||
**Documentație completă:** `vm201-troubleshooting-backup-nfs.md`
|
||||
|
||||
### RDP Nu Funcționează
|
||||
|
||||
**Verificare din Proxmox:**
|
||||
```bash
|
||||
# Status VM
|
||||
ssh root@10.0.20.201 "qm status 201"
|
||||
|
||||
# Verificare port 3389 (din alt sistem)
|
||||
nc -zv <VM_IP> 3389
|
||||
```
|
||||
|
||||
**Rezolvare în Windows:**
|
||||
```powershell
|
||||
# Enable RDP
|
||||
Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server' -Name "fDenyTSConnections" -Value 0
|
||||
|
||||
# Restart serviciu
|
||||
Restart-Service TermService -Force
|
||||
|
||||
# Verificare firewall
|
||||
Enable-NetFirewallRule -DisplayGroup "Remote Desktop"
|
||||
```
|
||||
|
||||
### Certificate SSL Expirate
|
||||
|
||||
**Verificare:**
|
||||
```powershell
|
||||
# Listare certificate Let's Encrypt
|
||||
Get-ChildItem Cert:\LocalMachine\My | Where-Object {
|
||||
$_.Issuer -like "*Let's Encrypt*" -and $_.NotAfter -gt (Get-Date)
|
||||
} | Select-Object Subject, NotAfter, Thumbprint
|
||||
```
|
||||
|
||||
**Reînnoire:**
|
||||
```powershell
|
||||
cd C:\Tools\win-acme
|
||||
.\wacs.exe --renew --force
|
||||
iisreset
|
||||
```
|
||||
|
||||
**Documentație completă:** `vm201-certificat-letsencrypt-iis.md`
|
||||
|
||||
---
|
||||
|
||||
## 🔗 Comenzi Rapide Proxmox
|
||||
|
||||
### Gestiune VM 201
|
||||
|
||||
```bash
|
||||
# Start VM
|
||||
ssh root@10.0.20.201 "qm start 201"
|
||||
|
||||
# Stop VM (graceful)
|
||||
ssh root@10.0.20.201 "qm stop 201"
|
||||
|
||||
# Force stop VM (SIGKILL)
|
||||
ssh root@10.0.20.201 "qm stop 201 --skiplock"
|
||||
|
||||
# Restart VM
|
||||
ssh root@10.0.20.201 "qm restart 201"
|
||||
|
||||
# Status VM
|
||||
ssh root@10.0.20.201 "qm status 201"
|
||||
|
||||
# Configurație VM
|
||||
ssh root@10.0.20.201 "qm config 201"
|
||||
|
||||
# Modificare RAM/CPU
|
||||
ssh root@10.0.20.201 "qm set 201 --memory 8192 --cores 4"
|
||||
|
||||
# Console VM (VNC prin Proxmox GUI)
|
||||
# Acces: https://10.0.20.201:8006 -> VM 201 -> Console
|
||||
```
|
||||
|
||||
### Backup și Snapshot
|
||||
|
||||
```bash
|
||||
# Backup manual
|
||||
ssh root@10.0.20.201 "vzdump 201 --storage backup --mode snapshot --compress zstd"
|
||||
|
||||
# Creare snapshot
|
||||
ssh root@10.0.20.201 "qm snapshot 201 pre-update-snapshot"
|
||||
|
||||
# Listare snapshot-uri
|
||||
ssh root@10.0.20.201 "qm listsnapshot 201"
|
||||
|
||||
# Rollback la snapshot
|
||||
ssh root@10.0.20.201 "qm rollback 201 pre-update-snapshot"
|
||||
|
||||
# Ștergere snapshot
|
||||
ssh root@10.0.20.201 "qm delsnapshot 201 pre-update-snapshot"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Documentație Asociată
|
||||
|
||||
### Documentație VM 201 Specifică
|
||||
- **SSL Certificates IIS:** `docs/vm201-certificat-letsencrypt-iis.md`
|
||||
- **Troubleshooting Incident 2025-10-08:** `docs/vm201-troubleshooting-backup-nfs.md`
|
||||
- **Troubleshooting Pană Curent 2026-01-11:** `docs/vm201-troubleshooting-pana-curent-2026-01-11.md`
|
||||
|
||||
### Scripturi VM 201
|
||||
- **Verificare certificate (Windows):** `scripts/check-ssl-certificates.ps1`
|
||||
- **Monitorizare certificate (Proxmox):** `scripts/monitor-ssl-certificates.sh`
|
||||
|
||||
### Documentație Infrastructură Generală
|
||||
- **Proxmox Cluster General:** `../cluster/README.md`
|
||||
- **Oracle Database (LXC 108):** `../lxc108-oracle/README.md`
|
||||
|
||||
### Documentație UPS
|
||||
- **Instalare WinNUT Client:** `../cluster/ups/docs/INSTALARE-WINNUT.md`
|
||||
- **Sistem UPS Cluster:** `../cluster/ups/README.md`
|
||||
|
||||
---
|
||||
|
||||
## 📝 Notițe Importante
|
||||
|
||||
### Considerații Performanță
|
||||
- VM 201 rulează pe **local-zfs** pentru performanță optimă (ZFS pool)
|
||||
- **Snapshot-urile** sunt rapide (ZFS COW - copy-on-write)
|
||||
- **Backup-urile** nu afectează performanța VM (Proxmox snapshot)
|
||||
|
||||
### Securitate
|
||||
- **RDP:** Expus doar în rețea locală (10.0.20.0/24)
|
||||
- **Certificate SSL:** Reînnoire automată Let's Encrypt (90 zile)
|
||||
- **Firewall:** Windows Firewall active cu reguli restrictive
|
||||
- **Updates:** Windows Update enabled (automatic patches)
|
||||
|
||||
### Dependențe
|
||||
- **Oracle Database:** LXC 108 (10.0.20.121:1521) - SQL*Plus client
|
||||
- **UPS Monitoring:** NUT server pe pvemini (10.0.20.201:3493)
|
||||
- **Reverse Proxy Targets:**
|
||||
- Dokploy: 10.0.20.167:3000
|
||||
- Gitea: 10.0.20.165:3000
|
||||
- Portainer: 10.0.20.170:9443
|
||||
|
||||
### High Availability și Replicare
|
||||
|
||||
#### HA Status: DEZACTIVAT (Control Manual)
|
||||
- **HA:** Eliminat din cluster HA (decizie post-incident 2026-01-11)
|
||||
- **Motiv:** Control manual asupra failover-ului pentru a evita blocaje
|
||||
- **Autostart:** Enabled (onboot: 1) - pornește automat când nodul bootează
|
||||
|
||||
#### Replicare ZFS (Activă)
|
||||
- **Job 201-0:** pvemini → pve1 (la fiecare 30 min)
|
||||
- **Job 201-1:** pvemini → pveelite (la fiecare 30 min)
|
||||
|
||||
```bash
|
||||
# Verificare status replicare
|
||||
ssh root@10.0.20.201 "pvesr status | grep 201"
|
||||
|
||||
# Forțare replicare imediată
|
||||
ssh root@10.0.20.201 "pvesr schedule-now 201-0 && pvesr schedule-now 201-1"
|
||||
```
|
||||
|
||||
#### Procedură Failover Manual (când pvemini cade)
|
||||
|
||||
**Important:** `/etc/pve` este un filesystem partajat (pmxcfs). Chiar dacă pvemini e offline, configurarea VM-ului e accesibilă de pe orice nod din cluster.
|
||||
|
||||
```bash
|
||||
# De pe pveelite (10.0.20.202) sau pve1 (10.0.20.200):
|
||||
|
||||
# 1. Mută configurarea pe nodul unde vrei să pornești
|
||||
mv /etc/pve/nodes/pvemini/qemu-server/201.conf /etc/pve/nodes/pveelite/qemu-server/201.conf
|
||||
|
||||
# 2. Pornește VM-ul (discurile sunt deja replicate)
|
||||
qm start 201
|
||||
```
|
||||
|
||||
#### Procedură Failback (migrare înapoi pe pvemini)
|
||||
|
||||
```bash
|
||||
# Când pvemini e din nou online, migrează VM-ul înapoi
|
||||
qm migrate 201 pvemini --online
|
||||
```
|
||||
|
||||
**Troubleshooting:** Vezi `vm201-troubleshooting-pana-curent-2026-01-11.md`
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Flux de Lucru Recomandat
|
||||
|
||||
### Pentru Configurare Nouă
|
||||
1. **Citește acest document** pentru context general
|
||||
2. **Pentru SSL/IIS:** Vezi `vm201-certificat-letsencrypt-iis.md`
|
||||
3. **Testează configurația**
|
||||
4. **Creează snapshot** înainte de modificări majore
|
||||
5. **Documentează** schimbările în fișiere relevante
|
||||
|
||||
### Pentru Probleme
|
||||
1. **Verifică status VM:** `qm status 201`
|
||||
2. **Verifică lock-uri:** `qm config 201 | grep lock`
|
||||
3. **Consultă troubleshooting:** `vm201-troubleshooting-backup-nfs.md`
|
||||
4. **Verifică logs:** Windows Event Viewer sau Proxmox logs
|
||||
5. **Documentează problema** și rezolvarea pentru viitor
|
||||
|
||||
### Pentru Mentenanță
|
||||
1. **Creează snapshot** înainte de update-uri: `qm snapshot 201 pre-maintenance`
|
||||
2. **Verifică backup recent:** Ultimul backup în `/mnt/backup/dump/`
|
||||
3. **Aplică update-uri** Windows Update sau IIS
|
||||
4. **Testează funcționalitate** (RDP, IIS, SQL*Plus)
|
||||
5. **Șterge snapshot** dacă totul funcționează: `qm delsnapshot 201 pre-maintenance`
|
||||
|
||||
---
|
||||
|
||||
**Ultima actualizare:** 2026-01-11
|
||||
**Autor:** Marius Mutu
|
||||
**Proiect:** ROMFASTSQL - VM 201 Documentation
|
||||
259
proxmox/vm201-windows/docs/vm201-certificat-letsencrypt-iis.md
Normal file
259
proxmox/vm201-windows/docs/vm201-certificat-letsencrypt-iis.md
Normal file
@@ -0,0 +1,259 @@
|
||||
# Certificat Let's Encrypt pentru IIS - Ghid Rapid
|
||||
|
||||
## Instalare Win-ACME
|
||||
|
||||
```powershell
|
||||
# Download și instalare
|
||||
Invoke-WebRequest -Uri "https://github.com/win-acme/win-acme/releases/download/v2.2.9.1701/win-acme.v2.2.9.1701.x64.pluggable.zip" -OutFile "$env:TEMP\win-acme.zip"
|
||||
Expand-Archive -Path "$env:TEMP\win-acme.zip" -DestinationPath "C:\Tools\win-acme" -Force
|
||||
```
|
||||
|
||||
## Prerequisite IIS
|
||||
|
||||
### Verificare Site ID-uri
|
||||
```powershell
|
||||
Import-Module WebAdministration
|
||||
Get-Website | Select-Object ID, Name, State, @{N='Bindings';E={$_.Bindings.Collection.bindingInformation}}
|
||||
```
|
||||
|
||||
### Adaugă Binding-uri pentru Domeniu
|
||||
```powershell
|
||||
# Exemplu pentru roa.romfast.ro pe Default Web Site
|
||||
New-WebBinding -Name "Default Web Site" -Protocol http -Port 80 -HostHeader "roa.romfast.ro"
|
||||
New-WebBinding -Name "Default Web Site" -Protocol https -Port 443 -HostHeader "roa.romfast.ro"
|
||||
```
|
||||
|
||||
## Generare Certificate
|
||||
|
||||
### Metoda 1: Comenzi PowerShell (Automat)
|
||||
```powershell
|
||||
cd C:\Tools\win-acme
|
||||
|
||||
# Pentru fiecare site (înlocuiește Site ID și email)
|
||||
.\wacs.exe --source iis --siteid 1 --accepttos --emailaddress your@email.com
|
||||
.\wacs.exe --source iis --siteid 2 --accepttos --emailaddress your@email.com
|
||||
.\wacs.exe --source iis --siteid 3 --accepttos --emailaddress your@email.com
|
||||
```
|
||||
|
||||
### Metoda 2: Mod Interactiv
|
||||
```powershell
|
||||
cd C:\Tools\win-acme
|
||||
.\wacs.exe
|
||||
|
||||
# În meniu:
|
||||
# N - Create certificate (simple for IIS)
|
||||
# Selectează site-ul
|
||||
# Confirmă binding-urile
|
||||
# yes - Accept ToS
|
||||
# Enter email
|
||||
```
|
||||
|
||||
## Configurare Binding-uri IIS cu SNI
|
||||
|
||||
### Important: SNI OBLIGATORIU pentru Multiple Certificate pe Același IP
|
||||
|
||||
**GUI - IIS Manager:**
|
||||
1. Deschide IIS Manager (`inetmgr`)
|
||||
2. Pentru fiecare site:
|
||||
- Site → **Bindings** → Selectează **https** → **Edit**
|
||||
- ☑️ **Bifează "Require Server Name Indication"**
|
||||
- Selectează **certificatul corect** pentru site
|
||||
- **OK**
|
||||
3. Restart IIS: `iisreset`
|
||||
|
||||
**PowerShell:**
|
||||
```powershell
|
||||
Import-Module WebAdministration
|
||||
|
||||
# Exemplu pentru un site
|
||||
$siteName = "Dokploy"
|
||||
$hostHeader = "dokploy.romfast.ro"
|
||||
|
||||
# Găsește certificatul
|
||||
$cert = Get-ChildItem Cert:\LocalMachine\My | Where-Object {
|
||||
$_.Subject -like "*$hostHeader*" -and $_.NotAfter -gt (Get-Date).AddDays(60)
|
||||
} | Select-Object -First 1
|
||||
|
||||
# Șterge binding vechi și creează cu SNI (SslFlags = 1)
|
||||
Remove-WebBinding -Name $siteName -Protocol https -HostHeader $hostHeader -ErrorAction SilentlyContinue
|
||||
New-WebBinding -Name $siteName -Protocol https -Port 443 -HostHeader $hostHeader -SslFlags 1
|
||||
|
||||
# Asociază certificatul
|
||||
$binding = Get-WebBinding -Name $siteName -Protocol https -HostHeader $hostHeader
|
||||
$binding.AddSslCertificate($cert.Thumbprint, "My")
|
||||
|
||||
# Restart IIS
|
||||
iisreset
|
||||
```
|
||||
|
||||
## Verificare
|
||||
|
||||
### Listare Certificate Gestionate
|
||||
```powershell
|
||||
cd C:\Tools\win-acme
|
||||
.\wacs.exe --list
|
||||
```
|
||||
|
||||
### Verificare Certificate în Browser
|
||||
```bash
|
||||
# Din WSL sau Linux
|
||||
echo | openssl s_client -connect domain.ro:443 -servername domain.ro 2>/dev/null | openssl x509 -noout -dates -subject
|
||||
```
|
||||
|
||||
### Verificare Task Scheduler
|
||||
```powershell
|
||||
Get-ScheduledTask | Where-Object {$_.TaskName -like "*acme*"}
|
||||
```
|
||||
|
||||
### Verificare Certificate IIS
|
||||
```powershell
|
||||
Get-ChildItem Cert:\LocalMachine\My | Where-Object {
|
||||
$_.Issuer -like "*Let's Encrypt*" -and $_.NotAfter -gt (Get-Date)
|
||||
} | Select-Object Subject, NotAfter, Thumbprint
|
||||
```
|
||||
|
||||
## Reînnoire
|
||||
|
||||
### Automată
|
||||
- Task Scheduler verifică zilnic
|
||||
- Reînnoiește automat cu 30 zile înainte de expirare
|
||||
|
||||
### Manuală
|
||||
```powershell
|
||||
cd C:\Tools\win-acme
|
||||
.\wacs.exe --renew --force
|
||||
iisreset
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Certificat Vechi Încă Servit
|
||||
```powershell
|
||||
# Verifică SNI
|
||||
Get-WebBinding | Where-Object {$_.Protocol -eq "https"} | Select-Object @{N='Site';E={$_.ItemXPath -replace '.*name=''([^'']+)''.*','$1'}}, bindingInformation, @{N='SNI';E={($_.sslFlags -band 1) -eq 1}}
|
||||
|
||||
# Forțează reinstalare
|
||||
cd C:\Tools\win-acme
|
||||
.\wacs.exe --renew --force
|
||||
iisreset
|
||||
```
|
||||
|
||||
### Validare HTTP-01 Eșuează
|
||||
- Verifică că portul 80 este accesibil din internet
|
||||
- Verifică că DNS pointează corect
|
||||
- Verifică că URL Rewrite nu blochează `/.well-known/acme-challenge/*`
|
||||
|
||||
### Certificate Nu Se Asociază Automat
|
||||
Folosește scriptul: `configure-iis-sni.ps1`
|
||||
|
||||
## Structură Site-uri IIS
|
||||
|
||||
| Site ID | Nume | Hostname | Binding HTTPS | SNI |
|
||||
|---------|--------------------|-----------------------|------------------------|----------|
|
||||
| 1 | Default Web Site | roa.romfast.ro | *:443:roa.romfast.ro | ☑️ Activ |
|
||||
| 2 | Dokploy | dokploy.romfast.ro | *:443:dokploy.romfast.ro | ☑️ Activ |
|
||||
| 3 | Gitea | gitea.romfast.ro | *:443:gitea.romfast.ro | ☑️ Activ |
|
||||
|
||||
## Scripturi Utile
|
||||
|
||||
### Script Verificare/Reînnoire Certificate (PowerShell)
|
||||
**Locație repo:** `../scripts/check-ssl-certificates.ps1`
|
||||
**Locație VM 201:** `D:\kit\ssl\check-ssl-certificates.ps1`
|
||||
|
||||
```powershell
|
||||
# Verificare manuală
|
||||
D:\kit\ssl\check-ssl-certificates.ps1 -Verbose
|
||||
|
||||
# Forțare reinstalare toate certificatele
|
||||
D:\kit\ssl\check-ssl-certificates.ps1 -Force -Verbose
|
||||
```
|
||||
|
||||
### Script Monitorizare Certificate (Bash - Proxmox)
|
||||
**Locație repo:** `../scripts/monitor-ssl-certificates.sh`
|
||||
**Locație Proxmox:** `/opt/scripts/monitor-ssl-certificates.sh`
|
||||
|
||||
```bash
|
||||
# Verificare manuală
|
||||
/opt/scripts/monitor-ssl-certificates.sh
|
||||
|
||||
# Verificare log
|
||||
tail -50 /var/log/ssl-monitor.log
|
||||
```
|
||||
|
||||
## Comenzi Rapide
|
||||
|
||||
```powershell
|
||||
# Instalare
|
||||
Expand-Archive win-acme.zip -DestinationPath C:\Tools\win-acme
|
||||
|
||||
# Generare certificate
|
||||
cd C:\Tools\win-acme
|
||||
.\wacs.exe --source iis --siteid X --accepttos --emailaddress email@domain.com
|
||||
|
||||
# Verificare
|
||||
.\wacs.exe --list
|
||||
|
||||
# Reînnoire
|
||||
.\wacs.exe --renew --force
|
||||
|
||||
# Restart IIS
|
||||
iisreset
|
||||
```
|
||||
|
||||
## Monitorizare Automată Certificate
|
||||
|
||||
### Problema Cunoscută
|
||||
Win-acme poate reînnoi certificatele, dar IIS uneori nu aplică noile certificate pe binding-uri.
|
||||
Acest lucru cauzează servirea certificatelor expirate chiar dacă cele noi sunt în Certificate Store.
|
||||
|
||||
### Soluția: Scripturi de Monitorizare
|
||||
|
||||
#### 1. Script PowerShell pe VM 201
|
||||
**Locație:** `D:\kit\ssl\check-ssl-certificates.ps1`
|
||||
**Task Scheduler:** "SSL Certificate Check" - rulează zilnic la 07:00
|
||||
|
||||
```powershell
|
||||
# Verificare manuală
|
||||
D:\kit\ssl\check-ssl-certificates.ps1 -Verbose
|
||||
|
||||
# Forțare reinstalare toate certificatele
|
||||
D:\kit\ssl\check-ssl-certificates.ps1 -Force -Verbose
|
||||
```
|
||||
|
||||
#### 2. Script Bash pe Proxmox (pvemini)
|
||||
**Locație:** `/opt/scripts/monitor-ssl-certificates.sh`
|
||||
**Cron:** Zilnic la 08:00
|
||||
|
||||
```bash
|
||||
# Verificare manuală
|
||||
/opt/scripts/monitor-ssl-certificates.sh
|
||||
|
||||
# Verificare log
|
||||
tail -50 /var/log/ssl-monitor.log
|
||||
```
|
||||
|
||||
### Ce Fac Scripturile
|
||||
- Verifică zilele rămase pentru fiecare certificat
|
||||
- Dacă < 14 zile: forțează reinstalare cu `wacs.exe --force`
|
||||
- Restart IIS după reinstalare
|
||||
- Trimite alertă email dacă există probleme
|
||||
|
||||
### Verificare Task Schedulers
|
||||
```powershell
|
||||
# Pe VM 201
|
||||
Get-ScheduledTask | Where-Object {$_.TaskName -like "*SSL*" -or $_.TaskName -like "*acme*"}
|
||||
```
|
||||
|
||||
```bash
|
||||
# Pe Proxmox
|
||||
grep ssl /etc/crontab
|
||||
```
|
||||
|
||||
## Note Importante
|
||||
|
||||
- **SNI este OBLIGATORIU** pentru multiple certificate pe același IP:port
|
||||
- Certificatele expiră la **90 zile**
|
||||
- Task Scheduler reînnoiește automat cu **30 zile** înainte
|
||||
- Fiecare domeniu trebuie să fie **accesibil pe port 80** din internet pentru validare HTTP-01
|
||||
- DNS trebuie să pointeze corect către IP-ul public
|
||||
- **Monitorizarea duală** (Windows + Proxmox) asigură redundanță
|
||||
394
proxmox/vm201-windows/docs/vm201-troubleshooting-backup-nfs.md
Normal file
394
proxmox/vm201-windows/docs/vm201-troubleshooting-backup-nfs.md
Normal file
@@ -0,0 +1,394 @@
|
||||
# Troubleshooting: VM 201 Locked & Backup-NFS Unknown
|
||||
|
||||
**Data:** 2025-10-08
|
||||
**Noduri afectate:** pvemini (10.0.20.201)
|
||||
**Resurse afectate:** VM 201 (roacentral), Storage backup-nfs
|
||||
|
||||
---
|
||||
|
||||
## Problema 1: VM 201 - Status Running dar HA Error
|
||||
|
||||
### Simptome
|
||||
- VM 201 (Windows 11) înghețat
|
||||
- GUI Proxmox arăta: **running** dar cu **HA error**
|
||||
- Încercări de reboot/stop din GUI au eșuat
|
||||
- VM nu răspundea la comenzi
|
||||
|
||||
### Diagnostic
|
||||
|
||||
#### 1. Verificare status VM
|
||||
```bash
|
||||
ssh root@10.0.20.201 "qm status 201"
|
||||
# Output: status: running
|
||||
```
|
||||
|
||||
#### 2. Verificare status HA
|
||||
```bash
|
||||
ssh root@10.0.20.201 "ha-manager status"
|
||||
# Output: service vm:201 (pvemini, error)
|
||||
```
|
||||
|
||||
#### 3. Verificare configurație VM
|
||||
```bash
|
||||
ssh root@10.0.20.201 "qm config 201"
|
||||
# Output: lock: backup
|
||||
```
|
||||
|
||||
**Cauză identificată:** Lock de backup rămas activ în configurație, probabil de la un job de backup întrerupt.
|
||||
|
||||
#### 4. Verificare log-uri HA
|
||||
```bash
|
||||
ssh root@10.0.20.201 "journalctl -u pve-ha-lrm --since '5 minutes ago' --no-pager | grep -i '201\|error'"
|
||||
```
|
||||
|
||||
**Output relevant:**
|
||||
```
|
||||
Oct 08 11:18:46 pvemini pve-ha-lrm: can't lock file '/var/lock/qemu-server/lock-201.conf' - got timeout
|
||||
Oct 08 11:18:46 pvemini pve-ha-lrm: unable to stop service vm:201 (still running)
|
||||
Oct 08 11:18:56 pvemini pve-ha-lrm: service vm:201 is in an error state and needs manual intervention
|
||||
```
|
||||
|
||||
#### 5. Verificare proces KVM
|
||||
```bash
|
||||
ssh root@10.0.20.201 "ps aux | grep 'qm\|kvm' | grep 201"
|
||||
```
|
||||
**Rezultat:** Procesul KVM (PID 3628) rula de 2 zile dar era înghețat.
|
||||
|
||||
### Rezolvare VM 201
|
||||
|
||||
#### Pas 1: Unlock VM
|
||||
```bash
|
||||
ssh root@10.0.20.201 "qm unlock 201"
|
||||
# Success - lock-ul a fost eliminat
|
||||
```
|
||||
|
||||
#### Pas 2: Încercare stop normal (a eșuat)
|
||||
```bash
|
||||
ssh root@10.0.20.201 "qm stop 201"
|
||||
# Error: service 'vm:201' in error state, must be disabled and fixed first
|
||||
```
|
||||
|
||||
#### Pas 3: Remove VM din HA management
|
||||
```bash
|
||||
ssh root@10.0.20.201 "ha-manager remove vm:201"
|
||||
# Success - VM eliminat din HA
|
||||
```
|
||||
|
||||
#### Pas 4: Force stop VM
|
||||
```bash
|
||||
ssh root@10.0.20.201 "qm stop 201"
|
||||
# Output: VM quit/powerdown failed - terminating now with SIGTERM
|
||||
# VM still running - terminating now with SIGKILL
|
||||
```
|
||||
|
||||
#### Pas 5: Verificare stop
|
||||
```bash
|
||||
ssh root@10.0.20.201 "qm status 201"
|
||||
# Output: status: stopped
|
||||
```
|
||||
|
||||
#### Pas 6: Start VM
|
||||
```bash
|
||||
ssh root@10.0.20.201 "qm start 201"
|
||||
ssh root@10.0.20.201 "sleep 5 && qm status 201"
|
||||
# Output: status: running
|
||||
```
|
||||
|
||||
#### Pas 7: Re-add în HA
|
||||
```bash
|
||||
ssh root@10.0.20.201 "ha-manager add vm:201"
|
||||
ssh root@10.0.20.201 "sleep 10 && ha-manager status | grep 201"
|
||||
# Output: service vm:201 (pvemini, started)
|
||||
```
|
||||
|
||||
**Rezultat:** ✅ VM 201 funcțional și re-integrat în HA
|
||||
|
||||
---
|
||||
|
||||
## Problema 2: Storage backup-nfs - Status Unknown
|
||||
|
||||
### Simptome
|
||||
- Storage backup-nfs apărea ca **unknown** în GUI
|
||||
- Toate comenzile care accesau `/mnt/pve/backup-nfs` înghețau
|
||||
- Timeout-uri la operații SSH pe pvemini
|
||||
- NFS mount exista dar era blocat
|
||||
|
||||
### Diagnostic
|
||||
|
||||
#### 1. Verificare status storage
|
||||
```bash
|
||||
ssh root@10.0.20.201 "pvesm status | grep backup"
|
||||
```
|
||||
|
||||
**Output:**
|
||||
```
|
||||
backup dir active 1921724696 287855936 1536176700 14.98%
|
||||
backup-nfs nfs inactive 0 0 0 0.00%
|
||||
backup-ssd dir disabled 0 0 0 N/A
|
||||
got timeout
|
||||
unable to activate storage 'backup-nfs' - directory '/mnt/pve/backup-nfs' does not exist or is unreachable
|
||||
```
|
||||
|
||||
#### 2. Verificare configurație storage
|
||||
```bash
|
||||
ssh root@10.0.20.201 "cat /etc/pve/storage.cfg | grep -A5 backup-nfs"
|
||||
```
|
||||
|
||||
**Output:**
|
||||
```
|
||||
nfs: backup-nfs
|
||||
export /mnt/backup
|
||||
path /mnt/pve/backup-nfs
|
||||
server 10.0.20.201
|
||||
content rootdir,snippets,images,iso,import,vztmpl,backup
|
||||
```
|
||||
|
||||
#### 3. Verificare mount point (TIMEOUT)
|
||||
```bash
|
||||
ssh root@10.0.20.201 "ls -ld /mnt/pve/backup-nfs"
|
||||
# Timeout după 2 minute - NFS blocat complet
|
||||
```
|
||||
|
||||
#### 4. Verificare dacă este montat
|
||||
```bash
|
||||
ssh root@10.0.20.201 "mount | grep backup-nfs"
|
||||
```
|
||||
|
||||
**Output:**
|
||||
```
|
||||
10.0.20.201:/mnt/backup on /mnt/pve/backup-nfs type nfs4 (rw,relatime,vers=4.2,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.0.20.201,local_lock=none,addr=10.0.20.201)
|
||||
```
|
||||
|
||||
**Cauză identificată:** NFS server blocat pe pvemini - mount exista dar era complet non-responsive.
|
||||
|
||||
#### 5. Verificare status servicii NFS
|
||||
```bash
|
||||
ssh root@10.0.20.201 "systemctl status nfs-server"
|
||||
# Active: active (exited) - dar non-functional
|
||||
```
|
||||
|
||||
#### 6. Încercări de remediere (toate au eșuat cu timeout)
|
||||
```bash
|
||||
# Încercare unmount forțat
|
||||
ssh root@10.0.20.201 "umount -f /mnt/pve/backup-nfs"
|
||||
# device is busy
|
||||
|
||||
# Încercare restart servicii NFS
|
||||
ssh root@10.0.20.201 "systemctl restart nfs-server"
|
||||
# Timeout după 30s
|
||||
|
||||
# Încercare kill procese NFS
|
||||
ssh root@10.0.20.201 "pkill -9 nfs"
|
||||
# Timeout după 15s
|
||||
```
|
||||
|
||||
### Rezolvare Backup-NFS
|
||||
|
||||
#### Pas 1: Dezactivare storage din alt nod
|
||||
```bash
|
||||
ssh root@10.0.20.200 "pvesm set backup-nfs --disable 1"
|
||||
ssh root@10.0.20.200 "pvesm status | grep backup"
|
||||
```
|
||||
|
||||
**Output:**
|
||||
```
|
||||
backup dir disabled
|
||||
backup-nfs nfs disabled
|
||||
backup-ssd dir active
|
||||
```
|
||||
|
||||
#### Pas 2: Force reboot pvemini
|
||||
```bash
|
||||
# Încercare reboot normal (blocat)
|
||||
ssh root@10.0.20.201 "reboot" &
|
||||
# Nu a funcționat
|
||||
|
||||
# Force reboot via sysrq
|
||||
ssh root@10.0.20.201 "echo 1 > /proc/sys/kernel/sysrq && echo b > /proc/sysrq-trigger" &
|
||||
# Output: "System is going down" - SUCCESS
|
||||
```
|
||||
|
||||
#### Pas 3: Monitorizare reboot
|
||||
```bash
|
||||
for i in {1..60}; do
|
||||
sleep 2
|
||||
ping -c 1 -W 1 10.0.20.201 >/dev/null 2>&1 && echo "pvemini is back online!" && break || echo "Waiting... ($i/60)"
|
||||
done
|
||||
# Output: pvemini is back online! (după ~6 secunde)
|
||||
```
|
||||
|
||||
#### Pas 4: Verificare după reboot
|
||||
```bash
|
||||
# Așteptare servicii Proxmox
|
||||
sleep 15
|
||||
|
||||
# Verificare status storage
|
||||
ssh root@10.0.20.201 "pvesm status | grep backup-nfs"
|
||||
# Output: backup-nfs nfs disabled
|
||||
```
|
||||
|
||||
#### Pas 5: Re-activare storage
|
||||
```bash
|
||||
ssh root@10.0.20.201 "pvesm set backup-nfs --disable 0"
|
||||
ssh root@10.0.20.201 "pvesm status | grep backup"
|
||||
```
|
||||
|
||||
**Output:**
|
||||
```
|
||||
backup dir active 1921724696 287855936 1536176700 14.98%
|
||||
backup-nfs nfs inactive 0 0 0 0.00%
|
||||
```
|
||||
|
||||
#### Pas 6: Verificare mount
|
||||
```bash
|
||||
ssh root@10.0.20.201 "mount | grep backup-nfs"
|
||||
```
|
||||
|
||||
**Output:**
|
||||
```
|
||||
10.0.20.201:/mnt/backup on /mnt/pve/backup-nfs type nfs4 (rw,relatime,vers=4.2,rsize=1048576,wsize=1048576)
|
||||
```
|
||||
|
||||
#### Pas 7: Verificare accesibilitate
|
||||
```bash
|
||||
ssh root@10.0.20.201 "df -h /mnt/pve/backup-nfs"
|
||||
```
|
||||
|
||||
**Output:**
|
||||
```
|
||||
Filesystem Size Used Avail Use% Mounted on
|
||||
10.0.20.201:/mnt/backup 1.8T 275G 1.5T 16% /mnt/pve/backup-nfs
|
||||
```
|
||||
|
||||
#### Pas 8: Restart pvestatd pentru refresh
|
||||
```bash
|
||||
ssh root@10.0.20.201 "systemctl restart pvestatd"
|
||||
ssh root@10.0.20.201 "sleep 5 && pvesm status | grep backup-nfs"
|
||||
```
|
||||
|
||||
**Output final:**
|
||||
```
|
||||
backup-nfs nfs active 1921725440 287856640 1536177152 14.98%
|
||||
```
|
||||
|
||||
**Rezultat:** ✅ Storage backup-nfs funcțional și active
|
||||
|
||||
---
|
||||
|
||||
## Observații Suplimentare
|
||||
|
||||
### VM/LXC nu au pornit automat după reboot
|
||||
Deși toate containerele și VM-urile cu `onboot: 1` nu au pornit imediat după reboot-ul forțat, acestea s-au recuperat automat după ce:
|
||||
- Cluster quorum s-a re-stabilit (3/3 noduri)
|
||||
- HA manager și-a recuperat starea
|
||||
- Storage-urile au devenit disponibile
|
||||
|
||||
HA a fost conservativ după reboot-ul forțat, așteptând confirmarea stabilității cluster-ului înainte de a porni serviciile.
|
||||
|
||||
---
|
||||
|
||||
## Lecții Învățate
|
||||
|
||||
### Despre Lock-uri VM
|
||||
1. Lock-urile de backup pot rămâne active dacă job-urile de backup sunt întrerupte brusc
|
||||
2. `qm unlock <VMID>` rezolvă lock-uri simple
|
||||
3. Pentru VM-uri în HA error state, este necesar să fie remove din HA înainte de intervenții
|
||||
|
||||
### Despre NFS pe Proxmox
|
||||
1. **Evită self-mount NFS** - pvemini montează NFS de pe el însuși (10.0.20.201:/mnt/backup → 10.0.20.201:/mnt/pve/backup-nfs)
|
||||
2. Această configurație poate cauza deadlock-uri când NFS server-ul sau client-ul au probleme
|
||||
3. **Recomandare:** Mută NFS server-ul pe un nod dedicat sau NAS separate
|
||||
|
||||
### Comenzi Utile pentru Diagnostic
|
||||
|
||||
#### Verificare HA status
|
||||
```bash
|
||||
ha-manager status # Overview complet HA
|
||||
ha-manager config # Configurație HA resources
|
||||
cat /etc/pve/ha/resources.cfg # Fișier configurație HA
|
||||
journalctl -u pve-ha-lrm -f # Log-uri HA Local Resource Manager
|
||||
```
|
||||
|
||||
#### Verificare Lock-uri VM
|
||||
```bash
|
||||
qm config <VMID> | grep lock # Verifică lock în config
|
||||
ls -lh /var/lock/qemu-server/ # Lock files pe disk
|
||||
qm unlock <VMID> # Remove lock
|
||||
qm stop <VMID> --skiplock # Stop forțat ignorând lock
|
||||
```
|
||||
|
||||
#### Verificare NFS
|
||||
```bash
|
||||
showmount -e <IP> # Export-uri disponibile
|
||||
pvesm nfsscan <IP> # Scan NFS via Proxmox
|
||||
mount | grep nfs # Mount-uri NFS active
|
||||
df -h <mount_point> # Test accesibilitate mount
|
||||
systemctl status nfs-server # Status NFS server
|
||||
systemctl status nfs-client.target # Status NFS client
|
||||
```
|
||||
|
||||
#### Force Reboot când SSH-ul este blocat
|
||||
```bash
|
||||
# Via sysrq (cel mai safe force reboot)
|
||||
ssh root@<IP> "echo 1 > /proc/sys/kernel/sysrq && echo b > /proc/sysrq-trigger" &
|
||||
|
||||
# Via IPMI/iLO (dacă disponibil)
|
||||
ipmitool -I lanplus -H <IPMI_IP> -U <user> -P <pass> power reset
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Preventie
|
||||
|
||||
### Pentru VM Lock Issues
|
||||
1. **Monitorizează job-urile de backup** - verifică că se termină corect
|
||||
2. **Test backup recovery** - periodic test restore pentru validare
|
||||
3. **Configurează timeout-uri** adecvate pentru backup-uri mari
|
||||
4. **Enable HA doar pentru VM-uri critice** - nu toate VM-urile necesită HA
|
||||
|
||||
### Pentru Storage NFS
|
||||
1. **Separă NFS server de client** - nu monta NFS de pe același host
|
||||
2. **Monitorizează NFS timeouts** în log-uri
|
||||
3. **Configurează soft mount** în loc de hard mount pentru non-critical storage
|
||||
4. **Test periodic** accesibilitatea storage-urilor NFS
|
||||
|
||||
### Monitorizare Preventivă
|
||||
```bash
|
||||
# Script verificare lock-uri VM
|
||||
for vm in $(qm list | awk 'NR>1 {print $1}'); do
|
||||
if qm config $vm | grep -q "^lock:"; then
|
||||
echo "WARNING: VM $vm has lock: $(qm config $vm | grep '^lock:')"
|
||||
fi
|
||||
done
|
||||
|
||||
# Script verificare NFS health
|
||||
for nfs in $(pvesm status | grep nfs | awk '{print $1}'); do
|
||||
if ! pvesm list $nfs &>/dev/null; then
|
||||
echo "ERROR: Storage $nfs not accessible"
|
||||
fi
|
||||
done
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Rezumat Comenzi Executate
|
||||
|
||||
### Rezolvare VM 201
|
||||
```bash
|
||||
ssh root@10.0.20.201 "qm unlock 201"
|
||||
ssh root@10.0.20.201 "ha-manager remove vm:201"
|
||||
ssh root@10.0.20.201 "qm stop 201"
|
||||
ssh root@10.0.20.201 "qm start 201"
|
||||
ssh root@10.0.20.201 "ha-manager add vm:201"
|
||||
```
|
||||
|
||||
### Rezolvare backup-nfs
|
||||
```bash
|
||||
ssh root@10.0.20.200 "pvesm set backup-nfs --disable 1"
|
||||
ssh root@10.0.20.201 "echo 1 > /proc/sys/kernel/sysrq && echo b > /proc/sysrq-trigger" &
|
||||
# Așteptare reboot
|
||||
ssh root@10.0.20.201 "pvesm set backup-nfs --disable 0"
|
||||
ssh root@10.0.20.201 "systemctl restart pvestatd"
|
||||
```
|
||||
|
||||
**Timp total rezolvare:** ~15 minute (incluzând reboot-ul)
|
||||
@@ -0,0 +1,202 @@
|
||||
# VM 201 - Troubleshooting Pană de Curent (2026-01-11)
|
||||
|
||||
## Rezumat Incident
|
||||
|
||||
**Data:** 2026-01-11
|
||||
**Problemă:** VM 201 nu pornea după o pană de curent
|
||||
**Cauză root:** HA blocat în starea "migrate" din cauza dependențelor de storage indisponibil
|
||||
**Rezoluție:** Migrare manuală, eliminare HA, configurare replicare
|
||||
|
||||
---
|
||||
|
||||
## Cronologie Incident
|
||||
|
||||
### 1. Stare Inițială
|
||||
- VM 201 era configurat pe **pveelite** (migrat anterior de HA)
|
||||
- Replicare configurată: pveelite → pve1, pvemini
|
||||
- HA activ în `ha-group-main` (prioritate: pvemini:100 > pveelite:50)
|
||||
|
||||
### 2. Ce s-a întâmplat la pana de curent
|
||||
1. pvemini a căzut
|
||||
2. HA a încercat să migreze VM 201 pe pveelite
|
||||
3. Migrarea a eșuat din cauza ISO atașat de pe storage `backup`
|
||||
4. Când pvemini a revenit, HA a încercat să migreze înapoi
|
||||
5. HA a rămas blocat în starea "migrate", reîncercând la fiecare 10 secunde
|
||||
|
||||
### 3. Erori întâlnite
|
||||
```
|
||||
storage 'backup' is not available on node 'pveelite'
|
||||
migration aborted
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Probleme Identificate
|
||||
|
||||
| Problemă | Impact | Rezolvare |
|
||||
|----------|--------|-----------|
|
||||
| ISO atașat de pe storage local (`backup:iso/virtio-win-latest.iso`) | Blochează migrarea automată | Detașat ISO: `qm set 201 --ide1 none` |
|
||||
| Snapshot-uri cu referințe la storage `backup` | Blochează migrarea | Șterse snapshot-uri |
|
||||
| Replicare configurată invers | Discuri pe nod greșit | Recreat job-uri replicare |
|
||||
| Clone ZFS (base-300) legat de discuri VM 201 | Blochează ștergerea | Promovat clone: `zfs promote` |
|
||||
| HA cu failback automat | Încerca să mute înapoi VM-ul | Eliminat din HA |
|
||||
|
||||
---
|
||||
|
||||
## Pași de Rezolvare
|
||||
|
||||
### Pas 1: Diagnostic
|
||||
```bash
|
||||
# Verificare unde e VM-ul
|
||||
find /etc/pve/nodes -name '201.conf'
|
||||
|
||||
# Verificare stare HA
|
||||
ha-manager status | grep 201
|
||||
|
||||
# Verificare erori
|
||||
ssh root@10.0.20.202 "journalctl -u pve-ha-lrm -n 50"
|
||||
```
|
||||
|
||||
### Pas 2: Dezactivare HA temporar
|
||||
```bash
|
||||
ha-manager set vm:201 --state disabled
|
||||
# Sau eliminare completă:
|
||||
ha-manager remove vm:201
|
||||
```
|
||||
|
||||
### Pas 3: Detașare ISO
|
||||
```bash
|
||||
qm set 201 --ide1 none
|
||||
```
|
||||
|
||||
### Pas 4: Ștergere snapshot-uri cu referințe problematice
|
||||
```bash
|
||||
qm delsnapshot 201 Windows11VisualSVNROAUpdate
|
||||
qm delsnapshot 201 Windows11Debloated
|
||||
qm delsnapshot 201 Windows11ProaspatInstalat
|
||||
```
|
||||
|
||||
### Pas 5: Ștergere job-uri replicare corupte
|
||||
```bash
|
||||
pvesr delete 201-0 --force
|
||||
pvesr delete 201-1 --force
|
||||
```
|
||||
|
||||
### Pas 6: Migrare manuală
|
||||
```bash
|
||||
qm migrate 201 pvemini
|
||||
```
|
||||
|
||||
### Pas 7: Recreare job-uri replicare
|
||||
```bash
|
||||
pvesr create-local-job 201-0 pve1 --schedule '*/30' --comment 'central W11'
|
||||
pvesr create-local-job 201-1 pveelite --schedule '*/30' --comment 'central W11'
|
||||
```
|
||||
|
||||
### Pas 8: Curățare discuri vechi nefolosite
|
||||
```bash
|
||||
# Promovare clone (dacă există)
|
||||
zfs promote rpool/data/base-300-disk-0
|
||||
zfs promote rpool/data/base-300-disk-1
|
||||
|
||||
# Ștergere discuri vechi
|
||||
zfs destroy -r rpool/data/vm-201-disk-0
|
||||
zfs destroy -r rpool/data/vm-201-disk-2
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Configurație Finală
|
||||
|
||||
### VM 201
|
||||
- **Nod:** pvemini (10.0.20.201)
|
||||
- **IP:** 10.0.20.122
|
||||
- **Discuri:** vm-201-disk-1 (EFI), vm-201-disk-3 (500GB)
|
||||
|
||||
### HA
|
||||
- **Status:** ELIMINAT (control manual)
|
||||
- **Motiv:** Evitare blocaje la migrare automată
|
||||
|
||||
### Replicare
|
||||
- **201-0:** pvemini → pve1 (*/30)
|
||||
- **201-1:** pvemini → pveelite (*/30)
|
||||
|
||||
---
|
||||
|
||||
## Lecții Învățate
|
||||
|
||||
### 1. NU atașa ISO-uri de pe storage local
|
||||
Storage-ul `backup` este local pe pvemini și nu e disponibil pe alte noduri. Asta blochează migrarea.
|
||||
|
||||
**Soluție:** Detașează ISO-urile când nu sunt necesare:
|
||||
```bash
|
||||
qm set 201 --ide1 none --ide2 none
|
||||
```
|
||||
|
||||
### 2. NU crea snapshot-uri cu ISO atașat
|
||||
Snapshot-urile salvează referințele la storage, care blochează migrarea ulterioară.
|
||||
|
||||
### 3. Replicarea și HA sunt independente
|
||||
- **Replicare (pvesr):** Copiază discurile ZFS între noduri
|
||||
- **HA:** Gestionează pornirea/migrarea automată
|
||||
|
||||
Poți avea replicare fără HA.
|
||||
|
||||
### 4. `/etc/pve` este partajat în cluster
|
||||
Chiar dacă un nod e offline, fișierele de configurare sunt accesibile de pe alte noduri prin pmxcfs.
|
||||
|
||||
### 5. Clone-urile ZFS blochează ștergerea
|
||||
Dacă ai creat un VM template dintr-un snapshot, clone-ul trebuie promovat înainte de a șterge volumul părinte:
|
||||
```bash
|
||||
zfs promote rpool/data/base-XXX-disk-Y
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Procedură Failover Manual (Viitor)
|
||||
|
||||
### Când pvemini cade:
|
||||
```bash
|
||||
# De pe pveelite sau pve1:
|
||||
mv /etc/pve/nodes/pvemini/qemu-server/201.conf /etc/pve/nodes/pveelite/qemu-server/201.conf
|
||||
qm start 201
|
||||
```
|
||||
|
||||
### Când pvemini revine (failback):
|
||||
```bash
|
||||
qm migrate 201 pvemini --online
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Comenzi Utile
|
||||
|
||||
```bash
|
||||
# Status replicare
|
||||
pvesr status | grep 201
|
||||
|
||||
# Forțare replicare imediată
|
||||
pvesr schedule-now 201-0 && pvesr schedule-now 201-1
|
||||
|
||||
# Verificare discuri pe noduri
|
||||
ssh root@10.0.20.201 "zfs list | grep vm-201"
|
||||
ssh root@10.0.20.202 "zfs list | grep vm-201"
|
||||
ssh root@10.0.20.200 "zfs list | grep vm-201"
|
||||
|
||||
# Verificare configurare VM
|
||||
qm config 201 | grep -E 'disk|efidisk|virtio|ide'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Referințe
|
||||
|
||||
- **Documentație VM 201:** `vm201-windows11.md`
|
||||
- **Proxmox Replication:** https://pve.proxmox.com/wiki/Storage_Replication
|
||||
- **Proxmox HA:** https://pve.proxmox.com/wiki/High_Availability
|
||||
|
||||
---
|
||||
|
||||
**Data rezolvare:** 2026-01-11
|
||||
**Durată incident:** ~2 ore
|
||||
**Autor:** Marius Mutu
|
||||
104
proxmox/vm201-windows/scripts/check-ssl-certificates.ps1
Normal file
104
proxmox/vm201-windows/scripts/check-ssl-certificates.ps1
Normal file
@@ -0,0 +1,104 @@
|
||||
# Script: check-ssl-certificates.ps1
|
||||
# Locatie: D:\kit\ssl\check-ssl-certificates.ps1
|
||||
# Scop: Verifica certificatele SSL IIS si forteaza reinstalarea daca expira in < 14 zile
|
||||
# Rulare: Task Scheduler zilnic sau manual
|
||||
|
||||
param(
|
||||
[int]$DaysBeforeExpiry = 14,
|
||||
[switch]$Force,
|
||||
[switch]$Verbose
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
$LogFile = "C:\Tools\win-acme\ssl-check.log"
|
||||
|
||||
function Write-Log {
|
||||
param([string]$Message)
|
||||
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
|
||||
$logMessage = "[$timestamp] $Message"
|
||||
Add-Content -Path $LogFile -Value $logMessage
|
||||
if ($Verbose) { Write-Host $logMessage }
|
||||
}
|
||||
|
||||
# Domenii de verificat
|
||||
$domains = @(
|
||||
@{ SiteId = 1; Domain = "roa.romfast.ro" },
|
||||
@{ SiteId = 2; Domain = "dokploy.romfast.ro" },
|
||||
@{ SiteId = 3; Domain = "gitea.romfast.ro" },
|
||||
@{ SiteId = 4; Domain = "roa2web.romfast.ro" }
|
||||
)
|
||||
|
||||
Write-Log "========== Verificare certificate SSL =========="
|
||||
|
||||
$renewedCount = 0
|
||||
$errorCount = 0
|
||||
|
||||
foreach ($site in $domains) {
|
||||
$domain = $site.Domain
|
||||
$siteId = $site.SiteId
|
||||
|
||||
try {
|
||||
# Verifica certificatul curent via HTTPS
|
||||
$request = [System.Net.HttpWebRequest]::Create("https://$domain")
|
||||
$request.AllowAutoRedirect = $false
|
||||
$request.Timeout = 10000
|
||||
$request.ServerCertificateValidationCallback = { $true }
|
||||
|
||||
try {
|
||||
$response = $request.GetResponse()
|
||||
$response.Close()
|
||||
} catch [System.Net.WebException] {
|
||||
# Ignoram erorile HTTP, ne intereseaza certificatul
|
||||
}
|
||||
|
||||
$cert = $request.ServicePoint.Certificate
|
||||
if ($null -eq $cert) {
|
||||
Write-Log "EROARE: Nu s-a putut obtine certificatul pentru $domain"
|
||||
$errorCount++
|
||||
continue
|
||||
}
|
||||
|
||||
$cert2 = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 $cert
|
||||
$expiryDate = $cert2.NotAfter
|
||||
$daysLeft = ($expiryDate - (Get-Date)).Days
|
||||
|
||||
Write-Log "$domain - Expira: $expiryDate (inca $daysLeft zile)"
|
||||
|
||||
# Verifica daca trebuie reinnoirea
|
||||
if ($daysLeft -lt $DaysBeforeExpiry -or $Force) {
|
||||
Write-Log "ACTIUNE: Fortez reinstalare certificat pentru $domain (Site ID: $siteId)"
|
||||
|
||||
Push-Location "C:\Tools\win-acme"
|
||||
$output = & .\wacs.exe --target iis --siteid $siteId --installation iis --force 2>&1
|
||||
Pop-Location
|
||||
|
||||
if ($LASTEXITCODE -eq 0) {
|
||||
Write-Log "SUCCES: Certificat reinstalat pentru $domain"
|
||||
$renewedCount++
|
||||
} else {
|
||||
Write-Log "EROARE: Reinstalare esuata pentru $domain"
|
||||
Write-Log $output
|
||||
$errorCount++
|
||||
}
|
||||
}
|
||||
} catch {
|
||||
Write-Log "EXCEPTIE pentru ${domain}: $($_.Exception.Message)"
|
||||
$errorCount++
|
||||
}
|
||||
}
|
||||
|
||||
# Restart IIS daca am reinoit certificate
|
||||
if ($renewedCount -gt 0) {
|
||||
Write-Log "Restart IIS..."
|
||||
iisreset /restart | Out-Null
|
||||
Write-Log "IIS restartat"
|
||||
}
|
||||
|
||||
Write-Log "========== Sumar: $renewedCount reinnoite, $errorCount erori =========="
|
||||
|
||||
# Exit code pentru monitorizare
|
||||
if ($errorCount -gt 0) {
|
||||
exit 1
|
||||
} else {
|
||||
exit 0
|
||||
}
|
||||
157
proxmox/vm201-windows/scripts/monitor-ssl-certificates.sh
Normal file
157
proxmox/vm201-windows/scripts/monitor-ssl-certificates.sh
Normal file
@@ -0,0 +1,157 @@
|
||||
#!/bin/bash
|
||||
# Script: monitor-ssl-certificates.sh
|
||||
# Locatie: /opt/scripts/monitor-ssl-certificates.sh (pe pvemini)
|
||||
# Scop: Verifica certificatele SSL extern si alerteaza/forteaza reinstalare
|
||||
# Rulare: Cron zilnic sau la cerere
|
||||
|
||||
set -e
|
||||
|
||||
# Configurare
|
||||
DAYS_WARNING=14
|
||||
DAYS_CRITICAL=7
|
||||
LOG_FILE="/var/log/ssl-monitor.log"
|
||||
EMAIL_TO="root" # Proxmox trimite la adresa configurata
|
||||
|
||||
# Domenii de verificat
|
||||
DOMAINS=(
|
||||
"roa.romfast.ro"
|
||||
"dokploy.romfast.ro"
|
||||
"gitea.romfast.ro"
|
||||
"roa2web.romfast.ro"
|
||||
)
|
||||
|
||||
# Site IDs pentru fiecare domeniu (in aceeasi ordine)
|
||||
SITE_IDS=(1 2 3 4)
|
||||
|
||||
log() {
|
||||
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
|
||||
}
|
||||
|
||||
check_certificate() {
|
||||
local domain=$1
|
||||
local expiry_date expiry_epoch now_epoch days_left
|
||||
|
||||
# Obtine data expirare
|
||||
expiry_date=$(echo | openssl s_client -servername "$domain" -connect "$domain:443" 2>/dev/null | \
|
||||
openssl x509 -noout -enddate 2>/dev/null | cut -d= -f2)
|
||||
|
||||
if [[ -z "$expiry_date" ]]; then
|
||||
echo "-1"
|
||||
return
|
||||
fi
|
||||
|
||||
# Calculeaza zilele ramase
|
||||
expiry_epoch=$(date -d "$expiry_date" +%s 2>/dev/null)
|
||||
now_epoch=$(date +%s)
|
||||
days_left=$(( (expiry_epoch - now_epoch) / 86400 ))
|
||||
|
||||
echo "$days_left"
|
||||
}
|
||||
|
||||
force_renew_certificate() {
|
||||
local site_id=$1
|
||||
local domain=$2
|
||||
|
||||
log "Fortez reinstalare certificat pentru $domain (Site ID: $site_id)..."
|
||||
|
||||
# Executa pe VM 201 prin Proxmox guest agent
|
||||
result=$(qm guest exec 201 -- powershell -Command \
|
||||
"cd C:\\Tools\\win-acme; .\\wacs.exe --target iis --siteid $site_id --installation iis --force" 2>&1)
|
||||
|
||||
if echo "$result" | grep -q '"exitcode" : 0'; then
|
||||
log "SUCCES: Certificat reinstalat pentru $domain"
|
||||
return 0
|
||||
else
|
||||
log "EROARE: Reinstalare esuata pentru $domain"
|
||||
log "$result"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
restart_iis() {
|
||||
log "Restart IIS..."
|
||||
qm guest exec 201 -- cmd /c "iisreset" >/dev/null 2>&1
|
||||
log "IIS restartat"
|
||||
}
|
||||
|
||||
send_alert() {
|
||||
local subject=$1
|
||||
local body=$2
|
||||
|
||||
# Foloseste sistemul de notificari Proxmox
|
||||
if command -v pvesh &>/dev/null; then
|
||||
echo "$body" | mail -s "$subject" "$EMAIL_TO" 2>/dev/null || true
|
||||
fi
|
||||
|
||||
log "ALERT: $subject"
|
||||
}
|
||||
|
||||
# Main
|
||||
log "========== Verificare certificate SSL =========="
|
||||
|
||||
warnings=()
|
||||
criticals=()
|
||||
renewed=0
|
||||
|
||||
for i in "${!DOMAINS[@]}"; do
|
||||
domain="${DOMAINS[$i]}"
|
||||
site_id="${SITE_IDS[$i]}"
|
||||
|
||||
days_left=$(check_certificate "$domain")
|
||||
|
||||
if [[ "$days_left" == "-1" ]]; then
|
||||
log "EROARE: Nu pot verifica $domain"
|
||||
criticals+=("$domain: Nu pot obtine certificatul")
|
||||
continue
|
||||
fi
|
||||
|
||||
log "$domain: $days_left zile ramase"
|
||||
|
||||
if [[ $days_left -lt 0 ]]; then
|
||||
criticals+=("$domain: EXPIRAT!")
|
||||
# Forteaza reinstalare
|
||||
if force_renew_certificate "$site_id" "$domain"; then
|
||||
((renewed++))
|
||||
fi
|
||||
elif [[ $days_left -lt $DAYS_CRITICAL ]]; then
|
||||
criticals+=("$domain: expira in $days_left zile")
|
||||
# Forteaza reinstalare
|
||||
if force_renew_certificate "$site_id" "$domain"; then
|
||||
((renewed++))
|
||||
fi
|
||||
elif [[ $days_left -lt $DAYS_WARNING ]]; then
|
||||
warnings+=("$domain: expira in $days_left zile")
|
||||
# Forteaza reinstalare preventiv
|
||||
if force_renew_certificate "$site_id" "$domain"; then
|
||||
((renewed++))
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
# Restart IIS daca am reinoit
|
||||
if [[ $renewed -gt 0 ]]; then
|
||||
restart_iis
|
||||
fi
|
||||
|
||||
# Trimite alerte
|
||||
if [[ ${#criticals[@]} -gt 0 ]]; then
|
||||
body="Certificate SSL CRITICE:\n\n"
|
||||
for msg in "${criticals[@]}"; do
|
||||
body+="- $msg\n"
|
||||
done
|
||||
body+="\nActiuni intreprinse: $renewed certificate reinstalate"
|
||||
send_alert "[CRITICAL] Certificate SSL expirate/aproape de expirare" "$body"
|
||||
fi
|
||||
|
||||
if [[ ${#warnings[@]} -gt 0 && ${#criticals[@]} -eq 0 ]]; then
|
||||
body="Certificate SSL WARNING:\n\n"
|
||||
for msg in "${warnings[@]}"; do
|
||||
body+="- $msg\n"
|
||||
done
|
||||
body+="\nActiuni intreprinse: $renewed certificate reinstalate"
|
||||
send_alert "[WARNING] Certificate SSL aproape de expirare" "$body"
|
||||
fi
|
||||
|
||||
log "========== Sumar: $renewed reinstalate, ${#warnings[@]} warnings, ${#criticals[@]} critice =========="
|
||||
|
||||
exit 0
|
||||
Reference in New Issue
Block a user