1. You can start up all of the container using `make up` as you can see below. If you run `docker ps`, you will see that we just started a bunch of containers.
-`captchamonitor-tor-container` runs a copy of a Tor client, a new `captchamonitor-tor-container` container created for each worker in the system
-`captchamonitor-tor-browser-container` runs an instance of [Docker Selenium](https://github.com/SeleniumHQ/docker-selenium) that was compiled to use Tor Browser to fetch websites on demand
-`selenium/standalone-firefox` runs an instance of [Docker Selenium](https://github.com/SeleniumHQ/docker-selenium) that was compiled to use Firefox Browser to fetch websites on demand
-`selenium/standalone-chrome` runs an instance of [Docker Selenium](https://github.com/SeleniumHQ/docker-selenium) that was compiled to use Chrome Browser to fetch websites on demand
-`postgres:9.6` runs a copy of the PostgreSQL database server. As you can see above, this container has port `5432` exposed outside of the network. So, we can connect to it and check the data inside.
-`captchamonitor` runs the code we write
1. Now, all containers run in the background and they don't require any user interaction by design. If you want to view the output of our code, you can use `make logs` command as shown below. However, these logs are just here for us to debug things if needed. The program should place all useful information into the database. It shouldn't just print to screen.
1. If we connect to the database using a database client (such as [DBeaver](https://dbeaver.io/)), we will see that 6 tables were already created for us. These tables are `url`, `relay`, `fetcher`, `fetch_queue`, `fetch_completed`, `fetch_failed`. You can check [this file](https://gitlab.torproject.org/woswos/CAPTCHA-Monitor/-/blob/master/src/captchamonitor/utils/models.py) to learn more details. We can and should add more tables for other functionality, for example consensus, etc.
1. The [worker](https://gitlab.torproject.org/woswos/CAPTCHA-Monitor/-/blob/master/src/captchamonitor/core/worker.py), first spins up a new `captchamonitor-tor-container`. Later, it claims the job from `fetch_queue` table, processes it using the specified web browser, and places the results back into the database. However, before adding any job to `fetch_queue` table, we first need to add some fetchers, URLs, and relays. Here, I used the database client to add data manually, but this should be automated later.