diff --git a/roles/deploy_container_homepage/README.md b/roles/deploy_container_homepage/README.md new file mode 100644 index 0000000..952fea0 --- /dev/null +++ b/roles/deploy_container_homepage/README.md @@ -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. + +--- \ No newline at end of file diff --git a/roles/deploy_container_homepage/defaults/main.yml b/roles/deploy_container_homepage/defaults/main.yml new file mode 100644 index 0000000..0e0f29d --- /dev/null +++ b/roles/deploy_container_homepage/defaults/main.yml @@ -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" diff --git a/roles/deploy_container_homepage/files/bookmarks.yaml b/roles/deploy_container_homepage/files/bookmarks.yaml new file mode 100644 index 0000000..79c3694 --- /dev/null +++ b/roles/deploy_container_homepage/files/bookmarks.yaml @@ -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/ \ No newline at end of file diff --git a/roles/deploy_container_homepage/files/custom.css b/roles/deploy_container_homepage/files/custom.css new file mode 100644 index 0000000..e69de29 diff --git a/roles/deploy_container_homepage/files/custom.js b/roles/deploy_container_homepage/files/custom.js new file mode 100644 index 0000000..e69de29 diff --git a/roles/deploy_container_homepage/files/docker.yaml b/roles/deploy_container_homepage/files/docker.yaml new file mode 100644 index 0000000..725e92a --- /dev/null +++ b/roles/deploy_container_homepage/files/docker.yaml @@ -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 \ No newline at end of file diff --git a/roles/deploy_container_homepage/files/kubernetes.yaml b/roles/deploy_container_homepage/files/kubernetes.yaml new file mode 100644 index 0000000..4d2c40b --- /dev/null +++ b/roles/deploy_container_homepage/files/kubernetes.yaml @@ -0,0 +1,2 @@ +--- +# sample kubernetes config \ No newline at end of file diff --git a/roles/deploy_container_homepage/files/proxmox.yaml b/roles/deploy_container_homepage/files/proxmox.yaml new file mode 100644 index 0000000..7196f8f --- /dev/null +++ b/roles/deploy_container_homepage/files/proxmox.yaml @@ -0,0 +1,4 @@ +--- +# url: https://proxmox.host.or.ip:8006 +# token: username@pam!Token ID +# secret: secret \ No newline at end of file diff --git a/roles/deploy_container_homepage/files/services.yaml b/roles/deploy_container_homepage/files/services.yaml new file mode 100644 index 0000000..837ce28 --- /dev/null +++ b/roles/deploy_container_homepage/files/services.yaml @@ -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 😎 \ No newline at end of file diff --git a/roles/deploy_container_homepage/files/settings.yaml b/roles/deploy_container_homepage/files/settings.yaml new file mode 100644 index 0000000..1234d38 --- /dev/null +++ b/roles/deploy_container_homepage/files/settings.yaml @@ -0,0 +1,7 @@ +--- +# For configuration options and examples, please see: +# https://gethomepage.dev/configs/settings/ + +providers: + openweathermap: openweathermapapikey + weatherapi: weatherapiapikey \ No newline at end of file diff --git a/roles/deploy_container_homepage/files/widgets.yaml b/roles/deploy_container_homepage/files/widgets.yaml new file mode 100644 index 0000000..e55edec --- /dev/null +++ b/roles/deploy_container_homepage/files/widgets.yaml @@ -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 \ No newline at end of file diff --git a/roles/deploy_container_homepage/handlers/main.yml b/roles/deploy_container_homepage/handlers/main.yml new file mode 100644 index 0000000..e69de29 diff --git a/roles/deploy_container_homepage/meta/main.yml b/roles/deploy_container_homepage/meta/main.yml new file mode 100644 index 0000000..e69de29 diff --git a/roles/deploy_container_homepage/tasks/main.yml b/roles/deploy_container_homepage/tasks/main.yml new file mode 100644 index 0000000..290c0ff --- /dev/null +++ b/roles/deploy_container_homepage/tasks/main.yml @@ -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 diff --git a/roles/deploy_container_homepage/templates/.env.j2 b/roles/deploy_container_homepage/templates/.env.j2 new file mode 100644 index 0000000..7c71c97 --- /dev/null +++ b/roles/deploy_container_homepage/templates/.env.j2 @@ -0,0 +1,2 @@ +HOMEPAGE_VERSION={{ container_homepage_version }} +HOMEPAGE_DOMAIN={{ container_homepage_domain }} \ No newline at end of file diff --git a/roles/deploy_container_homepage/templates/docker-compose.yml.j2 b/roles/deploy_container_homepage/templates/docker-compose.yml.j2 new file mode 100644 index 0000000..ef15321 --- /dev/null +++ b/roles/deploy_container_homepage/templates/docker-compose.yml.j2 @@ -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 diff --git a/roles/deploy_container_homepage/vars/main.yml b/roles/deploy_container_homepage/vars/main.yml new file mode 100644 index 0000000..e69de29