# Configuration

> Configure DS Server with hostsettings.json, appsettings.json, environment variables and web.config: ports, log files, the Admin.db database, plugins and fonts.

- **Product:** DS Server
- **Section:** Documentation
- **Kind:** Topic
- **Path:** DS Server > Installation Guide > Configuration
- **2830 words**
- **Web URL:** https://docs.textcontrol.com/ds-server/installation/configuration/
- **LLMs URL:** https://docs.textcontrol.com/ds-server/installation/configuration/llms.txt
- **LLMs-Full URL:** https://docs.textcontrol.com/ds-server/installation/configuration/llms-full.txt

---

DS Server reads its settings from a few files in its folder, *hostsettings.json*, *appsettings.json* and, in IIS, *web.config*, and it keeps its own state in the admin database *Admin.db*. Security profiles, OAuth and the license are managed in the admin portal instead; see [Administration and Settings](https://docs.textcontrol.com/ds-server/administration/llms-full.txt).

Administrators who install or automate DS Server find here which file holds which setting, how to change the ports and paths with environment variables or command-line arguments, where the logs and the admin database go, and what the other folders of the installation are for.

### Files and Folders

Both builds, Core and Classic, have the same configuration files:

| File or folder | What it holds |
|---|---|
| *hostsettings.json* | The addresses and ports Kestrel listens on |
| *appsettings.json* | Logging, allowed hosts and the file name of the admin database |
| *web.config* | The settings for hosting in IIS |
| *Admin.db* | The admin database, created at the first start |
| *logs/* | The log files, created at the first start |
| *Plugins/* | One subfolder per plugin |
| *Dictionaries/*, *HyphenationLists/*, *SynonymLists/* | The proofing files of the Document Editor |
| *ResourceKit/* | The resource files for translating the texts of the Document Editor |
| *Fonts/* | Core only: the fonts of the Core build |

Edit the files with any text editor and restart DS Server afterward: it reads them at startup.

### Change the Ports

*hostsettings.json* sets the addresses Kestrel, the web server of ASP.NET Core, listens on. The default value serves HTTP on port 5000 and HTTPS on port 5001 on all network interfaces:

```json
{
  "urls": "http://*:5000;https://*:5001"
}
```

Separate several addresses with semicolons. An HTTPS address needs a certificate; see [HTTPS](https://docs.textcontrol.com/ds-server/installation/https/llms-full.txt). You can override the file in two ways:

- **The `--urls` command-line argument.** `dotnet TXTextControl.DocumentServices.dll --urls http://localhost:8080` listens on the given address instead.
- **Kestrel endpoints** in *appsettings.json* or as environment variables, such as `Kestrel__Endpoints__Http__Url=http://*:8080`. When endpoints are defined, DS Server ignores the addresses of *hostsettings.json* and logs the warning "Overriding address(es) 'http://*:5000, https://*:5001'. Binding to endpoints defined via IConfiguration and/or UseKestrel() instead." [HTTPS](https://docs.textcontrol.com/ds-server/installation/https/llms-full.txt) uses endpoints to configure a certificate.

The usual ASP.NET Core environment variables for addresses, `ASPNETCORE_URLS`, `DOTNET_URLS`, `URLS` and `ASPNETCORE_HTTP_PORTS`, have no effect: the addresses of *hostsettings.json* take precedence over them. This is why a container started from `mcr.microsoft.com/dotnet/aspnet:10.0`, whose images set `ASPNETCORE_HTTP_PORTS=8080`, still listens on port 5000.

In IIS, *hostsettings.json* is not used: the bindings of the IIS site set the ports.

### Settings as Environment Variables

DS Server uses the configuration system of ASP.NET Core, so every setting of *appsettings.json* can be set as an environment variable. The name is the path of the setting, with a double underscore `__` between the levels. An environment variable overrides the value in the file:

| Environment variable | Setting in *appsettings.json* |
|---|---|
| `LiteDbOptions__DatabaseFileName=/data/Admin.db` | `LiteDbOptions:DatabaseFileName` |
| `Logging__DSServerFile__Options__FolderPath=/data/logs` | `Logging:DSServerFile:Options:FolderPath` |
| `Logging__LogLevel__Default=Warning` | `Logging:LogLevel:Default` |
| `Kestrel__Endpoints__Https__Certificate__Password=<password>` | `Kestrel:Endpoints:Https:Certificate:Password` |

Environment variables are the usual way to configure containers: pass them with `docker run -e` or `ENV` in a Dockerfile, as [Installing with Official Image from Docker Hub](https://docs.textcontrol.com/ds-server/installation/docker-hub/#keep-the-admin-database) shows. They also keep secrets such as certificate passwords out of the files.

### Logging

The default *appsettings.json* of DS Server 5.0.2:

```json
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information",
      "TXTextControl.DocumentServices": "Information"
    },
    "DSServerFile": {
      "Options": {
        "FolderPath": "./logs",
        "FileName": "log_{dateTime}.log"
      }
    }
  },
  "AllowedHosts": "*",
  "LiteDbOptions": {
    "DatabaseFileName": "Admin.db"
  }
}
```

- **`Logging:LogLevel`** sets the minimum level of the messages per category: `Default` for all others, `Microsoft` for the Microsoft libraries, such as ASP.NET Core, `Microsoft.Hosting.Lifetime` for the start and stop messages and `TXTextControl.DocumentServices` for DS Server itself.
- **`Logging:DSServerFile:Options`** sets the log files. `FolderPath` is the folder, `FileName` the file name, in which `{dateTime}` becomes the date in the form `yyyyMMdd`. DS Server writes one file per day, such as *logs/log\_20260929.log*.
- **`AllowedHosts`** is the list of host names ASP.NET Core accepts in requests. `*` accepts all.
- **`LiteDbOptions:DatabaseFileName`** is the admin database, described [below](#admin-database).

Each line of a log file starts with the time and the level:

```text
[2026-09-29 07:39:56] [Information] Now listening on: http://[::]:5000
[2026-09-29 07:39:56] [Information] Application started. Press Ctrl+C to shut down.
```

The console of DS Server shows only the messages about plugins. The start messages, such as the addresses DS Server listens on, and all later messages go to the log file. Errors during startup are written to the console and the log file.

### Admin Database

*Admin.db* is a LiteDB database. It stores the admin password, the security profiles, the OAuth setting and the access tokens DS Server has issued. While DS Server runs, its journal *Admin-log.db* is next to it.

- **It is created at the first start.** A new *Admin.db* has the default password `admin`, no security profiles, and OAuth disabled.
- **Deleting it resets the server.** If you delete or lose *Admin.db*, DS Server creates a new one at the next start: the admin password is `admin` again, the security profiles are gone and OAuth is disabled. Back up the file together with the installation, and restore it to restore the settings.
- **Its location** is set by `LiteDbOptions:DatabaseFileName`. Use an absolute path to keep the database outside the installation folder, for example on a Docker volume or in a data folder that an upgrade doesn't replace.

### Paths and the Working Directory

DS Server resolves a relative `Logging:DSServerFile:Options:FolderPath`, such as the default `./logs`, against the working directory of the process, not against the DS Server folder. Started in its folder with `dotnet TXTextControl.DocumentServices.dll`, the two are the same. They differ when DS Server is started from another folder, by a systemd unit without `WorkingDirectory` or as a Windows service, whose working directory is *C:\\Windows\\System32*: the *logs* folder is then created there. Set an absolute log folder for these cases, as [Manual Installation](https://docs.textcontrol.com/ds-server/installation/manual/#install-on-windows) shows. *Admin.db* with a relative `LiteDbOptions:DatabaseFileName`, *appsettings.json*, *hostsettings.json*, the *Plugins* folder and certificate files with relative paths are found in the DS Server folder in any case.

### web.config for IIS

When IIS hosts DS Server, it reads *web.config* from the DS Server folder. The file of DS Server 5.0.2 contains:

| Setting | Value | Meaning |
|---|---|---|
| `aspNetCore` `hostingModel` | `InProcess` | IIS runs DS Server in its worker process with the ASP.NET Core Module V2 (`AspNetCoreModuleV2`) |
| `aspNetCore` `processPath`, `arguments` | `dotnet`, `.\TXTextControl.DocumentServices.dll` | The application IIS starts |
| `aspNetCore` `stdoutLogEnabled` | `false` | No stdout log in *.\\logs\\stdout* |
| `aspNetCore` `environmentVariables` | `ASPNETCORE_HTTPS_PORT` `44342`, `COMPLUS_ForceENC` `1` | Environment variables IIS sets for the DS Server process |
| `requestLimits` `maxQueryString` | `8192` | The maximum length of a query string, for the request filtering of IIS |
| `httpRuntime` `maxRequestLength` | `500000000` | A setting of ASP.NET for .NET Framework in `system.web`, which ASP.NET Core doesn't read |
| `httpRuntime` `executionTimeout` | `300` | A setting of ASP.NET for .NET Framework in `system.web`, which ASP.NET Core doesn't read |

The file doesn't set `maxAllowedContentLength` in `requestLimits`, so the request filtering of IIS keeps its default limit of 30,000,000 bytes (about 28.6 MB) for the body of a request. A higher `maxAllowedContentLength` raises this limit of IIS.

The ASP.NET Core Module is installed with the .NET Hosting Bundle; see [Requirements](https://docs.textcontrol.com/ds-server/installation/requirements/#windows-components). Microsoft's [Host ASP.NET Core on Windows with IIS](https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/iis/) documents the settings of the `aspNetCore` element.

### Plugins

A plugin is a .NET assembly that adds endpoints and services to DS Server. Each plugin goes into its own subfolder of *Plugins*, with at least one *.dll* that implements the `IPlugin` interface of `TXTextControl.DocumentServices.Plugin.Abstractions` and the assemblies it depends on:

```text
Plugins/
    MyFirstPlugin/
        MyFirstPlugin.dll
    InvoicePlugin/
        InvoicePlugin.dll
    README.md
```

DS Server loads the plugins at startup, so restart it after you add or update one. The console shows the plugins it loads, and the **Plugins** page of the admin portal lists them. See [Plugins](https://docs.textcontrol.com/ds-server/plugins/llms-full.txt).

### Proofing Files

The Document Editor checks spelling, hyphenates and suggests synonyms with the files of three folders, all for English (United States):

| Folder | Files |
|---|---|
| *Dictionaries* | *en\_US.aff* and *en\_US.dic*, a Hunspell dictionary derived from SCOWL, with its *README\_en\_US.txt* |
| *HyphenationLists* | *hyph\_en\_US.dic* |
| *SynonymLists* | *th\_en\_US\_v2.dat* and *th\_en\_US\_v2.idx* |

### Resource Kit

The *ResourceKit* folder contains the texts of the Document Editor and the engine as *.resx* files, *TextControl.resx*, *DocumentServer.resx*, *TXBarcode.resx*, *TXDrawing.resx*, *TXSpell.resx* and *TXTextControl.Web.Server.Process.resx*, together with the batch file *buildres.bat* and the key file *txtextcontrol.public.snk*. After you translate the *.resx* files, *buildres.bat* builds satellite assemblies for the language tag you pass, for example `buildres fr` for French, from all of them except *TXSpell.resx*. It uses the tools `resgen`, `al` and `sn`. The German resources ship with DS Server in the *de* folder.

### Fonts

The Core build contains a *Fonts* folder with 99 font files, among them Liberation Sans, Liberation Serif and Liberation Mono, Lato, Merriweather, Montserrat and Noto Sans with variants for Japanese, Korean, Simplified Chinese and Traditional Chinese. *Fonts/licenses.txt* states that they are licensed under the SIL Open Font License, Version 1.1. The Core build uses the Core engine of TX Text Control, which reads its fonts from this folder; [Fonts](https://docs.textcontrol.com/tx-text-control-dotnet-server/deployment/docker/fonts/llms-full.txt) in the TX Text Control .NET Server documentation describes how the engine finds fonts.

The Classic build has no *Fonts* folder. It uses the fonts installed in Windows.

### Next Steps

- [HTTPS](https://docs.textcontrol.com/ds-server/installation/https/llms-full.txt): configure a certificate for Kestrel.
- [Upgrading](https://docs.textcontrol.com/ds-server/installation/upgrading/llms-full.txt): keep the configuration and the admin database when you update.
- [Plugins](https://docs.textcontrol.com/ds-server/plugins/llms-full.txt): extend DS Server with your own endpoints.
- [Architecture](https://docs.textcontrol.com/ds-server/overview/architecture/llms-full.txt): how the files relate to the server and its worker processes.

---

## Nearby

- **Previous:** [Multiple Servers With Load Balancing](https://docs.textcontrol.com/ds-server/installation/load-balancing/llms-full.txt)
- **Next:** [HTTPS](https://docs.textcontrol.com/ds-server/installation/https/llms-full.txt)
