配置 #

YAML配置文件可以配置您的Nakama服务器运行方式的多项内容。您可以在不指定配置文件而是依赖默认配置的情况下运行Nakama。

指定配置文件 #

您可以使用--config标志在运行时指定配置文件。

1
nakama --config my-special-config.yml

如果您正在通过Docker-Compose运行Nakama,则需要在机器中绑定一个文件夹,使其在Docker中可用。在文档中查看配置在Docker上运行的Nakama。

服务器端口 #

Nakama系统非常灵活。您可以通过gRPC, HTTP, Websockets和rUDP与服务器交换数据。由于这种灵活性,Nakama需要4个端口可用于绑定到:

  • 在端口7350上绑定到HTTP API服务器可以在配置中更改端口。
  • 在7351端口上绑定到HTTP API服务器,这个服务器启动嵌入式开发人员控制台。可以在配置中更改端口。
  • 在端口7349上绑定到gRPC API服务器。根据API服务器端口选择端口。
  • 在7348端口上绑定到gRPC API服务器,该服务器启动嵌入式控制台。根据API服务器端口选择端口。

共同属性 #

在大多数环境中以及在将Nakama部署到实时生产环境之前,需要更改部分配置属性,例如,您必须更改**socket.server_keysession.encryption_key** 和**runtime.http_key**的值。 配置的完整列表见页面底部

ParameterDescription
nameNakama 节点名称(必须是唯一的)- 默认将为“nakama”。
data_dirNakama 要存储数据(包括日志)的可写文件夹的绝对路径。默认值是 Nakama 启动时的工作目录。
runtime.path要扫描和加载的模块的路径。默认值为“data_dir/modules”。
database.address要连接的数据库节点列表。应该遵循“username:password@address:port/dbname”的形式(“postgres://”协议会自动追加到路径中)。默认值为“root@localhost:26257”。
socket.server_key用于与服务器建立连接的服务器密钥。默认值为“defaultkey”。
runtime.http_key密钥用于保护服务器的运行时 HTTP 调用。默认值为“defaulthttpkey”。
session.encryption_key用于生成客户令牌的加密密钥。默认值为“defaultencryptionkey”。
session.token_expiry_sec会话令牌过期时间(以秒为单位)。默认值为 60。
session.refresh_encryption_key用于生成会话刷新令牌的加密密钥。默认值为“defaultrefreshencryptionkey”。
session.refresh_token_expiry_sec刷新令牌过期时间(以秒为单位)。默认值为 3600。

服务器配置 #

Nakama有各种配置选项,可以充分用于各种用例和部署环境。

Nakama为所有配置选项提供了合理的值,因此您可能仅需要覆盖选项的子集。您也可以仅设置您自己的配置文件,并通过命令行标志覆盖配置文件中的值。例如,覆盖运行时路径:

1
nakama --runtime.path /tmp/my-modules

对于非特殊字段,将使用默认值。查看服务器命令行页面,获取关于如何覆盖标志的更多信息。

ParameterFlagDescription
namenameNakama 节点名称(必须是唯一的)- 将被默认为“nakama”。日志文件中也使用这个名称。
data_dirdata_dirNakama 将存储数据(包括日志)的可写文件夹的绝对路径。默认值是 Nakama 启动时的工作目录。
shutdown_grace_secshutdown_grace_sec关闭前等待服务器完成工作的最大秒数。如果为 0,服务器将在收到终止信号时立即关闭。默认值为“0”。

集群 #

本节介绍如何连接各个节点形成集群。

Nakama Enterprise Only

以下配置选项仅在Nakama服务器的Nakama企业版中可用。

Nakama的设计使其在生产环境中作为高度可用的集群运行。如果您正在运行Nakama企业版,可以在您的开发机器上本地启动集群。在生产中,您可以使用Nakama企业版或我们的Heroic Cloud服务。

ParameterFlagDescription
gossip_bindaddrcluster.gossip_bindaddr将 Nakama 绑定以便于发现的接口地址。默认所有接口都处于监听状态。
gossip_bindportcluster.gossip_bindport将 Nakama 绑定以便于发现的端口编号。默认值为 7352。
joincluster.join要连接的其他 Nakama 节点的主机名和端口列表。
max_message_size_bytescluster.max_message_size_bytes允许在 Nakama 节点之间发送的每条消息的最大数据量(以字节为单位)。默认值为 4194304。
rpc_portcluster.rpc_port用于在 Nakama 节点之间发送数据的端口编号。默认值为 7353。
local_prioritycluster.local_priority设置为“true”时,尽可能使用本地资源。
work_factor_interval_mscluster.work_factor_interval_ms工作因素同步操作的更新频率。

控制台 #

本节定义了与嵌入式开发人员控制台相关的配置。

ParameterFlagDescription
addressconsole.address控制台通信监听接口的 IP 地址。默认所有地址/接口都处于监听状态。
max_message_size_bytesconsole.max_message_size_bytes每条消息允许从客户端套接字中读取的最大数据量(以字节为单位)。
idle_timeout_msconsole.idle_timeout_ms启用存活时,等待下一个请求的最大时间量(以毫秒为单位)。
passwordconsole.password嵌入式控制台的密码。默认值为“password”。
portconsole.port接受嵌入式控制台的连接、使所有接口处于监听状态的端口。默认值为 7351。
read_timeout_msconsole.read_timeout_ms读取整个请求的最大时间量(以毫秒为单位)。
signing_keyconsole.signing_key用于签署控制台会话令牌的密钥。
token_expiry_secconsole.token_expiry_sec令牌过期时间(以秒为单位)。默认值为 86400。
usernameconsole.username嵌入式控制台的用户名。默认值为“admin”。
write_timeout_msconsole.write_timeout_ms响应写入超时之前等待的最大时间量(以毫秒为单位)。

数据库 #

Nakama需要一个可用的CockroachDB服务器。Nakama 在CockroachDB数据库中创建并管理自己的名为nakama的数据库。

ParameterFlagDescription
addressdatabase.address要连接的数据库节点列表。应该遵循“username:password@address:port/dbname”的形式(“postgres://”协议会自动追加到路径中)。默认值为“root@localhost:26257”。
conn_max_lifetime_msdatabase.conn_max_lifetime_ms终止数据库连接并创建新的连接之前,重新使用该数据库连接的时间(以毫秒为单位)。默认值为 0(无限期)。
max_idle_connsdatabase.max_idle_conns允许开放但未使用的数据库连接的最大数量。默认值为 100。
max_open_connsdatabase.max_open_conns允许开放的数据库连接的最大数量。默认值为 0(无限制)。
dns_scan_interval_secdatabase.dns_scan_interval_sec查找数据库主机名称的 DNS 解析变更的扫描间隔秒数。默认值为 60。

您可以通过命令将多个数据库地址传递给Nakama,例如:

1
nakama --database.address "root@db1:26257" --database.address "root@db2:26257"

IAP(应用程序内的购买行为) #

Nakama可以通过连接到各个商店并保存有效购买的分类账来验证应用程序内的购买行为。这有助于防止常见的使用有效收据进行应用程序内购买行为重放攻击,也有助于根据需要恢复用户账户的购买行为。

Apple #

Apple应用程序内购买行为的配置

ParameterFlagDescription
shared_passwordapple.shared_password您的应用程序的共享密码。

Google #

Google应用程序内购买行为的配置

ParameterFlagDescription
client_emailgoogle.client_email服务帐户客户电子邮件值。
private_keygoogle.private_key服务帐户私钥值。

华为 #

ParameterFlagDescription
public_keyhuawei.public_key华为 IAP 存储 Base64 编码格式公钥。
client_idhuawei.client_id华为 OAuth 客户端密钥。
client_secrethuawei.client_secret华为 OAuth 应用程序客户端密钥。

排行榜 #

您可以更改与排行榜和锦标赛系统相关的配置选项。

ParameterFlagDescription
blacklist_rank_cacheleaderboard.blacklist_rank_cache禁用具有匹配排行榜名称的排行榜的排名缓存。使用“*”完全禁用排名缓存,留空则启用排名缓存。
callback_queue_sizeleaderboard.callback_queue_size排序到期/重置/结束调用的排行榜和锦标赛回调队列的大小。默认值为 65536。
callback_queue_workersleaderboard.callback_queue_workers并发处理排行榜和锦标赛回调的工作线程的数量。默认值为 8。

记录器 #

Nakama生成JSON格式的日志,以便各种系统可以与日志交互。默认将这些日志写入到标准输出(控制台)中。

ParameterFlagDescription
compresslogger.compress这决定了是否应使用 gzip 压缩轮替日志文件。
filelogger.file将日志输出到一个文件中(以及“stdout”,如有设置)。确保目录和文件可写入。
formatlogger.format设置日志输出格式。可以是“JSON”或“Stackdriver”。默认为“JSON”。
levellogger.level要生成的最小日志级别。值分别为“debug”、“info”、“warn”和“error”。默认为“info”。
local_timelogger.local_time这决定了备份文件中时间戳是否使用计算机的本地时间。默认使用世界协调时间(UTC)。
max_agelogger.max_age根据文件名中编码的时间戳保留旧日志文件的最大天数。默认不会根据时间删除旧日志文件。
max_backupslogger.max_backups要保留的旧日志文件的最大数量。默认保留所有旧日志文件(尽管有些旧日志文件可能会因为“max_age”被删除)。
max_sizelogger.max_size日志文件轮替前的最大大小(以 MB 为单位)。默认值为 100 MB。默认值为 100。
rotationlogger.rotation轮替日志文件。默认值为 false。
stdoutlogger.stdout将日志重定向为控制台标准输出。日志文件将不再使用。默认值为“true”。

无论logger.stdout字段的值为多少,都会始终将标准的启动日志消息打印到控制台。

匹配 #

您可以更改与授权多玩家运行时相关的配置选项。

ParameterFlagDescription
call_queue_sizematch.call_queue_size权威匹配缓冲对匹配处理程序回调的调用进行排序,确保无重叠。本参数指这种权威匹配缓冲的大小。默认值为 128。
deferred_queue_sizematch.deferred_queue_size权威匹配缓冲在每个循环执行结束前保留延迟的消息广播。本参数指这种权威匹配缓冲的大小。默认值为 128。
input_queue_sizematch.input_queue_size在客户端消息可以在下一个循环周期中被处理之前,权威匹配缓冲存储这些客户端消息。本参数指这种权威匹配缓冲的大小。默认值为 128。
join_attempt_queue_sizematch.join_attempt_queue_size权威匹配缓冲限制正在进行的连接尝试数量,这种权威匹配缓冲的大小。默认值为 128。
join_marker_deadline_msmatch.join_marker_deadline_ms客户端权威匹配连接等待匹配处理程序确认连接的截止时间(以毫秒为单位)。默认值为 5000。
label_update_interval_msmatch.label_update_interval_ms匹配标签更新间隔时间(以毫秒为单位)。默认值为 1000。
max_empty_secmatch.max_empty_sec允许权威匹配在被停止前连续空出的最大秒数。0 表示无最大值。默认值为 0。

指标 #

Nakama生成指标信息。可以将该信息导出到Prometheus。

由于指标包含敏感的服务器信息,需要对指标导出进行保护。

运行时 #

与运行时引擎相关的选项。

ParameterFlagDescription
call_stack_sizeruntime.call_stack_size(Deprecated) 每次运行时实例调用栈的大小。默认值为 128。
envruntime.env作为环境变量显示给运行时脚本的键-值属性列表。
event_queue_sizeruntime.event_queue_size事件队列缓冲的大小。默认值为 65536。
event_queue_workersruntime.event_queue_workers用于并发处理事件的工作线程的数量。默认值为 8。
http_keyruntime.http_key用于验证 HTTP 运行时调用的密钥。默认值为“defaultkey”。
js_entrypointruntime.js_entrypoint指定捆绑的 JavaScript 运行时源代码的位置。
js_max_countruntime.js_max_count要分配的 JavaScript 运行时实例的最大数量。默认值为 32。
js_min_countruntime.js_min_count要分配的 JavaScript 运行时实例的最小数量。默认值为 16。
js_read_only_globalsruntime.js_read_only_globals启用后,将所有的 JavaScript 运行时全局标记为只读,以减少内存占用。默认值为 true。
lua_call_stack_sizeruntime.lua_call_stack_size每次运行时实例调用栈的大小。默认值为 128。
lua_max_countruntime.lua_max_count要分配的 Lua 运行时实例的最大数量。默认值为 48。
lua_min_countruntime.lua_min_count要分配的 Lua 运行时实例的最小数量。默认值为 16。
lua_read_only_globalsruntime.lua_read_only_globals启用后,将所有的 Lua 运行时全局表标记为只读,以减少内存占用。默认值为 true。
lua_api_stacktraceruntime.lua_api_stacktrace在 API 响应中添加 Lua 栈追踪。默认值为 true。
lua_registry_sizeruntime.lua_registry_size每次 Lua 运行时实例注册表的大小。默认值为 512。
max_countruntime.max_count(Deprecated) 要分配的运行时实例的最大数量。默认值为 256。
min_countruntime.min_count(Deprecated) 要分配的运行时实例的最小数量。默认值为 16。
pathruntime.path服务器在启动时要扫描和加载的模块的路径。默认值为“data_dir/modules”。
read_only_globalsruntime.read_only_globals(Deprecated) 启用后,将所有的运行时全局表标记为只读,以减少内存占用。默认值为 true。
registry_sizeruntime.registry_size(Deprecated) 每次运行时实例注册表的大小。默认值为 512。

运行时环境是一个键值对。它们由=字符分隔:

1
nakama --runtime.env "key=value" --runtime.env "key2=value2" --runtime.env "key3=valuecanhave=sign"

会话 #

您可以更改与每个用户相关的配置选项,例如用于创建令牌的加密键。

ParameterFlagDescription
encryption_keysession.encryption_key用于生成客户令牌的加密密钥。默认值为“defaultencryptionkey”。
token_expiry_secsession.token_expiry_sec令牌过期时间(以秒为单位)。默认值为 60。
refresh_encryption_keysession.refresh_encryption_key用于生成会话刷新令牌的加密密钥。默认值为“defaultrefreshencryptionkey”。
refresh_token_expiry_secsession.refresh_token_expiry_sec刷新令牌过期时间(以秒为单位)。默认值为 3600。
single_socketsession.single_socket每个用户仅允许有一个套接字,较旧的会话将被断开连接。默认值为“false”。
single_matchsession.single_match每个用户只允许有一个匹配,较旧的匹配会被断开。需要“single_socket”才能启用。默认值为“false”。

社交 #

Nakama可以连接到多种社交网络,以便获取用户信息。它也可以作为通知中心,传递和保持通知。

Apple #

与Apple iOS/iPadOS应用程序相关的配置。

ParameterFlagDescription
bundle_idsocial.apple.bundle_idApple 登录包标识符。

Steam #

配置Steam网络设置。Facebook, Google和GameCenter不需要任何服务器设置。

ParameterFlagDescription
app_idsocial.steam.app_idSteam 应用程序标识符。
publisher_keysocial.steam.publisher_keySteam 发布者密钥。

Facebook即时游戏 #

Facebook即时游戏相关的配置。

ParameterFlagDescription
app_secretsocial.facebook_instant_game.app_secretFacebook 即时应用程序密钥。
app_idsocial.facebook_limited_login.app_idFacebook 有限登录应用程序标识符。

套接字 #

与服务器和客户端之间的连接套接字和传输协议相关的选项。

提供的默认值已针对“响应式”感觉进行了优化,缺乏经验的用户不应对其进行修改。联系Heroic Labs获取帮助。
ParameterFlagDescription
addresssocket.address客户端通信监听接口的 IP 地址。默认所有地址/接口都处于监听状态。
idle_timeout_mssocket.idle_timeout_ms启用存活时,等待下一个请求的最大时间量(以毫秒为单位)。用于 HTTP 连接。默认值为 60000。较大的值只建议用于本地调试,绝不建议用于生产。
max_message_size_bytessocket.max_message_size_bytes每条消息允许从客户端套接字中读取的最大数据量(以字节为单位)。用于实时连接。默认值为 4096。
max_request_size_bytessocket.max_request_size_bytes每次请求允许从客户端读取的最大数据量(以字节为单位)。用于 gRPC 和 HTTP 连接。默认值为 4096。
outgoing_queue_sizesocket.outgoing_queue_size等待发送到客户端的消息的最大数量。如果超过这个数值,则认为客户端速度太慢,将会断开连接。用于处理实时连接。默认值为 16。
ping_backoff_thresholdsocket.ping_backoff_threshold在一个 ping 期间从客户端收到的消息的最小数量,达到此数量后,ping 的发送会被延迟到下一个 ping 期间,从而避免在定期活动的连接上发送不必要的 ping。默认值为 20。
ping_period_mssocket.ping_period_ms客户端发送 ping 消息之间的等待时间(以毫秒为单位)。这个值必须小于“pong_wait_ms”。用于实时连接。默认值为 15000。
pong_wait_mssocket.pong_wait_ms发送 ping 后等待客户端发送 pong 消息的时间(以毫秒为单位)。用于实时连接。默认值为 25000。
portsocket.port接受客户端连接、使所有接口处于监听状态的端口。默认值为 7350。
protocolsocket.protocol通信监听的网络协议。可能的值为:“tcp”同时用于 IPv4 和 IPv6、“tcp4”仅用于 IPv4 或“tcp6”仅用于 IPv6。默认值为“tcp”。
read_buffer_size_bytessocket.read_buffer_size_bytes预先分配的套接字读取缓冲的大小(以字节为单位)。默认值为 4096。
read_timeout_mssocket.read_timeout_ms读取整个请求的最大时间量(以毫秒为单位)。用于 HTTP 连接。默认值为 10000。
server_keysocket.server_key用于与服务器建立连接的服务器密钥。默认值为“defaultkey”。
ssl_certificatesocket.ssl_certificate如果希望服务器直接使用 SSL,指向证书文件的路径。还必须提供 ssl_private_key。不建议用于生产。
ssl_private_keysocket.ssl_private_key如果希望服务器直接使用 SSL,指向私钥文件的路径。还必须提供 ssl_certificate。不建议用于生产。
write_buffer_size_bytessocket.write_buffer_size_bytes预先分配的套接字写入缓冲的大小(以字节为单位)。默认值为 4096。
write_timeout_mssocket.write_timeout_ms响应写入超时之前等待的最大时间量(以毫秒为单位)。用于 HTTP 连接。默认值为 10000。
write_wait_mssocket.write_wait_ms写入数据时,等待客户端确认的时间(以毫秒为单位)。用于实时连接。默认值为 5000。

跟踪器 #

您可以更改与会话跟踪相关的配置选项。

ParameterFlagDescription
event_queue_sizetracker.event_queue_size跟踪器存在事件缓冲的大小。如果预计服务器会在短时间内产生大量的存在事件,则增加。默认值为 1024。

以下配置选项仅在Nakama服务器的Nakama企业版中可用

Nakama的设计使其在生产环境中作为高度可用的集群运行。如果您正在运行Nakama企业版,您可以在您的开发机器上本地启动集群。在生产中,您可以使用Nakama企业版或我们的Heroic Cloud服务。

ParameterFlagDescription
broadcast_period_mstracker.broadcast_period_ms追踪器存在复制广播到每个群集节点之间的时间(以毫秒为单位)。默认值为 1500。
clock_sample_periodstracker.clock_sample_periods如果未按预期接收到存在转移,则从集群节点请求存在转移之前的广播数量。默认值为 2。
max_delta_sizestracker.max_delta_sizes将存在数据最小子集广播到集群节点的存在快照的增量数及每个增量的最大存在数。默认值为 100、1000 和 10000。
max_silent_periodstracker.max_silent_periods集群节点的存在被认为关闭之前错过的最大广播数。默认值为 10。
permdown_period_mstracker.permdown_period_ms在集群节点的存在被认为是永久关闭并将被删除之前,自上次广播以来的时间(以毫秒为单位)。默认值为 1200000。

配对程序 #

您可以更改与配对相关的配置选项。

ParameterFlagDescription
max_ticketsmatchmaker.max_tickets每次会话或群组允许的最大并发匹配门票的数量。默认值为 3。
interval_secmatchmaker.interval_sec匹配程序试图形成匹配的速度(以秒为单位)。默认值为 15。
max_intervalsmatchmaker.max_intervals在允许最小计数之前,匹配程序在最大玩家计数下尝试查找匹配项的间隔数。默认值为 2。
rev_precisionmatchmaker.rev_precision反向匹配精度,即如果玩家A与玩家B匹配,匹配者也将检查玩家B是否与玩家A匹配。
rev_thresholdmatchmaker.rev_threshold在退回到单向匹配之前,允许反向匹配的匹配器间隔数。默认为1。

示例文件 #

您可以使用整个文件或仅使用配置的子集。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
name: nakama-node-1
data_dir: "./data/"

logger:
  stdout: false
  level: "warn"
  file: "/tmp/path/to/logfile.log"
  rotation: false
  max_size: 100
  max_age: 0
  max_backups: 0
  local_time: false
  compress: false

metrics:
  reporting_freq_sec: 60
  namespace: ""
  prometheus_port: 7354

database:
  address:
    - "root@localhost:26257"
  conn_max_lifetime_ms: 0
  max_open_conns: 0
  max_idle_conns: 100

runtime:
  env:
    - "example_apikey=example_apivalue"
    - "encryptionkey=afefa==e332*u13=971mldq"
  path: "/tmp/modules/folders"
  http_key: "defaulthttpkey"

socket:
  server_key: "defaultkey"
  port: 7350
  max_message_size_bytes: 4096 # bytes
  read_timeout_ms: 10000
  write_timeout_ms: 10000
  idle_timeout_ms: 60000
  write_wait_ms: 5000
  pong_wait_ms: 10000
  ping_period_ms: 8000 # Must be less than pong_wait_ms
  outgoing_queue_size: 16

session:
  encryption_key: "defaultencryptionkey"
  token_expiry_sec: 60
    refresh_encryption_key: "defaultrefreshencryptionkey"
    refresh_token_expiry_sec: 3600

social:
  steam:
  publisher_key: ""
  app_id: 0

console:
  port: 7351
  username: "admin"
  password: "password"

cluster:
  join:
    - "10.0.0.2:7352"
    - "10.0.0.3:7352"
  gossip_bindaddr: "0.0.0.0"
  gossip_bindport: 7352
  rpc_port: 7353
  local_priority: true
  work_factor_interval_ms: 1000

tracker:
  max_delta_sizes:
    - 100
    - 1000
    - 10000

matchmaker:
  max_tickets: 2
  interval_sec: 15
  max_intervals: 3

iap:
  apple:
    shared_password: "password"
  google:
    client_email: "email@google.com"
    private_key: "pk"
  huawei:
    public_key: "pk"
    client_id: "id"
    client_secret: "secret"