Docker with env var support and containerized cron scheduling (#107)

* Script will run on container start, and continue to run daily at 5:00 am.

The goal of this update was to add in-built cronjob support so that the script runs immediately on container start, then will schedule the script to run the daily at 5:00 am without requiring the user to manually create a cronjob. After starting the container and completing the first run, the container should remain active (running) but idle until the next scheduled run. Ideally, the next step will be to include support for environmental variables that will allow the user to customize when the script scheduled runs occur within the docker compose.yaml.

* added --build to docker compose command instructions

building/rebuilding the image (and the script) may reduce problems if folks make changes to their configs

* Updated the crontab default to run twice daily by default, 5am and 11am

* Update crontab

Newline needed

* Environmental variable support, custom scheduling

This is a massive update that includes docker environmental variable support for all config options. If specified, the custom env var value will supersede the default values in the config.json. You do not need to change the values in the config.json if you set a custom env var. For example, if you have headless=false in the config.json, but set it as true in the compose.yaml, it will run as HEADLESS=true. If you do not specify a particular env var, the script will automatically use the default value. Please test and contribute wherever possible!

* Fix scheduled runs, tidied up readme

* timezone support

Minor adjustment to attempt to fix timezone env var support

* Run on start, npm script env

Hopefully two fixes here, the container should again, by default, run on start, then continue per schedule. This defaults to true; however, can be optionally over-ridden in the compose.yaml with the env var RUN_ON_START=false. If set to false, the script should only run on the specified cron schedule. I also passed the TZ write into the npm start command, rather than just the container overall so it should show the proper time.

* Keep docker running after run_on_start to wait for cron

Accidentally set it up like a run_once, this should keep the container active after run_on_start to wait for the next schedule.

* improve order of cmd

This should (1) set time zone for script, (2) run once if set, then (3) idle for scheduled cron job. It was a little hacky before, this should be tidier.

* updated compose to auto-restart container

Noticed the container was exited this am, likely after automated updated to system, adding restart: unless-stopped to compose should keep container running in such circumstances.

* Update env vars in readme
This commit is contained in:
mgrimace
2024-05-16 13:28:55 -04:00
committed by GitHub
parent 28b1881642
commit 9a144b2e60
6 changed files with 120 additions and 47 deletions

View File

@@ -4,21 +4,12 @@ FROM node:18
# Set the working directory in the container # Set the working directory in the container
WORKDIR /usr/src/microsoft-rewards-script WORKDIR /usr/src/microsoft-rewards-script
# Install jq # Install jq, cron, and gettext-base
RUN apt-get update && apt-get install -y jq RUN apt-get update && apt-get install -y jq cron gettext-base
# Copy all files to the working directory # Copy all files to the working directory
COPY . . COPY . .
# Check if "headless" is set to "true" in the config.json file
# DELETE BELOW IF YOU WANT TO RUN THE DOCKER SCRIPT HEADFULL!
RUN HEADLESS=$(cat src/config.json | jq -r .headless) \
&& if [ "$HEADLESS" != "true" ]; then \
echo "Error: 'headless' in src/config.json is not true."; \
exit 1; \
fi
# Install dependencies including Playwright # Install dependencies including Playwright
RUN apt-get install -y \ RUN apt-get install -y \
xvfb \ xvfb \
@@ -39,5 +30,11 @@ RUN npm run build
# Install playwright chromium # Install playwright chromium
RUN npx playwright install chromium RUN npx playwright install chromium
# Define the command to run your application # Copy cron file to cron directory
CMD ["npm", "start"] COPY src/crontab.template /etc/cron.d/microsoft-rewards-cron.template
# Create the log file to be able to run tail
RUN touch /var/log/cron.log
# Define the command to run your application with cron optionally
CMD sh -c 'echo "$TZ" > /etc/timezone && dpkg-reconfigure -f noninteractive tzdata && if [ "$RUN_ON_START" = "true" ]; then npm start; fi && envsubst < /etc/cron.d/microsoft-rewards-cron.template > /etc/cron.d/microsoft-rewards-cron && crontab /etc/cron.d/microsoft-rewards-cron && cron && tail -f /var/log/cron.log'

View File

@@ -18,48 +18,65 @@ Under development, however mainly for personal use!
## Docker (Experimental) ## ## Docker (Experimental) ##
1. Download the source code 1. Download the source code
2. Make changes to your `accounts.json` 2. Make changes to your `accounts.json`
3. Make sure to change `"headless": false` to `"headless": true` in your `config.json` 3. **Headless mode must be enabled when using Docker.** You can do this using the `HEADLESS=true` environmental variable in docker run or docker compose.yaml (see below). Environmental variables are always prioritized over the values in config.json.
4. Note, the container has to be recreated for any changes regarding the `config.json` and/or `accounts.json`! 4. The container will run scheduled. Customize your schedule using the `CRON_START_TIME` environmental variable. Use [crontab.guru](crontab.guru) if you're unsure how to create a cron schedule.
5. **Note:** the container will add between 5 and 50 minutes of randomized variability to your scheduled start times.
### Option 1: build and run with docker run ### Option 1: build and run with docker run
1. Run `docker build -t microsoft-rewards-script-docker .` to build the container 1. Build or re-build the container image with: `docker build -t microsoft-rewards-script-docker .`
2. Run the container with `docker run --name netsky -d microsoft-rewards-script-docker` or, omit the detached flag `-d` to view the script output in your terminal.
3. Optionally, change the name of the container by changing `--name netsky` to your preferred container name 2. Run the container with:
4. The container will exit after completing the script, run it again using `docker start netsky`
5. If you are running the container `-d` detached, you can view logs with `docker logs netsky` ```bash
docker run --name netsky -d \
-e TZ=America/New_York \
-e HEADLESS=true \
-e SEARCH_DELAY_MIN=10000 \
-e SEARCH_DELAY_MAX=20000 \
-e CLUSTERS=1 \
-e CRON_START_TIME="0 5,11 * * *" \
microsoft-rewards-script-docker
```
3. Optionally, change any environmental variables other than `HEADLESS`, which must stay `=true`
4. You can view logs with `docker logs netsky`.
### Option 2: use docker compose ### Option 2: use docker compose
1. A basic docker compose.yaml has been provided, which can be run with `docker compose up -d` or, omit the detached flag `-d` to view the script output in your terminal. 1. A basic docker compose.yaml has been provided.
2. The container will exit after completing the script, run it again using `docker start netsky` 2. Optionally, change any environmental variables other than `HEADLESS`, which must stay `=true`
3. If you are running the container `-d` detached, you can view logs with `docker logs netsky` 3. Build or rebuild and start the container using `docker compose up -d --build`
4. You can view logs with `docker logs netsky`
## Config ## ## Config ##
| Setting | Description | Default | | Setting | Description | Default | Docker Environmental Variable |
| :------------- |:-------------| :-----| | :------------- |:-------------| :-----| :-----|
| baseURL | MS Rewards page | `https://rewards.bing.com` | | baseURL | MS Rewards page | `https://rewards.bing.com` | BASE_URL |
| sessionPath | Path to where you want sessions/fingerprints to be stored | `sessions` (In ./browser/sessions) | | sessionPath | Path to where you want sessions/fingerprints to be stored | `sessions` (In ./browser/sessions) | SESSION_PATH |
| headless | If the browser window should be visible be ran in the background | `false` (Browser is visible) | | headless | If the browser window should be visible be ran in the background | `false` (Browser is visible) | HEADLESS *(must be set to `=true` for docker)* |
| runOnZeroPoints | Run the rest of the script if 0 points can be earned | `false` (Will not run on 0 points) | | runOnZeroPoints | Run the rest of the script if 0 points can be earned | `false` (Will not run on 0 points) | RUN_ON_ZERO_POINTS |
| clusters | Amount of instances ran on launch, 1 per account | `1` (Will run 1 account at the time) | | clusters | Amount of instances ran on launch, 1 per account | `1` (Will run 1 account at the time) | CLUSTERS |
| saveFingerprint | Re-use the same fingerprint each time | `false` (Will generate a new fingerprint each time) | | saveFingerprint | Re-use the same fingerprint each time | `false` (Will generate a new fingerprint each time) | SAVE_FINGERPRINT |
| workers.doDailySet | Complete daily set items | `true` | | workers.doDailySet | Complete daily set items | `true` | WORKERS_DO_DAILY_SET |
| workers.doMorePromotions | Complete promotional items | `true` | | workers.doMorePromotions | Complete promotional items | `true` | WORKERS_DO_MORE_PROMOTIONS |
| workers.doPunchCards | Complete punchcards | `true` | | workers.doPunchCards | Complete punchcards | `true` | WORKERS_DO_PUNCH_CARDS |
| workers.doDesktopSearch | Complete daily desktop searches | `true` | | workers.doDesktopSearch | Complete daily desktop searches | `true` | WORKERS_DO_DESKTOP_SEARCH |
| workers.doMobileSearch | Complete daily mobile searches | `true` | | workers.doMobileSearch | Complete daily mobile searches | `true` | WORKERS_DO_MOBILE_SEARCH |
| globalTimeout | The length before the action gets timeout | `30000` (30 seconds) | | globalTimeout | The length before the action gets timeout | `30000` (30 seconds) | GLOBAL_TIMEOUT |
| searchSettings.useGeoLocaleQueries | Generate search queries based on your geo-location | `false` (Uses EN-US generated queries) | | searchSettings.useGeoLocaleQueries | Generate search queries based on your geo-location | `false` (Uses EN-US generated queries) | SEARCH_SETTINGS_USE_GEO_LOCALE_QUERIES |
| scrollRandomResults | Scroll randomly in search results | `true` | | scrollRandomResults | Scroll randomly in search results | `true` | SEARCH_SETTINGS_SCROLL_RANDOM_RESULTS |
| searchSettings.clickRandomResults | Visit random website from search result| `true` | | searchSettings.clickRandomResults | Visit random website from search result| `true` | SEARCH_SETTINGS_CLICK_RANDOM_RESULTS |
| searchSettings.searchDelay | Minimum and maximum time in miliseconds between search queries | `min: 10000` (10 seconds) `max: 20000` (20 seconds) | | searchSettings.searchDelay | Minimum and maximum time in miliseconds between search queries | `min: 10000` (10 seconds) `max: 20000` (20 seconds) | SEARCH_DELAY_MIN SEARCH_DELAY_MAX |
| searchSettings.retryMobileSearch | Keep retrying mobile searches until completed (indefinite)| `false` | | searchSettings.retryMobileSearch | Keep retrying mobile searches until completed (indefinite)| `false` | SEARCH_SETTINGS_RETRY_MOBILE_SEARCH |
| webhook.enabled | Enable or disable your set webhook | `false` | | webhook.enabled | Enable or disable your set webhook | `false` | WEBHOOK_ENABLED |
| webhook.url | Your Discord webhook URL | `null` | | webhook.url | Your Discord webhook URL | `null` | WEBHOOK_URL="" |
| cronStartTime | Scheduled script run-time, *only available for docker implementation* | `0 5,11 * * *` (5:00 am, 11:00 am daily) | CRON_START_TIME="" |
| | Run the script immediately when the Docker container starts | `true` | RUN_ON_START |
## Features ## ## Features ##
- [x] Multi-Account Support - [x] Multi-Account Support
@@ -87,6 +104,8 @@ Under development, however mainly for personal use!
- [ ] Completing Gaming Tab - [ ] Completing Gaming Tab
- [x] Clustering Support - [x] Clustering Support
- [x] Proxy Support - [x] Proxy Support
- [x] Docker Support (experimental)
- [x] Automatic scheduling (via Docker)
## Disclaimer ## ## Disclaimer ##
Your account may be at risk of getting banned or suspended using this script, you've been warned! Your account may be at risk of getting banned or suspended using this script, you've been warned!

View File

@@ -3,6 +3,32 @@ services:
build: . build: .
container_name: netsky container_name: netsky
environment: environment:
- NODE_ENV=production - TZ=America/Toronto #change to your local timezone
- NODE_ENV=production
- HEADLESS=true #do not change
### the following are optional, you only need to include them if you want to enter a custom value, removing them will use the default values
- BASE_URL=https://rewards.bing.com
- SESSION_PATH=sessions
- RUN_ON_ZERO_POINTS=false
- CLUSTERS=1
- SAVE_FINGERPRINT=false
- WORKERS_DO_DAILY_SET=true
- WORKERS_DO_MORE_PROMOTIONS=true
- WORKERS_DO_PUNCH_CARDS=true
- WORKERS_DO_DESKTOP_SEARCH=true
- WORKERS_DO_MOBILE_SEARCH=true
- SEARCH_SETTINGS_USE_GEO_LOCALE_QUERIES=false
- SEARCH_SETTINGS_SCROLL_RANDOM_RESULTS=true
- SEARCH_SETTINGS_CLICK_RANDOM_RESULTS=true
- SEARCH_SETTINGS_SEARCH_DELAY_MIN=10000 # Set the search delay longer, e.g. MIN=180000 and MAX=270000 if you live in a region where MS enforces a search cooldown
- SEARCH_SETTINGS_SEARCH_DELAY_MAX=20000
- SEARCH_SETTINGS_RETRY_MOBILE_SEARCH=true
- WEBHOOK_ENABLED=false
- WEBHOOK_URL=
### Customize your run schedule, default 5:00 am and 11:00 am, use crontab.guru if you're not sure
- CRON_START_TIME=0 5,11 * * *
### Run on start, set as false to only run the script per the cron schedule
- RUN_ON_START=true
restart: unless-stopped
volumes: volumes:
- .:/usr/src/microsoft-rewards-script - .:/usr/src/microsoft-rewards-script

View File

@@ -26,5 +26,6 @@
"webhook": { "webhook": {
"enabled": false, "enabled": false,
"url": "" "url": ""
} },
"cronStartTime": "0 5,11 * * *"
} }

1
src/crontab.template Normal file
View File

@@ -0,0 +1 @@
${CRON_START_TIME} /bin/bash /usr/src/microsoft-rewards-script/src/run_daily.sh >> /var/log/cron.log 2>&1

29
src/run_daily.sh Normal file
View File

@@ -0,0 +1,29 @@
#!/bin/bash
# Set up environment variables
export PATH=$PATH:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
# Change directory to the application directory
cd /usr/src/microsoft-rewards-script
# Define the minimum and maximum wait times in seconds
MINWAIT=$((5*60)) # 5 minutes
MAXWAIT=$((50*60)) # 50 minutes
# Calculate a random sleep time within the specified range
SLEEPTIME=$((MINWAIT + RANDOM % (MAXWAIT - MINWAIT)))
# Convert the sleep time to minutes for logging
SLEEP_MINUTES=$((SLEEPTIME / 60))
# Log the sleep duration
echo "Sleeping for $SLEEP_MINUTES minutes ($SLEEPTIME seconds)..."
# Sleep for the calculated time
sleep $SLEEPTIME
# Log the start of the script
echo "Starting script..."
# Execute the Node.js script directly
npm run start