BEXO ERP — Administrator Guide
For IT Staff, Database Administrators, and System Managers
System Architecture
Components
1. WPF Client (Windows)
- Location: C:\Release\BEXO\BEXO.UI.exe
- .NET Framework: .NET 8
- Requirements: Windows 10+ or Windows Server 2016+
2. API Server (ASP.NET Core)
- Location: C:\Release\BEXO\BEXO.API.dll
- Service Name: BEXO_API_Prod
- Port: 5443 (HTTPS)
- Status: Windows Service or Scheduled Task
3. Database (SQL Server)
- Database Name: BEXO_ERP
- Tables: 98
- Size: ~500 MB typical (depends on data volume)
Service Management
Check Service Status
# View all BEXO services
Get-Service -Name "*BEXO*"
# Check specific service
Get-Service BEXO_API_Prod | Select Name, Status, StartType
# Check scheduled tasks
Get-ScheduledTask -TaskName "*BEXO*"
Restart API Service
# Recommended: Use script on server
C:\Tools\scripts\restart_api.ps1
# Manual restart
Stop-Service BEXO_API_Prod -Force
Start-Sleep -Seconds 10
Start-Service BEXO_API_Prod
Start-Sleep -Seconds 30
# Verify running
Get-Service BEXO_API_Prod
Invoke-RestMethod -Uri "https://localhost:5443/api/health" -SkipCertificateCheck
Scheduled Tasks
BEXO_DB_Backup (Daily 02:00 AM)
# View task
Get-ScheduledTask -TaskName "BEXO_DB_Backup" | Select *
# Trigger manually
Start-ScheduledTask -TaskName "BEXO_DB_Backup"
# View history
Get-ScheduledTaskInfo -TaskName "BEXO_DB_Backup"
BEXO_Health_Watchdog (Every 5 minutes)
# View task
Get-ScheduledTask -TaskName "BEXO_Health_Watchdog"
# View alert log
Get-Content C:\Tools\logs\bexo_alerts.log -Tail 50
Database Administration
Connection String
Server=.\BEXO_ERP;
Database=BEXO_ERP;
Integrated Security=true;
TrustServerCertificate=true
Common DBA Tasks
Check Database Size
-- Size of BEXO_ERP database
SELECT
DB_NAME() AS DatabaseName,
CONVERT(DECIMAL(10,2), SUM(size)/128.0) AS TotalSizeMB
FROM sys.database_files
WHERE database_id = DB_ID('BEXO_ERP')
GROUP BY database_id
Backup Database
-- Manual full backup
BACKUP DATABASE BEXO_ERP
TO DISK = 'C:\Backups\BEXO_SQL\BEXO_ERP_manual.bak'
WITH FORMAT, INIT, COPY_ONLY, STATS=10
Restore Database
-- Restore from backup
RESTORE DATABASE BEXO_ERP
FROM DISK = 'C:\Backups\BEXO_SQL\BEXO_ERP_2026-05-30_02-00.bak'
WITH REPLACE, RECOVERY
Verify Database Integrity
-- Check for logical errors
DBCC CHECKDB (BEXO_ERP, REPAIR_FAST)
View Table Row Counts
SELECT
OBJECT_NAME(i.object_id) AS TableName,
SUM(s.row_count) AS RowCount
FROM sys.indexes AS i
INNER JOIN sys.dm_db_partition_stats AS s
ON i.object_id = s.object_id
AND i.index_id = s.index_id
WHERE database_id = DB_ID('BEXO_ERP')
AND i.index_id <= 1
GROUP BY i.object_id
ORDER BY SUM(s.row_count) DESC
User Management
User Roles
| Role | Level | Permissions |
|---|---|---|
| SuperAdmin | 5 | All access + user management |
| Admin | 4 | All operations within company |
| Manager | 3 | Department operations |
| User | 2 | Standard create/read |
| Design | 1 | Read-only (QA/Testing) |
Create New User (SQL Direct)
-- Create user
INSERT INTO Users (Username, PasswordHash, FullName, Email, Role, IsActive, CreatedDate)
VALUES (
'newuser',
'hashed_password_here',
'John Doe',
'[email protected]',
2, -- Role: User (2=User, 3=Manager, 4=Admin)
1, -- Active
GETDATE()
)
-- Assign to company
INSERT INTO UserCompanyAccess (UserId, CompanyId, IsActive)
SELECT u.Id, c.Id, 1
FROM Users u
CROSS JOIN Companies c
WHERE u.Username = 'newuser'
AND c.Name = 'Main Company'
Reset User Password
-- Generate new password hash (use bcrypt or PBKDF2)
-- Then update:
UPDATE Users
SET PasswordHash = 'new_hashed_password'
WHERE Username = 'username'
Performance Tuning
API Performance Monitoring
# Check API process CPU/Memory
Get-Process -Name "BEXO*" | Select Name, CPU, WorkingSet -Verbose
# View IIS/API logs
Get-Content "C:\Windows\Logs\BEXO_API.log" -Tail 100
Database Performance
-- Find slow queries
SELECT
creation_time,
last_execution_time,
execution_count,
total_elapsed_time / 1000000 AS TotalElapsedSec,
total_elapsed_time / execution_count / 1000 AS AvgElapsedMS,
text
FROM sys.dm_exec_query_stats qs
INNER JOIN sys.dm_exec_sql_text(qs.sql_handle) st
ON qs.sql_handle = st.sql_handle
ORDER BY qs.total_elapsed_time DESC
Cache Statistics
-- SQL Server buffer pool
SELECT
COUNT(*) * 8 / 1024 AS BufferPoolMB,
(SELECT SUM(size) FROM sys.database_files
WHERE type_desc = 'ROWS') / 128 AS TotalDataMB
Security
Network Security
Firewall Rules:
# Allow LAN access to port 5443
New-NetFirewallRule -DisplayName "BEXO API - LAN" `
-Direction Inbound `
-LocalPort 5443 `
-Protocol TCP `
-RemoteAddress 192.168.0.0/16 `
-Action Allow
SSL Certificate Management
# View current certificate
Get-ChildItem -Path Cert:\LocalMachine\My | Where {$_.FriendlyName -like "*BEXO*"}
# Install new certificate
Import-PfxCertificate -FilePath C:\certs\bexo.pfx -CertStoreLocation Cert:\LocalMachine\My
# Update Kestrel config (needs code change)
# Edit Program.cs: ConfigureKestrel() with new cert thumbprint
SQL Server Security
-- Create SQL user for API
CREATE LOGIN [BEXO_API] WITH PASSWORD = 'strong_password'
-- Create database user
CREATE USER [BEXO_API] FOR LOGIN [BEXO_API]
-- Grant permissions
ALTER ROLE db_owner ADD MEMBER [BEXO_API]
Disaster Recovery
Backup Locations
Local: C:\Backups\BEXO_SQL\
NAS Mirror: \\nas.company.local\BEXO_Deploy\db_backups\
Full Recovery Procedure
If database corrupted:
# 1. Stop all services
Stop-Service BEXO_API_Prod
# 2. Find latest good backup
$backups = Get-ChildItem C:\Backups\BEXO_SQL\ | Sort LastWriteTime -Descending
$backups | Select FullName, LastWriteTime | Head -5
# 3. Restore
$backupFile = $backups[0].FullName
sqlcmd -S . -Q "RESTORE DATABASE BEXO_ERP FROM DISK = '$backupFile' WITH REPLACE, RECOVERY"
# 4. Restart service
Start-Service BEXO_API_Prod
# 5. Verify
Invoke-RestMethod -Uri https://localhost:5443/api/health -SkipCertificateCheck
Backup Verification
-- Verify backup integrity
RESTORE VERIFYONLY
FROM DISK = 'C:\Backups\BEXO_SQL\BEXO_ERP_2026-05-30_02-00.bak'
-- Restore to test database (off-hours only)
RESTORE DATABASE BEXO_ERP_TEST
FROM DISK = 'C:\Backups\BEXO_SQL\BEXO_ERP_latest.bak'
WITH MOVE 'BEXO_ERP' TO 'C:\Data\BEXO_ERP_TEST.mdf',
MOVE 'BEXO_ERP_log' TO 'C:\Logs\BEXO_ERP_TEST.ldf'
Upgrade & Patch Management
API Version Check
# Current version from executable
(Get-Item C:\Release\BEXO\BEXO.API.dll).VersionInfo.ProductVersion
# From API endpoint
Invoke-RestMethod -Uri https://localhost:5443/api/version -SkipCertificateCheck
Deployment Steps
# 1. Backup current release
Copy-Item -Path "C:\Release\BEXO" -Destination "C:\Release\BEXO_backup_$(Get-Date -Format 'yyyyMMdd')" -Recurse
# 2. Stop API
Stop-Service BEXO_API_Prod
# 3. Copy new binaries
Copy-Item -Path "\\nas\releases\BEXO_v2.1.0\*" -Destination "C:\Release\BEXO\" -Recurse -Force
# 4. Update appsettings if needed
# (Verify connection strings, JWT key, cert path)
# 5. Start API
Start-Service BEXO_API_Prod
# 6. Monitor for errors
Start-Sleep 30
Get-Content C:\Tools\logs\bexo_alerts.log -Tail 20
Logging & Monitoring
Application Logs
API Logs: C:\Tools\logs\BEXO_API.log
Alert Log: C:\Tools\logs\bexo_alerts.log
Event Viewer: Windows Logs → Application (Source: BEXO)
View Recent Errors
# Last 50 entries
Get-Content C:\Tools\logs\BEXO_API.log -Tail 50
# Filter by date
Get-Content C:\Tools\logs\BEXO_API.log | Select-String "ERROR"
# Real-time monitoring
Get-Content C:\Tools\logs\BEXO_API.log -Tail 20 -Wait
Troubleshooting Guide
API Won't Start
# Check logs
Get-Content C:\Tools\logs\bexo_alerts.log -Tail 20
# Verify port not in use
Get-NetTCPConnection -LocalPort 5443
# Verify certificate exists
Get-ChildItem -Path Cert:\LocalMachine\My
# Restart with debug
$svc = Get-Service BEXO_API_Prod
Stop-Service $svc -Force
Start-Sleep 15
Start-Service $svc
Database Connection Failed
-- Check database exists
SELECT name FROM sys.databases WHERE name = 'BEXO_ERP'
-- Check login
SELECT name FROM sys.sql_logins WHERE name = 'BEXO_API'
-- Check user permissions
EXEC sp_helpuser 'BEXO_API'
Users Can't Login
-- Check user exists
SELECT * FROM Users WHERE Username = 'marketing2'
-- Check user active
SELECT Username, IsActive, Role FROM Users WHERE IsActive = 1
-- Check user has company access
SELECT u.Username, c.Name, uca.IsActive
FROM Users u
INNER JOIN UserCompanyAccess uca ON u.Id = uca.UserId
INNER JOIN Companies c ON uca.CompanyId = c.Id
WHERE u.Username = 'marketing2'
Maintenance Schedule
DAILY:
02:00 AM - Automated backup (BEXO_DB_Backup task)
Every 5 min - Health check & auto-restart (BEXO_Health_Watchdog)
WEEKLY:
Monday 23:00 - Verify backup integrity
MONTHLY:
Last Friday - Review logs for errors
- Verify backup retention (7-day rolling)
- Check database growth rate
- Review user access (inactive accounts)
QUARTERLY:
- Security audit (SSL cert expiration, user permissions)
- Database maintenance (DBCC CHECKDB)
- Disaster recovery drill
Contact & Support
System Owner: Application Management Team
DBA On-Call: Ext. 2100 (24/7)
Network On-Call: Ext. 2200 (24/7)
Last Updated: 2026-05-30
Version: 1.0
