# AyaNova v8 Backend Build Environment Documentation
> **Purpose**: This document captures the complete backend build process for AyaNova v8, including all deployment targets and installers.
## Overview
The backend build produces **6 deployment packages** from **3 projects**:
### Projects
| Project | Framework | Purpose |
|---------|-----------|---------|
| AyaNova (server) | .NET 8.0 | Main ASP.NET Core web server |
| raven-launcher | .NET 8.0 | Windows launcher for standalone mode |
| AyaNovaQBI | .NET Framework 4.8 | QuickBooks Desktop integration (separate build) |
### Deployment Targets
| Target | Description | Output |
|--------|-------------|--------|
| Subscription Linux x64 | Your hosted service (DigitalOcean) | `ayanova-subscription-linux-x64-server.zip` |
| Perpetual Linux Server | Self-hosted Linux server | `ayanova-linux-x64-server.zip` |
| Perpetual Linux Desktop | Single-user Linux desktop | `ayanova-linux-x64-desktop.zip` |
| Windows Standalone | Self-contained single-user (includes .NET runtime + PostgreSQL) | `ayanova-windows-x64-single-setup.exe` |
| Windows LAN | Network server (requires separate .NET + PostgreSQL) | `ayanova-windows-x64-lan-setup.exe` |
| QuickBooks Integration | Windows desktop app | `ayanova-qbi-setup.exe` (separate build) |
---
## Directory Structure
```
c:\data\code\
├── raven\ # Main repository root
│ ├── build-release.bat # Master build script
│ ├── raven.sln # Visual Studio solution
│ ├── server\
│ │ └── AyaNova\ # ASP.NET Core server project
│ │ ├── AyaNova.csproj
│ │ ├── Program.cs
│ │ ├── Startup.cs
│ │ ├── wwwroot\ # Frontend files copied here
│ │ └── resource\ # Report templates, etc.
│ ├── docs\
│ │ └── 8.0\
│ │ ├── ayanova\ # Main documentation (MkDocs)
│ │ │ └── mkdocs.yml
│ │ └── customer\ # Customer portal documentation
│ │ └── mkdocs.yml
│ ├── dist\
│ │ ├── assets\ # Shared assets (license, configs, icons)
│ │ │ ├── LICENSE
│ │ │ ├── license.rtf
│ │ │ ├── linux-desktop\config.json
│ │ │ ├── linux-server\config.json
│ │ │ ├── lan-install-config.json
│ │ │ └── logo.ico
│ │ ├── install\
│ │ │ └── windows\x64\ # Inno Setup scripts
│ │ │ ├── standalone.iss
│ │ │ └── lan.iss
│ │ ├── installers\ # Build output (generated)
│ │ ├── linux-x64\ # Linux build output (generated)
│ │ ├── subscription-build-linux-x64\ # Subscription build output (generated)
│ │ └── win-x64\ # Windows build output (generated)
│ │ ├── ayanova\
│ │ │ ├── standalone\ # Self-contained build
│ │ │ └── framework-dependent\ # Requires .NET installed
│ │ ├── launcher\ # Launcher build output
│ │ └── postgres-standalone\ # Embedded PostgreSQL for standalone
│ └── graphics\ # Icons, logos
│
├── raven-client\ # Frontend (separate repo/folder)
│ └── ayanova\
│
├── raven-launcher\ # Launcher project
│ ├── raven-launcher.csproj
│ └── config.json
│
└── ravenqbi\ # QuickBooks integration (separate)
├── AyaNovaQBI\
│ └── AyaNovaQBI.csproj
└── install\
└── qbi.iss
```
---
## Build Requirements
### Software
| Tool | Version | Purpose |
|------|---------|---------|
| .NET SDK | 8.0.x | Build ASP.NET Core projects |
| Node.js | 12.22.9 | Build frontend (see frontend docs) |
| Python | 3.11.x | Build MkDocs documentation |
| MkDocs | Latest | Documentation generator |
| Inno Setup | 6.x | Windows installer creation |
| 7-Zip | Latest | Create Linux distribution zips |
| Visual Studio 2022 | Latest | Build QBI project (.NET Framework 4.8) |
### Paths (hardcoded in build scripts)
The build scripts expect these exact paths:
- `C:\data\code\raven\` - Main repository
- `C:\data\code\raven-client\ayanova\` - Frontend project
- `C:\data\code\raven-launcher\` - Launcher project
- `C:\data\code\ravenqbi\` - QuickBooks integration
- `C:\Program Files\7-Zip\7z.exe` - 7-Zip
- `C:\Program Files (x86)\Inno Setup 6\ISCC.exe` - Inno Setup compiler
---
## Build Process (build-release.bat)
The master build script executes in this order:
### 1. Clean Output Folders
```batch
rmdir c:\data\code\raven\server\AyaNova\wwwroot /s/q
mkdir c:\data\code\raven\server\AyaNova\wwwroot
rmdir C:\data\code\raven\dist\installers /s/q
mkdir C:\data\code\raven\dist\installers
```
### 2. Build Documentation (MkDocs)
```batch
cd c:\data\code\raven\docs\8.0\ayanova
mkdocs build
cd c:\data\code\raven\docs\8.0\customer
mkdocs build
```
Output goes to `wwwroot/docs` (configured in mkdocs.yml).
### 3. Build Frontend (Vue.js)
```batch
cd c:\data\code\raven-client\ayanova
call npm run build
xcopy dist\* ..\raven\server\AyaNova\wwwroot\ /e
```
### 4. Build Subscription Linux x64
```batch
dotnet publish --property:PublishDir=C:\data\code\raven\dist\subscription-build-linux-x64\ \
-c Release -r linux-x64 --no-self-contained -p:SUBSCRIPTION_BUILD=true
```
Key flag: `-p:SUBSCRIPTION_BUILD=true` sets a compile-time constant for subscription-specific features.
Then packages to zip with config:
```batch
7z a ayanova-subscription-linux-x64-server.zip subscription-build-linux-x64\*
7z a ayanova-subscription-linux-x64-server.zip assets\linux-server\config.json
```
### 5. Build Perpetual Linux x64
```batch
dotnet publish --property:PublishDir=C:\data\code\raven\dist\linux-x64\ \
-c Release -r linux-x64 --no-self-contained -p:SUBSCRIPTION_BUILD=false
```
Creates two packages (same build, different config):
- `ayanova-linux-x64-desktop.zip` (with desktop config)
- `ayanova-linux-x64-server.zip` (with server config)
### 6. Build Windows Standalone (Self-Contained)
```batch
dotnet publish -c Release --property:PublishDir=C:\data\code\raven\dist\win-x64\ayanova\standalone\ \
-r win-x64 --self-contained
```
This includes the .NET runtime in the output (~150MB larger).
### 7. Build Windows Framework-Dependent
```batch
dotnet publish -c Release --property:PublishDir=C:\data\code\raven\dist\win-x64\ayanova\framework-dependent\ \
-r win-x64 --no-self-contained
```
Requires .NET 8 runtime installed on target machine.
### 8. Build Launcher
```batch
cd C:\data\code\raven-launcher\
dotnet publish -c Release --property:PublishDir=C:\data\code\raven\dist\win-x64\launcher\ \
-r win-x64 --self-contained
```
The launcher is always self-contained (uses `PublishTrimmed` to reduce size).
### 9. Create Windows Installers (Inno Setup)
```batch
ISCC.exe standalone.iss
ISCC.exe lan.iss
```
---
## Project-Specific Notes
### AyaNova Server (AyaNova.csproj)
**Conditional Compilation:**
```xml
$(DefineConstants);SUBSCRIPTION_BUILD
```
Use `#if SUBSCRIPTION_BUILD` in code for subscription-only features.
**Key Dependencies:**
- Entity Framework Core 8.0 with Npgsql (PostgreSQL)
- PuppeteerSharp for PDF report generation (downloads Chromium on first run)
- MailKit for email
- JWT authentication
**Resource Files:**
Report templates and other resources are copied to output:
```xml
Always
```
### Launcher (raven-launcher.csproj)
Simple console app that:
1. Starts embedded PostgreSQL (standalone mode only)
2. Starts the AyaNova server
3. Opens default browser to the login page
4. Waits for user to close
Uses `PublishTrimmed` to reduce self-contained size.
### QuickBooks Integration (AyaNovaQBI.csproj)
**Important:** This is a .NET Framework 4.8 Windows Forms application, NOT .NET Core.
- Requires Visual Studio 2022 (not VS Code) for the Windows Forms designer
- References `interop.QBFC14.dll` from QuickBooks SDK (must be installed)
- Targets x86 (32-bit) because QuickBooks SDK is 32-bit only
- Has a pre-build event that runs a timestamp utility
**Why Visual Studio is required:**
The Windows Forms designer only works in Visual Studio. The code could theoretically be edited in VS Code, but the designer is essential for the UI work.
---
## Windows Installer Details
### Standalone (standalone.iss)
Includes:
- Self-contained AyaNova server (with .NET runtime)
- Self-contained launcher
- Embedded PostgreSQL (`postgres-standalone` folder)
- Empty database template
Creates desktop shortcut to launcher. User clicks one icon, everything starts.
**Key paths:**
- App: `{autopf}\ayanova`
- Data: `{commonappdata}\ayanova\database`
- Logs: `{commonappdata}\ayanova\logs`
### LAN (lan.iss)
Includes:
- Framework-dependent AyaNova server (no .NET runtime)
- Config file for network mode
Does NOT include PostgreSQL - user must install separately.
Prompts user to download:
- ASP.NET Core Runtime Hosting Bundle
- PostgreSQL
---
## Embedded PostgreSQL (Windows Standalone)
The standalone installer includes a portable PostgreSQL in `dist\win-x64\postgres-standalone\`.
This is a pre-configured PostgreSQL installation that:
- Runs without system installation
- Stores data in `{commonappdata}\ayanova\database`
- Is started/stopped by the launcher
**Source:** You'll need to maintain this - it's a copy of a PostgreSQL Windows binary distribution with a pre-initialized data directory.
---
## QuickBooks Integration Build (Separate)
The QBI is built separately and not included in the main build script.
```batch
cd c:\data\code\ravenqbi\AyaNovaQBI
msbuild /p:Configuration=Release
cd c:\data\code\ravenqbi\install
"C:\Program Files (x86)\Inno Setup 6\ISCC.exe" qbi.iss
```
Output: `c:\data\code\ravenqbi\install\output\ayanova-qbi-setup.exe`
---
## Version Management
Versions must be updated in multiple places:
| File | Location |
|------|----------|
| `AyaNova.csproj` | `8.2.4` |
| `standalone.iss` | `#define MyAppVersion "8.2.4"` |
| `lan.iss` | `#define MyAppVersion "8.2.4"` |
| `qbi.iss` | `#define MyAppVersion "8.0.2"` |
| `package.json` (frontend) | `"version": "8.2.4"` |
Consider creating a version file or script to update all at once.
---
## Containerization Considerations
### What CAN be containerized (for build):
1. **Frontend build** - Already done (Dockerfile.frontend)
2. **Documentation build** - Already done (Dockerfile.docs)
3. **Linux server builds** - .NET SDK in Docker can cross-compile for Linux
4. **Windows framework-dependent build** - Can be built in Docker
### What CANNOT be easily containerized:
1. **Windows self-contained builds** - Need Windows container or Windows host
2. **Inno Setup installers** - Windows-only tool
3. **QuickBooks Integration** - .NET Framework 4.8, Windows Forms, requires Visual Studio
4. **Embedded PostgreSQL** - Windows-specific binaries
### Recommendation:
For a VPS-based build:
- Use Docker/Linux for: Frontend, Docs, Linux targets
- Keep Windows laptop for: Windows installers, QBI
- Or: Use a Windows VM/GitHub Actions for Windows builds
---
## Troubleshooting
### "PuppeteerSharp failed to download Chromium"
The server downloads Chromium on first run for PDF generation. If this fails:
1. Check internet connectivity
2. Check firewall/proxy settings
3. Pre-download Chrome and set `REPORT_RENDER_BROWSER_PATH` environment variable
### "SUBSCRIPTION_BUILD not defined"
Ensure you're passing the flag correctly:
```batch
dotnet publish ... -p:SUBSCRIPTION_BUILD=true
```
### Inno Setup errors
- Ensure all source paths exist
- Check that previous build steps completed
- Verify 7-Zip and Inno Setup are installed at expected paths
---
## Version History
| Date | Change |
|------|--------|
| 2026-02-01 | Initial documentation created |