<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.spiretrading.com/index.php?action=history&amp;feed=atom&amp;title=Administration_Server</id>
	<title>Administration Server - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.spiretrading.com/index.php?action=history&amp;feed=atom&amp;title=Administration_Server"/>
	<link rel="alternate" type="text/html" href="https://wiki.spiretrading.com/index.php?title=Administration_Server&amp;action=history"/>
	<updated>2026-04-07T12:59:24Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.34.1</generator>
	<entry>
		<id>https://wiki.spiretrading.com/index.php?title=Administration_Server&amp;diff=235&amp;oldid=prev</id>
		<title>Kamal: Created page with &quot;= Administration Server =  The Administration Server manages account-level authorization and operational metadata for Spire. It maintains each account's role (trader, manager,...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.spiretrading.com/index.php?title=Administration_Server&amp;diff=235&amp;oldid=prev"/>
		<updated>2025-12-01T21:45:00Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;= Administration Server =  The Administration Server manages account-level authorization and operational metadata for Spire. It maintains each account&amp;#039;s role (trader, manager,...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Administration Server =&lt;br /&gt;
&lt;br /&gt;
The Administration Server manages account-level authorization and operational metadata for Spire. It maintains each account's role (trader, manager, administrator, or service), market-data entitlements, risk parameters, and trading permissions. By centralizing these attributes, it enforces access control, entitlement visibility, and trading eligibility across the system.&lt;br /&gt;
The server integrates with the Service Locator to enumerate accounts and with a MySQL database to persist administrative data.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
The Administration Server is configured via a YAML file that defines network interfaces, database connection, Service Locator integration, and market-data entitlements. Below is the structure of the configuration file with example values:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
server:&lt;br /&gt;
  # Primary network interface and port the Administration Server binds to.&lt;br /&gt;
  interface: &amp;quot;0.0.0.0:20100&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  # List of addresses the server is reachable at (for registration with Service Locator).&lt;br /&gt;
  # Typically includes both public-facing and local addresses.&lt;br /&gt;
  addresses: [&amp;quot;198.51.100.5:20100&amp;quot;, &amp;quot;10.0.0.5:20100&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
data_store:&lt;br /&gt;
  # The address of the MySQL server (host:port).&lt;br /&gt;
  address: &amp;quot;127.0.0.1:3306&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  # The username for authenticating with MySQL.&lt;br /&gt;
  username: spireadmin&lt;br /&gt;
  &lt;br /&gt;
  # The password for the MySQL user.&lt;br /&gt;
  password: 1234&lt;br /&gt;
  &lt;br /&gt;
  # The name of the database schema where data is stored.&lt;br /&gt;
  schema: spire&lt;br /&gt;
&lt;br /&gt;
service_locator:&lt;br /&gt;
  # The address of the Service Locator (host:port).&lt;br /&gt;
  address: &amp;quot;10.0.0.5:20000&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  # The account username used by the Administration Server to authenticate with the Service Locator.&lt;br /&gt;
  username: administration_service&lt;br /&gt;
  &lt;br /&gt;
  # The password for the Administration Server's Service Locator account.&lt;br /&gt;
  password: admin_password&lt;br /&gt;
&lt;br /&gt;
entitlements:&lt;br /&gt;
  # Market-data entitlement definitions.&lt;br /&gt;
  # Each entitlement specifies pricing, applicable exchanges, and message types.&lt;br /&gt;
  - name: Demo Entitlements&lt;br /&gt;
    price: 0.00&lt;br /&gt;
    currency: USD&lt;br /&gt;
    group: demo_entitlements&lt;br /&gt;
    applicability:&lt;br /&gt;
      # source: the venue disseminating the market data&lt;br /&gt;
      # messages: market data message types&lt;br /&gt;
      #   BBO - best bid offer quotes&lt;br /&gt;
      #   BOOK - book quotes&lt;br /&gt;
      #   TAS - time and sales&lt;br /&gt;
      #   IMB - order imbalances&lt;br /&gt;
      - source: CHIC&lt;br /&gt;
        messages: [BBO, BOOK, TAS, IMB]&lt;br /&gt;
      - source: XTSE&lt;br /&gt;
        messages: [BBO, BOOK, TAS, IMB]&lt;br /&gt;
      - source: XTSX&lt;br /&gt;
        messages: [BBO, BOOK, TAS, IMB]&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation &amp;amp; Setup ==&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;setup.py&amp;lt;/code&amp;gt; script is provided to generate the final &amp;lt;code&amp;gt;config.yml&amp;lt;/code&amp;gt;.&lt;br /&gt;
The script supports the following arguments:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; python setup.py&lt;br /&gt;
  --local 0.0.0.0 # Local interface (default: auto-detected IP)&lt;br /&gt;
  --world 198.51.100.5 # Global/public interface (optional)&lt;br /&gt;
  --address 10.0.0.5:20000 # Service Locator address (default: local_interface:20000)&lt;br /&gt;
  --password [REQUIRED] # Administration password&lt;br /&gt;
  --mysql_address 127.0.0.1:3306 # MySQL server address&lt;br /&gt;
  --mysql_username spireadmin # MySQL username&lt;br /&gt;
  --mysql_password secretpw # MySQL password (default: --password if omitted)&lt;br /&gt;
  --mysql_schema spire # MySQL schema&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Risk State Initialization Utility ==&lt;br /&gt;
&lt;br /&gt;
A reset script (&amp;lt;code&amp;gt;reset_risk_states.py&amp;lt;/code&amp;gt;) is provided to initialize or reset the risk state for all accounts and is typically run on a daily basis.&lt;br /&gt;
&lt;br /&gt;
== Operations ==&lt;br /&gt;
&lt;br /&gt;
The Administration Server is controlled using three operational scripts: &amp;lt;code&amp;gt;start.sh&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;stop.sh&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;check.sh&amp;lt;/code&amp;gt;.&lt;br /&gt;
Log files are generated in the format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; srv_YYYYMMDD_HH_MM_SS.log &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Upon startup, older log files are moved into the &amp;lt;code&amp;gt;logs/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
=== check.sh ===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;check.sh&amp;lt;/code&amp;gt; script verifies whether the server is currently running by inspecting the PID recorded in &amp;lt;code&amp;gt;pid.lock&amp;lt;/code&amp;gt; and testing whether the associated process exists.&lt;br /&gt;
If the server is not running, it prints:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; AdministrationServer is not running. &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== start.sh ===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;start.sh&amp;lt;/code&amp;gt; script:&lt;br /&gt;
&lt;br /&gt;
Exits immediately if the server is already running&lt;br /&gt;
&lt;br /&gt;
Creates a &amp;lt;code&amp;gt;logs/&amp;lt;/code&amp;gt; directory if necessary&lt;br /&gt;
&lt;br /&gt;
Moves any existing &amp;lt;code&amp;gt;srv_*.log&amp;lt;/code&amp;gt; files into &amp;lt;code&amp;gt;logs/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Starts the &amp;lt;code&amp;gt;AdministrationServer&amp;lt;/code&amp;gt; process in the background&lt;br /&gt;
&lt;br /&gt;
Writes the PID to &amp;lt;code&amp;gt;pid.lock&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reads network interfaces from &amp;lt;code&amp;gt;config.yml&amp;lt;/code&amp;gt; and waits until the server is listening on at least one configured address&lt;br /&gt;
&lt;br /&gt;
This ensures the server is fully initialized before the script exits.&lt;br /&gt;
&lt;br /&gt;
=== stop.sh ===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;stop.sh&amp;lt;/code&amp;gt; script:&lt;br /&gt;
&lt;br /&gt;
Reads the PID from &amp;lt;code&amp;gt;pid.lock&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sends &amp;lt;code&amp;gt;SIGINT&amp;lt;/code&amp;gt; to request a graceful shutdown&lt;br /&gt;
&lt;br /&gt;
Waits for termination using exponential backoff (up to 300 seconds)&lt;br /&gt;
&lt;br /&gt;
Sends &amp;lt;code&amp;gt;SIGKILL&amp;lt;/code&amp;gt; if the server fails to stop cleanly&lt;br /&gt;
&lt;br /&gt;
Appends a forced-termination message to the most recent log file (if applicable)&lt;br /&gt;
&lt;br /&gt;
Removes the &amp;lt;code&amp;gt;pid.lock&amp;lt;/code&amp;gt; file&lt;br /&gt;
&lt;br /&gt;
This guarantees consistent shutdown behavior across normal and exceptional conditions.&lt;/div&gt;</summary>
		<author><name>Kamal</name></author>
		
	</entry>
</feed>