2016-06-02 18:09:14 -07:00
package command
2013-12-03 23:22:26 -08:00
import (
2025-07-08 13:48:12 +08:00
"crypto/tls"
2019-04-30 03:22:19 +00:00
"fmt"
2021-07-31 02:00:01 -07:00
"net/http"
2013-12-03 23:22:26 -08:00
"os"
"strings"
"time"
2014-10-26 11:34:55 -07:00
2022-07-29 00:17:28 -07:00
"github.com/seaweedfs/seaweedfs/weed/glog"
"github.com/seaweedfs/seaweedfs/weed/pb"
2025-07-08 13:48:12 +08:00
stats_collect "github.com/seaweedfs/seaweedfs/weed/stats"
2022-07-29 00:17:28 -07:00
"github.com/seaweedfs/seaweedfs/weed/util"
"github.com/seaweedfs/seaweedfs/weed/util/grace"
2013-12-03 23:22:26 -08:00
)
2014-05-07 10:17:06 -07:00
type ServerOptions struct {
2019-06-17 14:51:47 -07:00
cpuprofile * string
2021-03-30 01:25:28 -07:00
memprofile * string
2021-07-31 02:00:01 -07:00
debug * bool
2021-07-31 09:18:41 -07:00
debugPort * int
2019-06-17 14:51:47 -07:00
v VolumeServerOptions
2014-05-07 10:17:06 -07:00
}
2014-03-30 20:57:25 -07:00
var (
2025-07-09 09:02:25 -07:00
serverOptions ServerOptions
masterOptions MasterOptions
filerOptions FilerOptions
s3Options S3Options
sftpOptions SftpOptions
iamOptions IamOptions
webdavOptions WebDavOption
mqBrokerOptions MessageQueueBrokerOptions
mqAgentServerOptions MessageQueueAgentOptions
2014-03-30 20:57:25 -07:00
)
2013-12-03 23:22:26 -08:00
func init ( ) {
cmdServer . Run = runServer // break init cycle
}
var cmdServer = & Command {
2020-06-12 22:06:21 -07:00
UsageLine : "server -dir=/tmp -volume.max=5 -ip=server_name" ,
2019-04-24 00:25:20 -07:00
Short : "start a master server, a volume server, and optionally a filer and a S3 gateway" ,
2014-11-28 16:34:03 -08:00
Long : ` start both a volume server to provide storage spaces
2013-12-03 23:22:26 -08:00
and a master server to provide volume = > location mapping service and sequence number of file ids
2014-11-28 16:34:03 -08:00
2013-12-03 23:22:26 -08:00
This is provided as a convenient way to start both volume server and master server .
2019-04-24 00:25:20 -07:00
The servers acts exactly the same as starting them separately .
So other volume servers can connect to this master server also .
2014-04-25 22:09:42 -07:00
2019-04-24 00:25:20 -07:00
Optionally , a filer server can be started .
Also optionally , a S3 gateway can be started .
2019-04-24 00:18:01 -07:00
2013-12-03 23:22:26 -08:00
` ,
}
var (
2021-03-23 17:27:57 -07:00
serverIp = cmdServer . Flag . String ( "ip" , util . DetectedHostAddress ( ) , "ip or server name, also used as identifier" )
2022-03-11 14:02:39 -08:00
serverBindIp = cmdServer . Flag . String ( "ip.bind" , "" , "ip address to bind to. If empty, default to same as -ip option." )
2019-06-23 15:30:16 -07:00
serverTimeout = cmdServer . Flag . Int ( "idleTimeout" , 30 , "connection idle seconds" )
serverDataCenter = cmdServer . Flag . String ( "dataCenter" , "" , "current volume server's data center name" )
serverRack = cmdServer . Flag . String ( "rack" , "" , "current volume server's rack name" )
serverWhiteListOption = cmdServer . Flag . String ( "whiteList" , "" , "comma separated Ip addresses having write permission. No limit if empty." )
serverDisableHttp = cmdServer . Flag . Bool ( "disableHttp" , false , "disable http requests, only gRPC operations are allowed." )
volumeDataFolders = cmdServer . Flag . String ( "dir" , os . TempDir ( ) , "directories to store data files. dir[,dir]..." )
2022-01-13 13:03:04 -08:00
volumeMaxDataVolumeCounts = cmdServer . Flag . String ( "volume.max" , "8" , "maximum numbers of volumes, count[,count]... If set to zero, the limit will be auto configured as free disk space divided by volume size." )
2021-04-27 10:37:24 +08:00
volumeMinFreeSpacePercent = cmdServer . Flag . String ( "volume.minFreeSpacePercent" , "1" , "minimum free disk space (default to 1%). Low disk space will mark all volumes as ReadOnly (deprecated, use minFreeSpace instead)." )
volumeMinFreeSpace = cmdServer . Flag . String ( "volume.minFreeSpace" , "" , "min free disk space (value<=100 as percentage like 1, other as human readable bytes, like 10GiB). Low disk space will mark all volumes as ReadOnly." )
2020-09-24 09:55:02 -07:00
serverMetricsHttpPort = cmdServer . Flag . Int ( "metricsPort" , 0 , "Prometheus metrics listen port" )
2024-07-12 21:56:26 +04:00
serverMetricsHttpIp = cmdServer . Flag . String ( "metricsIp" , "" , "metrics listen ip. If empty, default to same as -ip.bind option." )
2020-06-05 18:18:15 +03:00
2020-06-04 10:52:01 -07:00
// pulseSeconds = cmdServer.Flag.Int("pulseSeconds", 5, "number of seconds between heartbeats")
2021-01-07 02:35:47 -08:00
isStartingMasterServer = cmdServer . Flag . Bool ( "master" , true , "whether to start master server" )
2020-10-29 00:24:16 -07:00
isStartingVolumeServer = cmdServer . Flag . Bool ( "volume" , true , "whether to start volume server" )
isStartingFiler = cmdServer . Flag . Bool ( "filer" , false , "whether to start filer" )
isStartingS3 = cmdServer . Flag . Bool ( "s3" , false , "whether to start S3 gateway" )
2025-05-05 20:43:49 +02:00
isStartingSftp = cmdServer . Flag . Bool ( "sftp" , false , "whether to start Sftp server" )
2022-01-13 22:49:49 -08:00
isStartingIam = cmdServer . Flag . Bool ( "iam" , false , "whether to start IAM service" )
2021-01-31 22:16:52 -08:00
isStartingWebDav = cmdServer . Flag . Bool ( "webdav" , false , "whether to start WebDAV gateway" )
2022-07-01 21:59:50 -07:00
isStartingMqBroker = cmdServer . Flag . Bool ( "mq.broker" , false , "whether to start message queue broker" )
2025-07-09 09:02:25 -07:00
isStartingMqAgent = cmdServer . Flag . Bool ( "mq.agent" , false , "whether to start message queue agent" )
2013-12-03 23:22:26 -08:00
2020-06-10 13:10:10 -07:00
False = false
2013-12-03 23:22:26 -08:00
)
2014-03-30 20:57:25 -07:00
func init ( ) {
2014-11-28 16:34:03 -08:00
serverOptions . cpuprofile = cmdServer . Flag . String ( "cpuprofile" , "" , "cpu profile output file" )
2021-03-30 01:25:28 -07:00
serverOptions . memprofile = cmdServer . Flag . String ( "memprofile" , "" , "memory profile output file" )
2021-07-31 09:18:41 -07:00
serverOptions . debug = cmdServer . Flag . Bool ( "debug" , false , "serves runtime profiling data, e.g., http://localhost:6060/debug/pprof/goroutine?debug=2" )
serverOptions . debugPort = cmdServer . Flag . Int ( "debug.port" , 6060 , "http port for debugging" )
2019-06-23 03:08:27 -07:00
masterOptions . port = cmdServer . Flag . Int ( "master.port" , 9333 , "master server http listen port" )
2021-09-20 14:05:59 -07:00
masterOptions . portGrpc = cmdServer . Flag . Int ( "master.port.grpc" , 0 , "master server grpc listen port" )
2019-06-23 03:08:27 -07:00
masterOptions . metaFolder = cmdServer . Flag . String ( "master.dir" , "" , "data directory to store meta data, default to same as -dir specified" )
masterOptions . peers = cmdServer . Flag . String ( "master.peers" , "" , "all master nodes in comma separated ip:masterPort list" )
masterOptions . volumeSizeLimitMB = cmdServer . Flag . Uint ( "master.volumeSizeLimitMB" , 30 * 1000 , "Master stops directing writes to oversized volumes." )
masterOptions . volumePreallocate = cmdServer . Flag . Bool ( "master.volumePreallocate" , false , "Preallocate disk space for volumes." )
2024-08-21 22:53:54 -07:00
masterOptions . maxParallelVacuumPerServer = cmdServer . Flag . Int ( "master.maxParallelVacuumPerServer" , 1 , "maximum number of volumes to vacuum in parallel on one volume server" )
2021-08-14 02:54:13 -07:00
masterOptions . defaultReplication = cmdServer . Flag . String ( "master.defaultReplication" , "" , "Default replication type if not specified." )
2022-09-28 00:06:35 +05:00
masterOptions . garbageThreshold = cmdServer . Flag . Float64 ( "master.garbageThreshold" , 0.3 , "threshold to vacuum and reclaim spaces" )
masterOptions . metricsAddress = cmdServer . Flag . String ( "master.metrics.address" , "" , "Prometheus gateway address" )
masterOptions . metricsIntervalSec = cmdServer . Flag . Int ( "master.metrics.intervalSeconds" , 15 , "Prometheus push interval in seconds" )
masterOptions . raftResumeState = cmdServer . Flag . Bool ( "master.resumeState" , false , "resume previous state on start master server" )
masterOptions . raftHashicorp = cmdServer . Flag . Bool ( "master.raftHashicorp" , false , "use hashicorp raft" )
2024-06-23 06:28:37 +04:00
masterOptions . raftBootstrap = cmdServer . Flag . Bool ( "master.raftBootstrap" , false , "Whether to bootstrap the Raft cluster" )
2022-02-12 18:19:49 +08:00
masterOptions . heartbeatInterval = cmdServer . Flag . Duration ( "master.heartbeatInterval" , 300 * time . Millisecond , "heartbeat interval of master servers, and will be randomly multiplied by [1, 1.25)" )
masterOptions . electionTimeout = cmdServer . Flag . Duration ( "master.electionTimeout" , 10 * time . Second , "election timeout of master servers" )
2025-06-28 19:48:03 -07:00
masterOptions . telemetryUrl = cmdServer . Flag . String ( "master.telemetry.url" , "https://telemetry.seaweedfs.com/api/collect" , "telemetry server URL to send usage statistics" )
2025-06-28 14:11:55 -07:00
masterOptions . telemetryEnabled = cmdServer . Flag . Bool ( "master.telemetry" , false , "enable telemetry reporting" )
2019-06-23 03:08:27 -07:00
2022-05-01 21:59:16 -07:00
filerOptions . filerGroup = cmdServer . Flag . String ( "filer.filerGroup" , "" , "share metadata with other filers in the same filerGroup" )
2014-05-13 00:03:10 -07:00
filerOptions . collection = cmdServer . Flag . String ( "filer.collection" , "" , "all data will be stored in this collection" )
filerOptions . port = cmdServer . Flag . Int ( "filer.port" , 8888 , "filer server http listen port" )
2021-09-20 14:05:59 -07:00
filerOptions . portGrpc = cmdServer . Flag . Int ( "filer.port.grpc" , 0 , "filer server grpc listen port" )
2017-05-27 20:14:22 -07:00
filerOptions . publicPort = cmdServer . Flag . Int ( "filer.port.public" , 0 , "filer server public http listen port" )
2023-12-20 18:21:11 -06:00
filerOptions . allowedOrigins = cmdServer . Flag . String ( "filer.allowedOrigins" , "*" , "comma separated list of allowed origins" )
2020-09-30 09:32:00 -07:00
filerOptions . defaultReplicaPlacement = cmdServer . Flag . String ( "filer.defaultReplicaPlacement" , "" , "default replication type. If not specified, use master setting." )
2015-04-13 23:38:46 -07:00
filerOptions . disableDirListing = cmdServer . Flag . Bool ( "filer.disableDirListing" , false , "turn off directory listing" )
2021-04-01 02:21:59 -07:00
filerOptions . maxMB = cmdServer . Flag . Int ( "filer.maxMB" , 4 , "split files larger than the limit" )
2018-07-08 02:11:36 -07:00
filerOptions . dirListingLimit = cmdServer . Flag . Int ( "filer.dirListLimit" , 1000 , "limit sub dir listing size" )
2020-03-09 22:31:14 -07:00
filerOptions . cipher = cmdServer . Flag . Bool ( "filer.encryptVolumeData" , false , "encrypt data on volume servers" )
2021-01-10 23:14:46 -08:00
filerOptions . saveToFilerLimit = cmdServer . Flag . Int ( "filer.saveToFilerLimit" , 0 , "Small files smaller than this limit can be cached in filer store." )
2021-03-30 02:10:50 -07:00
filerOptions . concurrentUploadLimitMB = cmdServer . Flag . Int ( "filer.concurrentUploadLimitMB" , 64 , "limit total concurrent upload size" )
2022-03-07 02:00:14 -08:00
filerOptions . localSocket = cmdServer . Flag . String ( "filer.localSocket" , "" , "default to /tmp/seaweedfs-filer-<port>.sock" )
2022-06-15 15:53:31 +08:00
filerOptions . showUIDirectoryDelete = cmdServer . Flag . Bool ( "filer.ui.deleteDir" , true , "enable filer UI show delete directory button" )
2022-08-05 16:16:42 +08:00
filerOptions . downloadMaxMBps = cmdServer . Flag . Int ( "filer.downloadMaxMBps" , 0 , "download max speed for each download request, in MB per second" )
2023-02-26 01:48:59 +08:00
filerOptions . diskType = cmdServer . Flag . String ( "filer.disk" , "" , "[hdd|ssd|<tag>] hard drive or solid state drive or any tag" )
2024-02-27 10:38:55 -06:00
filerOptions . exposeDirectoryData = cmdServer . Flag . Bool ( "filer.exposeDirectoryData" , true , "expose directory data via filer. If false, filer UI will be innaccessible." )
2018-10-11 00:04:31 -07:00
serverOptions . v . port = cmdServer . Flag . Int ( "volume.port" , 8080 , "volume server http listen port" )
2021-09-20 14:05:59 -07:00
serverOptions . v . portGrpc = cmdServer . Flag . Int ( "volume.port.grpc" , 0 , "volume server grpc listen port" )
2018-10-11 00:04:31 -07:00
serverOptions . v . publicPort = cmdServer . Flag . Int ( "volume.port.public" , 0 , "volume server public port" )
2019-04-09 09:42:06 -07:00
serverOptions . v . indexType = cmdServer . Flag . String ( "volume.index" , "memory" , "Choose [memory|leveldb|leveldbMedium|leveldbLarge] mode for memory~performance balance." )
2021-02-22 02:03:12 -08:00
serverOptions . v . diskType = cmdServer . Flag . String ( "volume.disk" , "" , "[hdd|ssd|<tag>] hard drive or solid state drive or any tag" )
2020-07-10 10:08:36 +08:00
serverOptions . v . fixJpgOrientation = cmdServer . Flag . Bool ( "volume.images.fix.orientation" , false , "Adjust jpg orientation when uploading." )
2021-07-03 15:55:56 -07:00
serverOptions . v . readMode = cmdServer . Flag . String ( "volume.readMode" , "proxy" , "[local|proxy|redirect] how to deal with non-local volume: 'not found|read in remote node|redirect volume location'." )
2019-05-03 17:22:39 -07:00
serverOptions . v . compactionMBPerSecond = cmdServer . Flag . Int ( "volume.compactionMBps" , 0 , "limit compaction speed in mega bytes per second" )
2020-10-29 15:46:26 -07:00
serverOptions . v . fileSizeLimitMB = cmdServer . Flag . Int ( "volume.fileSizeLimitMB" , 256 , "limit file size to avoid out of memory" )
2022-11-14 16:19:27 +08:00
serverOptions . v . ldbTimeout = cmdServer . Flag . Int64 ( "volume.index.leveldbTimeout" , 0 , "alive time for leveldb (default to 0). If leveldb of volume is not accessed in ldbTimeout hours, it will be off loaded to reduce opened files and memory consumption." )
2021-03-30 02:10:50 -07:00
serverOptions . v . concurrentUploadLimitMB = cmdServer . Flag . Int ( "volume.concurrentUploadLimitMB" , 64 , "limit total concurrent upload size" )
2021-08-08 23:25:16 -07:00
serverOptions . v . concurrentDownloadLimitMB = cmdServer . Flag . Int ( "volume.concurrentDownloadLimitMB" , 64 , "limit total concurrent download size" )
2018-10-11 00:04:31 -07:00
serverOptions . v . publicUrl = cmdServer . Flag . String ( "volume.publicUrl" , "" , "publicly accessible address" )
2020-09-12 04:05:33 -07:00
serverOptions . v . preStopSeconds = cmdServer . Flag . Int ( "volume.preStopSeconds" , 10 , "number of seconds between stop send heartbeats and stop volume server" )
2020-09-21 22:43:10 -04:00
serverOptions . v . pprof = cmdServer . Flag . Bool ( "volume.pprof" , false , "enable pprof http handlers. precludes --memprofile and --cpuprofile" )
2020-11-27 03:17:10 -08:00
serverOptions . v . idxFolder = cmdServer . Flag . String ( "volume.dir.idx" , "" , "directory to store .idx files" )
2022-05-20 18:18:20 +08:00
serverOptions . v . inflightUploadDataTimeout = cmdServer . Flag . Duration ( "volume.inflightUploadDataTimeout" , 60 * time . Second , "inflight upload data wait timeout of volume servers" )
2025-07-03 06:03:49 +05:00
serverOptions . v . inflightDownloadDataTimeout = cmdServer . Flag . Duration ( "volume.inflightDownloadDataTimeout" , 60 * time . Second , "inflight download data wait timeout of volume servers" )
2022-10-12 21:15:10 -07:00
serverOptions . v . hasSlowRead = cmdServer . Flag . Bool ( "volume.hasSlowRead" , true , "<experimental> if true, this prevents slow reads from blocking other requests, but large file read P99 latency will increase." )
2022-09-17 10:50:06 -07:00
serverOptions . v . readBufferSizeMB = cmdServer . Flag . Int ( "volume.readBufferSizeMB" , 4 , "<experimental> larger values can optimize query performance but will increase some memory usage,Use with hasSlowRead normally" )
2018-10-11 00:04:31 -07:00
2019-04-24 00:18:01 -07:00
s3Options . port = cmdServer . Flag . Int ( "s3.port" , 8333 , "s3 server http listen port" )
2023-07-11 16:03:20 +01:00
s3Options . portHttps = cmdServer . Flag . Int ( "s3.port.https" , 0 , "s3 server https listen port" )
2022-05-15 00:43:37 -07:00
s3Options . portGrpc = cmdServer . Flag . Int ( "s3.port.grpc" , 0 , "s3 server grpc listen port" )
2020-10-22 11:23:00 +05:00
s3Options . domainName = cmdServer . Flag . String ( "s3.domainName" , "" , "suffix of the host name in comma separated list, {bucket}.{domainName}" )
2023-12-20 18:21:11 -06:00
s3Options . allowedOrigins = cmdServer . Flag . String ( "s3.allowedOrigins" , "*" , "comma separated list of allowed origins" )
2019-04-24 00:18:01 -07:00
s3Options . tlsPrivateKey = cmdServer . Flag . String ( "s3.key.file" , "" , "path to the TLS private key file" )
s3Options . tlsCertificate = cmdServer . Flag . String ( "s3.cert.file" , "" , "path to the TLS certificate file" )
2023-10-13 17:02:24 +01:00
s3Options . tlsCACertificate = cmdServer . Flag . String ( "s3.cacert.file" , "" , "path to the TLS CA certificate file" )
s3Options . tlsVerifyClientCert = cmdServer . Flag . Bool ( "s3.tlsVerifyClientCert" , false , "whether to verify the client's certificate" )
2020-02-09 14:31:51 -08:00
s3Options . config = cmdServer . Flag . String ( "s3.config" , "" , "path to the config file" )
2021-12-07 18:20:52 +05:00
s3Options . auditLogConfig = cmdServer . Flag . String ( "s3.auditLogConfig" , "" , "path to the audit log config file" )
2021-09-26 22:34:14 -07:00
s3Options . allowEmptyFolder = cmdServer . Flag . Bool ( "s3.allowEmptyFolder" , true , "allow empty folders" )
2022-03-30 22:46:13 +05:00
s3Options . allowDeleteBucketNotEmpty = cmdServer . Flag . Bool ( "s3.allowDeleteBucketNotEmpty" , true , "allow recursive deleting all entries along with bucket" )
2023-06-27 01:22:45 +02:00
s3Options . localSocket = cmdServer . Flag . String ( "s3.localSocket" , "" , "default to /tmp/seaweedfs-s3-<port>.sock" )
2025-04-28 13:49:01 +02:00
s3Options . bindIp = cmdServer . Flag . String ( "s3.ip.bind" , "" , "ip address to bind to. If empty, default to same as -ip.bind option." )
2025-05-01 22:09:47 +02:00
s3Options . idleTimeout = cmdServer . Flag . Int ( "s3.idleTimeout" , 10 , "connection idle seconds" )
2019-04-24 00:18:01 -07:00
2025-05-05 20:43:49 +02:00
sftpOptions . port = cmdServer . Flag . Int ( "sftp.port" , 2022 , "SFTP server listen port" )
sftpOptions . sshPrivateKey = cmdServer . Flag . String ( "sftp.sshPrivateKey" , "" , "path to the SSH private key file for host authentication" )
sftpOptions . hostKeysFolder = cmdServer . Flag . String ( "sftp.hostKeysFolder" , "" , "path to folder containing SSH private key files for host authentication" )
sftpOptions . authMethods = cmdServer . Flag . String ( "sftp.authMethods" , "password,publickey" , "comma-separated list of allowed auth methods: password, publickey, keyboard-interactive" )
sftpOptions . maxAuthTries = cmdServer . Flag . Int ( "sftp.maxAuthTries" , 6 , "maximum number of authentication attempts per connection" )
sftpOptions . bannerMessage = cmdServer . Flag . String ( "sftp.bannerMessage" , "SeaweedFS SFTP Server - Unauthorized access is prohibited" , "message displayed before authentication" )
sftpOptions . loginGraceTime = cmdServer . Flag . Duration ( "sftp.loginGraceTime" , 2 * time . Minute , "timeout for authentication" )
sftpOptions . clientAliveInterval = cmdServer . Flag . Duration ( "sftp.clientAliveInterval" , 5 * time . Second , "interval for sending keep-alive messages" )
sftpOptions . clientAliveCountMax = cmdServer . Flag . Int ( "sftp.clientAliveCountMax" , 3 , "maximum number of missed keep-alive messages before disconnecting" )
sftpOptions . userStoreFile = cmdServer . Flag . String ( "sftp.userStoreFile" , "" , "path to JSON file containing user credentials and permissions" )
sftpOptions . localSocket = cmdServer . Flag . String ( "sftp.localSocket" , "" , "default to /tmp/seaweedfs-sftp-<port>.sock" )
2022-01-13 22:49:49 -08:00
iamOptions . port = cmdServer . Flag . Int ( "iam.port" , 8111 , "iam server http listen port" )
2021-01-31 22:16:52 -08:00
webdavOptions . port = cmdServer . Flag . Int ( "webdav.port" , 7333 , "webdav server http listen port" )
webdavOptions . collection = cmdServer . Flag . String ( "webdav.collection" , "" , "collection to create the files" )
2021-02-18 12:15:09 -08:00
webdavOptions . replication = cmdServer . Flag . String ( "webdav.replication" , "" , "replication to create the files" )
2021-02-22 02:03:12 -08:00
webdavOptions . disk = cmdServer . Flag . String ( "webdav.disk" , "" , "[hdd|ssd|<tag>] hard drive or solid state drive or any tag" )
2021-01-31 22:16:52 -08:00
webdavOptions . tlsPrivateKey = cmdServer . Flag . String ( "webdav.key.file" , "" , "path to the TLS private key file" )
webdavOptions . tlsCertificate = cmdServer . Flag . String ( "webdav.cert.file" , "" , "path to the TLS certificate file" )
webdavOptions . cacheDir = cmdServer . Flag . String ( "webdav.cacheDir" , os . TempDir ( ) , "local cache directory for file chunks" )
2022-02-14 20:42:33 -08:00
webdavOptions . cacheSizeMB = cmdServer . Flag . Int64 ( "webdav.cacheCapacityMB" , 0 , "local cache capacity in MB" )
2024-01-06 00:10:20 +05:00
webdavOptions . maxMB = cmdServer . Flag . Int ( "webdav.maxMB" , 4 , "split files larger than the limit" )
2023-01-08 18:03:22 -08:00
webdavOptions . filerRootPath = cmdServer . Flag . String ( "webdav.filer.path" , "/" , "use this remote path from filer server" )
2019-04-24 00:18:01 -07:00
2022-07-01 21:59:50 -07:00
mqBrokerOptions . port = cmdServer . Flag . Int ( "mq.broker.port" , 17777 , "message queue broker gRPC listen port" )
2020-05-17 22:44:20 -07:00
2025-07-09 09:02:25 -07:00
mqAgentServerOptions . brokersString = cmdServer . Flag . String ( "mq.agent.brokers" , "localhost:17777" , "comma-separated message queue brokers" )
mqAgentServerOptions . port = cmdServer . Flag . Int ( "mq.agent.port" , 16777 , "message queue agent gRPC listen port" )
2014-03-30 20:57:25 -07:00
}
2013-12-03 23:22:26 -08:00
func runServer ( cmd * Command , args [ ] string ) bool {
2019-02-18 12:11:52 -08:00
2021-07-31 02:00:01 -07:00
if * serverOptions . debug {
2021-07-31 09:18:41 -07:00
go http . ListenAndServe ( fmt . Sprintf ( ":%d" , * serverOptions . debugPort ) , nil )
2021-07-31 02:00:01 -07:00
}
2024-07-16 19:15:55 +03:00
util . LoadSecurityConfiguration ( )
2019-06-05 01:30:24 -07:00
util . LoadConfiguration ( "master" , false )
2019-02-18 12:11:52 -08:00
2021-03-30 01:25:28 -07:00
grace . SetupProfiling ( * serverOptions . cpuprofile , * serverOptions . memprofile )
2014-03-30 20:57:25 -07:00
2019-04-24 00:18:01 -07:00
if * isStartingS3 {
* isStartingFiler = true
}
2025-05-05 20:43:49 +02:00
if * isStartingSftp {
* isStartingFiler = true
}
2022-01-13 22:49:49 -08:00
if * isStartingIam {
* isStartingFiler = true
}
2021-01-31 22:16:52 -08:00
if * isStartingWebDav {
* isStartingFiler = true
}
2022-07-01 21:59:50 -07:00
if * isStartingMqBroker {
2020-05-17 22:44:20 -07:00
* isStartingFiler = true
}
2025-07-09 09:02:25 -07:00
if * isStartingMqAgent {
* isStartingMqBroker = true
* isStartingFiler = true
}
2019-04-24 00:18:01 -07:00
2021-10-04 02:51:26 -07:00
if * isStartingMasterServer {
_ , peerList := checkPeers ( * serverIp , * masterOptions . port , * masterOptions . portGrpc , * masterOptions . peers )
peers := strings . Join ( pb . ToAddressStrings ( peerList ) , "," )
masterOptions . peers = & peers
}
2022-03-11 14:02:39 -08:00
if * serverBindIp == "" {
serverBindIp = serverIp
}
2024-07-12 21:56:26 +04:00
if * serverMetricsHttpIp == "" {
* serverMetricsHttpIp = * serverBindIp
}
2020-09-24 09:55:02 -07:00
// ip address
2019-06-23 03:08:27 -07:00
masterOptions . ip = serverIp
masterOptions . ipBind = serverBindIp
2023-08-24 16:08:56 +02:00
filerOptions . masters = pb . ServerAddresses ( * masterOptions . peers ) . ToServiceDiscovery ( )
2020-04-21 14:21:06 -07:00
filerOptions . ip = serverIp
filerOptions . bindIp = serverBindIp
2025-04-28 13:49:01 +02:00
if * s3Options . bindIp == "" {
s3Options . bindIp = serverBindIp
}
2025-05-05 20:43:49 +02:00
if sftpOptions . bindIp == nil || * sftpOptions . bindIp == "" {
sftpOptions . bindIp = serverBindIp
}
2022-03-15 22:28:18 -07:00
iamOptions . ip = serverBindIp
2022-02-23 12:01:54 +07:00
iamOptions . masters = masterOptions . peers
2025-03-18 14:01:26 +08:00
webdavOptions . ipBind = serverBindIp
2018-10-11 00:04:31 -07:00
serverOptions . v . ip = serverIp
serverOptions . v . bindIp = serverBindIp
2021-10-04 03:27:10 -07:00
serverOptions . v . masters = pb . ServerAddresses ( * masterOptions . peers ) . ToAddresses ( )
2018-10-11 00:04:31 -07:00
serverOptions . v . idleConnectionTimeout = serverTimeout
serverOptions . v . dataCenter = serverDataCenter
serverOptions . v . rack = serverRack
2022-07-01 21:59:50 -07:00
mqBrokerOptions . ip = serverIp
2023-08-24 16:08:56 +02:00
mqBrokerOptions . masters = filerOptions . masters . GetInstancesAsMap ( )
2022-07-10 12:11:37 -07:00
mqBrokerOptions . filerGroup = filerOptions . filerGroup
2025-07-09 09:02:25 -07:00
mqAgentServerOptions . ip = serverIp
mqAgentServerOptions . brokers = pb . ServerAddresses ( * mqAgentServerOptions . brokersString ) . ToAddresses ( )
2019-06-23 03:11:21 -07:00
2020-06-04 10:52:01 -07:00
// serverOptions.v.pulseSeconds = pulseSeconds
// masterOptions.pulseSeconds = pulseSeconds
2014-03-30 20:57:25 -07:00
2019-06-23 03:08:27 -07:00
masterOptions . whiteList = serverWhiteListOption
2018-07-09 02:22:48 -07:00
filerOptions . dataCenter = serverDataCenter
2020-10-20 17:41:39 -07:00
filerOptions . rack = serverRack
2022-07-02 09:28:24 -07:00
mqBrokerOptions . dataCenter = serverDataCenter
mqBrokerOptions . rack = serverRack
2022-08-05 05:35:00 +05:00
s3Options . dataCenter = serverDataCenter
2025-05-05 20:43:49 +02:00
sftpOptions . dataCenter = serverDataCenter
2019-03-21 16:00:46 -07:00
filerOptions . disableHttp = serverDisableHttp
2019-06-23 03:08:27 -07:00
masterOptions . disableHttp = serverDisableHttp
2018-07-09 02:22:48 -07:00
2021-09-12 22:47:52 -07:00
filerAddress := string ( pb . NewServerAddress ( * serverIp , * filerOptions . port , * filerOptions . portGrpc ) )
2019-04-24 00:18:01 -07:00
s3Options . filer = & filerAddress
2025-05-05 20:43:49 +02:00
sftpOptions . filer = & filerAddress
2022-01-15 03:37:52 -08:00
iamOptions . filer = & filerAddress
2021-01-31 22:16:52 -08:00
webdavOptions . filer = & filerAddress
2022-07-01 23:34:51 -07:00
mqBrokerOptions . filerGroup = filerOptions . filerGroup
2019-04-24 00:18:01 -07:00
2024-07-12 21:56:26 +04:00
go stats_collect . StartMetricsServer ( * serverMetricsHttpIp , * serverMetricsHttpPort )
2013-12-03 23:22:26 -08:00
folders := strings . Split ( * volumeDataFolders , "," )
2019-06-23 03:08:27 -07:00
if * masterOptions . volumeSizeLimitMB > util . VolumeSizeLimitGB * 1000 {
2017-07-16 21:40:47 -07:00
glog . Fatalf ( "masterVolumeSizeLimitMB should be less than 30000" )
}
2019-06-23 03:08:27 -07:00
if * masterOptions . metaFolder == "" {
* masterOptions . metaFolder = folders [ 0 ]
2014-03-30 20:57:25 -07:00
}
2020-07-16 22:50:14 -07:00
if err := util . TestFolderWritable ( util . ResolvePath ( * masterOptions . metaFolder ) ) ; err != nil {
2019-06-23 03:08:27 -07:00
glog . Fatalf ( "Check Meta Folder (-mdir=\"%s\") Writable: %s" , * masterOptions . metaFolder , err )
2014-03-30 20:57:25 -07:00
}
2019-06-23 03:08:27 -07:00
filerOptions . defaultLevelDbDirectory = masterOptions . metaFolder
2014-03-30 20:57:25 -07:00
2022-08-07 01:34:32 -07:00
serverWhiteList := util . StringSplit ( * serverWhiteListOption , "," )
2013-12-03 23:22:26 -08:00
2014-03-30 20:57:25 -07:00
if * isStartingFiler {
2023-02-26 01:48:59 +08:00
if * filerOptions . diskType == "" && * serverOptions . v . diskType != "" {
filerOptions . diskType = serverOptions . v . diskType
}
2014-03-30 20:57:25 -07:00
go func ( ) {
2016-07-20 23:45:55 -07:00
time . Sleep ( 1 * time . Second )
2018-10-10 23:19:54 -07:00
filerOptions . startFiler ( )
2014-03-30 20:57:25 -07:00
} ( )
}
2014-03-30 11:28:04 -07:00
2019-04-24 00:18:01 -07:00
if * isStartingS3 {
go func ( ) {
time . Sleep ( 2 * time . Second )
2022-03-07 02:00:14 -08:00
s3Options . localFilerSocket = filerOptions . localSocket
2019-04-24 00:18:01 -07:00
s3Options . startS3Server ( )
2022-01-13 22:49:49 -08:00
} ( )
}
2019-04-24 00:18:01 -07:00
2025-05-05 20:43:49 +02:00
if * isStartingSftp {
go func ( ) {
time . Sleep ( 2 * time . Second )
sftpOptions . localSocket = filerOptions . localSocket
sftpOptions . startSftpServer ( )
} ( )
}
2022-01-13 22:49:49 -08:00
if * isStartingIam {
go func ( ) {
time . Sleep ( 2 * time . Second )
iamOptions . startIamServer ( )
2019-04-24 00:18:01 -07:00
} ( )
}
2021-01-31 22:16:52 -08:00
if * isStartingWebDav {
go func ( ) {
time . Sleep ( 2 * time . Second )
webdavOptions . startWebDav ( )
} ( )
}
2022-07-01 21:59:50 -07:00
if * isStartingMqBroker {
2020-05-17 22:44:20 -07:00
go func ( ) {
time . Sleep ( 2 * time . Second )
2022-07-01 21:59:50 -07:00
mqBrokerOptions . startQueueServer ( )
2020-05-17 22:44:20 -07:00
} ( )
}
2025-07-09 09:02:25 -07:00
if * isStartingMqAgent {
go func ( ) {
time . Sleep ( 2 * time . Second )
mqAgentServerOptions . startQueueAgent ( )
} ( )
}
2019-07-28 01:55:05 -07:00
// start volume server
2020-10-29 00:24:16 -07:00
if * isStartingVolumeServer {
2021-05-28 14:19:24 +03:00
minFreeSpaces := util . MustParseMinFreeSpace ( * volumeMinFreeSpace , * volumeMinFreeSpacePercent )
2021-04-27 10:37:24 +08:00
go serverOptions . v . startVolumeServer ( * volumeDataFolders , * volumeMaxDataVolumeCounts , * serverWhiteListOption , minFreeSpaces )
2019-07-28 01:55:05 -07:00
}
2014-05-13 00:03:10 -07:00
2021-01-07 02:35:47 -08:00
if * isStartingMasterServer {
go startMaster ( masterOptions , serverWhiteList )
}
select { }
2013-12-03 23:22:26 -08:00
}
2025-07-08 13:48:12 +08:00
func newHttpServer ( h http . Handler , tlsConfig * tls . Config ) * http . Server {
s := & http . Server {
Handler : h ,
}
if tlsConfig != nil {
s . TLSConfig = tlsConfig . Clone ( )
}
return s
}