-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.go
More file actions
136 lines (118 loc) · 4.11 KB
/
Copy pathmain.go
File metadata and controls
136 lines (118 loc) · 4.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package main
import (
"context"
"flag"
"log"
"os"
"strconv"
"strings"
"github.com/gin-gonic/gin"
"github.com/sirupsen/logrus"
"github.com/daccred/sorobangraph.attest.so/config"
"github.com/daccred/sorobangraph.attest.so/controllers"
"github.com/daccred/sorobangraph.attest.so/db"
"github.com/daccred/sorobangraph.attest.so/handlers"
"github.com/daccred/sorobangraph.attest.so/server"
"github.com/subosito/gotenv"
)
func main() {
// Load environment variables from .env if present
_ = gotenv.Load()
// Parse environment flag (default to development)
env := flag.String("e", "development", "application environment (development|production|test)")
flag.Parse()
// Initialize config based on environment
config.Init(*env)
cfg := config.GetConfig()
// Set Gin mode from env/config
mode := os.Getenv("GIN_MODE")
if mode == "" {
mode = cfg.GetString("server.gin_mode")
}
if mode == "release" {
gin.SetMode(gin.ReleaseMode)
}
// Resolve database URL from env or config, with fallback
databaseURL := os.Getenv("DATABASE_URL")
if databaseURL == "" {
raw := cfg.GetString("database.url")
expanded := os.ExpandEnv(raw)
// If expansion didn't resolve (still contains ${...}) or is empty, keep databaseURL empty to allow fallback
if expanded != "" && !strings.Contains(expanded, "${") {
databaseURL = expanded
}
}
if databaseURL == "" {
// Default to local development database
databaseURL = "postgres://stellar:stellar123@localhost:5432/sorobangraph?sslmode=disable"
}
dbConn, err := db.Connect(databaseURL)
if err != nil {
log.Fatalf("failed to connect to database: %v", err)
}
defer dbConn.Close()
// Parse filter contracts from environment variable or config
filterContractsEnv := getEnv("FILTER_CONTRACTS", "")
var filterContracts []string
if filterContractsEnv != "" {
// Environment variable takes precedence
filterContracts = strings.Split(filterContractsEnv, ",")
for i := range filterContracts {
filterContracts[i] = strings.TrimSpace(filterContracts[i])
}
} else {
// Read from config file
filterContracts = cfg.GetStringSlice("stellar.filter_contracts")
}
// Determine network mode (mainnet vs testnet)
networkMode := getEnv("NETWORK_MODE", "testnet")
var defaultPassphrase, defaultArchiveURL string
if networkMode == "mainnet" {
// Mainnet configuration
defaultPassphrase = "Public Global Stellar Network ; September 2015"
defaultArchiveURL = "https://history.stellar.org/prd/core-live/core_live_001"
} else {
// Testnet configuration (default)
defaultPassphrase = "Test SDF Network ; September 2015"
defaultArchiveURL = "https://history.stellar.org/prd/core-testnet/core_testnet_001"
}
ingCfg := &handlers.Config{
NetworkPassphrase: getEnv("NETWORK_PASSPHRASE", defaultPassphrase),
CaptiveCoreConfigPath: getEnv("CAPTIVE_CORE_CONFIG_PATH", cfg.GetString("captive_core.config_path")),
CaptiveCoreBinaryPath: getEnv("CAPTIVE_CORE_BINARY_PATH", cfg.GetString("captive_core.binary_path")),
HistoryArchiveURLs: []string{getEnv("HISTORY_ARCHIVE_URLS", defaultArchiveURL)},
StartLedger: uint32(getEnvInt("START_LEDGER", 0)),
EndLedger: uint32(getEnvInt("END_LEDGER", 0)),
EnableWebSocket: getEnv("ENABLE_WEBSOCKET", "true") == "true",
LogLevel: getEnv("LOG_LEVEL", "info"),
FilterContracts: filterContracts,
}
logger := logrus.WithField("service", "ingester")
ing, err := handlers.NewIngester(ingCfg, dbConn, logger)
if err != nil {
log.Fatalf("failed to create ingester: %v", err)
}
if err := ing.Start(context.Background()); err != nil {
log.Fatalf("failed to start ingester: %v", err)
}
ctl := controllers.NewIngesterController(dbConn, ing.Stats())
r := server.NewRouter(ctl)
s := &server.Server{}
if err := s.Run(r); err != nil {
log.Fatalf("server failed: %v", err)
}
}
func getEnv(key, defaultValue string) string {
if value := os.Getenv(key); value != "" {
return value
}
return defaultValue
}
func getEnvInt(key string, defaultValue int) int {
if value := os.Getenv(key); value != "" {
if intVal, err := strconv.Atoi(value); err == nil {
return intVal
}
}
return defaultValue
}