From 25ab0b0c31e4c0cd15b813baa18342a7f9eb9514 Mon Sep 17 00:00:00 2001 From: Dmitry Afanasyev Date: Tue, 23 Aug 2022 00:58:22 +0300 Subject: [PATCH] revert selenoid --- app/core/bot.py | 13 +++----- app/core/parse_web.py | 17 ++++++++-- deploy/Dockerfile.bot | 63 ++++++++++++++++++++++++++++++++++++++ deploy/Dockerfile.selenoid | 4 +++ deploy/browsers.json | 12 ++++++++ docker-compose.yml | 48 +++++++++++++++++++++++++++++ 6 files changed, 147 insertions(+), 10 deletions(-) create mode 100644 deploy/Dockerfile.bot create mode 100644 deploy/Dockerfile.selenoid create mode 100644 deploy/browsers.json create mode 100644 docker-compose.yml diff --git a/app/core/bot.py b/app/core/bot.py index f86fa54..024ce40 100644 --- a/app/core/bot.py +++ b/app/core/bot.py @@ -4,20 +4,16 @@ from aiogram import Bot, types from aiogram.contrib.middlewares.logging import LoggingMiddleware from aiogram.dispatcher import Dispatcher from aiogram.utils.callback_data import CallbackData -from app.core.logger import logger -from app.core.parse_web import ( - configure_firefox_driver, - download_gecko_driver, - parse_site, -) +from app.core.parse_web import get_driver, get_driver_session, parse_site from app.settings import API_TOKEN bot = Bot(token=API_TOKEN) dispatcher = Dispatcher(bot) dispatcher.middleware.setup(LoggingMiddleware()) -download_gecko_driver() -driver = configure_firefox_driver() + +driver = get_driver() +session_id = get_driver_session(driver) stations_cb = CallbackData('station', 'direction') @@ -86,6 +82,7 @@ async def echo(message: types.Message) -> types.Message: async def morning_bus_mailing(chat_ids: list[int]) -> None: + text = parse_site( driver=driver, url='https://yandex.ru/maps/213/moscow/stops/stop__9640740/' diff --git a/app/core/parse_web.py b/app/core/parse_web.py index 6ca8a7a..19f339b 100644 --- a/app/core/parse_web.py +++ b/app/core/parse_web.py @@ -10,7 +10,7 @@ from selenium import webdriver from selenium.common.exceptions import NoSuchElementException, WebDriverException from selenium.webdriver.firefox import options from selenium.webdriver.firefox.service import Service -from selenium.webdriver.firefox.webdriver import WebDriver +from selenium.webdriver.firefox.webdriver import RemoteWebDriver, WebDriver def download_gecko_driver() -> None: @@ -47,7 +47,7 @@ def configure_firefox_driver(private_window: bool = False) -> WebDriver | None: return None -def parse_site(url: str, message: str, driver: WebDriver | None = None) -> str: +def parse_site(url: str, message: str, driver: RemoteWebDriver | None = None) -> str: if not driver: logger.error('Driver is not configured') return 'Что-то пошло не так. :( Драйвер Firefox не сконфигурирован.' @@ -87,3 +87,16 @@ def parse_site(url: str, message: str, driver: WebDriver | None = None) -> str: if bus_t19 and bus_t19_arrival: answer += f'Автобус {bus_t19.text} - {bus_t19_arrival.text}' return answer + + +def get_driver() -> RemoteWebDriver: + opt = options.Options() + opt.headless = True + driver = RemoteWebDriver( + command_executor='http://selenoid_host:4444/wd/hub', options=opt + ) + return driver + + +def get_driver_session(driver: RemoteWebDriver) -> str: + return driver.session_id # type: ignore diff --git a/deploy/Dockerfile.bot b/deploy/Dockerfile.bot new file mode 100644 index 0000000..c6a44d6 --- /dev/null +++ b/deploy/Dockerfile.bot @@ -0,0 +1,63 @@ +FROM python:3.10.6 + +ARG USER + +ENV USER=${USER} \ + PYTHONFAULTHANDLER=1 \ + PYTHONUNBUFFERED=1 \ + PYTHONHASHSEED=random \ + PYTHONDONTWRITEBYTECODE=1 \ + # pip: + PIP_NO_CACHE_DIR=off \ + PIP_DISABLE_PIP_VERSION_CHECK=on \ + PIP_DEFAULT_TIMEOUT=100 \ + POETRY_VIRTUALENVS_CREATE=false \ + POETRY_CACHE_DIR='/var/cache/pypoetry' \ + PATH="$PATH:/root/.poetry/bin" + +RUN printf "================\n\nStart build app. USER is: "${USER}"\n\n===============\n" \ + && apt-get update \ + && apt-get install --no-install-recommends -y \ + procps \ + bash \ + build-essential \ + curl \ + iputils-ping \ + gettext \ + git \ + libpq-dev \ + nano \ + sshpass \ + && pip install --upgrade pip \ + # Installing `poetry` package manager: + && pip install poetry \ + # Cleaning cache: + && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \ + && apt-get clean -y && rm -rf /var/lib/apt/lists/* + + +WORKDIR /app + +RUN if [ "$USER" != "root" ]; then \ + mkdir /home/"$USER" \ + && groupadd -r "$USER" && useradd -d /home/"$USER" -r -g "$USER" "$USER" \ + && chown "$USER":"$USER" -R /home/"$USER"; \ + fi + +COPY --chown="$USER":"$USER" ./poetry.lock ./pyproject.toml /app/ + +# Installing requirements +RUN poetry version \ + && poetry run pip install -U pip \ + && poetry install \ + $(if [ "$USER" != 'root' ]; then echo '--no-dev'; fi) \ + --no-interaction --no-ansi \ + # Cleaning poetry installation's cache for production: + && if [ "$USER" != 'root' ]; then rm -rf "$POETRY_CACHE_DIR"; fi + +COPY --chown="$USER":"$USER" ./app /app/ + +USER "$USER" + +# Copying actuall application +COPY --chown="$USER":"$USER" . /app/ diff --git a/deploy/Dockerfile.selenoid b/deploy/Dockerfile.selenoid new file mode 100644 index 0000000..c12a735 --- /dev/null +++ b/deploy/Dockerfile.selenoid @@ -0,0 +1,4 @@ +FROM selenoid/firefox:103.0 as builder + +FROM aerokube/selenoid:latest-release + diff --git a/deploy/browsers.json b/deploy/browsers.json new file mode 100644 index 0000000..5c02b19 --- /dev/null +++ b/deploy/browsers.json @@ -0,0 +1,12 @@ +{ + "firefox": { + "default": "103.0", + "versions": { + "103.0": { + "image": "selenoid/firefox:103.0", + "port": "4444", + "path": "/wd/hub" + } + } + } +} diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..a53dc18 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,48 @@ +version: '3.9' + +networks: + transport_bot_network: + name: + "transport_bot_network" + ipam: + config: + - subnet: 200.20.0.0/24 + +services: + selenoid: + container_name: "transport_bot_selenoid" + hostname: "selenoid_host" + build: + context: . + dockerfile: ./deploy/Dockerfile.selenoid + args: + USER: web + restart: unless-stopped + networks: + transport_bot_network: + ipv4_address: 200.20.0.10 + volumes: + - ./deploy/browsers.json:/etc/selenoid/browsers.json:ro + - /var/run/docker.sock:/var/run/docker.sock + environment: + - SESSION_TIMED_OUT=12h + command: ["-conf", "/etc/selenoid/browsers.json", "-limit", "10", "-container-network", "transport_bot_network"] + expose: + - "4444" + + bot: + container_name: "transport_bot" + image: "transport_bot:latest" + build: + context: . + dockerfile: ./deploy/Dockerfile.bot + args: + USER: web + restart: unless-stopped + networks: + transport_bot_network: + ipv4_address: 200.20.0.11 + ports: + - "8084:8084" + command: > + bash -c "python main.py" \ No newline at end of file