Install from Binaries (.NET 8.0)
This guide explains how to install and deploy the Nextcloud Exchange Connector application using Binary files.
Pre-requirements
Before deploying the application, make sure the following dependencies already exist and are reachable by the connector:
The Nextcloud service account details are available (Nextcloud configuration guide)
The Exchange service account or app registration details are available (Exchange configuration guide)
A supported database is available and reachable from the application
Which databases are supported?
PostgreSQL (PostgreSQL official installation guide)
Microsoft SQL Server (Microsoft SQL Server official installation guide)
MariaDB (MariaDB official installation guide)
The latest version of .NET Runtime 8.0 is installed on your machine (Official .NET 8.0 download page)
For Linux with Exchange On-Premise, ensure
libgssapi-krb5-2is installed (required for Kerberos authentication)
How to install libgssapi-krb5-2?
Use the following command:
sudo apt install libgssapi-krb5-2
The ZIP file with the Nextcloud Exchange Connector is downloaded
Note:
Contact Sendent support for the ZIP file, as this article does not provide a download link.
Hosting options
There are two supported hosting options.
Hosting via IIS (Windows)
Download and install the IIS ASP.NET Core Module (direct download link) if you want to host the application using Internet Information Services.
Running as a standalone application (Linux or Windows)
Use this option to run the application directly without IIS.
Which hosting option should I choose?
Use standalone mode for simpler setups and Linux environments.
Use IIS when you need centralized web server management on Windows.
Installation Guide
Step 1. Verify .NET installation
Run the following command to check if .NET 8 is installed:
dotnet --version
The output should show a version starting with 8.0.
Note:
If .NET 8 is not installed, download it from the official website.
Step 2. Extract the application files
Extract the ZIP archive to a dedicated folder, for example:
/usr/sendent-sync/worker-X/*
Replace worker-X with a unique identifier for each instance.
Single instance:
/usr/sendent-sync/worker-1/*
Multiple instances:
/usr/sendent-sync/worker-1//usr/sendent-sync/worker-2/
Note:
Use a separate folder for each instance
The number of workers depends on your scaling needs
Step 3. Prepare the settings.env file
Store settings.env in
At a minimum, provide valid values for:
Service Configuration
Database Configuration
Nextcloud Configuration
Exchange Configuration
Exchange Administrator Credentials
We provide an example of settings.env file that you can edit to match your specifications.
To understand the meaning of each parameter in settings.env refer to the Configuration guide.
# Service ConfigurationService__IsPrimary=true# Deployment Types: Container(0), Binary(1)Service__DeploymentType=1Service__DefaultWorkerName="SendentWorker"Service__BatchLimit=50Service__WorkerIntervalSeconds=120Service__SyncIntervalInSeconds=60Service__CriticalSyncIntervalInSeconds=100Service__BatchSaveSize=100Service__StartWeekend=6# Synchronization Modes: None(0), Calendars(1), Contacts(2), Tasks(4)# You can combine modes, just place sum of necessary numbers in this propertyService__SyncMode=1# Synchronization Types: Full(0), Sensitive(1)Service__SyncType=1# Database Configuration# Allowed Database types: Postgres(0), SqlServer(1), MariaDB(2), MySql(3)DatabaseConfiguration__DatabaseType=0DatabaseConfiguration__DatabaseEncryptionKey=YourSuperSecretKey123!DatabaseConfiguration__ConnectionString=Host=postgres_db;Port=5432;Database=SendentDB;Username=postgres;Password=YourPassword123# Postgres Example:Host=localhost;Port=5432;Database=SendentDB;Username=postgres;Password=YourPassword123# Postgres Example:Host=postgres_db;Port=5432;Database=SendentDB;Username=postgres;Password=YourPassword123# SqlServer Example: Server=localhost;Database=SendentDB;UserId=sa;Password=YourStrong!Pass123;Encrypt=False;# SqlServer Example: Server=mssql_db;Database=SendentDB;UserId=sa;Password=YourStrong!Pass123;Encrypt=False;# MariaDB Example:Server=localhost;Port=3306;Database=SendentDB;Uid=root;Pwd=YourPassword123# MariaDB Example:Server=maria_db;Port=3306;Database=SendentDB;Uid=root;Pwd=YourPassword123# MySql Example:Server=localhost;Port=3306;Database=SendentDB;Uid=root;Pwd=YourPassword123# MySql Example:Server=mysql_db;Port=3306;Database=SendentDB;Uid=root;Pwd=YourPassword123# Nextcloud ConfigurationService__NextcloudConfiguration__NextcloudBaseUrl=https://cloud.example.com/Service__NextcloudConfiguration__NextcloudServiceUsername=serviceAdminService__NextcloudConfiguration__NextcloudServicePassword=abcService__NextcloudConfiguration__SharedSecret="abc"# Exchange Configuration# Allowed Exchange Types: Cloud(1), OnPremKerberos(2), OnPremBasicAuth(3), OnPremADFS(4)Service__ExchangeConfiguration__ExchangeType=1Service__ExchangeConfiguration__ExchangeOnPremUrl=https://outlook.office365.com/EWS/Exchange.asmxService__ExchangeConfiguration__ExchangeOnPremDomain=domain_test# Fill in your administrator's credentials in the property below using necessary template for filling in# Cloud: "[{\"AppId\":\"AppId1\", \"ClientSecret\":\"Secret1\"},{\"AppId\":\"AppId1\",\"ClientSecret\":\"Secret1\"}]"# OnPrem(Kerberos/BasicAuth): "[{\"User\":\"Admin1\", \"Pass\":\"Password1\"}, {\"User\":\"Admin2\", \"Pass\":\"Password2\"}]"# OnPremADFS: "[{\"ClientId\":\"ClientId1\", \"ClientSecret\":\"Secret1\" }, {\"ClientId\":\"ClientId2\", \"ClientSecret\":\"Secret2\"}]"# Service__ExchangeConfiguration__ExchangeAdminRaw="[{\"AppId\":\"example \", \"ClientSecret\":\"example2\"}]"# Service__ExchangeConfiguration__ExchangeAdminFile=Service__ExchangeConfiguration__ExchangeAdminRaw=Service__ExchangeConfiguration__ExchangeAdminFile=customAdmins.json# Concurrency ConfigurationService__ConcurrencyConfiguration__MaxParallelProcessingUsers=10Service__ConcurrencyConfiguration__MaxUsersPerAdmin=10Secondary_Replicas_Amount=2# Full Synchronization ConfigurationService__FullSyncConfiguration__ProcessAttachments=true# Sensitive Synchronization ConfigurationService__SensitiveSyncConfiguration__SensitiveTitle="Busy"Service__SensitiveSyncConfiguration__SensitiveCategory="Nextcloud Sync"# Logging (Serilog & Loki)# Change global Log levelSerilog__MinimumLevel__Default=Debug# Change Logs output: None(0), Console(1), Database(2), File(4), Grafana(8)# You can combine outputs, just place sum of necessary numbers in this propertyService__LoggingConfiguration__LogsOutput=5 # Console + FileService__LoggingConfiguration__LogDirectoryPath=SendentLogs# For Binary deployment Limits log's file size in MBService__LoggingConfiguration__LogFileSizeLimit=50# For Binary deployment Limits amount of log filesService__LoggingConfiguration__LogFileAmountLimit=20
Step 4. Configure binary-specific instance values
For a single instance
Set the following values in settings.env:
Service__AspNetCoreUrl=http://localhost:5001Service__DefaultWorkerName=SendentWorker-1
For multiple instances
Each instance must have their own settings.env file with the unique values for the following settings:
Property | Requirement |
|---|---|
| Exactly one instance must be |
| Use a different port for each instance |
| Must be unique per instance |
All other settings must be identical across instances, including:
Database configuration
Nextcloud configuration
Exchange configuration
Note:
For large-scale deployments, consider using multiple Exchange service accounts
The structure of Exchange credentials depends on the selected authentication type
Multiple accounts can improve parallel processing capacity
Step 5 (optional). Prepare the admins.json file
Place the admin.json inside the local ./exchangeAdmins directory.
The credential payload format depends on the configured Exchange authentication type.
You can find more information regarding the admins.json file in the Exchange Setup Guide.
[ { "ExchangeType": 1, // 1 = M365 "AppId": "your-app-id-1", "ClientSecret": "your-client-secret-1" }, { "ExchangeType": 2, // 2 = Kerberos "Username": "serviceaccount", "Password": "your-password" }, { "ExchangeType": 4, // 4 = ADFS "ClientId": "your-client-id-1", "ClientSecret": "your-client-secret-1" }]
Step 6. Start the application
Run the following command in each instance directory:
dotnet Sendent.Synchronisation.Service.dll
Post-deployment verification
After deployment, verify the following:
the service process or container is running
no critical startup errors are present in the logs
the database connection is successful
Configure Logging
Use the Service__LoggingConfiguration__LogsOutput setting to control where logs are written.
This setting supports multiple outputs at the same time by combining values.
Available outputs
Value | Output |
|---|---|
| Disabled |
| Console |
| Database |
| File system (recommended for binary deployment) |
Examples
File system only:
Service__LoggingConfiguration__LogsOutput=4
Console + file system:
Service__LoggingConfiguration__LogsOutput=5
5 = 1 (Console) + 4 (File system)
File system logging
If file system logging is enabled, logs are stored in the logs folder located next to the application (.dll) and settings.env.
You can configure log rotation using the following settings:
Log file size limit
Service__LoggingConfiguration__LogFileSizeLimit=100
Maximum size of a single log file (in MB)
A new file is created when the limit is reached
Log file retention
Service__LoggingConfiguration__LogFileAmountLimit=100
Maximum number of log files per instance
Old files are automatically removed when the limit is exceeded