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>
296 lines
11 KiB
Markdown
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
|