Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
f4fb787
feat(private-submission): owned Tor/I2P relay with durable tracking a…
bitcoinuniverseadmin Sep 17, 2026
b3b97e9
fix(backend): Query Studio read-only connector and deployment-control…
bitcoinuniverseadmin Sep 17, 2026
a87fb07
fix(universe): honest registry retry, availability and pulse state on…
bitcoinuniverseadmin Sep 17, 2026
aa9e611
feat(private-submission): frontend follows the owner-token relay cont…
bitcoinuniverseadmin Sep 17, 2026
5db5153
fix(backend): truthful indexer outcomes, durable admin runs, shared r…
bitcoinuniverseadmin Sep 17, 2026
bc2a692
fix(backend): Network Observatory reads the owned relay and template …
bitcoinuniverseadmin Sep 17, 2026
5b020d3
Merge branch 'fix/audit-be-core-20260917' into fix/audit-20260916-go
bitcoinuniverseadmin Sep 17, 2026
79c7054
Merge branch 'fix/audit-be-relay-20260917' into fix/audit-20260916-go
bitcoinuniverseadmin Sep 17, 2026
ec8d469
Merge branch 'fix/audit-frontend-20260917' into fix/audit-20260916-go
bitcoinuniverseadmin Sep 17, 2026
84ff13d
fix(ci): enforce the owned-origin boundary, clear external runtime de…
bitcoinuniverseadmin Sep 17, 2026
6a5802e
Merge branch 'fix/audit-repo-ci-20260917' into fix/audit-20260916-go
bitcoinuniverseadmin Sep 17, 2026
4829ac2
fix(config): no upstream onion default for the external data server
bitcoinuniverseadmin Sep 17, 2026
1cd0da2
feat(bootstrap): trusted AssumeUTXO catalogue, byte verification, mea…
bitcoinuniverseadmin Sep 17, 2026
cc48191
Merge branch 'fix/audit-be-bootstrap-20260917' into fix/audit-2026091…
bitcoinuniverseadmin Sep 17, 2026
36318ec
fix(backend): owned diagnosis, ordering evidence and accelerator rece…
bitcoinuniverseadmin Sep 17, 2026
de3e9c9
fix(bootstrap): operator routes share the admin replay store and capt…
bitcoinuniverseadmin Sep 17, 2026
cc47cb9
Merge branch 'fix/audit-be-services-20260917' into fix/audit-20260916-go
bitcoinuniverseadmin Sep 17, 2026
cd4ab81
docs(protocols): re-pin the roster with TAP on Doge's four dedicated …
bitcoinuniverseadmin Sep 17, 2026
7af2485
fix(universe): render the repaired bootstrap, observatory, query stud…
bitcoinuniverseadmin Sep 17, 2026
0f92091
Merge branch 'fix/audit-frontend-contracts-20260917' into fix/audit-2…
bitcoinuniverseadmin Sep 17, 2026
656978b
Merge remote-tracking branch 'origin/develop' into fix/audit-20260916-go
bitcoinuniverseadmin Sep 17, 2026
97f5b24
fix(frontend): read every non-Bitcoin chain from an explicit configur…
bitcoinuniverseadmin Sep 17, 2026
1eef490
Merge branch 'fix/audit-chain-network-context-20260917' into fix/audi…
bitcoinuniverseadmin Sep 17, 2026
8f6f23e
fix(admin-adapter): the replacement process closes the restart run it…
bitcoinuniverseadmin Sep 17, 2026
0cbe3de
fix(admin-adapter): resumed deployment runs pass through VERIFYING be…
bitcoinuniverseadmin Sep 17, 2026
a3379fb
fix(gateway): bridge a backend restart for eleven seconds, not five
bitcoinuniverseadmin Sep 17, 2026
4db0a61
fix(admin-adapter): the resume timer tolerates a timer-less module sa…
bitcoinuniverseadmin Sep 17, 2026
4bc323f
fix(docker): ship a compose file the backend preflight accepts
bitcoinuniverseadmin Sep 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
118 changes: 73 additions & 45 deletions .github/workflows/docker.yml
Original file line number Diff line number Diff line change
@@ -1,18 +1,50 @@
name: Docker build on tag
name: Container images
env:
DOCKER_CLI_EXPERIMENTAL: enabled
TAG_FMT: "^refs/tags/(((.?[0-9]+){3,4}))$"
DOCKER_BUILDKIT: 1 # Enable BuildKit for better performance
COMPOSE_DOCKER_CLI_BUILD: 0

# Two routes, never mixed:
# - A pull request to develop or main that touches the container templates or
# the runtime configuration they render gets a build-only gate: the images
# are built and started locally on the runner and nothing is pushed.
# - Publication to the registry happens only from an explicit dispatch that
# says so. There is no tag trigger and no label shortcut: nobody publishes
# an image by pushing a ref or adding a label to a pull request.
on:
push:
tags:
- v[0-9]+.[0-9]+.[0-9]+
- v[0-9]+.[0-9]+.[0-9]+-*
pull_request:
branches: [master]
types: [opened, synchronize, reopened, labeled]
branches: [develop, main]
types: [opened, synchronize, reopened]
paths:
- 'docker/**'
- 'production/mempool-config.*.json'
- 'production/mempool-frontend-config.*.json'
- 'backend/mempool-config.sample.json'
- 'frontend/mempool-frontend-config.sample.json'
- 'nginx.conf'
- 'nginx-mempool.conf'
- 'rust/gbt/rust-toolchain'
- 'backend/package.json'
- 'backend/package-lock.json'
- 'frontend/package.json'
- 'frontend/package-lock.json'
- '.github/workflows/docker.yml'
workflow_dispatch:
inputs:
tag:
description: 'Image tag to publish (for example universe-2026.09.17)'
required: true
type: string
publish:
description: 'Push the built images to the registry'
required: true
type: boolean
default: false
latest:
description: 'Also move the latest tag to this build (publish must be true)'
required: false
type: boolean
default: false

permissions:
contents: read
Expand All @@ -21,7 +53,7 @@ jobs:
test-images:
env:
COMPOSE_PROJECT_NAME: mempool-images-${{ github.run_id }}-${{ github.run_attempt }}
# Always run on tag pushes and all pull requests
# Build-only: runs for every pull request in scope and every dispatch.
runs-on: [self-hosted, linux, x64, universe-super]
timeout-minutes: 30
name: Test built Docker images
Expand All @@ -38,10 +70,15 @@ jobs:
fi
echo "SHORT_SHA=${SHA:0:8}" >> $GITHUB_ENV

- name: Set TAG from pushed tag or package.json
- name: Set TAG from the dispatch input or package.json
env:
DISPATCH_TAG: ${{ github.event.inputs.tag }}
run: |
if [ "${{ github.event_name }}" = "push" ]; then
TAG="${GITHUB_REF/refs\/tags\//}"
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
case "$DISPATCH_TAG" in
''|*[!A-Za-z0-9._-]*) echo "Error: tag must be a plain image tag"; exit 1 ;;
esac
TAG="$DISPATCH_TAG"
else
FRONTEND_VERSION=$(jq -r '.version' frontend/package.json)
BACKEND_VERSION=$(jq -r '.version' backend/package.json)
Expand Down Expand Up @@ -226,11 +263,12 @@ jobs:

build:
needs: [test-images]
# Run on tag pushes OR on PRs with "docker-push" label (after test-images passes)
# Publication: only an explicit dispatch that asked for it, and only after
# the build-only gate passed on the same commit.
if: |
needs.test-images.result == 'success' &&
(github.event_name == 'push' ||
(github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'docker-push')))
github.event_name == 'workflow_dispatch' &&
github.event.inputs.publish == 'true'
strategy:
matrix:
service:
Expand All @@ -242,26 +280,24 @@ jobs:
outputs:
image-digest-frontend: ${{ matrix.service == 'frontend' && steps.docker-build.outputs.digest || '' }}
image-digest-backend: ${{ matrix.service == 'backend' && steps.docker-build.outputs.digest || '' }}
tag: ${{ matrix.service == 'frontend' && (steps.set-tag-push.outputs.tag || steps.set-tag-pr.outputs.tag) || '' }}
tag: ${{ matrix.service == 'frontend' && steps.set-tag.outputs.tag || '' }}
steps:
# Shared runner capacity is provisioned outside jobs. Never replace host
# swap, hide Docker data, or restart the shared daemon during a build.
# Only for tag pushes: use the Git tag as TAG
- name: Set TAG from pushed tag
if: github.event_name == 'push'
id: set-tag-push
- name: Set TAG from the dispatch input
id: set-tag
env:
DISPATCH_TAG: ${{ github.event.inputs.tag }}
run: |
TAG="${GITHUB_REF/refs\/tags\//}"
echo "TAG=${TAG}" >> $GITHUB_ENV
echo "tag=${TAG}" >> $GITHUB_OUTPUT
case "$DISPATCH_TAG" in
''|*[!A-Za-z0-9._-]*) echo "Error: tag must be a plain image tag"; exit 1 ;;
esac
echo "TAG=${DISPATCH_TAG}" >> $GITHUB_ENV
echo "tag=${DISPATCH_TAG}" >> $GITHUB_OUTPUT

- name: Add SHORT_SHA env property with commit short sha
run: |
if [ "${{ github.event_name }}" = "pull_request" ]; then
SHA="${{ github.event.pull_request.head.sha }}"
else
SHA="${GITHUB_SHA}"
fi
SHA="${GITHUB_SHA}"
echo "SHORT_SHA=${SHA:0:8}" >> $GITHUB_ENV


Expand All @@ -274,20 +310,6 @@ jobs:
- name: Checkout project
uses: actions/checkout@v4

# For PRs: use package.json version + short sha as TAG
- name: Set TAG from service package.json for pull requests
if: github.event_name == 'pull_request'
id: set-tag-pr
run: |
if [ "${{ matrix.service }}" = "frontend" ]; then
VERSION=$(jq -r '.version' frontend/package.json)
else
VERSION=$(jq -r '.version' backend/package.json)
fi
TAG="v${VERSION}-${SHORT_SHA}"
echo "TAG=${TAG}" >> $GITHUB_ENV
echo "tag=${TAG}" >> $GITHUB_OUTPUT

- name: Show set environment variables
run: |
printf " TAG: %s\n" "$TAG"
Expand Down Expand Up @@ -338,8 +360,8 @@ jobs:

tag-latest:
needs: [build]
# Only for successful tag pushes (not PRs with docker-push label) and only for "plain" versions (no '-')
if: ${{ needs.build.result == 'success' && github.event_name == 'push' && !contains(github.ref_name, '-') }}
# Only when the same dispatch asked for it.
if: ${{ needs.build.result == 'success' && github.event_name == 'workflow_dispatch' && github.event.inputs.publish == 'true' && github.event.inputs.latest == 'true' }}
runs-on: [self-hosted, linux, x64, universe-super]
timeout-minutes: 30
name: Tag release build as latest
Expand All @@ -350,7 +372,13 @@ jobs:
- backend
steps:
- name: Set env variables
run: echo "TAG=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_ENV
env:
DISPATCH_TAG: ${{ github.event.inputs.tag }}
run: |
case "$DISPATCH_TAG" in
''|*[!A-Za-z0-9._-]*) echo "Error: tag must be a plain image tag"; exit 1 ;;
esac
echo "TAG=${DISPATCH_TAG}" >> $GITHUB_ENV

- name: Set up QEMU
uses: docker/setup-qemu-action@v3
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/e2e_parameterized.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ on:
mempool_hostname:
description: 'Mempool Hostname'
required: true
default: 'mempool.space'
default: 'explorer.bitcoinuniverse.io'
type: string
liquid_hostname:
description: 'Liquid Hostname'
Expand Down
6 changes: 3 additions & 3 deletions backend/mempool-config.sample.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@
"USER_AGENT": "mempool",
"STDOUT_LOG_MIN_PRIORITY": "debug",
"AUTOMATIC_POOLS_UPDATE": false,
"POOLS_JSON_URL": "https://raw.githubusercontent.com/mempool/mining-pools/master/pools-v2.json",
"POOLS_JSON_TREE_URL": "https://api.github.com/repos/mempool/mining-pools/git/trees/master",
"POOLS_JSON_URL": "",
"POOLS_JSON_TREE_URL": "",
"POOLS_JSON_FILE": "tasks/pools/pools-v2.json",
"POOLS_UPDATE_DELAY": 604800,
"AUDIT": false,
Expand Down Expand Up @@ -131,7 +131,7 @@
},
"EXTERNAL_DATA_SERVER": {
"MEMPOOL_API": "",
"MEMPOOL_ONION": "http://mempoolhqx4isw62xs7abwphsq7ldayuidyx2v2oethdhhj6mlo2r6ad.onion/api/v1",
"MEMPOOL_ONION": "",
"LIQUID_API": "https://liquid.network/api/v1",
"LIQUID_ONION": "http://liquidmom47f6s3m53ebfxn47p76a6tlnxib3wp6deux7wuzotdr6cyd.onion/api/v1"
},
Expand Down
2 changes: 1 addition & 1 deletion backend/mempool-config.test.json
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@
},
"EXTERNAL_DATA_SERVER": {
"MEMPOOL_API": "",
"MEMPOOL_ONION": "http://mempoolhqx4isw62xs7abwphsq7ldayuidyx2v2oethdhhj6mlo2r6ad.onion/api/v1",
"MEMPOOL_ONION": "",
"LIQUID_API": "https://liquid.network/api/v1",
"LIQUID_ONION": "http://liquidmom47f6s3m53ebfxn47p76a6tlnxib3wp6deux7wuzotdr6cyd.onion/api/v1"
},
Expand Down
Loading
Loading