datamk commited on
Commit
76338b1
Β·
verified Β·
1 Parent(s): 9140c02

Upload 2 files

Browse files
Files changed (2) hide show
  1. Dockerfile +26 -9
  2. app.py +26 -13
Dockerfile CHANGED
@@ -1,28 +1,45 @@
1
  FROM python:3.10-slim
2
 
3
- # Install system dependencies
4
  RUN apt-get update && apt-get install -y \
5
- wget gnupg ca-certificates procps \
6
- libnss3 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 \
7
- libxkbcommon0 libxcomposite1 libxdamage1 libxrandr2 \
8
- libgbm1 libasound2 libpangocairo-1.0-0 \
9
- --no-install-recommends && rm -rf /var/lib/apt/lists/*
 
 
 
 
 
 
 
 
 
 
 
 
 
10
 
11
- # Setup Hugging Face User (MANDATORY)
12
  RUN useradd -m -u 1000 user
13
  USER user
14
  ENV HOME=/home/user \
15
  PATH=/home/user/.local/bin:$PATH \
16
- PYTHONUNBUFFERED=1 \
17
- PLAYWRIGHT_BROWSERS_PATH=/home/user/pw-browsers
18
 
19
  WORKDIR $HOME/app
20
 
 
21
  COPY --chown=user requirements.txt .
22
  RUN pip install --no-cache-dir -r requirements.txt
 
 
23
  RUN playwright install chromium
24
 
 
25
  COPY --chown=user app.py .
26
 
27
  EXPOSE 7860
 
28
  CMD ["python", "app.py"]
 
1
  FROM python:3.10-slim
2
 
3
+ # Install system-level dependencies for browsers
4
  RUN apt-get update && apt-get install -y \
5
+ wget \
6
+ gnupg \
7
+ ca-certificates \
8
+ procps \
9
+ libnss3 \
10
+ libatk1.0-0 \
11
+ libatk-bridge2.0-0 \
12
+ libcups2 \
13
+ libdrm2 \
14
+ libxkbcommon0 \
15
+ libxcomposite1 \
16
+ libxdamage1 \
17
+ libxrandr2 \
18
+ libgbm1 \
19
+ libasound2 \
20
+ libpangocairo-1.0-0 \
21
+ --no-install-recommends \
22
+ && rm -rf /var/lib/apt/lists/*
23
 
24
+ # Setup the mandatory Hugging Face user (UID 1000)
25
  RUN useradd -m -u 1000 user
26
  USER user
27
  ENV HOME=/home/user \
28
  PATH=/home/user/.local/bin:$PATH \
29
+ PYTHONUNBUFFERED=1
 
30
 
31
  WORKDIR $HOME/app
32
 
33
+ # Only copy requirements first to cache layers
34
  COPY --chown=user requirements.txt .
35
  RUN pip install --no-cache-dir -r requirements.txt
36
+
37
+ # Install Playwright browser to the default user home directory
38
  RUN playwright install chromium
39
 
40
+ # Copy your application code
41
  COPY --chown=user app.py .
42
 
43
  EXPOSE 7860
44
+
45
  CMD ["python", "app.py"]
app.py CHANGED
@@ -8,10 +8,7 @@ from playwright.sync_api import sync_playwright
8
  import os
9
 
10
  URL = "https://streamer1-gvbgwaea2w2qmwgjey7ksg.streamlit.app/"
11
- # Tell playwright exactly where we installed the browsers in the Dockerfile
12
- os.environ["PLAYWRIGHT_BROWSERS_PATH"] = "/tmp/pw-browsers"
13
-
14
- logs = ["πŸš€ System initialized. Waiting for next schedule..."]
15
 
16
  def add_log(message):
17
  timestamp = datetime.datetime.now().strftime('%H:%M:%S')
@@ -24,18 +21,27 @@ def visit_and_scroll():
24
  add_log(f"Starting keep-alive visit to: {URL}")
25
  try:
26
  with sync_playwright() as p:
 
27
  browser = p.chromium.launch(headless=True, args=['--no-sandbox', '--disable-dev-shm-usage'])
28
  context = browser.new_context(user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36")
29
  page = context.new_page()
 
30
  page.goto(URL, wait_until='networkidle', timeout=60000)
 
31
  time.sleep(10)
32
- for i in range(1, 4):
33
- page.evaluate(f"window.scrollTo(0, {i * 800});")
34
- time.sleep(random.uniform(1.0, 3.0))
 
 
 
 
 
 
35
  browser.close()
36
- add_log("Visit completed successfully.")
37
  except Exception as e:
38
- add_log(f"CRITICAL ERROR: {str(e)}")
39
 
40
  def run_scheduler():
41
  visit_and_scroll()
@@ -44,10 +50,17 @@ def run_scheduler():
44
  schedule.run_pending()
45
  time.sleep(60)
46
 
47
- threading.Thread(target=run_scheduler, daemon=True).start()
 
 
 
 
 
48
 
49
- with gr.Blocks() as demo:
 
50
  gr.Markdown("# πŸš€ Cloud Stay-Alive Bot")
51
- status_box = gr.Textbox(label="Logs", value=lambda: "\n".join(reversed(logs)), every=5, lines=15)
52
 
53
- demo.launch(server_name="0.0.0.0", server_port=7860)
 
 
8
  import os
9
 
10
  URL = "https://streamer1-gvbgwaea2w2qmwgjey7ksg.streamlit.app/"
11
+ logs = ["πŸš€ System initialized. First run starting..."]
 
 
 
12
 
13
  def add_log(message):
14
  timestamp = datetime.datetime.now().strftime('%H:%M:%S')
 
21
  add_log(f"Starting keep-alive visit to: {URL}")
22
  try:
23
  with sync_playwright() as p:
24
+ # Relying on default path for browser executable
25
  browser = p.chromium.launch(headless=True, args=['--no-sandbox', '--disable-dev-shm-usage'])
26
  context = browser.new_context(user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36")
27
  page = context.new_page()
28
+
29
  page.goto(URL, wait_until='networkidle', timeout=60000)
30
+ add_log("Page loaded. Waiting 10s for Streamlit setup...")
31
  time.sleep(10)
32
+
33
+ for i in range(1, 6):
34
+ scroll_y = i * 800
35
+ page.evaluate(f"window.scrollTo(0, {scroll_y});")
36
+ add_log(f"Scrolled to {scroll_y}px...")
37
+ time.sleep(random.uniform(1.0, 2.5))
38
+
39
+ page.evaluate("window.scrollTo(0, 0);")
40
+ add_log("Visit completed. Closing browser.")
41
  browser.close()
42
+
43
  except Exception as e:
44
+ add_log(f"CRITICAL ERROR: {str(e)}")
45
 
46
  def run_scheduler():
47
  visit_and_scroll()
 
50
  schedule.run_pending()
51
  time.sleep(60)
52
 
53
+ # Start background thread
54
+ thread = threading.Thread(target=run_scheduler, daemon=True)
55
+ thread.start()
56
+
57
+ def get_logs():
58
+ return "\n".join(reversed(logs))
59
 
60
+ # Gradio Interface
61
+ with gr.Blocks(theme=gr.themes.Soft()) as demo:
62
  gr.Markdown("# πŸš€ Cloud Stay-Alive Bot")
63
+ status_box = gr.Textbox(label="Latest Logs (Top First)", value=get_logs, every=5, lines=15)
64
 
65
+ if __name__ == "__main__":
66
+ demo.launch(server_name="0.0.0.0", server_port=7860)