commit 18d5990e80e69474392eed94a3e10e3ae15ec7d5 Author: Ismo Vuorinen Date: Fri Apr 19 23:06:26 2024 +0300 Initial commit diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..ccd1903 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,14 @@ +# EditorConfig is awesome: https://EditorConfig.org + +# top-most EditorConfig file +root = true + +# Unix-style newlines with a newline ending every file +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +max_line_length = 120 +indent_style = space +indent_size = 2 + diff --git a/.github/README.md b/.github/README.md new file mode 100644 index 0000000..3930acf --- /dev/null +++ b/.github/README.md @@ -0,0 +1,134 @@ +# My xmrig Miner + +This is a simple miner that uses the xmrig miner to mine Monero. + +The configuration is set to mine to my local p2pool node, +but you can change it to your own. + +## What is XMRig? + +[XMRig](https://xmrig.com/miner) is a high performance, open source, cross platform +RandomX, KawPow, CryptoNight and AstroBWT unified CPU/GPU miner +and RandomX benchmark. Official binaries are available for +Windows, Linux, macOS and FreeBSD. + +## How to use this image + +**Step 1:** Clone the GitHub repo: + +```bash +git clone https://github.com/ivuorinen/docker-xmrig.git +``` + +**Step 2:** Edit the `config.json` file after cloning it. + +- Provide your pool configuration: + - url: your-p2pool-node:3333 + - user: your-miner-identifier + - pass: "" + +For all the available options, +visit [XMRig Config File](https://xmrig.com/docs/miner/config) documentation. + +**Step 3:** Deploy the image as a standalone Docker container or +to a Kubernetes cluster. + +### Docker + +```bash +docker run -dit --rm \ + --volume "$(pwd)"/config.json:/xmrig/etc/config.json:ro \ + --volume "$(pwd)"/log:/xmrig/log \ + --name xmrig ivuorinen/docker-xmrig:latest \ + /xmrig/xmrig --config=/xmrig/etc/config.json +``` + +If you prefer **Docker Compose**, edit the [`docker-compose.yml`][docker-compose.yml] +manifest as needed and run: + +```bash +docker-compose up -d +``` + +### Kubernetes + +**Step 1:** Create a _namespace_ for our XMRig application (optional but recommended): + +```bash +kubectl create ns xmrig +``` + +**Step 2:** Create a _configmap_ in the new namespace `xmrig` +from the [`config.json`][config.json] file: + +```bash +kubectl create configmap xmrig-config --from-file config.json -n xmrig +``` + +_remember to edit this file with your own pool configuration and wallet address +or it will mine against my anonymised docker wallet_ + +**Step 3:** Edit the [`deployment.yaml`](https://github.com/ivuorinen/docker-xmrig/blob/main/deployment.yaml) file. Things you may want to modify include: + +- `replicas`: number of desired pods to be running. As I run a 3 worker node Turing Pi cluster, I run 3 replica's +- `image:tag`: to view all available versions, go to the [Tags](https://hub.docker.com/repository/docker/ivuorinen/docker-xmrig/tags) tab of the Docker Hub repo. +- `resources`: set appropriate values for `cpu` and `memory` requests/limits. +- `affinity`: the manifest will schedule only one pod per node, if that's not the desired behavior, remove the `affinity` block. + +**Step 4:** Once you are satisfied with the above manifest, create a _deployment_: + +```bash +kubectl -f apply deployment.yaml +``` + +## Logging + +This Docker image sends the container logs to the `stdout`. To view the logs, run: + +```bash +docker logs xmrig +``` + +For Kubernetes run: + +```bash +kubectl logs --follow -n xmrig +``` + +### Persistent logging + +Containers are stateless by nature, so their logs will be lost when they shut down. +If you want the logs to persist, enable XMRig syslog output in the [`config.json`][config.json] file: + +```json +"syslog": true, +"log-file": "/xmrig/log/xmrig.log", +``` + +And give full permissions to the directory on the host machine: + +```bash +chmod 777 "$(pwd)"/log +``` + +Then use either **Docker** [bind mounts](https://docs.docker.com/storage/bind-mounts/) or **Kubernetes** [Persistent Volumes](https://kubernetes.io/docs/concepts/storage/persistent-volumes/) to keep the log file on the host machine. The `docker run` command above and the [`docker-compose.yml`][docker-compose.yml] file already includes this mapping. + +## Disclaimer + +Use at your own disgression. This repository is by no means financial advise to mine +cryptocurrency. This is a project to learn how to build containerised applications. + +## License + +The Docker image is licensed under the terms of the [MIT License](https://github.com/ivuorinen/docker-xmrig/blob/main/LICENSE). XMRig is licensed under the GNU General Public License v3.0. See its [`LICENSE`](https://github.com/xmrig/xmrig/blob/master/LICENSE) file for details. + +## Used works from other repositories + +This repo is a based on works of: + +- [jrkalf/xmrig-kryptokrona](https://github.com/jrkalf/xmrig-kryptokrona) for XMRIG for Kryptokrona +- [Roberto Meléndez](https://github.com/rcmelendez/xmrig-docker) for XMRIG for Monero +- [Bufanda](https://github.com/bufanda/docker-xmrig) + +[config.json]: https://github.com/ivuorinen/docker-xmrig/blob/main/config.json +[docker-compose.yml]: https://github.com/ivuorinen/docker-xmrig/blob/main/docker-compose.yml diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml new file mode 100644 index 0000000..5e0d4f9 --- /dev/null +++ b/.github/workflows/build.yaml @@ -0,0 +1,100 @@ +name: Build + +on: + push: + branches: + - "main" + +env: + REGISTRY_IMAGE: ivuorinen/docker-xmrig + +jobs: + build: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + platform: + - linux/amd64 + - linux/arm/v6 + - linux/arm/v7 + - linux/arm64 + steps: + - name: Prepare + run: | + platform=${{ matrix.platform }} + echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV + - name: Checkout + uses: actions/checkout@v4 + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY_IMAGE }} + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push by digest + id: build + uses: docker/build-push-action@v5 + with: + context: . + platforms: ${{ matrix.platform }} + labels: ${{ steps.meta.outputs.labels }} + outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true + - name: Export digest + run: | + mkdir -p /tmp/digests + digest="${{ steps.build.outputs.digest }}" + touch "/tmp/digests/${digest#sha256:}" + - name: Upload digest + uses: actions/upload-artifact@v4 + with: + name: digests-${{ env.PLATFORM_PAIR }} + path: /tmp/digests/* + if-no-files-found: error + retention-days: 1 + + merge: + runs-on: ubuntu-latest + needs: + - build + steps: + - name: Download digests + uses: actions/download-artifact@v4 + with: + path: /tmp/digests + pattern: digests-* + merge-multiple: true + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY_IMAGE }} + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Create manifest list and push + working-directory: /tmp/digests + run: | + docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ + $(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *) + - name: Inspect image + run: | + docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }} + - name: Update repo description + uses: peter-evans/dockerhub-description@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + repository: ${{ env.REGISTRY_IMAGE }} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..9769b86 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,44 @@ +ARG UBUNTU_VERSION="24.04" +ARG XMRIG_VERSION="v6.21.2" + +FROM ubuntu:${UBUNTU_VERSION} as prepare + +ENV TZ=Europe/Helsinki +ENV PATH=/xmrig:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin +ENV XMRIG_URL=https://github.com/xmrig/xmrig.git + +RUN apt-get update && \ + apt-get -y install git build-essential cmake libuv1-dev libssl-dev libhwloc-dev + +RUN git clone ${XMRIG_URL} /xmrig && \ + cd /xmrig && git checkout ${XMRIG_VERSION} + +WORKDIR /xmrig/build +RUN sed -i 's/1;/0;/g' ../src/donate.h +RUN cmake .. -DWITH_OPENCL=OFF -DWITH_CUDA=OFF && make -j$(nproc) + +COPY config.json /xmrig/build/conf/ + +### +FROM ubuntu:${UBUNTU_VERSION} + +ARG BUILD_DATE +ARG VCS_REF +ARG XMRIG_VERSION + +LABEL org.label-schema.build-date=$BUILD_DATE \ + org.label-schema.vcs-url="https://github.com/ivuorinen/docker-xmrig" \ + org.label-schema.vcs-ref=$VCS_REF \ + org.label-schema.schema-version=$XMRIG_VERSION + +WORKDIR /xmrig + +COPY --from=prepare /xmrig/build/conf/config.json /xmrig/config.json +COPY --from=prepare /xmrig/build/xmrig /xmrig/xmrig +RUN apt-get update \ + && apt-get -y --no-install-recommends install libuv1 libhwloc15 \ + && apt-get purge -y --auto-remove \ + && rm -rf /var/lib/apt/lists/* \ + && mkdir /xmrig/log + +CMD ["/xmrig/xmrig", "-c", "/xmrig/config.json"] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..bffa737 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Ismo Vuorinen + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/config.json b/config.json new file mode 100644 index 0000000..396dc68 --- /dev/null +++ b/config.json @@ -0,0 +1,87 @@ +{ + "api": { + "id": null, + "worker-id": null + }, + "http": { + "enabled": false, + "host": "127.0.0.1", + "port": 0, + "access-token": null, + "restricted": true + }, + "autosave": false, + "background": false, + "colors": true, + "title": true, + "randomx": { + "init": -1, + "init-avx2": -1, + "mode": "auto", + "1gb-pages": true, + "rdmsr": true, + "wrmsr": true, + "cache_qos": false, + "numa": true, + "scratchpad_prefetch_mode": 1 + }, + "cpu": { + "enabled": true, + "huge-pages": true, + "huge-pages-jit": false, + "hw-aes": null, + "priority": null, + "memory-pool": false, + "yield": true, + "max-threads-hint": 100 + }, + "opencl": { + "enabled": false, + "cache": true, + "loader": null, + "platform": "AMD", + "adl": true, + "cn/0": false, + "cn-lite/0": false + }, + "cuda": { + "enabled": false, + "loader": null, + "nvml": true, + "cn/0": false, + "cn-lite/0": false + }, + "donate-level": 0, + "donate-over-proxy": 0, + "log-file": "/xmrig/log/xmrig.log", + "pools": [ + { + "url": "tunkki:3333", + "user": "${HOSTNAME}", + "pass": "", + "keepalive": true, + "nicehash": false, + "variant": "trtl" + } + ], + "print-time": 60, + "health-print-time": 60, + "dmi": true, + "retries": 5, + "retry-pause": 5, + "syslog": true, + "tls": { + "enabled": false, + "protocols": null, + "cert": null, + "cert_key": null, + "ciphers": null, + "ciphersuites": null, + "dhparam": null + }, + "user-agent": null, + "verbose": 0, + "watch": true, + "pause-on-battery": false, + "pause-on-active": false +} diff --git a/deployment.yaml b/deployment.yaml new file mode 100644 index 0000000..6b7a8c4 --- /dev/null +++ b/deployment.yaml @@ -0,0 +1,47 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: xmrig + name: xmrig + namespace: xmrig +spec: + replicas: 1 + selector: + matchLabels: + app: xmrig + strategy: {} + template: + metadata: + labels: + app: xmrig + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: app + operator: In + values: + - xmrig + topologyKey: "kubernetes.io/hostname" + containers: + - image: ivuorinen/docker-xmrig:latest + name: xmrig + command: ["/xmrig/xmrig"] + args: ["-c", "/xmrig/etc/config.json"] + resources: + limits: + memory: "2Gi" + cpu: "1" + requests: + memory: "1Gi" + cpu: "1" + volumeMounts: + - name: config-volume + mountPath: /xmrig/etc + volumes: + - name: config-volume + configMap: + name: xmrig-config diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..97d6f37 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,12 @@ +version: "3.8" +services: + xmrig: + image: ivuorinen/docker-xmrig:latest + container_name: xmrig + #environment: + # - TZ=Europe/Amsterdam + volumes: + - ./config.json:/xmrig/etc/config.json:ro + - ./log:/xmrig/log + command: ["/xmrig/xmrig", "--config=/xmrig/etc/config.json"] + restart: unless-stopped