Update README.md
Some checks are pending
BlockStorage/repertory/pipeline/head Build queued...

This commit is contained in:
Scott E. Graves 2025-02-23 18:20:52 -06:00
parent 9c648583fb
commit 191eb1620b

916
README.md
View File

@ -1,458 +1,458 @@
# Repertory # Repertory
Repertory allows you to mount S3 and Sia via FUSE on Linux or via WinFSP Repertory allows you to mount S3 and Sia via FUSE on Linux or via WinFSP
on Windows. on Windows.
## Contents ## Contents
1. [Details and Features](#details-and-features) 1. [Details and Features](#details-and-features)
2. [Minimum Requirements](#minimum-requirements) 2. [Minimum Requirements](#minimum-requirements)
1. [Supported Operating Systems](#supported-operating-systems) 1. [Supported Operating Systems](#supported-operating-systems)
3. [Usage](#usage) 3. [Usage](#usage)
1. [Important Options](#important-options) 1. [Important Options](#important-options)
2. [Sia](#sia) 2. [Sia](#sia)
* [Sia Initial Configuration](#sia-initial-configuration) * [Sia Initial Configuration](#sia-initial-configuration)
* [Sia Mounting](#sia-mounting) * [Sia Mounting](#sia-mounting)
* [Sia Configuration File](#sia-configuration-file) * [Sia Configuration File](#sia-configuration-file)
3. [S3](#s3) 3. [S3](#s3)
* [S3 Initial Configuration](#s3-initial-configuration) * [S3 Initial Configuration](#s3-initial-configuration)
* [S3 Mounting](#s3-mounting) * [S3 Mounting](#s3-mounting)
* [S3 Configuration File](#s3-configuration-file) * [S3 Configuration File](#s3-configuration-file)
4. [Data Directories](#data-directories) 4. [Data Directories](#data-directories)
1. [Linux Directories](#linux-directories) 1. [Linux Directories](#linux-directories)
2. [Windows Directories](#windows-directories) 2. [Windows Directories](#windows-directories)
5. [Remote Mounting](#remote-mounting) 5. [Remote Mounting](#remote-mounting)
1. [Server Setup](#server-setup) 1. [Server Setup](#server-setup)
* [Remote Mount Configuration File Section](#remote-mount-configuration-file-section) * [Remote Mount Configuration File Section](#remote-mount-configuration-file-section)
2. [Client Setup](#client-setup) 2. [Client Setup](#client-setup)
* [Client Remote Mounting](#client-remote-mounting) * [Client Remote Mounting](#client-remote-mounting)
* [Remote Mount Configuration File](#remote-mount-configuration-file) * [Remote Mount Configuration File](#remote-mount-configuration-file)
6. [Compiling](#compiling) 6. [Compiling](#compiling)
1. [Linux Compilation](#linux-compilation) 1. [Linux Compilation](#linux-compilation)
2. [Windows Setup](#windows-compilation) 2. [Windows Setup](#windows-compilation)
7. [Credits](#credits) 7. [Credits](#credits)
8. [Developer Public Key](#developer-public-key) 8. [Developer Public Key](#developer-public-key)
9. [Consult the Wiki for more detailed information](wiki/) 9. [Consult the Wiki for more detailed information](wiki/Home)
## Details and Features ## Details and Features
* Optimized for [Plex Media Server](https://www.plex.tv/) * Optimized for [Plex Media Server](https://www.plex.tv/)
* Remote mounting of `repertory` instances on Linux and Windows * Remote mounting of `repertory` instances on Linux and Windows
* Securely share your mounts over TCP/IP via `XChaCha20-Poly1305` with other systems on your network or over the internet. * Securely share your mounts over TCP/IP via `XChaCha20-Poly1305` with other systems on your network or over the internet.
* Cross-platform support (Linux 64-bit, Linux arm64/aarch64, Windows 64-bit) * Cross-platform support (Linux 64-bit, Linux arm64/aarch64, Windows 64-bit)
* Optionally encrypt file names and file data via `XChaCha20-Poly1305` in S3 mounts * Optionally encrypt file names and file data via `XChaCha20-Poly1305` in S3 mounts
## Minimum Requirements ## Minimum Requirements
* [Sia renterd](https://github.com/SiaFoundation/renterd/releases) v2.0.0+ for Sia support * [Sia renterd](https://github.com/SiaFoundation/renterd/releases) v2.0.0+ for Sia support
* Linux requires `fusermount3`; otherwise, `repertory` must be manually compiled with `libfuse2` support * Linux requires `fusermount3`; otherwise, `repertory` must be manually compiled with `libfuse2` support
* Windows requires the following dependencies to be installed: * Windows requires the following dependencies to be installed:
* [WinFSP 2023](https://github.com/winfsp/winfsp/releases/download/v2.0/winfsp-2.0.23075.msi) * [WinFSP 2023](https://github.com/winfsp/winfsp/releases/download/v2.0/winfsp-2.0.23075.msi)
### Supported Operating Systems ### Supported Operating Systems
Only 64-bit operating systems are supported Only 64-bit operating systems are supported
* Linux `arm64/aarch64` * Linux `arm64/aarch64`
* Linux `amd64` * Linux `amd64`
* Windows 64-bit 10, 11 * Windows 64-bit 10, 11
## Usage ## Usage
### Important Options ### Important Options
* `--help` * `--help`
* Display all mount utility options * Display all mount utility options
* `-f` * `-f`
* Keep process in foreground on Linux. * Keep process in foreground on Linux.
* `--name, -na [name]` * `--name, -na [name]`
* Identifies a unique configuration name to support multiple mounts. * Identifies a unique configuration name to support multiple mounts.
* The `--name` option can be set to any valid value allowed as a file name for your filesystem. * The `--name` option can be set to any valid value allowed as a file name for your filesystem.
* For Sia, the bucket name will be set to the same value if it is empty in the configuration file. * For Sia, the bucket name will be set to the same value if it is empty in the configuration file.
* If the `--name` option is not specified, `default` will be used. * If the `--name` option is not specified, `default` will be used.
* For S3, the `--name` option is required and does not affect the bucket name. * For S3, the `--name` option is required and does not affect the bucket name.
* `-dc` * `-dc`
* Display mount configuration * Display mount configuration
* For Sia, `--name` is optional * For Sia, `--name` is optional
* For S3, the `-s3` option is required along with `--name` * For S3, the `-s3` option is required along with `--name`
### Sia ### Sia
#### Sia Initial Configuration #### Sia Initial Configuration
* Required steps: * Required steps:
* Set the appropriate bucket name and `renterd` API password in `repertory` configuration: * Set the appropriate bucket name and `renterd` API password in `repertory` configuration:
* To use `default` as the bucket name and configuration name, you only need to set the `renterd` API password: * To use `default` as the bucket name and configuration name, you only need to set the `renterd` API password:
* `repertory -set HostConfig.ApiPassword '<my password>'` * `repertory -set HostConfig.ApiPassword '<my password>'`
* To specify a different bucket name while using `default` as the configuration name: * To specify a different bucket name while using `default` as the configuration name:
* `repertory -set HostConfig.ApiPassword '<my password>'` * `repertory -set HostConfig.ApiPassword '<my password>'`
* `repertory -set SiaConfig.Bucket '<my bucket>'` * `repertory -set SiaConfig.Bucket '<my bucket>'`
* For all other configurations: * For all other configurations:
* `repertory --name '<my config name>' -set HostConfig.ApiPassword '<my password>'` * `repertory --name '<my config name>' -set HostConfig.ApiPassword '<my password>'`
* `repertory --name '<my config name>' -set SiaConfig.Bucket '<my bucket name>'` * `repertory --name '<my config name>' -set SiaConfig.Bucket '<my bucket name>'`
* Optional steps: * Optional steps:
* Set a user name used during `renterd` basic authentication: * Set a user name used during `renterd` basic authentication:
* `repertory -set HostConfig.ApiUser '<my user>'` * `repertory -set HostConfig.ApiUser '<my user>'`
* `repertory --name '<my config name>' -set HostConfig.ApiUser '<my user>'` * `repertory --name '<my config name>' -set HostConfig.ApiUser '<my user>'`
* Set a custom agent string (default `Sia-Agent`): * Set a custom agent string (default `Sia-Agent`):
* `repertory -set HostConfig.AgentString '<my agent>'` * `repertory -set HostConfig.AgentString '<my agent>'`
* `repertory --name '<my config name>' -set HostConfig.AgentString '<my agent>'` * `repertory --name '<my config name>' -set HostConfig.AgentString '<my agent>'`
* Set the host name or IP of the `renterd` instance (default `localhost`): * Set the host name or IP of the `renterd` instance (default `localhost`):
* `repertory -set HostConfig.HostNameOrIp '<my host name>'` * `repertory -set HostConfig.HostNameOrIp '<my host name>'`
* `repertory --name '<my config name>' -set HostConfig.HostNameOrIp '<my host name>'` * `repertory --name '<my config name>' -set HostConfig.HostNameOrIp '<my host name>'`
* Set the `renterd` API port (default `9980`): * Set the `renterd` API port (default `9980`):
* `repertory -set HostConfig.ApiPort 9981` * `repertory -set HostConfig.ApiPort 9981`
* `repertory --name '<my config name>' -set HostConfig.ApiPort 9981` * `repertory --name '<my config name>' -set HostConfig.ApiPort 9981`
* To verify/view all configuration options: * To verify/view all configuration options:
* `repertory -dc` * `repertory -dc`
* `repertory --name '<my config name>' -dc` * `repertory --name '<my config name>' -dc`
* Example: * Example:
* `repertory --name default -dc` * `repertory --name default -dc`
#### Sia Mounting #### Sia Mounting
* Linux: * Linux:
* `repertory /mnt/location` * `repertory /mnt/location`
* `repertory --name '<my config name>' /mnt/location` * `repertory --name '<my config name>' /mnt/location`
* Example: * Example:
* `repertory --name default /mnt/location` * `repertory --name default /mnt/location`
* Windows: * Windows:
* `repertory t:` * `repertory t:`
* `repertory --name '<my config name>' t:` * `repertory --name '<my config name>' t:`
* Example: * Example:
* `repertory --name default t:` * `repertory --name default t:`
#### Sia Configuration File #### Sia Configuration File
```json ```json
{ {
"ApiAuth": "<random generated rpc password>", "ApiAuth": "<random generated rpc password>",
"ApiPort": 10000, "ApiPort": 10000,
"ApiUser": "repertory", "ApiUser": "repertory",
"DatabaseType": "rocksdb", "DatabaseType": "rocksdb",
"DownloadTimeoutSeconds": 30, "DownloadTimeoutSeconds": 30,
"EnableDownloadTimeout": true, "EnableDownloadTimeout": true,
"EnableDriveEvents": false, "EnableDriveEvents": false,
"EventLevel": "info", "EventLevel": "info",
"EvictionDelayMinutes": 1, "EvictionDelayMinutes": 1,
"EvictionUseAccessedTime": false, "EvictionUseAccessedTime": false,
"HighFreqIntervalSeconds": 30, "HighFreqIntervalSeconds": 30,
"HostConfig": { "HostConfig": {
"AgentString": "Sia-Agent", "AgentString": "Sia-Agent",
"ApiPassword": "<renterd api password>", "ApiPassword": "<renterd api password>",
"ApiPort": 9980, "ApiPort": 9980,
"ApiUser": "", "ApiUser": "",
"HostNameOrIp": "localhost", "HostNameOrIp": "localhost",
"Path": "", "Path": "",
"Protocol": "http", "Protocol": "http",
"TimeoutMs": 60000 "TimeoutMs": 60000
}, },
"LowFreqIntervalSeconds": 3600, "LowFreqIntervalSeconds": 3600,
"MaxCacheSizeBytes": 21474836480, "MaxCacheSizeBytes": 21474836480,
"MaxUploadCount": 5, "MaxUploadCount": 5,
"MedFreqIntervalSeconds": 120, "MedFreqIntervalSeconds": 120,
"OnlineCheckRetrySeconds": 60, "OnlineCheckRetrySeconds": 60,
"PreferredDownloadType": "default", "PreferredDownloadType": "default",
"RemoteMount": { "RemoteMount": {
"ApiPort": 20000, "ApiPort": 20000,
"ClientPoolSize": 20, "ClientPoolSize": 20,
"Enable": false, "Enable": false,
"EncryptionToken": "" "EncryptionToken": ""
}, },
"RetryReadCount": 6, "RetryReadCount": 6,
"RingBufferFileSize": 512, "RingBufferFileSize": 512,
"SiaConfig": { "SiaConfig": {
"Bucket": "default" "Bucket": "default"
}, },
"TaskWaitMs": 100, "TaskWaitMs": 100,
"Version": 1 "Version": 1
} }
``` ```
### S3 ### S3
#### S3 Initial Configuration #### S3 Initial Configuration
* Required steps: * Required steps:
* Set the appropriate base URL: * Set the appropriate base URL:
* `repertory -s3 --name '<my config name>' -set S3Config.URL '<my url>'` * `repertory -s3 --name '<my config name>' -set S3Config.URL '<my url>'`
* Example: * Example:
* `repertory -s3 --name minio -set S3Config.URL 'http://localhost:9000'` * `repertory -s3 --name minio -set S3Config.URL 'http://localhost:9000'`
* Set the appropriate bucket name: * Set the appropriate bucket name:
* `repertory -s3 --name '<my config name>' -set S3Config.Bucket '<my bucket name>'` * `repertory -s3 --name '<my config name>' -set S3Config.Bucket '<my bucket name>'`
* Set the appropriate access key: * Set the appropriate access key:
* `repertory -s3 --name '<my config name>' -set S3Config.AccessKey '<my access key>'` * `repertory -s3 --name '<my config name>' -set S3Config.AccessKey '<my access key>'`
* Set the appropriate secret key: * Set the appropriate secret key:
* `repertory -s3 --name '<my config name>' -set S3Config.SecretKey '<my secret key>'` * `repertory -s3 --name '<my config name>' -set S3Config.SecretKey '<my secret key>'`
* For Sia and most local S3 gateway instances, enable path style URL's: * For Sia and most local S3 gateway instances, enable path style URL's:
* `repertory -s3 --name '<my config name>' -set S3Config.UsePathStyle true` * `repertory -s3 --name '<my config name>' -set S3Config.UsePathStyle true`
* Optional steps: * Optional steps:
* Set an appropriate region. Default is set to `any`: * Set an appropriate region. Default is set to `any`:
* `repertory -s3 --name '<my config name>' -set S3Config.Region '<my region>'` * `repertory -s3 --name '<my config name>' -set S3Config.Region '<my region>'`
* Enable encrypted file names and file data. Set a strong, random encryption token and be sure to store it in a secure backup location: * Enable encrypted file names and file data. Set a strong, random encryption token and be sure to store it in a secure backup location:
* `repertory -s3 --name '<my config name>' -set S3Config.EncryptionToken '<my strong password>'` * `repertory -s3 --name '<my config name>' -set S3Config.EncryptionToken '<my strong password>'`
* To verify/view all configuration options: * To verify/view all configuration options:
* `repertory -s3 --name '<my config name>' -dc` * `repertory -s3 --name '<my config name>' -dc`
* Example: * Example:
* `repertory -s3 --name minio -dc` * `repertory -s3 --name minio -dc`
#### S3 Mounting #### S3 Mounting
* Linux: * Linux:
* `repertory -s3 --name '<my config name>' /mnt/location` * `repertory -s3 --name '<my config name>' /mnt/location`
* Example: * Example:
* `repertory -s3 --name minio /mnt/location` * `repertory -s3 --name minio /mnt/location`
* Windows: * Windows:
* `repertory -s3 --name '<my config name>' t:` * `repertory -s3 --name '<my config name>' t:`
* Example: * Example:
* `repertory -s3 --name minio t:` * `repertory -s3 --name minio t:`
#### S3 Configuration File #### S3 Configuration File
```json ```json
{ {
"ApiAuth": "<random generated rpc password>", "ApiAuth": "<random generated rpc password>",
"ApiPort": 10100, "ApiPort": 10100,
"ApiUser": "repertory", "ApiUser": "repertory",
"DatabaseType": "rocksdb", "DatabaseType": "rocksdb",
"DownloadTimeoutSeconds": 30, "DownloadTimeoutSeconds": 30,
"EnableDownloadTimeout": true, "EnableDownloadTimeout": true,
"EnableDriveEvents": false, "EnableDriveEvents": false,
"EventLevel": "info", "EventLevel": "info",
"EvictionDelayMinutes": 1, "EvictionDelayMinutes": 1,
"EvictionUseAccessedTime": false, "EvictionUseAccessedTime": false,
"HighFreqIntervalSeconds": 30, "HighFreqIntervalSeconds": 30,
"LowFreqIntervalSeconds": 3600, "LowFreqIntervalSeconds": 3600,
"MaxCacheSizeBytes": 21474836480, "MaxCacheSizeBytes": 21474836480,
"MaxUploadCount": 5, "MaxUploadCount": 5,
"MedFreqIntervalSeconds": 120, "MedFreqIntervalSeconds": 120,
"OnlineCheckRetrySeconds": 60, "OnlineCheckRetrySeconds": 60,
"PreferredDownloadType": "default", "PreferredDownloadType": "default",
"RemoteMount": { "RemoteMount": {
"ApiPort": 20100, "ApiPort": 20100,
"ClientPoolSize": 20, "ClientPoolSize": 20,
"Enable": false, "Enable": false,
"EncryptionToken": "" "EncryptionToken": ""
}, },
"RetryReadCount": 6, "RetryReadCount": 6,
"RingBufferFileSize": 512, "RingBufferFileSize": 512,
"S3Config": { "S3Config": {
"AccessKey": "<my access key>", "AccessKey": "<my access key>",
"Bucket": "<my bucket name>", "Bucket": "<my bucket name>",
"EncryptionToken": "", "EncryptionToken": "",
"Region": "any", "Region": "any",
"SecretKey": "<my secret key>", "SecretKey": "<my secret key>",
"TimeoutMs": 60000, "TimeoutMs": 60000,
"URL": "http://localhost:9000", "URL": "http://localhost:9000",
"UsePathStyle": true, "UsePathStyle": true,
"UseRegionInURL": false "UseRegionInURL": false
}, },
"TaskWaitMs": 100, "TaskWaitMs": 100,
"Version": 1 "Version": 1
} }
``` ```
### Data Directories ### Data Directories
#### Linux Directories #### Linux Directories
* `~/.local/repertory2/s3` * `~/.local/repertory2/s3`
* `~/.local/repertory2/sia` * `~/.local/repertory2/sia`
#### Windows Directories #### Windows Directories
* `%LOCALAPPDATA%\repertory2\s3` * `%LOCALAPPDATA%\repertory2\s3`
* `%LOCALAPPDATA%\repertory2\sia` * `%LOCALAPPDATA%\repertory2\sia`
* Examples: * Examples:
* `C:\Users\Tom\AppData\Local\repertory2\s3` * `C:\Users\Tom\AppData\Local\repertory2\s3`
* `C:\Users\Tom\AppData\Local\repertory2\sia` * `C:\Users\Tom\AppData\Local\repertory2\sia`
* IMPORTANT: * IMPORTANT:
* It is highly recommended to exclude this folder from any anti-virus/anti-malware applications as severe performance issues may arise. * It is highly recommended to exclude this folder from any anti-virus/anti-malware applications as severe performance issues may arise.
* Excluding the mounted drive letter is also highly recommended. * Excluding the mounted drive letter is also highly recommended.
## Remote Mounting ## Remote Mounting
`repertory` allows local mounts to be shared with other computers on your network `repertory` allows local mounts to be shared with other computers on your network
or over the internet. This option is referred to as remote mounting. or over the internet. This option is referred to as remote mounting.
### Server Setup ### Server Setup
The following steps must be performed on the mount you wish to share with The following steps must be performed on the mount you wish to share with
other systems. Changes to configuration will not take affect while a mount is other systems. Changes to configuration will not take affect while a mount is
active, so it is recommended to unmount beforehand. active, so it is recommended to unmount beforehand.
* Required steps: * Required steps:
* Enable remote mount: * Enable remote mount:
* Sia * Sia
* `repertory -set RemoteMount.Enable true` * `repertory -set RemoteMount.Enable true`
* `repertory --name '<my config name>' -set RemoteMount.Enable true` * `repertory --name '<my config name>' -set RemoteMount.Enable true`
* S3: * S3:
* `repertory -s3 --name '<my config name>' -set RemoteMount.Enable true` * `repertory -s3 --name '<my config name>' -set RemoteMount.Enable true`
* Set a secure encryption token: * Set a secure encryption token:
* Sia: * Sia:
* `repertory -set RemoteMount.EncryptionToken '<my secure password>'` * `repertory -set RemoteMount.EncryptionToken '<my secure password>'`
* `repertory --name '<my config name>' -set RemoteMount.EncryptionToken '<my secure password>'` * `repertory --name '<my config name>' -set RemoteMount.EncryptionToken '<my secure password>'`
* S3: * S3:
* `repertory -s3 --name '<my config name>' -set RemoteMount.EncryptionToken '<my secure password>'` * `repertory -s3 --name '<my config name>' -set RemoteMount.EncryptionToken '<my secure password>'`
* Optional steps: * Optional steps:
* Change the port clients will use to connect to your mount: * Change the port clients will use to connect to your mount:
* Sia: * Sia:
* `repertory -set RemoteMount.Port 20000` * `repertory -set RemoteMount.Port 20000`
* `repertory --name '<my config name>' -set RemoteMount.Port 20000` * `repertory --name '<my config name>' -set RemoteMount.Port 20000`
* S3: * S3:
* `repertory -s3 --name '<my config name>' -set RemoteMount.Port 20000` * `repertory -s3 --name '<my config name>' -set RemoteMount.Port 20000`
* IMPORTANT: * IMPORTANT:
* Be sure to configure your firewall to allow incoming TCP connections on the port configured in `RemoteMount.Port`. * Be sure to configure your firewall to allow incoming TCP connections on the port configured in `RemoteMount.Port`.
#### Remote Mount Configuration File Section #### Remote Mount Configuration File Section
```json ```json
{ {
... ...
"RemoteMount": { "RemoteMount": {
"ApiPort": 20000, "ApiPort": 20000,
"ClientPoolSize": 20, "ClientPoolSize": 20,
"Enable": true, "Enable": true,
"EncryptionToken": "<my secure password>" "EncryptionToken": "<my secure password>"
}, },
... ...
} }
``` ```
### Client Setup ### Client Setup
Client configuration is provider agnostic, so there's no need to specify `-s3` Client configuration is provider agnostic, so there's no need to specify `-s3`
for S3 providers. for S3 providers.
* Required steps: * Required steps:
* Set the encryption token to the same value configured during server setup: * Set the encryption token to the same value configured during server setup:
* `repertory -rm <host name or IP>:<port> -set RemoteConfig.EncryptionToken '<my secure password>'` * `repertory -rm <host name or IP>:<port> -set RemoteConfig.EncryptionToken '<my secure password>'`
* Replace `<host name or IP>` with the host name or IP of the server * Replace `<host name or IP>` with the host name or IP of the server
* Replace `<port>` with the value of `RemoteMount.Port` used in the server configuration * Replace `<port>` with the value of `RemoteMount.Port` used in the server configuration
* Example: * Example:
* `repertory -rm 192.168.1.10:20000 -set RemoteConfig.EncryptionToken '<my secure password>'` * `repertory -rm 192.168.1.10:20000 -set RemoteConfig.EncryptionToken '<my secure password>'`
* `repertory -rm my.host.com:20000 -set RemoteConfig.EncryptionToken '<my secure password>'` * `repertory -rm my.host.com:20000 -set RemoteConfig.EncryptionToken '<my secure password>'`
#### Client Remote Mounting #### Client Remote Mounting
* Linux: * Linux:
* `repertory -rm <host name or IP>:<port> /mnt/location` * `repertory -rm <host name or IP>:<port> /mnt/location`
* Example: * Example:
* `repertory -rm 192.168.1.10:20000 /mnt/location` * `repertory -rm 192.168.1.10:20000 /mnt/location`
* Windows: * Windows:
* `repertory -rm <host name or IP>:<port> t:` * `repertory -rm <host name or IP>:<port> t:`
* Example: * Example:
* `repertory -rm 192.168.1.10:20000 t:` * `repertory -rm 192.168.1.10:20000 t:`
#### Remote Mount Configuration File #### Remote Mount Configuration File
```json ```json
{ {
"ApiAuth": "<random generated rpc password>", "ApiAuth": "<random generated rpc password>",
"ApiPort": 10010, "ApiPort": 10010,
"ApiUser": "repertory", "ApiUser": "repertory",
"EnableDriveEvents": false, "EnableDriveEvents": false,
"EventLevel": "info", "EventLevel": "info",
"RemoteConfig": { "RemoteConfig": {
"ApiPort": 20000, "ApiPort": 20000,
"EncryptionToken": "<my secure password>", "EncryptionToken": "<my secure password>",
"HostNameOrIp": "192.168.1.10", "HostNameOrIp": "192.168.1.10",
"MaxConnections": 20, "MaxConnections": 20,
"ReceiveTimeoutMs": 120000, "ReceiveTimeoutMs": 120000,
"SendTimeoutMs": 30000 "SendTimeoutMs": 30000
}, },
"TaskWaitMs": 100, "TaskWaitMs": 100,
"Version": 1 "Version": 1
} }
``` ```
## Compiling ## Compiling
Successful compilation will result in all files required for execution to be placed Successful compilation will result in all files required for execution to be placed
in the `dist/` directory in the `dist/` directory
### Linux Compilation ### Linux Compilation
* Ensure `docker` is installed * Ensure `docker` is installed
* For x86_64: * For x86_64:
* RelWithDebInfo: `scripts/make_unix.sh` * RelWithDebInfo: `scripts/make_unix.sh`
* Release: `scripts/make_unix.sh x86_64 Release` * Release: `scripts/make_unix.sh x86_64 Release`
* Debug: `scripts/make_unix.sh x86_64 Debug` * Debug: `scripts/make_unix.sh x86_64 Debug`
* For aarch64: * For aarch64:
* RelWithDebInfo: `scripts/make_unix.sh aarch64` * RelWithDebInfo: `scripts/make_unix.sh aarch64`
* Release: `scripts/make_unix.sh aarch64 Release` * Release: `scripts/make_unix.sh aarch64 Release`
* Debug: `scripts/make_unix.sh aarch64 Debug` * Debug: `scripts/make_unix.sh aarch64 Debug`
### Windows Compilation ### Windows Compilation
* OFFICIAL: Cross-compiling on Linux * OFFICIAL: Cross-compiling on Linux
* Ensure `docker` is installed * Ensure `docker` is installed
* RelWithDebInfo: `scripts/make_win32.sh` * RelWithDebInfo: `scripts/make_win32.sh`
* Release: `scripts/make_win32.sh x86_64 Release` * Release: `scripts/make_win32.sh x86_64 Release`
* Debug: `scripts/make_win32.sh x86_64 Debug` * Debug: `scripts/make_win32.sh x86_64 Debug`
* UNOFFICIAL: Compiling on Windows * UNOFFICIAL: Compiling on Windows
* Ensure latest [MSYS2](https://www.msys2.org/) is installed * Ensure latest [MSYS2](https://www.msys2.org/) is installed
* RelWithDebInfo: `scripts\make_win32.cmd` * RelWithDebInfo: `scripts\make_win32.cmd`
* Release: `scripts\make_win32.cmd x86_64 Release` * Release: `scripts\make_win32.cmd x86_64 Release`
* Debug: `scripts\make_win32.cmd x86_64 Debug` * Debug: `scripts\make_win32.cmd x86_64 Debug`
## Credits ## Credits
* [binutils](https://www.gnu.org/software/binutils/) * [binutils](https://www.gnu.org/software/binutils/)
* [boost c++ libraries](https://www.boost.org/) * [boost c++ libraries](https://www.boost.org/)
* [cpp-httplib](https://github.com/yhirose/cpp-httplib) * [cpp-httplib](https://github.com/yhirose/cpp-httplib)
* [curl](https://curl.haxx.se/) * [curl](https://curl.haxx.se/)
* [docker](https://www.docker.com/) * [docker](https://www.docker.com/)
* [Google Test](https://github.com/google/googletest) * [Google Test](https://github.com/google/googletest)
* [ICU](https://icu.unicode.org/) * [ICU](https://icu.unicode.org/)
* [JSON for Modern C++](https://github.com/nlohmann/json) * [JSON for Modern C++](https://github.com/nlohmann/json)
* [libexpat](https://github.com/libexpat/libexpat) * [libexpat](https://github.com/libexpat/libexpat)
* [libfuse](https://github.com/libfuse/libfuse) * [libfuse](https://github.com/libfuse/libfuse)
* [libsodium](https://doc.libsodium.org/) * [libsodium](https://doc.libsodium.org/)
* [mingw-w64](https://www.mingw-w64.org/) * [mingw-w64](https://www.mingw-w64.org/)
* [MSYS2](https://www.msys2.org) * [MSYS2](https://www.msys2.org)
* [OpenSSL](https://www.openssl.org/) * [OpenSSL](https://www.openssl.org/)
* [pkg-config](https://www.freedesktop.org/wiki/Software/pkg-config/) * [pkg-config](https://www.freedesktop.org/wiki/Software/pkg-config/)
* [pugixml](https://pugixml.org/) * [pugixml](https://pugixml.org/)
* [RocksDB](https://rocksdb.org) * [RocksDB](https://rocksdb.org)
* [ScPrime](https://scpri.me/) * [ScPrime](https://scpri.me/)
* [Sia Decentralized Cloud Storage](https://sia.tech/) * [Sia Decentralized Cloud Storage](https://sia.tech/)
* [spdlog](https://github.com/gabime/spdlog) * [spdlog](https://github.com/gabime/spdlog)
* [SQLite](https://www.sqlite.org) * [SQLite](https://www.sqlite.org)
* [stduuid](https://github.com/mariusbancila/stduuid) * [stduuid](https://github.com/mariusbancila/stduuid)
* [Storj](https://storj.io/) * [Storj](https://storj.io/)
* [WinFSP - FUSE for Windows](https://github.com/billziss-gh/winfsp) * [WinFSP - FUSE for Windows](https://github.com/billziss-gh/winfsp)
* [zlib](https://zlib.net/) * [zlib](https://zlib.net/)
## Developer Public Key ## Developer Public Key
```text ```text
-----BEGIN PUBLIC KEY----- -----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAqXedleDOugdk9sBpgFOA MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAqXedleDOugdk9sBpgFOA
0+MogIbBF7+iXIIHv8CRBbrrf8nxLSgQvbHQIP0EklebDgLZRgyGI3SSQYj7D957 0+MogIbBF7+iXIIHv8CRBbrrf8nxLSgQvbHQIP0EklebDgLZRgyGI3SSQYj7D957
uNf1//dpkELNzfuezgAyFer9+iH4Svq46HADp5k+ugaK0mMDZM7OLOgo7415/+z4 uNf1//dpkELNzfuezgAyFer9+iH4Svq46HADp5k+ugaK0mMDZM7OLOgo7415/+z4
NIQopv8prMFdxkShr4e4dpR+S6LYMYMVjsi1gnYWaZJMWgzeZouXFSscS1/XDXSE NIQopv8prMFdxkShr4e4dpR+S6LYMYMVjsi1gnYWaZJMWgzeZouXFSscS1/XDXSE
vr1Jfqme+RmB4Q2QqGcDrY2ijumCJYJzQqlwG6liJ4FNg0U3POTCQDhQmuUoEJe0 vr1Jfqme+RmB4Q2QqGcDrY2ijumCJYJzQqlwG6liJ4FNg0U3POTCQDhQmuUoEJe0
/dyiWlo48WQbBu6gUDHbTCCUSZPs2Lc9l65MqOCpX76+VXPYetZgqpMF4GVzb2y9 /dyiWlo48WQbBu6gUDHbTCCUSZPs2Lc9l65MqOCpX76+VXPYetZgqpMF4GVzb2y9
kETxFNpiMYBlOBZk0I1G33wqVmw46MI5IZMQ2z2F8Mzt1hByUNTgup2IQELCv1a5 kETxFNpiMYBlOBZk0I1G33wqVmw46MI5IZMQ2z2F8Mzt1hByUNTgup2IQELCv1a5
a2ACs2TBRuAy1REeHhjLgiA/MpoGX7TpoHCGyo8jBChJVpP9ZHltKoChwDC+bIyx a2ACs2TBRuAy1REeHhjLgiA/MpoGX7TpoHCGyo8jBChJVpP9ZHltKoChwDC+bIyx
rgYH3jYDkl2FFuAUJ8zAZl8U1kjqZb9HGq9ootMk34Dbo3IVkc2azB2orEP9F8QV rgYH3jYDkl2FFuAUJ8zAZl8U1kjqZb9HGq9ootMk34Dbo3IVkc2azB2orEP9F8QV
KxvZZDA9FAFEthSiNf5soJ6mZGLi0es5EWPoKMUEd9tG5bP980DySAWSSRK0AOfE KxvZZDA9FAFEthSiNf5soJ6mZGLi0es5EWPoKMUEd9tG5bP980DySAWSSRK0AOfE
QShT/z7oG79Orxyomwrb8ZJCi7wEfcCuK1NWgqLVUgXhpi2J9WYS6DAbF3Oh3Hhl QShT/z7oG79Orxyomwrb8ZJCi7wEfcCuK1NWgqLVUgXhpi2J9WYS6DAbF3Oh3Hhl
DYSHlcfFBteqNDlR2uFInIECAwEAAQ== DYSHlcfFBteqNDlR2uFInIECAwEAAQ==
-----END PUBLIC KEY----- -----END PUBLIC KEY-----
``` ```