File size: 3,356 Bytes
44b5a51
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# Updates the existing 9hits-viewer Render service so one container runs
# both 9Hits and FeelingSurf AT THE SAME TIME on the free 512 MB plan.
# Do not rename this service — a different Blueprint name would create a
# second deployment instead of updating
# https://dashboard.render.com/web/srv-da09a7dbedkc73a829cg
services:
  - type: web
    name: 9hits-viewer
    runtime: docker
    dockerfilePath: ./Dockerfile
    plan: free
    healthCheckPath: /health
    envVars:
      # 9Hits access key (hard-coded). FeelingSurf token preconfigured below.
      - key: ACCESS_KEY
        value: "23f9097a8d823267188c49b3cc0598b1"
      - key: ACCESS_TOKEN
        value: "27f77ef00e768cdbdc7352f3456e35b5"

      - key: PORT
        value: "10000"

      # --- BOTH viewers, CONCURRENTLY, in 512 MB -----------------------------
      # Measured with a real Chromium 149 (see README "Measured memory"):
      #   LOW_MEMORY=extreme  (both viewers --single-process)  -> ~324 MB pair
      #   9Hits SP + FeelingSurf swiftshader (if SP crashes FS) -> ~458 MB
      # Both fit under the 512 MB budget, so the two viewers run at the same
      # time instead of alternating. Layers that make it safe:
      #   1. LOW_MEMORY=extreme shrinks both Chromiums hard.
      #   2. memguard.py watches total RSS (limit 512 MB, acts at 97% = 497 MB)
      #      and restarts the heaviest viewer BEFORE the platform can OOM-kill
      #      the container - a safety valve, not a scheduler.
      #   3. DUAL_VIEWER_MODE=concurrent  = always run both, never time-slice.
      #   4. Crash auto-fallback: if a viewer crash-loops 3x at startup under
      #      single-process, its SP flags are dropped automatically (it keeps
      #      running on the balanced set; NH_SP/FS_SP=no force that manually).
      #      If FeelingSurf specifically fails with swiftshader under SP, set
      #      FS_GL_MODE=disable-gpu.
      - key: NINEHITS_ENABLED
        value: "yes"
      - key: FEELINGSURF_ENABLED
        value: "yes"
      - key: DUAL_VIEWER_MODE
        value: "concurrent"     # both at the same time; auto escalates to time-slice
      - key: LOW_MEMORY
        value: "extreme"        # balanced | extreme | auto | off
      - key: NH_SP
        value: "yes"            # single-process for 9Hits (auto-fallback on crash)
      - key: FS_SP
        value: "yes"            # single-process for FeelingSurf (auto-fallback on crash)
      - key: FS_GL_MODE
        value: "swiftshader"    # swiftshader | disable-gpu (last resort)
      - key: MEMGUARD_LIMIT_MB
        value: "512"            # Render free plan limit
      - key: MEMGUARD_HARD_PCT
        value: "97"             # act at 497 MB so the platform OOM never fires
      - key: MEMGUARD_COOLDOWN
        value: "120"            # min seconds between guardian restarts
      - key: CLEAR_ALL_SESSIONS
        value: "yes"
      - key: SYSTEM_SESSION
        value: "yes"
      - key: SESSION_NOTE
        value: "render-system"
      - key: NOTE
        value: "render"
      - key: HIDE_BROWSER
        value: "yes"
      - key: ALLOW_POPUPS
        value: "no"
      - key: ALLOW_ADULT
        value: "no"
      - key: ALLOW_CRYPTO
        value: "no"
      - key: CACHE_LIMIT
        value: "0"
      - key: RESET_INTERVAL
        value: "2h"
      - key: SUPERVISOR_DELAY
        value: "10"