update
Browse files- Dockerfile +17 -7
- app/server.py +22 -2
Dockerfile
CHANGED
|
@@ -39,27 +39,37 @@ COPY pyproject.toml poetry.lock* ./
|
|
| 39 |
RUN poetry config virtualenvs.create false \
|
| 40 |
&& poetry install --no-interaction --no-ansi --only main --no-root
|
| 41 |
|
| 42 |
-
# Install Playwright browsers as root
|
| 43 |
-
RUN playwright install chromium && \
|
| 44 |
-
playwright install-deps chromium
|
| 45 |
-
|
| 46 |
# Create directories and set permissions
|
| 47 |
RUN mkdir -p static templates screenshots /home/user/.cache && \
|
| 48 |
chown -R user:user /app /home/user/.cache
|
| 49 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 50 |
# Copy application code
|
| 51 |
COPY app /app/app
|
| 52 |
COPY templates /app/templates
|
| 53 |
COPY static /app/static
|
| 54 |
|
|
|
|
|
|
|
|
|
|
| 55 |
# Make sure all files are owned by user
|
| 56 |
RUN chown -R user:user /app
|
| 57 |
|
| 58 |
# Environment variables
|
| 59 |
ENV PORT=7860 \
|
| 60 |
-
HOST=0.0.0.0
|
| 61 |
-
PYTHONPATH=/app \
|
| 62 |
-
HOME=/home/user
|
| 63 |
|
| 64 |
# Switch to non-root user for running the app
|
| 65 |
USER user
|
|
|
|
| 39 |
RUN poetry config virtualenvs.create false \
|
| 40 |
&& poetry install --no-interaction --no-ansi --only main --no-root
|
| 41 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 42 |
# Create directories and set permissions
|
| 43 |
RUN mkdir -p static templates screenshots /home/user/.cache && \
|
| 44 |
chown -R user:user /app /home/user/.cache
|
| 45 |
|
| 46 |
+
# Set HOME for the following Playwright install step
|
| 47 |
+
ENV HOME=/home/user \
|
| 48 |
+
PYTHONPATH=/app
|
| 49 |
+
|
| 50 |
+
# Switch to non-root user for browser installation
|
| 51 |
+
USER user
|
| 52 |
+
|
| 53 |
+
# Install Playwright browsers under the non-root user HOME directory
|
| 54 |
+
RUN playwright install chromium
|
| 55 |
+
|
| 56 |
+
# Switch back to root to copy files
|
| 57 |
+
USER root
|
| 58 |
+
|
| 59 |
# Copy application code
|
| 60 |
COPY app /app/app
|
| 61 |
COPY templates /app/templates
|
| 62 |
COPY static /app/static
|
| 63 |
|
| 64 |
+
# Install system dependencies for Playwright
|
| 65 |
+
RUN apt-get update && apt-get install -y fonts-noto-color-emoji fonts-freefont-ttf libharfbuzz-icu0
|
| 66 |
+
|
| 67 |
# Make sure all files are owned by user
|
| 68 |
RUN chown -R user:user /app
|
| 69 |
|
| 70 |
# Environment variables
|
| 71 |
ENV PORT=7860 \
|
| 72 |
+
HOST=0.0.0.0
|
|
|
|
|
|
|
| 73 |
|
| 74 |
# Switch to non-root user for running the app
|
| 75 |
USER user
|
app/server.py
CHANGED
|
@@ -46,23 +46,43 @@ async def take_screenshot(url: str = Form(...)):
|
|
| 46 |
filename = f"{uuid.uuid4()}.png"
|
| 47 |
filepath = str(screenshots_path / filename)
|
| 48 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 49 |
# Take the screenshot with Playwright
|
| 50 |
async with async_playwright() as p:
|
| 51 |
# Configuration adaptée pour l'environnement Docker
|
| 52 |
browser = await p.chromium.launch(
|
| 53 |
headless=True,
|
| 54 |
-
args=[
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 55 |
)
|
| 56 |
-
|
|
|
|
|
|
|
| 57 |
|
| 58 |
try:
|
|
|
|
| 59 |
await page.goto(url, wait_until="networkidle", timeout=60000)
|
|
|
|
| 60 |
await page.screenshot(path=filepath)
|
|
|
|
| 61 |
except Exception as e:
|
| 62 |
logger.error(f"Error during page navigation or screenshot: {str(e)}")
|
| 63 |
raise
|
| 64 |
finally:
|
| 65 |
await browser.close()
|
|
|
|
| 66 |
|
| 67 |
return JSONResponse({
|
| 68 |
"success": True,
|
|
|
|
| 46 |
filename = f"{uuid.uuid4()}.png"
|
| 47 |
filepath = str(screenshots_path / filename)
|
| 48 |
|
| 49 |
+
# Log browser executable paths
|
| 50 |
+
logger.info(f"HOME env: {os.environ.get('HOME')}")
|
| 51 |
+
logger.info(f"Current working directory: {os.getcwd()}")
|
| 52 |
+
|
| 53 |
# Take the screenshot with Playwright
|
| 54 |
async with async_playwright() as p:
|
| 55 |
# Configuration adaptée pour l'environnement Docker
|
| 56 |
browser = await p.chromium.launch(
|
| 57 |
headless=True,
|
| 58 |
+
args=[
|
| 59 |
+
'--no-sandbox',
|
| 60 |
+
'--disable-setuid-sandbox',
|
| 61 |
+
'--disable-dev-shm-usage',
|
| 62 |
+
'--disable-accelerated-2d-canvas',
|
| 63 |
+
'--no-first-run',
|
| 64 |
+
'--no-zygote',
|
| 65 |
+
'--single-process',
|
| 66 |
+
'--disable-gpu'
|
| 67 |
+
],
|
| 68 |
+
executable_path=None # Utiliser le chemin par défaut
|
| 69 |
)
|
| 70 |
+
|
| 71 |
+
logger.info("Browser launched successfully")
|
| 72 |
+
page = await browser.new_page(viewport={"width": 1280, "height": 720})
|
| 73 |
|
| 74 |
try:
|
| 75 |
+
logger.info(f"Navigating to URL: {url}")
|
| 76 |
await page.goto(url, wait_until="networkidle", timeout=60000)
|
| 77 |
+
logger.info("Navigation complete, taking screenshot")
|
| 78 |
await page.screenshot(path=filepath)
|
| 79 |
+
logger.info(f"Screenshot saved to {filepath}")
|
| 80 |
except Exception as e:
|
| 81 |
logger.error(f"Error during page navigation or screenshot: {str(e)}")
|
| 82 |
raise
|
| 83 |
finally:
|
| 84 |
await browser.close()
|
| 85 |
+
logger.info("Browser closed")
|
| 86 |
|
| 87 |
return JSONResponse({
|
| 88 |
"success": True,
|