├── monero-version.txt ├── .github ├── dependabot.yml └── workflows │ ├── ci.yml │ ├── check_node.yml │ └── build.yml ├── monerod.conf ├── Dockerfile └── README.md /monero-version.txt: -------------------------------------------------------------------------------- 1 | 0.18.4.4 2 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # To get started with Dependabot version updates, you'll need to specify which 2 | # package ecosystems to update and where the package manifests are located. 3 | # Please see the documentation for all configuration options: 4 | # https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates 5 | 6 | version: 2 7 | updates: 8 | - package-ecosystem: docker 9 | directory: "/" 10 | schedule: 11 | interval: weekly 12 | day: saturday 13 | open-pull-requests-limit: 10 14 | 15 | - package-ecosystem: github-actions 16 | directory: "/" 17 | schedule: 18 | interval: weekly 19 | day: saturday 20 | open-pull-requests-limit: 10 -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: ci 2 | 3 | on: 4 | push: 5 | branches: 6 | - '**' 7 | paths-ignore: 8 | - 'README.md' 9 | 10 | jobs: 11 | buildx: 12 | runs-on: ubuntu-latest 13 | strategy: 14 | matrix: 15 | include: 16 | - arch: armv7 17 | platform: linux/arm/v7 18 | - arch: arm64 19 | platform: linux/arm64 20 | - arch: amd64 21 | platform: linux/amd64 22 | 23 | steps: 24 | - name: Checkout repository 25 | uses: actions/checkout@v6 26 | 27 | - name: Get version 28 | id: get_version 29 | uses: battila7/get-version-action@v2.3.0 30 | 31 | - name: Set up QEMU 32 | uses: docker/setup-qemu-action@v3 33 | 34 | - name: Set up Docker Buildx 35 | id: buildx 36 | uses: docker/setup-buildx-action@v3 37 | with: 38 | install: true 39 | 40 | - name: Log in to DockerHub 41 | uses: docker/login-action@v3 42 | with: 43 | username: ${{ secrets.DOCKERHUBUNAME }} 44 | password: ${{ secrets.DOCKERHUBPWD }} 45 | 46 | - name: Cache Docker layers (GitHub cache backend) 47 | uses: docker/build-push-action@v6 48 | with: 49 | context: . 50 | file: ./Dockerfile 51 | builder: ${{ steps.buildx.outputs.name }} 52 | platforms: ${{ matrix.platform }} 53 | push: false 54 | provenance: false 55 | cache-from: type=gha 56 | cache-to: type=gha,mode=max 57 | -------------------------------------------------------------------------------- /monerod.conf: -------------------------------------------------------------------------------- 1 | # /etc/monero/monerod.conf 2 | 3 | #blockchain data / log locations 4 | data-dir=/data 5 | log-file=/log/monero.log 6 | 7 | # P2P full node 8 | p2p-bind-ip=0.0.0.0 # Bind to all interfaces (the default) 9 | p2p-bind-port=18080 # Bind to default port 10 | 11 | #### 12 | #public-node=false # Advertises the RPC-restricted port over p2p peer lists 13 | # rpc settings 14 | #rpc-restricted-bind-ip=0.0.0.0 15 | #rpc-restricted-bind-port=18089 16 | #### 17 | 18 | 19 | # RPC open node 20 | rpc-bind-ip=0.0.0.0 # Bind to all interfaces 21 | rpc-bind-port=18081 # Bind on default port 22 | confirm-external-bind=1 # Open node (confirm) 23 | #restricted-rpc=1 # Prevent unsafe RPC calls 24 | no-igd=1 # Disable UPnP port mapping 25 | 26 | # Slow but reliable db writes 27 | db-sync-mode=safe 28 | 29 | # Emergency checkpoints set by MoneroPulse operators will be enforced to workaround potential consensus bugs 30 | # Check https://monerodocs.org/infrastructure/monero-pulse/ for explanation and trade-offs 31 | enforce-dns-checkpointing=1 32 | 33 | # i2p settings 34 | #tx-proxy=i2p,127.0.0.1:8060 35 | 36 | # node settings 37 | #prune-blockchain=true 38 | #db-sync-mode=safe # Slow but reliable db writes 39 | #enable-dns-blocklist=true # Block known-malicious nodes 40 | 41 | 42 | out-peers=64 # This will enable much faster sync and tx awareness; the default 8 is suboptimal nowadays 43 | in-peers=1024 # The default is unlimited; we prefer to put a cap on this 44 | 45 | limit-rate-up=1048576 # 1048576 kB/s == 1GB/s; a raise from default 2048 kB/s; contribute more to p2p network 46 | limit-rate-down=1048576 # 1048576 kB/s == 1GB/s; a raise from default 8192 kB/s; allow for faster initial sync 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /.github/workflows/check_node.yml: -------------------------------------------------------------------------------- 1 | name: Check Monero Version 2 | 3 | on: 4 | schedule: 5 | - cron: '0 4 * * 6' 6 | 7 | jobs: 8 | updateMonero: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@v6 12 | - name: Install libs 13 | run: sudo apt-get update && sudo apt-get install curl jq -y 14 | - name: Get Latest Monero Release 15 | id: monero-version 16 | run: | 17 | echo "release_tag=$(curl -sL https://api.github.com/repos/monero-project/monero/releases/latest | jq -r ".tag_name" | cut -b 2-)" >> $GITHUB_OUTPUT 18 | echo "current_tag=$(> $GITHUB_OUTPUT 19 | - name: Update Monero 20 | if: steps.monero-version.outputs.current_tag != steps.monero-version.outputs.release_tag 21 | env: 22 | RELEASE_TAG: ${{ steps.monero-version.outputs.release_tag }} 23 | run: | 24 | # Update current release 25 | echo ${{ steps.monero-version.outputs.release_tag }} > monero-version.txt 26 | - name: Update Readme.md & Dockerfile 27 | uses: jacobtomlinson/gha-find-replace@master 28 | with: 29 | find: ${{ steps.monero-version.outputs.current_tag }} 30 | replace: ${{ steps.monero-version.outputs.release_tag }} 31 | - name: Create Pull Request 32 | uses: peter-evans/create-pull-request@v8.0.0 33 | with: 34 | commit-message: Update monero-version to ${{ steps.monero-version.outputs.release_tag }} 35 | title: Update monero-version to ${{ steps.monero-version.outputs.release_tag }} 36 | body: | 37 | Updates [monero-version][1] to ${{ steps.monero-version.outputs.release_tag }} 38 | Auto-generated by [create-pull-request][2] 39 | [1]: https://github.com/monero-project/monero 40 | [2]: https://github.com/peter-evans/create-pull-request 41 | labels: dependencies, automated pr 42 | branch: monero-updates 43 | token: ${{ secrets.REPO_SCOPED_TOKEN }} -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | ########################### 2 | # Builder image 3 | ########################### 4 | FROM debian:trixie-20251208 AS builder 5 | 6 | ARG MONERO_V=0.18.4.4 7 | ENV MONERO_V=${MONERO_V} 8 | 9 | # Install all build dependencies 10 | RUN apt-get update && apt-get install -y \ 11 | build-essential cmake pkg-config git python3 python3-pip \ 12 | python3-setuptools python3-dev \ 13 | libzmq3-dev libssl-dev libunbound-dev libsodium-dev libunwind8-dev \ 14 | liblzma-dev libreadline-dev libldns-dev libexpat1-dev libpgm-dev \ 15 | qttools5-dev-tools libhidapi-dev libusb-1.0-0-dev libprotobuf-dev \ 16 | protobuf-compiler libudev-dev \ 17 | libboost-chrono-dev libboost-date-time-dev libboost-filesystem-dev \ 18 | libboost-locale-dev libboost-program-options-dev libboost-regex-dev \ 19 | libboost-serialization-dev libboost-system-dev libboost-thread-dev \ 20 | ccache doxygen graphviz libgtest-dev 21 | 22 | # Build Google Test 23 | WORKDIR /usr/src/gtest 24 | RUN cmake . && make -j4 && mv lib/*.a /usr/lib/ 25 | 26 | # Clone and build Monero 27 | WORKDIR /opt 28 | RUN git clone -b v${MONERO_V} --recursive --depth=1 https://github.com/monero-project/monero 29 | WORKDIR /opt/monero 30 | RUN make -j$(nproc) 31 | 32 | ########################### 33 | # Production image 34 | ########################### 35 | FROM debian:trixie-20251208 36 | 37 | ARG MONERO_V=0.18.4.4 38 | ENV MONERO_V=${MONERO_V} 39 | 40 | # Install runtime dependencies only 41 | RUN apt-get update && apt-get install -y \ 42 | libboost-chrono-dev libboost-date-time-dev libboost-filesystem-dev \ 43 | libboost-program-options-dev libboost-regex-dev libboost-thread-dev \ 44 | libzmq3-dev libreadline-dev libhidapi-dev libusb-1.0-0-dev \ 45 | libunbound-dev && \ 46 | apt-get clean && rm -rf /var/lib/apt/lists/* 47 | 48 | # Copy Monero binaries 49 | COPY --from=builder /opt/monero/build/Linux/_no_branch_/release/bin/* /usr/local/bin/ 50 | 51 | # Setup runtime directories 52 | RUN mkdir -p /data /log 53 | 54 | # Add configuration 55 | COPY monerod.conf /monerod.conf 56 | 57 | # Default command 58 | CMD [ "monerod", "--config-file", "/monerod.conf", "--non-interactive" ] 59 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: build 2 | 3 | on: 4 | push: 5 | tags: 6 | - '**' 7 | paths-ignore: 8 | - 'README.md' 9 | 10 | jobs: 11 | buildx: 12 | runs-on: ubuntu-latest 13 | strategy: 14 | matrix: 15 | include: 16 | - arch: armv7 17 | platform: linux/arm/v7 18 | - arch: arm64 19 | platform: linux/arm64 20 | - arch: amd64 21 | platform: linux/amd64 22 | 23 | steps: 24 | - name: Checkout 25 | uses: actions/checkout@v6 26 | 27 | - name: Get Version 28 | id: get_version 29 | uses: battila7/get-version-action@v2.3.0 30 | 31 | - name: Set up QEMU 32 | uses: docker/setup-qemu-action@v3 33 | 34 | - name: Set up Docker Buildx 35 | id: buildx 36 | uses: docker/setup-buildx-action@v3 37 | 38 | - name: Login to DockerHub 39 | uses: docker/login-action@v3 40 | with: 41 | username: ${{ secrets.DOCKERHUBUNAME }} 42 | password: ${{ secrets.DOCKERHUBPWD }} 43 | 44 | - name: Build and push architecture image 45 | uses: docker/build-push-action@v6 46 | with: 47 | context: . 48 | file: ./Dockerfile 49 | builder: ${{ steps.buildx.outputs.name }} 50 | platforms: ${{ matrix.platform }} 51 | push: true 52 | tags: | 53 | hvalev/monero-node:${{ steps.get_version.outputs.version }}-${{ matrix.arch }} 54 | hvalev/monero-node:latest-${{ matrix.arch }} 55 | cache-from: type=gha 56 | cache-to: type=gha,mode=max 57 | 58 | collate: 59 | needs: buildx 60 | runs-on: ubuntu-latest 61 | 62 | steps: 63 | - name: Checkout 64 | uses: actions/checkout@v6 65 | 66 | - name: Get Version 67 | id: get_version 68 | uses: battila7/get-version-action@v2.3.0 69 | 70 | - name: Login to DockerHub 71 | uses: docker/login-action@v3 72 | with: 73 | username: ${{ secrets.DOCKERHUBUNAME }} 74 | password: ${{ secrets.DOCKERHUBPWD }} 75 | 76 | - name: Create and push versioned multi-arch manifest 77 | run: | 78 | docker buildx imagetools create \ 79 | --tag hvalev/monero-node:${{ steps.get_version.outputs.version }} \ 80 | hvalev/monero-node:${{ steps.get_version.outputs.version }}-armv7 \ 81 | hvalev/monero-node:${{ steps.get_version.outputs.version }}-arm64 \ 82 | hvalev/monero-node:${{ steps.get_version.outputs.version }}-amd64 83 | 84 | - name: Create and push latest multi-arch manifest 85 | run: | 86 | docker buildx imagetools create \ 87 | --tag hvalev/monero-node:latest \ 88 | hvalev/monero-node:latest-armv7 \ 89 | hvalev/monero-node:latest-arm64 \ 90 | hvalev/monero-node:latest-amd64 91 | 92 | - name: Update Docker Hub Description 93 | uses: peter-evans/dockerhub-description@v5 94 | with: 95 | username: ${{ secrets.DOCKERHUBUNAME }} 96 | password: ${{ secrets.DOCKERHUBPWD }} 97 | repository: hvalev/monero-node 98 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Full configurable ARMv7/ARM64/AMD64 Monero-Node 2 | 3 | [![build](https://github.com/hvalev/monero-node/actions/workflows/build.yml/badge.svg)](https://github.com/hvalev/monero-node/actions/workflows/build.yml) 4 | ![monero%20version](https://img.shields.io/badge/monero%20version-0.18.4.4-green) 5 | ![Docker Pulls](https://img.shields.io/docker/pulls/hvalev/monero-node) 6 | ![Docker Image Size (latest by date)](https://img.shields.io/docker/image-size/hvalev/monero-node) 7 | 8 | This docker image dockerizes a complete monero-node to use on ARMv7, ARM64 and AMD64 devices. It is fully configurable by overriding the containers' [config file](https://github.com/hvalev/monero-node/blob/main/monerod.conf). By default, this container will run a standard full node. 9 | 10 | 11 | ## How to run it with docker 12 | The container can be started by simply running the following docker run command: 13 | ```bash 14 | docker run -v ~/monero/chain:/data -v ~/monero/log:/log -v ~/monero/monerod.conf:/monerod.conf --name monerod -p 18080:18080 hvalev/monero-node:latest 15 | ``` 16 | 17 | or alternatively by using the following docker-compose configuration: 18 | ```yaml 19 | services: 20 | monerod: 21 | image: hvalev/monero-node:latest 22 | container_name: monerod 23 | ports: 24 | #monerod port 25 | - 18080:18080 26 | volumes: 27 | - ~/monero/chain:/data 28 | - ~/monero/log:/log 29 | #include only when you want to override the default config file 30 | #- ~/monero/monerod.conf:/monerod.conf 31 | ``` 32 | 33 | ### Configuring your monero node 34 | The node can be tuned by overriding the containers' configuration file `monerod.conf` using one on the host machine. Various configuration settings can be set, e.g. running a pruned-/archive-node and others. For more information check the official monero [configuration documentation](https://monerodocs.org/interacting/monero-config-file/) or one of the many online resources. 35 | 36 | ## Including a dashboard for your monero node 37 | My [other respository](https://github.com/hvalev/monero-dashboard) contains an automatic build for a monero-node dashboard which binds to the local RPC service and visualizes various details about your running node. The dashboard is created by [jnbarlow](https://github.com/jnbarlow) and can be found in [this repository](https://github.com/jnbarlow/monero-dashboard). If you want to add the dashboard to your docker stack, use the following docker-compose file: 38 | ```yaml 39 | services: 40 | monerod: 41 | image: hvalev/monero-node:latest 42 | container_name: monerod 43 | ports: 44 | #monerod port 45 | - 18080:18080 46 | #monerod-gui port 47 | - 3000:3000 48 | volumes: 49 | - ~/monero/chain:/data 50 | - ~/monero/log:/log 51 | #include only when you want to override the default config file 52 | #- ~/monero/monerod.conf:/monerod.conf 53 | monerod-gui: 54 | image: hvalev/monero-dashboard:latest 55 | container_name: monerod-gui 56 | network_mode: service:monerod 57 | environment: 58 | - MONERO_HOST=0.0.0.0 59 | - MONERO_PORT=18081 60 | - TICKER=true 61 | - PORT=3000 62 | depends_on: 63 | - monerod 64 | ``` 65 | You can simply navigate to your host's IP:3000 to see the current status, connections to other nodes, database size and other information. The `network_mode: service:monerod` line essentially forces the GUI to run on the same network as the node container, allowing access to the nodes' localhost RPC service allowing seemless integration. 66 | 67 | ## Notes 68 | Be aware that fully syncing a node from scratch may take multiple days and is affected by your internet connection and disk I/O speed (i.e. using an SSD to store the chain is almost a *prerequisite*). It is also possible to bootstrap the node by preloading most of the chain as elaborated on [here](https://www.getmonero.org/downloads/#blockchain). In addition, the full chain as of time of writing is approximately 150GB. Running a [pruned node](https://www.getmonero.org/resources/moneropedia/pruning.html) could make the chain take significantly less space. 69 | 70 | ## Acknowledgements 71 | Naturally, all credit goes to the multiple contributors of the [monero project](https://github.com/monero-project/monero) as well as [jnbarlow](https://github.com/jnbarlow) for creating the monero node [dashboard](https://github.com/jnbarlow/monero-dashboard). 72 | --------------------------------------------------------------------------------