GorBot Cluster: Difference between revisions
Appearance
Created page with "{{DISPLAYTITLE:Reliable Infrastructure}} __NOTOC__ <div style="width:calc(100% - 40px); max-width:1500px; margin:-42px auto 30px auto; padding:0; font-family:Georgia, 'Times New Roman', serif; color:#e8dfcf;"> <div style="overflow:hidden; border:1px solid #7d5b37; border-radius:8px; background:#17110d; box-shadow:0 4px 18px rgba(0,0,0,0.55);"> <!-- ========================================================= --> <!-- HEADER --> <!-- ========================================..." |
No edit summary |
||
| Line 10: | Line 10: | ||
<div style="margin:0; padding:24px 24px 20px 24px; text-align:center; line-height:1.2; background:linear-gradient(180deg,#3b2118 0%,#1b120e 100%); border-bottom:1px solid #7d5b37;"> | <div style="margin:0; padding:24px 24px 20px 24px; text-align:center; line-height:1.2; background:linear-gradient(180deg,#3b2118 0%,#1b120e 100%); border-bottom:1px solid #7d5b37;"> | ||
<div style="margin:0; padding:0; font-size:36px; line-height:1.18; font-weight:bold; letter-spacing:2px; color:#e0b45d; text-shadow:2px 2px 4px #000;">RELIABLE INFRASTRUCTURE</div> | <div style="margin:0; padding:0; font-size:36px; line-height:1.18; font-weight:bold; letter-spacing:2px; color:#e0b45d; text-shadow:2px 2px 4px #000;">RELIABLE INFRASTRUCTURE</div> | ||
<div style="margin:10px 0 0 0; padding:0; font-size:18px; line-height:1.35; color:#c9bba6; font-style:italic;"> | <div style="margin:10px 0 0 0; padding:0; font-size:18px; line-height:1.35; color:#c9bba6; font-style:italic;">Multiple managed Discord nodes, shared authoritative state, failover, load sharing, centralized updates, and web-based control built to grow beyond one machine.</div> | ||
</div> | </div> | ||
| Line 19: | Line 19: | ||
<div style="padding:30px 42px 18px 42px; font-size:16px; line-height:1.8;"> | <div style="padding:30px 42px 18px 42px; font-size:16px; line-height:1.8;"> | ||
<div style="font-size:22px; color:#d9b36c; margin:0 0 12px 0; font-weight:bold;"> | <div style="font-size:22px; color:#d9b36c; margin:0 0 12px 0; font-weight:bold;">Built Beyond a Single Discord Machine</div> | ||
Modern '''GorBot infrastructure''' is designed around a managed cluster rather than one Discord bot process permanently tied to one computer. | |||
Multiple GorBot Discord nodes can share Gateway work, remain ready to take over for one another, use | Multiple GorBot Discord nodes can share Gateway work, remain ready to take over for one another, use shared authoritative state, receive centrally managed software releases, and continue operating as one coordinated platform. | ||
This architecture allows GorBot to grow without making one machine the permanent center of the Discord service. | |||
<div style="margin:24px 0 6px 0; padding:20px 24px; background:#241813; border-left:4px solid #9e2f26; border-radius:4px;"> | <div style="margin:24px 0 6px 0; padding:20px 24px; background:#241813; border-left:4px solid #9e2f26; border-radius:4px;"> | ||
<div style="font-size:19px; font-weight:bold; color:#e0b45d; margin-bottom:7px;"> | <div style="font-size:19px; font-weight:bold; color:#e0b45d; margin-bottom:7px;">The goal is continuity, not just duplication.</div> | ||
Running multiple nodes only matters if they can share state, divide work, detect failure, and take over real Discord connections when another node becomes unavailable. | |||
</div> | </div> | ||
</div> | </div> | ||
| Line 40: | Line 40: | ||
<div style="padding:30px 42px 10px 42px;"> | <div style="padding:30px 42px 10px 42px;"> | ||
<div style="text-align:center; margin-bottom:24px;"> | <div style="text-align:center; margin-bottom:24px;"> | ||
<div style="font-size:28px; font-weight:bold; color:#e0b45d; text-shadow:1px 1px 3px #000;">HOW THE | <div style="font-size:28px; font-weight:bold; color:#e0b45d; text-shadow:1px 1px 3px #000;">HOW THE PLATFORM IS ORGANIZED</div> | ||
<div style="margin-top:6px; color:#a99a87; font-style:italic;"> | <div style="margin-top:6px; color:#a99a87; font-style:italic;">The game world, Discord nodes, and shared web infrastructure serve different technical roles.</div> | ||
</div> | </div> | ||
| Line 47: | Line 47: | ||
|- | |- | ||
| style="width:33.33%; vertical-align:top; padding:22px; background:#211712; border:1px solid #5f452e; border-radius:6px;" | | | style="width:33.33%; vertical-align:top; padding:22px; background:#211712; border:1px solid #5f452e; border-radius:6px;" | | ||
<div style="font-size:21px; font-weight:bold;"> | <div style="font-size:21px; font-weight:bold;">Shared Web Infrastructure</div> | ||
<div style="margin-top:9px; line-height:1.6;"> | <div style="margin-top:9px; line-height:1.6;">RackNerd hosts the public GorBot web services, shared SQL state, releases, backups, provisioning services, and other central infrastructure that should remain independent of any one Discord node.</div> | ||
| style="width:33.33%; vertical-align:top; padding:22px; background:#211712; border:1px solid #5f452e; border-radius:6px;" | | | style="width:33.33%; vertical-align:top; padding:22px; background:#211712; border:1px solid #5f452e; border-radius:6px;" | | ||
<div style="font-size:21px; font-weight:bold;">Managed Discord Nodes</div> | <div style="font-size:21px; font-weight:bold;">Managed Discord Nodes</div> | ||
<div style="margin-top:9px; line-height:1.6;">Independent GorBot siblings run the Discord runtime, own assigned Gateway shards, maintain hot standby capability | <div style="margin-top:9px; line-height:1.6;">Independent GorBot siblings run the Discord runtime, own assigned Gateway shards, maintain hot-standby capability, and report health back to the shared platform.</div> | ||
| style="width:33.33%; vertical-align:top; padding:22px; background:#211712; border:1px solid #5f452e; border-radius:6px;" | | | style="width:33.33%; vertical-align:top; padding:22px; background:#211712; border:1px solid #5f452e; border-radius:6px;" | | ||
<div style="font-size:21px; font-weight:bold;">RunUO Game World</div> | <div style="font-size:21px; font-weight:bold;">RunUO Game World</div> | ||
<div style="margin-top:9px; line-height:1.6;">The Gor Ultima RunUO server is part of the same overall ecosystem but is not a GorBot | <div style="margin-top:9px; line-height:1.6;">The Gor Ultima RunUO server is part of the same overall ecosystem but is not a managed GorBot Discord sibling. Its game-side integration remains separate from the Discord node fleet.</div> | ||
|} | |} | ||
</div> | </div> | ||
| Line 68: | Line 68: | ||
<div style="text-align:center; margin-bottom:24px;"> | <div style="text-align:center; margin-bottom:24px;"> | ||
<div style="font-size:28px; font-weight:bold; color:#e0b45d;">HIGH AVAILABILITY</div> | <div style="font-size:28px; font-weight:bold; color:#e0b45d;">HIGH AVAILABILITY</div> | ||
<div style="margin-top:6px; color:#a99a87; font-style:italic;"> | <div style="margin-top:6px; color:#a99a87; font-style:italic;">One failed node should not automatically mean GorBot is offline.</div> | ||
</div> | </div> | ||
<div style="padding:24px 28px; background:#211712; border:1px solid #5f452e; border-radius:7px; line-height:1.8;"> | <div style="padding:24px 28px; background:#211712; border:1px solid #5f452e; border-radius:7px; line-height:1.8;"> | ||
GorBot | GorBot uses multiple independent Discord nodes so active work can be redistributed when one node becomes unavailable. | ||
The current | The current high-availability model includes: | ||
* automatic failover; | * automatic failover; | ||
* weighted load sharing; | * weighted load sharing; | ||
* gradual rebalancing; | * gradual rebalancing; | ||
* hot standby behavior | * hot-standby behavior; | ||
* heartbeat-based health monitoring; | * heartbeat-based health monitoring; | ||
* centralized | * centralized releases; | ||
* centralized backups; | * centralized backups; | ||
* managed node provisioning. | * managed node provisioning; | ||
* rolling software updates. | |||
The web | The shared web infrastructure is intentionally separate from the Discord nodes so the broader platform does not disappear simply because one Discord machine fails. | ||
</div> | </div> | ||
</div> | </div> | ||
| Line 98: | Line 98: | ||
<div style="text-align:center; margin-bottom:24px;"> | <div style="text-align:center; margin-bottom:24px;"> | ||
<div style="font-size:28px; font-weight:bold; color:#e0b45d;">DISCORD GATEWAY SHARDS</div> | <div style="font-size:28px; font-weight:bold; color:#e0b45d;">DISCORD GATEWAY SHARDS</div> | ||
<div style="margin-top:6px; color:#a99a87; font-style:italic;">Discord work | <div style="margin-top:6px; color:#a99a87; font-style:italic;">Discord work can be divided and distributed between healthy managed nodes.</div> | ||
</div> | </div> | ||
| Line 104: | Line 104: | ||
The current GorBot cluster operates with '''4 Discord Gateway shards'''. | The current GorBot cluster operates with '''4 Discord Gateway shards'''. | ||
Those shards can be | Those shards can be distributed between healthy nodes instead of all being forced onto one machine. | ||
With two equally weighted | With two equally weighted nodes, the expected distribution is approximately: | ||
'''100 / 100 → 2 shards / 2 shards''' | '''100 / 100 → 2 shards / 2 shards''' | ||
If one node is given a lower relative weight: | |||
'''100 / 50 → approximately 3 shards / 1 shard''' | '''100 / 50 → approximately 3 shards / 1 shard''' | ||
Weights influence relative workload and are not literal CPU percentages. | |||
</div> | </div> | ||
</div> | </div> | ||
| Line 126: | Line 126: | ||
<div style="text-align:center; margin-bottom:24px;"> | <div style="text-align:center; margin-bottom:24px;"> | ||
<div style="font-size:28px; font-weight:bold; color:#e0b45d;">WEIGHTED LOAD SHARING</div> | <div style="font-size:28px; font-weight:bold; color:#e0b45d;">WEIGHTED LOAD SHARING</div> | ||
<div style="margin-top:6px; color:#a99a87; font-style:italic;"> | <div style="margin-top:6px; color:#a99a87; font-style:italic;">Different machines can carry different amounts of Discord work.</div> | ||
</div> | </div> | ||
| Line 137: | Line 137: | ||
| style="width:33.33%; vertical-align:top; padding:22px; background:#211712; border:1px solid #5f452e; border-radius:6px;" | | | style="width:33.33%; vertical-align:top; padding:22px; background:#211712; border:1px solid #5f452e; border-radius:6px;" | | ||
<div style="font-size:21px; font-weight:bold;">Unequal Weight</div> | <div style="font-size:21px; font-weight:bold;">Unequal Weight</div> | ||
<div style="margin-top:9px; line-height:1.6;">A | <div style="margin-top:9px; line-height:1.6;">A preferred or more capable node can receive a higher relative weight so it normally carries more Gateway work.</div> | ||
| style="width:33.33%; vertical-align:top; padding:22px; background:#211712; border:1px solid #5f452e; border-radius:6px;" | | | style="width:33.33%; vertical-align:top; padding:22px; background:#211712; border:1px solid #5f452e; border-radius:6px;" | | ||
<div style="font-size:21px; font-weight:bold;">Weight 0 Standby</div> | <div style="font-size:21px; font-weight:bold;">Weight 0 Standby</div> | ||
<div style="margin-top:9px; line-height:1.6;">A healthy node can remain fully started with | <div style="margin-top:9px; line-height:1.6;">A healthy node can remain fully started with no normal shard assignment while staying ready to participate when failover or configuration changes require it.</div> | ||
|} | |} | ||
</div> | </div> | ||
| Line 153: | Line 153: | ||
<div style="text-align:center; margin-bottom:24px;"> | <div style="text-align:center; margin-bottom:24px;"> | ||
<div style="font-size:28px; font-weight:bold; color:#e0b45d;">HOT STANDBY</div> | <div style="font-size:28px; font-weight:bold; color:#e0b45d;">HOT STANDBY</div> | ||
<div style="margin-top:6px; color:#a99a87; font-style:italic;">Standby | <div style="margin-top:6px; color:#a99a87; font-style:italic;">Standby capacity can remain ready without opening duplicate Discord sessions.</div> | ||
</div> | </div> | ||
| Line 159: | Line 159: | ||
A healthy GorBot node can remain fully started even when it currently owns no Discord Gateway shards. | A healthy GorBot node can remain fully started even when it currently owns no Discord Gateway shards. | ||
A hot standby node can keep: | A hot-standby node can keep: | ||
* its node agent running; | * its node agent running; | ||
* the GorBot process running; | * the GorBot process running; | ||
* the DiscordBot runtime loaded; | * the DiscordBot runtime loaded; | ||
* | * runtime configuration validated; | ||
* cluster communication active; | * cluster communication active; | ||
* update capability | * update capability available. | ||
Only assigned Discord Gateway shards open sessions. | Only assigned Discord Gateway shards open active Discord sessions. | ||
This | This makes standby capacity ready for takeover without creating duplicate shard ownership. | ||
</div> | </div> | ||
</div> | </div> | ||
| Line 183: | Line 182: | ||
<div style="text-align:center; margin-bottom:24px;"> | <div style="text-align:center; margin-bottom:24px;"> | ||
<div style="font-size:28px; font-weight:bold; color:#b65a50;">FAILOVER</div> | <div style="font-size:28px; font-weight:bold; color:#b65a50;">FAILOVER</div> | ||
<div style="margin-top:6px; color:#a99a87; font-style:italic;"> | <div style="margin-top:6px; color:#a99a87; font-style:italic;">Moving an assignment is not enough — the replacement connection has to work.</div> | ||
</div> | </div> | ||
| Line 189: | Line 188: | ||
The current cluster uses an Agent heartbeat of approximately '''10 seconds''' and an offline threshold of approximately '''45 seconds'''. | The current cluster uses an Agent heartbeat of approximately '''10 seconds''' and an offline threshold of approximately '''45 seconds'''. | ||
When a node is considered unavailable, | When a node is considered unavailable, its Gateway shards can be reassigned to healthy capacity. | ||
However, GorBot does '''not''' treat shard ownership alone as proof of successful failover. | However, GorBot does '''not''' treat shard ownership alone as proof of successful failover. | ||
A | A successful takeover should include: | ||
* Agent heartbeat present; | * Agent heartbeat present; | ||
| Line 205: | Line 202: | ||
* visible online behavior in the affected Discord communities. | * visible online behavior in the affected Discord communities. | ||
<div style="margin-top:16px; color:#c9bba6; font-style:italic;">A | <div style="margin-top:16px; color:#c9bba6; font-style:italic;">A shard being assigned to a node is not the same as that shard actually being connected to Discord.</div> | ||
</div> | </div> | ||
</div> | </div> | ||
| Line 216: | Line 213: | ||
<div style="padding:30px 42px 10px 42px;"> | <div style="padding:30px 42px 10px 42px;"> | ||
<div style="text-align:center; margin-bottom:24px;"> | <div style="text-align:center; margin-bottom:24px;"> | ||
<div style="font-size:28px; font-weight:bold; color:#e0b45d;">HEALTH | <div style="font-size:28px; font-weight:bold; color:#e0b45d;">MULTI-LAYER HEALTH</div> | ||
<div style="margin-top:6px; color:#a99a87; font-style:italic;"> | <div style="margin-top:6px; color:#a99a87; font-style:italic;">A reliable node must be healthy at more than one level.</div> | ||
</div> | </div> | ||
| Line 224: | Line 221: | ||
| style="width:33.33%; vertical-align:top; padding:22px; background:#211712; border:1px solid #5f452e; border-radius:6px;" | | | style="width:33.33%; vertical-align:top; padding:22px; background:#211712; border:1px solid #5f452e; border-radius:6px;" | | ||
<div style="font-size:21px; font-weight:bold;">Agent Online</div> | <div style="font-size:21px; font-weight:bold;">Agent Online</div> | ||
<div style="margin-top:9px; line-height:1.6;">The managed node agent is alive and communicating with the | <div style="margin-top:9px; line-height:1.6;">The managed node agent is alive and still communicating with the shared platform.</div> | ||
| style="width:33.33%; vertical-align:top; padding:22px; background:#211712; border:1px solid #5f452e; border-radius:6px;" | | | style="width:33.33%; vertical-align:top; padding:22px; background:#211712; border:1px solid #5f452e; border-radius:6px;" | | ||
<div style="font-size:21px; font-weight:bold;">Bot Running</div> | <div style="font-size:21px; font-weight:bold;">Bot Running</div> | ||
<div style="margin-top:9px; line-height:1.6;">The GorBot | <div style="margin-top:9px; line-height:1.6;">The GorBot process is running and its runtime has started successfully.</div> | ||
| style="width:33.33%; vertical-align:top; padding:22px; background:#211712; border:1px solid #5f452e; border-radius:6px;" | | | style="width:33.33%; vertical-align:top; padding:22px; background:#211712; border:1px solid #5f452e; border-radius:6px;" | | ||
<div style="font-size:21px; font-weight:bold;">Discord READY</div> | <div style="font-size:21px; font-weight:bold;">Discord READY</div> | ||
<div style="margin-top:9px; line-height:1.6;"> | <div style="margin-top:9px; line-height:1.6;">Assigned Gateway sessions have actually connected and reached a usable Discord state.</div> | ||
|- | |- | ||
| style="width:50%; vertical-align:top; padding:22px; background:#211712; border:1px solid #5f452e; border-radius:6px;" | | | style="width:50%; vertical-align:top; padding:22px; background:#211712; border:1px solid #5f452e; border-radius:6px;" | | ||
<div style="font-size:21px; font-weight:bold;">Assigned vs Connected Shards</div> | <div style="font-size:21px; font-weight:bold;">Assigned vs Connected Shards</div> | ||
<div style="margin-top:9px; line-height:1.6;">The | <div style="margin-top:9px; line-height:1.6;">The system can distinguish how many shards a node should own from how many are actually connected.</div> | ||
| style="width:50%; vertical-align:top; padding:22px; background:#211712; border:1px solid #5f452e; border-radius:6px;" | | | style="width:50%; vertical-align:top; padding:22px; background:#211712; border:1px solid #5f452e; border-radius:6px;" | | ||
<div style="font-size:21px; font-weight:bold;">Heartbeat ACK</div> | <div style="font-size:21px; font-weight:bold;">Heartbeat ACK</div> | ||
<div style="margin-top:9px; line-height:1.6;">Per-shard | <div style="margin-top:9px; line-height:1.6;">Per-shard heartbeat acknowledgements help confirm that connected Gateway sessions remain responsive.</div> | ||
|} | |} | ||
</div> | </div> | ||
| Line 253: | Line 250: | ||
<div style="text-align:center; margin-bottom:24px;"> | <div style="text-align:center; margin-bottom:24px;"> | ||
<div style="font-size:28px; font-weight:bold; color:#e0b45d;">SHARED AUTHORITATIVE STATE</div> | <div style="font-size:28px; font-weight:bold; color:#e0b45d;">SHARED AUTHORITATIVE STATE</div> | ||
<div style="margin-top:6px; color:#a99a87; font-style:italic;"> | <div style="margin-top:6px; color:#a99a87; font-style:italic;">Multiple nodes should still behave like one service.</div> | ||
</div> | </div> | ||
<div style="padding:24px 28px; background:#211712; border:1px solid #5f452e; border-radius:7px; line-height:1.8;"> | <div style="padding:24px 28px; background:#211712; border:1px solid #5f452e; border-radius:7px; line-height:1.8;"> | ||
RackNerd SQL | RackNerd SQL acts as the authoritative shared state for the managed GorBot platform. | ||
This allows important | This allows important persistent data to remain consistent even when requests are handled by different healthy nodes. | ||
Shared state is especially important for systems such as: | |||
* [[Character System|Characters & Profiles]]; | * [[Character System|Characters & Profiles]]; | ||
* [[NPC Database]]; | * [[NPC Database]]; | ||
* community | * community configuration; | ||
* persistent DiscordBot | * persistent DiscordBot state; | ||
* other | * other data that must survive node replacement or failover. | ||
Local runtime caching can still | Local runtime caching can still improve performance, but authoritative persistence remains centralized. | ||
</div> | </div> | ||
</div> | </div> | ||
| Line 277: | Line 272: | ||
<!-- ========================================================= --> | <!-- ========================================================= --> | ||
<!-- | <!-- WEB CONTROL --> | ||
<!-- ========================================================= --> | <!-- ========================================================= --> | ||
<div style="padding:30px 42px 10px 42px;"> | <div style="padding:30px 42px 10px 42px;"> | ||
<div style="text-align:center; margin-bottom:24px;"> | <div style="text-align:center; margin-bottom:24px;"> | ||
<div style="font-size:28px; font-weight:bold; color:#e0b45d;"> | <div style="font-size:28px; font-weight:bold; color:#e0b45d;">WEB-BASED CONTROL</div> | ||
<div style="margin-top:6px; color:#a99a87; font-style:italic;">The [[Dashboard|Web Dashboard]] can | <div style="margin-top:6px; color:#a99a87; font-style:italic;">The [[Dashboard|Web Dashboard]] can work with live GorBot services without depending permanently on one fixed Discord machine.</div> | ||
</div> | </div> | ||
<div style="padding:24px 28px; background:#211712; border:1px solid #5f452e; border-radius:7px; line-height:1.8;"> | <div style="padding:24px 28px; background:#211712; border:1px solid #5f452e; border-radius:7px; line-height:1.8;"> | ||
GorBot | Some web-based GorBot features need to communicate with the live Discord runtime. | ||
The | The modern infrastructure supports this through managed outbound communication between healthy Discord nodes and the shared web platform. | ||
This allows supported live web actions to continue using healthy cluster capacity rather than being permanently tied to a single node. | |||
The design also avoids requiring every managed Discord node to expose a public inbound management service for normal web control. | |||
</div> | </div> | ||
</div> | </div> | ||
| Line 311: | Line 300: | ||
<div style="text-align:center; margin-bottom:24px;"> | <div style="text-align:center; margin-bottom:24px;"> | ||
<div style="font-size:28px; font-weight:bold; color:#e0b45d;">CENTRALIZED UPDATES</div> | <div style="font-size:28px; font-weight:bold; color:#e0b45d;">CENTRALIZED UPDATES</div> | ||
<div style="margin-top:6px; color:#a99a87; font-style:italic;"> | <div style="margin-top:6px; color:#a99a87; font-style:italic;">Managed nodes can receive coordinated software updates without rebuilding every machine manually.</div> | ||
</div> | </div> | ||
| Line 318: | Line 307: | ||
| style="width:50%; vertical-align:top; padding:22px; background:#211712; border:1px solid #5f452e; border-radius:6px;" | | | style="width:50%; vertical-align:top; padding:22px; background:#211712; border:1px solid #5f452e; border-radius:6px;" | | ||
<div style="font-size:21px; font-weight:bold;">Managed Agent Updates</div> | <div style="font-size:21px; font-weight:bold;">Managed Agent Updates</div> | ||
<div style="margin-top:9px; line-height:1.6;">The node-management runtime can be updated centrally | <div style="margin-top:9px; line-height:1.6;">The node-management runtime can be updated centrally and independently from the Discord application itself.</div> | ||
| style="width:50%; vertical-align:top; padding:22px; background:#211712; border:1px solid #5f452e; border-radius:6px;" | | | style="width:50%; vertical-align:top; padding:22px; background:#211712; border:1px solid #5f452e; border-radius:6px;" | | ||
<div style="font-size:21px; font-weight:bold;">NodeApp Updates</div> | <div style="font-size:21px; font-weight:bold;">NodeApp Updates</div> | ||
<div style="margin-top:9px; line-height:1.6;">Approved GorBot NodeApp releases can be | <div style="margin-top:9px; line-height:1.6;">Approved GorBot NodeApp releases can be distributed to managed nodes as their own application release stream.</div> | ||
|} | |} | ||
<div style="margin:0 12px; padding:22px 26px; background:#241813; border:1px solid #6a4b2d; border-left:4px solid #9e2f26; border-radius:6px;"> | <div style="margin:0 12px; padding:22px 26px; background:#241813; border:1px solid #6a4b2d; border-left:4px solid #9e2f26; border-radius:6px;"> | ||
<div style="font-size:22px; font-weight:bold;">Agent and NodeApp versions are separate | <div style="font-size:22px; font-weight:bold;">Agent and NodeApp versions are separate components.</div> | ||
<div style="margin-top:9px; line-height:1.7;">Updating | <div style="margin-top:9px; line-height:1.7;">Updating one does not automatically imply that the other changed, and standalone GorBot node updates do not automatically require updating the RunUO game-side BridgeOnly installation.</div> | ||
</div> | </div> | ||
</div> | </div> | ||
| Line 338: | Line 327: | ||
<div style="padding:30px 42px 10px 42px;"> | <div style="padding:30px 42px 10px 42px;"> | ||
<div style="text-align:center; margin-bottom:24px;"> | <div style="text-align:center; margin-bottom:24px;"> | ||
<div style="font-size:28px; font-weight:bold; color:#e0b45d;"> | <div style="font-size:28px; font-weight:bold; color:#e0b45d;">ROLLING MAINTENANCE</div> | ||
<div style="margin-top:6px; color:#a99a87; font-style:italic;">Update | <div style="margin-top:6px; color:#a99a87; font-style:italic;">Update nodes in sequence while healthy capacity continues carrying service.</div> | ||
</div> | </div> | ||
<div style="padding:24px 28px; background:#211712; border:1px solid #5f452e; border-radius:7px; line-height:1.8;"> | <div style="padding:24px 28px; background:#211712; border:1px solid #5f452e; border-radius:7px; line-height:1.8;"> | ||
GorBot's managed update | GorBot's managed update model supports serialized rolling deployment rather than intentionally restarting every node at once. | ||
A controlled | A controlled update can: | ||
* | * prepare one node; | ||
* apply the update; | * apply the update; | ||
* verify that it returns; | * verify that it returns; | ||
* continue to the next | * continue to the next node. | ||
This helps reduce service interruption while allowing the fleet to move forward together. | |||
</div> | </div> | ||
</div> | </div> | ||
| Line 365: | Line 353: | ||
<div style="text-align:center; margin-bottom:24px;"> | <div style="text-align:center; margin-bottom:24px;"> | ||
<div style="font-size:28px; font-weight:bold; color:#e0b45d;">BACKUPS AND ROLLBACK</div> | <div style="font-size:28px; font-weight:bold; color:#e0b45d;">BACKUPS AND ROLLBACK</div> | ||
<div style="margin-top:6px; color:#a99a87; font-style:italic;">Reliability | <div style="margin-top:6px; color:#a99a87; font-style:italic;">Reliability also means being able to recover from a bad update.</div> | ||
</div> | </div> | ||
| Line 371: | Line 359: | ||
The managed platform includes centralized backup and rollback support. | The managed platform includes centralized backup and rollback support. | ||
Scheduled backups and retained release history provide recovery options when an update or local node problem causes unexpected behavior. | |||
This complements failover: | |||
* failover handles loss of active service capacity; | |||
* rollback handles bad software or broken deployment state. | |||
</div> | </div> | ||
</div> | </div> | ||
| Line 384: | Line 375: | ||
<div style="padding:30px 42px 10px 42px;"> | <div style="padding:30px 42px 10px 42px;"> | ||
<div style="text-align:center; margin-bottom:24px;"> | <div style="text-align:center; margin-bottom:24px;"> | ||
<div style="font-size:28px; font-weight:bold; color:#e0b45d;"> | <div style="font-size:28px; font-weight:bold; color:#e0b45d;">MANAGED NODE PROVISIONING</div> | ||
<div style="margin-top:6px; color:#a99a87; font-style:italic;">Adding capacity should | <div style="margin-top:6px; color:#a99a87; font-style:italic;">Adding capacity should be repeatable instead of becoming a custom installation project every time.</div> | ||
</div> | </div> | ||
<div style="padding:24px 28px; background:#211712; border:1px solid #5f452e; border-radius:7px; line-height:1.8;"> | <div style="padding:24px 28px; background:#211712; border:1px solid #5f452e; border-radius:7px; line-height:1.8;"> | ||
GorBot supports generated managed-node packages intended to simplify deployment. | |||
The | The design goal is a near-turnkey process: | ||
# generate a node; | # generate a node package; | ||
# download | # download it; | ||
# extract it; | # extract it; | ||
# start it; | # start it; | ||
# allow the node to enroll and retrieve its approved runtime configuration; | # allow the node to enroll and retrieve its approved runtime configuration; | ||
# verify Agent, Bot | # verify Agent, Bot, and Discord health. | ||
Supported deployment work has included: | Supported deployment work has included: | ||
| Line 406: | Line 397: | ||
* Docker. | * Docker. | ||
Each generated node uses its own managed credential and should only run one execution mode at a time. | |||
</div> | </div> | ||
</div> | </div> | ||
| Line 417: | Line 408: | ||
<div style="padding:30px 42px 10px 42px;"> | <div style="padding:30px 42px 10px 42px;"> | ||
<div style="text-align:center; margin-bottom:24px;"> | <div style="text-align:center; margin-bottom:24px;"> | ||
<div style="font-size:28px; font-weight:bold; color:#e0b45d;">SECURE PROVISIONING AND | <div style="font-size:28px; font-weight:bold; color:#e0b45d;">SECURE PROVISIONING AND RUNTIME CONFIGURATION</div> | ||
<div style="margin-top:6px; color:#a99a87; font-style:italic;"> | <div style="margin-top:6px; color:#a99a87; font-style:italic;">Managed deployment should not require placing long-lived secrets inside reusable downloads or runtime images.</div> | ||
</div> | </div> | ||
<div style="padding:24px 28px; background:#211712; border:1px solid #5f452e; border-radius:7px; line-height:1.8;"> | <div style="padding:24px 28px; background:#211712; border:1px solid #5f452e; border-radius:7px; line-height:1.8;"> | ||
Managed nodes enroll through | Managed nodes enroll through authenticated cluster services and retrieve the runtime information they require through protected provisioning paths. | ||
Private tooling and runtime secrets remain protected rather than being treated as public web assets. | |||
The generated-node model is designed so reusable runtime packages and container images do not need to contain long-lived production secrets. | |||
</div> | </div> | ||
</div> | </div> | ||
| Line 456: | Line 423: | ||
<!-- ========================================================= --> | <!-- ========================================================= --> | ||
<!-- | <!-- WEB INDEPENDENCE --> | ||
<!-- ========================================================= --> | <!-- ========================================================= --> | ||
<div style="padding:30px 42px 10px 42px;"> | <div style="padding:30px 42px 10px 42px;"> | ||
<div style="text-align:center; margin-bottom:24px;"> | <div style="text-align:center; margin-bottom:24px;"> | ||
<div style="font-size:28px; font-weight:bold; color:#e0b45d;"> | <div style="font-size:28px; font-weight:bold; color:#e0b45d;">THE SHARED WEB PLATFORM IS INDEPENDENT OF THE DISCORD NODES</div> | ||
<div style="margin-top:6px; color:#a99a87; font-style:italic;"> | <div style="margin-top:6px; color:#a99a87; font-style:italic;">The web layer should remain available even during Discord-node outages.</div> | ||
</div> | </div> | ||
<div style="padding:24px 28px; background:#211712; border:1px solid #5f452e; border-radius:7px; line-height:1.8;"> | <div style="padding:24px 28px; background:#211712; border:1px solid #5f452e; border-radius:7px; line-height:1.8;"> | ||
One of the most important architectural choices in GorBot is keeping shared web services separate from the managed Discord-node fleet. | |||
If one Discord node fails, the shared platform remains available. | |||
If several Discord nodes fail, shared SQL state, releases, backups, and web services remain independent of those individual machines. | |||
This | This keeps recovery and continuity from depending on the same node that just failed. | ||
</div> | </div> | ||
</div> | </div> | ||
| Line 490: | Line 450: | ||
<div style="padding:30px 42px 10px 42px;"> | <div style="padding:30px 42px 10px 42px;"> | ||
<div style="text-align:center; margin-bottom:24px;"> | <div style="text-align:center; margin-bottom:24px;"> | ||
<div style="font-size:28px; font-weight:bold; color:#e0b45d;"> | <div style="font-size:28px; font-weight:bold; color:#e0b45d;">BUILT TO GROW</div> | ||
<div style="margin-top:6px; color:#a99a87; font-style:italic;">The | <div style="margin-top:6px; color:#a99a87; font-style:italic;">The infrastructure should remain practical as more managed nodes are added.</div> | ||
</div> | </div> | ||
<div style="padding:24px 28px; background:#211712; border:1px solid #5f452e; border-radius:7px; line-height:1.8;"> | <div style="padding:24px 28px; background:#211712; border:1px solid #5f452e; border-radius:7px; line-height:1.8;"> | ||
GorBot | The GorBot cluster model is designed so additional managed nodes can add capacity, redundancy, or standby coverage without changing the basic service model. | ||
A larger fleet can include active shard-owning nodes and healthy standby capacity. | |||
This | This allows the platform to grow from a small number of qualification nodes into a larger mixed fleet of Windows, Linux, or containerized systems while still sharing one authoritative state and one coordinated Discord service. | ||
</div> | </div> | ||
</div> | </div> | ||
| Line 519: | Line 479: | ||
The RunUO server provides the persistent game world. | The RunUO server provides the persistent game world. | ||
GorBot's managed infrastructure provides the Discord cluster, web | GorBot's managed infrastructure provides the Discord cluster, web services, shared state, automation, roleplay profiles, NPC systems, and the high-availability services surrounding the community. | ||
The RunUO server is '''not''' a GorBot Discord sibling | The RunUO server itself is '''not''' a managed GorBot Discord sibling. | ||
</div> | </div> | ||
</div> | </div> | ||
| Line 533: | Line 493: | ||
<div style="text-align:center; margin-bottom:24px;"> | <div style="text-align:center; margin-bottom:24px;"> | ||
<div style="font-size:28px; font-weight:bold; color:#e0b45d;">COMMON QUESTIONS</div> | <div style="font-size:28px; font-weight:bold; color:#e0b45d;">COMMON QUESTIONS</div> | ||
<div style="margin-top:6px; color:#a99a87; font-style:italic;">A | <div style="margin-top:6px; color:#a99a87; font-style:italic;">A quick guide to the GorBot cluster model.</div> | ||
</div> | </div> | ||
| Line 540: | Line 500: | ||
| style="width:50%; vertical-align:top; padding:22px; background:#211712; border:1px solid #5f452e; border-radius:6px;" | | | style="width:50%; vertical-align:top; padding:22px; background:#211712; border:1px solid #5f452e; border-radius:6px;" | | ||
<div style="font-size:20px; font-weight:bold;">What happens if one GorBot node goes offline?</div> | <div style="font-size:20px; font-weight:bold;">What happens if one GorBot node goes offline?</div> | ||
<div style="margin-top:8px; line-height:1.6;"> | <div style="margin-top:8px; line-height:1.6;">Healthy capacity can be assigned its Gateway shards. The takeover is only considered successful when those replacement shards actually connect to Discord and reach READY.</div> | ||
| style="width:50%; vertical-align:top; padding:22px; background:#211712; border:1px solid #5f452e; border-radius:6px;" | | | style="width:50%; vertical-align:top; padding:22px; background:#211712; border:1px solid #5f452e; border-radius:6px;" | | ||
<div style="font-size:20px; font-weight:bold;">Does every node need the same weight?</div> | <div style="font-size:20px; font-weight:bold;">Does every node need the same weight?</div> | ||
<div style="margin-top:8px; line-height:1.6;">No. Weights are relative and can be used to prefer one node | <div style="margin-top:8px; line-height:1.6;">No. Weights are relative and can be used to balance nodes equally, prefer one node, or keep a node at weight 0 as hot standby.</div> | ||
|- | |- | ||
| style="width:50%; vertical-align:top; padding:22px; background:#211712; border:1px solid #5f452e; border-radius:6px;" | | | style="width:50%; vertical-align:top; padding:22px; background:#211712; border:1px solid #5f452e; border-radius:6px;" | | ||
<div style="font-size:20px; font-weight:bold;">Does “Online” mean Discord is healthy?</div> | <div style="font-size:20px; font-weight:bold;">Does “Online” automatically mean Discord is healthy?</div> | ||
<div style="margin-top:8px; line-height:1.6;"> | <div style="margin-top:8px; line-height:1.6;">No. Agent heartbeat, bot process state, Discord READY, connected shard count, and Gateway heartbeat acknowledgements all matter.</div> | ||
| style="width:50%; vertical-align:top; padding:22px; background:#211712; border:1px solid #5f452e; border-radius:6px;" | | | style="width:50%; vertical-align:top; padding:22px; background:#211712; border:1px solid #5f452e; border-radius:6px;" | | ||
<div style="font-size:20px; font-weight:bold;">Can the | <div style="font-size:20px; font-weight:bold;">Can the web platform stay available if a Discord node fails?</div> | ||
<div style="margin-top:8px; line-height:1.6;">Yes. | <div style="margin-top:8px; line-height:1.6;">Yes. Shared web services and authoritative state are intentionally hosted independently from any one managed Discord node.</div> | ||
|- | |- | ||
| style="width:50%; vertical-align:top; padding:22px; background:#211712; border:1px solid #5f452e; border-radius:6px;" | | | style="width:50%; vertical-align:top; padding:22px; background:#211712; border:1px solid #5f452e; border-radius:6px;" | | ||
<div style="font-size:20px; font-weight:bold;">Is the RunUO server one of the GorBot nodes?</div> | <div style="font-size:20px; font-weight:bold;">Is the RunUO server one of the GorBot Discord nodes?</div> | ||
<div style="margin-top:8px; line-height:1.6;">No. | <div style="margin-top:8px; line-height:1.6;">No. It is part of the same Gor Ultima ecosystem, but the game server itself is not a managed GorBot Discord sibling.</div> | ||
| style="width:50%; vertical-align:top; padding:22px; background:#211712; border:1px solid #5f452e; border-radius:6px;" | | | style="width:50%; vertical-align:top; padding:22px; background:#211712; border:1px solid #5f452e; border-radius:6px;" | | ||
<div style="font-size:20px; font-weight:bold;">Can | <div style="font-size:20px; font-weight:bold;">Can GorBot nodes be updated centrally?</div> | ||
<div style="margin-top:8px; line-height:1.6;">Yes. Managed Agent and NodeApp | <div style="margin-top:8px; line-height:1.6;">Yes. Managed Agent and NodeApp releases can be coordinated centrally and rolled through the fleet in sequence.</div> | ||
|} | |} | ||
</div> | </div> | ||
| Line 574: | Line 534: | ||
<div style="font-size:25px; font-weight:bold; color:#e1bf7a;">A community platform should be able to outlive the machine that happens to be running it today.</div> | <div style="font-size:25px; font-weight:bold; color:#e1bf7a;">A community platform should be able to outlive the machine that happens to be running it today.</div> | ||
<div style="margin-top:10px; font-size:17px; color:#c9bba6;">Managed nodes. Shared state. Hot standby. Failover. Weighted load. Central updates. Backups. Web control.</div> | <div style="margin-top:10px; font-size:17px; color:#c9bba6;">Managed nodes. Shared state. Hot standby. Failover. Weighted load. Central updates. Backups. Web control.</div> | ||
<div style="margin-top:16px; font-size:14px; color:#998b79; font-style:italic;">GorBot's | <div style="margin-top:16px; font-size:14px; color:#998b79; font-style:italic;">GorBot's infrastructure is built so the platform can grow, recover, and remain maintainable without depending on one permanent Discord machine.</div> | ||
</div> | </div> | ||
</div> | </div> | ||
</div> | </div> | ||
Latest revision as of 02:43, 17 August 2026