This commit is contained in:
374
BACKEND-BUILD-ENVIRONMENT.md
Normal file
374
BACKEND-BUILD-ENVIRONMENT.md
Normal file
@@ -0,0 +1,374 @@
|
||||
# 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 Condition=" '$(SUBSCRIPTION_BUILD)' == 'true' ">$(DefineConstants);SUBSCRIPTION_BUILD</DefineConstants>
|
||||
```
|
||||
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
|
||||
<Content Include=".\resource\*.*">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
```
|
||||
|
||||
### 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` | `<Version>8.2.4</Version>` |
|
||||
| `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 |
|
||||
Reference in New Issue
Block a user