revert selenoid

This commit is contained in:
Dmitry Afanasyev 2022-08-23 00:58:22 +03:00
parent c01a163d1c
commit 25ab0b0c31
6 changed files with 147 additions and 10 deletions

View File

@ -4,20 +4,16 @@ from aiogram import Bot, types
from aiogram.contrib.middlewares.logging import LoggingMiddleware from aiogram.contrib.middlewares.logging import LoggingMiddleware
from aiogram.dispatcher import Dispatcher from aiogram.dispatcher import Dispatcher
from aiogram.utils.callback_data import CallbackData from aiogram.utils.callback_data import CallbackData
from app.core.logger import logger from app.core.parse_web import get_driver, get_driver_session, parse_site
from app.core.parse_web import (
configure_firefox_driver,
download_gecko_driver,
parse_site,
)
from app.settings import API_TOKEN from app.settings import API_TOKEN
bot = Bot(token=API_TOKEN) bot = Bot(token=API_TOKEN)
dispatcher = Dispatcher(bot) dispatcher = Dispatcher(bot)
dispatcher.middleware.setup(LoggingMiddleware()) 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') 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: async def morning_bus_mailing(chat_ids: list[int]) -> None:
text = parse_site( text = parse_site(
driver=driver, driver=driver,
url='https://yandex.ru/maps/213/moscow/stops/stop__9640740/' url='https://yandex.ru/maps/213/moscow/stops/stop__9640740/'

View File

@ -10,7 +10,7 @@ from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException, WebDriverException from selenium.common.exceptions import NoSuchElementException, WebDriverException
from selenium.webdriver.firefox import options from selenium.webdriver.firefox import options
from selenium.webdriver.firefox.service import Service 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: def download_gecko_driver() -> None:
@ -47,7 +47,7 @@ def configure_firefox_driver(private_window: bool = False) -> WebDriver | None:
return 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: if not driver:
logger.error('Driver is not configured') logger.error('Driver is not configured')
return 'Что-то пошло не так. :( Драйвер Firefox не сконфигурирован.' 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: if bus_t19 and bus_t19_arrival:
answer += f'Автобус {bus_t19.text} - {bus_t19_arrival.text}' answer += f'Автобус {bus_t19.text} - {bus_t19_arrival.text}'
return answer 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

63
deploy/Dockerfile.bot Normal file
View File

@ -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/

View File

@ -0,0 +1,4 @@
FROM selenoid/firefox:103.0 as builder
FROM aerokube/selenoid:latest-release

12
deploy/browsers.json Normal file
View File

@ -0,0 +1,12 @@
{
"firefox": {
"default": "103.0",
"versions": {
"103.0": {
"image": "selenoid/firefox:103.0",
"port": "4444",
"path": "/wd/hub"
}
}
}
}

48
docker-compose.yml Normal file
View File

@ -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"