Introduction – Setup opensim with multiple robust services

Opensim with multiple robust services on Ubuntu is covered on the opensimulator wiki; however, it is not included in detail. Some of the services do not separate well (in my experience). This article follows on from Setup Ubuntu 20.04 for Opensimulator. Ubuntu is featured throughout, but, most of the areas are very similar on both macOS and Windows.

The guide demonstrates setting up both the Robust and Simulator instances on one server. Usually, especially on larger or busier grids, they will be on separate servers. Only the actual opensim configuration is demonstrated. Automated, shut down and similar topics will be covered in a later article.

Folder Structure -opensim with multiple robust services on Ubuntu

On a single server running both Robust and a single Simulator is it possible to run both from the same Mysql Database and folder. It is not done in this example so the differences between Robust and Simulators remains clear. Additionally, if only one simulator is in use, running in standalone mode is probably preferable.

The folder structure and naming is a personal preference. It is important to choose a sensible and consistent naming. This example is just one suggested structure which worked well for me.

  • Create a top-level folder called Opensimulator
  • Create two, second-level folders (one for Robust and one for Simulators)
  • Inside the Simulators folder, create folders for as many simulators as you intend to run. Eg. Simulator1, Simulator2 etc.

Shown immediately below the terminal commands are shown. These will work equally well on macOS or Windows Powershell. Using a GUI is equally as suitable.

mkdir Robust
mkdir Simulators
cd Simulators
mkdir Simulator1

Download And Extract Opensimulator

Opensimulator can be downloaded here. Typically the latest stable release is the best choice. Linux users will likely want the “.tar.gz” version while Windows users will choose “.zip”.

Once downloaded:

  1. place one copy into the Robust folder.
  2. Then place another copy into each of the simulator folders you made.
  3. After copying the compressed files into their respective folders extract the files then delete the original compressed file.

Windows users will need to extract the compressed folder using Windows Explorer or expand-archive (in Powershell). Linux and macOS users can follow the terminal instructions.

The code below downloads the latest testing version of opensim so copy-pasting the line will always work. This version is only available as a .zip file. Unzip is not installed by default in Ubuntu, but can be installed from the package manager. #Lines are comments and not commands to execute.

#Navigate to the Opensimulator folder
#Download the file
wget http://opensimulator.org/dist/OpenSim-LastAutoBuild.zip

#Copy the files to their folders.
cp OpenSim-LastAutoBuild.zip Robust/
cp OpenSim-LastAutoBuild.zip Robust/

#remove the original file
rm OpenSim-LastAutoBuild.zip

#If you don't have "unzip" installed install it with (Debian based distros only)
sudo apt-get install unzip

#Uzip the files and removes the compressed version. 
cd Robust
unzip OpenSim-LastAutoBuild.zip
rm OpenSim-LastAutoBuild.zip
cd ../Simulators/Simulator1
unzip OpenSim-LastAutoBuild.zip
rm OpenSim-LastAutoBuild.zip

#The next line is an example using "tar" instead of "unzip". Replace unzip lines with tar when unpacking ".tar.gz".
tar -xvf filename

opensim with multiple robust services – configuration files

Here the Opensim with multiple Robust services on Ubuntu guide moves into setting up opensimulator configuration files. Everything from this point until the very end creating startup scripts is entirely cross-platform. These files are the same on Linux, Windows and macOS.

Robust – Hypergrid configuration with groups

  • Navigate to the Robust folder, then into the subfolder called “bin”
  • Copy the file called “Robust.HG.ini.example” to a new file called “Robust.HG.ini”.

Later this file will be discarded, but, in the meantime, the “.ini” extension will make the file display in a much more readable way using most text editors.

#Navigate to the Robust Folder
cp Robust.HG.ini.example Robust.HG.ini

Create a few empty files ready to copy-paste contents into. This can be done with any text editor. Most file manager applications will also have a “create a new text file” feature. These file names are not important in their own right, but if you use alternate names, they must match the command used to launch the Robust instances later.

  • Robust.HG.Asset.ini
  • Robust.HG.GridUser.ini
  • Robust.HG.Inventory.ini
  • Robust.HG.Main.ini
  • Robust.HG.Map.ini
#Using a Linux terminal, navigate to the Robust Folder
nano Robust.HG.Asset.ini
# Press Ctrl+O ENTER
# Press Ctrl+X
# Repeat the process for each file name above. 
About FSAssets – opensim with multiple robust services on Ubuntu

FSAssettes are covered in detail on the Opensimulator wiki here. For larger databases, this is the suggested method. Nowhere in the documentation does it suggest this will deliver lower performance on smaller databases. This example uses FSAssets

Disclaimer -opensim with multiple robust services on Ubuntu

The following examples are probably not perfect, they work well but could have unnecessary duplicated configuration lines. These are based on personal experience.

The original “Robust.HG.ini” file contains all the comments. Most comments are stripped out to reduce the length of the document.

Database names, passwords and URL’s – opensim with multiple robust services on Ubuntu

Database names and passwords match the ones used in the Setup Ubuntu 20.04 for Opensimulator. They should be changed to the names of the Robust MySql database with the respective password. URL’s / IP addresses should be changed to match the details of the server. Also, note the name changes to the PID file name and log file name.

Robust.HG.Asset.ini

[Const]
    ; The URL of the Robust server
    BaseURL = "http://**Add the IP address or URL for your server here**"

    ; The public port of the Robust server
    PublicPort = "8002"

    ; The private port of the Robust server
    PrivatePort = "8003"

[Startup]
    ; Place to create a PID file
    ; If no path if specified then a PID file is not created.
    PIDFile = "/tmp/RobustAsset.pid" 
    ; Set path to directory for modular ini files...
    ; The Robust.exe process must have R/W access to the location
    ConfigDirectory = "robust-include"

    ; Console commands can be saved to a file, so the command history persists after a restart. (default is true)
    ConsoleHistoryFileEnabled = true

    ; The history file can be just a filename (relative to OpenSim's bin/ directory
    ; or it can be a full path to somewhere else. (default is OpenSimConsoleHistory.txt in bin/)
    ConsoleHistoryFile = "RobustAssetConsoleHistory.txt"

    ; How many lines of command history should we keep? (default is 100)
    ConsoleHistoryFileLines = 500

[ServiceList]
    AssetServiceConnector = "8004/OpenSim.Server.Handlers.dll:AssetServiceConnector"
    
[Network]
    port = 8004
    AllowllHTTPRequestIn = false

[DatabaseService]

    StorageProvider = "OpenSim.Data.MySQL.dll"
    ConnectionString = "Data Source=localhost;Database=Robust;User ID=OpenSimAdmin;Password=password;Old Guids=true;"

[AssetService]

    ;; Choose an asset service (Only one option should be enabled)
    ;LocalServiceModule = "OpenSim.Services.AssetService.dll:AssetService"
    LocalServiceModule = "OpenSim.Services.FSAssetService.dll:FSAssetConnector"

    ;; FSAsset Directories. Base directory, where final asset files are stored and Spool directory for temp files
    ;; These directories must be on the same physical filesystem
    BaseDirectory = "./fsassets/data"
    SpoolDirectory = "./fsassets/tmp"

    ;; Original service can be checked if FSAssets can not find an asset
    FallbackService = "OpenSim.Services.AssetService.dll:AssetService";

    ;; The following are common to both the default asset service and FSAsset service
    ;; Common asset service options
    DefaultAssetLoader = "OpenSim.Framework.AssetLoader.Filesystem.dll"
    AssetLoaderArgs = "./assets/AssetSets.xml"
    AllowRemoteDelete = true
    AllowRemoteDeleteAllTypes = false

[LoginService]
        
    SRV_AssetServerURI = "${Const|BaseURL}:8004"

Robust.HG.GridUser.ini

[Const]
    ; The URL of the Robust server
    BaseURL = "http://**Add the IP address or URL for your server here**"

    ; The public port of the Robust server
    PublicPort = "8002"

    ; The private port of the Robust server
    PrivatePort = "8003"

[Startup]
   ; Place to create a PID file
    ; If no path if specified then a PID file is not created.
     PIDFile = "/tmp/RobustGridUser.pid"

    ConfigDirectory = "robust-include"

    ; Console commands can be saved to a file, so the command history persists after a restart. (default is true)
    ConsoleHistoryFileEnabled = true

    ; The history file can be just a filename (relative to OpenSim's bin/ directory
    ; or it can be a full path to somewhere else. (default is OpenSimConsoleHistory.txt in bin/)
    ConsoleHistoryFile = "RobustGridUserConsoleHistory.txt"

    ; How many lines of command history should we keep? (default is 100)
    ConsoleHistoryFileLines = 100


[ServiceList]

    GridUserServiceConnector = "8005/OpenSim.Server.Handlers.dll:GridUserServiceConnector"
    
[Network]
    port = 8005

    AllowllHTTPRequestIn = false

[DatabaseService]
 
    StorageProvider = "OpenSim.Data.MySQL.dll"
    ConnectionString = "Data Source=localhost;Database=Robust;User ID=OpenSimAdmin;Password=password;Old Guids=true;"


[GridUserService]
    ; for the server connector
    LocalServiceModule = "OpenSim.Services.UserAccountService.dll:GridUserService"

Robust.HG.Inventory.ini

[Const]
    ; The URL of the Robust server
    BaseURL = "**Add the IP address or URL for your server here**"
    ; The public port of the Robust server
    PublicPort = "8002"
    ; The private port of the Robust server
    PrivatePort = "8003"

[Startup]
; Place to create a PID file
    ; If no path if specified then a PID file is not created.
     PIDFile = "/tmp/RobustInventory.pid"    
ConfigDirectory = "robust-include"
    ; Console commands can be saved to a file, so the command history persists after a restart. (default is true)
    ConsoleHistoryFileEnabled = true
    ; The history file can be just a filename (relative to OpenSim's bin/ directory
    ; or it can be a full path to somewhere else. (default is OpenSimConsoleHistory.txt in bin/)
    ConsoleHistoryFile = "RobustInventoryConsoleHistory.txt"
    ; How many lines of command history should we keep? (default is 100)
    ConsoleHistoryFileLines = 100

[ServiceList]
    InventoryInConnector = "8006/OpenSim.Server.Handlers.dll:XInventoryInConnector"
    
[Network]
    port = 8006
    AllowllHTTPRequestIn = false

[DatabaseService]
    StorageProvider = "OpenSim.Data.MySQL.dll"
    ConnectionString = "Data Source=localhost;Database=Robust;User ID=OpenSimAdmin;Password=password;Old Guids=true;"

[InventoryService]
    LocalServiceModule = "OpenSim.Services.InventoryService.dll:XInventoryService"
    AllowDelete = true

[LoginService]
    InventoryService = "OpenSim.Services.InventoryService.dll:XInventoryService"
    SRV_InventoryServerURI = "${Const|BaseURL}:8006"

Robust.HG.Map.ini

[Const]
    ; The URL of the Robust server
    BaseURL = "http://**Add the IP address or URL for your server here**"

    ; The public port of the Robust server
    PublicPort = "8002"

    ; The private port of the Robust server
    PrivatePort = "8003"

[Startup]
; Place to create a PID file
    ; If no path if specified then a PID file is not created.
     PIDFile = "/tmp/RobustMap.exe.pid"    
ConfigDirectory = "robust-include"
    ; Console commands can be saved to a file, so the command history persists after a restart. (default is true)
    ConsoleHistoryFileEnabled = true
    ; The history file can be just a filename (relative to OpenSim's bin/ directory
    ; or it can be a full path to somewhere else. (default is OpenSimConsoleHistory.txt in bin/)
    ConsoleHistoryFile = "RobustMapConsoleHistory.txt"
    ; How many lines of command history should we keep? (default is 100)
    ConsoleHistoryFileLines = 100

[ServiceList]
    MapAddServiceConnector = "8007/OpenSim.Server.Handlers.dll:MapAddServiceConnector"
    MapGetServiceConnector = "8007/OpenSim.Server.Handlers.dll:MapGetServiceConnector"

[Network]
    port = 8007
    AllowllHTTPRequestIn = false
    
[LoginService]
    MapTileURL = "${Const|BaseURL}:8007/";

[DatabaseService]
    StorageProvider = "OpenSim.Data.MySQL.dll"
    ConnectionString = "Data Source=localhost;Database=Robust;User ID=OpenSimAdmin;Password=password;Old Guids=true;"

[MapImageService]
    LocalServiceModule = "OpenSim.Services.MapImageService.dll:MapImageService"

Robust.HG.Main.ini

Pay Special Attention to the following sections when compared to the original “Robust.HG.ini” file.

GridService

Pay attention to the region names inside the “GridService” section. The comments have been removed, please refer to the original “.ini” file.

GridInfoService

There are lots of areas which will be personal to your grid to set here. Please compare the versions carefully.

LoginService

Look at the port numbers which have changed here, and compare them to the port numbers in the previous files. These will also be reflected in the settings in the Simulator settings.

ServiceList

Pay attention to the commented lines which begin with three colons (“;;;”). These are the lines now being handled by the separate files. Their corresponding items can be found un-commented with adjusted port numbers in those.

Startup

There is a strong possibility that “RegistryLocation” and “ConfigDirectory” will require alteration. Refer to the original “.ini” file.

[Const]
    ; The URL of the Robust server
    BaseURL = "http://**Add the IP address or URL for your server here**"
    ; The public port of the Robust server
    PublicPort = "8002"
    ; The private port of the Robust server
    PrivatePort = "8003"

[Startup]
; Place to create a PID file
    ; If no path if specified then a PID file is not created.
     PIDFile = "/tmp/RobustMain.pid"    
;RegistryLocation = "../addins-registry"
    ;ConfigDirectory = "../addins-config"
    ConfigDirectory = "robust-include"
    ; Console commands can be saved to a file, so the command history persists after a restart. (default is true)
    ConsoleHistoryFileEnabled = true
    ; The history file can be just a filename (relative to OpenSim's bin/ directory
    ; or it can be a full path to somewhere else. (default is OpenSimConsoleHistory.txt in bin/)
    ConsoleHistoryFile = "RobustMainConsoleHistory.txt"
    ; How many lines of command history should we keep? (default is 100)
    ConsoleHistoryFileLines = 2000

[ServiceList]
    ;;;AssetServiceConnector = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:AssetServiceConnector"
    ;;;InventoryInConnector = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:XInventoryInConnector"
    ;;Uncomment if you have set up Freeswitch (see [FreeswitchService] below)
    ;VoiceConnector = "8004/OpenSim.Server.Handlers.dll:FreeswitchServerConnector"
    GridServiceConnector = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:GridServiceConnector"
    GridInfoServerInConnector = "${Const|PublicPort}/OpenSim.Server.Handlers.dll:GridInfoServerInConnector"
    AuthenticationServiceConnector = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:AuthenticationServiceConnector"
    OpenIdServerConnector = "${Const|PublicPort}/OpenSim.Server.Handlers.dll:OpenIdServerConnector"
    AvatarServiceConnector = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:AvatarServiceConnector"
    LLLoginServiceInConnector = "${Const|PublicPort}/OpenSim.Server.Handlers.dll:LLLoginServiceInConnector"
    PresenceServiceConnector = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:PresenceServiceConnector"
    UserAccountServiceConnector = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:UserAccountServiceConnector"
    ;;;GridUserServiceConnector = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:GridUserServiceConnector"
    AgentPreferencesServiceConnector = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:AgentPreferencesServiceConnector"
    FriendsServiceConnector = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:FriendsServiceConnector"
    ;;;MapAddServiceConnector = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:MapAddServiceConnector"
    ;;;MapGetServiceConnector = "${Const|PublicPort}/OpenSim.Server.Handlers.dll:MapGetServiceConnector"
    ;; Uncomment this if you want offline IM to work
    OfflineIMServiceConnector = "${Const|PrivatePort}/OpenSim.Addons.OfflineIM.dll:OfflineIMServiceRobustConnector"
    ;; Uncomment this if you want Groups V2 to work
    GroupsServiceConnector = "${Const|PrivatePort}/OpenSim.Addons.Groups.dll:GroupsServiceRobustConnector"
    ;; Uncomment to provide bakes caching
    BakedTextureService = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:XBakesConnector"
    ;; Uncomment for UserProfiles see [UserProfilesService] to configure...
    UserProfilesServiceConnector = "${Const|PublicPort}/OpenSim.Server.Handlers.dll:UserProfilesConnector"
    ;; Uncomment if you want to have centralized estate data
    EstateDataService = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:EstateDataRobustConnector"
    MuteListConnector = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:MuteListServiceConnector"
    ;; Additions for Hypergrid
    GatekeeperServiceInConnector = "${Const|PublicPort}/OpenSim.Server.Handlers.dll:GatekeeperServiceInConnector"
    UserAgentServerConnector = "${Const|PublicPort}/OpenSim.Server.Handlers.dll:UserAgentServerConnector"
    HeloServiceInConnector = "${Const|PublicPort}/OpenSim.Server.Handlers.dll:HeloServiceInConnector"
    HGFriendsServerConnector = "${Const|PublicPort}/OpenSim.Server.Handlers.dll:HGFriendsServerConnector"
    InstantMessageServerConnector = "${Const|PublicPort}/OpenSim.Server.Handlers.dll:InstantMessageServerConnector"
    HGInventoryServiceConnector = "HGInventoryService@${Const|PublicPort}/OpenSim.Server.Handlers.dll:XInventoryInConnector"
    HGAssetServiceConnector = "HGAssetService@${Const|PublicPort}/OpenSim.Server.Handlers.dll:AssetServiceConnector"
    ;; Uncomment this if you want Groups V2, HG to work
    HGGroupsServiceConnector = "${Const|PublicPort}/OpenSim.Addons.Groups.dll:HGGroupsServiceRobustConnector"

[Network]
    port = ${Const|PrivatePort}
    AllowllHTTPRequestIn = false

[Hypergrid]
    HomeURI = "${Const|BaseURL}:${Const|PublicPort}"
    GatekeeperURI = "${Const|BaseURL}:${Const|PublicPort}"

[AccessControl]
 
[DatabaseService]
    StorageProvider = "OpenSim.Data.MySQL.dll"
    ConnectionString = "Data Source=localhost;Database=Robust;User ID=OpenSimAdmin;Password=password;Old Guids=true;"

[DatabaseService]
    StorageProvider = "OpenSim.Data.MySQL.dll"
    ConnectionString = "Data Source=localhost;Database=Robust;User ID=OpenSimAdmin;Password=password;Old Guids=true;"

[AssetService]
    ;LocalServiceModule = "OpenSim.Services.AssetService.dll:AssetService"
    LocalServiceModule = "OpenSim.Services.FSAssetService.dll:FSAssetConnector"
    ;; FSAsset Directories. Base directory, where final asset files are stored and Spool directory for temp files
    ;; These directories must be on the same physical filesystem
    BaseDirectory = "./fsassets/data"
    SpoolDirectory = "./fsassets/tmp"
    ;; Original service can be checked if FSAssets can not find an asset
    FallbackService = "OpenSim.Services.AssetService.dll:AssetService";
    DefaultAssetLoader = "OpenSim.Framework.AssetLoader.Filesystem.dll"
    AssetLoaderArgs = "./assets/AssetSets.xml"
    AllowRemoteDelete = true
    AllowRemoteDeleteAllTypes = false

[InventoryService]
    LocalServiceModule = "OpenSim.Services.InventoryService.dll:XInventoryService"
    AllowDelete = true

[GridService]
    LocalServiceModule = "OpenSim.Services.GridService.dll:GridService"
    AssetService = "OpenSim.Services.AssetService.dll:AssetService"
    ; Region_Welcome_Area = "DefaultRegion, FallbackRegion"
    Region_Welcome_Area= "DefaultRegion, DefaultHGRegion, Persistent"
    ; (replace spaces with underscore)
    ;; Allow Hyperlinks to be created at the console
    HypergridLinker = true
    ;; Allow supporting viewers to export content
    ;; Set to false to prevent export
    ExportSupported = true
    ;; If you have this set under [Hypergrid], no need to set it here, leave it commented
    ; GatekeeperURI = "${Const|BaseURL}:${Const|PublicPort}"

[FreeswitchService]
    LocalServiceModule = "OpenSim.Services.FreeswitchService.dll:FreeswitchService"

[AuthenticationService]
    LocalServiceModule = "OpenSim.Services.AuthenticationService.dll:PasswordAuthenticationService"

[OpenIdService]
    ; for the server connector
    AuthenticationServiceModule = "OpenSim.Services.AuthenticationService.dll:PasswordAuthenticationService"
    UserAccountServiceModule = "OpenSim.Services.UserAccountService.dll:UserAccountService"

[UserAccountService]
    ; for the server connector
    LocalServiceModule = "OpenSim.Services.UserAccountService.dll:UserAccountService"
    ; These are for creating new accounts by the service
    AuthenticationService = "OpenSim.Services.AuthenticationService.dll:PasswordAuthenticationService"
    PresenceService = "OpenSim.Services.PresenceService.dll:PresenceService"
    GridService = "OpenSim.Services.GridService.dll:GridService"
    InventoryService = "OpenSim.Services.InventoryService.dll:XInventoryService"
    AvatarService = "OpenSim.Services.AvatarService.dll:AvatarService"
    GridUserService = "OpenSim.Services.UserAccountService.dll:GridUserService"
    CreateDefaultAvatarEntries = true

[GridUserService]
    ; for the server connector
    LocalServiceModule = "OpenSim.Services.UserAccountService.dll:GridUserService"

[AgentPreferencesService]
    ; for the server connector
    LocalServiceModule = "OpenSim.Services.UserAccountService.dll:AgentPreferencesService"

[PresenceService]
    ; for the server connector
    LocalServiceModule = "OpenSim.Services.PresenceService.dll:PresenceService"

[AvatarService]
    ; for the server connector
    LocalServiceModule = "OpenSim.Services.AvatarService.dll:AvatarService"

[FriendsService]
    ; for the server connector
    LocalServiceModule = "OpenSim.Services.FriendsService.dll:FriendsService"

[EstateService]
    LocalServiceModule = "OpenSim.Services.EstateService.dll:EstateDataService"

[LibraryService]
    LibraryName = "OpenSim Library"
    DefaultLibrary = "./inventory/Libraries.xml"

[LoginService]
    ; for the server connector
    LocalServiceModule = "OpenSim.Services.LLLoginService.dll:LLLoginService"
    ; for the service
    UserAccountService = "OpenSim.Services.UserAccountService.dll:UserAccountService"
    GridUserService = "OpenSim.Services.UserAccountService.dll:GridUserService"
    AuthenticationService = "OpenSim.Services.AuthenticationService.dll:PasswordAuthenticationService"
    InventoryService = "OpenSim.Services.InventoryService.dll:XInventoryService"
    AvatarService = "OpenSim.Services.AvatarService.dll:AvatarService"
    PresenceService = "OpenSim.Services.PresenceService.dll:PresenceService"
    GridService = "OpenSim.Services.GridService.dll:GridService"
    SimulationService ="OpenSim.Services.Connectors.dll:SimulationServiceConnector"
    LibraryService = "OpenSim.Services.InventoryService.dll:LibraryService"
    FriendsService = "OpenSim.Services.FriendsService.dll:FriendsService"
    ;; for hypergrid
    UserAgentService = "OpenSim.Services.HypergridService.dll:UserAgentService"
    ; This inventory service will be used to initialize the user's inventory
    HGInventoryServicePlugin = "HGInventoryService@OpenSim.Services.HypergridService.dll:HGSuitcaseInventoryService"
    WelcomeMessage = "Welcome Avatar!"
    AllowRemoteSetLoginLevel = "false"
    ; For V2 map
    ;;;;;MapTileURL = "${Const|BaseURL}:${Const|PublicPort}/";
    MapTileURL = "${Const|BaseURL}:8007/";
    ; Url to search service
    SearchURL = "${Const|BaseURL}:${Const|PublicPort}/";
    ; For V3 destination guide
    DestinationGuide = "http://www.hyperica.com/destination-guide"
    SRV_HomeURI = "${Const|BaseURL}:${Const|PublicPort}"
    SRV_InventoryServerURI = "${Const|BaseURL}:8006"
    SRV_AssetServerURI = "${Const|BaseURL}:8004"
    SRV_ProfileServerURI = "${Const|BaseURL}:${Const|PublicPort}"
    SRV_FriendsServerURI = "${Const|BaseURL}:${Const|PublicPort}"
    SRV_IMServerURI = "${Const|BaseURL}:${Const|PublicPort}"
    SRV_GroupsServerURI = "${Const|BaseURL}:${Const|PublicPort}"
    DSTZone = "America/Los_Angeles;Pacific Standard Time"

[MapImageService]
    LocalServiceModule = "OpenSim.Services.MapImageService.dll:MapImageService"

[GridInfoService]
    ; login uri: for grid this is the login server URI
    login = ${Const|BaseURL}:${Const|PublicPort}/
    ; long grid name: the long name of your grid
    gridname = "grid name"
    ; short grid name: the short name of your grid
    gridnick = "grid nick name"
    ; HG address of the gatekeeper, if you have one
    ; this is the entry point for all the regions of the world
    gatekeeper = ${Const|BaseURL}:${Const|PublicPort}/
    ; HG user domain, if you have one
    ; this is the entry point for all user-related HG services
    uas = ${Const|BaseURL}:${Const|PublicPort}/

[GatekeeperService]
    LocalServiceModule = "OpenSim.Services.HypergridService.dll:GatekeeperService"
    ;; for the service
    UserAccountService = "OpenSim.Services.UserAccountService.dll:UserAccountService"
    UserAgentService = "OpenSim.Services.HypergridService.dll:UserAgentService"
    PresenceService = "OpenSim.Services.PresenceService.dll:PresenceService"
    GridUserService = "OpenSim.Services.UserAccountService.dll:GridUserService"
    GridService = "OpenSim.Services.GridService.dll:GridService"
    AuthenticationService = "OpenSim.Services.Connectors.dll:AuthenticationServicesConnector"
    SimulationService ="OpenSim.Services.Connectors.dll:SimulationServiceConnector"
    AllowTeleportsToAnyRegion = true

[UserAgentService]
    LocalServiceModule = "OpenSim.Services.HypergridService.dll:UserAgentService"
    ;; for the service
    GridUserService     = "OpenSim.Services.UserAccountService.dll:GridUserService"
    GridService         = "OpenSim.Services.GridService.dll:GridService"
    GatekeeperService   = "OpenSim.Services.HypergridService.dll:GatekeeperService"
    PresenceService     = "OpenSim.Services.PresenceService.dll:PresenceService"
    FriendsService      = "OpenSim.Services.FriendsService.dll:FriendsService"
    UserAccountService  = "OpenSim.Services.UserAccountService.dll:UserAccountService"

[HGInventoryService]
    ; For the InventoryServiceInConnector
    LocalServiceModule    = "OpenSim.Services.HypergridService.dll:HGSuitcaseInventoryService"
    UserAccountsService = "OpenSim.Services.UserAccountService.dll:UserAccountService"
    AvatarService = "OpenSim.Services.AvatarService.dll:AvatarService"
    AuthType = None

[HGAssetService]
    ;; Use the second option if you have FSAsset service enabled
    ;LocalServiceModule = "OpenSim.Services.HypergridService.dll:HGAssetService"
    LocalServiceModule = "OpenSim.Services.HypergridService.dll:HGFSAssetService"
    UserAccountsService = "OpenSim.Services.UserAccountService.dll:UserAccountService"
    AuthType = None

[HGFriendsService]
    LocalServiceModule = "OpenSim.Services.HypergridService.dll:HGFriendsService"
    UserAgentService = "OpenSim.Services.HypergridService.dll:UserAgentService"
    FriendsService = "OpenSim.Services.FriendsService.dll:FriendsService"
    UserAccountService = "OpenSim.Services.UserAccountService.dll:UserAccountService"
    GridService = "OpenSim.Services.GridService.dll:GridService"
    PresenceService = "OpenSim.Services.PresenceService.dll:PresenceService"

[HGInstantMessageService]
    LocalServiceModule  = "OpenSim.Services.HypergridService.dll:HGInstantMessageService"
    GridService         = "OpenSim.Services.GridService.dll:GridService"
    PresenceService     = "OpenSim.Services.PresenceService.dll:PresenceService"
    UserAgentService    = "OpenSim.Services.HypergridService.dll:UserAgentService"
    ; This should always be true in the Robust config
    InGatekeeper = True

[Messaging]
    ; OfflineIM
    OfflineIMService = "OpenSim.Addons.OfflineIM.dll:OfflineIMService"

[Groups]
    ;; for the HG Groups service
    OfflineIMService = "OpenSim.Addons.OfflineIM.dll:OfflineIMService"
    UserAccountService = "OpenSim.Services.UserAccountService.dll:UserAccountService"

[UserProfilesService]
    LocalServiceModule = "OpenSim.Services.UserProfilesService.dll:UserProfilesService"
    Enabled = true
    UserAccountService = OpenSim.Services.UserAccountService.dll:UserAccountService
    AuthenticationServiceModule = "OpenSim.Services.AuthenticationService.dll:PasswordAuthenticationService"

[BakedTextureService]
    LocalServiceModule = "OpenSim.Server.Handlers.dll:XBakes"
    ;; This directory must be writable by the user ROBUST runs as. It will be created automatically.
    BaseDirectory = "./bakes"

[MuteListService]
	LocalServiceModule = "OpenSim.Services.MuteListService.dll:MuteListService"

Simulators

OpenSim.ini

OpenSim.ini contains nothing specific to running with multiple instances of Robust. The information included is provided for completeness only using settings I have found to work well. For further explanation, please refer to the original OpenSim.ini file comments and the OpenSim Wiki.

These settings match the Robust configuration above, using hypergrid and groups. If multiple simulators are being used, changing the PID file name here makes sense.

[Const]
    BaseURL = "http://**Add your server IP address or URL here**"
    PublicPort = "8002"
    PrivatePort = "8003"

[Startup]
    ConsoleHistoryFileEnabled = true
    ConsoleHistoryFile = "OpenSimConsoleHistory.txt"
    ConsoleHistoryFileLines = 500
    save_crashes = true
    crash_dir = "crashes"
    PIDFile = "/tmp/SimulatorName.pid"
    MaxPrimUndos = 20
    NonPhysicalPrimMin = 0.001
    NonPhysicalPrimMax = 1024
    PhysicalPrimMin = 0.01
    PhysicalPrimMax = 64
    AllowScriptCrossing = true
    CombineContiguousRegions = false
    physical_prim = true
    meshing = Meshmerizer
    physics = BulletSim
    DefaultScriptEngine = "XEngine"

[AccessControl]

[Terrain]
    SendTerrainUpdatesByViewDistance = true

[Map]
    GenerateMaptiles = true
    MapImageModule = "MapImageModule"
    MaptileRefresh = 604800
    TextureOnMapTile = true
    DrawPrimOnMapTile = true
    TexturePrims = true
    TexturePrimSize = 48
    RenderMeshes = true;

[Permissions]
    allow_grid_gods = true
    region_owner_is_god = false
    region_manager_is_god = false

[Estates]

[SMTP]
	;details are set in this section, but nothing suitible for public display.

[Network]
    http_listener_port = 9080
    shard = "OpenSim"

[XMLRPC]

[ClientStack.LindenUDP]

[ClientStack.LindenCaps]
    Cap_GetTexture = "localhost"
    Cap_GetMesh = "localhost"
    Cap_AvatarPickerSearch = "localhost"
    Cap_GetDisplayNames = "localhost"

[SimulatorFeatures]

[Chat]

[EntityTransfer]

[Messaging]
    OfflineMessageModule = "Offline Message Module V2"
    OfflineMessageURL = ${Const|BaseURL}:${Const|PrivatePort}
    StorageProvider = OpenSim.Data.MySQL.dll

[BulletSim]
    AvatarToAvatarCollisionsByDefault = true
    UseSeparatePhysicsThread = true
    TerrainImplementation = 0

[ODEPhysicsSettings]
    mesh_sculpted_prim = true
    use_NINJA_physics_joints = true

[RemoteAdmin]

[Wind]
    enabled = true
    wind_update_rate = 150
    wind_plugin = ConfigurableWind
    avg_strength = 20.0
    avg_direction = 1.0
    var_strength = 5.0
    var_direction = 30.0
    rate_change = 1.0

[LightShare]
    enable_windlight = true

[Materials]
     enable_materials = true
     MaxMaterialsPerTransaction = 100

[Economy]
    SellEnabled = true
    PriceUpload = 0
    PriceGroupCreate = 0

[YEngine]
    Enabled = true
    ScriptStackSize = 256
    ScriptHeapSize = 256
    MinTimerInterval = 0.01
    ScriptBasePath="ScriptEngines"

[XEngine]
    Enabled = true
    MinThreads = 2
    MaxThreads = 100
    IdleTimeout = 300
    Priority = "BelowNormal"
    MaxScriptEventQueue = 100
    ThreadStackSize = 262144
	MinTimerInterval = 0.01
    DefaultCompileLanguage = "lsl"
    AllowedCompilers = "lsl"
    EventLimit = 300
    ScriptDelayFactor = 1.0
    ScriptDistanceLimitFactor = 1.0
    NotecardLineReadCharsMax = 1000
    SensorMaxRange = 250
    SensorMaxResults = 200
    DisableUndergroundMovement = false

[OSSL]
    Include-osslEnable = "config-include/osslEnable.ini"

[Groups]
    Enabled = true
    LevelGroupCreate = 0
    Module = "Groups Module V2"
    StorageProvider = OpenSim.Data.MySQL.dll
    ServicesConnectorModule = "Groups HG Service Connector"
    LocalService = remote
    GroupsServerURI = "${Const|BaseURL}:${Const|PrivatePort}"
    MessagingEnabled = true
    MessagingModule = "Groups Messaging Module V2"
    NoticesEnabled = true
    MessageOnlineUsersOnly = true

[InterestManagement]

[MediaOnAPrim]
    Enabled = true;

[NPC]
    Enabled = true

[Terrain]
    InitialTerrain = "pinhead-island"

[UserProfiles]
  ProfileServiceURL = "${Const|BaseURL}:${Const|PublicPort}"

[XBakes]
  URL =  "${Const|BaseURL}:${Const|PrivatePort}"

[AutoBackupModule]
AutoBackupModuleEnabled = true
AutoBackup = true
AutoBackupInterval = 6840
AutoBackupBusyCheck = false
AutoBackupThreshold = 1
AutoBackupSkipAssets = false
AutoBackupKeepFilesForDays = 28
AutoBackupNaming = Time
AutoBackupDir = "/home/***userfolder**/OarFiles

[Architecture]
Include-Architecture = "config-include/GridHypergrid.ini"

GridCommon.ini

  • Navigate to the Simulator1 folder,
  • Then into the subfolder called “bin”
  • Then into another subfolder called “config-include”

There are multiple changes in this file which relate to the port changes we made in the Robust Files. All comments have been removed from the original GridCommon.ini file. In their place, the default settings from this file have been left commented out alongside the settings to make the simulator work with the split services robust configuration.

[DatabaseService]
    StorageProvider = "OpenSim.Data.MySQL.dll"
    ConnectionString = "Data Source=localhost;Database=SimulatorInstance1;User ID=OpenSimAdmin;Password=password;Old Guids=true;"

[Hypergrid]
    HomeURI = "${Const|BaseURL}:${Const|PublicPort}"
    GatekeeperURI = "${Const|BaseURL}:${Const|PublicPort}"

[Modules]
    AssetCaching = "FlotsamAssetCache"
    Include-FlotsamCache = "config-include/FlotsamCache.ini"

[AssetService]
    DefaultAssetLoader = "OpenSim.Framework.AssetLoader.Filesystem.dll"
    AssetLoaderArgs = "assets/AssetSets.xml"
    AssetServerURI = "${Const|BaseURL}:8004"
    ;AssetServerURI = "${Const|BaseURL}:${Const|PrivatePort}"

[InventoryService]
    InventoryServerURI = "${Const|BaseURL}:8006"
    ;InventoryServerURI = "${Const|BaseURL}:${Const|PrivatePort}"
    
[GridInfo]
    GridInfoURI = "${Const|BaseURL}:${Const|PublicPort}"

[GridService]
    GridServerURI = "${Const|BaseURL}:${Const|PrivatePort}"
    AllowHypergridMapSearch = true
    Gatekeeper="${Const|BaseURL}:${Const|PublicPort}"

[EstateDataStore]

    LocalServiceModule = "OpenSim.Services.Connectors.dll:EstateDataRemoteConnector"

[EstateService]
    EstateServerURI = "${Const|BaseURL}:${Const|PrivatePort}"
    ;EstateServerURI = "${Const|BaseURL}:8008"

[Messaging]
    Gatekeeper = "${Const|BaseURL}:${Const|PublicPort}"

[AvatarService]

    AvatarServerURI = "${Const|BaseURL}:${Const|PrivatePort}"
    ;AvatarServerURI = "${Const|BaseURL}:8008"

[AgentPreferencesService]

    AgentPreferencesServerURI = "${Const|BaseURL}:${Const|PrivatePort}"
    ;AgentPreferencesServerURI = "${Const|BaseURL}:8008"

[PresenceService]

    PresenceServerURI = "${Const|BaseURL}:${Const|PrivatePort}"
    ;PresenceServerURI = "${Const|BaseURL}:8008"

[UserAccountService]

    UserAccountServerURI = "${Const|BaseURL}:${Const|PrivatePort}"
    ;UserAccountServerURI = "${Const|BaseURL}:8008"

[GridUserService]

    GridUserServerURI = "${Const|BaseURL}:8005"
    ;GridUserServerURI = "${Const|BaseURL}:${Const|PrivatePort}"

[AuthenticationService]
    AuthenticationServerURI = "${Const|BaseURL}:${Const|PrivatePort}"
    ;AuthenticationServerURI = "${Const|BaseURL}:8008"

[FriendsService]
    FriendsServerURI = "${Const|BaseURL}:${Const|PrivatePort}"
    ;FriendsServerURI = "${Const|BaseURL}:8008"

[HGInventoryAccessModule]
    HomeURI = "${Const|BaseURL}:${Const|PublicPort}"
    Gatekeeper = "${Const|BaseURL}:${Const|PublicPort}"
    OutboundPermission = True
    RestrictInventoryAccessAbroad = True

[HGAssetService]
    HomeURI = "${Const|BaseURL}:${Const|PublicPort}"

[HGFriendsModule]
    LevelHGFriends = 0;

[UserAgentService]
    UserAgentServerURI = "${Const|BaseURL}:${Const|PublicPort}"

[MapImageService]
    ;MapImageServerURI = "${Const|BaseURL}:${Const|PrivatePort}"
    MapImageServerURI = "${Const|BaseURL}:8007"

[AuthorizationService]

Create Shell Scripts to start Robust And The Simulators

Navigate to the main Opensimulator folder (the one above Robust and Simulators). Then create the following shell scripts using the information provided below. Windows and macOS users will need to make minor alterations to these. Windows users will also need to use “.bat” files instead of “.sh”. Desktop users need to change “mono –server” to “mono –desktop”.

All of these files are the same other than the last line. The simulator points to “OpenSim.exe” and each Robust file points to a different “.ini” file.

StartSimulator1.sh

#!/bin/sh
ulimit -s 1048576
# next option may improve SGen gc (for opensim only) you may also need to incre$
#export MONO_GC_PARAMS="minor=split,promotion-age=14"
ulimit -s 1048576
cd Simulators/Simulator1/bin
export TERM=xterm
mono --server OpenSim.exe

StartRobustAsset.sh

#!/bin/sh
ulimit -s 1048576
# next option may improve SGen gc (for opensim only) you may also need to incre$
#export MONO_GC_PARAMS="minor=split,promotion-age=14"
ulimit -s 1048576
cd Simulators/Simulator1/bin
export TERM=xterm
mono --server Robust.exe -inifile=Robust.HG.Asset.ini

StartRobustGridUser.sh

#!/bin/sh
ulimit -s 1048576
# next option may improve SGen gc (for opensim only) you may also need to incre$
#export MONO_GC_PARAMS="minor=split,promotion-age=14"
ulimit -s 1048576
cd Simulators/Simulator1/bin
export TERM=xterm
mono --server Robust.exe -inifile=Robust.HG.GridUser.ini

StartRobustInventory.sh

#!/bin/sh
ulimit -s 1048576
# next option may improve SGen gc (for opensim only) you may also need to incre$
#export MONO_GC_PARAMS="minor=split,promotion-age=14"
ulimit -s 1048576
cd Simulators/Simulator1/bin
export TERM=xterm
mono --server Robust.exe -inifile=Robust.HG.Inventory.ini

StartRobustMain.ini

#!/bin/sh
ulimit -s 1048576
# next option may improve SGen gc (for opensim only) you may also need to incre$
#export MONO_GC_PARAMS="minor=split,promotion-age=14"
ulimit -s 1048576
cd Simulators/Simulator1/bin
export TERM=xterm
mono --server Robust.exe -inifile=Robust.HG.Main.ini

StartRobustMap.ini

#!/bin/sh
ulimit -s 1048576
# next option may improve SGen gc (for opensim only) you may also need to incre$
#export MONO_GC_PARAMS="minor=split,promotion-age=14"
ulimit -s 1048576
cd Simulators/Simulator1/bin
export TERM=xterm
mono --server Robust.exe -inifile=Robust.HG.Asset.ini

Final Remarks on opensim with multiple robust services on Ubuntu

Thank you for reading Opensim with multiple Robust services on Ubuntu. This article has been written in the hope it is useful. I spent a long time figuring out which services can be separated nicely and which can not. If you know a better way, not only am I personally interested, I encourage you to comment explaining how and why something should change.

Related Posts

Written by Sara Payne

Student of Computer Science at The University Of Hull and small business owner.

This article has 4 comments

  1. Pingback: Setup Ubuntu 20.04 for Opensimulator - Sara Payne's BlogSara Payne's Blog

  2. Pingback: Automated Opensim Startup and Shutdown - Sara Payne's BlogSara Payne's Blog

  3. Pingback: Ubuntu Opensim Server Backup. - Sara Payne's BlogSara Payne's Blog

  4. Pingback: Securing An Opensim Ubuntu Server - Sara Payne's BlogSara Payne's Blog

Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.