Some checks failed
go: build dev binaries / cleanup (push) Successful in 4s
Codespell / Check for spelling errors (push) Failing after 3s
docker: build dev containers / build-rust-binaries (amd64, x86_64-unknown-linux-musl) (push) Failing after 3s
docker: build dev containers / build-dev-containers (push) Has been skipped
docker: build dev containers / build-rust-binaries (arm64, true, aarch64-unknown-linux-musl) (push) Failing after 3s
End to End / FUSE Mount (push) Failing after 2s
EC Integration Tests / EC Integration Tests (push) Failing after 30s
FUSE DLM Integration Tests / FUSE DLM Integration Tests (push) Failing after 3s
FUSE Volume Server Failover Tests / FUSE Volume Server Failover (push) Failing after 3s
FUSE Integration Tests / FUSE Integration Testing (push) Failing after 2s
FUSE P2P Peer Chunk Sharing Integration Tests / FUSE P2P Peer Chunk Sharing (push) Failing after 3s
go: build binary / Go Vet (push) Failing after 2s
go: build binary / Go Vet 32-bit (push) Failing after 3s
go: build binary / Build (push) Failing after 4s
go: build binary / Build cross-platform (freebsd/amd64) (push) Failing after 3s
go: build binary / Build cross-platform (windows/amd64) (push) Failing after 3s
go: build binary / Build cross-platform (darwin/arm64) (push) Failing after 3s
go: build binary / Build cross-platform (windows/arm64) (push) Failing after 3s
go: build binary / Test (push) Failing after 2s
go: build binary / Test 32-bit (push) Failing after 3s
helm: lint and test charts / lint-test (push) Failing after 3s
Java Client Integration Tests / Java Integration Tests (11) (push) Failing after 3s
Java Client Integration Tests / Java Integration Tests (17) (push) Failing after 3s
go: build dev binaries / build_dev_linux_windows (amd64, linux) (push) Failing after 2s
go: build dev binaries / build_dev_linux_windows (amd64, windows) (push) Failing after 3s
go: build dev binaries / build_dev_darwin (amd64, darwin) (push) Has been skipped
go: build dev binaries / build_dev_darwin (arm64, darwin) (push) Has been skipped
Java Client Unit Tests / Java Unit Tests (11) (push) Failing after 3s
Java Client Unit Tests / Java Unit Tests (17) (push) Failing after 2s
Java Client Unit Tests / Java Unit Tests (21) (push) Failing after 3s
Java Client Unit Tests / Java Unit Tests (8) (push) Failing after 3s
Kafka Quick Test (Load Test with Schema Registry) / Kafka Client Load Test (Quick) (push) Failing after 3s
Kafka Gateway Tests / Kafka Unit Tests (unit-tests-1) (push) Failing after 11s
Kafka Gateway Tests / Kafka Integration Tests (Critical) (integration-1) (push) Failing after 3s
Kafka Gateway Tests / Kafka End-to-End Tests (with SMQ) (e2e-1) (push) Failing after 3s
Kafka Gateway Tests / Kafka Consumer Group Tests (Highly Isolated) (consumer-group-1) (push) Failing after 2s
Kafka Gateway Tests / Kafka Client Compatibility (with SMQ) (client-compat-1) (push) Failing after 3s
Kafka Gateway Tests / Kafka SMQ Integration Tests (Full Stack) (smq-integration-1) (push) Failing after 3s
Kafka Gateway Tests / Kafka Protocol Tests (Isolated) (protocol-1) (push) Failing after 3s
KMS Tests / KMS Provider Integration Tests (push) Failing after 2s
KMS Tests / S3 KMS End-to-End Tests (push) Failing after 3s
Master Cold Start Tests / Master Cold Start Tests (push) Failing after 4s
Metadata Subscribe Integration Tests / Metadata Subscribe Integration Tests (push) Failing after 3s
Multi-Master Tests / Multi-Master Failover Tests (push) Failing after 3s
Performance / CPU and Heap Profile (push) Failing after 2s
Performance / S3 Read/Write Benchmark (rust volume) (push) Failing after 3s
pjdfstest POSIX Compliance / pjdfstest (push) Failing after 2s
Plugin Worker Integration Tests / Plugin Worker: erasure_coding (push) Failing after 3s
Plugin Worker Integration Tests / Plugin Worker: vacuum (push) Failing after 3s
Rust Volume Server Tests / Rust Integration Tests (push) Failing after 3s
Rust Volume Server Tests / Go Tests with Rust Volume (grpc - Shard 1) (push) Failing after 2s
Rust Volume Server Tests / Go Tests with Rust Volume (http - Shard 1) (push) Failing after 3s
Rust Volume Server Tests / Go Tests with Rust Volume (grpc - Shard 2) (push) Failing after 3s
Rust Volume Server Tests / Go Tests with Rust Volume (http - Shard 2) (push) Failing after 3s
Rust Volume Server Tests / Go Tests with Rust Volume (grpc - Shard 3) (push) Failing after 3s
S3 IAM Integration Tests / S3 IAM Distributed Tests (push) Failing after 2s
S3 IAM Integration Tests / S3 IAM Performance Tests (push) Failing after 3s
Performance / Throughput Benchmark (go volume) (push) Failing after 3s
Performance / Throughput Benchmark (rust volume) (push) Failing after 2s
Performance / S3 Read/Write Benchmark (go volume) (push) Failing after 3s
Plugin Worker Integration Tests / Plugin Worker: volume_balance (push) Failing after 3s
PostgreSQL Gateway Tests / PostgreSQL Basic Tests (push) Failing after 3s
Rust Volume Server Tests / Rust Unit Tests (push) Failing after 2s
Rust Volume Server Tests / Go Tests with Rust Volume (http - Shard 3) (push) Failing after 3s
Rust Plugin Worker Tests / Rust Plugin Worker Build and Unit Tests (push) Failing after 3s
rust: build dev volume server binaries / cleanup (push) Successful in 3s
S3 ETag and ACL Tests / S3 ETag + ACL Integration Tests (push) Failing after 3s
S3 IAM Integration Tests / IAM Unit Tests (push) Failing after 3s
S3 IAM Integration Tests / S3 IAM Integration Tests (advanced) (push) Failing after 3s
S3 IAM Integration Tests / S3 IAM Integration Tests (basic) (push) Failing after 2s
S3 IAM Integration Tests / S3 IAM Integration Tests (group) (push) Failing after 3s
S3 IAM Integration Tests / S3 IAM Integration Tests (policy-enforcement) (push) Failing after 2s
S3 IAM Integration Tests / S3 IAM Integration Tests (sts) (push) Failing after 4s
S3 Keycloak Integration Tests / S3 Keycloak Integration Tests (push) Failing after 3s
S3 PyArrow Parquet Tests / PyArrow Parquet Tests (Python 3.11) (push) Failing after 3s
S3 PyArrow Parquet Tests / Go Unit Tests (Implicit Directory) (push) Has been cancelled
S3 PyArrow Parquet Tests / PyArrow Parquet Tests (Python 3.12) (push) Has been cancelled
rust: build dev volume server binaries / build-rust-volume-dev-darwin (darwin-amd64, x86_64-apple-darwin) (push) Has been cancelled
rust: build dev volume server binaries / build-rust-volume-dev-darwin (darwin-arm64, aarch64-apple-darwin) (push) Has been cancelled
rust: build dev volume server binaries / build-rust-volume-dev-linux (linux-amd64, x86_64-unknown-linux-gnu) (push) Has been cancelled
S3 PyArrow Parquet Tests / PyArrow Parquet Tests (Python 3.9) (push) Has been cancelled
S3 Proxy Signature Tests / S3 Proxy Signature Verification Tests (push) Has been cancelled
S3 SDK V2 Route Disambiguation Tests / S3 SDK V2 Routing Tests (push) Has been cancelled
S3 SSE Tests / S3 SSE Integration Tests (quick) (push) Has been cancelled
S3 SSE Tests / S3 SSE Compatibility Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Metadata Persistence Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Copy Operations Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Multipart Upload Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Performance Test (push) Has been cancelled
S3 SSE Tests / S3 Volume Encryption Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Integration Tests (comprehensive) (push) Has been cancelled
Spark Integration Tests / Spark Integration Tests (push) Failing after 2s
Telemetry Integration Tests / telemetry-integration-test (push) Failing after 3s
Volume Server Integration Tests / Volume Server Integration Tests (grpc - Shard 1) (push) Failing after 3s
Volume Server Integration Tests / Volume Server Integration Tests (http - Shard 1) (push) Failing after 3s
Ceph S3 tests / Basic S3 tests (KV store) (push) Has been cancelled
Ceph S3 tests / S3 Versioning & Object Lock tests (push) Has been cancelled
S3 Policy Integration Tests / S3 Policy Unit Tests (push) Failing after 3s
Ceph S3 tests / S3 CORS tests (push) Has been cancelled
Ceph S3 tests / SeaweedFS Custom S3 Copy tests (push) Has been cancelled
Ceph S3 tests / Basic S3 tests (SQL store) (push) Has been cancelled
test s3 over https using aws-cli / awscli-tests (push) Has been cancelled
TLS Rotation Integration Tests / TLS Rotation Integration Tests (push) Has been cancelled
Vacuum Integration Tests / Vacuum Integration Tests (push) Has been cancelled
S3 Policy Integration Tests / S3 Policy Variables Integration Tests (push) Failing after 3s
S3 Policy Integration Tests / S3 Policy Enforcement Integration Tests (advanced-policy) (push) Failing after 3s
S3 Policy Integration Tests / S3 Policy Enforcement Integration Tests (basic-policy) (push) Failing after 2s
S3 Policy Integration Tests / S3 Policy Enforcement Integration Tests (contextual-policy) (push) Failing after 4s
S3 Policy Integration Tests / Trusted Proxy Detection Tests (push) Failing after 2s
S3 Policy Integration Tests / S3 Policy Shell Integration Tests (push) Failing after 3s
Samba on FUSE Integration / samba-integration (push) Failing after 2s
SFTP Integration Tests / SFTP Integration Testing (push) Failing after 3s
terraform: validate and test modules / fmt, validate, plan-level tests (push) Failing after 3s
terraform: validate and test modules / local cluster smoke test (real weed) (push) Failing after 2s
Volume Server Integration Tests / Volume Server Integration Tests (grpc - Shard 3) (push) Failing after 3s
Volume Server Integration Tests / Volume Server Integration Tests (grpc - Shard 2) (push) Failing after 3s
Volume Server Integration Tests / Volume Server Integration Tests (http - Shard 2) (push) Failing after 2s
Volume Server Integration Tests / Volume Server Integration Tests (http - Shard 3) (push) Failing after 5s
mount: windows conformance / WinFsp conformance (push) Has been cancelled
mount: windows / Mount on Windows (push) Has been cancelled
319 lines
13 KiB
HCL
319 lines
13 KiB
HCL
# =============================================================================
|
|
# SeaweedFS Terraform core module - input variables
|
|
#
|
|
# This module is a PURE RENDERER. It creates zero cloud resources. It takes a
|
|
# per-node address map plus configuration and emits, per node, the rendered
|
|
# `weed` argv, systemd unit, cloud-init, and config files. Both the per-cloud
|
|
# infra wrappers (consume cloud_init/systemd_unit) and the local test harness
|
|
# (consume argv/config_files) read its `nodes` output.
|
|
#
|
|
# Flag names below are verified against the real `weed` binary, not the chart.
|
|
# Notably: volume uses -mserver for the master list; gRPC is -port.grpc
|
|
# (auto = http+10000); minFreeSpacePercent is a string.
|
|
# =============================================================================
|
|
|
|
variable "weed_binary" {
|
|
description = "Path to the weed executable on the target host."
|
|
type = string
|
|
default = "/usr/bin/weed"
|
|
}
|
|
|
|
variable "cluster_name" {
|
|
description = "Logical cluster name (WEED_CLUSTER_DEFAULT)."
|
|
type = string
|
|
default = "sw"
|
|
}
|
|
|
|
variable "log_level" {
|
|
description = "Global glog verbosity (-v)."
|
|
type = number
|
|
default = 1
|
|
}
|
|
|
|
variable "log_to_stderr" {
|
|
description = "Log to stderr (journald) instead of -logdir. Recommended on systemd."
|
|
type = bool
|
|
default = true
|
|
}
|
|
|
|
variable "monitoring_enabled" {
|
|
description = "Gate the -metricsPort/-metrics.address flags. When false the metrics port is not bound, matching the chart."
|
|
type = bool
|
|
default = false
|
|
}
|
|
|
|
variable "enable_security" {
|
|
description = "Emit the security.toml [grpc] mTLS block and reference per-component certs. Independent of JWT."
|
|
type = bool
|
|
default = false
|
|
}
|
|
|
|
# ----------------------------------------------------------------------------
|
|
# Security / secrets (the core only references paths + renders security.toml;
|
|
# cert/secret material is generated by the wrapper, never defaulted here).
|
|
# ----------------------------------------------------------------------------
|
|
variable "security" {
|
|
description = "mTLS + JWT signing configuration. Secret values must be supplied (never defaulted in module code)."
|
|
type = object({
|
|
cert_dir = optional(string, "/usr/local/share/ca-certificates")
|
|
allowed_wildcard_domain = optional(string, "")
|
|
allowed_common_names = optional(string, "")
|
|
jwt_signing_key = optional(string, "")
|
|
jwt_signing_read_key = optional(string, "")
|
|
jwt_filer_signing_key = optional(string, "")
|
|
jwt_filer_signing_read_key = optional(string, "")
|
|
})
|
|
default = {}
|
|
sensitive = true
|
|
}
|
|
|
|
variable "hardening" {
|
|
description = "systemd hardening directives (OpenShift SCC analogs). Relax per field if needed."
|
|
type = object({
|
|
run_as_user = optional(string, "seaweedfs")
|
|
no_new_privileges = optional(bool, true)
|
|
protect_system = optional(bool, true)
|
|
cap_drop_all = optional(bool, true)
|
|
})
|
|
default = {}
|
|
}
|
|
|
|
variable "env_file" {
|
|
description = "Path to the systemd EnvironmentFile holding secret env (DB creds, S3 admin key) fetched at boot. Optional (-prefixed in the unit, so a missing file is tolerated)."
|
|
type = string
|
|
default = "/etc/seaweedfs/weed.env"
|
|
}
|
|
|
|
variable "render_secret_files" {
|
|
description = <<-EOT
|
|
When true (default), secret-bearing config (security.toml, S3 identity JSON)
|
|
is written directly into cloud-init user_data. Convenient for the local test
|
|
harness and simple deployments. Set to false to keep secrets OUT of user_data
|
|
(and out of the cloud metadata service): the files are then exposed only via
|
|
the secret_files_by_node output, and the wrapper is expected to deliver them
|
|
from a secret store via boot_fetch_script.
|
|
EOT
|
|
type = bool
|
|
default = true
|
|
}
|
|
|
|
variable "boot_fetch_script" {
|
|
description = "Optional shell script written to /opt/seaweedfs/fetch-secrets.sh (root, 0755) and run before the weed unit starts. Used by wrappers to pull certs/secrets from a cloud secret store at boot."
|
|
type = string
|
|
default = ""
|
|
}
|
|
|
|
# ----------------------------------------------------------------------------
|
|
# Master (Raft quorum). Keyed `nodes` map -> for_each, never count.
|
|
# ----------------------------------------------------------------------------
|
|
variable "master" {
|
|
description = "Master tier. nodes is a map keyed by stable node id (m0/m1/m2)."
|
|
type = object({
|
|
enabled = optional(bool, true)
|
|
nodes = optional(map(object({
|
|
address = string
|
|
port = optional(number)
|
|
grpc_port = optional(number)
|
|
data_dir = optional(string)
|
|
disk_mounts = optional(list(object({
|
|
mountpoint = string
|
|
fstype = optional(string, "ext4")
|
|
devices = optional(list(string), [])
|
|
})), [])
|
|
})), {})
|
|
port = optional(number, 9333)
|
|
grpc_port = optional(number, null) # null => weed auto = port+10000
|
|
metrics_port = optional(number, 9327)
|
|
metrics_ip = optional(string, "")
|
|
ip_bind = optional(string, "0.0.0.0")
|
|
data_dir = optional(string, "/var/lib/seaweedfs/master")
|
|
default_replication = optional(string, "000")
|
|
volume_size_limit_mb = optional(number, 1000)
|
|
volume_preallocate = optional(bool, false)
|
|
garbage_threshold = optional(number, null)
|
|
disable_http = optional(bool, false)
|
|
raft_hashicorp = optional(bool, false)
|
|
resume_state = optional(bool, true) # deliberate deviation: binary default false
|
|
election_timeout = optional(string, "10s")
|
|
heartbeat_interval = optional(string, "300ms")
|
|
white_list = optional(string, "")
|
|
extra_args = optional(list(string), [])
|
|
})
|
|
default = {}
|
|
}
|
|
|
|
# ----------------------------------------------------------------------------
|
|
# Volume (stateful disk owners). Keyed `nodes` map.
|
|
# ----------------------------------------------------------------------------
|
|
variable "volume" {
|
|
description = "Volume tier. Each node owns one or more data dirs (-> -dir / -max)."
|
|
type = object({
|
|
enabled = optional(bool, true)
|
|
nodes = optional(map(object({
|
|
address = string
|
|
port = optional(number)
|
|
grpc_port = optional(number)
|
|
public_url = optional(string)
|
|
rack = optional(string)
|
|
data_center = optional(string)
|
|
data_dirs = optional(list(object({
|
|
path = string
|
|
max_volumes = optional(number, 0) # 0 => auto on non-windows
|
|
})))
|
|
idx_dir = optional(string)
|
|
disk_mounts = optional(list(object({
|
|
mountpoint = string
|
|
fstype = optional(string, "ext4")
|
|
devices = optional(list(string), [])
|
|
})), [])
|
|
})), {})
|
|
port = optional(number, 8080)
|
|
metrics_port = optional(number, 9327)
|
|
metrics_ip = optional(string, "")
|
|
ip_bind = optional(string, "0.0.0.0")
|
|
data_dirs = optional(list(object({
|
|
path = string
|
|
max_volumes = optional(number, 0)
|
|
})), [{ path = "/data", max_volumes = 0 }])
|
|
idx_dir = optional(string, "")
|
|
read_mode = optional(string, "proxy")
|
|
compaction_mbps = optional(number, 50)
|
|
min_free_space_percent = optional(string, "1")
|
|
file_size_limit_mb = optional(number, null)
|
|
index = optional(string, "memory")
|
|
images_fix_orientation = optional(bool, false)
|
|
white_list = optional(string, "")
|
|
extra_args = optional(list(string), [])
|
|
})
|
|
default = {}
|
|
}
|
|
|
|
# ----------------------------------------------------------------------------
|
|
# Filer (+ optional embedded S3). Keyed `nodes` map.
|
|
# ----------------------------------------------------------------------------
|
|
variable "filer" {
|
|
description = "Filer tier. Default leveldb2-replicated HA (each filer has its own store)."
|
|
type = object({
|
|
enabled = optional(bool, true)
|
|
nodes = optional(map(object({
|
|
address = string
|
|
port = optional(number)
|
|
grpc_port = optional(number)
|
|
data_dir = optional(string)
|
|
disk_mounts = optional(list(object({
|
|
mountpoint = string
|
|
fstype = optional(string, "ext4")
|
|
devices = optional(list(string), [])
|
|
})), [])
|
|
})), {})
|
|
port = optional(number, 8888)
|
|
metrics_port = optional(number, 9327)
|
|
metrics_ip = optional(string, "")
|
|
ip_bind = optional(string, "0.0.0.0")
|
|
data_dir = optional(string, "/var/lib/seaweedfs/filer") # -defaultStoreDir for leveldb2
|
|
default_replica_placement = optional(string, "000")
|
|
dir_list_limit = optional(number, 100000)
|
|
max_mb = optional(number, null)
|
|
disable_dir_listing = optional(bool, false)
|
|
disable_http = optional(bool, false)
|
|
encrypt_volume_data = optional(bool, false)
|
|
rack = optional(string, "")
|
|
data_center = optional(string, "")
|
|
filer_group = optional(string, "")
|
|
extra_env = optional(map(string), {})
|
|
extra_args = optional(list(string), [])
|
|
s3 = optional(object({
|
|
enabled = optional(bool, false)
|
|
port = optional(number, 8333)
|
|
https_port = optional(number, 0)
|
|
domain_name = optional(string, "")
|
|
config_path = optional(string, "/etc/seaweedfs/s3_config.json")
|
|
}), {})
|
|
})
|
|
default = {}
|
|
}
|
|
|
|
# ----------------------------------------------------------------------------
|
|
# S3 gateway (standalone). Keyed `nodes` map (stateless, but kept keyed for
|
|
# parity; wrappers may instead drive an ASG).
|
|
# ----------------------------------------------------------------------------
|
|
variable "s3" {
|
|
description = "Standalone S3 gateway tier."
|
|
type = object({
|
|
enabled = optional(bool, false)
|
|
nodes = optional(map(object({
|
|
address = string
|
|
port = optional(number)
|
|
grpc_port = optional(number)
|
|
})), {})
|
|
port = optional(number, 8333)
|
|
https_port = optional(number, 0)
|
|
iceberg_port = optional(number, null)
|
|
metrics_port = optional(number, 9327)
|
|
ip_bind = optional(string, "0.0.0.0")
|
|
domain_name = optional(string, "")
|
|
filer_address = optional(string, "") # override; else first filer node
|
|
config_path = optional(string, "/etc/seaweedfs/s3_config.json")
|
|
audit_log_config_path = optional(string, "")
|
|
cert_file = optional(string, "")
|
|
key_file = optional(string, "")
|
|
cacert_file = optional(string, "")
|
|
verify_client_cert = optional(bool, false)
|
|
extra_args = optional(list(string), [])
|
|
})
|
|
default = {}
|
|
}
|
|
|
|
# ----------------------------------------------------------------------------
|
|
# S3 identities -> rendered into the s3 config JSON (non-admin only; the admin
|
|
# credential is delivered via EnvironmentFile, never the JSON).
|
|
# ----------------------------------------------------------------------------
|
|
variable "s3_identities" {
|
|
description = "Non-admin S3 identities rendered into the config JSON. Admin key goes in the EnvironmentFile, not here."
|
|
type = list(object({
|
|
name = string
|
|
access_key = string
|
|
secret_key = string
|
|
actions = list(string)
|
|
}))
|
|
default = []
|
|
sensitive = true
|
|
}
|
|
|
|
# ----------------------------------------------------------------------------
|
|
# All-in-one (single `weed server` process).
|
|
# ----------------------------------------------------------------------------
|
|
variable "all_in_one" {
|
|
description = "All-in-one tier (weed server). Mutually exclusive with the distributed tiers."
|
|
type = object({
|
|
enabled = optional(bool, false)
|
|
nodes = optional(map(object({
|
|
address = string
|
|
data_dir = optional(string)
|
|
disk_mounts = optional(list(object({
|
|
mountpoint = string
|
|
fstype = optional(string, "ext4")
|
|
devices = optional(list(string), [])
|
|
})), [])
|
|
})), {})
|
|
data_dir = optional(string, "/data")
|
|
ip_bind = optional(string, "0.0.0.0")
|
|
master_port = optional(number, 9333)
|
|
volume_port = optional(number, 8080)
|
|
filer_port = optional(number, 8888)
|
|
default_replication = optional(string, "000")
|
|
volume_size_limit_mb = optional(number, 1000)
|
|
idle_timeout = optional(number, 30)
|
|
metrics_port = optional(number, 9324)
|
|
disable_http = optional(bool, false)
|
|
s3 = optional(object({
|
|
enabled = optional(bool, false)
|
|
port = optional(number, 8333)
|
|
config_path = optional(string, "/etc/seaweedfs/s3/s3_config.json")
|
|
domain_name = optional(string, "")
|
|
}), {})
|
|
extra_args = optional(list(string), [])
|
|
})
|
|
default = {}
|
|
}
|