# Step 5 — All Remaining Services **Track:** With AI (Beginner) **Time for this step:** 4–8 hours (take breaks — deploy one service at a time) In this step you will deploy the remaining eight services. For each one: 1. Create the folder 2. Create the `docker-compose.yml` file 3. Run `docker compose up -d` 4. Verify it is working 5. Move on to the next one For each service, ask your AI to explain the docker-compose file before you run it. --- ## How to Use Your AI for Each Service For every service in this step, you can say to your AI: > "I am setting up [service name] in my KiteStacks homelab. It is a self-hosted [description]. > Can you give me a docker-compose.yml for it that joins a network called 'kitestacks'? > I want to understand each part before I run it." Then ask follow-up questions about anything you do not understand. --- ## Service 4 — Open WebUI + LiteLLM (AI Chat) Open WebUI is your ChatGPT-style interface. LiteLLM sits behind it and routes your AI requests to OpenRouter (where you have free model access). ```bash mkdir -p ~/kitestacks-live/docker/kite-openwebui mkdir -p ~/kitestacks-live/docker/kite-litellm ``` **Ask your AI:** > "I want to set up Open WebUI (ghcr.io/open-webui/open-webui) with LiteLLM as the > backend. LiteLLM should route to OpenRouter. Can you give me docker-compose files > for both? Container names: kite-openwebui and kite-litellm. Network: kitestacks." Work with your AI to get the right environment variables (you will need your OpenRouter API key from openrouter.ai). Start both: ```bash cd ~/kitestacks-live/docker/kite-litellm && docker compose up -d cd ~/kitestacks-live/docker/kite-openwebui && docker compose up -d ``` Visit `ai.yourdomain.com` and create your admin account. --- ## Service 5 — Karakeep (Bookmarks) Karakeep saves bookmarks, articles, and links. It uses a headless Chrome browser to capture the full content of pages you save. ```bash mkdir -p ~/kitestacks-live/docker/karakeep ``` **Ask your AI:** > "I want to set up Karakeep (ghcr.io/karakeep/karakeep) for bookmark management. > It needs a headless Chrome container (browserless/chrome) for page capture and > a Meilisearch container for search. Container names: karakeep, karakeep-chrome, > karakeep-meilisearch. All on the 'kitestacks' network. Give me one docker-compose.yml > for all three." ```bash cd ~/kitestacks-live/docker/karakeep && docker compose up -d ``` Visit `links.yourdomain.com`. **Important:** When you set up SSO for Karakeep in Step 6, note that Karakeep uses NextAuth.js with the provider ID `custom` — so the OAuth2 redirect URL will be `https://links.yourdomain.com/api/auth/callback/custom` (not `/callback/authentik`). This is a common mistake. Make a note of it now. --- ## Service 6 — Kavita (eBook Reader) Kavita lets you read ebooks, manga, and comics from a library you maintain. ```bash mkdir -p ~/kitestacks-live/docker/kavita/library/books mkdir -p ~/kitestacks-live/docker/kavita/config ``` **Ask your AI:** > "I want to set up Kavita (jvmilazz0/kavita) as an ebook reader. Container name: kavita. > The library should be mounted from ./library/books into the container. Config directory > at ./config. Network: kitestacks. Give me the docker-compose.yml." ```bash cd ~/kitestacks-live/docker/kavita && docker compose up -d ``` Visit `kavita.yourdomain.com` and create your admin account. Add your books by placing ebook files in `~/kitestacks-live/docker/kavita/library/books/` and scanning the library in Kavita's settings. **Important for SSO:** Kavita's OIDC settings must be configured through the Kavita web UI, not by editing files directly. The Authority URL must end with a trailing slash: `https://auth.yourdomain.com/application/o/kavita/` --- ## Service 7 — Grafana (Monitoring Dashboards) Grafana shows you beautiful graphs of your server's CPU, RAM, network, and disk usage. ```bash mkdir -p ~/kitestacks-live/docker/grafana/provisioning/datasources mkdir -p ~/kitestacks-live/docker/grafana/provisioning/dashboards ``` **Ask your AI:** > "I want to set up Grafana (grafana/grafana) with Prometheus as the data source. > I want the 'Node Exporter Full' dashboard (id 1860) to auto-load via provisioning. > Container name: grafana. Network: kitestacks. Give me the docker-compose.yml and > the provisioning YAML files for the datasource and dashboard." ```bash cd ~/kitestacks-live/docker/grafana && docker compose up -d ``` Visit `grafana.yourdomain.com`. **Also set up Prometheus and node-exporter (Grafana needs these for data):** **Ask your AI:** > "I want to set up Prometheus to scrape metrics from node-exporter running on the same > host. Container names: prometheus and node-exporter. Network: kitestacks. Give me the > docker-compose.yml and prometheus.yml config file." --- ## Service 8 — Uptime Kuma (Status Page) Uptime Kuma monitors all your services and shows a public status page. ```bash mkdir -p ~/kitestacks-live/docker/uptime-kuma ``` **Ask your AI:** > "Set up Uptime Kuma (louislam/uptime-kuma). Container name: uptime-kuma. Network: kitestacks. > Use a named volume called 'uptime-kuma' for data. Give me the docker-compose.yml." ```bash cd ~/kitestacks-live/docker/uptime-kuma && docker compose up -d ``` Visit `status.yourdomain.com`, create your admin account, then add HTTP monitors for each of your eleven services. Set each monitor to check every 60 seconds. **Add a status page:** - In Uptime Kuma → Status Pages → New Status Page - Slug: `homelab` - Add all your monitors to it - Your public status page will be at `status.yourdomain.com/status/homelab` --- ## Service 9 — BookStack (Wiki) BookStack is a clean wiki for writing and organizing documentation. ```bash mkdir -p ~/kitestacks-live/docker/bookstack ``` **Ask your AI:** > "Set up BookStack (lscr.io/linuxserver/bookstack) with its own MariaDB database. > Container names: bookstack and bookstack-db. APP_URL should be https://wiki.yourdomain.com. > Network: kitestacks. Give me the docker-compose.yml." ```bash cd ~/kitestacks-live/docker/bookstack && docker compose up -d ``` BookStack takes about a minute to start on first run. Visit `wiki.yourdomain.com`. Default login: `admin@admin.com` / `password` — change this immediately. --- ## Service 10 — OSTicket (Help Desk) OSTicket is a help desk and ticketing system. ```bash mkdir -p ~/kitestacks-live/docker/osticket ``` **Ask your AI:** > "Set up OSTicket using the docker image campbellsoftwaresolutions/osticket with its > own MySQL database. Container names: osticket-app and osticket-db. Network: kitestacks. > What environment variables do I need? Give me the docker-compose.yml." ```bash cd ~/kitestacks-live/docker/osticket && docker compose up -d ``` Visit `tasks.yourdomain.com` to complete the web-based setup. --- ## Service 11 — Portainer (Docker Management) Portainer gives you a visual dashboard to manage all your containers. ```bash mkdir -p ~/kitestacks-live/docker/portainer ``` **Ask your AI:** > "Set up Portainer CE (portainer/portainer-ce). Container name: portainer. Port 9443 (HTTPS). > Mount the Docker socket (/var/run/docker.sock) so it can manage containers. > Network: kitestacks. Give me the docker-compose.yml." ```bash cd ~/kitestacks-live/docker/portainer && docker compose up -d ``` Visit `portainer.yourdomain.com`. Create your admin account. --- ## Checkpoint Run this to see all your containers: ```bash docker ps --format "table {{.Names}}\t{{.Status}}" ``` You should see all of these running: - cloudflared - homepage - forgejo - authentik + authentik-worker - kite-openwebui + kite-litellm - karakeep + karakeep-chrome + karakeep-meilisearch - kavita - grafana + prometheus + node-exporter - uptime-kuma - bookstack + bookstack-db - osticket-app + osticket-db - portainer - authentik-postgres + authentik-redis If any are missing or show as unhealthy, check their logs: ```bash docker logs ``` Ask your AI to help diagnose any errors. --- **Next:** [Step 6 — Single Sign-On (SSO)](06-sso.md)