Files
ROMFASTSQL/proxmox/vm201-windows/docs/vm201-roa-update-server.md
Claude Agent e08ffb1b68 docs(vm201): document ROA + CONTAFIN update server (IIS apps)
Adds vm201-roa-update-server.md describing the two IIS virtual apps under
roa.romfast.ro that distribute application updates to ROMFAST clients:

- /roaupdate -> D:\ROAUPDATE: per-client VFP XML manifests, _ARHIVE ZIPs
  for 35+ ROA modules (ROACONT, ROAFACTURARE, ROAGEST, etc.), SVN-backed
  DB scripts, xmlupdatecreator workflow.
- /contafinupdate -> D:\APPUPDATESERVERAVFP: ActiveVFP server with
  AVFPHandler for *.avfp requests, VFP9 runtime.

Also captures the full IIS site inventory (Default Web Site, ROA2WEB,
Dokploy, Gitea, roa-qr, roa-apps) verified live on 2026-04-25, and lists
the configured client manifests (ROMFAST, ROMPETROL, ARGENTA, etc.).

Cross-references added in proxmox/README.md and vm201-windows/README.md.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 22:14:05 +00:00

296 lines
11 KiB
Markdown

# VM 201 — Server Update Aplicații ROA + CONTAFIN
## Obiectiv
VM 201 găzduiește pe IIS două puncte de distribuție pentru update-urile
aplicațiilor ROMFAST către clienți:
- **`roa.romfast.ro/roaupdate`** — distribuție ZIP-uri + scripturi DB pentru
modulele ROA (peste 35 module: ROACONT, ROAFACTURARE, ROAGEST, etc.).
- **`roa.romfast.ro/contafinupdate`** — server ActiveVFP (AVFP) pentru
update-uri aplicație CONTAFIN.
Aceste două aplicații virtuale trăiesc sub site-ul **Default Web Site**
(`roa.romfast.ro`) și au path-uri fizice pe **D:\\** (separate de IIS root).
---
## Layout IIS pe VM 201 (recap)
```
Default Web Site (roa.romfast.ro) → C:\inetpub\wwwroot (gol, doar landing IIS)
├── /contafinupdate [Application] → D:\APPUPDATESERVERAVFP (AVFP)
├── /roaupdate [Application] → D:\ROAUPDATE (ZIP + XML)
└── /* (catch-all) → proxy → 10.0.20.36 (ROA Windows prod)
ROA2WEB (roa2web.romfast.ro) → C:\inetpub\roa2web (web.config-only proxy → 10.0.20.36)
Dokploy (dokploy.romfast.ro) → proxy LXC 103 Traefik
Gitea (gitea.romfast.ro) → proxy LXC 106
roa-qr (roa-qr.romfast.ro) → proxy LXC 103 Traefik (pdf-qr-app)
roa-apps (*.roa.romfast.ro) → proxy LXC 103 Traefik (Dokploy apps)
Default Web Site → port 81 (binding intern)
```
---
## /roaupdate — Distribuție Module ROA
**Path fizic:** `D:\ROAUPDATE`
**URL public:** `https://roa.romfast.ro/roaupdate/`
**Web.config:** Windows authentication + directory browse activat
### Mecanism Update
1. Aplicația ROA pe stația clientului (instalată din `ROASTART`) descarcă
`https://roa.romfast.ro/roaupdate/<CLIENT>.xml`.
2. XML-ul listează modulele și versiunile curente pentru clientul respectiv,
plus URL-ul ZIP în `_ARHIVE`.
3. Stația compară versiunile cu cele instalate local.
4. Pentru fiecare modul cu versiune nouă, descarcă
`https://roa.romfast.ro/roaupdate/_ARHIVE/<MODUL>/<MODUL>-x.y.z.ZIP`,
dezarhivează și înlocuiește binarele locale.
### Structura `D:\ROAUPDATE`
| Element | Conținut |
|---------|----------|
| `<CLIENT>.xml` | Manifest update per client (vezi mai jos) |
| `ROASTART_<CLIENT>.xml` | Manifest pentru bootstrap-ul `ROASTART` (COMUNROA, ROAPRINT, USERREPORTS) |
| `_ARHIVE/<MODUL>/` | ZIP-urile efective per versiune (ex: `_ARHIVE\ROACONT\ROACONT-2.11.49.ZIP`) |
| `_UPDATE/` | Buffer de pregătire build-uri noi (LastWrite recent = build activ) |
| `<MODUL>/` | Sursele/proiectele VFP per modul (ex: `ROACONT`, `ROAFACTURARE`, `ROARES`) |
| `DATABASE/SCRIPTURI/`, `DATABASE/SCRIPTURI_CLAR/` | Scripturi SQL versiunate în SVN — pull cu TortoiseSVN |
| `xmlupdatecreator.exe` | Tool VFP de generare a XML-urilor de manifest |
| `tasks.bat` | Job orchestrare: `svn update` pe `SCRIPTURI` + `SCRIPTURI_CLAR`, lansare `tasks\tasks.exe` |
| `settings.ini` | Endpoint raportare erori (`romfast.dnsalias.com:3000/errors/create_xml`) |
| `who9.exe`, `romfast_suport.exe` | Utilitare auxiliare (suport remote + diagnostic VFP9) |
| `firmanoua.zip`, `ROAREGISTRATURA.zip` | Pachete inițializare clienți noi |
### Format Manifest Client
Exemplu fragment din `ROMPETROL.xml`:
```xml
<crsxmloutnew>
<item>ROACONT</item>
<version>2.11.49</version>
<fileurl>\_ARHIVE\ROACONT\ROACONT-2.11.49.ZIP</fileurl>
<usermsg/>
</crsxmloutnew>
```
`<usermsg>` — mesaj opțional afișat user-ului în timpul update-ului
(ex: instrucțiuni manuale, restart obligatoriu).
### Module ROA Distribuite (extras din `ROMFAST.xml`)
```
ROAAPROV ROAAUTO ROACOMENZI ROACONT ROACONTRACTE
ROADECL ROADEF ROADEFSALARII ROADEVIZE ROAFACTURARE
ROAFURNIZORI ROAGEST ROAGRESTAURANT ROAHOTEL ROAHOTELCONFIG
ROAIMOB ROAINCHIDSAL ROAJURIDIC ROALUCRARI ROAMANAGER
ROAMASINI ROANOR ROAOBINV ROAOFERTA ROAOFERTARE
ROAPRETURI ROAPRODUCTIE ROAREGISTRATURA ROARES ROARESTAURANT
ROARETAIL ROASAL ROASALSPEC ROASITFIN ROASITOP
ROASUPORT ROAVIN
```
Modulul `ROASTART` (bootstrap) este publicat separat prin
`ROASTART_<CLIENT>.xml` și include: `COMUNROA`, `ROAPRINT`,
`<CLIENT>_USERREPORTS`.
### Clienți Configurați (extras manifeste)
Manifeste per client găsite în `D:\ROAUPDATE`:
```
ABCVAL ACN ARGENTA AUTOHAUS AUTOMOTIVE
AVIS CAMBRIDGE CLEVER CONPRESS CONPRESSHOLDING
EDUARD EMS EUROPEANMETALSERVICES FRUVIMED HANULPIRATILOR
IDEEA IMA METACOM METACOMBUSINESSSRL METALICA
METALICAD.G.SRL POLARIS PRINTCONCEPT ROMCONSTRUCT ROMFAST
ROMPETROL SIGMA SOUTH STEAUANORDULUI UTMIDIA
VADECO VENDING VENDINGMASTERSRL VINRAI VOICU
DEMOROA DEVROA DEVROA2
CUSTOMER_4859 CUSTOMER_4863 CUSTOMER_4880 CUSTOMER_4886 CUSTOMER_4995
```
### Scripturi DB (SVN)
`tasks.bat` apelează TortoiseSVN pentru a aduce ultimele scripturi:
```bat
TortoiseProc.exe /command:update /path:D:\ROAUPDATE\DATABASE\SCRIPTURI\
TortoiseProc.exe /command:update /path:D:\ROAUPDATE\DATABASE\SCRIPTURI_CLAR\
START D:\ROAUPDATE\DATABASE\SCRIPTURI_CLAR\2026
START D:\ROAUPDATE\tasks\tasks.exe
```
Scripturile sunt versionate într-un repo SVN extern (vezi configul
TortoiseSVN local pentru URL).
### Workflow Publicare Versiune Nouă
1. Build modul VFP în `D:\ROAUPDATE\<MODUL>\`.
2. Generează ZIP în `_ARHIVE\<MODUL>\<MODUL>-x.y.z.ZIP`.
3. Rulează `xmlupdatecreator.exe` pentru regenerarea manifestului
`<CLIENT>.xml` cu noua versiune.
4. Pentru update-uri DB: commit scripturi în SVN (la SCRIPTURI sau
SCRIPTURI_CLAR), apoi `tasks.bat` la următoarea rulare aduce update-ul
pe server.
5. Clienții văd noua versiune la următorul check (la pornire ROA sau
manual din meniu).
---
## /contafinupdate — Server ActiveVFP pentru CONTAFIN
**Path fizic:** `D:\APPUPDATESERVERAVFP`
**URL public:** `https://roa.romfast.ro/contafinupdate/`
**Stack:** ActiveVFP (Visual FoxPro server-side) + IIS handler `AVFPHandler`
### Configurare AVFP
`Web.Config` mapează toate request-urile `*.avfp` (și catch-all `*`) către
`AVFPHandler`, plus modulul `MazeComputer.AspManifestHelpers` pentru
procesarea manifestelor:
```xml
<handlers>
<add verb="*" path="*.avfp" name="AVFPHandler" type="AVFPHandler" />
<add verb="*" path="*" name="AVFPRESTHandler" type="AVFPHandler" />
</handlers>
<defaultDocument>
<files>
<clear />
<add value="default.avfp" />
</files>
</defaultDocument>
<system.web>
<identity impersonate="true" />
</system.web>
```
### `appupdateserver.ini`
Configurarea conexiunilor către sursa de update:
```ini
[general]
host=ROA_CENTRAL
user=soft_serii
password=***
downloadpath=d:\_CONTAFINUPDATE
roadownloadpath=d:\ROAUPDATE\_UPDATE
host_clienti=roa_romfast
user_clienti=romfast
password_clienti=***
host_soft=ROA_CENTRAL
user_soft=soft
password_soft=***
```
(Parolele reale sunt în fișierul de pe VM; nu sunt incluse aici.)
### Componente Cheie
| Fișier | Rol |
|--------|-----|
| `default.avfp` | Entry-point AVFP (default document) |
| `activevfp.dll` (+ `.manifest`) | Handler AVFP nativ |
| `vfp9t.dll`, `VFP9RENU.DLL`, `vfp2c32.fll`, `json.fll` | Runtime VFP9 + extensii |
| `msvcr71.dll` | Runtime VC necesar VFP9 |
| `prg/`, `bin/`, `data/`, `reports/` | Cod, binare, date, rapoarte AVFP |
| `Web.Config` | Mapare handler AVFP |
| `setup603.cmd` | Setup AVFP 6.0.3 (instalare runtime + handler) |
| `log.txt` | Log activitate (rotated manual) |
---
## Operațiuni Curente
### Verificare Stare Update Server (din Proxmox)
```bash
# Status IIS + applicații
ssh root@10.0.20.201 "qm guest exec 201 --timeout 30 -- powershell -Command \
\"Import-Module WebAdministration; Get-WebApplication\""
# Modulele ROA cu update recent (ultima săptămână)
ssh root@10.0.20.201 "qm guest exec 201 --timeout 30 -- powershell -Command \
\"Get-ChildItem 'D:\\ROAUPDATE' | Where-Object { \$_.LastWriteTime -gt (Get-Date).AddDays(-7) } | \
Select-Object Name, LastWriteTime\""
# Verificare manifest client (din browser sau curl)
curl -s https://roa.romfast.ro/roaupdate/ROMFAST.xml | head -50
```
### Test Conectivitate Client
De pe stația clientului (sau VM 201 însăși):
```powershell
# Test acces manifest
Invoke-WebRequest -Uri "https://roa.romfast.ro/roaupdate/ROMFAST.xml" -UseBasicParsing |
Select-Object StatusCode, @{n="Length";e={$_.Content.Length}}
# Test descărcare ZIP
Invoke-WebRequest -Uri "https://roa.romfast.ro/roaupdate/_ARHIVE/ROACONT/ROACONT-2.11.49.ZIP" `
-OutFile "$env:TEMP\test.zip" -UseBasicParsing
```
### Restart IIS (după modificări majore)
```bash
ssh root@10.0.20.201 "qm guest exec 201 --timeout 30 -- cmd /c iisreset"
```
---
## Securitate și Acces
- **/roaupdate** rulează cu `authentication mode="Windows"` în web.config.
Dacă se decide accesul anonim pentru clienți (caz uzual), trebuie
verificat că IIS Anonymous Authentication este activ pe folder.
- **/contafinupdate** folosește `identity impersonate=true` — handler-ul AVFP
rulează cu identitatea utilizatorului IIS curent.
- **TLS:** terminat la nivel de IIS pe `roa.romfast.ro` (certificat Let's
Encrypt — vezi `vm201-certificat-letsencrypt-iis.md`).
- **Endpoint raportare erori:** `romfast.dnsalias.com:3000/errors/create_xml`
(din `D:\ROAUPDATE\settings.ini`) — primește XML-uri de eroare de la
clienți. Nu e găzduit pe VM 201; verifică separat dacă serviciul rulează.
---
## Riscuri și Atenționări
- **Backup `D:\ROAUPDATE` și `D:\APPUPDATESERVERAVFP`:** ambele sunt pe
discul `D:`. Backup-ul Proxmox VZDump al VM 201 le acoperă (snapshot
întreg disk virtio0). Dar pentru recovery rapid al unei versiuni
individuale (`_ARHIVE\<MODUL>\<MODUL>-x.y.z.ZIP` șters accidental) e
util un backup separat al folderului.
- **SVN dependency:** scripturile DB sunt în SVN extern. Dacă serverul SVN
cade, `tasks.bat` eșuează la `svn update`. Verifică URL-ul SVN configurat
în TortoiseSVN local.
- **VFP9 runtime:** `D:\APPUPDATESERVERAVFP` depinde de `vfp9t.dll` și
`msvcr71.dll`. Nu redenumi/șterge.
- **Manifest XML cu encoding `Windows-1252`** — la editare manuală păstrează
encoding-ul (nu salva ca UTF-8) altfel parser-ul VFP de pe stația
clientului poate ceda.
---
## Referințe
- README VM 201: `../README.md`
- IIS SSL / Let's Encrypt: `vm201-certificat-letsencrypt-iis.md`
- Arhitectură domenii Dokploy: `vm201-dokploy-infrastructure.md`
- Aplicație CONTAFIN AVFP: documentație externă (ActiveVFP framework)
---
**Ultima actualizare:** 2026-04-25
**Autor:** Marius Mutu