diff --git a/app.py b/app.py index c9b1ca16..f91d16f6 100644 --- a/app.py +++ b/app.py @@ -253,6 +253,8 @@ def internal_error(error: Exception) -> Union[Response, Tuple[Response, int]]: # Register all routes with /request prefix register_dual_routes(app) +logger.log_resource_usage() + if __name__ == '__main__': logger.info(f"Starting Flask application on {FLASK_HOST}:{FLASK_PORT} IN {APP_ENV} mode") app.run( diff --git a/cloudflare_bypasser.py b/cloudflare_bypasser.py index 751bec27..9fa4fa8f 100644 --- a/cloudflare_bypasser.py +++ b/cloudflare_bypasser.py @@ -101,6 +101,9 @@ def _get_chromium_args(): arguments = [ "--no-sandbox", + "--disable-gpu", + "--disable-dev-shm-usage", # Often helpful in Docker + "--window-size=800,600" # Optional, but recommended ] # Conditionally add verbose logging arguments @@ -178,6 +181,7 @@ def _init_driver(): def _get_driver(): global DRIVER, DISPLAY global LAST_USED + logger.info("Getting driver...") LAST_USED = time.time() if env.DOCKERMODE and env.USE_CF_BYPASS and not DISPLAY: from pyvirtualdisplay import Display @@ -189,9 +193,11 @@ def _get_driver(): _reset_pyautogui_display_state() if not DRIVER: return _init_driver() + logger.log_resource_usage() return DRIVER def _reset_driver(): + logger.log_resource_usage() logger.info("Resetting driver...") global DRIVER, DISPLAY if DRIVER: @@ -218,7 +224,8 @@ def _reset_driver(): except Exception as e: logger.warning(f"Error killing chrom: {e}") time.sleep(0.5) - + logger.info("Driver reset.") + logger.log_resource_usage() def _cleanup_driver(): global LOCKED diff --git a/entrypoint.sh b/entrypoint.sh index 645cb727..92e1a293 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -3,6 +3,7 @@ set -e # Configure timezone if [ "$TZ" ]; then + echo "Setting timezone to $TZ" ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone fi @@ -17,20 +18,23 @@ if [ -z "$GID" ]; then fi if ! getent group "$GID" >/dev/null; then + echo "Adding group $GID with name appuser" groupadd -g "$GID" appuser fi # Create user if it doesn't exist if ! id -u "$UID" >/dev/null 2>&1; then + echo "Adding user $UID with name appuser" useradd -u "$UID" -g "$GID" -d /app -s /sbin/nologin appuser fi # Get username for the UID (whether we just created it or it existed) USERNAME=$(getent passwd "$UID" | cut -d: -f1) - +echo "Username for UID $UID is $USERNAME" # Ensure proper ownership of application directories change_ownership() { folder=$1 + echo "Changing ownership of $folder to $USERNAME:$GID" chown -R "${UID}:${GID}" "${folder}" || echo "Failed to change ownership for ${folder}, continuing..." } @@ -46,6 +50,17 @@ else command="python3 app.py" fi +echo "Making sure /tmp is mounted and has enough space" +df -h /tmp + +# Hacky way to verify /tmp has at least 1MB of space and is writable/readable +echo "Verifying /tmp has enough space" +rm -f /tmp/test.cwa-bd +for i in {1..150000}; do printf "%04d\n" $i; done > /tmp/test.cwa-bd +sum=$(python3 -c "print(sum(int(l.strip()) for l in open('/tmp/test.cwa-bd').readlines()))") +[ "$sum" == 11250075000 ] && echo "Success: /tmp is writable" || (echo "Failure: /tmp is not writable" && exit 1) +rm /tmp/test.cwa-bd + echo "Running command: '$command' as '$USERNAME' in '$APP_ENV' mode" exec sudo -E -u "$USERNAME" $command diff --git a/logger.py b/logger.py index 44dad95b..5e35fb9e 100644 --- a/logger.py +++ b/logger.py @@ -12,7 +12,17 @@ class CustomLogger(logging.Logger): def error_trace(self, msg: Any, *args: Any, **kwargs: Any) -> None: """Log an error message with full stack trace.""" + self.log_resource_usage() self.error(msg, *args, exc_info=True, **kwargs) + + def log_resource_usage(self): + import psutil + memory = psutil.virtual_memory() + available_mb = memory.available / (1024 * 1024) + memory_used_mb = memory.used / (1024 * 1024) + cpu_percent = psutil.cpu_percent() + self.debug(f"Container Memory: Available={available_mb:.2f} MB, Used={memory_used_mb:.2f} MB, CPU: {cpu_percent:.2f}%") + def setup_logger(name: str, log_file: Path = LOG_FILE) -> CustomLogger: """Set up and configure a logger instance. @@ -75,4 +85,5 @@ def setup_logger(name: str, log_file: Path = LOG_FILE) -> CustomLogger: except Exception as e: logger.error_trace(f"Failed to create log file: {e}", exc_info=True) - return logger \ No newline at end of file + return logger + diff --git a/requirements.txt b/requirements.txt index 30f80184..21b7f95d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,4 +7,5 @@ dnspython pyautogui seleniumbase gunicorn -python-xlib \ No newline at end of file +python-xlib +psutil