Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 0 additions & 2 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,5 @@ Thumbs.db

# Misc (exclude all markdown except healthcheck.sh)
*.md
!entrypoint.sh
!README.md
.env
.env.*
21 changes: 16 additions & 5 deletions .github/workflows/docker-hub-push.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jobs:

steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@v6

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4
Expand All @@ -28,6 +28,13 @@ jobs:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: Build date
id: date
run: |
BUILD_DATE=$(date +%Y%m%d)
echo "BUILD_DATE=$BUILD_DATE" >> $GITHUB_ENV
echo "Build date: $BUILD_DATE"

- name: Detect Gupax version from upstream
id: version
run: |
Expand All @@ -40,29 +47,33 @@ jobs:
SAFE_REF=$(echo "${{ github.ref_name }}" | tr '/' '-')
# Tag strategy:
# :latest / :2.0.1 / :v2.0.1 β€” moving, always latest build
# :v2.0.1-20260518 β€” date-stamped, immutable
# :v2.0.1-YYYYMMDD β€” date-stamped, immutable
# :<sha> β€” commit-pinned, immutable
if [ "${{ github.ref_name }}" = "main" ]; then
TAGS="${{ env.IMAGE_NAME }}:latest"$'\n'"${{ env.IMAGE_NAME }}:$VERSION_STRIPPED"$'\n'"${{ env.IMAGE_NAME }}:$VERSION"$'\n'"${{ env.IMAGE_NAME }}:${VERSION}-20260518"$'\n'"${{ env.IMAGE_NAME }}:${{ github.sha }}"
TAGS="${{ env.IMAGE_NAME }}:latest"$'\n'"${{ env.IMAGE_NAME }}:$VERSION_STRIPPED"$'\n'"${{ env.IMAGE_NAME }}:$VERSION"$'\n'"${{ env.IMAGE_NAME }}:${VERSION}-$BUILD_DATE"$'\n'"${{ env.IMAGE_NAME }}:${{ github.sha }}"
else
TAGS="${{ env.IMAGE_NAME }}:${SAFE_REF}"$'\n'"${{ env.IMAGE_NAME }}:${SAFE_REF}-${{ github.sha }}"
fi
echo "Tags: $TAGS"
echo "VERSION=$VERSION" >> $GITHUB_ENV
echo "BUILD_DATE=$BUILD_DATE" >> $GITHUB_ENV
echo "TAGS<<EOF"$'\n'"$TAGS"$'\n'"EOF" >> $GITHUB_ENV

- name: Build and push to Docker Hub
uses: docker/build-push-action@v7
env:
GUPAX_VERSION: ${{ env.VERSION }}
BUILD_DATE: ${{ env.BUILD_DATE }}
with:
context: .
file: ./Dockerfile
push: true
platforms: linux/amd64
tags: ${{ env.TAGS }}
build-args: GUPAX_VERSION
build-args: |
GUPAX_VERSION
BUILD_DATE
cache-from: type=gha
cache-to: type=gha,mode=max
provenance: mode=max
sbom: true
sbom: true
23 changes: 17 additions & 6 deletions .github/workflows/docker-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ jobs:

steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@v6

- name: Set up QEMU
uses: docker/setup-qemu-action@v4
Expand All @@ -33,39 +33,50 @@ jobs:
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Build date
id: date
run: |
BUILD_DATE=$(date +%Y%m%d)
echo "BUILD_DATE=$BUILD_DATE" >> $GITHUB_ENV
echo "Build date: $BUILD_DATE"

- name: Detect Gupax version for tagging
id: version
run: |
VERSION=$(curl -s https://api.github.com/repos/gupax-io/gupax/releases/latest | python3 -c "import json,sys; print(json.load(sys.stdin)['tag_name'])")
VERSION=$(curl -s https://api.github.com/repos/gupax-io/gupax/releases/latest | python3 -c "import json,sys; print(json.load(sys.stdin)['tag_name'])" )
VERSION_STRIPPED="${VERSION#v}"
echo "Detected Gupax version: $VERSION (tag: $VERSION_STRIPPED)"
# Branch-aware tagging. Slashes -> hyphens (invalid in Docker tags).
SAFE_REF=$(echo "${{ github.ref_name }}" | tr '/' '-')
# Tag strategy:
# :latest / :2.0.1 / :v2.0.1 β€” moving, always latest build
# :v2.0.1-20260518 β€” date-stamped, immutable
# :v2.0.1-YYYYMMDD β€” date-stamped, immutable
# :<sha> β€” commit-pinned, immutable
if [ "${{ github.ref_name }}" = "main" ]; then
TAGS="${{ env.IMAGE_NAME }}:latest"$'\n'"${{ env.IMAGE_NAME }}:$VERSION_STRIPPED"$'\n'"${{ env.IMAGE_NAME }}:$VERSION"$'\n'"${{ env.IMAGE_NAME }}:${VERSION}-20260518"$'\n'"${{ env.IMAGE_NAME }}:${{ github.sha }}"
TAGS="${{ env.IMAGE_NAME }}:latest"$'\n'"${{ env.IMAGE_NAME }}:$VERSION_STRIPPED"$'\n'"${{ env.IMAGE_NAME }}:$VERSION"$'\n'"${{ env.IMAGE_NAME }}:${VERSION}-$BUILD_DATE"$'\n'"${{ env.IMAGE_NAME }}:${{ github.sha }}"
else
TAGS="${{ env.IMAGE_NAME }}:${SAFE_REF}"$'\n'"${{ env.IMAGE_NAME }}:${SAFE_REF}-${{ github.sha }}"
fi
echo "Tags: $TAGS"
echo "VERSION=$VERSION" >> $GITHUB_ENV
echo "BUILD_DATE=$BUILD_DATE" >> $GITHUB_ENV
echo "TAGS<<EOF"$'\n'"$TAGS"$'\n'"EOF" >> $GITHUB_ENV

- name: Build and push Docker image
uses: docker/build-push-action@v7
env:
GUPAX_VERSION: ${{ env.VERSION }}
BUILD_DATE: ${{ env.BUILD_DATE }}
with:
context: .
file: ./Dockerfile
push: true
platforms: linux/amd64
tags: ${{ env.TAGS }}
build-args: GUPAX_VERSION
build-args: |
GUPAX_VERSION
BUILD_DATE
cache-from: type=gha
cache-to: type=gha,mode=max
provenance: mode=max
sbom: true
sbom: true
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).

Versions follow the scheme `v{upstream-gupax}-{build-date}`. The base version
tracks which Gupax release is bundled; the date suffix differentiates container
builds. `v2.0.1` and `v2.0.1+YYYYMMDD` tags are Docker image tags β€” the
builds. `v2.0.1` and `v2.0.1-YYYYMMDD` tags are Docker image tags β€” the
`v`-prefixed tag is a moving tag that always points to the latest build of that
upstream release.

Expand Down
16 changes: 11 additions & 5 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
ENV DISPLAY=:1

# VNC password β€” set VNC_AUTH_TOKEN to require auth; leave empty for no auth
ENV VNC_AUTH_TOKEN=

Check warning on line 26 in Dockerfile

View workflow job for this annotation

GitHub Actions / build-and-push

Sensitive data should not be used in the ARG or ENV commands

SecretsUsedInArgOrEnv: Do not use ARG or ENV instructions for sensitive data (ENV "VNC_AUTH_TOKEN") More info: https://docs.docker.com/go/dockerfile/rule/secrets-used-in-arg-or-env/

Check warning on line 26 in Dockerfile

View workflow job for this annotation

GitHub Actions / Build + Runtime Smoke Test (Tor)

Sensitive data should not be used in the ARG or ENV commands

SecretsUsedInArgOrEnv: Do not use ARG or ENV instructions for sensitive data (ENV "VNC_AUTH_TOKEN") More info: https://docs.docker.com/go/dockerfile/rule/secrets-used-in-arg-or-env/

# Install base tools needed for adding the Tor Project apt repo
RUN apt-get update && apt-get install -y --no-install-recommends \
Expand Down Expand Up @@ -87,7 +87,7 @@
# Install standalone Gupax (Gupax GUI only β€” binaries downloaded at runtime)
# Gupax downloads P2Pool, XMRig, monerod, and xmrig-proxy internally.
# Downloaded binaries are persisted in /home/miner/.local/share/gupax
# via a named volume (gupax-share) so they survive container restarts.
# via a named volume (gupax-data) so they survive container restarts.
# =============================================================================

WORKDIR /tmp/install
Expand All @@ -97,6 +97,7 @@
# For reproducibility, the SHA256 is fetched from upstream SHA256SUMS
# at build time β€” the image build fails if verification fails.
ARG GUPAX_VERSION=v2.0.1
ARG BUILD_DATE=unknown
RUN TARBALL="gupax-${GUPAX_VERSION}-linux-x64.tar.gz" \
&& echo "[*] Downloading Gupax ${GUPAX_VERSION}..." \
&& curl -fsSL "https://github.com/gupax-io/gupax/releases/download/${GUPAX_VERSION}/${TARBALL}" -o "${TARBALL}" \
Expand All @@ -111,12 +112,17 @@
&& rm -rf "${TARBALL}" "${TARBALL}.sha256" SHA256SUMS "gupax-${GUPAX_VERSION}-linux-x64" /tmp/install

# Labels
LABEL maintainer="libre-7" \
description="Gupax β€” GUI for P2Pool + XMRig Monero mining in Docker (noVNC enabled, standalone binaries + optional Tor)" \
LABEL org.opencontainers.image.title="gupax-docker" \
org.opencontainers.image.description="noVNC-enabled Docker image for Gupax β€” GUI for P2Pool + XMRig Monero mining with optional Tor" \
org.opencontainers.image.vendor="libre-7" \
org.opencontainers.image.url="https://github.com/libre-7/gupax-docker" \
org.opencontainers.image.source="https://github.com/libre-7/gupax-docker" \
org.opencontainers.image.icon="https://raw.githubusercontent.com/gupax-io/gupax/main/assets/images/icons/icon.png" \
org.opencontainers.image.version="${GUPAX_VERSION}-20260518" \
org.opencontainers.image.documentation="https://github.com/libre-7/gupax-docker" \
org.opencontainers.image.version="${GUPAX_VERSION}-${BUILD_DATE}" \
org.opencontainers.image.licenses="GPL-3.0" \
org.opencontainers.image.icon="https://raw.githubusercontent.com/gupax-io/gupax/main/assets/images/icons/icon.png" \
maintainer="libre-7" \
description="Gupax β€” GUI for P2Pool + XMRig Monero mining in Docker (noVNC enabled, standalone binaries + optional Tor)" \
gupax.version="${GUPAX_VERSION}"


Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
[![Docker Hub](https://img.shields.io/docker/pulls/libre7/gupax-docker?style=flat-square&color=blue&logo=docker)](https://hub.docker.com/r/libre7/gupax-docker)
[![Image Size](https://img.shields.io/docker/image-size/libre7/gupax-docker/latest?style=flat-square&logo=docker&color=blueviolet)](https://hub.docker.com/r/libre7/gupax-docker)

> Docker packaging for [Gupax](https://github.com/hinto-janai/gupax) β€” the GUI that unites [P2Pool](https://github.com/SChernykh/p2pool) and [XMRig](https://github.com/xmrig/xmrig) for easy, decentralized Monero mining. Optional built-in **πŸ§… Tor hidden service** for private transaction relay.
> Docker packaging for [Gupax](https://github.com/gupax-io/gupax) β€” the GUI that unites [P2Pool](https://github.com/SChernykh/p2pool) and [XMRig](https://github.com/xmrig/xmrig) for easy, decentralized Monero mining. Optional built-in **πŸ§… Tor hidden service** for private transaction relay.

**Self-contained with noVNC** β€” access the Gupax GUI directly from your web browser. No X11 server or additional setup needed.

Expand Down Expand Up @@ -280,7 +280,7 @@ If you have an existing Monero blockchain on your Unraid server:
| `MONERO_DATA_PATH` | No | `gupax-monero` | Path (volume name or host path) for Monero blockchain data |
| `SCREEN_RESOLUTION` | No | `1920x1080x24` | Resolution for the virtual X display (WxHxD format) |

> **Note:** `GUPAX_VERSION` and `GUPAX_SHA256` are managed automatically by the CI workflow β€” no manual configuration needed. The Docker image is always built with the latest detected upstream Gupax version.
> **Note:** `GUPAX_VERSION` is managed automatically by the CI workflow β€” no manual configuration needed. The Docker image is always built with the latest detected upstream Gupax version.

### Ports

Expand Down Expand Up @@ -468,7 +468,7 @@ P2Pool get_info RPC request to host 127.0.0.1:RPC 18081:ZMQ 18083 failed: Error

## πŸ”— Official Resources

- [Gupax](https://github.com/hinto-janai/gupax) β€” The GUI unifying P2Pool & XMRig
- [Gupax](https://github.com/gupax-io/gupax) β€” The GUI unifying P2Pool & XMRig
- [P2Pool](https://github.com/SChernykh/p2pool) β€” Decentralized Monero mining pool
- [XMRig](https://github.com/xmrig/xmrig) β€” High-performance Monero miner
- [Monero](https://www.getmonero.org/) β€” Private, decentralized cryptocurrency
Expand Down
5 changes: 3 additions & 2 deletions TODO.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@
- [x] **Blockchain volume** β€” Mount existing Monero blockchain at `/home/miner/.bitmonero`
- [x] **PR test pipeline** β€” Lint (shellcheck + hadolint + yamllint) + smoke test on PRs
- [x] **GHCR + Docker Hub CI** β€” Image builds pushed to both registries on merge to main
- [ ] **Multi-arch builds** β€” Support `linux/arm64` if Gupax provides arm64 binary
- [x] **Multi-arch builds** β€” Support `linux/arm64` if Gupax provides arm64 binary
- [x] **CONTRIBUTING.md** β€” How to submit PRs and report issues
- [ ] **X11 troubleshooting docs** β€” Expand troubleshooting for common noVNC issues
- [ ] **GitHub Releases** β€” Tagged releases with release notes

Expand All @@ -30,7 +31,7 @@

- [x] **README.md** β€” Quick Start, noVNC setup, configuration, troubleshooting
- [x] **CHANGELOG.md** β€” Track changes per release
- [ ] **CONTRIBUTING.md** β€” How to submit PRs and report issues

- [ ] **GitHub Issues templates** β€” Bug report and feature request templates

## πŸ§ͺ Testing & Validation
Expand Down
Loading