--- # cezen-backend role: installs the Nexus One AI FastAPI management API - name: Install system Python deps apt: name: - python3-pip - python3-venv - python3.11 - python3.11-venv - libmupdf-dev # required by pymupdf (Document Intelligence) - mupdf-tools - ffmpeg # required by faster-whisper audio transcription state: present update_cache: yes - name: Create backend directory file: path: /opt/cezen/backend state: directory owner: "{{ cezen_user }}" group: "{{ cezen_user }}" mode: "0755" - name: Create data directory (JWT secret + SQLite DB) file: path: /opt/cezen/data state: directory owner: "{{ cezen_user }}" group: "{{ cezen_user }}" mode: "0750" - name: Check for captured license file stat: path: /opt/cezen/license.json register: cezen_license_file - name: Allow backend service to read captured license file: path: /opt/cezen/license.json owner: root group: "{{ cezen_user }}" mode: "0640" when: cezen_license_file.stat.exists - name: Copy FastAPI application copy: src: main.py dest: /opt/cezen/backend/main.py owner: "{{ cezen_user }}" group: "{{ cezen_user }}" mode: "0644" notify: Restart cezen-api - name: Copy QLoRA training runner copy: src: train_qlora.py dest: /opt/cezen/backend/train_qlora.py owner: "{{ cezen_user }}" group: "{{ cezen_user }}" mode: "0755" - name: Copy RAG ingest worker copy: src: rag_ingest.py dest: /opt/cezen/backend/rag_ingest.py owner: "{{ cezen_user }}" group: "{{ cezen_user }}" mode: "0755" notify: Restart cezen-api - name: Copy requirements.txt copy: src: requirements.txt dest: /opt/cezen/backend/requirements.txt owner: "{{ cezen_user }}" group: "{{ cezen_user }}" mode: "0644" - name: Create Python virtual environment (Python 3.11) become_user: "{{ cezen_user }}" command: python3.11 -m venv /opt/cezen/backend/venv args: creates: /opt/cezen/backend/venv/bin/activate - name: Install Python dependencies become_user: "{{ cezen_user }}" pip: requirements: /opt/cezen/backend/requirements.txt virtualenv: /opt/cezen/backend/venv notify: Restart cezen-api - name: Install Pro/Max fine-tuning dependencies become_user: "{{ cezen_user }}" pip: name: - torch - transformers - datasets - peft - bitsandbytes - accelerate - trl - sentencepiece virtualenv: /opt/cezen/backend/venv retries: 3 delay: 15 when: (tier | default('basic')) in ['pro', 'max'] - name: Install Max multi-GPU training dependencies become_user: "{{ cezen_user }}" pip: name: - deepspeed virtualenv: /opt/cezen/backend/venv retries: 3 delay: 15 when: (tier | default('basic')) == 'max' - name: Install systemd service unit copy: src: cezen-api.service dest: /etc/systemd/system/cezen-api.service owner: root group: root mode: "0644" notify: - Reload systemd - Restart cezen-api - name: Enable and start cezen-api service systemd: name: cezen-api enabled: yes state: started daemon_reload: yes