From 135711bb97ab1121267a0e929d585c4ab821d47d Mon Sep 17 00:00:00 2001 From: anonpenguin Date: Tue, 12 Aug 2025 22:35:56 +0300 Subject: [PATCH] Add adv-addr flag for RQLite HTTP and Raft advertisement Allows setting advertised addresses for RQLite via --adv-addr. Updates config and startup logic to pass these addresses to RQLite. --- Makefile | 2 +- cmd/node/main.go | 14 ++++++++++---- pkg/config/config.go | 4 ++++ pkg/database/rqlite.go | 26 +++++++++++++++++--------- pkg/node/node.go | 2 +- 5 files changed, 33 insertions(+), 15 deletions(-) diff --git a/Makefile b/Makefile index 0fad4a2..80ba2a7 100644 --- a/Makefile +++ b/Makefile @@ -31,7 +31,7 @@ test: # Run bootstrap node (auto-selects identity and data dir) run-node: @echo "Starting bootstrap node..." - go run ./cmd/node --data ./data/bootstrap --p2p-port $${P2P:-4001} --rqlite-http-port $${HTTP:-5001} --rqlite-raft-port $${RAFT:-7001} --disable-anonrc + go run ./cmd/node --data ./data/bootstrap --p2p-port $${P2P:-4001} --rqlite-http-port $${HTTP:-5001} --rqlite-raft-port $${RAFT:-7001} --adv-addr $${ADV_ADDR:-127.0.0.1} --disable-anonrc # Run second node (regular) - requires join address of bootstrap node # Usage: make run-node2 JOINADDR=/ip4/127.0.0.1/tcp/5001 HTTP=5002 RAFT=7002 P2P=4002 diff --git a/cmd/node/main.go b/cmd/node/main.go index a10c8c7..ea250f1 100644 --- a/cmd/node/main.go +++ b/cmd/node/main.go @@ -28,7 +28,7 @@ func setup_logger(component logging.Component) (logger *logging.ColoredLogger) { return logger } -func parse_and_return_network_flags() (dataDir, nodeID *string, p2pPort, rqlHTTP, rqlRaft *int, disableAnon *bool, rqlJoinAddr *string, help *bool) { +func parse_and_return_network_flags() (dataDir, nodeID *string, p2pPort, rqlHTTP, rqlRaft *int, disableAnon *bool, rqlJoinAddr *string, advAddr *string, help *bool) { logger := setup_logger(logging.ComponentNode) dataDir = flag.String("data", "", "Data directory (auto-detected if not provided)") @@ -38,6 +38,7 @@ func parse_and_return_network_flags() (dataDir, nodeID *string, p2pPort, rqlHTTP rqlRaft = flag.Int("rqlite-raft-port", 7001, "RQLite Raft port") disableAnon = flag.Bool("disable-anonrc", false, "Disable Anyone proxy routing (defaults to enabled on 127.0.0.1:9050)") rqlJoinAddr = flag.String("rqlite-join-address", "", "RQLite address to join (e.g., /ip4/)") + advAddr = flag.String("adv-addr", "127.0.0.1", "Default Addvertise address for rqlite and rafts") help = flag.Bool("help", false, "Show help") flag.Parse() @@ -109,7 +110,7 @@ func startNode(ctx context.Context, cfg *config.Config, port int) error { } // load_args_into_config applies command line argument overrides to the config -func load_args_into_config(cfg *config.Config, p2pPort, rqlHTTP, rqlRaft *int, rqlJoinAddr *string) { +func load_args_into_config(cfg *config.Config, p2pPort, rqlHTTP, rqlRaft *int, rqlJoinAddr *string, advAddr *string) { logger := setup_logger(logging.ComponentNode) // Apply RQLite HTTP port override @@ -137,12 +138,17 @@ func load_args_into_config(cfg *config.Config, p2pPort, rqlHTTP, rqlRaft *int, r cfg.Database.RQLiteJoinAddress = *rqlJoinAddr logger.ComponentInfo(logging.ComponentNode, "Setting RQLite join address", zap.String("address", *rqlJoinAddr)) } + + if *advAddr != "" { + cfg.Discovery.HttpAdvAddress = fmt.Sprintf("%s:%d", *advAddr, *rqlHTTP) + cfg.Discovery.RaftAdvAddress = fmt.Sprintf("%s:%d", *advAddr, *rqlRaft) + } } func main() { logger := setup_logger(logging.ComponentNode) - dataDir, nodeID, p2pPort, rqlHTTP, rqlRaft, disableAnon, rqlJoinAddr, help := parse_and_return_network_flags() + dataDir, nodeID, p2pPort, rqlHTTP, rqlRaft, disableAnon, rqlJoinAddr, advAddr, help := parse_and_return_network_flags() disable_anon_proxy(disableAnon) check_if_should_open_help(help) @@ -154,7 +160,7 @@ func main() { logger.ComponentInfo(logging.ComponentNode, "Default configuration loaded successfully") // Apply command line argument overrides - load_args_into_config(cfg, p2pPort, rqlHTTP, rqlRaft, rqlJoinAddr) + load_args_into_config(cfg, p2pPort, rqlHTTP, rqlRaft, rqlJoinAddr, advAddr) logger.ComponentInfo(logging.ComponentNode, "Command line arguments applied to configuration") // LibP2P uses configurable port (default 4001); RQLite uses 5001 (HTTP) and 7001 (Raft) diff --git a/pkg/config/config.go b/pkg/config/config.go index 0683a8f..a240ddc 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -48,6 +48,8 @@ type DiscoveryConfig struct { DHTPrefix string `yaml:"dht_prefix"` // DHT protocol prefix DiscoveryInterval time.Duration `yaml:"discovery_interval"` // Discovery announcement interval BootstrapPort int `yaml:"bootstrap_port"` // Default port for bootstrap nodes + HttpAdvAddress string `yaml:"http_adv_address"` // HTTP advertisement address + RaftAdvAddress string `yaml:"raft_adv_address"` // Raft advertisement } // SecurityConfig contains security-related configuration @@ -119,6 +121,8 @@ func DefaultConfig() *Config { EnableDHT: false, // Disabled - conflicts with Anyone protocol anonymity DHTPrefix: "/network/kad/1.0.0", DiscoveryInterval: time.Second * 15, // Back to 15 seconds for testing + HttpAdvAddress: "", + RaftAdvAddress: "", }, Security: SecurityConfig{ EnableTLS: false, diff --git a/pkg/database/rqlite.go b/pkg/database/rqlite.go index a1c38be..09e0b39 100644 --- a/pkg/database/rqlite.go +++ b/pkg/database/rqlite.go @@ -20,11 +20,12 @@ import ( // RQLiteManager manages an RQLite node instance type RQLiteManager struct { - config *config.DatabaseConfig - dataDir string - logger *zap.Logger - cmd *exec.Cmd - connection *gorqlite.Connection + config *config.DatabaseConfig + discoverConfig *config.DiscoveryConfig + dataDir string + logger *zap.Logger + cmd *exec.Cmd + connection *gorqlite.Connection } // waitForSQLAvailable waits until a simple query succeeds, indicating a leader is known and queries can be served. @@ -57,11 +58,12 @@ func (r *RQLiteManager) waitForSQLAvailable(ctx context.Context) error { } // NewRQLiteManager creates a new RQLite manager -func NewRQLiteManager(cfg *config.DatabaseConfig, dataDir string, logger *zap.Logger) *RQLiteManager { +func NewRQLiteManager(cfg *config.DatabaseConfig, discoveryCfg *config.DiscoveryConfig, dataDir string, logger *zap.Logger) *RQLiteManager { return &RQLiteManager{ - config: cfg, - dataDir: dataDir, - logger: logger, + config: cfg, + discoverConfig: discoveryCfg, + dataDir: dataDir, + logger: logger, } } @@ -73,9 +75,15 @@ func (r *RQLiteManager) Start(ctx context.Context) error { return fmt.Errorf("failed to create RQLite data directory: %w", err) } + if r.discoverConfig.HttpAdvAddress == "" { + return fmt.Errorf("discovery config HttpAdvAddress is empty") + } + // Build RQLite command args := []string{ "-http-addr", fmt.Sprintf("0.0.0.0:%d", r.config.RQLitePort), + "-http-adv-addr", r.discoverConfig.HttpAdvAddress, + "-raft-adv-addr", r.discoverConfig.RaftAdvAddress, "-raft-addr", fmt.Sprintf("0.0.0.0:%d", r.config.RQLiteRaftPort), } diff --git a/pkg/node/node.go b/pkg/node/node.go index 3d04604..c43b964 100644 --- a/pkg/node/node.go +++ b/pkg/node/node.go @@ -60,7 +60,7 @@ func (n *Node) startRQLite(ctx context.Context) error { n.logger.Info("Starting RQLite database") // Create RQLite manager - n.rqliteManager = database.NewRQLiteManager(&n.config.Database, n.config.Node.DataDir, n.logger.Logger) + n.rqliteManager = database.NewRQLiteManager(&n.config.Database, &n.config.Discovery, n.config.Node.DataDir, n.logger.Logger) // Start RQLite if err := n.rqliteManager.Start(ctx); err != nil {