From 5ed7ab3d485d6817df1b9f5ca6e58797734163b4 Mon Sep 17 00:00:00 2001 From: Leigh <351529+leighmcculloch@users.noreply.github.com> Date: Tue, 6 Jan 2026 17:12:20 +1000 Subject: [PATCH 01/30] add galexie service to quickstart --- Dockerfile | 21 +++++++ common/galexie/bin/start | 7 +++ images.json | 25 +++++++++ local/galexie/etc/galexie.toml | 21 +++++++ local/nginx/etc/conf.d/meta-archive.conf | 5 ++ .../etc/supervisord.conf.d/galexie.conf | 9 +++ .../etc/supervisord.conf.d/meta-archive.conf | 9 +++ start | 55 +++++++++++++++++++ 8 files changed, 152 insertions(+) create mode 100644 common/galexie/bin/start create mode 100644 local/galexie/etc/galexie.toml create mode 100644 local/nginx/etc/conf.d/meta-archive.conf create mode 100644 local/supervisor/etc/supervisord.conf.d/galexie.conf create mode 100644 local/supervisor/etc/supervisord.conf.d/meta-archive.conf diff --git a/Dockerfile b/Dockerfile index 6dbc50647..6469aa1cc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,6 +18,7 @@ ARG HORIZON_IMAGE=stellar-horizon-stage ARG FRIENDBOT_IMAGE=stellar-friendbot-stage ARG RPC_IMAGE=stellar-rpc-stage ARG LAB_IMAGE=stellar-lab-stage +ARG GALEXIE_IMAGE=stellar-galexie-stage # xdr @@ -183,6 +184,24 @@ COPY --from=stellar-lab-builder /lab/public /lab/public COPY --from=stellar-lab-builder /lab/build/static /lab/public/_next/static COPY --from=stellar-lab-builder /usr/local/bin/node /node +# galexie + +FROM golang:1.24-trixie AS stellar-galexie-builder + +ARG GALEXIE_REPO +ARG GALEXIE_REF + +WORKDIR /src +RUN git clone https://github.com/${GALEXIE_REPO} /src +RUN git fetch origin ${GALEXIE_REF} +RUN git checkout ${GALEXIE_REF} +ENV CGO_ENABLED=0 +RUN go build -o /galexie . + +FROM scratch AS stellar-galexie-stage + +COPY --from=stellar-galexie-builder /galexie /galexie + # quickstart FROM $XDR_IMAGE AS xdr @@ -191,6 +210,7 @@ FROM $HORIZON_IMAGE AS horizon FROM $FRIENDBOT_IMAGE AS friendbot FROM $RPC_IMAGE AS rpc FROM $LAB_IMAGE AS lab +FROM $GALEXIE_IMAGE AS galexie FROM ubuntu:24.04 AS quickstart @@ -216,6 +236,7 @@ COPY --from=friendbot /friendbot /usr/local/bin/friendbot COPY --from=rpc /stellar-rpc /usr/bin/stellar-rpc COPY --from=lab /lab /opt/stellar/lab COPY --from=lab /node /usr/bin/ +COPY --from=galexie /galexie /usr/bin/galexie RUN adduser --system --group --quiet --home /var/lib/stellar --disabled-password --shell /bin/bash stellar; diff --git a/common/galexie/bin/start b/common/galexie/bin/start new file mode 100644 index 000000000..29c2830f8 --- /dev/null +++ b/common/galexie/bin/start @@ -0,0 +1,7 @@ +#! /bin/bash + +set -e +set -o pipefail + +echo "starting galexie..." +exec /usr/bin/galexie append --start 2 --config-file /opt/stellar/galexie/etc/galexie.toml diff --git a/images.json b/images.json index 958f2658d..f442ab62a 100644 --- a/images.json +++ b/images.json @@ -47,6 +47,11 @@ "name": "lab", "repo": "stellar/laboratory", "ref": "main" + }, + { + "name": "galexie", + "repo": "stellar/stellar-galexie", + "ref": "add-filesystem-datastore-support" } ], "tests": { @@ -108,6 +113,11 @@ "name": "lab", "repo": "stellar/laboratory", "ref": "main" + }, + { + "name": "galexie", + "repo": "stellar/stellar-galexie", + "ref": "add-filesystem-datastore-support" } ], "tests": { @@ -175,6 +185,11 @@ "name": "lab", "repo": "stellar/laboratory", "ref": "21cc0d0b9080e664b9dbfae5713d9c7615613729" + }, + { + "name": "galexie", + "repo": "stellar/stellar-galexie", + "ref": "add-filesystem-datastore-support" } ], "tests": { @@ -230,6 +245,11 @@ "name": "lab", "repo": "stellar/laboratory", "ref": "main" + }, + { + "name": "galexie", + "repo": "stellar/stellar-galexie", + "ref": "main" } ], "tests": { @@ -286,6 +306,11 @@ "name": "lab", "repo": "stellar/laboratory", "ref": "main" + }, + { + "name": "galexie", + "repo": "stellar/stellar-galexie", + "ref": "main" } ], "tests": { diff --git a/local/galexie/etc/galexie.toml b/local/galexie/etc/galexie.toml new file mode 100644 index 000000000..a3bb435d3 --- /dev/null +++ b/local/galexie/etc/galexie.toml @@ -0,0 +1,21 @@ +# Galexie Configuration for Local Network + +# Admin port configuration +admin_port = 6062 + +# Datastore Configuration +[datastore_config] +type = "Filesystem" + +[datastore_config.params] +destination_path = "/tmp/stellar-core/meta-archive" + +[datastore_config.schema] +ledgers_per_file = 1 +files_per_partition = 64000 + +# Stellar-core Configuration +[stellar_core_config] +network_passphrase = "__NETWORK__" +history_archive_urls = ["http://localhost:1570"] +stellar_core_binary_path = "/usr/bin/stellar-core" diff --git a/local/nginx/etc/conf.d/meta-archive.conf b/local/nginx/etc/conf.d/meta-archive.conf new file mode 100644 index 000000000..b7a607257 --- /dev/null +++ b/local/nginx/etc/conf.d/meta-archive.conf @@ -0,0 +1,5 @@ +location /meta-archive { + rewrite /meta-archive/(.*) /$1 break; + proxy_pass http://127.0.0.1:1571; + proxy_redirect off; +} diff --git a/local/supervisor/etc/supervisord.conf.d/galexie.conf b/local/supervisor/etc/supervisord.conf.d/galexie.conf new file mode 100644 index 000000000..754af8651 --- /dev/null +++ b/local/supervisor/etc/supervisord.conf.d/galexie.conf @@ -0,0 +1,9 @@ +[program:galexie] +user=stellar +directory=/opt/stellar/galexie +command=/opt/stellar/galexie/bin/start +autostart=false +startretries=50 +autorestart=true +priority=70 +redirect_stderr=true diff --git a/local/supervisor/etc/supervisord.conf.d/meta-archive.conf b/local/supervisor/etc/supervisord.conf.d/meta-archive.conf new file mode 100644 index 000000000..c0b72a4f1 --- /dev/null +++ b/local/supervisor/etc/supervisord.conf.d/meta-archive.conf @@ -0,0 +1,9 @@ +[program:meta-archive] +user=stellar +directory=/tmp/stellar-core/meta-archive +command=/usr/bin/python3 -m http.server 1571 +autostart=true +autorestart=true +startretries=100 +priority=10 +redirect_stderr=true diff --git a/start b/start index 4bcee2a0d..f0c918f32 100755 --- a/start +++ b/start @@ -16,6 +16,7 @@ export FBHOME="$STELLAR_HOME/friendbot" export LABHOME="$STELLAR_HOME/lab" export NXHOME="$STELLAR_HOME/nginx" export STELLAR_RPC_HOME="$STELLAR_HOME/stellar-rpc" +export GALEXIEHOME="$STELLAR_HOME/galexie" export CORELOG="/var/log/stellar-core" @@ -32,6 +33,7 @@ export PROTOCOL_VERSION_DEFAULT="$(< /image.json jq -r '.config.protocol_version : "${ENABLE_CORE:=false}" : "${ENABLE_HORIZON:=false}" : "${ENABLE_LAB:=false}" +: "${ENABLE_GALEXIE:=false}" # TODO: Remove once the Soroban RPC name is fully deprecated : "${ENABLE_SOROBAN_RPC:=false}" : "${ENABLE_RPC:=$ENABLE_SOROBAN_RPC}" @@ -61,6 +63,10 @@ function validate_before_start() { echo "--randomize-network-passphrase is only supported in the local network" >&2 exit 1 fi + if [ "$NETWORK" != "local" ] && [ "$ENABLE_GALEXIE" = "true" ]; then + echo "--enable galexie is only supported in the local network" >&2 + exit 1 + fi if [ "$NETWORK" = "local" ] && [ "$DISABLE_SOROBAN_DIAGNOSTIC_EVENTS" = "false" ]; then ENABLE_SOROBAN_DIAGNOSTIC_EVENTS=true fi @@ -94,6 +100,8 @@ function start() { echo " $(< /image.json jq -r '.deps[] | select(.name == "friendbot") | "\(.ref) (\(.sha))"')" echo " lab:" echo " $(< /image.json jq -r '.deps[] | select(.name == "lab") | "\(.ref) (\(.sha))"')" + echo " galexie:" + echo "$(galexie version | sed 's/^/ /')" echo "mode: $STELLAR_MODE" echo "network: $NETWORK" @@ -112,6 +120,7 @@ function start() { init_horizon copy_pgpass init_stellar_rpc + init_galexie stop_postgres # this gets started in init_db @@ -219,6 +228,10 @@ function process_args() { ENABLE_LAB=true fi + if [[ ",$ENABLE," = *",galexie,"* ]]; then + ENABLE_GALEXIE=true + fi + case "$NETWORK" in testnet) export NETWORK_PASSPHRASE="Test SDF Network ; September 2015" @@ -389,6 +402,19 @@ function copy_defaults() { $CP /opt/stellar-default/$NETWORK/nginx/ $NXHOME fi fi + + if [ -d $GALEXIEHOME/etc ]; then + echo "galexie: config directory exists, skipping copy" + else + $CP /opt/stellar-default/common/galexie/ $GALEXIEHOME + if [ -d /opt/stellar-default/$NETWORK/galexie/ ]; then + $CP /opt/stellar-default/$NETWORK/galexie/ $GALEXIEHOME + fi + if [ "$ENABLE_GALEXIE" = "true" ]; then + cp /opt/stellar-default/$NETWORK/supervisor/etc/supervisord.conf.d/galexie.conf $SUPHOME/etc/supervisord.conf.d 2>/dev/null || true + cp /opt/stellar-default/$NETWORK/supervisor/etc/supervisord.conf.d/meta-archive.conf $SUPHOME/etc/supervisord.conf.d 2>/dev/null || true + fi + fi } function copy_pgpass() { @@ -574,6 +600,31 @@ function init_stellar_rpc() { popd } +function init_galexie() { + if [ "$ENABLE_GALEXIE" != "true" ]; then + return 0 + fi + + if [ -f $GALEXIEHOME/.quickstart-initialized ]; then + echo "galexie: already initialized" + return 0 + fi + + pushd $GALEXIEHOME + + # Create meta archive directory + mkdir -p /tmp/stellar-core/meta-archive + + # Configure galexie + perl -pi -e "s/__NETWORK__/$NETWORK_PASSPHRASE/g" etc/galexie.toml + + run_silent "init-galexie" chown -R stellar:stellar . + run_silent "init-galexie-meta-archive" chown -R stellar:stellar /tmp/stellar-core/meta-archive + + touch .quickstart-initialized + popd +} + function kill_supervisor() { kill -3 $(cat "/var/run/supervisord.pid") } @@ -704,6 +755,10 @@ function start_optional_services() { if [ "$ENABLE_LAB" == "true" ]; then supervisorctl start stellar-lab fi + + if [ "$ENABLE_GALEXIE" == "true" ]; then + supervisorctl start galexie + fi } function exec_supervisor() { From f0bee439af693e26dfa7639eeb8bbac4c9d300fe Mon Sep 17 00:00:00 2001 From: Leigh <351529+leighmcculloch@users.noreply.github.com> Date: Tue, 6 Jan 2026 17:48:45 +1000 Subject: [PATCH 02/30] add galexie integration test and configuration --- .github/workflows/internal-test.yml | 7 ++ images.json | 10 ++ tests/test_galexie.go | 172 ++++++++++++++++++++++++++++ 3 files changed, 189 insertions(+) create mode 100644 tests/test_galexie.go diff --git a/.github/workflows/internal-test.yml b/.github/workflows/internal-test.yml index 90f61ee2f..6eb095c9e 100644 --- a/.github/workflows/internal-test.yml +++ b/.github/workflows/internal-test.yml @@ -172,6 +172,13 @@ jobs: docker logs stellar -f & echo "supervisorctl tail -f stellar-rpc" | docker exec -i stellar sh & go run tests/test_stellar_rpc_healthy.go + - name: Run galexie test + if: ${{ contains(matrix.enable, 'galexie') }} + timeout-minutes: ${{ fromJSON(steps.timeout.outputs.minutes) }} + run: | + docker logs stellar -f & + echo "supervisorctl tail -f galexie" | docker exec -i stellar sh & + go run tests/test_galexie.go - name: Prepare Test Logs if: always() run: | diff --git a/images.json b/images.json index f442ab62a..94ae9e875 100644 --- a/images.json +++ b/images.json @@ -61,6 +61,11 @@ "arch": "amd64", "network": "pubnet", "enable": "core,rpc,horizon" + }, + { + "arch": "amd64", + "network": "local", + "enable": "core,galexie" } ] } @@ -132,6 +137,11 @@ "arch": "amd64", "network": "pubnet", "enable": "core,rpc,horizon" + }, + { + "arch": "amd64", + "network": "local", + "enable": "core,galexie" } ] } diff --git a/tests/test_galexie.go b/tests/test_galexie.go new file mode 100644 index 000000000..2c641f082 --- /dev/null +++ b/tests/test_galexie.go @@ -0,0 +1,172 @@ +package main + +import ( + "encoding/json" + "fmt" + "io" + "log" + "net/http" + "os" + "strings" + "time" +) + +const metaArchiveURL = "http://localhost:8000/meta-archive" + +// ConfigFile represents the SEP-54 .config.json structure +type ConfigFile struct { + NetworkPassphrase string `json:"network_passphrase"` + Version string `json:"version"` + Compression string `json:"compression"` + LedgersPerBatch int `json:"ledgers_per_file"` + BatchesPerPartition int `json:"files_per_partition"` +} + +func main() { + // Wait for galexie to export some ledgers + // With ledgers_per_file=1 and files_per_partition=64000, ledger 2 would be at: + // FFFFFFFF--0-63999/FFFFFFFD--2.xdr.zstd + // The partition directory format is: %08X--%d-%d (MaxUint32-partitionStart, partitionStart, partitionEnd) + // The file format is: %08X--%d.xdr.zstd (MaxUint32-fileStart, fileStart) + + partitionDir := "FFFFFFFF--0-63999" + ledgerFile := "FFFFFFFD--2.xdr.zstd" + metadataFile := "FFFFFFFD--2.json" + + // Test 1: Download and verify the SEP-54 .config.json file exists at the root + configURL := fmt.Sprintf("%s/.config.json", metaArchiveURL) + logLine("Waiting for SEP-54 .config.json file...") + waitForConfigFile(configURL) + logLine(fmt.Sprintf("Config file downloaded successfully! URL: %s", configURL)) + + // Test 2: Wait for and verify the partition directory exists + logLine("Waiting for meta archive partition directory...") + waitForURL(fmt.Sprintf("%s/%s/", metaArchiveURL, partitionDir)) + logLine("Partition directory exists!") + + // Test 3: Download and verify a ledger file exists + ledgerURL := fmt.Sprintf("%s/%s/%s", metaArchiveURL, partitionDir, ledgerFile) + logLine(fmt.Sprintf("Waiting for ledger file: %s", ledgerFile)) + waitForFile(ledgerURL) + logLine(fmt.Sprintf("Ledger file downloaded successfully! URL: %s", ledgerURL)) + + // Test 4: Download and verify a metadata sidecar file exists + metadataURL := fmt.Sprintf("%s/%s/%s", metaArchiveURL, partitionDir, metadataFile) + logLine(fmt.Sprintf("Waiting for metadata file: %s", metadataFile)) + waitForFile(metadataURL) + logLine(fmt.Sprintf("Metadata file downloaded successfully! URL: %s", metadataURL)) + + logLine("All galexie meta archive tests passed!") + os.Exit(0) +} + +func waitForConfigFile(url string) { + for { + time.Sleep(5 * time.Second) + resp, err := http.Get(url) + if err != nil { + logLine(fmt.Sprintf("Waiting for config... error: %v", err)) + continue + } + + if resp.StatusCode == http.StatusOK { + body, err := io.ReadAll(resp.Body) + resp.Body.Close() + if err != nil { + logLine(fmt.Sprintf("Waiting for config... read error: %v", err)) + continue + } + + var config ConfigFile + if err := json.Unmarshal(body, &config); err != nil { + logLine(fmt.Sprintf("Waiting for config... JSON parse error: %v", err)) + continue + } + + // Validate required fields are present + if config.NetworkPassphrase == "" { + logLine("Waiting for config... missing network_passphrase") + continue + } + if config.Compression == "" { + logLine("Waiting for config... missing compression") + continue + } + + logLine(fmt.Sprintf("Config file contents: network_passphrase=%s, compression=%s, ledgers_per_file=%d, files_per_partition=%d", + config.NetworkPassphrase, config.Compression, config.LedgersPerBatch, config.BatchesPerPartition)) + return + } + resp.Body.Close() + logLine(fmt.Sprintf("Waiting for config... status: %d", resp.StatusCode)) + } +} + +func waitForURL(url string) { + for { + time.Sleep(5 * time.Second) + resp, err := http.Get(url) + if err != nil { + logLine(fmt.Sprintf("Waiting... error: %v", err)) + continue + } + resp.Body.Close() + + if resp.StatusCode == http.StatusOK { + return + } + logLine(fmt.Sprintf("Waiting... status: %d", resp.StatusCode)) + } +} + +func waitForFile(url string) { + for { + time.Sleep(5 * time.Second) + resp, err := http.Get(url) + if err != nil { + logLine(fmt.Sprintf("Waiting... error: %v", err)) + continue + } + + if resp.StatusCode == http.StatusOK { + // Read and verify we got actual content + body, err := io.ReadAll(resp.Body) + resp.Body.Close() + if err != nil { + logLine(fmt.Sprintf("Waiting... read error: %v", err)) + continue + } + + if len(body) == 0 { + logLine("Waiting... empty file") + continue + } + + // For .json files, verify it looks like JSON + if strings.HasSuffix(url, ".json") { + content := string(body) + if !strings.HasPrefix(strings.TrimSpace(content), "{") { + logLine(fmt.Sprintf("Waiting... not valid JSON: %s", content[:min(50, len(content))])) + continue + } + logLine(fmt.Sprintf("Metadata content preview: %s...", content[:min(100, len(content))])) + } else { + logLine(fmt.Sprintf("File size: %d bytes", len(body))) + } + return + } + resp.Body.Close() + logLine(fmt.Sprintf("Waiting... status: %d", resp.StatusCode)) + } +} + +func min(a, b int) int { + if a < b { + return a + } + return b +} + +func logLine(text interface{}) { + log.Println("\033[32;1m[test]\033[0m", text) +} From c5514e962bb2a03ba7d579d2751f5c30f254b92f Mon Sep 17 00:00:00 2001 From: Leigh <351529+leighmcculloch@users.noreply.github.com> Date: Tue, 6 Jan 2026 17:53:54 +1000 Subject: [PATCH 03/30] Add galexie image download step to build workflow --- .github/workflows/internal-build.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/internal-build.yml b/.github/workflows/internal-build.yml index 8bac9c10a..fff37da1c 100644 --- a/.github/workflows/internal-build.yml +++ b/.github/workflows/internal-build.yml @@ -284,6 +284,12 @@ jobs: pattern: image-lab-${{ steps.ids.outputs.lab }}-${{ matrix.arch }}.* merge-multiple: true path: /tmp/images + - name: Download Image Galexie + uses: actions/download-artifact@v4 + with: + pattern: image-galexie-${{ steps.ids.outputs.galexie }}-${{ matrix.arch }}.* + merge-multiple: true + path: /tmp/images - name: Load Image into Docker run: | ls -lah /tmp/images/ From 2ecd82f1f471575b2136e3859bf24d540ccf0a30 Mon Sep 17 00:00:00 2001 From: Leigh <351529+leighmcculloch@users.noreply.github.com> Date: Tue, 6 Jan 2026 18:39:53 +1000 Subject: [PATCH 04/30] Fix execute permissions on galexie start script --- common/galexie/bin/start | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 common/galexie/bin/start diff --git a/common/galexie/bin/start b/common/galexie/bin/start old mode 100644 new mode 100755 From 4367454daf40f276cec2fdc93fee9e05e772acc0 Mon Sep 17 00:00:00 2001 From: Leigh <351529+leighmcculloch@users.noreply.github.com> Date: Tue, 6 Jan 2026 19:44:47 +1000 Subject: [PATCH 05/30] Add captive-core config for galexie --- local/galexie/etc/galexie.toml | 1 + local/galexie/etc/stellar-captive-core.cfg | 19 +++++++++++++++++++ start | 1 + 3 files changed, 21 insertions(+) create mode 100644 local/galexie/etc/stellar-captive-core.cfg diff --git a/local/galexie/etc/galexie.toml b/local/galexie/etc/galexie.toml index a3bb435d3..2c43bd6f8 100644 --- a/local/galexie/etc/galexie.toml +++ b/local/galexie/etc/galexie.toml @@ -19,3 +19,4 @@ files_per_partition = 64000 network_passphrase = "__NETWORK__" history_archive_urls = ["http://localhost:1570"] stellar_core_binary_path = "/usr/bin/stellar-core" +captive_core_toml_path = "/opt/stellar/galexie/etc/stellar-captive-core.cfg" diff --git a/local/galexie/etc/stellar-captive-core.cfg b/local/galexie/etc/stellar-captive-core.cfg new file mode 100644 index 000000000..d2621915c --- /dev/null +++ b/local/galexie/etc/stellar-captive-core.cfg @@ -0,0 +1,19 @@ +# Captive core configuration for galexie on local network +NETWORK_PASSPHRASE="__NETWORK__" +HTTP_PORT=11926 +PUBLIC_HTTP_PORT=false +PEER_PORT=11925 +DATABASE="sqlite3:///tmp/stellar-core/galexie-captive-core.db" +ARTIFICIALLY_ACCELERATE_TIME_FOR_TESTING=true + +UNSAFE_QUORUM=true +FAILURE_SAFETY=0 + +[[VALIDATORS]] +NAME="local_core" +HOME_DOMAIN="core.local" +# From "SDQVDISRYN2JXBS7ICL7QJAEKB3HWBJFP2QECXG7GZICAHBK4UNJCWK2" +PUBLIC_KEY="GCTI6HMWRH2QGMFKWVU5M5ZSOTKL7P7JAHZDMJJBKDHGWTEC4CJ7O3DU" +ADDRESS="localhost:11625" +QUALITY="MEDIUM" +HISTORY="curl -sf http://localhost:1570/{0} -o {1}" diff --git a/start b/start index f0c918f32..b632db157 100755 --- a/start +++ b/start @@ -617,6 +617,7 @@ function init_galexie() { # Configure galexie perl -pi -e "s/__NETWORK__/$NETWORK_PASSPHRASE/g" etc/galexie.toml + perl -pi -e "s/__NETWORK__/$NETWORK_PASSPHRASE/g" etc/stellar-captive-core.cfg run_silent "init-galexie" chown -R stellar:stellar . run_silent "init-galexie-meta-archive" chown -R stellar:stellar /tmp/stellar-core/meta-archive From 5591db345913e2b7cfe16067a8722844d9988d09 Mon Sep 17 00:00:00 2001 From: Leigh <351529+leighmcculloch@users.noreply.github.com> Date: Tue, 6 Jan 2026 19:52:50 +1000 Subject: [PATCH 06/30] Add debug output for config response in galexie test --- tests/test_galexie.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/test_galexie.go b/tests/test_galexie.go index 2c641f082..0d8134ca4 100644 --- a/tests/test_galexie.go +++ b/tests/test_galexie.go @@ -77,6 +77,8 @@ func waitForConfigFile(url string) { continue } + logLine(fmt.Sprintf("Waiting for config... raw response: %s", string(body))) + var config ConfigFile if err := json.Unmarshal(body, &config); err != nil { logLine(fmt.Sprintf("Waiting for config... JSON parse error: %v", err)) From 8aea0e9212e5d430029b7f9260808444b2622f7e Mon Sep 17 00:00:00 2001 From: Leigh <351529+leighmcculloch@users.noreply.github.com> Date: Tue, 6 Jan 2026 21:23:43 +1000 Subject: [PATCH 07/30] Fix JSON field names in ConfigFile struct to match actual response --- tests/test_galexie.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_galexie.go b/tests/test_galexie.go index 0d8134ca4..095935454 100644 --- a/tests/test_galexie.go +++ b/tests/test_galexie.go @@ -15,11 +15,11 @@ const metaArchiveURL = "http://localhost:8000/meta-archive" // ConfigFile represents the SEP-54 .config.json structure type ConfigFile struct { - NetworkPassphrase string `json:"network_passphrase"` + NetworkPassphrase string `json:"networkPassphrase"` Version string `json:"version"` Compression string `json:"compression"` - LedgersPerBatch int `json:"ledgers_per_file"` - BatchesPerPartition int `json:"files_per_partition"` + LedgersPerBatch int `json:"ledgersPerBatch"` + BatchesPerPartition int `json:"batchesPerPartition"` } func main() { From ecfaa32e40e33b4a9a74cde16d4b7f29996ea682 Mon Sep 17 00:00:00 2001 From: Leigh <351529+leighmcculloch@users.noreply.github.com> Date: Tue, 6 Jan 2026 21:36:53 +1000 Subject: [PATCH 08/30] Add more debug output to galexie test to diagnose file issues --- tests/test_galexie.go | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/tests/test_galexie.go b/tests/test_galexie.go index 095935454..244cb32fa 100644 --- a/tests/test_galexie.go +++ b/tests/test_galexie.go @@ -107,9 +107,18 @@ func waitForConfigFile(url string) { func waitForURL(url string) { for { time.Sleep(5 * time.Second) + + // Try to list the root directory to see what's there + listResp, listErr := http.Get(metaArchiveURL + "/") + if listErr == nil { + body, _ := io.ReadAll(listResp.Body) + listResp.Body.Close() + logLine(fmt.Sprintf("Meta archive root listing: %s", string(body)[:min(500, len(body))])) + } + resp, err := http.Get(url) if err != nil { - logLine(fmt.Sprintf("Waiting... error: %v", err)) + logLine(fmt.Sprintf("Waiting for %s... error: %v", url, err)) continue } resp.Body.Close() @@ -117,7 +126,7 @@ func waitForURL(url string) { if resp.StatusCode == http.StatusOK { return } - logLine(fmt.Sprintf("Waiting... status: %d", resp.StatusCode)) + logLine(fmt.Sprintf("Waiting for %s... status: %d", url, resp.StatusCode)) } } @@ -126,7 +135,7 @@ func waitForFile(url string) { time.Sleep(5 * time.Second) resp, err := http.Get(url) if err != nil { - logLine(fmt.Sprintf("Waiting... error: %v", err)) + logLine(fmt.Sprintf("Waiting for %s... error: %v", url, err)) continue } @@ -158,7 +167,7 @@ func waitForFile(url string) { return } resp.Body.Close() - logLine(fmt.Sprintf("Waiting... status: %d", resp.StatusCode)) + logLine(fmt.Sprintf("Waiting for %s... status: %d", url, resp.StatusCode)) } } From 7f24e640bfdcf9c6e75e88e51bcf05773de6e4af Mon Sep 17 00:00:00 2001 From: Leigh <351529+leighmcculloch@users.noreply.github.com> Date: Tue, 6 Jan 2026 21:42:58 +1000 Subject: [PATCH 09/30] Add partition directory listing to debug galexie test --- tests/test_galexie.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/test_galexie.go b/tests/test_galexie.go index 244cb32fa..5cd2e6c13 100644 --- a/tests/test_galexie.go +++ b/tests/test_galexie.go @@ -44,6 +44,10 @@ func main() { waitForURL(fmt.Sprintf("%s/%s/", metaArchiveURL, partitionDir)) logLine("Partition directory exists!") + // List partition directory contents + partitionURL := fmt.Sprintf("%s/%s/", metaArchiveURL, partitionDir) + listPartition(partitionURL) + // Test 3: Download and verify a ledger file exists ledgerURL := fmt.Sprintf("%s/%s/%s", metaArchiveURL, partitionDir, ledgerFile) logLine(fmt.Sprintf("Waiting for ledger file: %s", ledgerFile)) @@ -171,6 +175,21 @@ func waitForFile(url string) { } } +func listPartition(url string) { + resp, err := http.Get(url) + if err != nil { + logLine(fmt.Sprintf("Error listing partition: %v", err)) + return + } + defer resp.Body.Close() + body, err := io.ReadAll(resp.Body) + if err != nil { + logLine(fmt.Sprintf("Error reading partition listing: %v", err)) + return + } + logLine(fmt.Sprintf("Partition directory listing: %s", string(body))) +} + func min(a, b int) int { if a < b { return a From 74813134f28497141731629453488c3aae0054c0 Mon Sep 17 00:00:00 2001 From: Leigh <351529+leighmcculloch@users.noreply.github.com> Date: Tue, 6 Jan 2026 21:45:31 +1000 Subject: [PATCH 10/30] Update galexie test to find any ledger file dynamically --- tests/test_galexie.go | 57 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 49 insertions(+), 8 deletions(-) diff --git a/tests/test_galexie.go b/tests/test_galexie.go index 5cd2e6c13..bd770be84 100644 --- a/tests/test_galexie.go +++ b/tests/test_galexie.go @@ -7,6 +7,7 @@ import ( "log" "net/http" "os" + "regexp" "strings" "time" ) @@ -44,19 +45,27 @@ func main() { waitForURL(fmt.Sprintf("%s/%s/", metaArchiveURL, partitionDir)) logLine("Partition directory exists!") - // List partition directory contents + // List partition directory contents and find a ledger file partitionURL := fmt.Sprintf("%s/%s/", metaArchiveURL, partitionDir) - listPartition(partitionURL) - // Test 3: Download and verify a ledger file exists - ledgerURL := fmt.Sprintf("%s/%s/%s", metaArchiveURL, partitionDir, ledgerFile) - logLine(fmt.Sprintf("Waiting for ledger file: %s", ledgerFile)) + // Test 3: Wait for any ledger file to appear and download it + logLine(fmt.Sprintf("Waiting for any ledger file in partition (expected: %s)...", ledgerFile)) + foundLedgerFile := waitForAnyLedgerFile(partitionURL) + if foundLedgerFile == "" { + logLine("ERROR: No ledger file found!") + os.Exit(1) + } + logLine(fmt.Sprintf("Found ledger file: %s", foundLedgerFile)) + + ledgerURL := fmt.Sprintf("%s/%s/%s", metaArchiveURL, partitionDir, foundLedgerFile) + logLine(fmt.Sprintf("Downloading ledger file: %s", ledgerURL)) waitForFile(ledgerURL) logLine(fmt.Sprintf("Ledger file downloaded successfully! URL: %s", ledgerURL)) - // Test 4: Download and verify a metadata sidecar file exists - metadataURL := fmt.Sprintf("%s/%s/%s", metaArchiveURL, partitionDir, metadataFile) - logLine(fmt.Sprintf("Waiting for metadata file: %s", metadataFile)) + // Test 4: Download and verify the corresponding metadata sidecar file exists + foundMetadataFile := strings.Replace(foundLedgerFile, ".xdr.zstd", ".json", 1) + metadataURL := fmt.Sprintf("%s/%s/%s", metaArchiveURL, partitionDir, foundMetadataFile) + logLine(fmt.Sprintf("Waiting for metadata file: %s", foundMetadataFile)) waitForFile(metadataURL) logLine(fmt.Sprintf("Metadata file downloaded successfully! URL: %s", metadataURL)) @@ -190,6 +199,38 @@ func listPartition(url string) { logLine(fmt.Sprintf("Partition directory listing: %s", string(body))) } +func waitForAnyLedgerFile(partitionURL string) string { + // Pattern to match ledger files like "FFFFFFFD--2.xdr.zstd" + ledgerFilePattern := regexp.MustCompile(`[0-9A-Fa-f]{8}--\d+\.xdr\.zstd`) + + for { + time.Sleep(5 * time.Second) + resp, err := http.Get(partitionURL) + if err != nil { + logLine(fmt.Sprintf("Waiting for ledger files... error: %v", err)) + continue + } + + body, err := io.ReadAll(resp.Body) + resp.Body.Close() + if err != nil { + logLine(fmt.Sprintf("Waiting for ledger files... read error: %v", err)) + continue + } + + content := string(body) + logLine(fmt.Sprintf("Partition listing: %s", content[:min(500, len(content))])) + + // Find any ledger file in the listing + match := ledgerFilePattern.FindString(content) + if match != "" { + return match + } + + logLine("Waiting for ledger files... no .xdr.zstd files found yet") + } +} + func min(a, b int) int { if a < b { return a From 4e9aea85d45aa2f2dc2fd0c776cf2b8a1eb16a3b Mon Sep 17 00:00:00 2001 From: Leigh <351529+leighmcculloch@users.noreply.github.com> Date: Tue, 6 Jan 2026 21:52:03 +1000 Subject: [PATCH 11/30] Remove unused metadataFile variable --- tests/test_galexie.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/test_galexie.go b/tests/test_galexie.go index bd770be84..c6d29c880 100644 --- a/tests/test_galexie.go +++ b/tests/test_galexie.go @@ -31,8 +31,7 @@ func main() { // The file format is: %08X--%d.xdr.zstd (MaxUint32-fileStart, fileStart) partitionDir := "FFFFFFFF--0-63999" - ledgerFile := "FFFFFFFD--2.xdr.zstd" - metadataFile := "FFFFFFFD--2.json" + ledgerFile := "FFFFFFFD--2.xdr.zstd" // Expected file for ledger 2 // Test 1: Download and verify the SEP-54 .config.json file exists at the root configURL := fmt.Sprintf("%s/.config.json", metaArchiveURL) From cc97eb522110cd705516ff3fef8f69384d577097 Mon Sep 17 00:00:00 2001 From: Leigh <351529+leighmcculloch@users.noreply.github.com> Date: Tue, 6 Jan 2026 22:06:06 +1000 Subject: [PATCH 12/30] Fix galexie test file extension from .zstd to .zst --- tests/test_galexie.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/test_galexie.go b/tests/test_galexie.go index c6d29c880..fc68e7019 100644 --- a/tests/test_galexie.go +++ b/tests/test_galexie.go @@ -26,12 +26,12 @@ type ConfigFile struct { func main() { // Wait for galexie to export some ledgers // With ledgers_per_file=1 and files_per_partition=64000, ledger 2 would be at: - // FFFFFFFF--0-63999/FFFFFFFD--2.xdr.zstd + // FFFFFFFF--0-63999/FFFFFFFD--2.xdr.zst // The partition directory format is: %08X--%d-%d (MaxUint32-partitionStart, partitionStart, partitionEnd) - // The file format is: %08X--%d.xdr.zstd (MaxUint32-fileStart, fileStart) + // The file format is: %08X--%d.xdr.zst (MaxUint32-fileStart, fileStart) partitionDir := "FFFFFFFF--0-63999" - ledgerFile := "FFFFFFFD--2.xdr.zstd" // Expected file for ledger 2 + ledgerFile := "FFFFFFFD--2.xdr.zst" // Expected file for ledger 2 // Test 1: Download and verify the SEP-54 .config.json file exists at the root configURL := fmt.Sprintf("%s/.config.json", metaArchiveURL) @@ -62,7 +62,7 @@ func main() { logLine(fmt.Sprintf("Ledger file downloaded successfully! URL: %s", ledgerURL)) // Test 4: Download and verify the corresponding metadata sidecar file exists - foundMetadataFile := strings.Replace(foundLedgerFile, ".xdr.zstd", ".json", 1) + foundMetadataFile := strings.Replace(foundLedgerFile, ".xdr.zst", ".json", 1) metadataURL := fmt.Sprintf("%s/%s/%s", metaArchiveURL, partitionDir, foundMetadataFile) logLine(fmt.Sprintf("Waiting for metadata file: %s", foundMetadataFile)) waitForFile(metadataURL) @@ -199,8 +199,8 @@ func listPartition(url string) { } func waitForAnyLedgerFile(partitionURL string) string { - // Pattern to match ledger files like "FFFFFFFD--2.xdr.zstd" - ledgerFilePattern := regexp.MustCompile(`[0-9A-Fa-f]{8}--\d+\.xdr\.zstd`) + // Pattern to match ledger files like "FFFFFFFD--2.xdr.zst" + ledgerFilePattern := regexp.MustCompile(`[0-9A-Fa-f]{8}--\d+\.xdr\.zst`) for { time.Sleep(5 * time.Second) From e44bbd5f6950c321f03ffa9b0f02b23066391096 Mon Sep 17 00:00:00 2001 From: Leigh <351529+leighmcculloch@users.noreply.github.com> Date: Tue, 6 Jan 2026 22:16:35 +1000 Subject: [PATCH 13/30] Fix metadata sidecar file test - use .metadata.json suffix --- tests/test_galexie.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/test_galexie.go b/tests/test_galexie.go index fc68e7019..fa73c9f2c 100644 --- a/tests/test_galexie.go +++ b/tests/test_galexie.go @@ -62,7 +62,8 @@ func main() { logLine(fmt.Sprintf("Ledger file downloaded successfully! URL: %s", ledgerURL)) // Test 4: Download and verify the corresponding metadata sidecar file exists - foundMetadataFile := strings.Replace(foundLedgerFile, ".xdr.zst", ".json", 1) + // Filesystem datastore writes metadata as .metadata.json + foundMetadataFile := foundLedgerFile + ".metadata.json" metadataURL := fmt.Sprintf("%s/%s/%s", metaArchiveURL, partitionDir, foundMetadataFile) logLine(fmt.Sprintf("Waiting for metadata file: %s", foundMetadataFile)) waitForFile(metadataURL) @@ -226,7 +227,7 @@ func waitForAnyLedgerFile(partitionURL string) string { return match } - logLine("Waiting for ledger files... no .xdr.zstd files found yet") + logLine("Waiting for ledger files... no .xdr.zst files found yet") } } From e4a7a74e8635840a2ab3518e187e7397cd41e447 Mon Sep 17 00:00:00 2001 From: Leigh <351529+leighmcculloch@users.noreply.github.com> Date: Tue, 6 Jan 2026 23:33:56 +1000 Subject: [PATCH 14/30] Clean up galexie test debug output --- tests/test_galexie.go | 80 +++++++++---------------------------------- 1 file changed, 17 insertions(+), 63 deletions(-) diff --git a/tests/test_galexie.go b/tests/test_galexie.go index fa73c9f2c..b7dce980b 100644 --- a/tests/test_galexie.go +++ b/tests/test_galexie.go @@ -31,24 +31,21 @@ func main() { // The file format is: %08X--%d.xdr.zst (MaxUint32-fileStart, fileStart) partitionDir := "FFFFFFFF--0-63999" - ledgerFile := "FFFFFFFD--2.xdr.zst" // Expected file for ledger 2 // Test 1: Download and verify the SEP-54 .config.json file exists at the root configURL := fmt.Sprintf("%s/.config.json", metaArchiveURL) - logLine("Waiting for SEP-54 .config.json file...") + logLine("Waiting for .config.json file...") waitForConfigFile(configURL) - logLine(fmt.Sprintf("Config file downloaded successfully! URL: %s", configURL)) + logLine("Config file validated!") // Test 2: Wait for and verify the partition directory exists - logLine("Waiting for meta archive partition directory...") - waitForURL(fmt.Sprintf("%s/%s/", metaArchiveURL, partitionDir)) - logLine("Partition directory exists!") - - // List partition directory contents and find a ledger file partitionURL := fmt.Sprintf("%s/%s/", metaArchiveURL, partitionDir) + logLine("Waiting for partition directory...") + waitForURL(partitionURL) + logLine("Partition directory exists!") // Test 3: Wait for any ledger file to appear and download it - logLine(fmt.Sprintf("Waiting for any ledger file in partition (expected: %s)...", ledgerFile)) + logLine("Waiting for ledger file...") foundLedgerFile := waitForAnyLedgerFile(partitionURL) if foundLedgerFile == "" { logLine("ERROR: No ledger file found!") @@ -57,17 +54,16 @@ func main() { logLine(fmt.Sprintf("Found ledger file: %s", foundLedgerFile)) ledgerURL := fmt.Sprintf("%s/%s/%s", metaArchiveURL, partitionDir, foundLedgerFile) - logLine(fmt.Sprintf("Downloading ledger file: %s", ledgerURL)) waitForFile(ledgerURL) - logLine(fmt.Sprintf("Ledger file downloaded successfully! URL: %s", ledgerURL)) + logLine("Ledger file downloaded!") // Test 4: Download and verify the corresponding metadata sidecar file exists // Filesystem datastore writes metadata as .metadata.json - foundMetadataFile := foundLedgerFile + ".metadata.json" - metadataURL := fmt.Sprintf("%s/%s/%s", metaArchiveURL, partitionDir, foundMetadataFile) - logLine(fmt.Sprintf("Waiting for metadata file: %s", foundMetadataFile)) + metadataFile := foundLedgerFile + ".metadata.json" + metadataURL := fmt.Sprintf("%s/%s/%s", metaArchiveURL, partitionDir, metadataFile) + logLine(fmt.Sprintf("Waiting for metadata file: %s", metadataFile)) waitForFile(metadataURL) - logLine(fmt.Sprintf("Metadata file downloaded successfully! URL: %s", metadataURL)) + logLine("Metadata file downloaded!") logLine("All galexie meta archive tests passed!") os.Exit(0) @@ -90,8 +86,6 @@ func waitForConfigFile(url string) { continue } - logLine(fmt.Sprintf("Waiting for config... raw response: %s", string(body))) - var config ConfigFile if err := json.Unmarshal(body, &config); err != nil { logLine(fmt.Sprintf("Waiting for config... JSON parse error: %v", err)) @@ -100,7 +94,7 @@ func waitForConfigFile(url string) { // Validate required fields are present if config.NetworkPassphrase == "" { - logLine("Waiting for config... missing network_passphrase") + logLine("Waiting for config... missing networkPassphrase") continue } if config.Compression == "" { @@ -108,8 +102,6 @@ func waitForConfigFile(url string) { continue } - logLine(fmt.Sprintf("Config file contents: network_passphrase=%s, compression=%s, ledgers_per_file=%d, files_per_partition=%d", - config.NetworkPassphrase, config.Compression, config.LedgersPerBatch, config.BatchesPerPartition)) return } resp.Body.Close() @@ -120,15 +112,6 @@ func waitForConfigFile(url string) { func waitForURL(url string) { for { time.Sleep(5 * time.Second) - - // Try to list the root directory to see what's there - listResp, listErr := http.Get(metaArchiveURL + "/") - if listErr == nil { - body, _ := io.ReadAll(listResp.Body) - listResp.Body.Close() - logLine(fmt.Sprintf("Meta archive root listing: %s", string(body)[:min(500, len(body))])) - } - resp, err := http.Get(url) if err != nil { logLine(fmt.Sprintf("Waiting for %s... error: %v", url, err)) @@ -153,16 +136,15 @@ func waitForFile(url string) { } if resp.StatusCode == http.StatusOK { - // Read and verify we got actual content body, err := io.ReadAll(resp.Body) resp.Body.Close() if err != nil { - logLine(fmt.Sprintf("Waiting... read error: %v", err)) + logLine(fmt.Sprintf("Waiting for %s... read error: %v", url, err)) continue } if len(body) == 0 { - logLine("Waiting... empty file") + logLine(fmt.Sprintf("Waiting for %s... empty file", url)) continue } @@ -170,12 +152,9 @@ func waitForFile(url string) { if strings.HasSuffix(url, ".json") { content := string(body) if !strings.HasPrefix(strings.TrimSpace(content), "{") { - logLine(fmt.Sprintf("Waiting... not valid JSON: %s", content[:min(50, len(content))])) + logLine(fmt.Sprintf("Waiting for %s... not valid JSON", url)) continue } - logLine(fmt.Sprintf("Metadata content preview: %s...", content[:min(100, len(content))])) - } else { - logLine(fmt.Sprintf("File size: %d bytes", len(body))) } return } @@ -184,21 +163,6 @@ func waitForFile(url string) { } } -func listPartition(url string) { - resp, err := http.Get(url) - if err != nil { - logLine(fmt.Sprintf("Error listing partition: %v", err)) - return - } - defer resp.Body.Close() - body, err := io.ReadAll(resp.Body) - if err != nil { - logLine(fmt.Sprintf("Error reading partition listing: %v", err)) - return - } - logLine(fmt.Sprintf("Partition directory listing: %s", string(body))) -} - func waitForAnyLedgerFile(partitionURL string) string { // Pattern to match ledger files like "FFFFFFFD--2.xdr.zst" ledgerFilePattern := regexp.MustCompile(`[0-9A-Fa-f]{8}--\d+\.xdr\.zst`) @@ -218,24 +182,14 @@ func waitForAnyLedgerFile(partitionURL string) string { continue } - content := string(body) - logLine(fmt.Sprintf("Partition listing: %s", content[:min(500, len(content))])) - // Find any ledger file in the listing - match := ledgerFilePattern.FindString(content) + match := ledgerFilePattern.FindString(string(body)) if match != "" { return match } - logLine("Waiting for ledger files... no .xdr.zst files found yet") - } -} - -func min(a, b int) int { - if a < b { - return a + logLine("Waiting for ledger files...") } - return b } func logLine(text interface{}) { From 31cb7d142503daf8b67adc25f8ea8dd94624f278 Mon Sep 17 00:00:00 2001 From: Leigh <351529+leighmcculloch@users.noreply.github.com> Date: Tue, 6 Jan 2026 23:59:24 +1000 Subject: [PATCH 15/30] replace galexie version with image.json query --- start | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start b/start index b632db157..a88dd4b7f 100755 --- a/start +++ b/start @@ -101,7 +101,7 @@ function start() { echo " lab:" echo " $(< /image.json jq -r '.deps[] | select(.name == "lab") | "\(.ref) (\(.sha))"')" echo " galexie:" - echo "$(galexie version | sed 's/^/ /')" + echo " $(< /image.json jq -r '.deps[] | select(.name == "galexie") | "\(.ref) (\(.sha))"')" echo "mode: $STELLAR_MODE" echo "network: $NETWORK" From 2416ffb37a17cb9ceebce52f5c3d126b6e2d7a6f Mon Sep 17 00:00:00 2001 From: Leigh <351529+leighmcculloch@users.noreply.github.com> Date: Wed, 7 Jan 2026 05:58:43 +1000 Subject: [PATCH 16/30] Remove metadata sidecar test - filesystem datastore doesn't support metadata --- tests/test_galexie.go | 8 -------- 1 file changed, 8 deletions(-) diff --git a/tests/test_galexie.go b/tests/test_galexie.go index b7dce980b..430b13045 100644 --- a/tests/test_galexie.go +++ b/tests/test_galexie.go @@ -57,14 +57,6 @@ func main() { waitForFile(ledgerURL) logLine("Ledger file downloaded!") - // Test 4: Download and verify the corresponding metadata sidecar file exists - // Filesystem datastore writes metadata as .metadata.json - metadataFile := foundLedgerFile + ".metadata.json" - metadataURL := fmt.Sprintf("%s/%s/%s", metaArchiveURL, partitionDir, metadataFile) - logLine(fmt.Sprintf("Waiting for metadata file: %s", metadataFile)) - waitForFile(metadataURL) - logLine("Metadata file downloaded!") - logLine("All galexie meta archive tests passed!") os.Exit(0) } From 487d6f1599475f51a6dd62e1e421664922a9246a Mon Sep 17 00:00:00 2001 From: Leigh <351529+leighmcculloch@users.noreply.github.com> Date: Wed, 7 Jan 2026 07:58:55 +1000 Subject: [PATCH 17/30] Move galexie supervisor config to copy_defaults with other services --- start | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/start b/start index a88dd4b7f..65b992548 100755 --- a/start +++ b/start @@ -335,6 +335,10 @@ function copy_defaults() { if [ "$ENABLE_RPC" = "true" ]; then cp /opt/stellar-default/$NETWORK/supervisor/etc/supervisord.conf.d/stellar-rpc.conf $SUPHOME/etc/supervisord.conf.d 2>/dev/null || true fi + if [ "$ENABLE_GALEXIE" = "true" ]; then + cp /opt/stellar-default/$NETWORK/supervisor/etc/supervisord.conf.d/galexie.conf $SUPHOME/etc/supervisord.conf.d 2>/dev/null || true + cp /opt/stellar-default/$NETWORK/supervisor/etc/supervisord.conf.d/meta-archive.conf $SUPHOME/etc/supervisord.conf.d 2>/dev/null || true + fi cp /opt/stellar-default/$NETWORK/supervisor/etc/supervisord.conf.d/friendbot.conf $SUPHOME/etc/supervisord.conf.d 2>/dev/null || true cp /opt/stellar-default/$NETWORK/supervisor/etc/supervisord.conf.d/history-archive.conf $SUPHOME/etc/supervisord.conf.d 2>/dev/null || true fi @@ -410,10 +414,6 @@ function copy_defaults() { if [ -d /opt/stellar-default/$NETWORK/galexie/ ]; then $CP /opt/stellar-default/$NETWORK/galexie/ $GALEXIEHOME fi - if [ "$ENABLE_GALEXIE" = "true" ]; then - cp /opt/stellar-default/$NETWORK/supervisor/etc/supervisord.conf.d/galexie.conf $SUPHOME/etc/supervisord.conf.d 2>/dev/null || true - cp /opt/stellar-default/$NETWORK/supervisor/etc/supervisord.conf.d/meta-archive.conf $SUPHOME/etc/supervisord.conf.d 2>/dev/null || true - fi fi } From faa9d31229ffc7aa5bfb2b97b2d53cbb056dd9ac Mon Sep 17 00:00:00 2001 From: Leigh <351529+leighmcculloch@users.noreply.github.com> Date: Wed, 7 Jan 2026 08:01:46 +1000 Subject: [PATCH 18/30] remove galexie feature flag check --- start | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/start b/start index 65b992548..2ae67406b 100755 --- a/start +++ b/start @@ -335,10 +335,8 @@ function copy_defaults() { if [ "$ENABLE_RPC" = "true" ]; then cp /opt/stellar-default/$NETWORK/supervisor/etc/supervisord.conf.d/stellar-rpc.conf $SUPHOME/etc/supervisord.conf.d 2>/dev/null || true fi - if [ "$ENABLE_GALEXIE" = "true" ]; then - cp /opt/stellar-default/$NETWORK/supervisor/etc/supervisord.conf.d/galexie.conf $SUPHOME/etc/supervisord.conf.d 2>/dev/null || true - cp /opt/stellar-default/$NETWORK/supervisor/etc/supervisord.conf.d/meta-archive.conf $SUPHOME/etc/supervisord.conf.d 2>/dev/null || true - fi + cp /opt/stellar-default/$NETWORK/supervisor/etc/supervisord.conf.d/galexie.conf $SUPHOME/etc/supervisord.conf.d 2>/dev/null || true + cp /opt/stellar-default/$NETWORK/supervisor/etc/supervisord.conf.d/meta-archive.conf $SUPHOME/etc/supervisord.conf.d 2>/dev/null || true cp /opt/stellar-default/$NETWORK/supervisor/etc/supervisord.conf.d/friendbot.conf $SUPHOME/etc/supervisord.conf.d 2>/dev/null || true cp /opt/stellar-default/$NETWORK/supervisor/etc/supervisord.conf.d/history-archive.conf $SUPHOME/etc/supervisord.conf.d 2>/dev/null || true fi From 74e37a83c53be6402b8f02acdf5d06b68381a395 Mon Sep 17 00:00:00 2001 From: Leigh <351529+leighmcculloch@users.noreply.github.com> Date: Wed, 7 Jan 2026 14:06:08 +1000 Subject: [PATCH 19/30] update meta-archive path to /opt/stellar/meta-archive/data --- local/galexie/etc/galexie.toml | 2 +- local/supervisor/etc/supervisord.conf.d/meta-archive.conf | 2 +- start | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/local/galexie/etc/galexie.toml b/local/galexie/etc/galexie.toml index 2c43bd6f8..cfbf85fbb 100644 --- a/local/galexie/etc/galexie.toml +++ b/local/galexie/etc/galexie.toml @@ -8,7 +8,7 @@ admin_port = 6062 type = "Filesystem" [datastore_config.params] -destination_path = "/tmp/stellar-core/meta-archive" +destination_path = "/opt/stellar/meta-archive/data" [datastore_config.schema] ledgers_per_file = 1 diff --git a/local/supervisor/etc/supervisord.conf.d/meta-archive.conf b/local/supervisor/etc/supervisord.conf.d/meta-archive.conf index c0b72a4f1..e45c5498f 100644 --- a/local/supervisor/etc/supervisord.conf.d/meta-archive.conf +++ b/local/supervisor/etc/supervisord.conf.d/meta-archive.conf @@ -1,6 +1,6 @@ [program:meta-archive] user=stellar -directory=/tmp/stellar-core/meta-archive +directory=/opt/stellar/meta-archive/data command=/usr/bin/python3 -m http.server 1571 autostart=true autorestart=true diff --git a/start b/start index 2ae67406b..d7dedd8b2 100755 --- a/start +++ b/start @@ -611,14 +611,14 @@ function init_galexie() { pushd $GALEXIEHOME # Create meta archive directory - mkdir -p /tmp/stellar-core/meta-archive + mkdir -p /opt/stellar/meta-archive/data # Configure galexie perl -pi -e "s/__NETWORK__/$NETWORK_PASSPHRASE/g" etc/galexie.toml perl -pi -e "s/__NETWORK__/$NETWORK_PASSPHRASE/g" etc/stellar-captive-core.cfg run_silent "init-galexie" chown -R stellar:stellar . - run_silent "init-galexie-meta-archive" chown -R stellar:stellar /tmp/stellar-core/meta-archive + run_silent "init-galexie-meta-archive" chown -R stellar:stellar /opt/stellar/meta-archive touch .quickstart-initialized popd From 7fe76f3286a60f78c943dc19ae8de785585bd847 Mon Sep 17 00:00:00 2001 From: Leigh <351529+leighmcculloch@users.noreply.github.com> Date: Wed, 7 Jan 2026 14:06:19 +1000 Subject: [PATCH 20/30] add meta-archive endpoint documentation --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 00764081b..333cc39c0 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,7 @@ HTTP APIs and Tools are available at the following port and paths: - RPC: `http://localhost:8000/rpc` - Lab: `http://localhost:8000/lab` - Friendbot: `http://localhost:8000/friendbot` +- Meta Archive: `http://localhost:8000/meta-archive` (available with `--local` and `--enable galexie`) ## Tags From 79f4cdaa7d3ad3be1a9babf0f74df6163f4c5754 Mon Sep 17 00:00:00 2001 From: Leigh <351529+leighmcculloch@users.noreply.github.com> Date: Wed, 7 Jan 2026 15:23:21 +1000 Subject: [PATCH 21/30] add metaarchivehome variable and update directory setup --- start | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/start b/start index d7dedd8b2..6c24097a7 100755 --- a/start +++ b/start @@ -17,6 +17,7 @@ export LABHOME="$STELLAR_HOME/lab" export NXHOME="$STELLAR_HOME/nginx" export STELLAR_RPC_HOME="$STELLAR_HOME/stellar-rpc" export GALEXIEHOME="$STELLAR_HOME/galexie" +export METAARCHIVEHOME="$STELLAR_HOME/meta-archive" export CORELOG="/var/log/stellar-core" @@ -611,14 +612,14 @@ function init_galexie() { pushd $GALEXIEHOME # Create meta archive directory - mkdir -p /opt/stellar/meta-archive/data + run_silent "mkdir-meta-archive" mkdir -p $METAARCHIVEHOME/data + run_silent "chown-meta-archive" chown -R stellar:stellar $METAARCHIVEHOME # Configure galexie perl -pi -e "s/__NETWORK__/$NETWORK_PASSPHRASE/g" etc/galexie.toml perl -pi -e "s/__NETWORK__/$NETWORK_PASSPHRASE/g" etc/stellar-captive-core.cfg run_silent "init-galexie" chown -R stellar:stellar . - run_silent "init-galexie-meta-archive" chown -R stellar:stellar /opt/stellar/meta-archive touch .quickstart-initialized popd From 8bd804d97bf3ef1b6d29dca3f5af763d49967213 Mon Sep 17 00:00:00 2001 From: Leigh <351529+leighmcculloch@users.noreply.github.com> Date: Wed, 7 Jan 2026 15:28:14 +1000 Subject: [PATCH 22/30] reorder galexie initialization steps --- start | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/start b/start index 6c24097a7..dc4f828bd 100755 --- a/start +++ b/start @@ -609,13 +609,11 @@ function init_galexie() { return 0 fi - pushd $GALEXIEHOME - - # Create meta archive directory run_silent "mkdir-meta-archive" mkdir -p $METAARCHIVEHOME/data run_silent "chown-meta-archive" chown -R stellar:stellar $METAARCHIVEHOME - # Configure galexie + pushd $GALEXIEHOME + perl -pi -e "s/__NETWORK__/$NETWORK_PASSPHRASE/g" etc/galexie.toml perl -pi -e "s/__NETWORK__/$NETWORK_PASSPHRASE/g" etc/stellar-captive-core.cfg From a952e651c8cf904e45336ba7dc8f084cdcd16943 Mon Sep 17 00:00:00 2001 From: Leigh <351529+leighmcculloch@users.noreply.github.com> Date: Wed, 7 Jan 2026 22:20:26 +1000 Subject: [PATCH 23/30] add galexie to test matrix and remove duplicate configs --- .github/workflows/internal-test.yml | 2 +- images.json | 10 ---------- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/.github/workflows/internal-test.yml b/.github/workflows/internal-test.yml index 6eb095c9e..331eb07fa 100644 --- a/.github/workflows/internal-test.yml +++ b/.github/workflows/internal-test.yml @@ -66,7 +66,7 @@ jobs: image: ${{ fromJSON(inputs.images) }} arch: ${{ fromJSON(inputs.archs) }} network: ["local"] - enable: ["core","rpc","core,rpc,horizon"] + enable: ["core","rpc","core,rpc,horizon","galexie"] options: [""] include: ${{ fromJSON(needs.setup.outputs.additional-tests) }} fail-fast: false diff --git a/images.json b/images.json index 1bee128d0..0e599703b 100644 --- a/images.json +++ b/images.json @@ -61,11 +61,6 @@ "arch": "amd64", "network": "pubnet", "enable": "core,rpc,horizon" - }, - { - "arch": "amd64", - "network": "local", - "enable": "core,galexie" } ] } @@ -137,11 +132,6 @@ "arch": "amd64", "network": "pubnet", "enable": "core,rpc,horizon" - }, - { - "arch": "amd64", - "network": "local", - "enable": "core,galexie" } ] } From 9ea675a77238f2455e8aa0160a1ae1f44a7f753d Mon Sep 17 00:00:00 2001 From: Leigh <351529+leighmcculloch@users.noreply.github.com> Date: Thu, 8 Jan 2026 16:11:06 +1000 Subject: [PATCH 24/30] rename meta-archive to ledger-meta-store --- README.md | 2 +- local/galexie/etc/galexie.toml | 2 +- .../etc/conf.d/{meta-archive.conf => ledger-meta.conf} | 4 ++-- .../{meta-archive.conf => ledger-meta-store.conf} | 4 ++-- start | 8 ++++---- tests/test_galexie.go | 10 +++++----- 6 files changed, 15 insertions(+), 15 deletions(-) rename local/nginx/etc/conf.d/{meta-archive.conf => ledger-meta.conf} (50%) rename local/supervisor/etc/supervisord.conf.d/{meta-archive.conf => ledger-meta-store.conf} (65%) diff --git a/README.md b/README.md index 333cc39c0..2f1c30cac 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ HTTP APIs and Tools are available at the following port and paths: - RPC: `http://localhost:8000/rpc` - Lab: `http://localhost:8000/lab` - Friendbot: `http://localhost:8000/friendbot` -- Meta Archive: `http://localhost:8000/meta-archive` (available with `--local` and `--enable galexie`) +- Ledger Meta: `http://localhost:8000/ledger-meta` (available with `--local` and `--enable galexie`) ## Tags diff --git a/local/galexie/etc/galexie.toml b/local/galexie/etc/galexie.toml index cfbf85fbb..2a574777b 100644 --- a/local/galexie/etc/galexie.toml +++ b/local/galexie/etc/galexie.toml @@ -8,7 +8,7 @@ admin_port = 6062 type = "Filesystem" [datastore_config.params] -destination_path = "/opt/stellar/meta-archive/data" +destination_path = "/opt/stellar/ledger-meta-store/data" [datastore_config.schema] ledgers_per_file = 1 diff --git a/local/nginx/etc/conf.d/meta-archive.conf b/local/nginx/etc/conf.d/ledger-meta.conf similarity index 50% rename from local/nginx/etc/conf.d/meta-archive.conf rename to local/nginx/etc/conf.d/ledger-meta.conf index b7a607257..fe8d11063 100644 --- a/local/nginx/etc/conf.d/meta-archive.conf +++ b/local/nginx/etc/conf.d/ledger-meta.conf @@ -1,5 +1,5 @@ -location /meta-archive { - rewrite /meta-archive/(.*) /$1 break; +location /ledger-meta { + rewrite /ledger-meta/(.*) /$1 break; proxy_pass http://127.0.0.1:1571; proxy_redirect off; } diff --git a/local/supervisor/etc/supervisord.conf.d/meta-archive.conf b/local/supervisor/etc/supervisord.conf.d/ledger-meta-store.conf similarity index 65% rename from local/supervisor/etc/supervisord.conf.d/meta-archive.conf rename to local/supervisor/etc/supervisord.conf.d/ledger-meta-store.conf index e45c5498f..8ac96b62f 100644 --- a/local/supervisor/etc/supervisord.conf.d/meta-archive.conf +++ b/local/supervisor/etc/supervisord.conf.d/ledger-meta-store.conf @@ -1,6 +1,6 @@ -[program:meta-archive] +[program:ledger-meta-store] user=stellar -directory=/opt/stellar/meta-archive/data +directory=/opt/stellar/ledger-meta-store/data command=/usr/bin/python3 -m http.server 1571 autostart=true autorestart=true diff --git a/start b/start index dc4f828bd..8bf997f57 100755 --- a/start +++ b/start @@ -17,7 +17,7 @@ export LABHOME="$STELLAR_HOME/lab" export NXHOME="$STELLAR_HOME/nginx" export STELLAR_RPC_HOME="$STELLAR_HOME/stellar-rpc" export GALEXIEHOME="$STELLAR_HOME/galexie" -export METAARCHIVEHOME="$STELLAR_HOME/meta-archive" +export LEDGERMETASTOREHOME="$STELLAR_HOME/ledger-meta-store" export CORELOG="/var/log/stellar-core" @@ -337,7 +337,7 @@ function copy_defaults() { cp /opt/stellar-default/$NETWORK/supervisor/etc/supervisord.conf.d/stellar-rpc.conf $SUPHOME/etc/supervisord.conf.d 2>/dev/null || true fi cp /opt/stellar-default/$NETWORK/supervisor/etc/supervisord.conf.d/galexie.conf $SUPHOME/etc/supervisord.conf.d 2>/dev/null || true - cp /opt/stellar-default/$NETWORK/supervisor/etc/supervisord.conf.d/meta-archive.conf $SUPHOME/etc/supervisord.conf.d 2>/dev/null || true + cp /opt/stellar-default/$NETWORK/supervisor/etc/supervisord.conf.d/ledger-meta-store.conf $SUPHOME/etc/supervisord.conf.d 2>/dev/null || true cp /opt/stellar-default/$NETWORK/supervisor/etc/supervisord.conf.d/friendbot.conf $SUPHOME/etc/supervisord.conf.d 2>/dev/null || true cp /opt/stellar-default/$NETWORK/supervisor/etc/supervisord.conf.d/history-archive.conf $SUPHOME/etc/supervisord.conf.d 2>/dev/null || true fi @@ -609,8 +609,8 @@ function init_galexie() { return 0 fi - run_silent "mkdir-meta-archive" mkdir -p $METAARCHIVEHOME/data - run_silent "chown-meta-archive" chown -R stellar:stellar $METAARCHIVEHOME + run_silent "mkdir-ledger-meta-store" mkdir -p $LEDGERMETASTOREHOME/data + run_silent "chown-ledger-meta-store" chown -R stellar:stellar $LEDGERMETASTOREHOME pushd $GALEXIEHOME diff --git a/tests/test_galexie.go b/tests/test_galexie.go index 430b13045..5627c722f 100644 --- a/tests/test_galexie.go +++ b/tests/test_galexie.go @@ -12,7 +12,7 @@ import ( "time" ) -const metaArchiveURL = "http://localhost:8000/meta-archive" +const ledgerMetaURL = "http://localhost:8000/ledger-meta" // ConfigFile represents the SEP-54 .config.json structure type ConfigFile struct { @@ -33,13 +33,13 @@ func main() { partitionDir := "FFFFFFFF--0-63999" // Test 1: Download and verify the SEP-54 .config.json file exists at the root - configURL := fmt.Sprintf("%s/.config.json", metaArchiveURL) + configURL := fmt.Sprintf("%s/.config.json", ledgerMetaURL) logLine("Waiting for .config.json file...") waitForConfigFile(configURL) logLine("Config file validated!") // Test 2: Wait for and verify the partition directory exists - partitionURL := fmt.Sprintf("%s/%s/", metaArchiveURL, partitionDir) + partitionURL := fmt.Sprintf("%s/%s/", ledgerMetaURL, partitionDir) logLine("Waiting for partition directory...") waitForURL(partitionURL) logLine("Partition directory exists!") @@ -53,11 +53,11 @@ func main() { } logLine(fmt.Sprintf("Found ledger file: %s", foundLedgerFile)) - ledgerURL := fmt.Sprintf("%s/%s/%s", metaArchiveURL, partitionDir, foundLedgerFile) + ledgerURL := fmt.Sprintf("%s/%s/%s", ledgerMetaURL, partitionDir, foundLedgerFile) waitForFile(ledgerURL) logLine("Ledger file downloaded!") - logLine("All galexie meta archive tests passed!") + logLine("All galexie ledger meta store tests passed!") os.Exit(0) } From c54a5a6373a9c7ac7d53cfd86380b3f73403ab4f Mon Sep 17 00:00:00 2001 From: Leigh <351529+leighmcculloch@users.noreply.github.com> Date: Thu, 8 Jan 2026 16:22:38 +1000 Subject: [PATCH 25/30] pin galexie to specific commit hash --- images.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/images.json b/images.json index 0e599703b..6e4e9e85d 100644 --- a/images.json +++ b/images.json @@ -51,7 +51,7 @@ { "name": "galexie", "repo": "stellar/stellar-galexie", - "ref": "add-filesystem-datastore-support" + "ref": "2b90d6b065dff98d14999ed30fea095bf040f26b" } ], "tests": { @@ -117,7 +117,7 @@ { "name": "galexie", "repo": "stellar/stellar-galexie", - "ref": "add-filesystem-datastore-support" + "ref": "2b90d6b065dff98d14999ed30fea095bf040f26b" } ], "tests": { @@ -189,7 +189,7 @@ { "name": "galexie", "repo": "stellar/stellar-galexie", - "ref": "add-filesystem-datastore-support" + "ref": "2b90d6b065dff98d14999ed30fea095bf040f26b" } ], "tests": { From e4367f7237f53f86cd7582a731637ba13dd644bb Mon Sep 17 00:00:00 2001 From: Leigh <351529+leighmcculloch@users.noreply.github.com> Date: Thu, 8 Jan 2026 17:24:00 +1000 Subject: [PATCH 26/30] add galexie ledger meta exporter documentation --- README.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/README.md b/README.md index f8cfdc0ed..d2d844ac2 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,7 @@ The image runs the following software: - [stellar-horizon](https://github.com/stellar/stellar-horizon) - API server - [stellar-friendbot](https://github.com/stellar/friendbot) - Faucet - [stellar-lab](https://github.com/stellar/laboratory) - Web UI +- [galexie](https://github.com/stellar/galexie) - Ledger meta exporter - [postgresql](https://www.postgresql.org) 12 is used for storing both stellar-core and horizon data. - [supervisord](http://supervisord.org) is used from managing the processes of the above services. @@ -242,6 +243,27 @@ $ curl http://localhost:8000/friendbot?addr=G... _Note: In local mode a local friendbot is running. In testnet and futurenet modes requests to the local `:8000/friendbot` endpoint will be proxied to the friendbot deployments for the respective network._ +### Galexie (Ledger Meta Exporter) + +Galexie is a ledger meta exporter that captures ledger close meta, which contains transaction meta, from the network and stores it locally. The exported ledger meta follows the [SEP-54](https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0054.md) format and is served via a file server. + +The ledger meta is only available in `--local` network mode. To enable it use the `--enable` option to specify all the services you wish to run and include `galexie`. + +``` +docker run -it -p 8000:8000 stellar/quickstart --local --enable core,rpc,galexie +``` + + +The ledger meta is available at: + +``` +http://localhost:8000/ledger-meta +``` + +The ledger meta store includes: +- `.config.json` - Configuration file describing the data format +- Partition directories containing compressed XDR files compressed with zstd with one ledger per file (`.xdr.zst`) + ### Using in GitHub Actions The quickstart image can be run in GitHub Actions workflows using the provided action. This is useful for testing smart contracts, running integration tests, or any other CI/CD workflows that need a Stellar network. @@ -428,6 +450,7 @@ The image also exposes a few other ports that most developers do not need, but a | 5432 | postgresql | database access port | | 6060 | horizon | admin port | | 6061 | stellar-rpc | admin port | +| 6062 | galexie | admin port | | 11625 | stellar-core | peer node port | | 11626 | stellar-core | main http port | | 11725 | stellar-core (horizon) | peer node port | From 51a9acd17265557cbd3f837c5d0f24c8fd3bf809 Mon Sep 17 00:00:00 2001 From: Leigh <351529+leighmcculloch@users.noreply.github.com> Date: Thu, 8 Jan 2026 17:33:26 +1000 Subject: [PATCH 27/30] add history-archive and ledger-meta-store ports --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index d2d844ac2..71f980d7b 100644 --- a/README.md +++ b/README.md @@ -451,6 +451,8 @@ The image also exposes a few other ports that most developers do not need, but a | 6060 | horizon | admin port | | 6061 | stellar-rpc | admin port | | 6062 | galexie | admin port | +| 1570 | history-archive | file server port | +| 1571 | ledger-meta-store | file server port | | 11625 | stellar-core | peer node port | | 11626 | stellar-core | main http port | | 11725 | stellar-core (horizon) | peer node port | From 1e38ba84872c39ef41873dd2ed1f1cfbec54baca Mon Sep 17 00:00:00 2001 From: Leigh <351529+leighmcculloch@users.noreply.github.com> Date: Thu, 8 Jan 2026 20:43:03 +1000 Subject: [PATCH 28/30] update galexie ref to v25.1.0 --- images.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/images.json b/images.json index a30be6603..2f6e1dc26 100644 --- a/images.json +++ b/images.json @@ -51,7 +51,7 @@ { "name": "galexie", "repo": "stellar/stellar-galexie", - "ref": "2b90d6b065dff98d14999ed30fea095bf040f26b" + "ref": "v25.1.0" } ], "tests": { @@ -117,7 +117,7 @@ { "name": "galexie", "repo": "stellar/stellar-galexie", - "ref": "2b90d6b065dff98d14999ed30fea095bf040f26b" + "ref": "v25.1.0" } ], "tests": { @@ -189,7 +189,7 @@ { "name": "galexie", "repo": "stellar/stellar-galexie", - "ref": "2b90d6b065dff98d14999ed30fea095bf040f26b" + "ref": "v25.1.0" } ], "tests": { From 3f5c9060499fc2e5f5a887b3f6e2e6988da73230 Mon Sep 17 00:00:00 2001 From: Leigh <351529+leighmcculloch@users.noreply.github.com> Date: Thu, 8 Jan 2026 20:49:47 +1000 Subject: [PATCH 29/30] update galexie ref to galexie-v25.1.0 --- images.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/images.json b/images.json index 2f6e1dc26..8d69eb11f 100644 --- a/images.json +++ b/images.json @@ -51,7 +51,7 @@ { "name": "galexie", "repo": "stellar/stellar-galexie", - "ref": "v25.1.0" + "ref": "galexie-v25.1.0" } ], "tests": { @@ -117,7 +117,7 @@ { "name": "galexie", "repo": "stellar/stellar-galexie", - "ref": "v25.1.0" + "ref": "galexie-v25.1.0" } ], "tests": { @@ -189,7 +189,7 @@ { "name": "galexie", "repo": "stellar/stellar-galexie", - "ref": "v25.1.0" + "ref": "galexie-v25.1.0" } ], "tests": { From c67bb698edf9af05582c0468025dd21d2d42ab68 Mon Sep 17 00:00:00 2001 From: Leigh <351529+leighmcculloch@users.noreply.github.com> Date: Thu, 8 Jan 2026 21:24:17 +1000 Subject: [PATCH 30/30] parameterize galexie captive core database path --- local/galexie/etc/stellar-captive-core.cfg | 2 +- start | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/local/galexie/etc/stellar-captive-core.cfg b/local/galexie/etc/stellar-captive-core.cfg index d2621915c..2deaac506 100644 --- a/local/galexie/etc/stellar-captive-core.cfg +++ b/local/galexie/etc/stellar-captive-core.cfg @@ -3,7 +3,7 @@ NETWORK_PASSPHRASE="__NETWORK__" HTTP_PORT=11926 PUBLIC_HTTP_PORT=false PEER_PORT=11925 -DATABASE="sqlite3:///tmp/stellar-core/galexie-captive-core.db" +DATABASE="sqlite3://__DATABASE__" ARTIFICIALLY_ACCELERATE_TIME_FOR_TESTING=true UNSAFE_QUORUM=true diff --git a/start b/start index 2d199601d..b07b26449 100755 --- a/start +++ b/start @@ -633,7 +633,10 @@ function init_galexie() { run_silent "chown-ledger-meta-store" chown -R stellar:stellar $LEDGERMETASTOREHOME pushd $GALEXIEHOME + mkdir ./captive-core + GALEXIE_CAPTIVE_CORE_CFG=$GALEXIEHOME/etc/stellar-captive-core.cfg + run_silent "finalize-galexie-captivecore-db" perl -pi -e "s*__DATABASE__*$GALEXIEHOME/captive-core/galexie.db*g" $GALEXIE_CAPTIVE_CORE_CFG perl -pi -e "s/__NETWORK__/$NETWORK_PASSPHRASE/g" etc/galexie.toml perl -pi -e "s/__NETWORK__/$NETWORK_PASSPHRASE/g" etc/stellar-captive-core.cfg