Halcyon Bare Metal to Login Tutorial

The following tutorial will enable you to install all the components of a Halcyon Grid with a Web Management Interface. The process can be relatively complex and not taken lightly. However the goal of this tutorial is to make the process as straight forward and as painless as possible. Halcyon doucmentation has never been a strong point, we aim to fix that. There are several ways to install Halcyon and each has it's merits. We are going to focus on a single server installation with master-branch sources. This is not saying that the following process is the only accepted process, it aims to be the least complicated and quickest deployment for a small grid. By it's nature Halcyon, with a few configuration schemes, is very scalable. So this one server installation can be migrated to a larger platform to host medium, large or eventually massive grids.

Media Creation

The first step in the zero to hero setup is configuring the bare metal server. This can be a physical machine or a Virtual Machine on the VMware ESXi or VMWare Workstation/Player platform. These instructions can be modified to support other virtual platforms such as Hyper-V and VirtualBox. Those installs are beyond the scope of this tutorial and your mileage may vary.

For this setup we are going to install Microsft Windows Server 2019 in evaluation mode. The iso can easily be downloaded from the Microsoft Servers here.

MS Evaluation Site

This evaluation iso gives you 180days from install to test, deploy and evaluate your installation. If you are satisified with its performance and setup you can always convert to a paid license through wichever Licensing Outlet you desire.

Once downloaded you can use Rufus to create a bootable DVD or ThumbDrive. (Downloadable here) We'll be using a 16GB ThumbDrive for this installation. Choose your device on the first pulldown, Choose Disk or ISO Image from the second pulldown, then choose SELECT to browse to your download ISO file.

Rufus 1

Rufus 2

Once you choose your ISO, Rufus is ready to write to the ThumbDrive.

Rufus 3

The default settings should suffice for image creation, tweak as you desire. Once all the settings are as you wish them, click on START to begin the write process.

Once you press START, you'll see the progress bar at the bottom begin to fill. The time this takes varies on the speed of your ThumbDrive, Disks and overall system.

Rufus 4
Rufus 5

The process took roughly 10 minutes over a network drive to a 16GB SanDisk Cruzer Glide USB Drive on an Intel i7 PC with 64GB RAM.

Once completed eject your ThumbDrive and load it into your bare metal server. Actual server specs can vary depending on your projected grid size and amount of users. I would suggest the following
Machines with similar specs can be found online from sites such as ebay or refurbished server outlets for a reasonable price.

Server OS Install

Power on and let the system find the source files.

OS Install 1

OS Install 2

OS Install 3

OS Install 4

Besure to select Windows Server 2019 Standard (Desktop Experience)

OS Install 5

Check "I Accept" then click Next

OS Install 6

Choose Custom Install Windows Only (advanced)

OS Install 7

Choose the first 120GB Drive and click New

OS Install 8

Take the default settings and click Apply

OS Install 9

Click OK

OS Install 10

Once the partitions are created on the first drive click NExt. Don't worry about the other drives now, we'll configure them inside the OS.

OS Install 11

Let Windows work, depending on your specs this can be a few minutes or a long wait.

When the file copy is complete you'll be ready for your first restart.

OS Install 13

The machine will go through its paces and may reboot once or twice. Once the process is complete you'll be presented with a Password Creation Dialog. Choose an appropriately secure password and click Finish.

OS Install 14

Now you're at the Lock Screen, Press Control - Alt - Delete to pring up the password prompt.

OS Install 15

Once logged in you'll be presented with the desktop. First a couple of house keeping tasks to make our lives easier.

First we'll click on Local Server in the Server Manager.

OS Config 1

Then on the right side middle click on IE Enhanced Security Configuration.

OS Config 2

Choose the OFF radio button for Administrators then click OK.

OS Config 3

When you are back to the Local Server, click on Computer Name to change the system name to something more appropriate and usable than the default generated name.

Click Change, then under Computer name enter in your desired system name. Here we chose halcyon-grid-1. Click OK Then OK again.

OS Config 4

Once you click through the dialogs you'll be asked to restart the system in order to apply the new changes. Click Restart Now.

OS Config 5

Let the system Restart. Once ready log back in. Right click on the desktop and choose Personalize.

OS Config 6

Click on Themes, then Choose Desktop Icon Settings at the bottom.

OS Config 7

Check all the boxes for Computer, User's Files, Network, Recycle Bin and Control Panel and click OK

OS Config 8

The last step is a matter of personal preference. I found having those icons on the desktop makes for less menu browsing and puts what I need at easy reach.

OS Config 9

Time to configure your Network. Right click on the Networking Icon in the system tray and choose
 Open Network & Internet Settings. In the dialog click on Change Adapter Options

OS Config 10

Right click on your Ethernet Adapter (You are using a wired connection aren't you???) and choose properties. Choose Internet Protocol Version 4 (TCP/IPv4) and click Properties. You can use DHCP is you have relative control of your IP address. Though I reccommend you use a Static IP. Click Use the following IP address and fill in your IP, NetMask and Default Gateway.

eg:  IP:
Subnet mask:
Default Gateway:

Of course these values will be provied by your Hosting Provider. If you're running a development setup on your home network (not advised for production environments) these settings will be found in your Router's configuration.

Choose Use the following DNS server addresses. In the Preferred DNS Server enter and in the Alternate DNS Server enter These are a couple of the Google DNS servers and provide pretty quick and updated DNS resolving. You can of course use your Hosting Provider's DNS settings if you like.

OS Config 11

Click OK and close all the dialogs. If all went well you should be connected to the Internet.

Right click the Windows Start Icon and choose Disk Management from the Menu. Right Click on Disk 1 and choose Online.

OS Config 12

Right click on Disk 1 again and Choose Initialize Disk. Check Disk 1 and choose GPT (GUID Partition Table) then click OK.

OS Config 13

If you have one installed click on the CD-ROM drive and choose Change Drive Letter and Paths. Click Change, then assign a new drive letter beyond you installed Hard Drives. eg: F if you have 3 HDD's.
Click on then Yes. The CD-ROM should now be remapped opening space for the HDD's

OS Config 14

Right click on Disk 1's volume and choose New Simple Volume. Click Next
OS Config 15

Choose the appropriate size for your drive, click Next
OS Config 16

Choose Format this volume with the following settings, NTFS, Default and name it Grid-Data. Click Next.
OS config 18
Click on Finish and your drive will be ready for use as D:\ and named Grid-Data.

OS Config 18

Repeat the above steps for Drive 2. Name it Whip Assets.

This should complete the OS Config.

Application Installation - Suggested Apps

Now we're ready to install the suggested applications. These are optional but will make life much easier.

First we'll start with Firefox. I suggest Firefox because it pretty quick and saves your sessions and bookmarks across devices. Right now anything is better than MS Edge.

Download Firefox

Download, install and configure according to your preferences.

Once Firefox is ready open it and download Notepad++. It's a small but full featured notepad with multi-file support, undo/redo, search/replace syntax formating and many other features. It's a powerhorse compared to plain old MS Notepad.

Download Notepad++

Choose the 64bit installer, Once downloaded, install. You can click through the dialogs accepting all the defaults.

After Notepad++ I suggest SystemExplorer. This utility acts like your Task Manager, but with much more information and shows ALL the running processes. It is also a handy utility to monitor System CPU and RAM usage. You can skip the Security Scan if you wish. It just identifies as many running process as possible and lets you read up on them. I usually Skip. Once installed choose the options and check Set System Explored as Default task manager. This way you get right click access from the taskbar and Control - Alt - Insert keypress.

Download SystemExplorer

The next utility I find I can't live without is CopyQ. CopyQ is a small lightweight clipboard manager. It's hightly configurable and comes in hand when you have a lot of copy and pasting to do. Click through the default dialogs and remember to choose Automatically Start CopyQ.

Download CopyQ

If you host your server offsite, either CoLocation or a hosted Server Provider FileZilla FTP Server is a great way to move files to your server quickly and painlessly. FileZilla Server is pretty straight forward to install and configure. Click through the defaults, start it then configure you Admin Interface password. Choose settings and under General I would advise changing the Port to 2121 or something other than 21. Security through Obscurity will prevent brute force hammering on the default FTP Port. Choose other settings to your liking. I would also highly suggest configuring FTP over TLS support.

WinRar, this program will make unpacking the source files simple and easy and will provide the Unlocking feature that is discussed in the Wiki.

Download WinRar

Application Installation - Required Apps

The next set of apps are required for the successful compliling, installation and running of Halcyon.

Microsoft .Net 4.7.1 Targeting pack. This library is called by the Halcyon build solution. Without it, Halcyon will fail to build. Download, run and accept default settings.

Download MS NDP471-DevPack

Visual Studio Community 2017, it is important that you download VS 2017. VS 2019 does NOT allow Whip to compile correctly. Earlier versions may work, but have not been tested by me.

Download MS VS 2017

Run the install, when the Workloads panel opens up choose .NET desktop development, Desktop developmnet with C++, ASP.net and web development and Python development.

App Install 1

Next choose the Individual Components panel. In that look for and choose .NET Framework 4.7.1 targeting pack, Git for Windows and Visual C++ tools for CMake (if not already slected).

App Install 2

Once those are selected click install. sitback and wait. The process takes a few to complete. Now would be a good time to stretch and get the blood flowing.

App Install 3

Once complete, close Visual Studio then right click on the This PC icon, choose Properties, then Environment Variables at the bottom. Under System variables highlight Path and click Edit.

App Install 4

Click New, in the entry that appears paste the following. C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin
Then click OK Through the 3 dialogs.

App Install 5
That should complete the MS VS 2017 install.

The next app is required to build the Whip Asset Server. Download and install Conan-Win- and install with defaults. Conan also changes the User Path adding C:\Program Files\Conan\conan

Download Conan

Make sure you download the Windows Installer Download x86_64.

We'll need a reboot for the changes in the path to take effect. You can Log Out Then Log In or reboot now.

MySQL Server for Windows. Last required app install before we get to downloading and building source files. Download MySQL from the Oracle site.

Download MySQL

Run the installer. It may tell you there is an Upgrade for the Installer, choose yes.

App Install 6

Accept the License, the choose Custom under Setup Type and click Next.

App Install 7
Under Select PRoducts and Features choose the following:
App Install 8

Click Next, then Execute

App Install 9

If you have any Error and Try Agains, Click Try Again untill all components say Complete.

App Install 10

Choose Standalone Server and click Next

App Install 11

Choose Server Computer from the Pulldown and keep the Defaults, click Next

App Install 11

Choose Legacy Authentication Method, Press Next

Enter in a good Root Password, then click Add User, create the user halcyon as DB Admin with host % and a strong password.
Click Next

App Install 14

Keep the defaults and click Next.

App Install 15

Now click Execute.

App Install 16

Finally click Finish

App Install 17

Click Next then Finish one more time.

MySQL Workbench will start automatically. Check your login to your MySQL Server. If you get an Unsupported Operating System message, you can dismiss it.

Final App Configuration, is a handy hack. For some reason Microsft has decided to remove the "Opem Command Window Here" option from the Context Menu.
This bit of code will restore it. Create a new text document somewhere safe, (eg: Documents or Download Folder). Place the following snippet in the file:
Windows Registry Editor Version 5.00


@="cmd.exe /s /k pushd \"%V\""


@="cmd.exe /s /k pushd \"%V\""


@="cmd.exe /s /k pushd \"%V\""

Name the file "return_cmd_prompt.reg"   Make sure you have Hide Extenstions for Known File Types, turned off.

Double click the newly named file. It will add a registry entry to return the cmd prompt.

App Install 18

App Install 19

Keep the file handy, Microsoft Update likes to undo the feature.

Downloading Halcyon Sources

Next we'll get the source files for Hacyon, Whip and the Setup Tools.

Point your browser to https://github.com/HalcyonGrid

Sources DL 1

The Repositories we are interested in ar halcyon, halcyon-setuptools, abd whip-server. Click on halcyon, Click the green button on the right (Clone or Download) and choose Download Zip.

Sources DL 2

Save the file to your machine.

Click on halcyon-setuptools, Click the green button on the right (Clone or Download) and choose Download Zip.

Sources DL 3

Save the file to your machine.

Click on whip-server, Click the green button on the right (Clone or Download) and choose Download Zip.

Sources DL 4

Save the file to your machine.

Once you save the zip files onto your machine, Using WinRAR you'll need to right click on each one and choose properties and check the Unblock option in the lower right and click OK.

Sources DL 6

Do this for halcyon-master.zip, halcyon-setuptools-master.zip, and whip-server-master.zip

Now we are ready to start extracting the source zip files into their respective folders. Right click each folder in turn and chooser "Extract Here"

This will create the source directories that we will be doing our configuring and compiling.

Compiling Halcyon Binaries

Now here is where we get into the nitty-gritty down and dirty.

The first program we will Compile is Whip. Back where you extracted the source files, Hold the shift key down and Right Click on the whip-server-master folder and
choose Open Command Window Here.

When the Command Window opens type in build.bat and press enter. If we've installed and configured everything correctly up to this point his process will take quite some time.

Compile 1

Once you hit enter you'll see a lot of activity. While it runs now is a good time for another stretch, walk the dog, grab a cuppa, kiss the wife/husband.

Compile 2

After an exhausting period:

Compile 3

If all went well and you're seeing the above window, we should now have a bin directory and in that directory are two files, whip.exe and whip.cfg.sample

Compile 4

Now we want to copy those two files to our Whip Assest drive which we setup as Drive E:/. On Drive E:/ create a directory Whip and into that directory copy the two files.

Compile 5

Rename whip.cfg.sample to whip.cfg and open it in Notepad++. You'll see the following:


Change the following lines:

password = "someting you decided on"


You'll also want to create the assets directory inside of the Whip Directory. Full path would be E:\Whip\assets This is important. If this is done improperly, Whip will not start.

Compile 6

Now that Whip is done we can move onto halcyon-setuptools. This next step is a bit trickier because we have to edit some files before compiling.

Change to the directory halcyon-setuptools-master/Source/hc-databse/sql

Compile 7

Right Click halcyon-core-base.sql and choose Edit with Notepad++

Scroll down until line 338. You should see the following:
/*!50003 CREATE*/ /*!50003 TRIGGER `upd_total_on_new_trans`
AFTER INSERT ON `economy_transaction`
IF (SELECT COUNT(*) FROM economy_totals WHERE user_id = NEW.destAvatarId) = 0 THEN
INSERT IGNORE INTO economy_totals SELECT NEW.destAvatarId, SUM(transactionAmount) FROM economy_transaction WHERE destAvatarID = NEW.destAvatarId;
UPDATE economy_totals SET total = total + NEW.transactionAmount WHERE user_id = NEW.destAvatarId;
END */;;

You want to remove the comment markers so that you get:
CREATE TRIGGER `upd_total_on_new_trans`
AFTER INSERT ON `economy_transaction`
IF (SELECT COUNT(*) FROM economy_totals WHERE user_id = NEW.destAvatarId) = 0 THEN
INSERT IGNORE INTO economy_totals SELECT NEW.destAvatarId, SUM(transactionAmount) FROM economy_transaction WHERE destAvatarID = NEW.destAvatarId;
UPDATE economy_totals SET total = total + NEW.transactionAmount WHERE user_id = NEW.destAvatarId;

Now we want to scroll down to line 661, you'll see
 `binaryBucket` varchar(45) NOT NULL,

Change the 45 to a 256 so you get:

 `binaryBucket` varchar(256) NOT NULL,

Save the file.

Next we want to Right Click halcyon-rdb-base.sql, choose Edit with Notepad++ and scroll down to line 214.

You want to verify that the line reads  `ServerFlags` int(11) NOT NULL DEFAULT '0',

If it does, then we are good to go.

Once those files are edited we are ready yo compile. Navigate back to the halcyon-setuptools-master directory. You'll see the file HalcyonSetuptools.sln.

Double click it and choose Visual Studio 2017.

Make sure you have the Soultion Explorer showing (View Menu/Soultion Explorer or Control-Alt-L). Click on the top of the solution (Soultion 'HalcyonSetuptools' 1 project)

Click on the Build Menu and choose Build Solution.

This process should be pretty quick. You get output like the following:

Compile 8

You'll now have a bin directory with several files in it. You'll see an sql directory, ensure that the halcyon-core-base.sql and the halcyon-rdb-base.sql files are in the sql directory.

You can double check these files for the edits we made above just to be on the safe side.

Now it's time to compile Halcyon itself. Hold the shift key down and Right Click on the halcyon-master directory and choose Open Command Window here. and type runprebuild.bat

Compile 12

You'll get this:

Compile 13

Now navigate into the halcyon-master directory and find Halcyon.sln. Double click it and open in Visual Studio 2017. Select the top of the soultion, select build solution from the build menu.

A sucessful build will produce:

Compile 14

Files were created in the bin folder. Select and copy the bin folder. Also Create the folders 9500 through 9509.

Navigate to the Grid-Data drive (D:\)  and create a directory D:/Grid. Paste the bin directory into this new folder. We'll come back to this folder later.

Compile 15

Enter the bin directory, Select all files and folders. Right Click on the selection and choose Copy.

Config 12

Return to the main D:\Grid directory. Right Click on folder 9500 chose paste. This will move all the guts of the Region server to the working directory.
Repeat this step for each of the region directories.

Config 13

Grid Configuration

So far everything done has been the easy part. This is where we get complicated and in depth. We've compiled our sources, moved our initial directory onto the Grid Drive.
Now we have to create the INI files, shortcuts, batch files and directory structure to support the grid.

NOTE: A lot of the following is credited to Vinhold Starbrook (Bob Curtice). He came up with the directory and files structure that makes it possible to mangae most of the
Halcyon Grid from the MyWorld WebSite source. He has done a massive amount of work that has made getting a working, scalable grid off the ground.

Grid services and Regions are set up to use Region folders for the regions and each region gets its startup info from the grid website.
That is identified in the Region.ini override for Halcyon.ini located in the D:\Grid folder.
Region folder layout:

D:\Grid\bin - for Aperture for now. May become code source for all regions.
D:\Grid\9500 - For region specific data controls. Also has all the code placed there for now.
And so on up to 10 regions.

Using the port numbers assigned to each region is done so the ports used can be easily seen and they dont change when regions get renamed or relocated in the grid.

Region port numbers start at 9500 but must be unique port numbers even when on different physical/virtual servers if the regions can be seen from a viewer or it causes the regions to blank out randomly.
Each Windows region server must have the firewall opened for the actual ports used. eg: 9500-9509

The starting template config files needed for each grid are listed below. Some will be placed in the GridHost folder and most used in the Grid Services installation.
Halcyon.ini is to be placed in the region server D:\Grid folder and the grid services location folder.
The Region.ini is the template for each region to be set up, placed in its folder named by port number.
Aperture.cfg is placed in each Region server in D:/Grid/bin folder.

 Replacement tags and files they are in:
Tag  Files  Comment
%RegionServerIP% Region.ini, MessagingServer_Config.xml Replaced with region server's External IP.
%GridName% Halcyon.ini, UserServer_Config.xml as in "The World Grid".
%DBLocalIP% Halcyon.ini, *_Config.xml MySQL Server internal IP address
%GridDB% Halcyon.ini, *_Config.xml DB name for the grid database. No spaces. eg: mydata
%DBUser% Halcyon.ini, *_Config.xml DB User name for grid access. NOT ROOT!
%DBPass% Halcyon.ini, *_Config.xml DB Connection string that identifies the DB user password.
%ServicesLocalIP% Halcyon.ini, *_Config.xml Internal IP address for the grid services VM
%WhipPass% Halcyon.ini, GridServer_Config.xml, aperture.cfg Whip service password eg: MyhipPass
%WhipLocalIP% Halcyon.ini, GridServer_Config.xml, aperture.cfg whip internal IP ie:
Or both may be replaced at once. ie: %WhipPass%@%WhipLocalIP% to MyWhipPass@
%WebsiteURL% Halcyon.ini, Region.ini, UserServer_Config.xml Website name eg: %WebsiteURL% = http://www.MyWorld.com
%GridLogonURL% Halcyon.ini login URL for the grid
eg: %GridLogonURL% = http://Logon.MyWorld.com, %GridLogonURL%:8002 -> http://Logon.MyWorld.com:8002
%BankUserUUID% Halcyon.ini Bank account UUID or set to nothing. Used only if Economy is set in the website is displayed there
%RegIntIP% Region.ini The region server Internal IP
%port% Region.ini The region server Port for region connection.

This should give you an idea of how to layout your Directories and files.

Config 1

The following files need to be created and placed in their respective locations.

Create a text file iin the D:\Grid directory and name it acl.cmd

Paste the following into the file:
REM Whip Server
netsh http add urlacl url=http://+:32700/ user=%USERNAME%

REM Grid Services
netsh http add urlacl url=http://+:8001/ user=%USERNAME%
netsh http add urlacl url=http://+:8000/ user=%USERNAME%
netsh http add urlacl url=http://+:8002/ user=%USERNAME%
netsh http add urlacl url=http://+:8009/ user=%USERNAME%

REM Region Services (Search, Profile, Map)
netsh http add urlacl url=http://+:9000/ user=%USERNAME%
netsh http add urlacl url=http://+:9001/ user=%USERNAME%

REM Region Instances
netsh http add urlacl url=http://+:9500/ user=%USERNAME%
netsh http add urlacl url=http://+:9501/ user=%USERNAME%
netsh http add urlacl url=http://+:9502/ user=%USERNAME%
netsh http add urlacl url=http://+:9503/ user=%USERNAME%
netsh http add urlacl url=http://+:9504/ user=%USERNAME%
netsh http add urlacl url=http://+:9505/ user=%USERNAME%
netsh http add urlacl url=http://+:9506/ user=%USERNAME%
netsh http add urlacl url=http://+:9507/ user=%USERNAME%
netsh http add urlacl url=http://+:9508/ user=%USERNAME%
netsh http add urlacl url=http://+:9509/ user=%USERNAME%

Save the file, Right Click on it and choose Run As Administrator. This file will create the Access Control Lists that will allow the grid services to be run under
Windows without elevated privileges.

Next up is opening Incoming ports in the Windows Firewall.

Region Server Firewall Ports          
FireWall:  Name Profile Program  Protocol  Local Port
  RegionTCPPorts Private,Public Any  TCP 8000,9500-9509
  RegionUDPPorts Private,Public Any UDP  9500-9509
  WhipServer TCP Private,Public Any TCP  32700
  WhipServer UDP Private,Public Any UDP  32700
Note: port for Aperture=8000.          
Grid Services          
  GridServicesTCP Private Any TCP 8006,8009
  UserServerTCP Private,Public Any TCP 8002
Region Server Firewall Ports - if entire grid is running in one Windows Server:          
  RegionTCPPorts Private,Public Any TCP 8000,8002,9500-9509
  RegionUDPPorts Private,Public Any UDP 9500-9509
  GridServicesTCP Private Any  TCP 8006,8009
Note: port for Aperture=8000          

To set these port openings up, Right Click on the Network Icon in the System Tray. Choose Open Network & Internet Settings. On the settings page click on Windows Firewall.

Config 2

Next click on Advanced Settings

Config 3

Then click on Inbound Rules

Config 4

Click on New Rule

Config 5

Choose Port then click Next

Config 6

Choose TCP and Specific Local Ports, enter 8000,9500-9509

Config 7

Choose allow the Connection

Config 8

Check Private and Public

Config 9

Name the Rule and optionally give a description

Config 10

Click Finish. Repeat the process for the rest of the ports from the chart above.

Create the Halcyon.ini file.

; Inventory process detects whip or cassadra installations.
; Which inventory plugin dll to load? Default and currently the only option is
; Halcyon.Data.Inventory.MySQL.dll
inventory_plugin = "Halcyon.Data.Inventory.MySQL.dll"

; Connection string for the user inventory plugin.
; Defaults to the value of Startup/core_connection_string
inventory_connection_string = "Data Source=localhost;Database=halcyon;User ID=halcyon;password=ReallySecurePassword;Pooling=True;Min Pool Size=0;"
migration_active = true

; Per-simulator external services and features. They don't have to be unique per simulator, but they can be.
; If you are looking for the web-based profile server URI,
; profile_server_uri, please edit the UserServer_Config.xml file.

; Server that hosts the map tiles.
; Grid-wide setting held in the UserServer_Config.xml file.
MapImageServerURI = "https://world.mydomain.com/map.aspx"
; Server that hosts the pages used for the search server.
SearchServerURI = "" ;"http://localhost:9000/"
; Are mesh-based objects allowed on this region?
MeshEnabled = true
PhysicsMaterialsEnabled = true

AllowMeshUpload = true

; NOTE: This requires contacting Vivox and putting in an application.
; Apply for Vivox at http://support.vivox.com/opensim/ for your account.
; See listed terms there.

enabled = true

; vivox voice server
vivox_server = www.osp.vivox.com

; vivox SIP URI
vivox_sip_uri = osp.vivox.com

; vivox admin user name
vivox_admin_user =

; vivox admin password
vivox_admin_password =

; Set this to true if you want to log crashes to disk
; this can be useful when submitting bug reports.
save_crashes = true

; Directory to save crashes to if above is enabled
; (eg default is /opensimdir/crashes/*.txt or C:\opensim\crashes\*.txt)
crash_dir = "crashes"

; Path for where to create a PID file. Default is to not create one.
; PIDFile = "/tmp/my.pid"

; Http proxy support for llHTTPRequest and dynamic texture loading
; Set HttpProxy to the URL for your proxy server if you would like
; to proxy llHTTPRequests through a firewall
; HttpProxy = "http://proxy.com"
; Set HttpProxyExceptions to a list of regular expressions for
; URLs that you don't want going through the proxy such as servers
; inside your firewall, separate patterns with a ';'
; HttpProxyExceptions = ".mydomain.com;localhost"

; Set this to true if you are connecting your Halcyon regions to a grid
; Set this to false if you are running Halcyon in standalone mode
gridmode = true

; This specifies what form of control console the region will support.
; Options are:
; "local" - the default when Halcyon is running as a background process,
; this console is display-only without color.
; "basic" - the default when Halcyon is run as a foreground process, this
; console has a full command line for administering and controlling
; various aspects of the region from the terminal window.
; "rest" - a RESTful API configured in the [Network] section of this file.
; Swagger specification and more can be found in the doc folder of the
; source code tree.
;console = "basic"

; Path to a text file that contains single-line commands as they would be
; entered on the Halcyon console.
; If you have a series of commands you need to execute at startup or on
; shutdown, these files are where to put them.
startup_console_commands_file = "startup_commands.txt"
shutdown_console_commands_file = "shutdown_commands.txt"

; To run a script every few minutes, set the script filename here
; timer_Script = "filename"
; timer_Script = "disabled"

; ##
; ## REGIONS NOTE: This section is overridden with the contents of Region.ini for each region.
; ##

; Where to load the region information from.
; Options: webserver - web server url for region xml data. region_webserver_url must be set up.
; filesystem - local path to Regions folder for region xml files to load.
; regionload_regionsdir may be set up.
;region_info_source = "filesystem"
; The URL of the source for the region(s) this instance of Halcyon is responsible for.
; Note that the returned XML's root element must be a <Regions> tag
; containing <Root> tags containing <Config> tags that have the relevant
; attributes set.
; For more information about the attributes, please see
; [the documentation we need to write].
;regionload_webserver_url = "http://example.com:8087/path/file.ext"
; specified path to Region xml files when region_info_source = "filesystem".
; default is "Regions" indicating the foloder where the region xml files are.
; May be set to an alternate path to load regions. (May be specified in an overide ini file)
;regionload_regionsdir = "Regions"
; NOTE: These are set in the Regions.ini override file in each instance folder by port number as the folder name.

; Draw objects on maptile. This step might take a long time if you've got a huge amount of
; objects, so you can turn it off here if you'd like.
DrawPrimOnMapTile = true
; Use terrain texture for maptiles if true, use shaded green if false
TextureOnMapTile = true

; Maximum scale on any axis of any prim.
NonPhysicalPrimMax = 256
; Maximum scale on any axis that a physical prim can be.
PhysicalPrimMax = 10
; Enforce the above rules? (BUG: On a casual review these three rules
; don't seem to be consistently enforced.)
ClampPrimSize = false

; ##
; ##

; *** Prim Storage - only leave one storage_plugin uncommented ***
; "OpenSim.Data.Null.dll" stores nothing, effectively disabling persistence:
; "OpenSim.Data.MySQL.dll" backup region prims to MySQL.
; To use MySQL storage, supply your own *_connection_string (this is only an example):
; note that the supplied account needs create privileges if you want it to auto-create needed tables.
; Used for the estate_connection_string if such is not handled separately,
; and primarily for a lot of per-region information.
storage_connection_string="Data Source=localhost;Database=halcyon;User ID=halcyon;password=ReallySecurePassword";

; Asset system in use
asset_database = "whip"

; Backing up to the region datastore of changed objects, aka persistence,
; happens during regular sweeps. The following control that behavior to
; prevent frequently changing objects from heavily loading the region data store.
; If both of these values are set to zero then persistence of all changed
; objects will happen on every sweep.

; Objects will be considered for backup to persistent data storage in the
; next sweep when they have not changed for this number of seconds.
MinimumTimeBeforePersistenceConsidered = 60
; Objects will always be considered for persistence in the next sweep if the
; first change occurred this number of seconds ago
MaximumTimeBeforePersistenceConsidered = 600

; ##
; ##

; If you would like to allow prims to be physical and move by physics with
; the physical checkbox in the client set this to true, which is also the
; default.
physical_prim = true

; Choose one of the physics engines below
;physics = basicphysics
physics = InWorldz.PhysxPhysics

; ##
; ##

; Choose one of the permissions modules below.
; Only the "DefaultPermissionsModule" exists at this time and is default.
permissionmodules = "DefaultPermissionsModule"

; If set to false, then, in theory, the server never carries out permission checks (allowing anybody to copy
; any item, etc.) This may not yet be implemented uniformally.
; If set to true, then all permissions checks are carried out
; Default is false
serverside_object_permissions = true

; Do you wish to have users that can bypass the permissions system?
allow_grid_gods = true

; Do you have an aperture texture/mesh server set up?
; For more information about aperture, see https://github.com/InWorldz/aperture
use_aperture_server = yes
; Port to connect to on the aperture server. Aperture is assumed to be
; running on localhost.
aperture_server_port = 8000
; Must match the caps_token stanza in aperture.cfg on the aperture server.
aperture_server_caps_token = 2960079

; Connection string for the legacy MySQL user inventory system and too many
; other things as well...
core_connection_string = "Data Source=localhost;Database=halcyon;User ID=halcyon;password=ReallySecurePassword;"
; Region Database connection string used for lookups from Places Search
; along with parcel lookup from Places Search. Note that the actual server
; Data Source part is automatically added based on the host_name column
; from the RdbHosts table as found on Cassandra or the
; Inventory/legacy_inventory_source server.
;rdb_connection_template = "Data Source={0};Database=inworldz;User ID=root;Pooling=True;Min Pool Size=0;"

; This has to do with scripting in the old process, not the actual email processing.
; Has been disabled.


; {{lslinbound_db_connect}}

; Which inter-region communications module do you wish to use?
; "RESTComms" (Allows communications between all regions.)
; "LocalComms" (Limits all communications to only those regions running on the same Halcyon instance.)
;InterregionComms = "LocalComms"
InterregionComms = "RESTComms"

; This is the block used to configure a region that is going to connect to
; a grid, aka when gridmode = true

;http_listener_port = 9500 ; Set to region port overridden in Region.ini.
default_location_x = 1000
default_location_y = 1000
; Domain name or IP for the region server setup.
hostname = world.mydomain.com

; ssl config: Experimental! The auto https config only really works definately on windows XP now
; you need a Cert Request/Signed pair installed in the MY store with the CN specified below
; you can use https on other platforms, but you'll need to configure the httpapi yourself for now
http_listener_ssl = false ; Also create a SSL server
http_listener_cn = "localhost" ; Use the cert with the common name
http_listener_sslport = 9001 ; Use this port for SSL connections
http_listener_ssl_cert = "" ; Currently unused, but will be used for OSHttpServer

; The URL and access keys for the grid server: OpenSim.Grid.GridServer.exe
grid_server_url = "http://localhost:8006"
grid_send_key = "12charKeyCod"
grid_recv_key = "12charKeyCod"

; The URL and access keys for the user server: OpenSim.Grid.UserServer.exe
user_server_url = "http://localhost:8002"
user_send_key = "12charKeyCod"
user_recv_key = "12charKeyCod"

; The URL for the asset server, usually a WHIP server.
; See https://github.com/InWorldz/whip-server
asset_server_url = "whip://changeme@localhost:32700"

; The MessagingServer is a companion of the UserServer. It uses
; user_send_key and user_recv_key, too
messaging_server_url = "http://localhost:8009"

; What is reported as the "X-Secondlife-Shard"
; Defaults to the user server url if not set
; The old default is "OpenSim", set here for compatibility
shard = "NeatoGrid"

; What is reported as the "User-Agent" when using llHTTPRequest
; Defaults to not sent if not set here. See the notes section in the wiki at
; http://wiki.secondlife.com/wiki/LlHTTPRequest for comments on adding
; " (Mozilla Compatible)" to the text where there are problems with a web server
;user_agent = "Halcyon LSL (Mozilla Compatible)"

; Path to public key for verifying JWTs used for remote administration tools.
; The default is empty, though a common value is "./server.crt" as is
; documented in "doc/JWT Authentication/CreatingSelfSignedCert.txt"
;SSLCertFile = ""

; these entries provide port and IP blocking / black lists to prevent scripts from accessing the region servers and
; using that to make region changes that only the SysAdmin is to access. Like changing another user's password!

;HostBlacklist = ",20.0.0.*,google.com"
HostBlacklist = ""
; For each region port in this region server!
;PortBlacklist = "8010,8020"
PortBlacklist = ""
;HostnameAndPortBlacklist = "192.168.1.*:80,yahoo.com:1234"

; Controls whether the chat module is enabled. Default is true.
enabled = true;

; Distance in meters that whispers should travel. Default is 10m
whisper_distance = 4

; Distance in meters that ordinary chat should travel. Default is 30m
say_distance = 30

; Distance in meters that shouts should travel. Default is 100m
shout_distance = 100

; Control which region module is used for instant messaging.
; Default is InstantMessageModule (this is the name of the core IM module as well as the setting)
InstantMessageModule = InstantMessageModule
MessageTransferModule = MessageTransferModule
OfflineMessageModule = OfflineMessageModule
OfflineMessageURL = https://world.mydomain.com/offline.aspx
MuteListModule = MuteListModule
MuteListURL = https://world.mydomain.com/mute.aspx

; number of wall clock hours for an simulated day. 24.0 would mean realtime
day_length = 24
; Year length in days
year_length = 365
; Day to Night Ratio
day_night_offset = 0.45
; send a Sun update every update_interval # of frames. A lower number will
; make for smoother sun transition at the cost of network
update_interval = 50

; Enables the wind module. Default is true
enabled = true

; How often should wind be updated, as a function of world frames. Approximately 50 frames a second
wind_update_rate = 30

; The Default Wind Plugin to load
wind_plugin = ZephyrWind

; These settings are specific to the ConfigurableWind plugin
; To use ConfigurableWind as the default, simply change wind_plugin to ConfigurableWind and uncomment the following.
; avg_strength = 5.0
; avg_direction = 0.0
; var_strength = 0.0
; var_direction = 0.0
; rate_change = 1.0

; This setting is specific to the SimpleRandomWind plugin
; Adjusts wind strength. 0.0 = no wind, 1.0 = normal wind. Default is 1.0
strength = 4.0

; Enable this to generate classic particle clouds above the sim.
; default is disabled - turn it on here
enabled = true

; Density of cloud cover 0.0 to 1.0 Defult 0.5
density = 0.5

; update interval for the cloud cover data returned by llCloud().
; default is 1000
cloud_update_rate = 1000

; These economy values get used in the BetaGridLikeMoneyModule. - This module is for demonstration only -
; In grid mode, use this currency XMLRPC server. Leave blank for normal functionality
CurrencyServer = "https://world.mydomain.com/currency.aspx"

; Set the currency Symbol override default is "I'z$"
CurrencySymbol = "G$"

; Economy specific MySQL DB Connection string. May point to a different DB than the grid DB.
EconomyConnString = "Data Source=localhost;Database=halcyon;User ID=halcyon;password=ReallySecurePassword;"

; In grid mode, this is the land XMLRPC server. Leave blank for normal functionality
; This points to only the path for LandTool.php which is hard coded in the viewer.
; To use a different page, it has to have a URL rewrite in IIS set up. This is combined with the
; [GridInfo] Economy path entry. 6/10/2016
LandServer = "LandTool.aspx"

; 45000 is the highest value that the sim could possibly report because of protocol constraints
ObjectCapacity = 30000

; Money Unit fee to upload textures, animations etc
PriceUpload = 0

; Money Unit fee to create groups
PriceGroupCreate = 10

; This is the account Money goes to for fees. Remember, economy requires that money circulates somewhere... even if it's an upload fee
CurrencyAccount = 51ccfc64-9099-4d60-8376-e8f25befa520

; This is the type of user that will pay fees.
; Set this to 2 for users, estate managers and Estate Owners
; Set this to 1 for Users and Estate Managers
; Set this to 0 for Users only.
; -1 disables
UserLevelPaysFees = 2

; Amount to give to user as a stipend
UserStipend = 0

; When a user gets low on money units and logs off, then logs back on, issue a new stipend if they have less money units then this
; amount. Be aware that the account money isn't stored anywhere so users will get a stipend if you restart the simulator
IssueStipendWhenClientIsBelowAmount = 0

; If this is true, the simulator will remember account balances until the simulator is shutdown or restarted.
KeepMoneyAcrossLogins = true

; We don't really know what the rest of these values do. These get sent to the client
; These taken from Agni at a Public Telehub. Change at your own risk.
;ObjectCount = 0
;PriceEnergyUnit = 100
;PriceObjectClaim = 10
;PricePublicObjectDecay = 4
;PricePublicObjectDelete = 4
;PriceParcelClaim = 1
;PriceParcelClaimFactor = 1

;PriceRentLight = 5
;TeleportMinPrice = 2
;TeleportPriceExponent = 2
;EnergyEfficiency = 1
;PriceObjectRent = 1
;PriceObjectScaleFactor = 10
;PriceParcelRent = 1

; These settings are used to return information on a get_grid_info call.
; Client launcher scripts and third-party clients make use of this to
; autoconfigure the client and to provide a nice user experience. If you
; want to facilitate that, you should configure the settings here according
; to your grid or standalone setup.
; See http://opensimulator.org/wiki/GridInfo

; uri: for grid this is the user server URI
login = http://world.mydomain.com:8002

; long grid name: the long name of your grid
gridname = "Neato Grid"

; short grid name: the short name of your grid
gridnick = "NeatoGrid"

; login page: optional: if it exists it will be used to tell the client to use
; this as splash page
welcome = https://world.mydomain.com/Viewer.aspx

; helper uri: optional: if it exists if will be used to tell the client to use
; this for all economy related things
;economy =
; Sets the path for the currency.php and landtool.php pages.
economy = https://world.mydomain.com/

; web page of grid: optional: page providing further information about your grid
about = https://world.mydomain.com/Default.aspx

; account creation: optional: page providing further information about obtaining
; a user account on your grid
register = https://world.mydomain.com/Register.aspx

; help: optional: page providing further assistance for users of your grid
help = https://world.mydomain.com/FAQ.aspx

; password help: optional: page providing password assistance for users of your grid
password = https://world.mydomain.com/ResetPass.aspx

; Base URL to a map display and teleport link provider.
; This gets automatically appended with the region name and the X, Y, and Z
; integer values of the location of interest, separated by "/" like a path.
; EG: http://places.inworldz.com/IDI/128/128/4096
; MUST end with a forward slash.
slurl_base = "http://world.mydomain.com:8002/"

; Enable this to allow the tree module to manage your sim trees, including growing, reproducing and dying
; default is false
active_trees = false

; Density of tree population
tree_density = 1000.0

Enabled = true

; This is the current groups stub in Region.CoreModules.Avatar.Groups
;Module = Default

; The XmlRpcGroups implementation can be used against the publically available service
; that I have made available for testing. Your group data is not guarenteed safe
; or available if you use this service, but it's available now and seems to work.
; The PHP code for the service is available for you to deploy to your own server.
Module = FlexiGroups
Provider = Native
NativeProviderDBType = MySQL
NativeProviderConnString = "Data Source=localhost;Database=halcyon;User ID=halcyon;password=ReallySecurePassword;"

; This makes the XmlRpcGroups modules very chatty on the console.
XmlRpcDebugEnabled = false

ProfileConnString = "Data Source=localhost;Database=halcyon;User ID=halcyon;password=ReallySecurePassword;"

; Choose one
AssetServices = "LocalAssetServicesConnector"
UserServices = "LocalUserServicesConnector"

use_visual_debugger = true
use_ccd = true

Enabled = false
Debug = false
;Backend = Cassandra12Backend
;SeedNode1 =

Enabled = false
GuestRegionName = ""

; Allows the chat server to **** out words that are listed in
; wordfilterDictionary.txt
Enabled = false

Enabled = false

; Activates the world map module if set to "WorldMap", left blank, or disabled/removed.
;WorldMapModule = "WorldMap"

; Specifies the location to write the map tile to when updated. The optional
; values {X} and {Y} are replaced by the x and y coordinates, respectively,
; of the region.
; This is a good tool to feed map changes to an image processor to feed a
; web server for the world map tiles.
; If blank or removed no file will be written.
;RegionMapTileExportFilename = "somepath/map-1-{X}-{Y}-objects.jpg"

; Draw objects on maptile. This step might take a long time if you've got a huge amount of
; objects, so you can turn it off here if you'd like. Default is true.
;DrawPrimOnMapTile = true

; Use terrain texture for maptiles if true, use shaded green if false. Default is false.
;TextureOnMapTile = false

; The minimum amount of time in seconds required to pass before the next automatic write of
; a map tile file to the server. Keeps the file from being constantly written to in busy
; situations. Limited to 60 seconds or longer to help prevent resource exhaustion and to
; keep CPU usage down.
; Default is 3600 seconds, which is one hour.
;MinimumTaintedMapTileWaitTime = 3600

; Used to make sure the map tile file gets updated after a maximum amount of time, in
; seconds, if it has been changed. Useful if MinimumTaintedMapTileWaitTime is non-zero as
; it makes sure that if the tile has been changed, but the minimum wait time hadn't been
; met during those changes, that the file actually gets written. A time of 0 seconds means
; that this is disabled. Automatically disabled if RegionMapTileExportFilename is not set.
; Default is 0 seconds.
MaximumTaintedMapTileWaitTime = 3600 ; 86400 seconds = 24 hours.

; cloudfiles and cloud assets support
Enabled = true
CFSupport = false
LegacySupport = true
WhipURL = "whip://changeme@localhost:32700"
WriteTarget = "whip"

Copy the Halcyon.ini file into D:\Grid and into D:\Grid\bin

Create the Region.ini files.


; Determine where to load the region information from.
; Defaults to "filesystem" if this setting isn't present
; Options: webserver - web server url for region xml data. regionload_webserver_url must be set up.
; filesystem - local path to Regions folder for region xml files to load.
; regionload_regionsdir may be set up.
region_info_source = "webserver"

; specified path to Region xml files when region_info_source = "filesystem".
; default is "Regions" indicating the folder where the region xml files are.
; May be set to an alternate path to load regions. (May be specified in an overide ini file)
;regionload_regionsdir = "Regions"

; URL to web service to get the region xml data. Any selector can be sent to the service to indicate what is to be returned.
regionload_webserver_url = "world.mydomain.com/Regxml.aspx?Region="

http_listener_port = 9500 ; Set to region port

Replace world.mydomain.com with your Grid domain and with your server's internal IP.

Change the port numbers to correspond with the directory name the file is being placed into.
eg: 9500 for directory 9500
     9501 for directory 9501

Copy a Region.ini into each of the Region directories. Making sure you've edited the file to correspond to the directory you're copying it into.

Create aperture.cfg
http_listen_port = 8000
caps_token = 2960079
whip_url = whip://changeme@localhost:32700
cache_size = 10485760
debug = 0

Place a copy into each of the region directories and into the bin directory.

Configure Grid Services XML config files:

<Config default_startup_message="Welcome to The Neato Grid!"
database_connect="Data Source=localhost;Database=halcyon;User ID=halcyon;password=ReallySecurePassword"
library_name="World Library"
ssl_public_certificate="" />

database_connect="Data Source=localhost;Database=halcyon;User ID=halcyon;password=ReallySecurePassword"
ssl_public_certificate="" />

database_connect="Data Source=localhost;Database=halcyon;User ID=halcyon;password=ReallySecurePassword"
ssl_public_certificate="" />

trustednetworks.txt - This file is used by the grid services and the region instances to identify who they may accept information from.
<yourIPPattern> = your IP address first three sets. ie. 255.255.231. The 10.0. is to identify the internal network IP pattern.

defaultlogins.txt - used by grid services to set default login landing spots if it exists. Set to regionname for the landing points to be used

defaultregions.txt - This defines where someone without a home will land on logon

Place each of these files into the D:\Grid\bin directory.

Grid Services and Region Startup files

Halcyon.bat - File used with Shortcuts to start each region
@Echo off
:Halcyon Control Batch Program
Halcyon.exe %*
@echo Error %errorlevel%

:ErrorLevels 0=sim called restart, 1=Region Crashed, 63=Console Restart given, 64=Console shutdown
if ERRORLEVEL 64 goto End
goto loop


Shortcut files - Standard Windows shortcuts configured to start each region with required parameters
Region Icon Properties:
Target: D:\Grid\Halcyon.bat --inimaster=..\Halcyon.ini --inifile=Region.ini
Start in: D:\Grid\9500

Target: D:\Grid\Halcyon.bat --inimaster=..\Halcyon.ini --inifile=Region.ini
Start in: D:\Grid\9501

Target: D:\Grid\Halcyon.bat --inimaster=..\Halcyon.ini --inifile=Region.ini
Start in: D:\Grid\9502

Target: D:\Grid\Halcyon.bat --inimaster=..\Halcyon.ini --inifile=Region.ini
Start in: D:\Grid\9503

Target: D:\Grid\Halcyon.bat --inimaster=..\Halcyon.ini --inifile=Region.ini
Start in: D:\Grid\9504

Config 11

Place these shortcuts in D:\Grid\Shortcuts

Grid Services shortcuts One each for Whip, User, Grid, Messaging and Aperture Servers.

Shortcut  Icon Properties:

Whip Server
Start in: E:\Whip

User Server
Start in D:\Grid\bin

Grid Server
User Server
Start in D:\Grid\bin

Messaging Server
Start in D:\Grid\bin

Aperture Server
Start in D:\Grid\bin

One-Shot Grid Start batch file - REM out Regions that won't be started until needed.
start "" "D:\Grid\Whip Server.lnk"
start "" "D:\Grid\User Server.lnk"
start "" "D:\Grid\Grid Server.lnk"
start "" "D:\Grid\Messaging Server.lnk"
start "" "D:\Grid\Aperture Server.lnk"
start "" "D:\Grid\Shortcuts\9500.lnk"
REM start "" "D:\Grid\Shortcuts\9501.lnk"
REM start "" "D:\Grid\Shortcuts\9502.lnk"
REM start "" "D:\Grid\Shortcuts\9503.lnk"
REM start "" "D:\Grid\Shortcuts\9504.lnk"
REM start "" "D:\Grid\Shortcuts\9505.lnk"
REM start "" "D:\Grid\Shortcuts\9506.lnk"
REM start "" "D:\Grid\Shortcuts\9507.lnk"
REM start "" "D:\Grid\Shortcuts\9508.lnk"
REM start "" "D:\Grid\Shortcuts\9509.lnk"

Place these files in D:\Grid - Each Grid Service can be called via the icon or the entire grid and regions can be started with a single Double-Click using Start-Grid.bat

Configure the Database

Halcyon DB creation utility:

Navigate to the halycon-setuptools-master directory, hold shift and right click on bin and choose Open Command Window Here, enter

hc-database --init --type=both --host=localhost --schema=halcyon --user=root --password=<rootpass>

to create the grid database.

DB Config 1

Upon Successful creation you will be dropped back to the command prompt. Verify with MySQL Workbench.

MyWorld Web Managemnet Interface

Now things get really tricky. We need to install an IIS Server to serve the web Management Interface and the RegionXML calls to start the regions.

We'll start by going to the Server Manager and clicking Add Roles and Features.

IIS Config 1

Click Next

IIS Config 2

Choose Role-based or feature-based installation and click Next

IIS Config 3

Select the Destination Server and click Next

IIS Config 4

Check the box for Web Server (IIS) and click Next

IIS Config 5

Choose any additional Features you may need the click Next

IIS Config 6

Click Next

IIS Config 7

Choose your needed features, also ensuring that .NET Extensibility 4.7, ASP and ASP.net 4.7 are selected. Click Next

IIS Config 8

Click Install and wait.

IIS config 9

Let it run, go grab another cuppa, use the loo if you need to.

IIS Config 10

When it is done click Close.

IIS Config 11

Now that IIS is sucessfully installed we can begin to setup our Website. Back to the Server Manager we go. Under Tools select Internet Information (IIS) Manager.

IIS Config 12

Once IIS Manager loads we need to install a couple of components for your website to work.

Click on Get New Web Platform Components in the right hand Actions Pane.

IIS Config 13

A browser window will open up, Click the green Install This Extension button.

IIS Config 14

Save the extension to your machine.

IIS Config 15

Locate the file you just downloaded and Double Click to install.

IIS Config 16

Accept the Terms and Click Install. Let the installer run, once Complete Click Finish.

IIS Config 17

Close and reopen IIS Manager to activate the extension. Double Click the Orange Web Platform Installer Icon.

IIS Config 18

Let the Installer initialize.

IIS Config 19

Once in the WPI we want to do a search for URL Rewrite. Type URL Rewrite into the search box and press Enter.

IIS Config 20
You should get a hit for URL Rewrite 2.1. Click on Add, Then Install at the bottom.

IIS Config 21

Accept the Terms

IIS Config 22
Let the installer do its thing.

IIS Config 23
Once it is done Click Finish.

IIS Config 24
Exit out of the WPI and close IIS Manager. Wait a second then reopen IIS Manager.

You should now see a URL Rewrite Icon.

IIS config 25

Next step is to create the actual Website container. Right click on Sites in the connections pane. Select Add Website.

IIS Config 26

In the following dialog is where we setup the details for our Website. We're using world.mydomain.com since we have a Hosts file entry on our system. Doing so the website will
only work on the local machine for testing purposes. It is advised that you have a domain name setup, whether it be a full blown .com or a DynamicIP domain. Just as long as it's
 reachable from outside your internal network. I suggest keeping your Website directory within the default IIS directory structure to avoid permissions issues. Once you have all
 the information entered Click OK.

IIS Config 27
You should now see an entry for your newly created website. Providing you have DNS and Your Domain setup you should now be able to access the site from a web broswer.
Though at this point you'll more than likely get a 403 - Forbidden error since we have no documents in the site yet. Hold on to your hats, that's coming next.

IIS Config 29

We need to be sure the IIS Server can talk to the MySQL server so we need to install a MySQL connector. Navigate to https://dev.mysql.com/downloads/connector/net/ where we'll download
the connector. Click on  the blue Download button for the Windows (x86, 32-bit), MSI Installer.

IIS Config 30

Click on the No thanks, just start my download link. Your download should begin. Save the file to your local machine.

Navigate to the downloaded file, double click it to start the installer. Click Next to start the install.

IIS Config 31

Once the installer runs click Finish. IF you get a message that the connector is already installed you can safely exit the installer. Or if you want to be extra
sure the connector is installed you can click Repair.

Next we'll set up SSL for our IIS Server. We'll be using the Let's Encrypt SSL system to do this. It's free and easy to setup. Open a browser and navigate to


We want to click on the releases tab to download the latest version.

IIS Config 32

Once on the releases tab go to the latest release and download the standalone file for your server. At the time of this writing it is win-acme.v2.0.6.277.zip.
Save the file to your local machine.

IIS Config 33

Locate the downloaded file and extract it to its own directory. Inside this directory you'll see the files needed for the Let Encrypt system. Double click the wacs.exe file.

IIS Config 34

This will bring up the WinAcme interface. We want to choose N: Create new certificate. Press the N key to continue.

IIS config 35

Next we'll choose 1: Single binding of an IIS site.  Press 1 to continue.

IIS Config 36

Choose the site you created, in our case it 1: world.mydomain.com. Press the corresponding number to continue. Again if you have a world reachable domain setup
WinAcme will install and register the necessary certificates and configs to enable SSL on your site. If this is your first run you'll need to enter an email address for the certificate.

IIS Config 37

Next you'll have the option to read the Terms of Service, you can hit N to continue unless you really want to read the TOS. Next agree to the TOS, press Y to continue.

IIS Config 38

Once the script completes you'll brought to the main menu. If all went well and you see no errors you can now press Q to quit. If you see red errors you'll need
to solve them before SSL is setup. Most issues have to do with DNS resolving your domain name. Troubleshooting is beyond the scope of this document. Use you
Google Fu skills.

You should now be able to browse to your site using the https protocol.

Now we should be all set with IIS.

Download MyWorld Sources

Now we'll get our website source files. The web interface is an actively developed Management Portal for the Halcyon Software developed and written by Vinhold Starbrook (Bob Curtice) of the Discover Creo Mundos Grid. Being that this is an actively developed set of files be aware that some errors may exist as the source is developed, features added and the code evolves. Open a Borswer and navigate to the My World Website Toolkit. Read thhrough the site and eventually get down to the Download Links.

My World 1

What we're mainly here for are the links at the bottom. We want the first two links at this time, MyWorldDocs and MyWorldWebsite. Save each package to your local machine.

My World 2

Once you have the files on your machine right click on the zips and choose Unblock. Then extract them to a working directory.

Navigate into the MyWorldWebsiteV0.9.4 directory. We are going to use Notepad++ to personalize a few items in the pages to your Grid.

My World 3

Open Notepad++, choose Search / Find in Files. We're going to use search and replace to replace the default settings to your grid settings.

My World 4

The first thing we want to Search and Replace is the http://MyWorld.com references. In the Find What box enter http://MyWorld.com

In the Replace with box enter your website url. eg: http://world.mydomain.com

Then click replace in files. A confirmation dialog will appear. choose OK

My World 5

If there were any matches they'll now be overwritten with your URL.

NOTE: As of this writing the code has evolved that this step should no longer be necessary.

Next we'll search for instances of "My World" in order to personalize the site to your grid. Enter in your Grid Name and press Replace in files.
Confirm the operation by pressing OK

My World 6

Once run you'll see the number of replacements in Blue.

My World 7

Next we'll search for the default admin email. You can choose to keep director@ if you have that entity in your mail server.
Otherwise replace director@ with your admin entity. In this case we'll choose to replace director@ with admin@. Press
replace in files, then confirm the operation by pressing OK.

My World 8

When it's done you'll see the number of replacements in blue.

My World 9

NOTE: The website has four email addresses defined, the first three need to be set up in your email server - director, mailer, support and autoresponse.
Autoresponse is not intended to be responded to, but may be set up with a redirect to capture any mistaken responses. Set up your email server
with the appropriate addresses or replace the entries in the website with your email entities.

Replace the /Images/Site/Header.jpg with your own graphic, if you intend to use one. May require change in the /Styles/Site.css for the entry. Graphic is commented out by default.

Viewer splash page uses the /Images/Site/Backgrounds/*.png as the background images to show if there are any. You may place as many images here as you like, they will be
randomly displayed on the viewer page for your world. Create your site favicon.ico see https://www.w3.org/2005/10/howto-favicon for more information.

Update the Web.Config file connection strings to the grid and website DB connections. The two connections are for MyData - The grid database, and MySite - the Website
database. Keep the name handles the same and only change the actual database names if they are intentionally different. Otherwise you will have to also change every instance
of "MyData" and "MySite" in every page in the site and the Template pages for Visual Studio. Also change the User ID and password in the connection strings in Web.Config.

This step can be tricky. Vinhold's development environment variables can be different than the variables of our configured server. These can be a few gotchas that will keep
your site from working properly.

Open Web.Config and search for the following line <add assembly="MySql.Data, Version=, Culture=neutral, PublicKeyToken=C5687FC88969C44D"/>

You'll want to replace the version of the MySql.Data with the version of what is currently installed on your server. In our case it is Version to find out which version of the
connector you are running navigate to C:\Program Files\MySQL\MySQL Server 8.0, holding the shift key Right Click on bin and choose Open Command Window here.

In the command window type mysql --version

You'll see the Version after Ver. In our case it was

My World 10

Make the change in your Web.Config

My World 11

One thing that will help us in troubleshooting errors is placing <httpErrors errorMode="Detailed" /> in your Web.Config.

This is placed near the bottom on the line above </system.webserver>

My World 12

Next we'll set the connection strings for our databases.

Replace the Data Source with your configured IP, Database with the name of your database, User ID with your database user id and password with your database password.

My World 13

To make our lives easier we'll add the URL Rewrite no in Web.Config. This will allow the Viewer hard coded landtool.php to find our landtool.apsx to make land sales possible in world.

Place the following just above </system.webserver>
<rule name="LandTool.php_To_LandTool.aspx" stopProcessing="true">
<match url="^LandTool.php" />
<action type="Redirect" url="LandTool.aspx" redirectType="Temporary" />

My World 14

Save your Web.Config file.

Now it's time to move the files over to the IIS directory. Navigate to your working directory, select all files by pressing Control-A, Right click on the
selection and choose Copy.

My World 15

Now navigate to your Website directory and chose paste.

My World 16

Just a few more steps to go before we can navigate to our site.

Navigate to the wwwroot directory of you IIS server Right Click on your website's directory and choose Properties.

On the Security tab find IIS_IUSRS in the Group or user names box.

Highlight it, then click edit.

My World 17

Highlight IIS_IUSRS in the Groups or user name box, then check Allow for Full Control. Click OK. Then Click OK again.

My World 18

This will give the IIS user account full control to the website directory. Need in order to manage files such as logs and FirstConfig files.

Before we can Use our Website we need to create the MySite database. In the MyWorldDocs zip you find a MySiteV0.94.sql file.

Open the file in Notepad++, select all the text using Control-A then copy it using Control-C.

Open MySQL Workbench, connect to your database server. In the Query Tab Paste the text from the SQL file.

select all the text again with Control-A then press the first Lighting Bolt.
My World 19

You'll see the database and tables created in the Output Pane at the bottom. Click on the Schemas Pane and hit refresh. You should now see your mysite database.

My World 20

NOW we are ready to browse our website. If all went well, you should be able to browse to your website url.

My World 21
Now we can setup our initial Grid System account, Grid Owner, Grid Library and World Bank.

Click on New Account, a registration page will open up. Select a Gender, enter Grid as the First Name, Owner as the second name.
Create a Password and enter and administration email for the user. Click Register.

My World 22

Do this again for the other accounts, Grid Library and World Bank.

Finally create an account for yourself.

The following gotcha has ben fixed as of 4/29/2019 with an entry in FirstConfig.txt

One gotcha I've run into is when you try to log into the Website with the new created accounts. When you click on Account Logon you get presented with the following error.

Control value for 'Email Domain Name' (EmailDomain) was not defined!

This can easily be corrected by opening MySQL Workbench and manually creating the entry in the Database.


Open MySQL Workbench, connect to your server then in the schemas pane expand the mysite database. You're looking for the control table.

Hover over the control table, you'll see icons appear, click the last one (looks like a pen and table). This will open the table for editing.

My World 23

Scroll to the bottom of the Table where it say null. Enter the following: In the first column enter ADMINSYSTEM. In the second column, enter Email Domain Name. In the third column enter EmailDomain
In the fourth column enter your email domain name. eg: mydomain.com

My World 24

Click Apply to register the changes.

My World 25

Click Apply

If all went well the SQL entry will succeed.

My World 26

Click Finish. Close MySQL Workbench

You can now go back to your browser and Click Account Logon. You'll be presented with a login page.

My World 27
Enter in your Grid Owner credentials. Now we have to do some Grid Settings setup to get the site working fully and prepared for the actual grid startup.
Once logged in you'll se a menu entry for Website Administration. click it.

My World 28
Now you'll have more menu options to chose from as the main administrator of your grid.

My World 29

The first one we're interested in is Control List Management. Click it.

You'll see these entries:

My World 30

Click on Member List for Grid System Accounts. You'll get:

My World 31

Click on New Member.

My World 32

In the Member Name box enter World Bank Account In the Key or List Link enter WorldBank (no space). In the Text Value box enter World Bank (with a space).

Click Add.

My World 33

Click on Parent Level. Then click on Member List for Grid Region Defaults.

My World 34
Now Click on Home Region

My World 35

In Home Region in the Text Value box enter the name of your Home Region. eg: The Landings Then Click Update. Then click Control List Select.

My World 36
Click on Welcome Region

My World 35

Inside Welcome Region in the Text Value Box enter the name of your Welcome Region. (It can be the same as your Home Region).
Click Update, then Control List Select.

My World 37

Click Parent Level

My World 35

Click on Member List for Email Addresses

My World 34
Click on Grid Owner Email

My World 38

In the Grid Owner Email dialog in the Text Value box enter your administration email address. eg: admin@mydomain.com

Click Update, The Control List Select.

My World 39

Click on Webmaster Email

My World 38

In the Webmaster Email dialog in the Text Value box enter the email for your webmaster. eg: webmaster@mydomain.com

Click Update then Control List Select

My World 40

Click Parent Level

My World 38

Click Member List for Grid Settings

My World 34

Click Grid Status URL

My world 41

Inside the Grid Status URL dialog in the Text Value box replace myworldIP with the IP of your main Region Server. In this case it would be the local machine's IP.

Click Update the Control List Select

My World 42
Click Parent Level

My world 41

Click Website Administration 

My World 34

Click Control Value Management

My World 29
Click SMTP Sever

My world 43
In the SMTP Server dialog in the Value Assigned box enter your smtp server. eg:smtp.mydomain.com Then click Update then Control Values Select.

My World 44
Click MyData Database Name

My world 43

In the MyData Database Name dialog in the Value Assigned box enter the name of your GRID database. In our case it's halcyon.
Click Update then Control Values Select.

My World 45
Click on Server Location

My world 43

In the Server Location dialog in the Value Assigned box enter Live. This puts the website in to Live mode enabling SSL.
Click Update then Control Values Select.

My World 46
Click Website Administration

My world 43
Click Grid Manager

My World 29
Click Server Management

My World 47

Click New Server

My World 48
In the Server dialog enter in the details for your Server. The entries are relatively self explanatory. Click Add

MY World 49

You should now see your new server in the list. Click Website Administration

My World 50
Click Estate Management

My World 29
Click New Estate

My world 51

In the New Estate Dialog name your first Estate. These are the Hierarchal containers for your Regions. Click Add
My World 52

You should now see your first Estate. Click on your Estate.

My World 53

Click New Region

My world 54

In the New Region Dialog enter the Region Name, Map Location, Choose the Owner, Region Type and Prim Capacity. It is a good idea to start with your
Home Region and place it at grid center at 1000,1000. You can then build the rest of your grid from there.

Click Add

My World 55
You should now see your first region inside of your first estate.

My World 56

NOTE: This is where I found another gotcha. We've created the region, however I see no way to add it to a server or properly set the port.
I'm discussing this issue with Vinhold, however I don't think I'm communicating the error correctly. We hope to have a solution soon. In the
Meantime we have to add that info to the Database manually.


Open MySQL Workbench, connect to your server then in the schemas pane expand the mysite database. You're looking for the control table.

Hover over the regionxml table, you'll see icons appear, click the last one (looks like a pen and table). This will open the table for editing.
In the first entry goto the internalIP column. Enter the the internal network IP of your server, eg: Next column enter the Port number, since this
is our first region on the server we'll assign it 9500. Next column, enter the externalIP of your server. This is the world reachable IP of your server. eg:

My World 57

Click Apply again

My World 58

Click Finish.

My World 59

Now you can go back to the website and see the region in Grid Manager with the assigned port.

My World 60

At this point we can actually move on to actually starting our grid or we can enter more regions. To add more regions just repeat the last five
steps or so (From New Region under Estate Management).

Like I said, this is the major gotcha that I've found. I try to get a resolution to it soon and post the updated steps. For now this is what we have to do.

Starting the Grid Services and Region Instances

Now for the fun part and starting to see fruits of our labor up to this point.

Open up your Grid-Data drive eg: D:\Grid

In that directory we've placed several files and shortcuts that will enable us to run our grid with a few mouse clicks.

This is what you should have after following the earlier steps in this tutorial

Grid Startup 1

At this point, theoretically we can just double click Start Grid.bat, sit back and watch it all start up. HOWEVER, nothing works perfectly
on the first try. To ensure we have a righteous Grid Startup will take a couple of steps to make sure our INI files and RegionXML database
calls are working the way they should.

Goto region directory 9500. In that directory look for the Region.ini file. Open it in Notepad++.

You're looking for the line http://world.mydomain.com/Regxml.aspx?Region=

Copy the line into the address bar of your browser and hit enter. You won't necessarily see anything but a brief flash.

Now navigate to your website directory, C:\inetpub\wwwroot\world.mydomain.com in our case. Look for the file
RegXML.log Open it with Notepad++. You should see something similar to this:
RegXML Start: 4/26/2019 12:09:16 AM
Region IP given:, Port: 9500
Get regionxml values SQLCmd: Select UUID,regionName,locationX,locationY,port,externalIP,ownerUUID,lastmapUUID,lastmapRefresh,primMax,productType From regionxml Where internalIP='' and port='9500'
XML: <Regions><Root><Config sim_UUID="f05fb728-bba4-4045-9aff-2bbd920314b8" sim_name="The Landings" sim_location_x="1000" sim_location_y="1000" internal_ip_address="" internal_ip_port="9500" allow_alternate_ports="false" external_host_name="" master_avatar_uuid="02ba7f4b-1ec2-43a1-9ea8-bdfebf01201f" lastmap_uuid="00000000-0000-0000-0000-000000000000" lastmap_refresh="0" nonphysical_prim_max="30000" physical_prim_max="0" clamp_prim_size="false" object_capacity="0" region_product="1" region_access="0" outside_ip="" /></Root></Regions>
********* Completed Processing *********

If that's similar to what you have then you should be Go For Launch.

IF you get an error when pasting the Regxml call then something is misconfigured. Most likely your domain name or internalIP.
XML Parsing Error: no root element found
Location: http://world.mydomain.com/Regxml.aspx?Region=
Line Number 1, Column 1:

OR if you see something similar to this in RegXML.log
RegXML Start: 4/26/2019 12:14:48 AM
Region IP given:, Port: 9500
Get regionxml values SQLCmd: Select UUID,regionName,locationX,locationY,port,externalIP,ownerUUID,lastmapUUID,lastmapRefresh,primMax,productType From regionxml Where internalIP='' and port='9500'
********* Completed Processing *********

You'll notice the lack of region details. Again this is most likely caused by a misconfiguration of your domain name or internalIP inside your Region.ini.

Look for typos, ensure you have a valid IP address, make sure your domain is reachable via DNS.

Now assuming all is well, we can actually start the Grid!  Woohooo!!

Now back to the D:\Grid directory. You have two choices here. You can go for broke and Double Click Start Grid.bat, cross you fingers and
pray for success or you can start each piece Individually looking for errors. This perhaps is the smartest thing to do.

You'll want to start each file in the following order, allowing about 30 seconds between each to look for and troubleshoot errors.

If you've hit the target and everything starts up with no errors then you can prepare for first login.

Grid Startup 1

We'll go for broke and run Start Grid.bat (Yeah we like living on the edge)

If all went well you had no errors no port blocking by the firewall no NAT issues if you're running behind a home router then
you should see a train wreck of windows on your desktop with your regions at a Region Name prompt. (eg: Region (The Landings) # _ )

Grid Startup 2

Now we can dust off our viewer and attempt log in.

We'll use Firestorm for OS as our viewer. Start the viewer, open preferences (Control-P) under the Opensim tab we'll enter in our grid details.

Login 1

Type in your region URL, in our case http://world.mydomain.com:8002 and click apply.

You should get an entry for your grid in the list, scroll to it and see if the Grid Details is populated. You should also see a splash screen.

Login 2

Type in your Grid Owner credentials or if you created your own avatar account, your avatar's credentials. Press Log In

Login 3

Barring anything horrific, bad DNS, typo's in passwords, firewall blocking ports, etc you should be able to make your first connection to your grid.

Login 4

Now you'll notice that you're a cloud and there was an error about a missing outfit. This is to be expected at this stage. You'll need to create default avatars
for your grid. This process is beyond the scope of this particular tutorial. We do hope to have one detailing creating default avatars for your grid soon.

If you log back into your Website with your Grid Owner account, choose Website Administration then the Grid Manager you should see your region(s) running
with details and a user count.

Login 5

Closing Thoughts

Hopefully this tutorial took the pain away of creating and running you own Halcyon Grid. This tutorial is not meant to be comprehensive and the configuration
we detailed here definitely isn't a rule of thumb for creating a Production Grid. There are MANY variables that need to be taken into consideration when
you decide to go public and build the next SecondLife. We just hope you were able to get your feet wet and break the barrier of actually getting a Halcyon
Grid running on your own.

Now go young Padawan , go forth and learn your new grid and all it's idiosyncrasies.

We hope to have more tutorials available for further configuration and setup of your grid, such as Default Avatars, Estate and Region Management, Customizing
your website with the embedded management tools and a host of other things.

Content Copyright © 2019 by Design Creations dba The Moonlight Grid. All rights reserved
Document Version 1.3-2019-04-29