Changd is a open source web monitoring application for monitoring visual site changes using screenshots, XPath's or API's.

Overview

Docker Automated build

Changd is a open source web monitoring application and a free alternative to ChangeTower.com, Hexowatch.com, and other SaaS-based solutions. Changd can currently be used for automated monitoring visual site changes (screenshots), XPath's or API's.

Changd is developed using Typescript, React and AntD for UI, and the API/backend is written in JS and running on Node.js. I developed Changd because I wanted a free website monitoring solution that I could host locally and have full control over.

Changd has multiple configuration options and screenshots can be stored on Amazon S3 or locally. Notifications can be sent using your own SMTP service or Amazon SES.

Monitoring Use Cases

  • Content is changed on a website
  • Online shopping price changes
  • Get notified when a news article is changed
  • Detect changes in API responses
  • Monitor specific text (via XPath) changes on a website
  • Your website gets defaced, hacked, or changed without your knowledge
  • Monitor your site availability (online or offline)
  • Monitor competitor websites for changes
  • Be sure content is displayed correctly

Features

  • Monitors Visual changes, APIs or HTML XPaths
  • Run using docker, locally or in a scaled node environment
  • Quickly and easily setup new jobs
  • Notify one or multiple email addresses when a condition is met
  • Visual screenshot of website changes via email notifications
  • Notification options for SMTP or Amazon SES Notifications
  • Store screenshots in AWS S3 or Locally
  • Store data in Postgres DB
  • Includes a history of changes
  • Usage charts
  • Supports multiple users
  • Open Source

Changd is an open source alternative to apps like Stillio, ChangeTower, Hexowatch, VisualPing or Wachete.

Getting Started

Prerequisites

Running Locally: Node.js/npm

Or using Docker: Docker

Running from Docker

Running from docker is the quickest and easiet method for testing the application. Clone the repo and run:

git clone https://github.com/paschmann/changd
docker-compose up

Open your browser to http://localhost:80

Create a new account using the "Register" button on the login screen.

Running Locally

Installing

  1. Clone/download the Changd repository or a release
  2. Install npm packages in the frontend and server folders
  3. Set variables in the server/.env (Copy from .env_template)
git clone https://github.com/paschmann/changd
cd changd
cd server
cp .env_template .env
npm install
cd ..
cd frontend
npm install

Running

I suggest opening two terminal windows to run the frontend and the backend, if you want the Cron service to run in the background periodically, you will need a third terminal as well.

cd server
npm run dev
cd ..
cd frontend
npm start

Optional:

cd server
npm run crondev

Once running, your web application frontend should be available on http://localhost:3000, the API/backend should be available on http://localhost:8000. The frontend API calls will be proxied to port 8000 using the proxy referenced in the frontend/package.json file.

License

This project is licensed under the MIT License - see the license file for details

Comments
  • Amount of change

    Amount of change

    Would it be possible to use a percentage for the amount of change instead of Small, Medium, Major? Also is it possible to show the percentage of change in the job history to allow easier adjustments of the threshold percentage?

    My main goal is to track packages via various couriers and some are only tiny changes to the site such as "Onboard for delivery" becomes "Delivered in full" with most other elements not changing. Small changes does not alert for this.

    opened by bradhawkins85 3
  • Screenshot type error

    Screenshot type error

    I added a line - ./data/screenshots:/app/screenshots to docker compose in API to fix the folder access/crate issue but now I am getting type error...

    Unable to get website screenshot: TypeError [ERR_INVALID_ARG_TYPE]: The "data" argument must be of type string or an instance of Buffer, TypedArray, or DataView. Received an instance of Sharp
    
    opened by PovilasID 2
  • unable to create screenshot (no such file or directory, mkdir 'screenshots/1/')

    unable to create screenshot (no such file or directory, mkdir 'screenshots/1/')

    After fresh install and adding visual test I get an error message when run / test. Probably because mkdir 'screenshots/1/ fails.

    Maybe a permission issue? Can I pass on UID/GUID environment variables to the api docker container?

    Related: should / can I mount a folder in my docker-compose that is to be used for screenshots?

    changd-api  | Unable to get website screenshot: Error: ENOENT: no such file or directory, mkdir 'screenshots/1/'
    changd-api  | Unable to capture screenshot
    changd-api  | Error: Image unable to be captured or differences detected.
    changd-api  | Error: ENOENT: no such file or directory, unlink './screenshots/1/a8y2s_diff.png'
    changd-api  |     at Object.unlinkSync (fs.js:1210:3)
    changd-api  |     at Object.deleteFile (/app/db/file_handler.js:78:8)
    changd-api  |     at executeVisualJob (/app/db/job_daemon.js:504:19)
    changd-api  |     at processTicksAndRejections (internal/process/task_queues.js:93:5)
    changd-api  |     at async /app/db/job_daemon.js:165:9 {
    changd-api  |   errno: -2,
    changd-api  |   syscall: 'unlink',
    changd-api  |   code: 'ENOENT',
    changd-api  |   path: './screenshots/1/a8y2s_diff.png'
    changd-api  | }
    changd-api  | Error: ENOENT: no such file or directory, unlink './screenshots/1/a8y2s.png'
    changd-api  |     at Object.unlinkSync (fs.js:1210:3)
    changd-api  |     at Object.deleteFile (/app/db/file_handler.js:78:8)
    changd-api  |     at executeVisualJob (/app/db/job_daemon.js:505:19)
    changd-api  |     at processTicksAndRejections (internal/process/task_queues.js:93:5)
    changd-api  |     at async /app/db/job_daemon.js:165:9 {
    changd-api  |   errno: -2,
    changd-api  |   syscall: 'unlink',
    changd-api  |   code: 'ENOENT',
    changd-api  |   path: './screenshots/1/a8y2s.png'
    changd-api  | }
    
    opened by wivaku 2
  • Unsupported version in docker-compose.yml

    Unsupported version in docker-compose.yml

    I wanted to give changd a test drive, but I ran problems when trying to boot it up.

    I get this error message when I do docker-compose up

    ERROR: Version in "./docker-compose.yml" is unsupported. You might be seeing this error because you're using the wrong Compose file version. Either specify a supported version (e.g "2.2" or "3.3") and place your service definitions under the `services` key, or omit the `version` key and place your service definitions at the root of the file to use version 1.
    For more on the Compose file format versions, see https://docs.docker.com/compose/compose-file/
    

    My environment is WSL2 on Windows 10. Docker version 19.03.8, build afacb8b7f0 docker-compose version 1.25.4, build 8d51620a Docker Desktop 4.4.3 (73365) is currently the newest version available.

    opened by kerbe 2
  • small changes (5%) -> saved as

    small changes (5%) -> saved as "medium change" (10%)

    When I create a new visual job, I select the default small changes (which I believe uses value 5). After saving it shows medium changes and when editing it shows value 10.

    opened by wivaku 1
  • Error: Cannot find module './db/job_daemon'

    Error: Cannot find module './db/job_daemon'

    I tried downgrading docker-compose.yml version to 3.7, which allowed docker-compose up to be ran. However, there are problems with database initialization. Here is error log from console:

    Starting changd_db_1 ... done
    Starting changd_api_1 ... done
    Starting changd_ui_server_1 ... done
    Attaching to changd_db_1, changd_api_1, changd_ui_server_1
    api_1        | 2022-01-17T08:57:03: PM2 log: Launching in no daemon mode
    api_1        | 2022-01-17T08:57:03: PM2 log: App [api:0] starting in -fork mode-
    api_1        | 2022-01-17T08:57:03: PM2 log: App [cron:1] starting in -fork mode-
    db_1         |
    db_1         | PostgreSQL Database directory appears to contain a database; Skipping initialization
    db_1         |             
    api_1        | 2022-01-17T08:57:03: PM2 log: App [api:0] online
    api_1        | 2022-01-17T08:57:03: PM2 log: App [cron:1] online
    db_1         | 2022-01-17 08:57:02.598 UTC [1] LOG:  starting PostgreSQL 13.1 on x86_64-pc-linux-musl, compiled by gcc (Alpine 10.2.1_pre1) 10.2.1 20201203, 64-bit
    db_1         | 2022-01-17 08:57:02.598 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
    db_1         | 2022-01-17 08:57:02.598 UTC [1] LOG:  listening on IPv6 address "::", port 5432
    api_1        | Error: Cannot find module './db/job_daemon'
    api_1        | Require stack:
    api_1        | - /app/cron.js                                
    api_1        |     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:61:29)
    api_1        |     at require (internal/modules/cjs/helpers.js:88:18)
    api_1        |     at Object.<anonymous> (/app/cron.js:5:18)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30)
    api_1        |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    api_1        |     at Module.load (internal/modules/cjs/loader.js:928:32)
    api_1        |     at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    api_1        |     at Object.<anonymous> (/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js:33:23)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30) {
    api_1        |   code: 'MODULE_NOT_FOUND',
    api_1        |   requireStack: [ '/app/cron.js' ]
    api_1        | }                                              
    db_1         | 2022-01-17 08:57:02.604 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
    ui_server_1  | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
    ui_server_1  | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
    api_1        | 2022-01-17T08:57:03: PM2 log: App [cron:1] exited with code [1] via signal [SIGINT]
    api_1        | 2022-01-17T08:57:03: PM2 log: App [cron:1] starting in -fork mode-
    db_1         | 2022-01-17 08:57:02.610 UTC [21] LOG:  database system was shut down at 2022-01-17 08:56:55 UTC
    api_1        | 2022-01-17T08:57:03: PM2 log: App [cron:1] online
    db_1         | 2022-01-17 08:57:02.614 UTC [1] LOG:  database system is ready to accept connections
    ui_server_1  | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
    ui_server_1  | 10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf
    ui_server_1  | 10-listen-on-ipv6-by-default.sh: error: /etc/nginx/conf.d/default.conf differs from the packaged version
    ui_server_1  | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
    ui_server_1  | /docker-entrypoint.sh: Configuration complete; ready for start up
    api_1        | Error: Cannot find module '../db/users'        
    api_1        | Require stack:                                 
    api_1        | - /app/routes/index.js 
    api_1        | - /app/server.js
    api_1        |     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:61:29)
    api_1        |     at require (internal/modules/cjs/helpers.js:88:18)
    api_1        |     at Object.<anonymous> (/app/routes/index.js:5:13)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30)
    api_1        |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    api_1        |     at Module.load (internal/modules/cjs/loader.js:928:32)
    api_1        |     at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    api_1        |     at Module.require (internal/modules/cjs/loader.js:952:19)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:80:39) {
    api_1        |   code: 'MODULE_NOT_FOUND',                    
    api_1        |   requireStack: [ '/app/routes/index.js', '/app/server.js' ]
    api_1        | }
    api_1        | Error: Cannot find module './db/job_daemon'    
    api_1        | Require stack:                                 
    api_1        | - /app/cron.js
    api_1        |     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:61:29)
    api_1        |     at require (internal/modules/cjs/helpers.js:88:18)
    api_1        |     at Object.<anonymous> (/app/cron.js:5:18)  
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30)
    api_1        |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    api_1        |     at Module.load (internal/modules/cjs/loader.js:928:32)
    api_1        |     at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    api_1        |     at Object.<anonymous> (/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js:33:23)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30) {
    api_1        |   code: 'MODULE_NOT_FOUND',                    
    api_1        |   requireStack: [ '/app/cron.js' ]            
    api_1        | }
    api_1        | 2022-01-17T08:57:04: PM2 log: App [api:0] exited with code [1] via signal [SIGINT]
    api_1        | 2022-01-17T08:57:04: PM2 log: App [cron:1] exited with code [1] via signal [SIGINT]
    api_1        | 2022-01-17T08:57:04: PM2 log: App [api:0] starting in -fork mode-
    api_1        | 2022-01-17T08:57:04: PM2 log: App [cron:1] starting in -fork mode-
    api_1        | 2022-01-17T08:57:04: PM2 log: App [api:0] online
    api_1        | 2022-01-17T08:57:04: PM2 log: App [cron:1] online
    api_1        | Error: Cannot find module './db/job_daemon'
    api_1        | Require stack:                                 
    api_1        | - /app/cron.js                                 
    api_1        |     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:61:29)
    api_1        |     at require (internal/modules/cjs/helpers.js:88:18)
    api_1        |     at Object.<anonymous> (/app/cron.js:5:18)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30)
    api_1        |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    api_1        |     at Module.load (internal/modules/cjs/loader.js:928:32)
    api_1        |     at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    api_1        |     at Object.<anonymous> (/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js:33:23)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30) {
    api_1        |   code: 'MODULE_NOT_FOUND',
    api_1        |   requireStack: [ '/app/cron.js' ]             
    api_1        | }
    api_1        | 2022-01-17T08:57:04: PM2 log: App [cron:1] exited with code [1] via signal [SIGINT]
    api_1        | 2022-01-17T08:57:04: PM2 log: App [cron:1] starting in -fork mode-
    api_1        | 2022-01-17T08:57:04: PM2 log: App [cron:1] online
    api_1        | Error: Cannot find module './db/job_daemon'
    api_1        | Require stack:                                 
    api_1        | - /app/cron.js
    api_1        |     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:61:29)
    api_1        |     at require (internal/modules/cjs/helpers.js:88:18)
    api_1        |     at Object.<anonymous> (/app/cron.js:5:18)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30)
    api_1        |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    api_1        |     at Module.load (internal/modules/cjs/loader.js:928:32)
    api_1        |     at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    api_1        |     at Object.<anonymous> (/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js:33:23)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30) {
    api_1        |   code: 'MODULE_NOT_FOUND',                    
    api_1        |   requireStack: [ '/app/cron.js' ]
    api_1        | }
    api_1        | 2022-01-17T08:57:04: PM2 log: App [cron:1] exited with code [1] via signal [SIGINT]
    api_1        | 2022-01-17T08:57:04: PM2 log: App [cron:1] starting in -fork mode-
    api_1        | 2022-01-17T08:57:04: PM2 log: App [cron:1] online
    api_1        | Error: Cannot find module '../db/users'
    api_1        | Require stack:                                 
    api_1        | - /app/routes/index.js                         
    api_1        | - /app/server.js
    api_1        |     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:61:29)
    api_1        |     at require (internal/modules/cjs/helpers.js:88:18)
    api_1        |     at Object.<anonymous> (/app/routes/index.js:5:13)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30)
    api_1        |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    api_1        |     at Module.load (internal/modules/cjs/loader.js:928:32)
    api_1        |     at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    api_1        |     at Module.require (internal/modules/cjs/loader.js:952:19)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:80:39) {
    api_1        |   code: 'MODULE_NOT_FOUND',                    
    api_1        |   requireStack: [ '/app/routes/index.js', '/app/server.js' ]
    api_1        | }
    api_1        | 2022-01-17T08:57:04: PM2 log: App [api:0] exited with code [1] via signal [SIGINT]
    api_1        | 2022-01-17T08:57:04: PM2 log: App [api:0] starting in -fork mode-
    api_1        | 2022-01-17T08:57:04: PM2 log: App [api:0] online
    api_1        | Error: Cannot find module './db/job_daemon'
    api_1        | Require stack:                                 
    api_1        | - /app/cron.js
    api_1        |     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:61:29)
    api_1        |     at require (internal/modules/cjs/helpers.js:88:18)
    api_1        |     at Object.<anonymous> (/app/cron.js:5:18)  
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30)
    api_1        |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    api_1        |     at Module.load (internal/modules/cjs/loader.js:928:32)
    api_1        |     at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    api_1        |     at Object.<anonymous> (/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js:33:23)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30) {
    api_1        |   code: 'MODULE_NOT_FOUND',                    
    api_1        |   requireStack: [ '/app/cron.js' ]             
    api_1        | }
    api_1        | 2022-01-17T08:57:04: PM2 log: App [cron:1] exited with code [1] via signal [SIGINT]
    api_1        | 2022-01-17T08:57:04: PM2 log: App [cron:1] starting in -fork mode-
    api_1        | 2022-01-17T08:57:04: PM2 log: App [cron:1] online
    api_1        | Error: Cannot find module './db/job_daemon'
    api_1        | Require stack:                                 
    api_1        | - /app/cron.js                               
    api_1        |     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:61:29)
    api_1        |     at require (internal/modules/cjs/helpers.js:88:18)
    api_1        |     at Object.<anonymous> (/app/cron.js:5:18)  
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30)
    api_1        |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    api_1        |     at Module.load (internal/modules/cjs/loader.js:928:32)
    api_1        |     at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    api_1        |     at Object.<anonymous> (/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js:33:23)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30) {
    api_1        |   code: 'MODULE_NOT_FOUND',
    api_1        |   requireStack: [ '/app/cron.js' ]             
    api_1        | }                                              
    api_1        | 2022-01-17T08:57:04: PM2 log: App [cron:1] exited with code [1] via signal [SIGINT]
    api_1        | 2022-01-17T08:57:04: PM2 log: App [cron:1] starting in -fork mode-
    api_1        | 2022-01-17T08:57:04: PM2 log: App [cron:1] online
    api_1        | Error: Cannot find module '../db/users'
    api_1        | Require stack:                                
    api_1        | - /app/routes/index.js                         
    api_1        | - /app/server.js
    api_1        |     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:61:29)
    api_1        |     at require (internal/modules/cjs/helpers.js:88:18)
    api_1        |     at Object.<anonymous> (/app/routes/index.js:5:13)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30)
    api_1        |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    api_1        |     at Module.load (internal/modules/cjs/loader.js:928:32)
    api_1        |     at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    api_1        |     at Module.require (internal/modules/cjs/loader.js:952:19)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:80:39) {
    api_1        |   code: 'MODULE_NOT_FOUND',
    api_1        |   requireStack: [ '/app/routes/index.js', '/app/server.js' ]
    api_1        | }                                              
    api_1        | 2022-01-17T08:57:05: PM2 log: App [api:0] exited with code [1] via signal [SIGINT]
    api_1        | 2022-01-17T08:57:05: PM2 log: App [api:0] starting in -fork mode-
    api_1        | 2022-01-17T08:57:05: PM2 log: App [api:0] online
    api_1        | Error: Cannot find module './db/job_daemon'
    api_1        | Require stack:                                 
    api_1        | - /app/cron.js
    api_1        |     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:61:29)
    api_1        |     at require (internal/modules/cjs/helpers.js:88:18)
    api_1        |     at Object.<anonymous> (/app/cron.js:5:18)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30)
    api_1        |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    api_1        |     at Module.load (internal/modules/cjs/loader.js:928:32)
    api_1        |     at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    api_1        |     at Object.<anonymous> (/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js:33:23)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30) {
    api_1        |   code: 'MODULE_NOT_FOUND',
    api_1        |   requireStack: [ '/app/cron.js' ]            
    api_1        | }                                              
    api_1        | 2022-01-17T08:57:05: PM2 log: App [cron:1] exited with code [1] via signal [SIGINT]
    api_1        | 2022-01-17T08:57:05: PM2 log: App [cron:1] starting in -fork mode-
    api_1        | 2022-01-17T08:57:05: PM2 log: App [cron:1] online
    api_1        | Error: Cannot find module './db/job_daemon'
    api_1        | Require stack:                                 
    api_1        | - /app/cron.js
    api_1        |     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:61:29)
    api_1        |     at require (internal/modules/cjs/helpers.js:88:18)
    api_1        |     at Object.<anonymous> (/app/cron.js:5:18)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30)
    api_1        |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    api_1        |     at Module.load (internal/modules/cjs/loader.js:928:32)
    api_1        |     at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    api_1        |     at Object.<anonymous> (/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js:33:23)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30) {
    api_1        |   code: 'MODULE_NOT_FOUND',
    api_1        |   requireStack: [ '/app/cron.js' ]
    api_1        | }                                              
    api_1        | 2022-01-17T08:57:05: PM2 log: App [cron:1] exited with code [1] via signal [SIGINT]
    api_1        | 2022-01-17T08:57:05: PM2 log: App [cron:1] starting in -fork mode-
    api_1        | 2022-01-17T08:57:05: PM2 log: App [cron:1] online
    api_1        | Error: Cannot find module '../db/users'        
    api_1        | Require stack:
    api_1        | - /app/routes/index.js                         
    api_1        | - /app/server.js
    api_1        |     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:61:29)
    api_1        |     at require (internal/modules/cjs/helpers.js:88:18)
    api_1        |     at Object.<anonymous> (/app/routes/index.js:5:13)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30)
    api_1        |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    api_1        |     at Module.load (internal/modules/cjs/loader.js:928:32)
    api_1        |     at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    api_1        |     at Module.require (internal/modules/cjs/loader.js:952:19)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:80:39) {
    api_1        |   code: 'MODULE_NOT_FOUND',
    api_1        |   requireStack: [ '/app/routes/index.js', '/app/server.js' ]
    api_1        | }
    api_1        | 2022-01-17T08:57:05: PM2 log: App [api:0] exited with code [1] via signal [SIGINT]
    api_1        | 2022-01-17T08:57:05: PM2 log: App [api:0] starting in -fork mode-
    api_1        | 2022-01-17T08:57:05: PM2 log: App [api:0] online
    api_1        | Error: Cannot find module './db/job_daemon'    
    api_1        | Require stack:                                 
    api_1        | - /app/cron.js
    api_1        |     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:61:29)
    api_1        |     at require (internal/modules/cjs/helpers.js:88:18)
    api_1        |     at Object.<anonymous> (/app/cron.js:5:18)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30)
    api_1        |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    api_1        |     at Module.load (internal/modules/cjs/loader.js:928:32)
    api_1        |     at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    api_1        |     at Object.<anonymous> (/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js:33:23)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30) {
    api_1        |   code: 'MODULE_NOT_FOUND',
    api_1        |   requireStack: [ '/app/cron.js' ]             
    api_1        | }
    api_1        | 2022-01-17T08:57:05: PM2 log: App [cron:1] exited with code [1] via signal [SIGINT]
    api_1        | 2022-01-17T08:57:05: PM2 log: App [cron:1] starting in -fork mode-
    api_1        | 2022-01-17T08:57:05: PM2 log: App [cron:1] online
    api_1        | Error: Cannot find module './db/job_daemon'    
    api_1        | Require stack:                                 
    api_1        | - /app/cron.js
    api_1        |     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:61:29)
    api_1        |     at require (internal/modules/cjs/helpers.js:88:18)
    api_1        |     at Object.<anonymous> (/app/cron.js:5:18)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30)
    api_1        |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    api_1        |     at Module.load (internal/modules/cjs/loader.js:928:32)
    api_1        |     at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    api_1        |     at Object.<anonymous> (/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js:33:23)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30) {
    api_1        |   code: 'MODULE_NOT_FOUND',                    
    api_1        |   requireStack: [ '/app/cron.js' ] 
    api_1        | }                   
    api_1        | 2022-01-17T08:57:05: PM2 log: App [cron:1] exited with code [1] via signal [SIGINT]
    api_1        | 2022-01-17T08:57:05: PM2 log: App [cron:1] starting in -fork mode-
    api_1        | 2022-01-17T08:57:05: PM2 log: App [cron:1] online
    api_1        | Error: Cannot find module '../db/users'
    api_1        | Require stack:                                 
    api_1        | - /app/routes/index.js                         
    api_1        | - /app/server.js                               
    api_1        |     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:61:29)
    api_1        |     at require (internal/modules/cjs/helpers.js:88:18)
    api_1        |     at Object.<anonymous> (/app/routes/index.js:5:13)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30)
    api_1        |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    api_1        |     at Module.load (internal/modules/cjs/loader.js:928:32)
    api_1        |     at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    api_1        |     at Module.require (internal/modules/cjs/loader.js:952:19)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:80:39) {
    api_1        |   code: 'MODULE_NOT_FOUND',                    
    api_1        |   requireStack: [ '/app/routes/index.js', '/app/server.js' ]
    api_1        | }
    api_1        | 2022-01-17T08:57:05: PM2 log: App [api:0] exited with code [1] via signal [SIGINT]
    api_1        | 2022-01-17T08:57:05: PM2 log: App [api:0] starting in -fork mode-
    api_1        | 2022-01-17T08:57:05: PM2 log: App [api:0] online
    api_1        | Error: Cannot find module './db/job_daemon'
    api_1        | Require stack:                                 
    api_1        | - /app/cron.js                                 
    api_1        |     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:61:29)
    api_1        |     at require (internal/modules/cjs/helpers.js:88:18)
    api_1        |     at Object.<anonymous> (/app/cron.js:5:18)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30)
    api_1        |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    api_1        |     at Module.load (internal/modules/cjs/loader.js:928:32)
    api_1        |     at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    api_1        |     at Object.<anonymous> (/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js:33:23)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30) {
    api_1        |   code: 'MODULE_NOT_FOUND',                    
    api_1        |   requireStack: [ '/app/cron.js' ]            
    api_1        | }                                          
    api_1        | 2022-01-17T08:57:05: PM2 log: App [cron:1] exited with code [1] via signal [SIGINT]
    api_1        | 2022-01-17T08:57:05: PM2 log: App [cron:1] starting in -fork mode-
    api_1        | 2022-01-17T08:57:05: PM2 log: App [cron:1] online
    api_1        | Error: Cannot find module './db/job_daemon'
    api_1        | Require stack:                                
    api_1        | - /app/cron.js                                 
    api_1        |     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:61:29)
    api_1        |     at require (internal/modules/cjs/helpers.js:88:18)
    api_1        |     at Object.<anonymous> (/app/cron.js:5:18)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30)
    api_1        |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    api_1        |     at Module.load (internal/modules/cjs/loader.js:928:32)
    api_1        |     at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    api_1        |     at Object.<anonymous> (/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js:33:23)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30) {
    api_1        |   code: 'MODULE_NOT_FOUND',
    api_1        |   requireStack: [ '/app/cron.js' ]
    api_1        | }                                              
    api_1        | 2022-01-17T08:57:06: PM2 log: App [cron:1] exited with code [1] via signal [SIGINT]
    api_1        | 2022-01-17T08:57:06: PM2 log: App [cron:1] starting in -fork mode-
    api_1        | 2022-01-17T08:57:06: PM2 log: App [cron:1] online
    api_1        | Error: Cannot find module '../db/users'
    api_1        | Require stack:
    api_1        | - /app/routes/index.js                         
    api_1        | - /app/server.js
    api_1        |     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:61:29)
    api_1        |     at require (internal/modules/cjs/helpers.js:88:18)
    api_1        |     at Object.<anonymous> (/app/routes/index.js:5:13)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30)
    api_1        |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    api_1        |     at Module.load (internal/modules/cjs/loader.js:928:32)
    api_1        |     at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    api_1        |     at Module.require (internal/modules/cjs/loader.js:952:19)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:80:39) {
    api_1        |   code: 'MODULE_NOT_FOUND',
    api_1        |   requireStack: [ '/app/routes/index.js', '/app/server.js' ]
    api_1        | }           
    api_1        | 2022-01-17T08:57:06: PM2 log: App [api:0] exited with code [1] via signal [SIGINT]
    api_1        | 2022-01-17T08:57:06: PM2 log: App [api:0] starting in -fork mode-
    api_1        | 2022-01-17T08:57:06: PM2 log: App [api:0] online
    api_1        | Error: Cannot find module './db/job_daemon'
    api_1        | Require stack:
    api_1        | - /app/cron.js
    api_1        |     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:61:29)
    api_1        |     at require (internal/modules/cjs/helpers.js:88:18)
    api_1        |     at Object.<anonymous> (/app/cron.js:5:18)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30)
    api_1        |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    api_1        |     at Module.load (internal/modules/cjs/loader.js:928:32)
    api_1        |     at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    api_1        |     at Object.<anonymous> (/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js:33:23)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30) {
    api_1        |   code: 'MODULE_NOT_FOUND',
    api_1        |   requireStack: [ '/app/cron.js' ]
    api_1        | }
    api_1        | 2022-01-17T08:57:06: PM2 log: App [cron:1] exited with code [1] via signal [SIGINT]
    api_1        | 2022-01-17T08:57:06: PM2 log: App [cron:1] starting in -fork mode-
    api_1        | 2022-01-17T08:57:06: PM2 log: App [cron:1] online
    api_1        | Error: Cannot find module './db/job_daemon'
    api_1        | Require stack:
    api_1        | - /app/cron.js
    api_1        |     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:61:29)
    api_1        |     at require (internal/modules/cjs/helpers.js:88:18)
    api_1        |     at Object.<anonymous> (/app/cron.js:5:18)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30)
    api_1        |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    api_1        |     at Module.load (internal/modules/cjs/loader.js:928:32)
    api_1        |     at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    api_1        |     at Object.<anonymous> (/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js:33:23)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30) {
    api_1        |   code: 'MODULE_NOT_FOUND',
    api_1        |   requireStack: [ '/app/cron.js' ]
    api_1        | }
    api_1        | 2022-01-17T08:57:06: PM2 log: App [cron:1] exited with code [1] via signal [SIGINT]
    api_1        | 2022-01-17T08:57:06: PM2 log: App [cron:1] starting in -fork mode-
    api_1        | 2022-01-17T08:57:06: PM2 log: App [cron:1] online
    api_1        | Error: Cannot find module '../db/users'
    api_1        | Require stack:
    api_1        | - /app/routes/index.js
    api_1        | - /app/server.js
    api_1        |     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:61:29)
    api_1        |     at require (internal/modules/cjs/helpers.js:88:18)
    api_1        |     at Object.<anonymous> (/app/routes/index.js:5:13)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30)
    api_1        |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    api_1        |     at Module.load (internal/modules/cjs/loader.js:928:32)
    api_1        |     at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    api_1        |     at Module.require (internal/modules/cjs/loader.js:952:19)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:80:39) {
    api_1        |   code: 'MODULE_NOT_FOUND',
    api_1        |   requireStack: [ '/app/routes/index.js', '/app/server.js' ]
    api_1        | }
    api_1        | 2022-01-17T08:57:06: PM2 log: App [api:0] exited with code [1] via signal [SIGINT]
    api_1        | 2022-01-17T08:57:06: PM2 log: App [api:0] starting in -fork mode-
    api_1        | 2022-01-17T08:57:06: PM2 log: App [api:0] online
    api_1        | Error: Cannot find module './db/job_daemon'
    api_1        | Require stack:
    api_1        | - /app/cron.js
    api_1        |     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:61:29)
    api_1        |     at require (internal/modules/cjs/helpers.js:88:18)
    api_1        |     at Object.<anonymous> (/app/cron.js:5:18)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30)
    api_1        |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    api_1        |     at Module.load (internal/modules/cjs/loader.js:928:32)
    api_1        |     at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    api_1        |     at Object.<anonymous> (/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js:33:23)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30) {
    api_1        |   code: 'MODULE_NOT_FOUND',
    api_1        |   requireStack: [ '/app/cron.js' ]
    api_1        | }
    api_1        | 2022-01-17T08:57:06: PM2 log: App [cron:1] exited with code [1] via signal [SIGINT]
    api_1        | 2022-01-17T08:57:06: PM2 log: App [cron:1] starting in -fork mode-
    api_1        | 2022-01-17T08:57:06: PM2 log: App [cron:1] online
    api_1        | Error: Cannot find module './db/job_daemon'
    api_1        | Require stack:
    api_1        | - /app/cron.js
    api_1        |     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:61:29)
    api_1        |     at require (internal/modules/cjs/helpers.js:88:18)
    api_1        |     at Object.<anonymous> (/app/cron.js:5:18)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30)
    api_1        |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    api_1        |     at Module.load (internal/modules/cjs/loader.js:928:32)                                                                                                  
    api_1        |     at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    api_1        |     at Object.<anonymous> (/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js:33:23)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30) {
    api_1        |   code: 'MODULE_NOT_FOUND',
    api_1        |   requireStack: [ '/app/cron.js' ]
    api_1        | }
    api_1        | 2022-01-17T08:57:06: PM2 log: App [cron:1] exited with code [1] via signal [SIGINT]
    api_1        | 2022-01-17T08:57:06: PM2 log: Script /app/cron.js had too many unstable restarts (16). Stopped. "errored"
    api_1        | Error: Cannot find module '../db/users'
    api_1        | Require stack:
    api_1        | - /app/routes/index.js
    api_1        | - /app/server.js
    api_1        |     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:61:29)
    api_1        |     at require (internal/modules/cjs/helpers.js:88:18)
    api_1        |     at Object.<anonymous> (/app/routes/index.js:5:13)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30)
    api_1        |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    api_1        |     at Module.load (internal/modules/cjs/loader.js:928:32)
    api_1        |     at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    api_1        |     at Module.require (internal/modules/cjs/loader.js:952:19)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:80:39) {
    api_1        |   code: 'MODULE_NOT_FOUND',
    api_1        |   requireStack: [ '/app/routes/index.js', '/app/server.js' ]
    api_1        | }
    api_1        | 2022-01-17T08:57:07: PM2 log: App [api:0] exited with code [1] via signal [SIGINT]
    api_1        | 2022-01-17T08:57:07: PM2 log: App [api:0] starting in -fork mode-
    api_1        | 2022-01-17T08:57:07: PM2 log: App [api:0] online
    api_1        | Error: Cannot find module '../db/users'
    api_1        | Require stack:
    api_1        | - /app/routes/index.js
    api_1        | - /app/server.js
    api_1        |     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:61:29)
    api_1        |     at require (internal/modules/cjs/helpers.js:88:18)
    api_1        |     at Object.<anonymous> (/app/routes/index.js:5:13)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30)
    api_1        |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    api_1        |     at Module.load (internal/modules/cjs/loader.js:928:32)
    api_1        |     at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    api_1        |     at Module.require (internal/modules/cjs/loader.js:952:19)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:80:39) {
    api_1        |   code: 'MODULE_NOT_FOUND',
    api_1        |   requireStack: [ '/app/routes/index.js', '/app/server.js' ]
    api_1        | }
    api_1        | 2022-01-17T08:57:07: PM2 log: App [api:0] exited with code [1] via signal [SIGINT]
    api_1        | 2022-01-17T08:57:07: PM2 log: App [api:0] starting in -fork mode-
    api_1        | 2022-01-17T08:57:07: PM2 log: App [api:0] online
    api_1        | Error: Cannot find module '../db/users'
    api_1        | Require stack:
    api_1        | - /app/routes/index.js
    api_1        | - /app/server.js
    api_1        |     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:61:29)
    api_1        |     at require (internal/modules/cjs/helpers.js:88:18)
    api_1        |     at Object.<anonymous> (/app/routes/index.js:5:13)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30)
    api_1        |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    api_1        |     at Module.load (internal/modules/cjs/loader.js:928:32)
    api_1        |     at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    api_1        |     at Module.require (internal/modules/cjs/loader.js:952:19)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:80:39) {
    api_1        |   code: 'MODULE_NOT_FOUND',
    api_1        |   requireStack: [ '/app/routes/index.js', '/app/server.js' ]
    api_1        | }            
    api_1        | 2022-01-17T08:57:07: PM2 log: App [api:0] exited with code [1] via signal [SIGINT]
    api_1        | 2022-01-17T08:57:07: PM2 log: App [api:0] starting in -fork mode-
    api_1        | 2022-01-17T08:57:07: PM2 log: App [api:0] online
    api_1        | Error: Cannot find module '../db/users'
    api_1        | Require stack:
    api_1        | - /app/routes/index.js
    api_1        | - /app/server.js
    api_1        |     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:61:29)
    api_1        |     at require (internal/modules/cjs/helpers.js:88:18)
    api_1        |     at Object.<anonymous> (/app/routes/index.js:5:13)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30)
    api_1        |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    api_1        |     at Module.load (internal/modules/cjs/loader.js:928:32)
    api_1        |     at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    api_1        |     at Module.require (internal/modules/cjs/loader.js:952:19)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:80:39) {
    api_1        |   code: 'MODULE_NOT_FOUND',
    api_1        |   requireStack: [ '/app/routes/index.js', '/app/server.js' ]
    api_1        | }
    api_1        | 2022-01-17T08:57:08: PM2 log: App [api:0] exited with code [1] via signal [SIGINT]
    api_1        | 2022-01-17T08:57:08: PM2 log: App [api:0] starting in -fork mode-
    api_1        | 2022-01-17T08:57:08: PM2 log: App [api:0] online
    api_1        | Error: Cannot find module '../db/users'
    api_1        | Require stack:
    api_1        | - /app/routes/index.js
    api_1        | - /app/server.js
    api_1        |     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:61:29)
    api_1        |     at require (internal/modules/cjs/helpers.js:88:18)
    api_1        |     at Object.<anonymous> (/app/routes/index.js:5:13)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30)
    api_1        |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    api_1        |     at Module.load (internal/modules/cjs/loader.js:928:32)
    api_1        |     at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    api_1        |     at Module.require (internal/modules/cjs/loader.js:952:19)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:80:39) {
    api_1        |   code: 'MODULE_NOT_FOUND',
    api_1        |   requireStack: [ '/app/routes/index.js', '/app/server.js' ]
    api_1        | }
    api_1        | 2022-01-17T08:57:08: PM2 log: App [api:0] exited with code [1] via signal [SIGINT]
    api_1        | 2022-01-17T08:57:08: PM2 log: App [api:0] starting in -fork mode-
    api_1        | 2022-01-17T08:57:08: PM2 log: App [api:0] online
    api_1        | Error: Cannot find module '../db/users'
    api_1        | Require stack:
    api_1        | - /app/routes/index.js
    api_1        | - /app/server.js
    api_1        |     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:61:29)
    api_1        |     at require (internal/modules/cjs/helpers.js:88:18)
    api_1        |     at Object.<anonymous> (/app/routes/index.js:5:13)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30)
    api_1        |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    api_1        |     at Module.load (internal/modules/cjs/loader.js:928:32)
    api_1        |     at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    api_1        |     at Module.require (internal/modules/cjs/loader.js:952:19)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:80:39) {
    api_1        |   code: 'MODULE_NOT_FOUND',
    api_1        |   requireStack: [ '/app/routes/index.js', '/app/server.js' ]
    api_1        | }
    api_1        | 2022-01-17T08:57:09: PM2 log: App [api:0] exited with code [1] via signal [SIGINT]
    api_1        | 2022-01-17T08:57:09: PM2 log: App [api:0] starting in -fork mode-
    api_1        | 2022-01-17T08:57:09: PM2 log: App [api:0] online
    api_1        | Error: Cannot find module '../db/users'
    api_1        | Require stack:
    api_1        | - /app/routes/index.js
    api_1        | - /app/server.js
    api_1        |     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:61:29)
    api_1        |     at require (internal/modules/cjs/helpers.js:88:18)
    api_1        |     at Object.<anonymous> (/app/routes/index.js:5:13)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30)
    api_1        |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    api_1        |     at Module.load (internal/modules/cjs/loader.js:928:32)
    api_1        |     at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    api_1        |     at Module.require (internal/modules/cjs/loader.js:952:19)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:80:39) {
    api_1        |   code: 'MODULE_NOT_FOUND',
    api_1        |   requireStack: [ '/app/routes/index.js', '/app/server.js' ]
    api_1        | }
    api_1        | 2022-01-17T08:57:09: PM2 log: App [api:0] exited with code [1] via signal [SIGINT]
    api_1        | 2022-01-17T08:57:09: PM2 log: App [api:0] starting in -fork mode-
    api_1        | 2022-01-17T08:57:09: PM2 log: App [api:0] online
    api_1        | Error: Cannot find module '../db/users'
    api_1        | Require stack:
    api_1        | - /app/routes/index.js
    api_1        | - /app/server.js
    api_1        |     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:61:29)
    api_1        |     at require (internal/modules/cjs/helpers.js:88:18)
    api_1        |     at Object.<anonymous> (/app/routes/index.js:5:13)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30)
    api_1        |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    api_1        |     at Module.load (internal/modules/cjs/loader.js:928:32)
    api_1        |     at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    api_1        |     at Module.require (internal/modules/cjs/loader.js:952:19)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:80:39) {
    api_1        |   code: 'MODULE_NOT_FOUND',
    api_1        |   requireStack: [ '/app/routes/index.js', '/app/server.js' ]
    api_1        | }
    api_1        | 2022-01-17T08:57:09: PM2 log: App [api:0] exited with code [1] via signal [SIGINT]
    api_1        | 2022-01-17T08:57:09: PM2 log: App [api:0] starting in -fork mode-
    api_1        | 2022-01-17T08:57:09: PM2 log: App [api:0] online
    api_1        | Error: Cannot find module '../db/users'
    api_1        | Require stack:
    api_1        | - /app/routes/index.js
    api_1        | - /app/server.js
    api_1        |     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:61:29)
    api_1        |     at require (internal/modules/cjs/helpers.js:88:18)
    api_1        |     at Object.<anonymous> (/app/routes/index.js:5:13)
    api_1        |     at Module._compile (internal/modules/cjs/loader.js:1063:30)
    api_1        |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    api_1        |     at Module.load (internal/modules/cjs/loader.js:928:32)
    api_1        |     at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    api_1        |     at Module.require (internal/modules/cjs/loader.js:952:19)
    api_1        |     at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:80:39) {
    api_1        |   code: 'MODULE_NOT_FOUND',
    api_1        |   requireStack: [ '/app/routes/index.js', '/app/server.js' ]
    api_1        | }
    api_1        | 2022-01-17T08:57:10: PM2 log: App [api:0] exited with code [1] via signal [SIGINT]
    api_1        | 2022-01-17T08:57:10: PM2 log: Script /app/server.js had too many unstable restarts (16). Stopped. "errored"
    api_1        | 2022-01-17T08:57:11: PM2 log: 0 application online, retry = 3
    api_1        | 2022-01-17T08:57:13: PM2 log: 0 application online, retry = 2
    api_1        | 2022-01-17T08:57:15: PM2 log: 0 application online, retry = 1
    api_1        | 2022-01-17T08:57:17: PM2 log: 0 application online, retry = 0
    api_1        | 2022-01-17T08:57:17: PM2 log: Stopping app:api id:0
    api_1        | 2022-01-17T08:57:17: PM2 error: app=api id=0 does not have a pid
    api_1        | 2022-01-17T08:57:17: PM2 log: Stopping app:cron id:1
    api_1        | 2022-01-17T08:57:17: PM2 error: app=cron id=1 does not have a pid
    api_1        | 2022-01-17T08:57:17: PM2 log: PM2 successfully stopped
    changd_api_1 exited with code 2
    
    opened by kerbe 1
  • docker-compose: hide ports, persistent DB, etc.

    docker-compose: hide ports, persistent DB, etc.

    Changes:

    • use DB volume to make the data persistent
    • ports for api and db do not need to be exposed
    • remove explicit versions for DB and Nginx
    • restart unless stopped
    • explicit container_name
    • use optional environment variables to set the external port(s)
    opened by wivaku 0
  • Allow 3rd party S3 providers

    Allow 3rd party S3 providers

    Please let users to config 3rd party S3 storage providers like storj.io as they are signifiantcly cheaper and can be hosted locally (running Minio powered local S3).

    opened by DJIronic 0
  • No Notification for jobs of type XPath?

    No Notification for jobs of type XPath?

    Hi, websites checked by job type "Visual Snapshots" create SMTP notifications as expected. But when I try to check only on certain XPath, I cannot get any notifications. Job History shows there are changes, but no notifications are sent. Test button also doesn´t create notifications.

    I don´t know how to find the cause of this behaviour. Is it a known issue?

    docker-compose logs shows the following for a XPath job:

    changd-api  | Changes detected ... saving to history and sending notifications ...
    changd-ui   | 192.168.9.10 - - [27/Nov/2022:14:23:47 +0000] "GET /api/v1/jobs/4/run?type=test HTTP/1.1" 200 40 "http://vmtest/jobs/4" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:107.0) Gecko/20100101 Firefox/107.0" "-"
    changd-ui   | 2022/11/27 14:23:48 [warn] 31#31: *433 an upstream response is buffered to a temporary file /var/cache/nginx/proxy_temp/2/07/0000000072 while reading upstream, client: 192.168.9.10, server: frontend, request: "GET /api/v1/jobs/4 HTTP/1.1", upstream: "http://172.18.0.2:8000/api/v1/jobs/4", host: "vmtest", referrer: "http://vmtest/jobs/4"
    changd-ui   | 192.168.9.10 - - [27/Nov/2022:14:23:48 +0000] "GET /api/v1/jobs/4 HTTP/1.1" 200 1770877 "http://vmtest/jobs/4" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:107.0) Gecko/20100101 Firefox/107.0" "-"
    

    compared to a Visual Snapshot job:

    changd-api  | https://de.wikipedia.org
    changd-api  | Image difference to original: 0
    changd-api  | Reason: Pixel comparison
    changd-api  | Job threshold: 0
    changd-api  | Changes detected within threshold ... saving to history and sending notifications ...
    changd-ui   | 192.168.9.10 - - [27/Nov/2022:14:26:28 +0000] "GET /api/v1/jobs/2/run?type=test HTTP/1.1" 200 40 "http://vmtest/jobs/2" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:107.0) Gecko/20100101 Firefox/107.0" "-"
    changd-ui   | 192.168.9.10 - - [27/Nov/2022:14:26:29 +0000] "GET /api/v1/jobs/2 HTTP/1.1" 200 5720 "http://vmtest/jobs/2" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:107.0) Gecko/20100101 Firefox/107.0" "-"
    changd-api  | get local screenshot: /app/screenshots/2/ivpx0l_diff.png
    changd-ui   | 2022/11/27 14:26:29 [warn] 31#31: *457 an upstream response is buffered to a temporary file /var/cache/nginx/proxy_temp/4/07/0000000074 while reading upstream, client: 192.168.9.10, server: frontend, request: "GET /api/v1/screenshots/2/ivpx0l_diff.png HTTP/1.1", upstream: "http://172.18.0.2:8000/api/v1/screenshots/2/ivpx0l_diff.png", host: "vmtest", referrer: "http://vmtest/jobs/2"
    changd-api  | get local screenshot: /app/screenshots/2/ivpx0l.png
    changd-ui   | 2022/11/27 14:26:29 [warn] 30#30: *465 an upstream response is buffered to a temporary file /var/cache/nginx/proxy_temp/5/07/0000000075 while reading upstream, client: 192.168.9.10, server: frontend, request: "GET /api/v1/screenshots/2/ivpx0l.png HTTP/1.1", upstream: "http://172.18.0.2:8000/api/v1/screenshots/2/ivpx0l.png", host: "vmtest", referrer: "http://vmtest/jobs/2"
    changd-ui   | 192.168.9.10 - - [27/Nov/2022:14:26:29 +0000] "GET /api/v1/screenshots/2/ivpx0l_diff.png HTTP/1.1" 200 825596 "http://vmtest/jobs/2" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:107.0) Gecko/20100101 Firefox/107.0" "-"
    changd-ui   | 192.168.9.10 - - [27/Nov/2022:14:26:29 +0000] "GET /api/v1/screenshots/2/ivpx0l.png HTTP/1.1" 200 738585 "http://vmtest/jobs/2" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:107.0) Gecko/20100101 Firefox/107.0" "-"
    
    opened by contorama 0
  • Excess white space below site capture

    Excess white space below site capture

    When capturing some sites excess white space is added below the website capture.

    Example link: https://msto.startrack.com.au/track-trace/?id=MVMZ00118468

    Capture result, the actual white space is much longer on the actual reference image image

    Adjusting the delay does not seem to change the amount of white space that is added.

    enhancement help wanted 
    opened by bradhawkins85 1
  • request: use XPath (or class/id) for text version of page instead of raw HTML

    request: use XPath (or class/id) for text version of page instead of raw HTML

    The current behavior is that an XPath job returns + compares the raw HTML. I would very much prefer that the XPath (or CSS class / ID) returns a text version of that section of the page. Similar to changedetection.io.

    E.g. I want to know when wikipedia.org adds a new project:

    //*[contains(@class, 'other-projects')]
    

    or

    .other-projects
    
    opened by wivaku 0
  • Shorter Checking Intervals

    Shorter Checking Intervals

    It would be nice to have options for shorter interval. 60 minutes is a long time. It should support check intervals as low as 1 minute. Take some notes from dgtlmoon/changedetection.io and for notifications having something like caronc/apprise would be much better.option.

    opened by Suleman-Elahi 1
Releases(1.3.0)
Owner
Paul Aschmann
Paul Aschmann
Grupprojekt för kurserna 'Javascript med Ramverk' och 'Agil Utveckling'

JavaScript-med-Ramverk-Laboration-3 Grupprojektet för kurserna Javascript med Ramverk och Agil Utveckling. Utvecklingsguide För information om hur utv

Svante Jonsson IT-Högskolan 3 May 18, 2022
Hemsida för personer i Sverige som kan och vill erbjuda boende till människor på flykt

Getting Started with Create React App This project was bootstrapped with Create React App. Available Scripts In the project directory, you can run: np

null 4 May 3, 2022
Kurs-repo för kursen Webbserver och Databaser

Webbserver och databaser This repository is meant for CME students to access exercises and codealongs that happen throughout the course. I hope you wi

null 14 Jan 3, 2023
Open source app to beautify screenshots, quickly and easily

Codename: Pika What it does Lets you quickly beautify screenshots by adding rounded corners, background colors, shadows and more. You can copy the bea

Rishi Mohan 458 Dec 29, 2022
An application to capture screenshots automatically of your screen!

TASCA : The Automatic Screenshot Capturing Application An application to capture screenshots automatically of your screen! Report Bug · Request Featur

Piyush Sharma 1 Jan 27, 2022
An open-source visualization tool for monitoring Kafka cluster metrics

GitHub Tutorial Hyperion An open-source Kafka monitoring tool built for developers hyperionapp.dev Table of Contents About the Project Built With Gett

OSLabs Beta 46 Nov 10, 2022
Palaemon is an open-source developer tool for monitoring health and resource metrics of Kubernetes clusters and analyzing Out of Memory (OOMKill) errors

Palaemon ?? ?? An Electron based developer tool for Kubernetes cluster monitoring and error analysis Palaemon is a Greek, child sea-god who came to ai

OSLabs Beta 99 Dec 28, 2022
Tools to check version monitoring (updates) for web application. web 应用版本监测(更新)工具库

?? version-rocket ?? English | 简体中文 Notify users when a new version of your site is available and prompt them to refresh the page. When you finish dep

hakuna 77 Dec 29, 2022
Collection of My Open-Source APIs.

GTAVModFinder Experimental mod finder from gta5-mods.com Installation ⚒ npm update npm install gta5mods-finder NPM ?? NPM Page - Phaticusthiccy's gta

Thiccy 2 Dec 26, 2021
Free, open-source client or server-side APIs to "lint" user input.

passbird Free, open-source client or server-side APIs to lint user input. Right now, you can check type for an email address i.e., either of disposabl

Vaibhav Pandey 1 Dec 26, 2021
Open-source framework for building APIs

Fern Fern is an open source framework that makes it easier to build APIs. Fern allows you to Define a source-of-truth for your API Autogenerate idioma

Fern 32 Jan 1, 2023
JOSE ZEPEDA 10 Nov 18, 2022
A Javascript based web application for monitoring, analytics and notifications

JELLYWATCH Jellywatch is a javascript web application for monitoring*, analytics** and notifications** inspired by tautulli for Jellyfin/Emby Media Se

null 27 Dec 28, 2022
cpace - nodemon for C/C++ files. Monitor for any changes in your [.c] and [.cpp] application and automatically restart it - perfect for development

cpace cpace is a tool that helps develop [.c] and [.cpp] based applications by automatically restarting them when file changes are detected. The packa

null 17 Dec 3, 2022
Reference for How to Write an Open Source JavaScript Library - https://egghead.io/series/how-to-write-an-open-source-javascript-library

Reference for How to Write an Open Source JavaScript Library The purpose of this document is to serve as a reference for: How to Write an Open Source

Sarbbottam Bandyopadhyay 175 Dec 24, 2022
An Open-Source Platform to certify open-source projects.

OC-Frontend This includes the frontend for Open-Certs. ?? After seeing so many open-source projects being monetized ?? without giving any recognition

Open Certs 15 Oct 23, 2022
Shikhar 4 Oct 9, 2022
This is a project for open source enthusiast who want to contribute to open source in this hacktoberfest 2022. 💻 🎯🚀

HACKTOBERFEST-2022-GDSC-IET-LUCKNOW Beginner-Hacktoberfest Need Your first pr for hacktoberfest 2k22 ? come on in About Participate in Hacktoberfest b

null 8 Oct 29, 2022