@babylonjs-toolkit/server 0.0.0-stage → 9.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (236) hide show
  1. package/CUSTOM.md +1690 -0
  2. package/DEPLOY.md +2012 -0
  3. package/README.md +1081 -2
  4. package/lib/AbuseLimits.d.ts +64 -0
  5. package/lib/AbuseLimits.js +121 -0
  6. package/lib/Authentication.d.ts +86 -0
  7. package/lib/Authentication.js +272 -0
  8. package/lib/BootSessionOwner.d.ts +86 -0
  9. package/lib/BootSessionOwner.js +116 -0
  10. package/lib/ColyseusLoggerAdapter.d.ts +32 -0
  11. package/lib/ColyseusLoggerAdapter.js +73 -0
  12. package/lib/DedicatedSceneRegistry.d.ts +52 -0
  13. package/lib/DedicatedSceneRegistry.js +74 -0
  14. package/lib/DedicatedSession.d.ts +152 -0
  15. package/lib/DedicatedSession.js +173 -0
  16. package/lib/DualTransport.d.ts +112 -0
  17. package/lib/DualTransport.js +197 -0
  18. package/lib/GameServer.d.ts +64 -0
  19. package/lib/GameServer.js +647 -0
  20. package/lib/GameServerConfig.d.ts +387 -0
  21. package/lib/GameServerConfig.js +1059 -0
  22. package/lib/GameServerLobbyRoom.d.ts +33 -0
  23. package/lib/GameServerLobbyRoom.js +56 -0
  24. package/lib/GameServerLogger.d.ts +111 -0
  25. package/lib/GameServerLogger.js +190 -0
  26. package/lib/GameServerMetrics.d.ts +158 -0
  27. package/lib/GameServerMetrics.js +276 -0
  28. package/lib/GameServerState.d.ts +164 -0
  29. package/lib/GameServerState.js +26 -0
  30. package/lib/HeadlessRuntime.d.ts +316 -0
  31. package/lib/HeadlessRuntime.js +380 -0
  32. package/lib/JoinGate.d.ts +34 -0
  33. package/lib/JoinGate.js +221 -0
  34. package/lib/NetworkAddresses.d.ts +33 -0
  35. package/lib/NetworkAddresses.js +90 -0
  36. package/lib/PlayerTokens.d.ts +17 -0
  37. package/lib/PlayerTokens.js +24 -0
  38. package/lib/RoomServerTransport.d.ts +73 -0
  39. package/lib/RoomServerTransport.js +90 -0
  40. package/lib/ServerEndpoints.d.ts +133 -0
  41. package/lib/ServerEndpoints.js +247 -0
  42. package/lib/ServerInit.d.ts +28 -0
  43. package/lib/ServerInit.js +113 -0
  44. package/lib/SessionRoom.d.ts +391 -0
  45. package/lib/SessionRoom.js +930 -0
  46. package/lib/TlsCertificates.d.ts +35 -0
  47. package/lib/TlsCertificates.js +130 -0
  48. package/lib/admin/AccountRoutes.d.ts +8 -0
  49. package/lib/admin/AccountRoutes.js +502 -0
  50. package/lib/admin/AdminAccounts.d.ts +329 -0
  51. package/lib/admin/AdminAccounts.js +607 -0
  52. package/lib/admin/AdminApiRouter.d.ts +202 -0
  53. package/lib/admin/AdminApiRouter.js +465 -0
  54. package/lib/admin/AdminApiTypes.d.ts +1782 -0
  55. package/lib/admin/AdminApiTypes.js +4 -0
  56. package/lib/admin/AdminAudit.d.ts +113 -0
  57. package/lib/admin/AdminAudit.js +266 -0
  58. package/lib/admin/AdminCli.d.ts +7 -0
  59. package/lib/admin/AdminCli.js +351 -0
  60. package/lib/admin/AdminClock.d.ts +51 -0
  61. package/lib/admin/AdminClock.js +10 -0
  62. package/lib/admin/AdminConsole.d.ts +39 -0
  63. package/lib/admin/AdminConsole.js +325 -0
  64. package/lib/admin/AdminConstants.d.ts +147 -0
  65. package/lib/admin/AdminConstants.js +167 -0
  66. package/lib/admin/AdminCrypto.d.ts +19 -0
  67. package/lib/admin/AdminCrypto.js +29 -0
  68. package/lib/admin/AdminExtensionsHost.d.ts +176 -0
  69. package/lib/admin/AdminExtensionsHost.js +307 -0
  70. package/lib/admin/AdminPasswords.d.ts +33 -0
  71. package/lib/admin/AdminPasswords.js +92 -0
  72. package/lib/admin/AdminPermissions.d.ts +28 -0
  73. package/lib/admin/AdminPermissions.js +74 -0
  74. package/lib/admin/AdminRecords.d.ts +196 -0
  75. package/lib/admin/AdminRecords.js +3 -0
  76. package/lib/admin/AdminRequestBodies.d.ts +47 -0
  77. package/lib/admin/AdminRequestBodies.js +84 -0
  78. package/lib/admin/AdminRequestGate.d.ts +38 -0
  79. package/lib/admin/AdminRequestGate.js +59 -0
  80. package/lib/admin/AdminResponses.d.ts +103 -0
  81. package/lib/admin/AdminResponses.js +164 -0
  82. package/lib/admin/AdminServices.d.ts +99 -0
  83. package/lib/admin/AdminServices.js +4 -0
  84. package/lib/admin/AdminStaticFiles.d.ts +29 -0
  85. package/lib/admin/AdminStaticFiles.js +97 -0
  86. package/lib/admin/AdminStore.d.ts +152 -0
  87. package/lib/admin/AdminStore.js +46 -0
  88. package/lib/admin/AlertChannels.d.ts +43 -0
  89. package/lib/admin/AlertChannels.js +120 -0
  90. package/lib/admin/AlertEngine.d.ts +231 -0
  91. package/lib/admin/AlertEngine.js +681 -0
  92. package/lib/admin/AlertRoutes.d.ts +8 -0
  93. package/lib/admin/AlertRoutes.js +180 -0
  94. package/lib/admin/ApiKeyRoutes.d.ts +8 -0
  95. package/lib/admin/ApiKeyRoutes.js +53 -0
  96. package/lib/admin/ApiKeys.d.ts +63 -0
  97. package/lib/admin/ApiKeys.js +167 -0
  98. package/lib/admin/AuditRoutes.d.ts +8 -0
  99. package/lib/admin/AuditRoutes.js +106 -0
  100. package/lib/admin/AuthToolRoutes.d.ts +13 -0
  101. package/lib/admin/AuthToolRoutes.js +164 -0
  102. package/lib/admin/BanList.d.ts +87 -0
  103. package/lib/admin/BanList.js +152 -0
  104. package/lib/admin/CborDecoder.d.ts +18 -0
  105. package/lib/admin/CborDecoder.js +201 -0
  106. package/lib/admin/ColyseusCloudClient.d.ts +313 -0
  107. package/lib/admin/ColyseusCloudClient.js +272 -0
  108. package/lib/admin/ColyseusCloudRoutes.d.ts +8 -0
  109. package/lib/admin/ColyseusCloudRoutes.js +91 -0
  110. package/lib/admin/ColyseusCloudService.d.ts +180 -0
  111. package/lib/admin/ColyseusCloudService.js +476 -0
  112. package/lib/admin/ColyseusCloudSettings.d.ts +16 -0
  113. package/lib/admin/ColyseusCloudSettings.js +29 -0
  114. package/lib/admin/ColyseusCloudViews.d.ts +105 -0
  115. package/lib/admin/ColyseusCloudViews.js +371 -0
  116. package/lib/admin/CommonPasswords.d.ts +6 -0
  117. package/lib/admin/CommonPasswords.js +19 -0
  118. package/lib/admin/ConfigOverrides.d.ts +174 -0
  119. package/lib/admin/ConfigOverrides.js +406 -0
  120. package/lib/admin/ConfigRoutes.d.ts +8 -0
  121. package/lib/admin/ConfigRoutes.js +91 -0
  122. package/lib/admin/ConsoleSessions.d.ts +112 -0
  123. package/lib/admin/ConsoleSessions.js +201 -0
  124. package/lib/admin/DedicatedRoutes.d.ts +21 -0
  125. package/lib/admin/DedicatedRoutes.js +254 -0
  126. package/lib/admin/ExtensionRoutes.d.ts +8 -0
  127. package/lib/admin/ExtensionRoutes.js +145 -0
  128. package/lib/admin/FileAdminStore.d.ts +157 -0
  129. package/lib/admin/FileAdminStore.js +349 -0
  130. package/lib/admin/FleetDirectory.d.ts +323 -0
  131. package/lib/admin/FleetDirectory.js +489 -0
  132. package/lib/admin/FleetLeader.d.ts +43 -0
  133. package/lib/admin/FleetLeader.js +89 -0
  134. package/lib/admin/FleetRoutes.d.ts +55 -0
  135. package/lib/admin/FleetRoutes.js +465 -0
  136. package/lib/admin/HealthWarnings.d.ts +10 -0
  137. package/lib/admin/HealthWarnings.js +95 -0
  138. package/lib/admin/LeaderboardRoutes.d.ts +8 -0
  139. package/lib/admin/LeaderboardRoutes.js +569 -0
  140. package/lib/admin/LogBuffer.d.ts +60 -0
  141. package/lib/admin/LogBuffer.js +92 -0
  142. package/lib/admin/LogRedaction.d.ts +15 -0
  143. package/lib/admin/LogRedaction.js +72 -0
  144. package/lib/admin/LogRoutes.d.ts +45 -0
  145. package/lib/admin/LogRoutes.js +307 -0
  146. package/lib/admin/MaintenanceMode.d.ts +41 -0
  147. package/lib/admin/MaintenanceMode.js +74 -0
  148. package/lib/admin/MaintenanceWindows.d.ts +91 -0
  149. package/lib/admin/MaintenanceWindows.js +207 -0
  150. package/lib/admin/MetricsRoutes.d.ts +8 -0
  151. package/lib/admin/MetricsRoutes.js +209 -0
  152. package/lib/admin/MetricsSampler.d.ts +124 -0
  153. package/lib/admin/MetricsSampler.js +211 -0
  154. package/lib/admin/OneTimeCodes.d.ts +60 -0
  155. package/lib/admin/OneTimeCodes.js +162 -0
  156. package/lib/admin/OpenIdConnect.d.ts +146 -0
  157. package/lib/admin/OpenIdConnect.js +335 -0
  158. package/lib/admin/Passkeys.d.ts +130 -0
  159. package/lib/admin/Passkeys.js +432 -0
  160. package/lib/admin/PlayerRoutes.d.ts +20 -0
  161. package/lib/admin/PlayerRoutes.js +676 -0
  162. package/lib/admin/RedisAdminStore.d.ts +114 -0
  163. package/lib/admin/RedisAdminStore.js +258 -0
  164. package/lib/admin/RolloutCoordinator.d.ts +99 -0
  165. package/lib/admin/RolloutCoordinator.js +321 -0
  166. package/lib/admin/ServerEvents.d.ts +57 -0
  167. package/lib/admin/ServerEvents.js +89 -0
  168. package/lib/admin/SessionRoutes.d.ts +113 -0
  169. package/lib/admin/SessionRoutes.js +386 -0
  170. package/lib/admin/UserRoutes.d.ts +8 -0
  171. package/lib/admin/UserRoutes.js +214 -0
  172. package/lib/cli.d.ts +2 -0
  173. package/lib/cli.js +221 -0
  174. package/lib/console/assets/index-CI5N7c-T.js +21 -0
  175. package/lib/console/assets/index-DPitvzLp.css +1 -0
  176. package/lib/console/favicon.svg +1 -0
  177. package/lib/console/index.html +16 -0
  178. package/lib/discord/DiscordOAuth.d.ts +57 -0
  179. package/lib/discord/DiscordOAuth.js +127 -0
  180. package/lib/discord/DiscordSessions.d.ts +79 -0
  181. package/lib/discord/DiscordSessions.js +135 -0
  182. package/lib/discord/DiscordSignInConstants.d.ts +54 -0
  183. package/lib/discord/DiscordSignInConstants.js +55 -0
  184. package/lib/discord/DiscordSignInRoutes.d.ts +51 -0
  185. package/lib/discord/DiscordSignInRoutes.js +359 -0
  186. package/lib/index.d.ts +24 -0
  187. package/lib/index.js +18 -0
  188. package/lib/leaderboards/FileLeaderboardRankStore.d.ts +293 -0
  189. package/lib/leaderboards/FileLeaderboardRankStore.js +808 -0
  190. package/lib/leaderboards/LeaderboardConstants.d.ts +63 -0
  191. package/lib/leaderboards/LeaderboardConstants.js +70 -0
  192. package/lib/leaderboards/LeaderboardError.d.ts +15 -0
  193. package/lib/leaderboards/LeaderboardError.js +20 -0
  194. package/lib/leaderboards/LeaderboardIdentity.d.ts +44 -0
  195. package/lib/leaderboards/LeaderboardIdentity.js +72 -0
  196. package/lib/leaderboards/LeaderboardPublicApi.d.ts +17 -0
  197. package/lib/leaderboards/LeaderboardPublicApi.js +389 -0
  198. package/lib/leaderboards/LeaderboardRankStore.d.ts +296 -0
  199. package/lib/leaderboards/LeaderboardRankStore.js +18 -0
  200. package/lib/leaderboards/LeaderboardRules.d.ts +122 -0
  201. package/lib/leaderboards/LeaderboardRules.js +472 -0
  202. package/lib/leaderboards/LeaderboardScheduler.d.ts +43 -0
  203. package/lib/leaderboards/LeaderboardScheduler.js +103 -0
  204. package/lib/leaderboards/LeaderboardService.d.ts +669 -0
  205. package/lib/leaderboards/LeaderboardService.js +1667 -0
  206. package/lib/leaderboards/LeaderboardTransfer.d.ts +35 -0
  207. package/lib/leaderboards/LeaderboardTransfer.js +580 -0
  208. package/lib/leaderboards/RedisLeaderboardRankStore.d.ts +282 -0
  209. package/lib/leaderboards/RedisLeaderboardRankStore.js +691 -0
  210. package/package.json +64 -4
  211. package/templates/init/Caddyfile +6 -0
  212. package/templates/init/DEPLOY.md +233 -0
  213. package/templates/init/Dockerfile +12 -0
  214. package/templates/init/app.json +21 -0
  215. package/templates/init/aws/README.md +118 -0
  216. package/templates/init/aws/ecs-fargate-alb.yml +207 -0
  217. package/templates/init/aws/ecs-fargate-nlb-quic.yml +210 -0
  218. package/templates/init/babylon-game-server.config.mjs +158 -0
  219. package/templates/init/colyseus-cloud/README.md +133 -0
  220. package/templates/init/colyseus-cloud/babylon-game-server.config.mjs +36 -0
  221. package/templates/init/colyseus-cloud/ecosystem.config.cjs +35 -0
  222. package/templates/init/colyseus-cloud/gitignore +6 -0
  223. package/templates/init/colyseus-cloud/package.json +15 -0
  224. package/templates/init/digitalocean-app.yaml +30 -0
  225. package/templates/init/docker-compose.full.yml +45 -0
  226. package/templates/init/docker-compose.websocket.yml +41 -0
  227. package/templates/init/fly.toml +56 -0
  228. package/templates/init/heroku.yml +11 -0
  229. package/templates/init/kubernetes/deployment.yaml +71 -0
  230. package/templates/init/kubernetes/redis.yaml +73 -0
  231. package/templates/init/kubernetes/service.yaml +24 -0
  232. package/templates/init/monitoring/grafana-dashboard.json +539 -0
  233. package/templates/init/monitoring/prometheus-alerts.yml +51 -0
  234. package/templates/init/monitoring/prometheus-scrape.yml +17 -0
  235. package/templates/init/railway.json +13 -0
  236. package/templates/init/render.yaml +19 -0
@@ -0,0 +1,539 @@
1
+ {
2
+ "__inputs": [
3
+ {
4
+ "name": "DS_PROMETHEUS",
5
+ "label": "Prometheus",
6
+ "description": "The Prometheus that scrapes the game servers",
7
+ "type": "datasource",
8
+ "pluginId": "prometheus",
9
+ "pluginName": "Prometheus"
10
+ }
11
+ ],
12
+ "__requires": [
13
+ {
14
+ "type": "datasource",
15
+ "id": "prometheus",
16
+ "name": "Prometheus",
17
+ "version": "1.0.0"
18
+ },
19
+ {
20
+ "type": "panel",
21
+ "id": "timeseries",
22
+ "name": "Time series",
23
+ "version": ""
24
+ }
25
+ ],
26
+ "title": "Babylon Game Server",
27
+ "uid": "babylon-game-server",
28
+ "description": "Players, sessions, traffic, process health and dedicated runner timing of a Babylon Game Server fleet.",
29
+ "tags": [
30
+ "babylon-game-server"
31
+ ],
32
+ "schemaVersion": 39,
33
+ "version": 1,
34
+ "editable": true,
35
+ "refresh": "30s",
36
+ "time": {
37
+ "from": "now-6h",
38
+ "to": "now"
39
+ },
40
+ "templating": {
41
+ "list": []
42
+ },
43
+ "annotations": {
44
+ "list": []
45
+ },
46
+ "panels": [
47
+ {
48
+ "id": 1,
49
+ "type": "timeseries",
50
+ "title": "Players",
51
+ "datasource": {
52
+ "type": "prometheus",
53
+ "uid": "${DS_PROMETHEUS}"
54
+ },
55
+ "gridPos": {
56
+ "h": 8,
57
+ "w": 12,
58
+ "x": 0,
59
+ "y": 0
60
+ },
61
+ "fieldConfig": {
62
+ "defaults": {
63
+ "unit": "short"
64
+ },
65
+ "overrides": []
66
+ },
67
+ "options": {
68
+ "legend": {
69
+ "displayMode": "list",
70
+ "placement": "bottom",
71
+ "showLegend": true
72
+ },
73
+ "tooltip": {
74
+ "mode": "multi",
75
+ "sort": "none"
76
+ }
77
+ },
78
+ "targets": [
79
+ {
80
+ "refId": "A",
81
+ "datasource": {
82
+ "type": "prometheus",
83
+ "uid": "${DS_PROMETHEUS}"
84
+ },
85
+ "expr": "sum(babylon_game_server_players)",
86
+ "legendFormat": "players"
87
+ }
88
+ ]
89
+ },
90
+ {
91
+ "id": 2,
92
+ "type": "timeseries",
93
+ "title": "Sessions",
94
+ "datasource": {
95
+ "type": "prometheus",
96
+ "uid": "${DS_PROMETHEUS}"
97
+ },
98
+ "gridPos": {
99
+ "h": 8,
100
+ "w": 12,
101
+ "x": 12,
102
+ "y": 0
103
+ },
104
+ "fieldConfig": {
105
+ "defaults": {
106
+ "unit": "short"
107
+ },
108
+ "overrides": []
109
+ },
110
+ "options": {
111
+ "legend": {
112
+ "displayMode": "list",
113
+ "placement": "bottom",
114
+ "showLegend": true
115
+ },
116
+ "tooltip": {
117
+ "mode": "multi",
118
+ "sort": "none"
119
+ }
120
+ },
121
+ "targets": [
122
+ {
123
+ "refId": "A",
124
+ "datasource": {
125
+ "type": "prometheus",
126
+ "uid": "${DS_PROMETHEUS}"
127
+ },
128
+ "expr": "sum(babylon_game_server_sessions)",
129
+ "legendFormat": "sessions"
130
+ }
131
+ ]
132
+ },
133
+ {
134
+ "id": 3,
135
+ "type": "timeseries",
136
+ "title": "Joins and refusals per second",
137
+ "datasource": {
138
+ "type": "prometheus",
139
+ "uid": "${DS_PROMETHEUS}"
140
+ },
141
+ "gridPos": {
142
+ "h": 8,
143
+ "w": 12,
144
+ "x": 0,
145
+ "y": 8
146
+ },
147
+ "fieldConfig": {
148
+ "defaults": {
149
+ "unit": "reqps"
150
+ },
151
+ "overrides": []
152
+ },
153
+ "options": {
154
+ "legend": {
155
+ "displayMode": "list",
156
+ "placement": "bottom",
157
+ "showLegend": true
158
+ },
159
+ "tooltip": {
160
+ "mode": "multi",
161
+ "sort": "none"
162
+ }
163
+ },
164
+ "targets": [
165
+ {
166
+ "refId": "A",
167
+ "datasource": {
168
+ "type": "prometheus",
169
+ "uid": "${DS_PROMETHEUS}"
170
+ },
171
+ "expr": "sum(rate(babylon_game_server_joins_total{result=\"accepted\"}[5m]))",
172
+ "legendFormat": "joins"
173
+ },
174
+ {
175
+ "refId": "B",
176
+ "datasource": {
177
+ "type": "prometheus",
178
+ "uid": "${DS_PROMETHEUS}"
179
+ },
180
+ "expr": "sum by (reason) (rate(babylon_game_server_refusals_total[5m]))",
181
+ "legendFormat": "refused: {{reason}}"
182
+ }
183
+ ]
184
+ },
185
+ {
186
+ "id": 4,
187
+ "type": "timeseries",
188
+ "title": "Frame bytes per second",
189
+ "datasource": {
190
+ "type": "prometheus",
191
+ "uid": "${DS_PROMETHEUS}"
192
+ },
193
+ "gridPos": {
194
+ "h": 8,
195
+ "w": 12,
196
+ "x": 12,
197
+ "y": 8
198
+ },
199
+ "fieldConfig": {
200
+ "defaults": {
201
+ "unit": "Bps"
202
+ },
203
+ "overrides": []
204
+ },
205
+ "options": {
206
+ "legend": {
207
+ "displayMode": "list",
208
+ "placement": "bottom",
209
+ "showLegend": true
210
+ },
211
+ "tooltip": {
212
+ "mode": "multi",
213
+ "sort": "none"
214
+ }
215
+ },
216
+ "targets": [
217
+ {
218
+ "refId": "A",
219
+ "datasource": {
220
+ "type": "prometheus",
221
+ "uid": "${DS_PROMETHEUS}"
222
+ },
223
+ "expr": "sum by (direction) (rate(babylon_game_server_bytes_total[5m]))",
224
+ "legendFormat": "{{direction}}"
225
+ }
226
+ ]
227
+ },
228
+ {
229
+ "id": 5,
230
+ "type": "timeseries",
231
+ "title": "Room messages per second",
232
+ "datasource": {
233
+ "type": "prometheus",
234
+ "uid": "${DS_PROMETHEUS}"
235
+ },
236
+ "gridPos": {
237
+ "h": 8,
238
+ "w": 12,
239
+ "x": 0,
240
+ "y": 16
241
+ },
242
+ "fieldConfig": {
243
+ "defaults": {
244
+ "unit": "short"
245
+ },
246
+ "overrides": []
247
+ },
248
+ "options": {
249
+ "legend": {
250
+ "displayMode": "list",
251
+ "placement": "bottom",
252
+ "showLegend": true
253
+ },
254
+ "tooltip": {
255
+ "mode": "multi",
256
+ "sort": "none"
257
+ }
258
+ },
259
+ "targets": [
260
+ {
261
+ "refId": "A",
262
+ "datasource": {
263
+ "type": "prometheus",
264
+ "uid": "${DS_PROMETHEUS}"
265
+ },
266
+ "expr": "sum by (direction) (rate(babylon_game_server_messages_total[5m]))",
267
+ "legendFormat": "{{direction}}"
268
+ }
269
+ ]
270
+ },
271
+ {
272
+ "id": 6,
273
+ "type": "timeseries",
274
+ "title": "CPU",
275
+ "datasource": {
276
+ "type": "prometheus",
277
+ "uid": "${DS_PROMETHEUS}"
278
+ },
279
+ "gridPos": {
280
+ "h": 8,
281
+ "w": 12,
282
+ "x": 12,
283
+ "y": 16
284
+ },
285
+ "fieldConfig": {
286
+ "defaults": {
287
+ "unit": "percent"
288
+ },
289
+ "overrides": []
290
+ },
291
+ "options": {
292
+ "legend": {
293
+ "displayMode": "list",
294
+ "placement": "bottom",
295
+ "showLegend": true
296
+ },
297
+ "tooltip": {
298
+ "mode": "multi",
299
+ "sort": "none"
300
+ }
301
+ },
302
+ "targets": [
303
+ {
304
+ "refId": "A",
305
+ "datasource": {
306
+ "type": "prometheus",
307
+ "uid": "${DS_PROMETHEUS}"
308
+ },
309
+ "expr": "rate(babylon_game_server_process_cpu_seconds_total[5m]) * 100",
310
+ "legendFormat": "{{instance}}"
311
+ }
312
+ ]
313
+ },
314
+ {
315
+ "id": 7,
316
+ "type": "timeseries",
317
+ "title": "Memory",
318
+ "datasource": {
319
+ "type": "prometheus",
320
+ "uid": "${DS_PROMETHEUS}"
321
+ },
322
+ "gridPos": {
323
+ "h": 8,
324
+ "w": 12,
325
+ "x": 0,
326
+ "y": 24
327
+ },
328
+ "fieldConfig": {
329
+ "defaults": {
330
+ "unit": "bytes"
331
+ },
332
+ "overrides": []
333
+ },
334
+ "options": {
335
+ "legend": {
336
+ "displayMode": "list",
337
+ "placement": "bottom",
338
+ "showLegend": true
339
+ },
340
+ "tooltip": {
341
+ "mode": "multi",
342
+ "sort": "none"
343
+ }
344
+ },
345
+ "targets": [
346
+ {
347
+ "refId": "A",
348
+ "datasource": {
349
+ "type": "prometheus",
350
+ "uid": "${DS_PROMETHEUS}"
351
+ },
352
+ "expr": "babylon_game_server_process_resident_memory_bytes",
353
+ "legendFormat": "resident {{instance}}"
354
+ },
355
+ {
356
+ "refId": "B",
357
+ "datasource": {
358
+ "type": "prometheus",
359
+ "uid": "${DS_PROMETHEUS}"
360
+ },
361
+ "expr": "babylon_game_server_nodejs_heap_size_used_bytes",
362
+ "legendFormat": "heap {{instance}}"
363
+ }
364
+ ]
365
+ },
366
+ {
367
+ "id": 8,
368
+ "type": "timeseries",
369
+ "title": "Event-loop lag p99",
370
+ "datasource": {
371
+ "type": "prometheus",
372
+ "uid": "${DS_PROMETHEUS}"
373
+ },
374
+ "gridPos": {
375
+ "h": 8,
376
+ "w": 12,
377
+ "x": 12,
378
+ "y": 24
379
+ },
380
+ "fieldConfig": {
381
+ "defaults": {
382
+ "unit": "s"
383
+ },
384
+ "overrides": []
385
+ },
386
+ "options": {
387
+ "legend": {
388
+ "displayMode": "list",
389
+ "placement": "bottom",
390
+ "showLegend": true
391
+ },
392
+ "tooltip": {
393
+ "mode": "multi",
394
+ "sort": "none"
395
+ }
396
+ },
397
+ "targets": [
398
+ {
399
+ "refId": "A",
400
+ "datasource": {
401
+ "type": "prometheus",
402
+ "uid": "${DS_PROMETHEUS}"
403
+ },
404
+ "expr": "babylon_game_server_nodejs_eventloop_lag_p99_seconds",
405
+ "legendFormat": "{{instance}}"
406
+ }
407
+ ]
408
+ },
409
+ {
410
+ "id": 9,
411
+ "type": "timeseries",
412
+ "title": "Garbage collection time per second",
413
+ "datasource": {
414
+ "type": "prometheus",
415
+ "uid": "${DS_PROMETHEUS}"
416
+ },
417
+ "gridPos": {
418
+ "h": 8,
419
+ "w": 12,
420
+ "x": 0,
421
+ "y": 32
422
+ },
423
+ "fieldConfig": {
424
+ "defaults": {
425
+ "unit": "s"
426
+ },
427
+ "overrides": []
428
+ },
429
+ "options": {
430
+ "legend": {
431
+ "displayMode": "list",
432
+ "placement": "bottom",
433
+ "showLegend": true
434
+ },
435
+ "tooltip": {
436
+ "mode": "multi",
437
+ "sort": "none"
438
+ }
439
+ },
440
+ "targets": [
441
+ {
442
+ "refId": "A",
443
+ "datasource": {
444
+ "type": "prometheus",
445
+ "uid": "${DS_PROMETHEUS}"
446
+ },
447
+ "expr": "rate(babylon_game_server_nodejs_gc_duration_seconds_sum[5m])",
448
+ "legendFormat": "{{instance}}"
449
+ }
450
+ ]
451
+ },
452
+ {
453
+ "id": 10,
454
+ "type": "timeseries",
455
+ "title": "Dedicated frame time p95",
456
+ "datasource": {
457
+ "type": "prometheus",
458
+ "uid": "${DS_PROMETHEUS}"
459
+ },
460
+ "gridPos": {
461
+ "h": 8,
462
+ "w": 12,
463
+ "x": 12,
464
+ "y": 32
465
+ },
466
+ "fieldConfig": {
467
+ "defaults": {
468
+ "unit": "s"
469
+ },
470
+ "overrides": []
471
+ },
472
+ "options": {
473
+ "legend": {
474
+ "displayMode": "list",
475
+ "placement": "bottom",
476
+ "showLegend": true
477
+ },
478
+ "tooltip": {
479
+ "mode": "multi",
480
+ "sort": "none"
481
+ }
482
+ },
483
+ "targets": [
484
+ {
485
+ "refId": "A",
486
+ "datasource": {
487
+ "type": "prometheus",
488
+ "uid": "${DS_PROMETHEUS}"
489
+ },
490
+ "expr": "histogram_quantile(0.95, sum by (le) (rate(babylon_game_server_dedicated_frame_seconds_bucket[5m])))",
491
+ "legendFormat": "p95"
492
+ }
493
+ ]
494
+ },
495
+ {
496
+ "id": 11,
497
+ "type": "timeseries",
498
+ "title": "Dedicated tick overruns per second",
499
+ "datasource": {
500
+ "type": "prometheus",
501
+ "uid": "${DS_PROMETHEUS}"
502
+ },
503
+ "gridPos": {
504
+ "h": 8,
505
+ "w": 12,
506
+ "x": 0,
507
+ "y": 40
508
+ },
509
+ "fieldConfig": {
510
+ "defaults": {
511
+ "unit": "short"
512
+ },
513
+ "overrides": []
514
+ },
515
+ "options": {
516
+ "legend": {
517
+ "displayMode": "list",
518
+ "placement": "bottom",
519
+ "showLegend": true
520
+ },
521
+ "tooltip": {
522
+ "mode": "multi",
523
+ "sort": "none"
524
+ }
525
+ },
526
+ "targets": [
527
+ {
528
+ "refId": "A",
529
+ "datasource": {
530
+ "type": "prometheus",
531
+ "uid": "${DS_PROMETHEUS}"
532
+ },
533
+ "expr": "sum(rate(babylon_game_server_dedicated_tick_overruns_total[5m]))",
534
+ "legendFormat": "overruns"
535
+ }
536
+ ]
537
+ }
538
+ ]
539
+ }
@@ -0,0 +1,51 @@
1
+ # Prometheus alert rules for the Babylon Game Server. They mirror the admin console's built-in alert rules where
2
+ # Prometheus can see the same figures: instanceLost, refusalSpike, authFailureSpike, eventLoopLag, memoryHigh and
3
+ # dedicatedOverruns, with the console's default thresholds. The console's other rules (instanceNotReady,
4
+ # redisUnreachable, certificateExpiring, versionMismatch, nearLimits, newAdminAddress, accountLockout) read data the
5
+ # metrics endpoint does not publish, so they run in the console only.
6
+ # Load this file through rule_files in prometheus.yml. The job name matches prometheus-scrape.yml.
7
+ groups:
8
+ - name: babylon-game-server
9
+ rules:
10
+ - alert: GameServerInstanceLost
11
+ expr: up{job="babylon-game-server"} == 0
12
+ for: 1m
13
+ labels:
14
+ severity: critical
15
+ annotations:
16
+ summary: "Game server {{ $labels.instance }} is not answering metrics scrapes"
17
+ - alert: GameServerRefusalSpike
18
+ expr: sum(rate(babylon_game_server_refusals_total[5m])) * 60 > 60
19
+ for: 5m
20
+ labels:
21
+ severity: warning
22
+ annotations:
23
+ summary: "The fleet refuses {{ $value | humanize }} joins per minute"
24
+ - alert: GameServerAuthFailureSpike
25
+ expr: sum(rate(babylon_game_server_auth_failures_total[5m])) * 60 > 30
26
+ for: 5m
27
+ labels:
28
+ severity: warning
29
+ annotations:
30
+ summary: "The fleet sees {{ $value | humanize }} failed token checks per minute"
31
+ - alert: GameServerEventLoopLag
32
+ expr: babylon_game_server_nodejs_eventloop_lag_mean_seconds * 1000 > 200
33
+ for: 5m
34
+ labels:
35
+ severity: warning
36
+ annotations:
37
+ summary: "Game server {{ $labels.instance }} event loop lags {{ $value | humanize }} ms"
38
+ - alert: GameServerMemoryHigh
39
+ expr: babylon_game_server_process_resident_memory_bytes > 1536 * 1024 * 1024
40
+ for: 5m
41
+ labels:
42
+ severity: warning
43
+ annotations:
44
+ summary: "Game server {{ $labels.instance }} uses {{ $value | humanize1024 }}B of memory"
45
+ - alert: GameServerDedicatedOverruns
46
+ expr: sum(rate(babylon_game_server_dedicated_tick_overruns_total[5m])) * 60 > 30
47
+ for: 5m
48
+ labels:
49
+ severity: warning
50
+ annotations:
51
+ summary: "Dedicated runners overran {{ $value | humanize }} ticks per minute"
@@ -0,0 +1,17 @@
1
+ # Prometheus scrape config for the Babylon Game Server (GET /metrics on the server's own port).
2
+ # Merge this job into your prometheus.yml and list every instance as a target (or use your platform's service
3
+ # discovery). The metric names all start with babylon_game_server_.
4
+ scrape_configs:
5
+ - job_name: babylon-game-server
6
+ metrics_path: /metrics
7
+ scrape_interval: 15s
8
+ static_configs:
9
+ - targets:
10
+ - "game-server:2567"
11
+ # When the server protects its metrics (GAME_SERVER_METRICS_REQUIRE_ADMIN_TOKEN=true), Prometheus must send the
12
+ # admin token. Keep the token in a file that only Prometheus can read, and uncomment these lines:
13
+ # authorization:
14
+ # type: Bearer
15
+ # credentials_file: /etc/prometheus/game-server-admin-token
16
+ # Behind TLS, also set:
17
+ # scheme: https
@@ -0,0 +1,13 @@
1
+ {
2
+ "$schema": "https://railway.com/railway.schema.json",
3
+ "build": {
4
+ "builder": "DOCKERFILE",
5
+ "dockerfilePath": "Dockerfile"
6
+ },
7
+ "deploy": {
8
+ "healthcheckPath": "/game-server/ready",
9
+ "healthcheckTimeout": 60,
10
+ "restartPolicyType": "ON_FAILURE",
11
+ "numReplicas": 1
12
+ }
13
+ }
@@ -0,0 +1,19 @@
1
+ # TLS: edge (Render terminates TLS for <service>.onrender.com and your custom domains)
2
+ # UDP: not supported on this host (Render routes inbound HTTP and WebSocket only: https://render.com/docs/websocket)
3
+ # Auth: set GAME_SERVER_AUTH_* to enable (add them under envVars, secrets with sync: false)
4
+ #
5
+ # Babylon Game Server {{version}} on Render, WebSocket only. Commit this folder to a repository, then create a
6
+ # Blueprint from it (Render dashboard > New > Blueprint). Render sets PORT, which the server honours.
7
+ # Players use wss://<service>.onrender.com.
8
+ services:
9
+ - type: web
10
+ name: babylon-game-server
11
+ runtime: docker
12
+ dockerfilePath: ./Dockerfile
13
+ plan: starter
14
+ numInstances: 1
15
+ healthCheckPath: /game-server/ready
16
+ envVars:
17
+ # Render's proxy sends the player's address in x-forwarded-for.
18
+ - key: GAME_SERVER_TRUST_PROXY
19
+ value: "true"