From 3221636e04a12dcb02ea9582a46d3eefb6fb5fbc Mon Sep 17 00:00:00 2001 From: Alexandre Date: Sun, 26 Feb 2023 14:19:04 +0100 Subject: [PATCH] Binance trading bot --- .github/paths-filter.yml | 1 + binance-trading-bot/CHANGELOG.md | 112 +++ binance-trading-bot/Dockerfile | 124 ++++ binance-trading-bot/README.md | 44 ++ binance-trading-bot/apparmor.txt | 66 ++ binance-trading-bot/build.json | 9 + binance-trading-bot/config.json | 93 +++ binance-trading-bot/icon.png | Bin 0 -> 35308 bytes binance-trading-bot/logo.png | Bin 0 -> 35308 bytes binance-trading-bot/rootfs/entrypoint.sh | 16 + .../rootfs/etc/cont-init.d/20-folders.sh | 16 + .../rootfs/etc/cont-init.d/99-run.sh | 29 + binance-trading-bot/translations/en.yaml | 659 ++++++++++++++++++ binance-trading-bot/updater.json | 9 + 14 files changed, 1178 insertions(+) create mode 100644 binance-trading-bot/CHANGELOG.md create mode 100644 binance-trading-bot/Dockerfile create mode 100644 binance-trading-bot/README.md create mode 100644 binance-trading-bot/apparmor.txt create mode 100644 binance-trading-bot/build.json create mode 100644 binance-trading-bot/config.json create mode 100644 binance-trading-bot/icon.png create mode 100644 binance-trading-bot/logo.png create mode 100644 binance-trading-bot/rootfs/entrypoint.sh create mode 100644 binance-trading-bot/rootfs/etc/cont-init.d/20-folders.sh create mode 100644 binance-trading-bot/rootfs/etc/cont-init.d/99-run.sh create mode 100644 binance-trading-bot/translations/en.yaml create mode 100644 binance-trading-bot/updater.json diff --git a/.github/paths-filter.yml b/.github/paths-filter.yml index 9280c6bc5..ec4060b8f 100644 --- a/.github/paths-filter.yml +++ b/.github/paths-filter.yml @@ -5,6 +5,7 @@ addons_updater: addons_updater/config.* # Image : yes arpspoof: arpspoof/config.* # Image : yes baikal: baikal/config.* # Image : yes bazarr: bazarr/config.* # Image : yes +binance-trading-bot: binance-trading-bot/config.* # Image : yes bitwarden: bitwarden/config.* # Image : yes booksonic_air: booksonic_air/config.* # Image : yes browserless_chrome: browserless_chrome/config.* # Image : yes diff --git a/binance-trading-bot/CHANGELOG.md b/binance-trading-bot/CHANGELOG.md new file mode 100644 index 000000000..300a0d18d --- /dev/null +++ b/binance-trading-bot/CHANGELOG.md @@ -0,0 +1,112 @@ +- Add NTFS support +- Disable external port by default +- WARNING : update to supervisor 2022.11 before installing + +## 2.23.0 (08-11-2022) + +- Update to latest version from hurlenko/binance-trading-bot-docker + +## 2.22.4 (23-07-2022) + +- Update to latest version from hurlenko/binance-trading-bot-docker + +## 2.22.3 (07-07-2022) + +- Update to latest version from hurlenko/binance-trading-bot-docker + +## 2.22.2 (05-07-2022) + +- Update to latest version from hurlenko/binance-trading-bot-docker + +## 2.22.1 (09-06-2022) + +- Update to latest version from hurlenko/binance-trading-bot-docker + +## 2.22.0 (06-06-2022) + +- Update to latest version from hurlenko/binance-trading-bot-docker +- Add codenotary sign + +## 2.21.1 (23-02-2022) + +- Update to latest version from hurlenko/binance-trading-bot-docker + +## 2.21.0 (22-02-2022) + +- Update to latest version from hurlenko/binance-trading-bot-docker +- Cleanup: config base folder changed to /config/addons_config (thanks @bruvv) + +## 2.20.1 (23-12-2021) + +- Update to latest version from hurlenko/binance-trading-bot-docker +- Mount ssl in write +- New standardized logic for Dockerfile build and packages installation +- Mount nvme drives + +## 2.19.0 (25-11-2021) + +- Update to latest version from hurlenko/binance-trading-bot-docker +- Allow mounting local drives by label. Just pust the label instead of sda1 for example + +## 2.18.0 (02-11-2021) + +- Update to latest version from hurlenko/binance-trading-bot-docker +- Allow mounting of devices up to sdg2 +- Allow uploads >16mb +- Allow local mount in protected mode +- SMB : accepts several disks separated by commas mounted in /mnt/$sharename + +## 2.17.2 (28-08-2021) + +- Update to latest version from hurlenko/binance-trading-bot-docker + +## 2.17.1 (26-08-2021) + +- Update to latest version from hurlenko/binance-trading-bot-docker + +## 2.17.0 (24-08-2021) + +- Update to latest version from hurlenko/binance-trading-bot-docker + +## 2.16.1 (07-08-2021) + +- Update to latest version from hurlenko/binance-trading-bot-docker +- Ingress added +- No auth option made more apparent + +## 2.16.0 (29-07-2021) + +- Update to latest version from hurlenko/binance-trading-bot-docker +- Add banner in log +- Update smb mount code +- Allow mount local drives (needs priviledged mode) + +## 2.15.0 + +- Update to latest version from hurlenko/binance-trading-bot-docker + +## 2.14.1 + +- Update to latest version from hurlenko/binance-trading-bot-docker + +## 2.13.0 + +- Update to latest version from hurlenko/binance-trading-bot-docker + +## 2.12.1 + +- Update to latest version from hurlenko/binance-trading-bot-docker + +## 2.12.0 + +- Update to latest version from hurlenko/binance-trading-bot-docker +- Allow mounting shares named \ip\share in addition to //ip/share + +## 2.11.0 + +- Update to latest version from hurlenko/binance-trading-bot-docker +- Added ssl +- New feature : mount smb share in protected mode +- New feature : mount multiple smb shares +- New config/feature : mount smbv1 +- Changed path : changed smb mount path from /storage/externalcifs to /mnt/$NAS name diff --git a/binance-trading-bot/Dockerfile b/binance-trading-bot/Dockerfile new file mode 100644 index 000000000..ab78fcda7 --- /dev/null +++ b/binance-trading-bot/Dockerfile @@ -0,0 +1,124 @@ +#============================# +# ALEXBELGIUM'S DOCKERFILE # +#============================# +# _.------. +# _.-` ('>.-`"""-. +# '.--'` _'` _ .--.) +# -' '-.-';` ` +# ' - _.' ``'--. +# '---` .-'""` +# /` +#=== Home Assistant Addon ===# + +################# +# 1 Build Image # +################# + +ARG BUILD_VERSION +ARG BUILD_UPSTREAM="2.23.0" +ARG BUILD_FROM +FROM $BUILD_FROM + +################## +# 2 Modify Image # +################## + +# Set S6 wait time +ENV S6_CMD_WAIT_FOR_SERVICES=1 \ + S6_CMD_WAIT_FOR_SERVICES_MAXTIME=0 \ + S6_SERVICES_GRACETIME=0 + +################## +# 3 Install apps # +################## + +# Add rootfs +COPY rootfs/ / + +# Corrects permissions for s6 v3 +RUN if [ -d /etc/cont-init.d ]; then chmod -R 755 /etc/cont-init.d; fi && \ + if [ -d /etc/services.d ]; then chmod -R 755 /etc/services.d; fi && \ + if [ -f /entrypoint.sh ]; then chmod 755 /entrypoint.sh; fi + +# Install trading view +ENV FLASK_APP=main.py +ENV FLASK_ENV=production +RUN \ + apk add --no-cache --quiet python3 py3-pip curl \ + && curl -o requirements.txt https://raw.githubusercontent.com/chrisleekr/binance-trading-bot/master/tradingview/requirements.txt \ + && pip install -r requirements.txt \ + && rm requirements.txt \ + && curl -o /srv/main.py https://raw.githubusercontent.com/chrisleekr/binance-trading-bot/master/tradingview/main.py + +# Installing mongodb +ENV ME_CONFIG_MONGODB_SERVER=localhost \ + BINANCE_MONGO_HOST=localhost + +RUN \ + echo 'http://dl-cdn.alpinelinux.org/alpine/v3.9/main' >> /etc/apk/repositories \ + && echo 'http://dl-cdn.alpinelinux.org/alpine/v3.9/community' >> /etc/apk/repositories \ + && apk add mongodb mongodb-tools --no-cache >/dev/null \ + && sed -i "/v3.9/d" /etc/apk/repositories + +# Modules +ARG MODULES="00-banner.sh 01-custom_script.sh 00-global_var.sh" + +# Automatic modules download +RUN if ! command -v bash >/dev/null 2>/dev/null; then (apt-get update && apt-get install -yqq --no-install-recommends bash || apk add --no-cache bash) >/dev/null; fi \ + && if ! command -v curl >/dev/null 2>/dev/null; then (apt-get update && apt-get install -yqq --no-install-recommends curl || apk add --no-cache curl) >/dev/null; fi \ + && apt-get update && apt-get install -yqq --no-install-recommends ca-certificates || apk add --no-cache ca-certificates >/dev/null || true \ + && mkdir -p /etc/cont-init.d \ + && for scripts in $MODULES; do echo "$scripts" && curl -f -L -s -S "https://raw.githubusercontent.com/alexbelgium/hassio-addons/master/.templates/$scripts" -o /etc/cont-init.d/"$scripts" && [ "$(sed -n '/\/bin/p;q' /etc/cont-init.d/"$scripts")" != "" ] || (echo "script failed to install $scripts" && exit 1); done \ + && chmod -R 755 /etc/cont-init.d + +# Manual apps +ENV PACKAGES="sudo redis" + +# Automatic apps & bashio +# hadolint ignore=SC2015 +RUN if ! command -v bash >/dev/null 2>/dev/null; then (apt-get update && apt-get install -yqq --no-install-recommends bash || apk add --no-cache bash) >/dev/null; fi \ + && if ! command -v curl >/dev/null 2>/dev/null; then (apt-get update && apt-get install -yqq --no-install-recommends curl || apk add --no-cache curl) >/dev/null; fi \ + && curl -f -L -s -S "https://raw.githubusercontent.com/alexbelgium/hassio-addons/master/.templates/automatic_packages.sh" --output /automatic_packages.sh \ + && chmod 777 /automatic_packages.sh \ + && eval /./automatic_packages.sh "${PACKAGES:-}" \ + && rm /automatic_packages.sh + +################ +# 4 Entrypoint # +################ + +VOLUME [ "/data" ] +WORKDIR / +RUN chmod 777 /entrypoint.sh +ENTRYPOINT [ "/usr/bin/env" ] +CMD [ "/entrypoint.sh" ] + +############ +# 5 Labels # +############ + +ARG BUILD_ARCH +ARG BUILD_DATE +ARG BUILD_DESCRIPTION +ARG BUILD_NAME +ARG BUILD_REF +ARG BUILD_REPOSITORY +ARG BUILD_VERSION +LABEL \ + io.hass.name="${BUILD_NAME}" \ + io.hass.description="${BUILD_DESCRIPTION}" \ + io.hass.arch="${BUILD_ARCH}" \ + io.hass.type="addon" \ + io.hass.version=${BUILD_VERSION} \ + maintainer="alexbelgium (https://github.com/alexbelgium)" \ + org.opencontainers.image.title="${BUILD_NAME}" \ + org.opencontainers.image.description="${BUILD_DESCRIPTION}" \ + org.opencontainers.image.vendor="Home Assistant Add-ons" \ + org.opencontainers.image.authors="alexbelgium (https://github.com/alexbelgium)" \ + org.opencontainers.image.licenses="MIT" \ + org.opencontainers.image.url="https://github.com/alexbelgium" \ + org.opencontainers.image.source="https://github.com/${BUILD_REPOSITORY}" \ + org.opencontainers.image.documentation="https://github.com/${BUILD_REPOSITORY}/blob/main/README.md" \ + org.opencontainers.image.created=${BUILD_DATE} \ + org.opencontainers.image.revision=${BUILD_REF} \ + org.opencontainers.image.version=${BUILD_VERSION} diff --git a/binance-trading-bot/README.md b/binance-trading-bot/README.md new file mode 100644 index 000000000..91f5042c5 --- /dev/null +++ b/binance-trading-bot/README.md @@ -0,0 +1,44 @@ +# Home assistant add-on: Binance Trading Bot + +[![Donate][donation-badge]](https://www.buymeacoffee.com/alexbelgium) + +![Version](https://img.shields.io/badge/dynamic/json?label=Version&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2Falexbelgium%2Fhassio-addons%2Fmaster%2Ffilebrowser%2Fconfig.json) +![Ingress](https://img.shields.io/badge/dynamic/json?label=Ingress&query=%24.ingress&url=https%3A%2F%2Fraw.githubusercontent.com%2Falexbelgium%2Fhassio-addons%2Fmaster%2Ffilebrowser%2Fconfig.json) +![Arch](https://img.shields.io/badge/dynamic/json?color=success&label=Arch&query=%24.arch&url=https%3A%2F%2Fraw.githubusercontent.com%2Falexbelgium%2Fhassio-addons%2Fmaster%2Ffilebrowser%2Fconfig.json) + +[![Codacy Badge](https://app.codacy.com/project/badge/Grade/9c6cf10bdbba45ecb202d7f579b5be0e)](https://www.codacy.com/gh/alexbelgium/hassio-addons/dashboard?utm_source=github.com&utm_medium=referral&utm_content=alexbelgium/hassio-addons&utm_campaign=Badge_Grade) +[![GitHub Super-Linter](https://github.com/alexbelgium/hassio-addons/workflows/Lint%20Code%20Base/badge.svg)](https://github.com/marketplace/actions/super-linter) +[![Builder](https://github.com/alexbelgium/hassio-addons/workflows/Builder/badge.svg)](https://github.com/alexbelgium/hassio-addons/actions/workflows/builder.yaml) + +[donation-badge]: https://img.shields.io/badge/Buy%20me%20a%20coffee-%23d32f2f?logo=buy-me-a-coffee&style=flat&logoColor=white + +_Thanks to everyone having starred my repo! To star it click on the image below, then it will be on top right. Thanks!_ + +[![Stargazers repo roster for @alexbelgium/hassio-addons](https://git-lister.onrender.com/api/stars/alexbelgium/hassio-addons?limit=30)](https://github.com/alexbelgium/hassio-addons/stargazers) + +## About + +Automated Binance trading bot - Trade multiple cryptocurrencies. Buy low/sell high with Grid Trading. Integrated with TradingView technical analysis. +This addon is based on https://github.com/chrisleekr/binance-trading-bot. + +## Configuration + +Webui can be found at . +Please see https://github.com/chrisleekr/binance-trading-bot for configuration. + +## Installation + +The installation of this add-on is pretty straightforward and not different in +comparison to installing any other Hass.io add-on. + +1. [Add my Hass.io add-ons repository][repository] to your Hass.io instance. +1. Install this add-on. +1. Click the `Save` button to store your configuration. +1. Start the add-on. +1. Check the logs of the add-on to see if everything went well. +1. Carefully configure the add-on to your preferences, see the official documentation for for that. + +[repository]: https://github.com/alexbelgium/hassio-addons +[aarch64-shield]: https://img.shields.io/badge/aarch64-yes-green.svg +[amd64-shield]: https://img.shields.io/badge/amd64-yes-green.svg +[armv7-shield]: https://img.shields.io/badge/armv7-yes-green.svg diff --git a/binance-trading-bot/apparmor.txt b/binance-trading-bot/apparmor.txt new file mode 100644 index 000000000..93d13b450 --- /dev/null +++ b/binance-trading-bot/apparmor.txt @@ -0,0 +1,66 @@ +#include + +profile db21ed7f_binance-trading-bot flags=(attach_disconnected,mediate_deleted) { + #include + + capability, + file, + signal, + mount, + umount, + remount, + network udp, + network tcp, + network dgram, + network stream, + network inet, + network inet6, + network netlink raw, + network unix dgram, + + capability setgid, + capability setuid, + capability sys_admin, + capability dac_read_search, + # capability dac_override, + # capability sys_rawio, + +# S6-Overlay + /init ix, + /run/{s6,s6-rc*,service}/** ix, + /package/** ix, + /command/** ix, + /run/{,**} rwk, + /dev/tty rw, + /bin/** ix, + /usr/bin/** ix, + /usr/lib/bashio/** ix, + /etc/s6/** rix, + /run/s6/** rix, + /etc/services.d/** rwix, + /etc/cont-init.d/** rwix, + /etc/cont-finish.d/** rwix, + /init rix, + /var/run/** mrwkl, + /var/run/ mrwkl, + /dev/i2c-1 mrwkl, + # Files required + /dev/fuse mrwkl, + /dev/sda1 mrwkl, + /dev/sdb1 mrwkl, + /dev/nvme0 mrwkl, + /dev/nvme1 mrwkl, + /dev/mmcblk0p1 mrwkl, + /dev/* mrwkl, + /tmp/** mrkwl, + + # Data access + /data/** rw, + + # suppress ptrace denials when using 'docker ps' or using 'ps' inside a container + ptrace (trace,read) peer=docker-default, + + # docker daemon confinement requires explict allow rule for signal + signal (receive) set=(kill,term) peer=/usr/bin/docker, + +} diff --git a/binance-trading-bot/build.json b/binance-trading-bot/build.json new file mode 100644 index 000000000..27307cc2f --- /dev/null +++ b/binance-trading-bot/build.json @@ -0,0 +1,9 @@ +{ + "build_from": { + "aarch64": "chrisleekr/binance-trading-bot:latest", + "amd64": "chrisleekr/binance-trading-bot:latest" + }, + "codenotary": { + "signer": "alexandrep.github@gmail.com" + } +} \ No newline at end of file diff --git a/binance-trading-bot/config.json b/binance-trading-bot/config.json new file mode 100644 index 000000000..5c187f370 --- /dev/null +++ b/binance-trading-bot/config.json @@ -0,0 +1,93 @@ +{ + "arch": [ + "aarch64", + "amd64", + "armv7" + ], + "codenotary": "alexandrep.github@gmail.com", + "description": "Automated Binance trading bot - Trade multiple cryptocurrencies. Buy low/sell high with Grid Trading. Integrated with TradingView technical analysis", + "devices": [ + "/dev/sda", + "/dev/sdb", + "/dev/sdc", + "/dev/sdd", + "/dev/sde", + "/dev/sdf", + "/dev/sdg", + "/dev/nvme", + "/dev/nvme0n1p1", + "/dev/nvme0n1p2", + "/dev/mmcblk", + "/dev/fuse", + "/dev/sda1", + "/dev/sdb1", + "/dev/sdc1", + "/dev/sdd1", + "/dev/sde1", + "/dev/sdf1", + "/dev/sdg1", + "/dev/sda2", + "/dev/sdb2", + "/dev/sdc2", + "/dev/sdd2", + "/dev/sde2", + "/dev/sdf2", + "/dev/sdg2", + "/dev/sda3", + "/dev/sdb3", + "/dev/sda4", + "/dev/sdb4", + "/dev/nvme0", + "/dev/nvme1", + "/dev/nvme2" + ], + "environment": { + "BINANCE_REDIS_HOST": "localhost", + "BINANCE_REDIS_PORT": "6379", + "BINANCE_REDIS_PASSWORD": "", + "PYTHONUNBUFFERED": "1", + "TRADINGVIEW_LOG_LEVEL": "INFO" + }, + "image": "ghcr.io/alexbelgium/binance_trading_bot-{arch}", + "map": [ + "config:rw" + ], + "name": "Binance Trading Bot", + "options": { + "BINANCE_MODE": "test", + "BINANCE_SLACK_ENABLED": false, + "BINANCE_AUTHENTICATION_ENABLED": true, + "BINANCE_AUTHENTICATION_PASSWORD": null + }, + "ports": { + "80/tcp": 8081, + "8080/tcp": 8082 + }, + "ports_description": { + "80/tcp": "Bot port", + "8080/tcp": "Web UI port" + }, + "privileged": [ + "SYS_ADMIN", + "DAC_READ_SEARCH" + ], + "schema": { + "BINANCE_MODE": "list(live|test)", + "BINANCE_LIVE_API_KEY": "str?", + "BINANCE_LIVE_SECRET_KEY": "str?", + "BINANCE_TEST_API_KEY": "str?", + "BINANCE_TEST_SECRET_KEY": "str?", + "BINANCE_SLACK_ENABLED": "bool?", + "BINANCE_SLACK_WEBHOOK_URL": "str?", + "BINANCE_SLACK_CHANNEL": "str?", + "BINANCE_SLACK_USERNAME": "str?", + "BINANCE_LOCAL_TUNNEL_ENABLED": "bool?", + "BINANCE_LOCAL_TUNNEL_SUBDOMAIN": "str?", + "BINANCE_AUTHENTICATION_ENABLED": "bool", + "BINANCE_AUTHENTICATION_PASSWORD": "str" + }, + "slug": "binance-trading-bot", + "url": "https://github.com/alexbelgium/hassio-addons", + "version": "2.23.0-5", + "webui": "[PROTO:ssl]://[HOST]:[PORT:80]" +} \ No newline at end of file diff --git a/binance-trading-bot/icon.png b/binance-trading-bot/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8681d3bd39799257cdf20ac4df4235574b7a81cb GIT binary patch literal 35308 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