Skip to content

Commit

Permalink
feat: container build logic
Browse files Browse the repository at this point in the history
Creates an app container for Cuiloa, for use in deployments of Penumbra
preview (and soon testnet). Includes CI pipeline to build container
automatically on every change to main.
  • Loading branch information
conorsch committed Nov 1, 2023
1 parent 7beda82 commit 5d92aef
Show file tree
Hide file tree
Showing 6 changed files with 3,091 additions and 1 deletion.
12 changes: 12 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# ignore everything by default
**
# allow JS files
!*.ts
!*.js
!*.json
!pnpm-lock.yaml

# nextjs files
!prisma/
!public/
!src/
51 changes: 51 additions & 0 deletions .github/workflows/container.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
---
name: Build container image
on:
workflow_call:
workflow_dispatch:
# Support triggering builds from penumbra-zone/penumbra CI.
repository_dispatch:
push:
branches:
- main
tags:
- '**'
jobs:
galileo:
runs-on: buildjet-16vcpu-ubuntu-2004
permissions:
contents: read
packages: write

steps:
- name: Checkout repository
uses: actions/checkout@v3

- name: Log in to the Docker Hub container registry (for pulls)
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: Log in to the GitHub container registry (for pushes)
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@v4
with:
images: ghcr.io/penumbra-zone/cuiloa

- name: Build and push Docker image
uses: docker/build-push-action@v3
with:
context: .
platforms: linux/amd64
file: Containerfile
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
18 changes: 18 additions & 0 deletions Containerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
FROM docker.io/library/node:20-alpine
LABEL maintainer="[email protected]"
ARG PNPM_VERSION="8.10.1"

# Create docroot as normal user.
RUN mkdir -p /home/node/app/ && chown -R node:node /home/node/app
WORKDIR /home/node/app
RUN npm install -g pnpm@${PNPM_VERSION}
COPY --chown=node:node . .
USER node

# Install project.
RUN pnpm install
RUN pnpm build

# Run.
EXPOSE 3000
CMD [ "pnpm", "start" ]
85 changes: 85 additions & 0 deletions deploy/postgres-cometbft-schema.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
/*
This file defines the database schema for the PostgresQL ("psql") event sink
implementation in CometBFT. The operator must create a database and install
this schema before using the database to index events.
*/

-- The blocks table records metadata about each block.
-- The block record does not include its events or transactions (see tx_results).
CREATE TABLE blocks (
rowid BIGSERIAL PRIMARY KEY,

height BIGINT NOT NULL,
chain_id VARCHAR NOT NULL,

-- When this block header was logged into the sink, in UTC.
created_at TIMESTAMPTZ NOT NULL,

UNIQUE (height, chain_id)
);

-- Index blocks by height and chain, since we need to resolve block IDs when
-- indexing transaction records and transaction events.
CREATE INDEX idx_blocks_height_chain ON blocks(height, chain_id);

-- The tx_results table records metadata about transaction results. Note that
-- the events from a transaction are stored separately.
CREATE TABLE tx_results (
rowid BIGSERIAL PRIMARY KEY,

-- The block to which this transaction belongs.
block_id BIGINT NOT NULL REFERENCES blocks(rowid),
-- The sequential index of the transaction within the block.
index INTEGER NOT NULL,
-- When this result record was logged into the sink, in UTC.
created_at TIMESTAMPTZ NOT NULL,
-- The hex-encoded hash of the transaction.
tx_hash VARCHAR NOT NULL,
-- The protobuf wire encoding of the TxResult message.
tx_result BYTEA NOT NULL,

UNIQUE (block_id, index)
);

-- The events table records events. All events (both block and transaction) are
-- associated with a block ID; transaction events also have a transaction ID.
CREATE TABLE events (
rowid BIGSERIAL PRIMARY KEY,

-- The block and transaction this event belongs to.
-- If tx_id is NULL, this is a block event.
block_id BIGINT NOT NULL REFERENCES blocks(rowid),
tx_id BIGINT NULL REFERENCES tx_results(rowid),

-- The application-defined type label for the event.
type VARCHAR NOT NULL
);

-- The attributes table records event attributes.
CREATE TABLE attributes (
event_id BIGINT NOT NULL REFERENCES events(rowid),
key VARCHAR NOT NULL, -- bare key
composite_key VARCHAR NOT NULL, -- composed type.key
value VARCHAR NULL,

UNIQUE (event_id, key)
);

-- A joined view of events and their attributes. Events that do not have any
-- attributes are represented as a single row with empty key and value fields.
CREATE VIEW event_attributes AS
SELECT block_id, tx_id, type, key, composite_key, value
FROM events LEFT JOIN attributes ON (events.rowid = attributes.event_id);

-- A joined view of all block events (those having tx_id NULL).
CREATE VIEW block_events AS
SELECT blocks.rowid as block_id, height, chain_id, type, key, composite_key, value
FROM blocks JOIN event_attributes ON (blocks.rowid = event_attributes.block_id)
WHERE event_attributes.tx_id IS NULL;

-- A joined view of all transaction events.
CREATE VIEW tx_events AS
SELECT height, index, chain_id, type, key, composite_key, value, tx_results.created_at
FROM blocks JOIN tx_results ON (blocks.rowid = tx_results.block_id)
JOIN event_attributes ON (tx_results.rowid = event_attributes.tx_id)
WHERE event_attributes.tx_id IS NOT NULL;
10 changes: 9 additions & 1 deletion justfile
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,12 @@ start:
npm run start

lint:
npm run lint
npm run lint

# Download the postgres db schema for CometBFT event indexing. See docs at
# https://docs.cometbft.com/v0.37/app-dev/indexing-transactions#postgresql
update-cometbft-schema:
curl -o deploy/postgres-cometbft-schema.sql -sSf "https://raw.githubusercontent.com/cometbft/cometbft/v0.37.2/state/indexer/sink/psql/schema.sql"

container:
podman build -t ghcr.io/penumbra-zone/cuiloa .
Loading

0 comments on commit 5d92aef

Please sign in to comment.