# Setup Guide for Text-Based LLM Interaction System (Linux) This guide describes a clean Linux-first setup (tested on Ubuntu/Debian). It removes macOS/Windows specifics and focuses on a reliable developer workflow with pyenv, virtual environments, Docker, and Portainer. ## Prerequisites - Git - curl or wget - build tools (gcc, make, etc.) - Docker Engine and Docker Compose plugin Recommended (optional but helpful): - net-tools or iproute2 for networking diagnostics - ca-certificates On Ubuntu/Debian you can install Docker and the Compose plugin via apt: ```bash sudo apt update sudo apt install -y docker.io docker-compose-plugin # Allow running docker without sudo (re-login required) sudo usermod -aG docker "$USER" ``` ## Installing pyenv (Ubuntu/Debian) Install dependencies required to build CPython: ```bash sudo apt update sudo apt install -y make build-essential libssl-dev zlib1g-dev \ libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \ libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev \ libffi-dev liblzma-dev ``` Install pyenv: ```bash curl https://pyenv.run | bash ``` Add pyenv to your shell (bash; recommended on Linux): ```bash echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.profile echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.profile echo 'eval "$(pyenv init --path)"' >> ~/.profile # Interactive shells echo 'eval "$(pyenv init -)"' >> ~/.bashrc # Reload your shell source ~/.profile source ~/.bashrc ``` Using zsh on Linux? Add to ~/.zprofile and ~/.zshrc instead: ```bash echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zprofile echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zprofile echo 'eval "$(pyenv init --path)"' >> ~/.zprofile echo 'eval "$(pyenv init -)"' >> ~/.zshrc source ~/.zprofile source ~/.zshrc ``` ## Installing Python with pyenv ```bash # List available Python versions pyenv install --list # Install a specific Python version (project default) pyenv install 3.9.16 # Set it as your global default (optional) pyenv global 3.9.16 ``` Note: If you prefer a newer interpreter and your tooling supports it, Python 3.11.x also works well. ## Creating a Virtual Environment Choose ONE of the methods below. ### Method 1: Using pyenv-virtualenv (recommended) ```bash # Install pyenv-virtualenv plugin git clone https://github.com/pyenv/pyenv-virtualenv.git "$(pyenv root)"/plugins/pyenv-virtualenv # Initialize in your interactive shell echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc source ~/.bashrc # Create and activate a virtual environment pyenv virtualenv 3.9.16 text-adventure pyenv local text-adventure # auto-activates in this directory # or activate manually pyenv activate text-adventure ``` ### Method 2: Using Python's built-in venv ```bash # Use the selected Python version in this directory pyenv local 3.9.16 # Create and activate venv python -m venv .venv source .venv/bin/activate ``` ## Installing Project Dependencies With your virtual environment active: ```bash python -m pip install --upgrade pip setuptools wheel pip install -r requirements.txt ``` ## Verifying Setup ```bash # Check Python version python --version # Check installed packages pip list # Run basic tests python test_system.py # Optionally: python test_llm_connection.py python test_llm_exchange.py ``` ## Docker (Linux) Docker provides a clean, reproducible environment. ### Build and Run ```bash # Build the image docker build -t text-adventure . # Run using host networking (Linux-only) docker run -it --rm --network host -v "$PWD":/app text-adventure ``` ### Docker Compose (v2 CLI) Update [docker-compose.yml](docker-compose.yml) as needed. On Linux you may use host networking: ```yaml services: text-adventure: build: . network_mode: "host" # Linux-only ``` Then: ```bash docker compose up --build # Run detached docker compose up -d --build # Stop and remove docker compose down ``` ### Connecting to LM Studio from a container LM Studio is assumed to run on the Linux host (default in [config.py](config.py)). Prefer using the special hostname host.docker.internal inside containers. Option A (recommended when not using host network): add an extra_hosts mapping using Docker’s host-gateway: ```yaml services: text-adventure: build: . extra_hosts: - "host.docker.internal:host-gateway" ``` Then in [config.py](config.py), set: ```python self.LM_STUDIO_HOST = "host.docker.internal" self.LM_STUDIO_PORT = 1234 ``` Option B (Linux-only): use host networking (container shares host network namespace). In this case keep LM_STUDIO_HOST as 127.0.0.1 or the host’s IP address. Fallback: If neither applies, you can use your Docker bridge gateway IP (often 172.17.0.1), but this can vary by system. Connectivity quick check from inside the container: ```bash docker compose exec text-adventure python - <<'PY' import requests import sys url = "http://host.docker.internal:1234/v1/models" try: r = requests.get(url, timeout=5) print(r.status_code, r.text[:200]) except Exception as e: print("ERROR:", e) sys.exit(1) PY ``` ## Portainer Deployment (Linux) Portainer simplifies Docker management via the web UI. ### Prerequisites - Portainer instance reachable (e.g., http://10.0.0.199:9000) - Valid Portainer credentials - Docker image available (local or registry) Create a local env file and never commit secrets: ```bash cp .env.example .env # edit .env and set PORTAINER_URL, PORTAINER_USERNAME, PORTAINER_PASSWORD ``` ### Deploy The script [deploy_to_portainer.py](deploy_to_portainer.py) deploys a single container using host networking, which works on Linux: ```bash python deploy_to_portainer.py ``` You can also override environment variables: ```bash export PORTAINER_URL=http://10.0.0.199:9000 export PORTAINER_USERNAME=admin export PORTAINER_PASSWORD=yourpassword python deploy_to_portainer.py ``` After deployment, verify connectivity to LM Studio using the container exec method shown above. ## Troubleshooting (Linux) - pyenv: command not found - Ensure the init lines exist in ~/.profile and ~/.bashrc, then restart your terminal: - eval "$(pyenv init --path)" in ~/.profile - eval "$(pyenv init -)" in ~/.bashrc - Python build errors (e.g., "zlib not available") - Confirm all build deps are installed (see Installing pyenv). - Virtual environment activation issues - For venv: source .venv/bin/activate - For pyenv-virtualenv: pyenv activate text-adventure - Docker permission errors (e.g., "permission denied" / cannot connect to Docker daemon) - Add your user to the docker group and re-login: sudo usermod -aG docker "$USER" - docker compose not found - Install the Compose plugin: sudo apt install docker-compose-plugin - Container cannot reach LM Studio - If using extra_hosts: verify host-gateway mapping and LM_STUDIO_HOST=host.docker.internal in [config.py](config.py). - If using host network: ensure LM Studio is listening on 0.0.0.0 or localhost as appropriate. - Try the connectivity check snippet above; if it fails, verify firewall rules and that LM Studio is running. ## Notes - The LM Studio address 10.0.0.200:1234 in [config.py](config.py) is a placeholder. Adjust it to your environment as described above. - Do not commit your [.env](.env) file. Use [.env.example](.env.example) as a template. - Use docker compose (v2) commands instead of the deprecated docker-compose (v1) binary.