# 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/.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//-x.y.z.ZIP`, dezarhivează și înlocuiește binarele locale. ### Structura `D:\ROAUPDATE` | Element | Conținut | |---------|----------| | `.xml` | Manifest update per client (vezi mai jos) | | `ROASTART_.xml` | Manifest pentru bootstrap-ul `ROASTART` (COMUNROA, ROAPRINT, USERREPORTS) | | `_ARHIVE//` | 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) | | `/` | 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 ROACONT 2.11.49 \_ARHIVE\ROACONT\ROACONT-2.11.49.ZIP ``` `` — 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_.xml` și include: `COMUNROA`, `ROAPRINT`, `_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\\`. 2. Generează ZIP în `_ARHIVE\\-x.y.z.ZIP`. 3. Rulează `xmlupdatecreator.exe` pentru regenerarea manifestului `.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 ``` ### `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\\-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