This commit is contained in:
2026-03-20 13:20:58 +01:00
commit 2af73b780b
27 changed files with 333 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
ansible/inventory/joe_at_home

View File

@@ -0,0 +1,8 @@
---
- name: Install Ai @ Home
hosts: ai_at_home
roles:
- ollama
- openwebui
- ai_at_home

View File

@@ -0,0 +1,6 @@
---
- name: Install Ollama
hosts: ollama
roles:
- ollama

View File

@@ -0,0 +1,6 @@
---
- name: Install Openwebui
hosts: openwebui
roles:
- openwebui

View File

@@ -0,0 +1,8 @@
---
ai_at_home_install_dir: /home/youruser/Projekte/ai_at_home
openwebui_install_dir: "{{ ai_at_home_install_dir }}/openwebui"
common_container_labels:
- sablier.enable=true
ollama_container_labels: {{ common_container_labels + ["sablier.group=ai_backends"] }}
openwebui_container_labels: {{ common_container_labels + ["sablier.group=ai_frontends"] }}

View File

@@ -0,0 +1,8 @@
[ollama]
yourpc
[openwebui]
yourpc
[ai_at_home]
yourpc

View File

@@ -0,0 +1,19 @@
---
sablier_image: sablierapp/sablier
sablier_image_tag: latest
apisix_image: apache/apisix
apisix_image_tag: latest
ai_at_home_install_dir: /opt/ai_at_home
ollama_install_dir: /opt/ollama
ollama_composefile: "{{ ollama_install_dir }}/compose/composefile.yml"
openwebui_install_dir: /opt/openwebui
openwebui_composefile: "{{ openwebui_install_dir }}/compose/composefile.yml"
# images
# gpt-oss:20b
# qwen3-coder-next

View File

@@ -0,0 +1,17 @@
#!/bin/bash
set -a
CONFIG_FILE=$(dirname "$(readlink -f "$0")")/aiathome.config
OLLAMA_COMPOSEFILE=${OLLAMA_COMPOSEFILE:-/opt/ollama/compose/composefile.yml}
OPENWEBUI_COMPOSEFILE=${OPENWEBUI_COMPOSEFILE:-/opt/openwebui/compose/composefile.yml}
[[ -f ${CONFIG_FILE} ]] && source ${CONFIG_FILE}
docker compose -f ${OLLAMA_COMPOSEFILE} up -d
docker compose -f ${OPENWEBUI_COMPOSEFILE} up -d
# TODO: Create a stack based on the config and define multiple backends...
# Launch Backends on Demand instead of just using ollama...
# Maybe with the traefik middleware? https://plugins.traefik.io/plugins/6715d1d37dd5a6c3095befd4/sablier
#https://github.com/sablierapp/sablier

View File

@@ -0,0 +1,3 @@
#!/bin/bash
#

View File

@@ -0,0 +1,15 @@
#!/bin/bash
set -a
CONFIG_FILE=$(dirname "$(readlink -f "$0")")/aiathome.config
OLLAMA_COMPOSEFILE=${OLLAMA_COMPOSEFILE:-/opt/ollama/compose/composefile.yml}
OPENWEBUI_COMPOSEFILE=${OPENWEBUI_COMPOSEFILE:-/opt/openwebui/compose/composefile.yml}
[[ -f ${CONFIG_FILE} ]] && source ${CONFIG_FILE}
docker compose -f ${OLLAMA_COMPOSEFILE} stop
docker compose -f ${OPENWEBUI_COMPOSEFILE} stop
docker compose -f ${OLLAMA_COMPOSEFILE} rm -f
docker compose -f ${OPENWEBUI_COMPOSEFILE} rm -f

View File

@@ -0,0 +1,21 @@
---
- name: Create directories
ansible.builtin.file:
state: directory
path: "{{ item }}"
loop:
- "{{ apisix_install_dir }}"
- "{{ apisix_install_dir }}/config"
- name: Pull Apisix Image
community.docker.docker_image:
source: pull
name: "{{ apisix_image }}:{{ apisix_image_tag }}"
- name: Copy Config file
docker run -d --name apache-apisix \
-p 9080:9080 \
-e APISIX_STAND_ALONE=true \
apache/apisix

View File

@@ -0,0 +1,45 @@
---
- name: Create Install Dir
ansible.builtin.file:
path: "{{ ai_at_home_install_dir }}"
state: directory
mode: "0755"
loop:
- "{{ ai_at_home_install_dir }}"
- "{{ ai_at_home_install_dir }}/compose"
- "{{ ai_at_home_install_dir }}/sablier/config"
- "{{ ai_at_home_install_dir }}/apisix/plugins"
- "{{ ai_at_home_install_dir }}/apisix/config"
- name: Pull Images
community.docker.docker_image:
source: pull
name: "{{ item }}"
loop:
- "{{ sablier_image }}:{{ sablier_image_tag }}"
- "{{ apisix_image }}:{{ apisix_image_tag }}"
- name: Copy Templates
ansible.builtin.template:
src: "{{ item.src }}"
dest: "{{ item.dest }}"
mode: "0644"
loop:
- src: aiathome.config
dest: "{{ ai_at_home_install_dir }}/aiathome.config"
- src: composefile.yml
dest: "{{ ai_at_home_install_dir }}/compose/composefile.yml"
- src: sablier.yml
dest: "{{ ai_at_home_install_dir }}/sablier/sablier.yml"
- name: Copy Script
ansible.builtin.copy:
src: "{{ item }}"
dest: "{{ ai_at_home_install_dir }}/{{ item }}"
mode: "0755"
loop:
- runme.sh
- stopme.sh

View File

@@ -0,0 +1,5 @@
---
- name: Include selected operations for Ai @ Home
tags:
- aiathome
ansible.builtin.include_tasks: "{{ deployment_action|default('deploy') }}/main.yml"

View File

@@ -0,0 +1,5 @@
OLLAMA_COMPOSEFILE={{ ollama_composefile }}
OPENWEBUI_COMPOSEFILE={{ openwebui_composefile }}
# vllm/openwebui/ollama/openclawd etc..
AI_STACK=

View File

@@ -0,0 +1,11 @@
---
deployment:
role: data_plane
role_data_plane:
config_provider: yaml
wasm:
plugins:
- name: proxywasm_sablier_plugin
priority: 7997
file: /wasm/sablierproxywasm.wasm

View File

@@ -0,0 +1,26 @@
---
services:
apisix:
image: {{ apisix_image }}:{{ apisix_image_tag }}
env:
APISIX_STAND_ALONE: "true"
network_mode: host
volumes:
- {{ apisix_install_dir }}/config/apisix_config.yml:/usr/local/apisix/conf/config.yaml
sablier:
image: {{ sablier_image }}:{{ sablier_image_tag }}
command:
- start
- --provider.name=docker
network_mode: host
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- {{ ai_at_home_install_dir }}/sablier/config:/etc/sablier
docker run --name sablier \
-p 10000:10000 \
-v /var/run/docker.sock:/var/run/docker.sock \
sablierapp/sablier:1.10.5 \
start --provider.name=docker

View File

@@ -0,0 +1,34 @@
---
provider:
# Provider to use to manage containers (docker, swarm, kubernetes)
name: docker
server:
# The server port to use
port: 10000
# The base path for the API
base-path: /
storage:
# File path to save the state (default stateless)
file:
sessions:
# The default session duration (default 5m)
default-duration: 5m
# The expiration checking interval.
# Higher duration gives less stress on CPU.
# If you only use sessions of 1h, setting this to 5m is a good trade-off.
expiration-interval: 20s
logging:
level: debug
strategy:
dynamic:
# Custom themes folder, will load all .html files recursively (default empty)
custom-themes-path:
# Show instances details by default in waiting UI
show-details-by-default: false
# Default theme used for dynamic strategy (default "hacker-terminal")
default-theme: hacker-terminal
# Default refresh frequency in the HTML page for dynamic strategy
default-refresh-frequency: 5s
blocking:
# Default timeout used for blocking strategy (default 1m)
default-timeout: 1m

View File

@@ -0,0 +1,5 @@
---
ollama_install_dir: /opt/ollama
ollama_image: ollama/ollama
ollama_image_tag: latest
ollama_container_labels: []

View File

@@ -0,0 +1,18 @@
---
- name: Create Ollama Directories
ansible.builtin.file:
state: directory
path: "{{ ollama_install_dir }}/{{ item }}"
loop:
- data
- compose
- name: Pull Ollama Image
community.docker.docker_image:
source: pull
name: "{{ ollama_image }}:{{ ollama_image_tag }}"
- name: Copy composefile
ansible.builtin.template:
src: templates/composefile.yml
dest: "{{ ollama_install_dir }}/compose/composefile.yml"

View File

@@ -0,0 +1,5 @@
---
- name: Include selected operations for Ollama
tags:
- ollama
ansible.builtin.include_tasks: "{{ deployment_action|default('deploy') }}/main.yml"

View File

@@ -0,0 +1,20 @@
services:
ollama:
image: {{ ollama_image }}:{{ ollama_image_tag }}
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
network_mode: host
volumes:
- {{ ollama_install_dir }}/data:/root/.ollama
tty: true
restart: unless-stopped
{% if ollama_container_labels %}
labels:
{{ ollama_container_labels|to_nice_yaml|indent(4) }}
{% endif %}

View File

@@ -0,0 +1,5 @@
---
openwebui_install_dir: /opt/openwebui
openwebui_image: ghcr.io/open-webui/open-webui
openwebui_image_tag: main-slim
openwebui_container_labels: []

View File

@@ -0,0 +1,19 @@
---
- name: Create Directories
ansible.builtin.file:
state: directory
path: "{{ openwebui_install_dir }}/{{ item }}"
loop:
- data
- compose
- name: Pull Openwebui Image
community.docker.docker_image:
source: pull
name: "{{ openwebui_image }}:{{ openwebui_image_tag }}"
- name: Copy composefile
ansible.builtin.template:
src: templates/composefile.yml
dest: "{{ openwebui_install_dir }}/compose/composefile.yml"

View File

@@ -0,0 +1,5 @@
---
- name: Include selected operations for OpenWebUi
tags:
- openwebui
ansible.builtin.include_tasks: "{{ deployment_action|default('deploy') }}/main.yml"

View File

@@ -0,0 +1 @@
---

View File

@@ -0,0 +1,17 @@
---
services:
open-webui:
image: {{ openwebui_image }}:{{ openwebui_image_tag }}
network_mode: host
environment:
FORWARDED_ALLOW_IPS: '*'
OLLAMA_BASE_URL: http://localhost:11434
OFFLINE_MODE: True
DEFAULT_USER_ROLE: user
volumes:
- {{ openwebui_install_dir }}/data:/app/backend/data
{% if openwebui_container_labels %}
labels:
{{ openwebui_container_labels|to_nice_yaml|indent(4) }}
{% endif %}