diff --git a/misc/loop/.dockerignore b/misc/loop/.dockerignore new file mode 100644 index 00000000000..a08c2cd0b3c --- /dev/null +++ b/misc/loop/.dockerignore @@ -0,0 +1,3 @@ +portalloopd +backups +traefik/letsencrypt diff --git a/misc/loop/.env.sample b/misc/loop/.env.sample new file mode 100644 index 00000000000..f94c05982e7 --- /dev/null +++ b/misc/loop/.env.sample @@ -0,0 +1,13 @@ +### DEVELOPMENT & PRODUCTION ### + +# faucet mnemonic +FAUCET_MNEMONIC= +# Value for --captcha-secret in gnofaucet command +CAPTCHA_SECRET_KEY= + +### PRODUCTION ONLY ### + +# autocounterd mnmenonic +COUNTER_MNEMONIC= +# API token for watchtower +WATCHTOWER_HTTP_API_TOKEN=mytoken diff --git a/misc/loop/.gitignore b/misc/loop/.gitignore index 641b553abe6..73546eba14b 100644 --- a/misc/loop/.gitignore +++ b/misc/loop/.gitignore @@ -1,3 +1,4 @@ /portalloopd /backups /traefik/letsencrypt +/.env diff --git a/misc/loop/cmd/cmd_backup.go b/misc/loop/cmd/cmd_backup.go index f95e1e15a4a..776f9a95a02 100644 --- a/misc/loop/cmd/cmd_backup.go +++ b/misc/loop/cmd/cmd_backup.go @@ -14,33 +14,20 @@ type backupCfg struct { traefikGnoFile string backupDir string hostPWD string + promAddr string } func (c *backupCfg) RegisterFlags(fs *flag.FlagSet) { - if os.Getenv("HOST_PWD") == "" { - os.Setenv("HOST_PWD", os.Getenv("PWD")) - } - - if os.Getenv("BACKUP_DIR") == "" { - os.Setenv("BACKUP_DIR", "./backups") - } - - if os.Getenv("RPC_URL") == "" { - os.Setenv("RPC_URL", "http://rpc.portal.gno.local:26657") - } - - if os.Getenv("PROM_ADDR") == "" { - os.Setenv("PROM_ADDR", ":9090") - } - - if os.Getenv("TRAEFIK_GNO_FILE") == "" { - os.Setenv("TRAEFIK_GNO_FILE", "./traefik/gno.yml") + wd, err := os.Getwd() + if err != nil { + panic(err) } - fs.StringVar(&c.rpcAddr, "rpc", os.Getenv("RPC_URL"), "tendermint rpc url") - fs.StringVar(&c.traefikGnoFile, "traefik-gno-file", os.Getenv("TRAEFIK_GNO_FILE"), "traefik gno file") - fs.StringVar(&c.backupDir, "backup-dir", os.Getenv("BACKUP_DIR"), "backup directory") - fs.StringVar(&c.hostPWD, "pwd", os.Getenv("HOST_PWD"), "host pwd (for docker usage)") + fs.StringVar(&c.rpcAddr, "rpc-url", "http://rpc.portal.gno.local:26657", "tendermint rpc url") + fs.StringVar(&c.traefikGnoFile, "traefik-gno-file", "./traefik/gno.yml", "traefik gno file") + fs.StringVar(&c.backupDir, "backup-dir", "./backups", "backup directory") + fs.StringVar(&c.hostPWD, "host-pwd", wd, "host pwd (for docker usage)") + fs.StringVar(&c.promAddr, "prom-addr", ":9090", "listening address for prometheus exporter") } func newBackupCmd(io commands.IO) *commands.Command { diff --git a/misc/loop/cmd/cmd_serve.go b/misc/loop/cmd/cmd_serve.go index cdcfcf30c73..7b896da6a41 100644 --- a/misc/loop/cmd/cmd_serve.go +++ b/misc/loop/cmd/cmd_serve.go @@ -18,6 +18,7 @@ type serveCfg struct { traefikGnoFile string backupDir string hostPWD string + promAddr string } type serveService struct { @@ -30,33 +31,19 @@ type serveService struct { } func (c *serveCfg) RegisterFlags(fs *flag.FlagSet) { - if os.Getenv("HOST_PWD") == "" { - os.Setenv("HOST_PWD", os.Getenv("PWD")) - } - - if os.Getenv("BACKUP_DIR") == "" { - os.Setenv("BACKUP_DIR", "./backups") - } - - if os.Getenv("RPC_URL") == "" { - os.Setenv("RPC_URL", "http://rpc.portal.gno.local:26657") - } - - if os.Getenv("PROM_ADDR") == "" { - os.Setenv("PROM_ADDR", ":9090") - } - - if os.Getenv("TRAEFIK_GNO_FILE") == "" { - os.Setenv("TRAEFIK_GNO_FILE", "./traefik/gno.yml") + wd, err := os.Getwd() + if err != nil { + panic(err) } - fs.StringVar(&c.rpcAddr, "rpc", os.Getenv("RPC_URL"), "tendermint rpc url") - fs.StringVar(&c.traefikGnoFile, "traefik-gno-file", os.Getenv("TRAEFIK_GNO_FILE"), "traefik gno file") - fs.StringVar(&c.backupDir, "backup-dir", os.Getenv("BACKUP_DIR"), "backup directory") - fs.StringVar(&c.hostPWD, "pwd", os.Getenv("HOST_PWD"), "host pwd (for docker usage)") + fs.StringVar(&c.rpcAddr, "rpc-url", "http://rpc.portal.gno.local:26657", "tendermint rpc url") + fs.StringVar(&c.traefikGnoFile, "traefik-gno-file", "./traefik/gno.yml", "traefik gno file") + fs.StringVar(&c.backupDir, "backup-dir", "./backups", "backup directory") + fs.StringVar(&c.hostPWD, "host-pwd", wd, "host pwd (for docker usage)") + fs.StringVar(&c.promAddr, "prom-addr", ":9090", "listening address for prometheus exporter") } -func newServeCmd(io commands.IO) *commands.Command { +func newServeCmd(commands.IO) *commands.Command { cfg := &serveCfg{} return commands.NewCommand( @@ -71,7 +58,7 @@ func newServeCmd(io commands.IO) *commands.Command { ) } -func execServe(ctx context.Context, cfg *serveCfg, args []string) error { +func execServe(ctx context.Context, cfg *serveCfg, _ []string) error { dockerClient, err := client.NewEnvClient() if err != nil { return err @@ -92,7 +79,7 @@ func execServe(ctx context.Context, cfg *serveCfg, args []string) error { go s.recordMetrics() http.Handle("/metrics", promhttp.Handler()) - http.ListenAndServe(os.Getenv("PROM_ADDR"), nil) + http.ListenAndServe(cfg.promAddr, nil) }() // the loop diff --git a/misc/loop/cmd/cmd_switch.go b/misc/loop/cmd/cmd_switch.go index 02f770cb61c..e7d1bdb35b7 100644 --- a/misc/loop/cmd/cmd_switch.go +++ b/misc/loop/cmd/cmd_switch.go @@ -14,36 +14,23 @@ type switchCfg struct { traefikGnoFile string backupDir string hostPWD string + promAddr string } func (c *switchCfg) RegisterFlags(fs *flag.FlagSet) { - if os.Getenv("HOST_PWD") == "" { - os.Setenv("HOST_PWD", os.Getenv("PWD")) - } - - if os.Getenv("BACKUP_DIR") == "" { - os.Setenv("BACKUP_DIR", "./backups") - } - - if os.Getenv("RPC_URL") == "" { - os.Setenv("RPC_URL", "http://rpc.portal.gno.local:26657") - } - - if os.Getenv("PROM_ADDR") == "" { - os.Setenv("PROM_ADDR", ":9090") - } - - if os.Getenv("TRAEFIK_GNO_FILE") == "" { - os.Setenv("TRAEFIK_GNO_FILE", "./traefik/gno.yml") + wd, err := os.Getwd() + if err != nil { + panic(err) } - fs.StringVar(&c.rpcAddr, "rpc", os.Getenv("RPC_URL"), "tendermint rpc url") - fs.StringVar(&c.traefikGnoFile, "traefik-gno-file", os.Getenv("TRAEFIK_GNO_FILE"), "traefik gno file") - fs.StringVar(&c.backupDir, "backup-dir", os.Getenv("BACKUP_DIR"), "backup directory") - fs.StringVar(&c.hostPWD, "pwd", os.Getenv("HOST_PWD"), "host pwd (for docker usage)") + fs.StringVar(&c.rpcAddr, "rpc-url", "http://rpc.portal.gno.local:26657", "tendermint rpc url") + fs.StringVar(&c.traefikGnoFile, "traefik-gno-file", "./traefik/gno.yml", "traefik gno file") + fs.StringVar(&c.backupDir, "backup-dir", "./backups", "backup directory") + fs.StringVar(&c.hostPWD, "host-pwd", wd, "host pwd (for docker usage)") + fs.StringVar(&c.promAddr, "prom-addr", ":9090", "listening address for prometheus exporter") } -func newSwitchCmd(io commands.IO) *commands.Command { +func newSwitchCmd(_ commands.IO) *commands.Command { cfg := &switchCfg{} return commands.NewCommand( diff --git a/misc/loop/cmd/main.go b/misc/loop/cmd/main.go index 83061d2a3f5..6643012d5c9 100644 --- a/misc/loop/cmd/main.go +++ b/misc/loop/cmd/main.go @@ -5,6 +5,7 @@ import ( "os" "github.com/gnolang/gno/tm2/pkg/commands" + "github.com/peterbourgon/ff/v3" ) type service struct { @@ -22,6 +23,9 @@ func main() { Name: "portalloopd", ShortUsage: " [flags] [...]", LongHelp: "Portalloop commands interactions", + Options: []ff.Option{ + ff.WithEnvVars(), + }, }, commands.NewEmptyConfig(), commands.HelpExec, diff --git a/misc/loop/cmd/portal-loop.go b/misc/loop/cmd/portal_loop.go similarity index 100% rename from misc/loop/cmd/portal-loop.go rename to misc/loop/cmd/portal_loop.go diff --git a/misc/loop/docker-compose.production.yml b/misc/loop/docker-compose.production.yml index 1c7cf146792..738057cbd2a 100644 --- a/misc/loop/docker-compose.production.yml +++ b/misc/loop/docker-compose.production.yml @@ -46,7 +46,6 @@ services: gnoweb: image: ghcr.io/gnolang/gno/gnoweb-slim restart: unless-stopped - env_file: ".env" entrypoint: - gnoweb - --bind=0.0.0.0:8888 @@ -79,10 +78,6 @@ services: - "--num-accounts=1" - "--remote=http://traefik:26657" - "--captcha-secret=${CAPTCHA_SECRET_KEY}" - env_file: ".env" - # environment: - # from .env - # - RECAPTCHA_SECRET_KEY labels: com.centurylinklabs.watchtower.enable: "true" traefik.enable: "true" @@ -95,8 +90,7 @@ services: traefik.http.middlewares.gnofaucet-ratelimit.ratelimit.period: "1m" portalloopd: - # image: ghcr.io/gnolang/gno/portalloopd - image: ghcr.io/albttx/gno/portalloopd + image: ghcr.io/gnolang/gno/portalloopd restart: unless-stopped volumes: - ./scripts:/scripts @@ -119,9 +113,8 @@ services: - "com.centurylinklabs.watchtower.enable=true" autocounterd: - image: ghcr.io/albttx/gno/autocounterd + image: ghcr.io/gnolang/gno/autocounterd restart: unless-stopped - env_file: ".env" command: - "start" - "--mnemonic=${COUNTER_MNEMONIC}" diff --git a/misc/loop/docker-compose.yml b/misc/loop/docker-compose.yml index 1475b6699fe..d99e8242fc4 100644 --- a/misc/loop/docker-compose.yml +++ b/misc/loop/docker-compose.yml @@ -59,12 +59,10 @@ services: - "--listen-address=0.0.0.0:5050" - "--chain-id=portal-loop" # - "--is-behind-proxy=true" - - "--mnemonic=${MNEMONIC}" + - "--mnemonic=${FAUCET_MNEMONIC}" # - "--num-accounts=1" - "--remote=http://traefik:26657" - environment: - # from .env - - RECAPTCHA_SECRET_KEY + - "--captcha-secret=${CAPTCHA_SECRET_KEY}" portalloopd: build: diff --git a/misc/loop/scripts/start.sh b/misc/loop/scripts/start.sh index d50b3175932..5233a82c8ad 100755 --- a/misc/loop/scripts/start.sh +++ b/misc/loop/scripts/start.sh @@ -1,4 +1,7 @@ #!/usr/bin/env sh +# This script is used by portalloopd to actually launch the gno.land node. +# It sets up the gno.land node's config with the given environment variables, +# and starts the node. MONIKER=${MONIKER:-"gnode"} P2P_LADDR=${P2P_LADDR:-"tcp://0.0.0.0:26656"} @@ -14,16 +17,13 @@ PERSISTENT_PEERS=${PERSISTENT_PEERS:-""} echo "" >> /opt/gno/src/gno.land/genesis/genesis_txs.jsonl cat ${GENESIS_BACKUP_FILE} >> /opt/gno/src/gno.land/genesis/genesis_txs.jsonl -gnoland start \ - --chainid="${CHAIN_ID}" \ - --skip-start=true \ - --skip-failing-genesis-txs +gnoland config init -config-path="./testdir/config/config.toml" -sed -i "s#^moniker = \".*\"#moniker = \"${MONIKER}\"#" ./testdir/config/config.toml -sed -i "s#laddr = \".*:26656\"#laddr = \"${P2P_LADDR}\"#" ./testdir/config/config.toml -sed -i "s#laddr = \".*:26657\"#laddr = \"${RPC_LADDR}\"#" ./testdir/config/config.toml +gnoland config set -config-path="./testdir/config/config.toml" moniker "${MONIKER}" +gnoland config set -config-path="./testdir/config/config.toml" p2p.laddr "${P2P_LADDR}" +gnoland config set -config-path="./testdir/config/config.toml" rpc.laddr "${RPC_LADDR}" -sed -i "s#seeds = \".*\"#seeds = \"${SEEDS}\"#" ./testdir/config/config.toml -sed -i "s#persistent_peers = \".*\"#persistent_peers = \"${PERSISTENT_PEERS}\"#" ./testdir/config/config.toml +gnoland config set -config-path="./testdir/config/config.toml" p2p.seeds "${SEEDS}" +gnoland config set -config-path="./testdir/config/config.toml" p2p.persistent_peers "${PERSISTENT_PEERS}" -exec gnoland start --skip-failing-genesis-txs +exec gnoland start --skip-failing-genesis-txs --chainid="${CHAIN_ID}"