123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418 |
- package command
- import (
- "io/ioutil"
- "path/filepath"
- )
- func init() {
- cmdScaffold.Run = runScaffold // break init cycle
- }
- var cmdScaffold = &Command{
- UsageLine: "scaffold -config=[filer|notification|replication|security|master]",
- Short: "generate basic configuration files",
- Long: `Generate filer.toml with all possible configurations for you to customize.
- The options can also be overwritten by environment variables.
- For example, the filer.toml mysql password can be overwritten by environment variable
- export WEED_MYSQL_PASSWORD=some_password
- Environment variable rules:
- * Prefix the variable name with "WEED_"
- * Upppercase the reset of variable name.
- * Replace '.' with '_'
- `,
- }
- var (
- outputPath = cmdScaffold.Flag.String("output", "", "if not empty, save the configuration file to this directory")
- config = cmdScaffold.Flag.String("config", "filer", "[filer|notification|replication|security|master] the configuration file to generate")
- )
- func runScaffold(cmd *Command, args []string) bool {
- content := ""
- switch *config {
- case "filer":
- content = FILER_TOML_EXAMPLE
- case "notification":
- content = NOTIFICATION_TOML_EXAMPLE
- case "replication":
- content = REPLICATION_TOML_EXAMPLE
- case "security":
- content = SECURITY_TOML_EXAMPLE
- case "master":
- content = MASTER_TOML_EXAMPLE
- }
- if content == "" {
- println("need a valid -config option")
- return false
- }
- if *outputPath != "" {
- ioutil.WriteFile(filepath.Join(*outputPath, *config+".toml"), []byte(content), 0644)
- } else {
- println(content)
- }
- return true
- }
- const (
- FILER_TOML_EXAMPLE = `
- # A sample TOML config file for SeaweedFS filer store
- # Used with "weed filer" or "weed server -filer"
- # Put this file to one of the location, with descending priority
- # ./filer.toml
- # $HOME/.seaweedfs/filer.toml
- # /etc/seaweedfs/filer.toml
- ####################################################
- # Customizable filer server options
- ####################################################
- [filer.options]
- # with http DELETE, by default the filer would check whether a folder is empty.
- # recursive_delete will delete all sub folders and files, similar to "rm -Rf"
- recursive_delete = false
- # directories under this folder will be automatically creating a separate bucket
- buckets_folder = "/buckets"
- buckets_fsync = [ # a list of buckets with all write requests fsync=true
- "important_bucket",
- "should_always_fsync",
- ]
- ####################################################
- # The following are filer store options
- ####################################################
- [leveldb2]
- # local on disk, mostly for simple single-machine setup, fairly scalable
- # faster than previous leveldb, recommended.
- enabled = true
- dir = "." # directory to store level db files
- [mysql] # or tidb
- # CREATE TABLE IF NOT EXISTS filemeta (
- # dirhash BIGINT COMMENT 'first 64 bits of MD5 hash value of directory field',
- # name VARCHAR(1000) COMMENT 'directory or file name',
- # directory TEXT COMMENT 'full path to parent directory',
- # meta LONGBLOB,
- # PRIMARY KEY (dirhash, name)
- # ) DEFAULT CHARSET=utf8;
- enabled = false
- hostname = "localhost"
- port = 3306
- username = "root"
- password = ""
- database = "" # create or use an existing database
- connection_max_idle = 2
- connection_max_open = 100
- interpolateParams = false
- [postgres] # or cockroachdb
- # CREATE TABLE IF NOT EXISTS filemeta (
- # dirhash BIGINT,
- # name VARCHAR(65535),
- # directory VARCHAR(65535),
- # meta bytea,
- # PRIMARY KEY (dirhash, name)
- # );
- enabled = false
- hostname = "localhost"
- port = 5432
- username = "postgres"
- password = ""
- database = "" # create or use an existing database
- sslmode = "disable"
- connection_max_idle = 100
- connection_max_open = 100
- [cassandra]
- # CREATE TABLE filemeta (
- # directory varchar,
- # name varchar,
- # meta blob,
- # PRIMARY KEY (directory, name)
- # ) WITH CLUSTERING ORDER BY (name ASC);
- enabled = false
- keyspace="seaweedfs"
- hosts=[
- "localhost:9042",
- ]
- [redis2]
- enabled = false
- address = "localhost:6379"
- password = ""
- database = 0
- [redis_cluster2]
- enabled = false
- addresses = [
- "localhost:30001",
- "localhost:30002",
- "localhost:30003",
- "localhost:30004",
- "localhost:30005",
- "localhost:30006",
- ]
- password = ""
- # allows reads from slave servers or the master, but all writes still go to the master
- readOnly = true
- # automatically use the closest Redis server for reads
- routeByLatency = true
- [etcd]
- enabled = false
- servers = "localhost:2379"
- timeout = "3s"
- [mongodb]
- enabled = false
- uri = "mongodb://localhost:27017"
- option_pool_size = 0
- database = "seaweedfs"
- `
- NOTIFICATION_TOML_EXAMPLE = `
- # A sample TOML config file for SeaweedFS filer store
- # Used by both "weed filer" or "weed server -filer" and "weed filer.replicate"
- # Put this file to one of the location, with descending priority
- # ./notification.toml
- # $HOME/.seaweedfs/notification.toml
- # /etc/seaweedfs/notification.toml
- ####################################################
- # notification
- # send and receive filer updates for each file to an external message queue
- ####################################################
- [notification.log]
- # this is only for debugging perpose and does not work with "weed filer.replicate"
- enabled = false
- [notification.kafka]
- enabled = false
- hosts = [
- "localhost:9092"
- ]
- topic = "seaweedfs_filer"
- offsetFile = "./last.offset"
- offsetSaveIntervalSeconds = 10
- [notification.aws_sqs]
- # experimental, let me know if it works
- enabled = false
- aws_access_key_id = "" # if empty, loads from the shared credentials file (~/.aws/credentials).
- aws_secret_access_key = "" # if empty, loads from the shared credentials file (~/.aws/credentials).
- region = "us-east-2"
- sqs_queue_name = "my_filer_queue" # an existing queue name
- [notification.google_pub_sub]
- # read credentials doc at https://cloud.google.com/docs/authentication/getting-started
- enabled = false
- google_application_credentials = "/path/to/x.json" # path to json credential file
- project_id = "" # an existing project id
- topic = "seaweedfs_filer_topic" # a topic, auto created if does not exists
- [notification.gocdk_pub_sub]
- # The Go Cloud Development Kit (https://gocloud.dev).
- # PubSub API (https://godoc.org/gocloud.dev/pubsub).
- # Supports AWS SNS/SQS, Azure Service Bus, Google PubSub, NATS and RabbitMQ.
- enabled = false
- # This URL will Dial the RabbitMQ server at the URL in the environment
- # variable RABBIT_SERVER_URL and open the exchange "myexchange".
- # The exchange must have already been created by some other means, like
- # the RabbitMQ management plugin.
- topic_url = "rabbit://myexchange"
- sub_url = "rabbit://myqueue"
- `
- REPLICATION_TOML_EXAMPLE = `
- # A sample TOML config file for replicating SeaweedFS filer
- # Used with "weed filer.replicate"
- # Put this file to one of the location, with descending priority
- # ./replication.toml
- # $HOME/.seaweedfs/replication.toml
- # /etc/seaweedfs/replication.toml
- [source.filer]
- enabled = true
- grpcAddress = "localhost:18888"
- # all files under this directory tree are replicated.
- # this is not a directory on your hard drive, but on your filer.
- # i.e., all files with this "prefix" are sent to notification message queue.
- directory = "/buckets"
- [sink.filer]
- enabled = false
- grpcAddress = "localhost:18888"
- # all replicated files are under this directory tree
- # this is not a directory on your hard drive, but on your filer.
- # i.e., all received files will be "prefixed" to this directory.
- directory = "/backup"
- replication = ""
- collection = ""
- ttlSec = 0
- [sink.s3]
- # read credentials doc at https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/sessions.html
- # default loads credentials from the shared credentials file (~/.aws/credentials).
- enabled = false
- aws_access_key_id = "" # if empty, loads from the shared credentials file (~/.aws/credentials).
- aws_secret_access_key = "" # if empty, loads from the shared credentials file (~/.aws/credentials).
- region = "us-east-2"
- bucket = "your_bucket_name" # an existing bucket
- directory = "/" # destination directory
- endpoint = ""
- [sink.google_cloud_storage]
- # read credentials doc at https://cloud.google.com/docs/authentication/getting-started
- enabled = false
- google_application_credentials = "/path/to/x.json" # path to json credential file
- bucket = "your_bucket_seaweedfs" # an existing bucket
- directory = "/" # destination directory
- [sink.azure]
- # experimental, let me know if it works
- enabled = false
- account_name = ""
- account_key = ""
- container = "mycontainer" # an existing container
- directory = "/" # destination directory
- [sink.backblaze]
- enabled = false
- b2_account_id = ""
- b2_master_application_key = ""
- bucket = "mybucket" # an existing bucket
- directory = "/" # destination directory
- `
- SECURITY_TOML_EXAMPLE = `
- # Put this file to one of the location, with descending priority
- # ./security.toml
- # $HOME/.seaweedfs/security.toml
- # /etc/seaweedfs/security.toml
- # this file is read by master, volume server, and filer
- # the jwt signing key is read by master and volume server.
- # a jwt defaults to expire after 10 seconds.
- [jwt.signing]
- key = ""
- expires_after_seconds = 10 # seconds
- # jwt for read is only supported with master+volume setup. Filer does not support this mode.
- [jwt.signing.read]
- key = ""
- expires_after_seconds = 10 # seconds
- # all grpc tls authentications are mutual
- # the values for the following ca, cert, and key are paths to the PERM files.
- # the host name is not checked, so the PERM files can be shared.
- [grpc]
- ca = ""
- [grpc.volume]
- cert = ""
- key = ""
- [grpc.master]
- cert = ""
- key = ""
- [grpc.filer]
- cert = ""
- key = ""
- [grpc.msg_broker]
- cert = ""
- key = ""
- # use this for any place needs a grpc client
- # i.e., "weed backup|benchmark|filer.copy|filer.replicate|mount|s3|upload"
- [grpc.client]
- cert = ""
- key = ""
- # volume server https options
- # Note: work in progress!
- # this does not work with other clients, e.g., "weed filer|mount" etc, yet.
- [https.client]
- enabled = true
- [https.volume]
- cert = ""
- key = ""
- `
- MASTER_TOML_EXAMPLE = `
- # Put this file to one of the location, with descending priority
- # ./master.toml
- # $HOME/.seaweedfs/master.toml
- # /etc/seaweedfs/master.toml
- # this file is read by master
- [master.maintenance]
- # periodically run these scripts are the same as running them from 'weed shell'
- scripts = """
- lock
- ec.encode -fullPercent=95 -quietFor=1h
- ec.rebuild -force
- ec.balance -force
- volume.balance -force
- volume.fix.replication
- unlock
- """
- sleep_minutes = 17 # sleep minutes between each script execution
- [master.filer]
- default = "localhost:8888" # used by maintenance scripts if the scripts needs to use fs related commands
- [master.sequencer]
- type = "memory" # Choose [memory|etcd] type for storing the file id sequence
- # when sequencer.type = etcd, set listen client urls of etcd cluster that store file id sequence
- # example : http://127.0.0.1:2379,http://127.0.0.1:2389
- sequencer_etcd_urls = "http://127.0.0.1:2379"
- # configurations for tiered cloud storage
- # old volumes are transparently moved to cloud for cost efficiency
- [storage.backend]
- [storage.backend.s3.default]
- enabled = false
- aws_access_key_id = "" # if empty, loads from the shared credentials file (~/.aws/credentials).
- aws_secret_access_key = "" # if empty, loads from the shared credentials file (~/.aws/credentials).
- region = "us-east-2"
- bucket = "your_bucket_name" # an existing bucket
- endpoint = ""
- # create this number of logical volumes if no more writable volumes
- # count_x means how many copies of data.
- # e.g.:
- # 000 has only one copy, copy_1
- # 010 and 001 has two copies, copy_2
- # 011 has only 3 copies, copy_3
- [master.volume_growth]
- copy_1 = 7 # create 1 x 7 = 7 actual volumes
- copy_2 = 6 # create 2 x 6 = 12 actual volumes
- copy_3 = 3 # create 3 x 3 = 9 actual volumes
- copy_other = 1 # create n x 1 = n actual volumes
- # configuration flags for replication
- [master.replication]
- # any replication counts should be considered minimums. If you specify 010 and
- # have 3 different racks, that's still considered writable. Writes will still
- # try to replicate to all available volumes. You should only use this option
- # if you are doing your own replication or periodic sync of volumes.
- treat_replication_as_minimums = false
- `
- )
|