18 个版本 (9 个重大更新)
0.10.1 | 2024 年 8 月 5 日 |
---|---|
0.10.0 | 2024 年 5 月 22 日 |
0.9.0 | 2024 年 5 月 20 日 |
0.8.1 | 2024 年 1 月 2 日 |
0.1.4 | 2023 年 2 月 24 日 |
#23 in 配置
342 每月下载量
在 6 crates 中使用
145KB
3K SLoC
htsget-config
为 htsget-rs 和相关 crates 提供配置。
概览
该 crate 通过使用配置文件或读取环境变量来配置 htsget-rs。
使用方法
运行 htsget-rs 作为应用程序
要配置 htsget-rs,可以使用 TOML 配置文件。它还支持从环境变量中读取配置。环境变量中设置的任何配置选项都将覆盖配置文件中的值。对于一些更深层嵌套的配置选项,使用配置文件可能比使用环境变量更方便。
配置由多个部分组成,包括票据服务器配置、数据服务器配置、服务信息配置和解析器配置。
票据服务器配置
票据服务器通过返回一组客户端必须获取和连接的 URL 票据来响应 htsget 请求。要配置票据服务器,设置以下选项
选项 | 描述 | 类型 | 默认值 |
---|---|---|---|
ticket_server_addr |
票据服务器的地址。 | 套接字地址 | '127.0.0.1:8080' |
ticket_server_tls |
为票据服务器启用 TLS。有关更多详细信息,请参阅 TLS。 | TOML 表 | 未启用 |
ticket_server_cors_allow_credentials |
控制票据服务器的 CORS Access-Control-Allow-Credentials。 | 布尔值 | false |
ticket_server_cors_allow_origins |
设置票据服务器返回的 CORS Access-Control-Allow-Origin,可以设置为 All 以发送通配符,Mirror 以回显客户端发送的请求,或特定的源数组。 |
‘'All' ’,'Mirror' 或者一个源数组 |
['http://localhost:8080'] |
ticket_server_cors_allow_headers |
设置由票据服务器返回的CORS Access-Control-Allow-Headers,可以设置为All 以允许所有头部,或者一个特定的头部数组。 |
‘'All' ’或一个头部数组 |
'全部' |
ticket_server_cors_allow_methods |
设置由票据服务器返回的CORS Access-Control-Allow-Methods,可以设置为All 以允许所有方法,或者一个特定的方法数组。 |
‘'All' ’或一个方法数组 |
'全部' |
ticket_server_cors_max_age |
设置票据服务器的CORS Access-Control-Max-Age,它控制预请求可以缓存多长时间。 | 秒 | 86400 |
ticket_server_cors_expose_headers |
设置由票据服务器返回的CORS Access-Control-Expose-Headers,可以设置为All 以暴露所有头部,或者一个特定的头部数组。 |
‘'All' ’或一个头部数组 |
[] |
通过设置ticket_server_key
和ticket_server_cert
选项支持TLS。票据服务器配置示例
ticket_server_addr = '127.0.0.1:8080'
ticket_server_cors_allow_credentials = false
ticket_server_cors_allow_origins = 'Mirror'
ticket_server_cors_allow_headers = ['Content-Type']
ticket_server_cors_allow_methods = ['GET', 'POST']
ticket_server_cors_max_age = 86400
ticket_server_cors_expose_headers = []
本地数据服务器配置
本地数据服务器通过提供本地文件系统数据来响应票据服务器生成的票据。要配置数据服务器,设置以下选项
选项 | 描述 | 类型 | 默认值 |
---|---|---|---|
data_server_addr |
数据服务器的地址。 | 套接字地址 | '127.0.0.1:8081' |
data_server_local_path |
数据服务器可以访问以提供文件的本地路径。 | 文件系统路径 | './' |
data_server_serve_at |
数据服务器将前缀到所有票据响应URL的路径。 | URL路径 | '' |
data_server_tls |
启用数据服务器的TLS。有关更多详细信息,请参阅TLS。 | TOML 表 | 未启用 |
data_server_cors_allow_credentials |
控制数据服务器的CORS Access-Control-Allow-Credentials。 | 布尔值 | false |
data_server_cors_allow_origins |
设置由数据服务器返回的CORS Access-Control-Allow-Origin,可以设置为All 以发送通配符,Mirror 以回显客户端发送的请求,或一个特定的源数组。 |
‘'All' ’,'Mirror' 或者一个源数组 |
['http://localhost:8080'] |
data_server_cors_allow_headers |
设置由数据服务器返回的CORS Access-Control-Allow-Headers,可以设置为All 以允许所有头部,或一个特定的头部数组。 |
‘'All' ’或一个头部数组 |
'全部' |
data_server_cors_allow_methods |
设置由数据服务器返回的CORS Access-Control-Allow-Methods,可以设置为All 以允许所有方法,或一个特定的方法数组。 |
‘'All' ’或一个方法数组 |
'全部' |
data_server_cors_max_age |
设置数据服务器的CORS Access-Control-Max-Age,它控制预请求可以缓存多长时间。 | 秒 | 86400 |
data_server_cors_expose_headers |
设置由数据服务器返回的CORS Access-Control-Expose-Headers,可以设置为All 以暴露所有头部,或一个特定的头部数组。 |
‘'All' ’或一个头部数组 |
[] |
通过设置data_server_key
和data_server_cert
选项支持TLS。数据服务器配置示例
data_server_addr = '127.0.0.1:8081'
data_server_local_path = './'
data_server_serve_at = ''
data_server_key = 'key.pem'
data_server_cert = 'cert.pem'
data_server_cors_allow_credentials = false
data_server_cors_allow_origins = 'Mirror'
data_server_cors_allow_headers = ['Content-Type']
data_server_cors_allow_methods = ['GET', 'POST']
data_server_cors_max_age = 86400
data_server_cors_expose_headers = []
有时禁用数据服务器可能很有用,因为所有对票据服务器的响应都将由其他地方处理,例如使用AWS S3数据服务器。
要禁用数据服务器,设置以下选项
data_server_enabled = false
服务信息配置
服务信息配置控制当查询service-info
路径时返回什么。
要配置service-info,设置以下选项
选项 | 描述 | 类型 | 默认值 |
---|---|---|---|
id |
服务ID。 | 字符串 | 未设置 |
name |
服务名称。 | 字符串 | 未设置 |
version |
服务版本。 | 字符串 | 未设置 |
organization_name |
组织名称。 | 字符串 | 未设置 |
organization_url |
组织URL。 | 字符串 | 未设置 |
contact_url |
服务联系方式URL | 字符串 | 未设置 |
documentation_url |
服务文档URL。 | 字符串 | 未设置 |
created_at |
服务创建时间。 | 字符串 | 未设置 |
updated_at |
服务最后更新时间。 | 字符串 | 未设置 |
环境 |
服务运行的环境。 | 字符串 | 未设置 |
服务信息配置示例
id = 'id'
name = 'name'
version = '0.1'
organization_name = 'name'
organization_url = 'https://example.com/'
contact_url = 'mailto:[email protected]'
documentation_url = 'https://example.com/'
created_at = '2022-01-01T12:00:00Z'
updated_at = '2022-01-01T12:00:00Z'
environment = 'dev'
解析器
htsget-rs的解析器组件用于将查询ID映射到资源的位置。htsget-rs接收到的每个查询都会被解析到一个位置,数据服务器可以响应该位置。查询ID与正则表达式匹配,然后与一个替换字符串映射,该替换字符串可以访问正则表达式的捕获组。解析器在数组中配置,第一个匹配的解析器用于映射ID。
要创建解析器,添加一个[[resolvers]]
表格数组,并设置以下选项
选项 | 描述 | 类型 | 默认值 |
---|---|---|---|
regex |
可以匹配查询ID的正则表达式。 | 正则表达式 | '.*' |
substitution_string |
用于映射匹配的查询ID的替换表达式。这可以访问正则表达式选项中的匹配组。 | 访问捕获组的字符串 | '$0' |
例如,下面是一个regex
选项,它匹配两个组之间的斜杠,并使用substitution_string
在组之间插入额外的data
。
[[resolvers]]
regex = '(?P<group1>.*?)/(?P<group2>.*)'
substitution_string = '$group1/data/$group2'
有关正则表达式选项的更多信息,请参阅regex crate。
每个解析器也映射到特定的存储后端。此存储后端可用于设置从本地存储、S3风格的存储桶存储或HTTP URL提供查询ID。要为解析器设置存储后端,添加一个[resolvers.storage]
表格。一些存储后端在编译htsget-rs时需要设置功能标志。
要使用LocalStorage
,设置storage = 'Local'
。这将从data_server
配置中推导出以下字段的值
选项 | 描述 | 当storage = 'Local' |
类型 | 默认值 |
---|---|---|---|---|
scheme |
URL票据上的方案。 | 从data_server_key 和data_server_cert 派生。如果没有密钥和证书,则使用Http ,否则使用Https 。 |
可以是'Http' 或'Https' |
'Http' |
authority |
URL票据上的授权。这很可能与data_server_addr 匹配。 |
与data_server_addr 相同。 |
URL授权 | '127.0.0.1:8081' |
local_path |
数据服务器用于响应票据的本地文件系统路径。这很可能与data_server_local_path 匹配。 |
与data_server_local_path 相同。 |
文件系统路径 | './' |
path_prefix |
URL票据将具有的路径前缀。这很可能与data_server_serve_at 路径匹配。 |
与data_server_serve_at 相同。 |
URL路径 | '' |
要使用S3Storage
,启用s3-storage
功能构建htsget-rs,并设置storage = 'S3'
。这将从regex
组件中派生resolvers
的bucket
值。
选项 | 描述 | 当storage = 'S3' |
类型 | 默认值 |
---|---|---|---|---|
bucket |
可以从中检索资源的AWS S3存储桶。 | 从resolvers 的regex 属性派生。它使用regex 中的第一个捕获组作为bucket 。 |
字符串 | '' |
端点 |
一个自定义端点,用于覆盖默认的S3服务地址。这对于在本地使用S3或与MinIO等存储后端一起使用非常有用。有关MinIO的更多信息,请参阅MinIO。 | 未设置,使用常规的AWS S3服务。 | 字符串 | 未设置,使用常规的AWS S3服务。 |
path_style |
请求存储后端的S3路径样式。如果true ,则使用“路径样式”,例如host.com/bucket/object.bam ,否则使用bucket.host.com/object 样式。 |
false |
布尔值 | false |
UrlStorage
是另一个存储后端,可以从远程HTTP URL提供数据。当使用此存储后端时,htsget-rs将从配置中设置的url
获取数据。它还将转发初始查询中接收到的任何头,这对于认证非常有用。要使用UrlStorage
,请启用url-storage
功能构建htsget-rs,并在以下选项下设置以下选项:[resolvers.storage]
选项 | 描述 | 类型 | 默认值 |
---|---|---|---|
url |
从其中获取数据的URL。 | HTTP URL | "https://127.0.0.1:8081/" |
response_url |
用于获取票证的客户端返回的URL。 | HTTP URL | "https://127.0.0.1:8081/" |
forward_headers |
在构造URL票证时,复制初始查询中接收到的HTTP头。 | 布尔值 | true |
header_blacklist |
不应转发头部的列表 | 头部数组 | [] |
tls |
此外,启用客户端认证或为TLS设置非本地根证书。有关更多信息,请参阅TLS。 | TOML 表 | TLS始终允许,但默认情况下不执行客户端认证并使用本地根证书。 |
当使用UrlStorage
时,将对以下url
发出以下请求。
GET
请求仅获取数据文件的头部(例如GET /data.bam
,带有Range: bytes=0-<end_of_bam_header>
)。GET
请求获取整个索引文件(例如GET /data.bam.bai
)。- 对数据文件的
HEAD
请求以获取其长度(例如HEAD /data.bam
)。
默认情况下,在发出这些请求时将包括初始查询中接收到的所有头部。要排除某些头部,请设置header_blacklist
选项。请注意,被列入黑名单的头部将从对url
发出的请求以及URL票证中删除。
例如,以下resolvers
值
[[resolvers]]
regex = '^(example_bucket)/(?P<key>.*)$'
substitution_string = '$key'
storage = 'S3'
如果该解析器匹配,则将使用“example_bucket”作为S3存储桶,因为这是regex
中的第一个捕获组。请注意,要使用此功能,必须在regex
中定义至少一个捕获组。
注意,所有关于S3Storage
或LocalStorage
的值都可以通过添加一个[resolvers.storage]
表格来手动设置。例如,要手动设置LocalStorage
的配置
[[resolvers]]
regex = '.*'
substitution_string = '$0'
[resolvers.storage]
scheme = 'Http'
authority = '127.0.0.1:8081'
local_path = './'
path_prefix = ''
或者,要手动设置S3Storage
的配置
[[resolvers]]
regex = '.*'
substitution_string = '$0'
[resolvers.storage]
bucket = 'bucket'
UrlStorage
只能手动指定。以下是一个包含UrlStorage
的解析器示例
[[resolvers]]
regex = ".*"
substitution_string = "$0"
[resolvers.storage]
url = "https://127.0.0.1:8080"
response_url = "https://example.com"
forward_headers = true
header_blacklist = ["Host"]
更多配置文件示例位于examples/config-files
下。
注意
默认情况下,当使用带有s3-storage
功能标志编译htsget-rs时,如果没有指定storage
选项,将使用storage = 'S3'
。否则,如果没有指定存储选项,将使用storage = 'Local'
。由于默认情况下编译包含s3-storage
功能标志,因此为了使storage = 'Local'
成为默认值,可以将--no-default-features
传递给cargo
。
允许守卫
此外,解析器组件还有一个功能,允许根据查询中存在的其他字段来解析ID。这很有用,因为它允许解析器在存在特定的查询参数集时匹配ID。例如,可以将解析器设置为仅在格式也是BAM时解析ID。
可以通过设置[resolver.allow_guard]
表格来配置此组件。以下选项可用于限制哪些查询由解析器解析
选项 | 描述 | 类型 | 默认值 |
---|---|---|---|
allow_reference_names |
如果查询还包含此选项设置的参考名称,则解析查询ID。 | 参考名称的数组或'All' |
'全部' |
allow_fields |
如果查询还包含此选项设置的字段,则解析查询ID。 | 字段的数组或'All' |
'全部' |
allow_tags |
如果查询还包含此选项设置的标签,则解析查询ID。 | 标签的数组或'All' |
'全部' |
allow_formats |
如果查询是此选项指定的格式之一,则解析查询ID。 | 包含'BAM' 、'CRAM' 、'VCF' 或'BCF' 的格式数组 |
['BAM', 'CRAM', 'VCF', 'BCF'] |
allow_classes |
如果查询是此选项指定的类之一,则解析查询ID。 | 包含'body' 或'header' 的类数组 |
['body', 'header'] |
allow_interval_start |
如果查询参考的起始位置至少为此选项,则解析查询ID。 | 无符号32位整数起始位置,基于0,包含。 | 未设置,允许所有起始位置。 |
允许区间结束。 |
如果查询参考结束位置不超过此选项,则解析查询ID。 | 无符号32位整数结束位置,基于0,不包含。 | 未设置,允许所有结束位置。 |
一个完全配置的解析器示例。
[[resolvers]]
regex = '.*'
substitution_string = '$0'
[resolvers.storage]
bucket = 'bucket'
[resolvers.allow_guard]
allow_reference_names = ['chr1']
allow_fields = ['QNAME']
allow_tags = ['RG']
allow_formats = ['BAM']
allow_classes = ['body']
allow_interval_start = 100
allow_interval_end = 1000
在这个例子中,解析器将仅在查询为chr1
,且位置在100
到1000
之间时匹配查询ID。
TLS
TLS可以配置为票据服务器、数据服务器或URL存储客户端。这些选项从PEM格式文件中读取私钥和证书。证书必须是X.509格式,私钥可以是RSA、PKCS8或SEC1(EC)编码。以下选项可用:
选项 | 描述 | 类型 | 默认值 |
---|---|---|---|
key |
PEM格式X.509证书的路径。为服务器指定TLS,或为客户端指定客户端身份验证。 | 文件系统路径 | 未设置 |
cert |
PEM格式RSA、PKCS8或SEC1编码EC私钥的路径。为服务器指定TLS或为客户端指定客户端身份验证。 | 文件系统路径 | 未设置 |
root_store |
PEM格式根证书存储的路径。仅在UrlStorage 中用于指定非本地根证书的HTTP客户端。 |
文件系统路径 | 未设置 |
当由票据服务器和数据服务器使用时,key
和cert
启用TLS,与URL存储客户端一起使用时,它们启用客户端身份验证。根存储仅由URL存储客户端使用。注意,URL存储客户端始终允许TLS,但是默认配置不执行客户端身份验证并使用本地根证书存储。
例如,可以通过指定key和cert选项来启用票据服务器的TLS:
ticket_server_tls.cert = "cert.pem"
ticket_server_tls.key = "key.pem"
该项目使用rustls进行所有TLS逻辑,并且不依赖于OpenSSL。rustls库在接受证书和密钥时可能更加严格。例如,它不接受用作最终实体的CA的自签名证书。如果使用OpenSSL为root_store
生成证书,应包括正确的扩展,如subjectAltName
。
为UrlStorage
后端生成自定义根CA和证书的示例
# Create a root CA
openssl req -x509 -noenc -subj '/CN=localhost' -newkey rsa -keyout root.key -out root.crt
# Create a certificate signing request
openssl req -noenc -newkey rsa -keyout server.key -out server.csr -subj '/CN=localhost' -addext subjectAltName=DNS:localhost
# Create the `UrlStorage` server's certificate
openssl x509 -req -in server.csr -CA root.crt -CAkey root.key -days 365 -out server.crt -copy_extensions copy
# An additional client certificate signing request and certificate can be created in the same way as the server
# certificate if using client authentication.
然后可以使用root.crt
在htsget-rs中用于通过server.crt
对UrlStorage
后端进行身份验证
# Trust the root CA that signed the server's certificate.
tls.root_store = "root.crt"
或者,可以使用如mkcert的项目来简化此过程。
在examples/config-files
下提供了更多的TLS示例。
配置文件位置
htsget-rs二进制文件(htsget-axum、htsget-actix和htsget-lambda)支持一些命令行选项。可以通过设置--config
选项来指定配置文件位置
cargo run -p htsget-axum -- --config "config.toml"
配置也可以从环境变量中读取
export HTSGET_CONFIG="config.toml"
如果没有指定配置文件,则使用默认配置。此外,可以通过传递--print-default-config
标志来打印默认配置文件到stdout
cargo run -p htsget-axum -- --print-default-config
使用--help
标志可查看有关命令行选项的更多详细信息。
日志格式化
htsget-rs广泛使用Tracing crate来实现日志功能。变量RUST_LOG
被读取以配置输出跟踪日志的级别。
例如,以下代码指示所有htsget crate的跟踪级别为info,其他crate的跟踪级别为info
export RUST_LOG='info,htsget_lambda=trace,htsget_lambda=trace,htsget_config=trace,htsget_http=trace,htsget_search=trace,htsget_test=trace'
有关设置此变量的更多信息,请参阅此处。
可以通过设置以下选项来配置日志格式化的风格
选项 | 描述 | 类型 | 默认值 |
---|---|---|---|
formatting_style |
要使用的日志格式化风格。 | 可以是以下之一:'Full' 、'Compact' 、'Pretty' 或'Json' |
'Full' |
有关这些值外观的更多信息,请参阅此处。
使用环境变量配置htsget-rs
所有htsget-rs配置选项都可以通过环境变量设置,这对于AWS Lambda等运行时来说很方便。票据服务器、数据服务器和服务信息选项被扁平化,可以直接使用环境变量设置。不建议使用环境变量设置解析器,但可以通过设置一个包含结构列表的单个环境变量来实现,其中键名和值对用于设置嵌套选项。
环境变量将覆盖配置文件中设置的选项。注意,在环境变量中,数组用[
和]
分隔,项目用逗号分隔。
以下环境变量(对应于TOML配置)可用
变量 | 描述 |
---|---|
HTSGET_TICKET_SERVER_ADDR |
请参阅ticket_server_addr |
HTSGET_TICKET_SERVER_TLS_KEY |
请参阅TLS |
HTSGET_TICKET_SERVER_TLS_CERT |
请参阅TLS |
HTSGET_TICKET_SERVER_CORS_ALLOW_CREDENTIALS |
请参阅ticket_server_cors_allow_credentials |
HTSGET_TICKET_SERVER_CORS_ALLOW_ORIGINS |
请参阅ticket_server_cors_allow_origins |
HTSGET_TICKET_SERVER_CORS_ALLOW_HEADERS |
请参阅ticket_server_cors_allow_headers |
HTSGET_TICKET_SERVER_CORS_ALLOW_METHODS |
请参阅ticket_server_cors_allow_methods |
HTSGET_TICKET_SERVER_CORS_MAX_AGE |
请参阅ticket_server_cors_max_age |
HTSGET_TICKET_SERVER_CORS_EXPOSE_HEADERS |
请参阅ticket_server_cors_expose_headers |
HTSGET_DATA_SERVER_ADDR |
请参阅data_server_addr |
HTSGET_DATA_SERVER_LOCAL_PATH |
请参阅data_server_local_path |
HTSGET_DATA_SERVER_SERVE_AT |
请参阅data_server_serve_at |
HTSGET_DATA_SERVER_TLS_KEY |
请参阅TLS |
HTSGET_DATA_SERVER_TLS_CERT |
请参阅TLS |
HTSGET_DATA_SERVER_CORS_ALLOW_CREDENTIALS |
请参阅data_server_cors_allow_credentials |
HTSGET_DATA_SERVER_CORS_ALLOW_ORIGINS |
参见data_server_cors_allow_origins |
HTSGET_DATA_SERVER_CORS_ALLOW_HEADERS |
参见data_server_cors_allow_headers |
HTSGET_DATA_SERVER_CORS_ALLOW_METHODS |
参见data_server_cors_allow_methods |
HTSGET_DATA_SERVER_CORS_MAX_AGE |
参见data_server_cors_max_age |
HTSGET_DATA_SERVER_CORS_EXPOSE_HEADERS |
参见data_server_cors_expose_headers |
HTSGET_ID |
参见id |
HTSGET_NAME |
参见name |
HTSGET_VERSION |
参见version |
HTSGET_ORGANIZATION_NAME |
参见organization_name |
HTSGET_ORGANIZATION_URL |
参见organization_url |
HTSGET_CONTACT_URL |
参见contact_url |
HTSGET_DOCUMENTATION_URL |
参见documentation_url |
HTSGET_CREATED_AT |
参见created_at |
HTSGET_UPDATED_AT |
参见updated_at |
HTSGET_ENVIRONMENT |
参见environment |
HTSGET_RESOLVERS |
参见resolvers |
HTSGET_FORMATTING_STYLE |
参见formatting_style |
为了使用HTSGET_RESOLVERS
,必须设置整个解析器配置数组。可以使用name键和值对设置解析器结构的嵌套数组,例如
export HTSGET_RESOLVERS="[{
regex=regex,
substitution_string=substitution_string,
storage={
bucket=bucket
},
allow_guard={
allow_reference_names=[chr1],
allow_fields=[QNAME],
allow_tags=[RG],
allow_formats=[BAM],
allow_classes=[body],
allow_interval_start=100,
allow_interval_end=1000
}
}]"
类似于data_server选项,可以通过设置等效的环境变量来禁用数据服务器
export HTSGET_DATA_SERVER_ENABLED=false
MinIO
通过利用以下所示的endpoint
指令,可以使用本地对象存储MinIO
[[resolvers]]
regex = '.*'
substitution_string = '$0'
[resolvers.storage]
bucket = 'bucket'
endpoint = 'http://127.0.0.1:9000'
path_style = true
必须确保设置了正确的AWS_DEFAULT_REGION、AWS_ACCESS_KEY 和 AWS_SECRET_ACCESS_KEY,以便AWS SDK可以访问端点。使用虚拟主机样式寻址需要配置MinIO服务器,并设置环境变量MINIO_DOMAIN。可以使用path_style = true
强制使用路径样式寻址。
有关如何配置htsget-rs和MinIO的更多信息,请参见MinIO部署示例。
作为库
此软件包使用 figment 读取配置文件和环境变量,并使用 clap 接受命令行参数。此功能的主要函数是 from_config
,用于获取 Config
结构体。软件包还包含 regex_resolver
抽象,用于通过正则表达式匹配查询 ID,并通过替换字符串进行更改。
功能标志
此软件包具有以下功能
s3-storage
:用于启用S3Storage
功能。url-storage
:用于启用UrlStorage
功能。
许可证
本项目采用 MIT 许可证。
依赖项
~17–29MB
~521K SLoC