add homepage (dashboard) container

This commit is contained in:
Kevin Heyer 2025-06-15 09:29:35 +02:00
parent 1b1042fe03
commit 1d6c8f3a6f
17 changed files with 268 additions and 0 deletions

View file

@ -0,0 +1,112 @@
Hier ist ein passendes **README.md**, das deine Anforderungen erfüllt:
---
# 📦 Ansible Role: Container Homepage
This role deploys a tenant-specific instance of the **homepage container** (e.g. [gethomepage.dev](https://gethomepage.dev))
It uses Docker Compose and copies custom configuration files per host.
---
## 🚀 **Getting Started**
### 1⃣ **Prepare tenant-specific config files**
All example config files are located in:
```
roles/container_homepage/files/
```
👉 Copy these files to your inventory directory under the following structure:
```
inventory/[TENANT]/host_files/[HOST]/container_homepage_config_files/
```
Example:
```
inventory/tenant1/host_files/docker1/container_homepage_config_files/bookmarks.yaml
inventory/tenant1/host_files/docker1/container_homepage_config_files/settings.yaml
...
```
⚠️ **Customize these files** before deploying, according to the requirements of your tenant and host.
---
## ⚙️ **Default Variables**
These are defined in `defaults/main.yml`:
```yaml
container_homepage_version: latest
container_homepage_domain: dashboard.example.com
container_homepage_directory: /opt/docker/homepage
container_homepage_config_files:
- src: "{{ inventory_dir }}/host_files/{{ inventory_hostname }}/container_homepage_config_files/bookmarks.yaml"
dest: "bookmarks.yaml"
- src: "{{ inventory_dir }}/host_files/{{ inventory_hostname }}/container_homepage_config_files/settings.yaml"
dest: "settings.yaml"
- src: "{{ inventory_dir }}/host_files/{{ inventory_hostname }}/container_homepage_config_files/custom.css"
dest: "custom.css"
- src: "{{ inventory_dir }}/host_files/{{ inventory_hostname }}/container_homepage_config_files/custom.js"
dest: "custom.js"
- src: "{{ inventory_dir }}/host_files/{{ inventory_hostname }}/container_homepage_config_files/docker.yaml"
dest: "docker.yaml"
- src: "{{ inventory_dir }}/host_files/{{ inventory_hostname }}/container_homepage_config_files/kubernetes.yaml"
dest: "kubernetes.yaml"
- src: "{{ inventory_dir }}/host_files/{{ inventory_hostname }}/container_homepage_config_files/services.yaml"
dest: "services.yaml"
- src: "{{ inventory_dir }}/host_files/{{ inventory_hostname }}/container_homepage_config_files/widgets.yaml"
dest: "widgets.yaml"
```
---
## 📂 **Inventory example**
```
inventory/
└── tenant1/
├── hosts.yml
└── host_files/
└── docker1/
└── container_homepage_config_files/
├── bookmarks.yaml
├── settings.yaml
├── custom.css
├── custom.js
├── docker.yaml
├── kubernetes.yaml
├── services.yaml
└── widgets.yaml
```
---
## 📝 **Usage**
Run your playbook as usual:
```bash
ansible-playbook -i inventory/tenant1/inventory.yml playbooks/playbook.yml
```
The role will:
✅ Ensure directories exist
✅ Deploy Docker Compose and environment files
✅ Copy the tenant-specific configuration files
✅ Start or update the container
---
## 💡 Notes
* The role expects Docker (with compose v2 plugin) to be installed on the target host.
* The docker-compose and .env files should be templated or provided by your playbook or role.
* Make sure the `container_homepage_directory` location has correct permissions for your user/container runtime.
---

View file

@ -0,0 +1,20 @@
container_homepage_version: latest
container_homepage_domain: dashboard.example.com
container_homepage_directory: /opt/docker/homepage
container_homepage_config_files:
- src: "{{ inventory_dir }}/host_files/{{ inventory_hostname }}/container_homepage_config_files/bookmarks.yaml"
dest: "bookmarks.yaml"
- src: "{{ inventory_dir }}/host_files/{{ inventory_hostname }}/container_homepage_config_files/settings.yaml"
dest: "settings.yaml"
- src: "{{ inventory_dir }}/host_files/{{ inventory_hostname }}/container_homepage_config_files/custom.css"
dest: "custom.css"
- src: "{{ inventory_dir }}/host_files/{{ inventory_hostname }}/container_homepage_config_files/custom.js"
dest: "custom.js"
- src: "{{ inventory_dir }}/host_files/{{ inventory_hostname }}/container_homepage_config_files/docker.yaml"
dest: "docker.yaml"
- src: "{{ inventory_dir }}/host_files/{{ inventory_hostname }}/container_homepage_config_files/kubernetes.yaml"
dest: "kubernetes.yaml"
- src: "{{ inventory_dir }}/host_files/{{ inventory_hostname }}/container_homepage_config_files/services.yaml"
dest: "services.yaml"
- src: "{{ inventory_dir }}/host_files/{{ inventory_hostname }}/container_homepage_config_files/widgets.yaml"
dest: "widgets.yaml"

View file

@ -0,0 +1,18 @@
---
# For configuration options and examples, please see:
# https://gethomepage.dev/configs/bookmarks
- Developer:
- Github:
- abbr: GH
href: https://github.com/
- Social:
- Reddit:
- abbr: RE
href: https://reddit.com/
- Entertainment:
- YouTube:
- abbr: YT
href: https://youtube.com/

View file

@ -0,0 +1,10 @@
---
# For configuration options and examples, please see:
# https://gethomepage.dev/configs/docker/
# my-docker:
# host: 127.0.0.1
# port: 2375
# my-docker:
# socket: /var/run/docker.sock

View file

@ -0,0 +1,2 @@
---
# sample kubernetes config

View file

@ -0,0 +1,4 @@
---
# url: https://proxmox.host.or.ip:8006
# token: username@pam!Token ID
# secret: secret

View file

@ -0,0 +1,18 @@
---
# For configuration options and examples, please see:
# https://gethomepage.dev/configs/services/
- My First Group:
- My First Service:
href: http://localhost/
description: Homepage is awesome
- My Second Group:
- My Second Service:
href: http://localhost/
description: Homepage is the best
- My Third Group:
- My Third Service:
href: http://localhost/
description: Homepage is 😎

View file

@ -0,0 +1,7 @@
---
# For configuration options and examples, please see:
# https://gethomepage.dev/configs/settings/
providers:
openweathermap: openweathermapapikey
weatherapi: weatherapiapikey

View file

@ -0,0 +1,12 @@
---
# For configuration options and examples, please see:
# https://gethomepage.dev/configs/info-widgets/
- resources:
cpu: true
memory: true
disk: /
- search:
provider: duckduckgo
target: _blank

View file

@ -0,0 +1,34 @@
---
- name: Ensure data directories exist
ansible.builtin.file:
path: "{{ container_homepage_directory }}/data/{{ item }}"
state: directory
mode: '0755'
loop:
- "config"
become: false
- name: Deploy Docker Compose and .env files
ansible.builtin.template:
src: "{{ item.src }}"
dest: "{{ container_homepage_directory }}/{{ item.dest }}"
mode: '0644'
loop:
- { src: 'docker-compose.yml.j2', dest: 'docker-compose.yml' }
- { src: '.env.j2', dest: '.env' }
become: false
- name: Deploy tenant-specific config files
ansible.builtin.copy:
src: "{{ item.src }}"
dest: "{{ container_homepage_directory }}/data/config/{{ item.dest }}"
mode: '0644'
loop: "{{ container_homepage_config_files }}"
become: false
- name: Start Container
community.docker.docker_compose_v2:
project_src: "{{ container_homepage_directory }}"
pull: always
docker_host: "unix:///run/user/1000/docker.sock"
become: false

View file

@ -0,0 +1,2 @@
HOMEPAGE_VERSION={{ container_homepage_version }}
HOMEPAGE_DOMAIN={{ container_homepage_domain }}

View file

@ -0,0 +1,29 @@
---
services:
homepage:
image: ghcr.io/gethomepage/homepage:${HOMEPAGE_VERSION}
container_name: homepage
restart: always
networks:
- traefik
volumes:
- ./data/config:/app/config
- /run/user/1000/docker.sock:/var/run/docker.sock:ro
labels:
- "traefik.enable=true"
- "traefik.docker.network=traefik"
- "traefik.http.routers.homepage.entrypoints=http"
- "traefik.http.routers.homepage.rule=Host(`${HOMEPAGE_DOMAIN}`)"
- "traefik.http.middlewares.homepage-https-redirect.redirectscheme.scheme=https"
- "traefik.http.routers.homepage.middlewares=homepage-https-redirect"
- "traefik.http.routers.homepage-secure.entrypoints=https"
- "traefik.http.routers.homepage-secure.rule=Host(`${HOMEPAGE_DOMAIN}`)"
- "traefik.http.routers.homepage-secure.tls=true"
- "traefik.http.routers.homepage-secure.service=homepage"
- "traefik.http.services.homepage.loadbalancer.server.port=3000"
environment:
HOMEPAGE_ALLOWED_HOSTS: "*"
networks:
traefik:
external: true