Skip to content

Commit 3bca053

Browse files
committed
fix: api chrome executable vps headless and executable
1 parent d573e19 commit 3bca053

4 files changed

Lines changed: 40 additions & 12 deletions

File tree

.github/workflows/deploy-api.yml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,12 @@ jobs:
7474
VINTED_EMAIL_OR_USERNAME: ${{ secrets.VINTED_EMAIL_OR_USERNAME }}
7575
VINTED_PASSWORD: ${{ secrets.VINTED_PASSWORD }}
7676
CORS_ORIGINS: ${{ secrets.CORS_ORIGINS }}
77+
# Optionnel : chemin Chrome/Chromium si différent de /usr/bin/chromium
78+
VINTED_CHROME_EXECUTABLE: ${{ secrets.VINTED_CHROME_EXECUTABLE }}
7779
run: |
7880
set -euo pipefail
7981
f=api/.env
82+
CHROME_PATH="${VINTED_CHROME_EXECUTABLE:-/usr/bin/chromium}"
8083
{
8184
echo "DATABASE_URL=${DATABASE_URL}"
8285
echo "JWT_SECRET=${JWT_SECRET}"
@@ -94,6 +97,8 @@ jobs:
9497
echo "VINTED_EMAIL_OR_USERNAME=${VINTED_EMAIL_OR_USERNAME:-}"
9598
echo "VINTED_PASSWORD=${VINTED_PASSWORD:-}"
9699
echo "CORS_ORIGINS=${CORS_ORIGINS:-*}"
100+
echo "VINTED_BROWSER_HEADLESS=true"
101+
echo "VINTED_CHROME_EXECUTABLE=${CHROME_PATH}"
97102
} > "$f"
98103
99104
- name: Pack api tree
@@ -135,7 +140,7 @@ jobs:
135140
APP_ROOT="$TARGET/api"
136141
sudo chown -R "$USER:$USER" "$APP_ROOT" || true
137142
sudo apt-get update -y
138-
sudo apt-get install -y python3-venv python3-pip
143+
sudo apt-get install -y python3-venv python3-pip chromium fonts-liberation
139144
if [ ! -x "$APP_ROOT/.venv/bin/python" ]; then
140145
python3 -m venv "$APP_ROOT/.venv"
141146
fi

api/.env.example

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,6 @@ POKE_WALLET_USER_AGENT=GoupixDex/1.0 (+https://goupixdex.dibodev.fr)
1414
GROQ_API_KEY=
1515
VINTED_EMAIL_OR_USERNAME=
1616
VINTED_PASSWORD=
17+
VINTED_BROWSER_HEADLESS=false
18+
VINTED_CHROME_EXECUTABLE=
1719
CORS_ORIGINS=*

api/config.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@ class AppSettings(BaseSettings):
5151
#: Si défini, envoi de ``X-Proxy-Secret`` ; la clé API peut rester uniquement sur le proxy.
5252
poke_wallet_proxy_secret: str | None = None
5353
poke_wallet_user_agent: str = "GoupixDex/1.0 (+https://goupixdex.dibodev.fr)"
54+
#: Sur le VPS : ``true`` (navigateur sans fenêtre). En local : laisser ``false`` ou absent.
55+
vinted_browser_headless: bool = False
56+
#: Chemin explicite vers Chromium/Chrome (ex. ``/usr/bin/chromium`` sur Debian après ``apt install chromium``).
57+
vinted_chrome_executable: str | None = None
5458

5559

5660
@lru_cache

api/services/vinted_service.py

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
from app_types.payload import ItemPayload
1616
from app_types.vinted import VintedPackageSize
17+
from config import get_settings
1718
from services.os_service import get_project_root
1819
from services.timer_service import TimerService
1920

@@ -88,12 +89,23 @@ def _normalize_vinted_label(text: str) -> str:
8889
)
8990

9091

91-
_DEFAULT_BROWSER_ARGS: list[str] = [
92-
"--no-sandbox",
93-
"--disable-blink-features=AutomationControlled",
94-
"--disable-features=IsolateOrigins,site-per-process",
95-
"--start-maximized",
96-
]
92+
def _build_browser_args(*, headless: bool) -> list[str]:
93+
"""Flags communs ; en headless (prod VPS) on évite --start-maximized et on renforce la stabilité serveur."""
94+
base: list[str] = [
95+
"--no-sandbox",
96+
"--disable-blink-features=AutomationControlled",
97+
"--disable-features=IsolateOrigins,site-per-process",
98+
]
99+
if headless:
100+
base.extend(
101+
[
102+
"--window-size=1920,1080",
103+
"--disable-dev-shm-usage",
104+
]
105+
)
106+
else:
107+
base.append("--start-maximized")
108+
return base
97109

98110

99111
class VintedService:
@@ -119,11 +131,16 @@ async def init_browser(cls) -> None:
119131
Raises:
120132
RuntimeError: If the browser failed to start.
121133
"""
122-
cls._browser = await uc.start(
123-
headless=False,
124-
browser_args=list(_DEFAULT_BROWSER_ARGS),
125-
sandbox=False,
126-
)
134+
settings = get_settings()
135+
headless = settings.vinted_browser_headless
136+
start_kw: dict[str, Any] = {
137+
"headless": headless,
138+
"browser_args": _build_browser_args(headless=headless),
139+
"sandbox": False,
140+
}
141+
if settings.vinted_chrome_executable:
142+
start_kw["browser_executable_path"] = settings.vinted_chrome_executable.strip()
143+
cls._browser = await uc.start(**start_kw)
127144
if cls._browser is None:
128145
raise RuntimeError("nodriver.start() returned no browser instance")
129146

0 commit comments

Comments
 (0)