forked from TrueCloudLab/frostfs-http-gw
parent
baf425453d
commit
eacd7be33e
5 changed files with 175 additions and 48 deletions
49
README.md
49
README.md
|
@ -66,7 +66,7 @@ $ HTTP_GW_PEERS_0_ADDRESS=grpcs://192.168.130.72:8080 neofs-http-gw
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
In general, everything available as CLI parameter can also be specified via
|
In general, everything available as CLI parameter can also be specified via
|
||||||
environment variables, so they're not specifically mentioned in most cases
|
environment variables (see [example](./config/config.env)), so they're not specifically mentioned in most cases
|
||||||
(see `--help` also). If you prefer a config file you can use it in yaml format.
|
(see `--help` also). If you prefer a config file you can use it in yaml format.
|
||||||
|
|
||||||
### Nodes: weights and priorities
|
### Nodes: weights and priorities
|
||||||
|
@ -162,18 +162,9 @@ The gateway supports downloading files by common prefix (like dir) in zip format
|
||||||
using config or `HTTP_GW_ZIP_COMPRESSION=true` environment variable.
|
using config or `HTTP_GW_ZIP_COMPRESSION=true` environment variable.
|
||||||
|
|
||||||
### Logging
|
### Logging
|
||||||
|
You can specify logging level (default `info`) using variable:
|
||||||
`--verbose` flag enables gRPC logging and there is a number of environment
|
|
||||||
variables to tune logging behavior:
|
|
||||||
|
|
||||||
```
|
```
|
||||||
HTTP_GW_LOGGER_FORMAT=string - Logger format
|
HTTP_GW_LOGGER_LEVEL=debug
|
||||||
HTTP_GW_LOGGER_LEVEL=string - Logger level
|
|
||||||
HTTP_GW_LOGGER_NO_CALLER=bool - Logger don't show caller
|
|
||||||
HTTP_GW_LOGGER_NO_DISCLAIMER=bool - Logger don't show application name/version
|
|
||||||
HTTP_GW_LOGGER_SAMPLING_INITIAL=int - Logger sampling initial
|
|
||||||
HTTP_GW_LOGGER_SAMPLING_THEREAFTER=int - Logger sampling thereafter
|
|
||||||
HTTP_GW_LOGGER_TRACE_LEVEL=string - Logger show trace on level
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Yaml file
|
### Yaml file
|
||||||
|
@ -183,39 +174,7 @@ It can be specified with `--config` parameter:
|
||||||
$ neofs-http-gw --config your-config.yaml
|
$ neofs-http-gw --config your-config.yaml
|
||||||
```
|
```
|
||||||
|
|
||||||
Configuration file example:
|
See [config](./config/config.yaml) for example.
|
||||||
```
|
|
||||||
listen_address: 0.0.0.0:8082
|
|
||||||
|
|
||||||
wallet:
|
|
||||||
passphrase: 123456
|
|
||||||
|
|
||||||
logger:
|
|
||||||
level: debug
|
|
||||||
|
|
||||||
peers:
|
|
||||||
0:
|
|
||||||
address: grpc://s01.neofs.devenv:8080
|
|
||||||
weight: 1
|
|
||||||
priority: 1
|
|
||||||
|
|
||||||
zip:
|
|
||||||
compression: false
|
|
||||||
```
|
|
||||||
|
|
||||||
To know nesting level of variable you need to cut off the prefix `HTTP_GW` from variable and split the rest parts by `_`.
|
|
||||||
For example variable `HTTP_GW_PEERS_0_WEIGHT=1` will be transformed to:
|
|
||||||
```
|
|
||||||
peers:
|
|
||||||
0:
|
|
||||||
weight: 1
|
|
||||||
priority: 1
|
|
||||||
```
|
|
||||||
|
|
||||||
If parameter doesn't support environment variable (e.g. `--listen_address 0.0.0.0:8082`) form it is used as is:
|
|
||||||
```
|
|
||||||
listen_address: 0.0.0.0:8082
|
|
||||||
```
|
|
||||||
|
|
||||||
## HTTP API provided
|
## HTTP API provided
|
||||||
|
|
||||||
|
|
12
app.go
12
app.go
|
@ -132,6 +132,10 @@ func newApp(ctx context.Context, opt ...Option) App {
|
||||||
|
|
||||||
func getNeoFSKey(a *app) (*ecdsa.PrivateKey, error) {
|
func getNeoFSKey(a *app) (*ecdsa.PrivateKey, error) {
|
||||||
walletPath := a.cfg.GetString(cmdWallet)
|
walletPath := a.cfg.GetString(cmdWallet)
|
||||||
|
if len(walletPath) == 0 {
|
||||||
|
walletPath = a.cfg.GetString(cfgWalletPath)
|
||||||
|
}
|
||||||
|
|
||||||
if len(walletPath) == 0 {
|
if len(walletPath) == 0 {
|
||||||
a.log.Info("no wallet path specified, creating ephemeral key automatically for this run")
|
a.log.Info("no wallet path specified, creating ephemeral key automatically for this run")
|
||||||
key, err := keys.NewPrivateKey()
|
key, err := keys.NewPrivateKey()
|
||||||
|
@ -150,7 +154,13 @@ func getNeoFSKey(a *app) (*ecdsa.PrivateKey, error) {
|
||||||
pwd := a.cfg.GetString(cfgWalletPassphrase)
|
pwd := a.cfg.GetString(cfgWalletPassphrase)
|
||||||
password = &pwd
|
password = &pwd
|
||||||
}
|
}
|
||||||
return getKeyFromWallet(w, a.cfg.GetString(cmdAddress), password)
|
|
||||||
|
address := a.cfg.GetString(cmdAddress)
|
||||||
|
if len(address) == 0 {
|
||||||
|
address = a.cfg.GetString(cfgWalletAddress)
|
||||||
|
}
|
||||||
|
|
||||||
|
return getKeyFromWallet(w, address, password)
|
||||||
}
|
}
|
||||||
|
|
||||||
func getKeyFromWallet(w *wallet.Wallet, addrStr string, password *string) (*ecdsa.PrivateKey, error) {
|
func getKeyFromWallet(w *wallet.Wallet, addrStr string, password *string) (*ecdsa.PrivateKey, error) {
|
||||||
|
|
80
config/config.env
Normal file
80
config/config.env
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
# Wallet section.
|
||||||
|
|
||||||
|
# Path to wallet.
|
||||||
|
HTTP_GW_WALLET_PATH=/path/to/wallet.json
|
||||||
|
# Account address. If omitted default one will be used.
|
||||||
|
HTTP_GW_WALLET_ADDRESS=NfgHwwTi3wHAS8aFAN243C5vGbkYDpqLHP
|
||||||
|
# Password to decrypt wallet.
|
||||||
|
HTTP_GW_WALLET_PASSPHRASE=pwd
|
||||||
|
|
||||||
|
# Enable metrics.
|
||||||
|
HTTP_GW_METRICS=true
|
||||||
|
# Enable pprof.
|
||||||
|
HTTP_GW_PPROF=true
|
||||||
|
# Log level.
|
||||||
|
HTTP_GW_LOGGER_LEVEL=debug
|
||||||
|
|
||||||
|
# Address to bind.
|
||||||
|
HTTP_GW_LISTEN_ADDRESS=0.0.0.0:443
|
||||||
|
# Provide cert to enable TLS.
|
||||||
|
HTTP_GW_TLS_CERTIFICATE=/path/to/tls/cert
|
||||||
|
# Provide key to enable TLS.
|
||||||
|
HTTP_GW_TLS_KEY=/path/to/tls/key
|
||||||
|
|
||||||
|
# Nodes configuration.
|
||||||
|
# This configuration make gateway use the first node (grpc://s01.neofs.devenv:8080)
|
||||||
|
# while it's healthy. Otherwise, gateway use the second node (grpc://s01.neofs.devenv:8080)
|
||||||
|
# for 10% of requests and the third node for 90% of requests.
|
||||||
|
|
||||||
|
# Peer 1.
|
||||||
|
# Endpoint.
|
||||||
|
HTTP_GW_PEERS_0_ADDRESS=grpc://s01.neofs.devenv:8080
|
||||||
|
# Until nodes with the same priority level are healthy
|
||||||
|
# nodes with other priority are not used.
|
||||||
|
# Еhe lower the value, the higher the priority.
|
||||||
|
HTTP_GW_PEERS_0_PRIORITY=1
|
||||||
|
# Load distribution proportion for nodes with the same priority.
|
||||||
|
HTTP_GW_PEERS_0_WEIGHT=1
|
||||||
|
# Peer 2.
|
||||||
|
HTTP_GW_PEERS_1_ADDRESS=grpc://s02.neofs.devenv:8080
|
||||||
|
HTTP_GW_PEERS_1_PRIORITY=2
|
||||||
|
HTTP_GW_PEERS_1_WEIGHT=1
|
||||||
|
# Peer 3.
|
||||||
|
HTTP_GW_PEERS_2_ADDRESS=grpc://s03.neofs.devenv:8080
|
||||||
|
HTTP_GW_PEERS_2_PRIORITY=2
|
||||||
|
HTTP_GW_PEERS_2_WEIGHT=9
|
||||||
|
|
||||||
|
# Per-connection buffer size for requests' reading.
|
||||||
|
# This also limits the maximum header size.
|
||||||
|
HTTP_GW_WEB_READ_BUFFER_SIZE=4096
|
||||||
|
# Per-connection buffer size for responses' writing.
|
||||||
|
HTTP_GW_WRITE_BUFFER_SIZE=4096
|
||||||
|
# ReadTimeout is the amount of time allowed to read
|
||||||
|
# the full request including body. The connection's read
|
||||||
|
# deadline is reset when the connection opens, or for
|
||||||
|
# keep-alive connections after the first byte has been read.
|
||||||
|
HTTP_GW_READ_TIMEOUT=15s
|
||||||
|
# WriteTimeout is the maximum duration before timing out
|
||||||
|
# writes of the response. It is reset after the request handler
|
||||||
|
# has returned.
|
||||||
|
HTTP_GW_WRITE_TIMEOUT=1m
|
||||||
|
# StreamRequestBody enables request body streaming,
|
||||||
|
# and calls the handler sooner when given body is
|
||||||
|
# larger then the current limit.
|
||||||
|
HTTP_GW_STREAM_REQUEST_BODY=true
|
||||||
|
# Maximum request body size.
|
||||||
|
# The server rejects requests with bodies exceeding this limit.
|
||||||
|
HTTP_GW_MAX_REQUEST_BODY_SIZE=4194304
|
||||||
|
|
||||||
|
# Create timestamp for object if it isn't provided by header.
|
||||||
|
HTTP_GW_UPLOAD_HEADER_USE_DEFAULT_TIMESTAMP=false
|
||||||
|
|
||||||
|
# Timeout to dial node.
|
||||||
|
HTTP_GW_CONNECT_TIMEOUT=5s
|
||||||
|
# Timeout to check node health during rebalance.
|
||||||
|
HTTP_GW_REQUEST_TIMEOUT=5s
|
||||||
|
# Interval to check nodes health.
|
||||||
|
HTTP_GW_REBALANCE_TIMER=30s
|
||||||
|
|
||||||
|
# Enable zip compression to download files by common prefix.
|
||||||
|
HTTP_GW_ZIP_COMPRESSION=false
|
78
config/config.yaml
Normal file
78
config/config.yaml
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
wallet:
|
||||||
|
path: /path/to/wallet.json # Path to wallet.
|
||||||
|
address: NfgHwwTi3wHAS8aFAN243C5vGbkYDpqLHP # Account address. If omitted default one will be used.
|
||||||
|
passphrase: pwd # Password to decrypt wallet.
|
||||||
|
|
||||||
|
metrics: true # Enable metrics.
|
||||||
|
pprof: true # Enable pprof.
|
||||||
|
logger:
|
||||||
|
level: debug # Log level.
|
||||||
|
|
||||||
|
listen_address: 0.0.0.0:443 # Address to bind.
|
||||||
|
tls_certificate: /path/to/tls/cert # Provide cert to enable TLS.
|
||||||
|
tls_key: /path/to/tls/key # Provide key to enable TLS.
|
||||||
|
|
||||||
|
# Nodes configuration.
|
||||||
|
# This configuration make gateway use the first node (grpc://s01.neofs.devenv:8080)
|
||||||
|
# while it's healthy. Otherwise, gateway use the second node (grpc://s01.neofs.devenv:8080)
|
||||||
|
# for 10% of requests and the third node for 90% of requests.
|
||||||
|
peers:
|
||||||
|
0:
|
||||||
|
# Endpoint.
|
||||||
|
address: grpc://s01.neofs.devenv:8080
|
||||||
|
|
||||||
|
# Until nodes with the same priority level are healthy
|
||||||
|
# nodes with other priority are not used.
|
||||||
|
# Еhe lower the value, the higher the priority.
|
||||||
|
priority: 1
|
||||||
|
|
||||||
|
# Load distribution proportion for nodes with the same priority.
|
||||||
|
weight: 1
|
||||||
|
1:
|
||||||
|
address: grpc://s02.neofs.devenv:8080
|
||||||
|
priority: 2
|
||||||
|
weight: 1
|
||||||
|
2:
|
||||||
|
address: grpc://s03.neofs.devenv:8080
|
||||||
|
priority: 2
|
||||||
|
weight: 9
|
||||||
|
|
||||||
|
|
||||||
|
web:
|
||||||
|
# Per-connection buffer size for requests' reading.
|
||||||
|
# This also limits the maximum header size.
|
||||||
|
read_buffer_size: 4096
|
||||||
|
|
||||||
|
# Per-connection buffer size for responses' writing.
|
||||||
|
write_buffer_size: 4096
|
||||||
|
|
||||||
|
# ReadTimeout is the amount of time allowed to read
|
||||||
|
# the full request including body. The connection's read
|
||||||
|
# deadline is reset when the connection opens, or for
|
||||||
|
# keep-alive connections after the first byte has been read.
|
||||||
|
read_timeout: 15s
|
||||||
|
|
||||||
|
# WriteTimeout is the maximum duration before timing out
|
||||||
|
# writes of the response. It is reset after the request handler
|
||||||
|
# has returned.
|
||||||
|
write_timeout: 1m
|
||||||
|
|
||||||
|
# StreamRequestBody enables request body streaming,
|
||||||
|
# and calls the handler sooner when given body is
|
||||||
|
# larger then the current limit.
|
||||||
|
stream_request_body: true
|
||||||
|
|
||||||
|
# Maximum request body size.
|
||||||
|
# The server rejects requests with bodies exceeding this limit.
|
||||||
|
max_request_body_size: 4194304
|
||||||
|
|
||||||
|
|
||||||
|
upload_header:
|
||||||
|
use_default_timestamp: false # Create timestamp for object if it isn't provided by header.
|
||||||
|
|
||||||
|
connect_timeout: 5s # Timeout to dial node.
|
||||||
|
request_timeout: 5s # Timeout to check node health during rebalance.
|
||||||
|
rebalance_timer: 30s # Interval to check nodes health.
|
||||||
|
|
||||||
|
zip:
|
||||||
|
compression: false # Enable zip compression to download files by common prefix.
|
|
@ -40,6 +40,8 @@ const (
|
||||||
|
|
||||||
// Wallet.
|
// Wallet.
|
||||||
cfgWalletPassphrase = "wallet.passphrase"
|
cfgWalletPassphrase = "wallet.passphrase"
|
||||||
|
cfgWalletPath = "wallet.path"
|
||||||
|
cfgWalletAddress = "wallet.address"
|
||||||
|
|
||||||
// Uploader Header.
|
// Uploader Header.
|
||||||
cfgUploaderHeaderEnableDefaultTimestamp = "upload_header.use_default_timestamp"
|
cfgUploaderHeaderEnableDefaultTimestamp = "upload_header.use_default_timestamp"
|
||||||
|
@ -53,7 +55,6 @@ const (
|
||||||
// Command line args.
|
// Command line args.
|
||||||
cmdHelp = "help"
|
cmdHelp = "help"
|
||||||
cmdVersion = "version"
|
cmdVersion = "version"
|
||||||
cmdVerbose = "verbose"
|
|
||||||
cmdPprof = "pprof"
|
cmdPprof = "pprof"
|
||||||
cmdMetrics = "metrics"
|
cmdMetrics = "metrics"
|
||||||
cmdWallet = "wallet"
|
cmdWallet = "wallet"
|
||||||
|
@ -89,7 +90,6 @@ func settings() *viper.Viper {
|
||||||
flags.StringP(cmdWallet, "w", "", `path to the wallet`)
|
flags.StringP(cmdWallet, "w", "", `path to the wallet`)
|
||||||
flags.String(cmdAddress, "", `address of wallet account`)
|
flags.String(cmdAddress, "", `address of wallet account`)
|
||||||
config := flags.String(cmdConfig, "", "config path")
|
config := flags.String(cmdConfig, "", "config path")
|
||||||
flags.Bool(cmdVerbose, false, "debug gRPC connections")
|
|
||||||
flags.Duration(cfgConTimeout, defaultConnectTimeout, "gRPC connect timeout")
|
flags.Duration(cfgConTimeout, defaultConnectTimeout, "gRPC connect timeout")
|
||||||
flags.Duration(cfgReqTimeout, defaultRequestTimeout, "gRPC request timeout")
|
flags.Duration(cfgReqTimeout, defaultRequestTimeout, "gRPC request timeout")
|
||||||
flags.Duration(cfgRebalance, defaultRebalanceTimer, "gRPC connection rebalance timer")
|
flags.Duration(cfgRebalance, defaultRebalanceTimer, "gRPC connection rebalance timer")
|
||||||
|
|
Loading…
Reference in a new issue