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:

  1. The Nextcloud service account details are available (Nextcloud configuration guide)

  2. The Exchange service account or app registration details are available (Exchange configuration guide)

  3. A supported database is available and reachable from the application

Which databases are supported?
  1. The latest version of .NET Runtime 8.0 is installed on your machine (Official .NET 8.0 download page)

  2. For Linux with Exchange On-Premise, ensure libgssapi-krb5-2 is installed (required for Kerberos authentication)

How to install libgssapi-krb5-2?

Use the following command:

sudo apt install libgssapi-krb5-2
  1. 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:

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 Configuration
Service__IsPrimary=true
# Deployment Types: Container(0), Binary(1)
Service__DeploymentType=1
Service__DefaultWorkerName="SendentWorker"
Service__BatchLimit=50
Service__WorkerIntervalSeconds=120
Service__SyncIntervalInSeconds=60
Service__CriticalSyncIntervalInSeconds=100
Service__BatchSaveSize=100
Service__StartWeekend=6
# Synchronization Modes: None(0), Calendars(1), Contacts(2), Tasks(4)
# You can combine modes, just place sum of necessary numbers in this property
Service__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=0
DatabaseConfiguration__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 Configuration
Service__NextcloudConfiguration__NextcloudBaseUrl=https://cloud.example.com/
Service__NextcloudConfiguration__NextcloudServiceUsername=serviceAdmin
Service__NextcloudConfiguration__NextcloudServicePassword=abc
Service__NextcloudConfiguration__SharedSecret="abc"
# Exchange Configuration
# Allowed Exchange Types: Cloud(1), OnPremKerberos(2), OnPremBasicAuth(3), OnPremADFS(4)
Service__ExchangeConfiguration__ExchangeType=1
Service__ExchangeConfiguration__ExchangeOnPremUrl=https://outlook.office365.com/EWS/Exchange.asmx
Service__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 Configuration
Service__ConcurrencyConfiguration__MaxParallelProcessingUsers=10
Service__ConcurrencyConfiguration__MaxUsersPerAdmin=10
Secondary_Replicas_Amount=2
# Full Synchronization Configuration
Service__FullSyncConfiguration__ProcessAttachments=true
# Sensitive Synchronization Configuration
Service__SensitiveSyncConfiguration__SensitiveTitle="Busy"
Service__SensitiveSyncConfiguration__SensitiveCategory="Nextcloud Sync"
# Logging (Serilog & Loki)
# Change global Log level
Serilog__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 property
Service__LoggingConfiguration__LogsOutput=5 # Console + File
Service__LoggingConfiguration__LogDirectoryPath=SendentLogs
# For Binary deployment Limits log's file size in MB
Service__LoggingConfiguration__LogFileSizeLimit=50
# For Binary deployment Limits amount of log files
Service__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:5001
Service__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

Service__IsPrimary

Exactly one instance must be true;
All others must be false

Service__AspNetCoreUrl

Use a different port for each instance

Service__DefaultWorkerName

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

0

Disabled

1

Console

2

Database

4

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


Was this article helpful?