Further feature implementation for flock.town

This commit is contained in:
Kevin Veen-Birkenbach 2025-02-19 22:03:17 +01:00
parent dfa740456f
commit 7d24e1d414
20 changed files with 424 additions and 143 deletions

View File

@ -9,6 +9,7 @@ nginx:
servers: "/etc/nginx/conf.d/http/servers/" # Contains one configuration per domain servers: "/etc/nginx/conf.d/http/servers/" # Contains one configuration per domain
maps: "/etc/nginx/conf.d/http/maps/" # Contains mappings maps: "/etc/nginx/conf.d/http/maps/" # Contains mappings
streams: "/etc/nginx/conf.d/streams/" # Contains streams configuration e.g. for ldaps streams: "/etc/nginx/conf.d/streams/" # Contains streams configuration e.g. for ldaps
data:
well_known: "/usr/share/nginx/well-known/" # Path where well-known files are stored well_known: "/usr/share/nginx/well-known/" # Path where well-known files are stored
html: "/var/www/public_html/" # Path where the static homepage files are stored html: "/var/www/public_html/" # Path where the static homepage files are stored
files: "/var/www/public_files/" # Path where the web accessable files are stored files: "/var/www/public_files/" # Path where the web accessable files are stored

View File

@ -1,4 +1,4 @@
global_theming: defaults_design:
enabled: true enabled: true
css: css:
colors: colors:

View File

@ -1,6 +1,5 @@
# This is just a dummy person.
# Adapt the values in your inventory file # Adapt the values in your inventory file
person: defaults_service_provider:
type: "legal" # Accepted Values: natural, legal type: "legal" # Accepted Values: natural, legal
name: "CyMaIS Demo Instance" name: "CyMaIS Demo Instance"
description: description:

View File

@ -28,6 +28,7 @@
- name: Merge application definitions - name: Merge application definitions
set_fact: set_fact:
applications: "{{ defaults_applications | combine(applications | default({}, true), recursive=True) }}" applications: "{{ defaults_applications | combine(applications | default({}, true), recursive=True) }}"
- name: Merge networks definitions - name: Merge networks definitions
set_fact: set_fact:
networks: "{{ defaults_networks | combine(networks | default({}, true), recursive=True) }}" networks: "{{ defaults_networks | combine(networks | default({}, true), recursive=True) }}"
@ -36,6 +37,14 @@
set_fact: set_fact:
oidc: "{{ defaults_oidc | combine(oidc | default({}, true), recursive=True) }}" oidc: "{{ defaults_oidc | combine(oidc | default({}, true), recursive=True) }}"
- name: Merge design configuration
set_fact:
design: "{{ defaults_design | combine(design | default({}, true), recursive=True) }}"
- name: Merge service_provider configuration
set_fact:
service_provider: "{{ defaults_service_provider | combine(service_provider | default({}, true), recursive=True) }}"
- name: print oidc dict - name: print oidc dict
debug: debug:
var: oidc var: oidc

View File

@ -3,7 +3,7 @@ application_id: "matrix"
database_password: "{{matrix_database_password}}" database_password: "{{matrix_database_password}}"
database_type: "postgres" database_type: "postgres"
registration_file_folder: "/data/" registration_file_folder: "/data/"
well_known_directory: "{{nginx.directories.well_known}}/matrix/" well_known_directory: "{{nginx.directories.data.well_known}}/matrix/"
bridges: bridges:
- database_password: "{{ mautrix_whatsapp_bridge_database_password }}" - database_password: "{{ mautrix_whatsapp_bridge_database_password }}"

View File

@ -1,7 +1,7 @@
--- ---
accounts: accounts:
name: Online Presence name: Online Presence
description: Discover {{ 'our' if person.type == 'legal' else 'my' }} online presence. description: Discover {{ 'our' if service_provider.type == 'legal' else 'my' }} online presence.
icon: icon:
class: fa-solid fa-users class: fa-solid fa-users
children: children:
@ -11,143 +11,391 @@ accounts:
class: fas fa-newspaper class: fas fa-newspaper
children: children:
- name: Microblogs - name: Microblogs
description: Stay updated with {{ 'our' if person.type == 'legal' else 'my' }} microblogs. description: Stay updated with {{ 'our' if service_provider.type == 'legal' else 'my' }} microblogs.
icon: icon:
class: fa-solid fa-pen-nib class: fa-solid fa-pen-nib
children: children:
{% if person.contact.mastodon is defined %} {% if service_provider.contact.mastodon is defined %}
- name: Mastodon - name: Mastodon
description: Follow {{ 'our' if person.type == 'legal' else 'my' }} updates on Mastodon. description: Follow {{ 'our' if service_provider.type == 'legal' else 'my' }} updates on Mastodon.
icon: icon:
class: fa-brands fa-mastodon class: fa-brands fa-mastodon
url: "https://{{ person.contact.mastodon.split('@')[2] }}/@{{ person.contact.mastodon.split('@')[1] }}" url: "https://{{ service_provider.contact.mastodon.split('@')[2] }}/@{{ service_provider.contact.mastodon.split('@')[1] }}"
identifier: "{{person.contact.mastodon}}" identifier: "{{service_provider.contact.mastodon}}"
{% endif %} {% endif %}
{% if person.contact.bluesky is defined %} {% if service_provider.contact.bluesky is defined %}
- name: Bluesky - name: Bluesky
description: Follow {{ 'our' if person.type == 'legal' else 'my' }} on Bluesky. description: Follow {{ 'our' if service_provider.type == 'legal' else 'my' }} on Bluesky.
icon: icon:
class: fa-brands fa-bluesky class: fa-brands fa-bluesky
alternatives: alternatives:
- link: accounts.publishingchannels.microblogs.mastodon - link: accounts.publishingchannels.microblogs.mastodon
identifier: "{{person.contact.bluesky}}" identifier: "{{service_provider.contact.bluesky}}"
{% endif %} {% endif %}
{% if person.contact.pixelfed is defined %} {% if service_provider.contact.pixelfed is defined %}
- name: Pictures - name: Pictures
description: Explore {{ 'our' if person.type == 'legal' else 'my' }} photo gallery on Pixelfed. description: Explore {{ 'our' if service_provider.type == 'legal' else 'my' }} photo gallery on Pixelfed.
icon: icon:
class: fa-solid fa-camera class: fa-solid fa-camera
identifier: "{{person.contact.pixelfed}}" identifier: "{{service_provider.contact.pixelfed}}"
url: "https://{{ person.contact.pixelfed.split('@')[2] }}/@{{ person.contact.pixelfed.split('@')[1] }}" url: "https://{{ service_provider.contact.pixelfed.split('@')[2] }}/@{{ service_provider.contact.pixelfed.split('@')[1] }}"
{% endif %} {% endif %}
{% if person.contact.peertube is defined %} {% if service_provider.contact.peertube is defined %}
- name: Peertube - name: Peertube
description: Discover {{ 'our' if person.type == 'legal' else 'my' }} videos on Peertube. description: Discover {{ 'our' if service_provider.type == 'legal' else 'my' }} videos on Peertube.
icon: icon:
class: fa-solid fa-video class: fa-solid fa-video
identifier: "{{person.contact.peertube}}" identifier: "{{service_provider.contact.peertube}}"
url: "https://{{ person.contact.peertube.split('@')[2] }}/@{{ person.contact.peertube.split('@')[1] }}" url: "https://{{ service_provider.contact.peertube.split('@')[2] }}/@{{ service_provider.contact.peertube.split('@')[1] }}"
{% endif %} {% endif %}
{% if person.contact.wordpress is defined %} {% if service_provider.contact.wordpress is defined %}
- name: Blog - name: Blog
description: Read {{ 'our' if person.type == 'legal' else 'my' }} articles and stories. description: Read {{ 'our' if service_provider.type == 'legal' else 'my' }} articles and stories.
icon: icon:
class: fa-solid fa-blog class: fa-solid fa-blog
identifier: "{{person.contact.wordpress}}" identifier: "{{service_provider.contact.wordpress}}"
url: "https://{{ person.contact.wordpress.split('@')[2] }}/@{{ person.contact.wordpress.split('@')[1] }}" url: "https://{{ service_provider.contact.wordpress.split('@')[2] }}/@{{ service_provider.contact.wordpress.split('@')[1] }}"
{% endif %} {% endif %}
{% if person.legal.source_code is defined %} {% if service_provider.legal.source_code is defined %}
- name: Our Code - name: Our Code
description: Explore {{ 'our' if person.type == 'legal' else 'my' }} code. description: Explore {{ 'our' if service_provider.type == 'legal' else 'my' }} code.
icon: icon:
class: fa-solid fa-code class: fa-solid fa-code
url: "{{person.legal.source_code}}" url: "{{service_provider.legal.source_code}}"
{% endif %} {% endif %}
{% if person.contact.friendica is defined %} {% if service_provider.contact.friendica is defined %}
- name: Social Network - name: Social Network
description: Visit {{ 'our' if person.type == 'legal' else 'my' }} friendica profile description: Visit {{ 'our' if service_provider.type == 'legal' else 'my' }} friendica profile
icon: icon:
class: fas fa-network-wired class: fas fa-network-wired
identifier: "{{person.contact.friendica}}" identifier: "{{service_provider.contact.friendica}}"
url: "https://{{ person.contact.friendica.split('@')[2] }}/@{{ person.contact.friendica.split('@')[1] }}" url: "https://{{ service_provider.contact.friendica.split('@')[2] }}/@{{ service_provider.contact.friendica.split('@')[1] }}"
{% endif %} {% endif %}
- link: navigation.header.contact - link: navigation.header.contact
cards: cards:
#{% if "matomo" in group_names %}
#- icon:
# class: "fa-solid fa-chart-line"
# title: "Matomo Analytics"
# text: "Experience the power of Matomo, an innovative open-source analytics platform that delivers real-time insights, robust visitor tracking, and privacy-first features to elevate your website performance. Dive into actionable data with unmatched precision and clarity!"
# url: domains.matomo
# link_text: "Discover Matomo Now!"
#{% endif %}
#{% if "ldap" in group_names %}
#- icon:
# class: "fa-solid fa-users"
# title: "LDAP Directory"
# text: "Unleash the potential of centralized identity management with our vibrant LDAP solution. Enjoy seamless authentication, efficient user management, and enhanced security that empowers your organization to stay connected, agile, and ahead of the curve in digital transformation."
# url: domains.ldap
# link_text: "Empower Your Network!"
#{% endif %}
#{% if "keycloak" in group_names %}
#- icon:
# class: "fa-solid fa-lock"
# title: "Keycloak Identity"
# text: "Step into a secure future with Keycloak! Our dynamic identity and access management solution offers streamlined SSO capabilities, robust security measures, and an intuitive user experience that propels your applications to unprecedented heights of performance and reliability."
# url: domains.keycloak
# link_text: "Secure Your Future Now!"
#{% endif %}
{% if "nextcloud" in group_names %}
- icon: - icon:
source: https://cloud.veen.world/s/logo_agile_coach_512x512/download class: "fa-solid fa-cloud"
title: Agile Coach title: "Nextcloud"
text: I lead agile transformations and improve team dynamics through Scrum, DevOps, text: "Elevate your collaboration with Nextcloud, a vibrant self-hosted cloud solution designed for dynamic file sharing, seamless communication, and effortless teamwork. Embrace unparalleled control, flexibility, and a boosted digital workspace that adapts to your every need."
and Agile Coaching. My goal is to enhance collaboration and efficiency in organizations, url: domains.nextcloud
ensuring agile principles are effectively implemented for sustainable success. link_text: "Experience Nextcloud Today!"
url: https://www.agile-coach.world {% endif %}
link_text: www.agile-coach.world
{% if "gitea" in group_names %}
- icon: - icon:
source: https://cloud.veen.world/s/logo_personal_coach_512x512/download class: "fa-solid fa-code"
title: Personal Coach title: "Gitea"
text: Offering personalized coaching for growth and development, I utilize a blend text: "Boost your development journey with Gitea, a lightweight and energetic self-hosted Git service that offers efficient code collaboration, intuitive version control, and an agile environment for your projects. Ignite your coding spirit, innovate faster, and code with confidence!"
of hypnotherapy, mediation, and holistic techniques. My approach is tailored to url: domains.gitea
help you achieve personal and professional milestones, fostering holistic well-being. link_text: "Ignite Your Code Now!"
url: https://www.personalcoach.berlin {% endif %}
link_text: www.personalcoach.berlin
{% if "wordpress" in group_names %}
- icon: - icon:
source: https://cloud.veen.world/s/logo_yachtmaster_512x512/download class: "fa-solid fa-blog"
title: Yachtmaster title: "WordPress"
text: As a Yachtmaster, I provide comprehensive sailing education, yacht delivery, text: "Unleash your creative potential with WordPress, a dynamic platform that empowers you to build, manage, and scale stunning websites and blogs effortlessly. Experience an ever-evolving ecosystem that inspires innovation and drives digital success with every click."
and voyage planning services. Whether you're learning to sail or need an experienced url: domains.wordpress
skipper, my expertise ensures a safe and enjoyable experience on the water. link_text: "Launch Your Site Today!"
url: https://www.yachtmaster.world {% endif %}
link_text: www.yachtmaster.world
{% if "mediawiki" in group_names %}
- icon: - icon:
source: https://cloud.veen.world/s/logo_yachtmaster_512x512/download class: "fa-solid fa-book"
title: Yachtmaster title: "MediaWiki"
text: As a Yachtmaster, I provide comprehensive sailing education, yacht delivery, text: "Empower your knowledge base with MediaWiki, a versatile and collaborative platform designed to build comprehensive, user-driven documentation. Embrace an energetic community and innovative tools that turn information into a vibrant, living resource."
and voyage planning services. Whether you're learning to sail or need an experienced url: domains.mediawiki
skipper, my expertise ensures a safe and enjoyable experience on the water. link_text: "Explore MediaWiki Now!"
url: https://www.yachtmaster.world {% endif %}
link_text: www.yachtmaster.world
{% if "mybb" in group_names %}
- icon:
class: "fa-solid fa-comments"
title: "MyBB Forum"
text: "Transform your community engagement with MyBB, a feature-rich forum solution that combines modern design with robust functionality. Enjoy dynamic discussions, intuitive moderation, and an energetic user interface that brings people together like never before."
url: domains.mybb
link_text: "Join the Conversation!"
{% endif %}
{% if "yourls" in group_names %}
- icon:
class: "fa-solid fa-link"
title: "YOURLS URL Shortener"
text: "Streamline your online presence with YOURLS, a nimble URL shortening solution that makes sharing links faster, easier, and more engaging. Enjoy the benefits of enhanced tracking and a user-friendly interface that energizes your digital strategy."
url: domains.yourls
link_text: "Shorten Links Instantly!"
{% endif %}
{% if "mailu" in group_names %}
- icon:
class: "fa-solid fa-envelope"
title: "Mailu Mail Server"
text: "Revolutionize your email communications with Mailu, a secure and flexible mail server solution that integrates seamlessly into your workflow. Experience enhanced reliability, robust security, and an energetic approach to managing your digital correspondence."
url: domains.mailu
link_text: "Elevate Your Email Now!"
{% endif %}
{% if "mastodon" in group_names %}
- icon:
class: "fa-solid fa-bullhorn"
title: "Mastodon Social"
text: "Dive into a decentralized social experience with Mastodon, a vibrant platform that redefines online communication with its community-driven approach. Enjoy a refreshing burst of innovation, freedom, and energetic interaction every time you connect."
url: domains.mastodon
link_text: "Join the Social Revolution!"
{% endif %}
{% if "pixelfed" in group_names %}
- icon:
class: "fa-solid fa-camera"
title: "Pixelfed"
text: "Showcase your visual story with Pixelfed, an inspiring self-hosted image sharing platform that champions creativity and privacy. Revel in a dynamic, artistic environment where every photo is a window to endless possibilities and vibrant expression."
url: domains.pixelfed
link_text: "Share Your Vision Now!"
{% endif %}
{% if "peertube" in group_names %}
- icon:
class: "fa-solid fa-video"
title: "PeerTube"
text: "Embrace a new era of video hosting with PeerTube, a decentralized platform that empowers creators with freedom, innovation, and a community-focused approach. Experience seamless streaming and dynamic sharing that fuels your creative ambitions."
url: domains.peertube
link_text: "Stream with Freedom!"
{% endif %}
{% if "bigbluebutton" in group_names %}
- icon:
class: "fa-solid fa-chalkboard-teacher"
title: "BigBlueButton"
text: "Transform online learning and collaboration with BigBlueButton, an interactive web conferencing solution designed to energize virtual classrooms and meetings. Enjoy dynamic tools and an engaging environment that makes every session a powerful learning experience."
url: domains.bigbluebutton
link_text: "Start Your Virtual Session!"
{% endif %}
{% if "funkwhale" in group_names %}
- icon:
class: "fa-solid fa-music"
title: "Funkwhale"
text: "Dive into a world of rhythm and sound with Funkwhale, an innovative self-hosted music sharing platform that celebrates creativity and community. Experience an energetic soundscape and seamless music streaming that amplifies your passion for tunes."
url: domains.funkwhale
link_text: "Jam Out Now!"
{% endif %}
{% if "joomla" in group_names %}
- icon:
class: "fa-solid fa-sitemap"
title: "Joomla CMS"
text: "Elevate your website management with Joomla, a powerful content management system that fuses versatility with dynamic design. Experience a vibrant platform that inspires creativity and drives your digital presence to new, energetic heights."
url: domains.joomla
link_text: "Build with Joomla Today!"
{% endif %}
{% if "attendize" in group_names %}
- icon:
class: "fa-solid fa-calendar-check"
title: "Attendize"
text: "Revolutionize your event management with Attendize, an energetic and intuitive platform designed to streamline ticketing and event planning. Enjoy a feature-rich, user-friendly solution that transforms every event into an unforgettable experience."
url: domains.attendize
link_text: "Plan Your Event Now!"
{% endif %}
{% if "baserow" in group_names %}
- icon:
class: "fa-solid fa-table"
title: "Baserow"
text: "Empower your data management with Baserow, an innovative platform that makes building and managing databases both fun and efficient. Enjoy a dynamic interface, seamless collaboration, and energetic tools that supercharge your workflow."
url: domains.baserow
link_text: "Manage Data with Ease!"
{% endif %}
{% if "listmonk" in group_names %}
- icon:
class: "fa-solid fa-list"
title: "Listmonk"
text: "Elevate your email marketing with Listmonk, a high-energy, self-hosted solution that offers powerful newsletter management and analytics. Enjoy an intuitive design, robust features, and a spirited approach that takes your campaigns to the next level."
url: domains.listmonk
link_text: "Boost Your Campaigns Now!"
{% endif %}
{% if "discourse" in group_names %}
- icon:
class: "fa-solid fa-comment-dots"
title: "Discourse Forum"
text: "Ignite community conversations with Discourse, an innovative forum platform that redefines online discussions with its modern, engaging interface. Experience an energetic, user-friendly environment that brings people together and fuels vibrant exchanges."
url: domains.discourse
link_text: "Join the Discussion!"
{% endif %}
{% if "matrix" in group_names %}
- icon:
class: "fa-solid fa-satellite-dish"
title: "Matrix"
text: "Step into the future of communication with Matrix, a dynamic and decentralized platform that delivers secure, real-time messaging and collaboration. Enjoy an innovative ecosystem that energizes your digital interactions and connects you globally."
url: domains.matrix
link_text: "Connect on Matrix Now!"
{% endif %}
{% if "openproject" in group_names %}
- icon:
class: "fa-solid fa-project-diagram"
title: "OpenProject"
text: "Transform your project management with OpenProject, a vibrant and collaborative tool that brings clarity and energy to your planning, tracking, and team communication. Experience streamlined workflows and an innovative platform that propels your projects forward."
url: domains.openproject
link_text: "Manage Projects Dynamically!"
{% endif %}
{% if "gitlab" in group_names %}
- icon:
class: "fa-solid fa-code-branch"
title: "GitLab"
text: "Accelerate your software development with GitLab, an energetic, all-in-one platform for source code management and continuous integration. Experience a robust, collaborative environment that empowers teams to innovate and deliver exceptional results."
url: domains.gitlab
link_text: "Revolutionize Your DevOps!"
{% endif %}
{% if "akaunting" in group_names %}
- icon:
class: "fa-solid fa-file-invoice-dollar"
title: "Akaunting"
text: "Empower your financial management with Akaunting, a dynamic and feature-rich accounting platform designed to simplify your bookkeeping and boost your business growth. Enjoy intuitive tools, real-time insights, and an energetic approach to your finances."
url: domains.akaunting
link_text: "Transform Your Finances Today!"
{% endif %}
{% if "moodle" in group_names %}
- icon:
class: "fa-solid fa-graduation-cap"
title: "Moodle"
text: "Ignite the learning experience with Moodle, a powerful and versatile platform for online education that energizes classrooms and fosters interactive learning. Embrace innovative tools, engaging content, and a dynamic community of educators and learners."
url: domains.moodle
link_text: "Start Learning Now!"
{% endif %}
{% if "taiga" in group_names %}
- icon:
class: "fa-solid fa-tasks"
title: "Taiga"
text: "Supercharge your project management with Taiga, a dynamic and agile tool designed for teams that thrive on creativity and collaboration. Experience a vibrant interface, robust task tracking, and an energetic platform that drives your projects to success."
url: domains.taiga
link_text: "Boost Your Projects Now!"
{% endif %}
{% if "friendica" in group_names %}
- icon:
class: "fa-solid fa-user-friends"
title: "Friendica"
text: "Connect and share like never before with Friendica, an innovative social networking platform that celebrates community, freedom, and dynamic interactions. Enjoy a spirited and open environment where every connection is a step toward a more engaging digital world."
url: domains.friendica
link_text: "Join the Social Movement!"
{% endif %}
#{% if "portfolio" in group_names %}
#- icon:
# class: "fa-solid fa-briefcase"
# title: "Portfolio"
# text: "Showcase your professional journey with Portfolio, a dynamic platform that combines creativity and functionality to highlight your achievements. Experience an energetic design, intuitive features, and a compelling way to present your work to the world."
# url: domains.portfolio
# link_text: "Elevate Your Profile Now!"
#{% endif %}
{% if "bluesky" in group_names %}
- icon:
class: "fa-solid fa-sun"
title: "Bluesky"
text: "Soar to new digital heights with Bluesky, an innovative platform that reimagines social networking with its forward-thinking, community-driven approach. Experience a burst of energy, creativity, and the freedom to connect in a truly inspiring way."
url: domains.bluesky
link_text: "Soar with Bluesky Today!"
{% endif %}
{% if "phpmyadmin" in group_names %}
- icon:
class: "fa-solid fa-database"
title: "PHPMyAdmin"
text: "Manage your databases with confidence using PHPMyAdmin, a robust and dynamic tool designed to simplify administration and enhance productivity. Enjoy an intuitive interface, powerful features, and an energetic approach that makes database management a breeze."
url: domains.phpmyadmin
link_text: "Optimize Your Database Now!"
{% endif %}
{% if "snipe_it" in group_names %}
- icon:
class: "fa-solid fa-box"
title: "SNIPE-IT"
text: "Streamline your asset management with SNIPE-IT, a cutting-edge solution that brings efficiency, clarity, and energy to tracking your hardware and software inventory. Experience a user-friendly design and dynamic features that make asset management simple and engaging."
url: domains.snipe_it
link_text: "Manage Assets Effortlessly!"
{% endif %}
company: company:
titel: {{person.name}} titel: {{service_provider.name}}
subtitel: {{person.description.subtitel}} subtitel: {{service_provider.description.subtitel}}
logo: logo:
source: https://cloud.veen.world/s/logo_face_512x512/download source: https://cloud.veen.world/s/logo_face_512x512/download
favicon: favicon:
source: https://cloud.veen.world/s/veen_world_favicon/download source: https://cloud.veen.world/s/veen_world_favicon/download
address: address:
{{ person.address | to_nice_yaml(indent=4) | indent(4, true) }} {{ service_provider.address | to_nice_yaml(indent=4) | indent(4, true) }}
imprint_url: https://s.veen.world/imprint imprint_url: https://s.veen.world/imprint
navigation: navigation:
header: header:
children: children:
- link: accounts.publishingchannels.children - link: accounts.publishingchannels.children
- name: Contact - name: Contact
description: Get in touch with {{ 'us' if person.type == 'legal' else 'me' }} description: Get in touch with {{ 'us' if service_provider.type == 'legal' else 'me' }}
icon: icon:
class: fa-solid fa-envelope class: fa-solid fa-envelope
children: children:
{% if person.contact.email is defined %} {% if service_provider.contact.email is defined %}
- name: Email - name: Email
description: Send {{ 'us' if person.type == 'legal' else 'me' }} an email description: Send {{ 'us' if service_provider.type == 'legal' else 'me' }} an email
icon: icon:
class: fa-solid fa-envelope class: fa-solid fa-envelope
url: mailto:{{person.contact.email}} url: mailto:{{service_provider.contact.email}}
identifier: {{person.contact.email}} identifier: {{service_provider.contact.email}}
{% endif %} {% endif %}
{% if person.contact.phone is defined %} {% if service_provider.contact.phone is defined %}
- name: Mobile - name: Mobile
description: Call {{ 'us' if person.type == 'legal' else 'me' }} description: Call {{ 'us' if service_provider.type == 'legal' else 'me' }}
icon: icon:
class: fa-solid fa-phone class: fa-solid fa-phone
url: "tel:{{person.contact.phone}}" url: "tel:{{service_provider.contact.phone}}"
identifier: "{{person.contact.phone}}" identifier: "{{service_provider.contact.phone}}"
target: _top target: _top
{% endif %} {% endif %}
{% if person.contact.matrix is defined %} {% if service_provider.contact.matrix is defined %}
- name: Matrix - name: Matrix
description: Chat with {{ 'us' if person.type == 'legal' else 'me' }} on Matrix description: Chat with {{ 'us' if service_provider.type == 'legal' else 'me' }} on Matrix
icon: icon:
class: fa-solid fa-cubes class: fa-solid fa-cubes
identifier: "{{person.contact.matrix}}" identifier: "{{service_provider.contact.matrix}}"
{% endif %} {% endif %}
footer: footer:
children: children:
@ -174,14 +422,14 @@ navigation:
{% endif %} {% endif %}
{% if "moodle" in group_names %} {% if "moodle" in group_names %}
- name: Learning Platform - name: Learning Platform
description: Learn with {{ 'our' if person.type == 'legal' else 'my' }} academy description: Learn with {{ 'our' if service_provider.type == 'legal' else 'my' }} academy
icon: icon:
class: fa-solid fa-graduation-cap class: fa-solid fa-graduation-cap
url: https://{{domains.moodle}}/ url: https://{{domains.moodle}}/
{% endif %} {% endif %}
{% if "listmonk" in group_names %} {% if "listmonk" in group_names %}
- name: Newsletter - name: Newsletter
description: Subscribe to {{ 'our' if person.type == 'legal' else 'my' }} newsletter description: Subscribe to {{ 'our' if service_provider.type == 'legal' else 'my' }} newsletter
icon: icon:
class: fa-solid fa-envelope-open-text class: fa-solid fa-envelope-open-text
url: https://{{domains.listmonk}}/subscription/form url: https://{{domains.listmonk}}/subscription/form
@ -195,21 +443,21 @@ navigation:
children: children:
{% if "openproject" in group_names %} {% if "openproject" in group_names %}
- name: Open Project - name: Open Project
description: Explore {{ 'our' if person.type == 'legal' else 'my' }} projects description: Explore {{ 'our' if service_provider.type == 'legal' else 'my' }} projects
icon: icon:
class: fa-solid fa-tasks class: fa-solid fa-tasks
url: https://{{domains.openproject}}/ url: https://{{domains.openproject}}/
{% endif %} {% endif %}
{% if "taiga" in group_names %} {% if "taiga" in group_names %}
- name: Taiga - name: Taiga
description: View {{ 'our' if person.type == 'legal' else 'my' }} Kanban board description: View {{ 'our' if service_provider.type == 'legal' else 'my' }} Kanban board
icon: icon:
class: bi bi-clipboard2-check-fill class: bi bi-clipboard2-check-fill
url: https://{{domains.taiga}}/ url: https://{{domains.taiga}}/
{% endif %} {% endif %}
{% if "snipe_it" in group_names %} {% if "snipe_it" in group_names %}
- name: Snipe IT - name: Snipe IT
description: Manage {{ 'our' if person.type == 'legal' else 'my' }} inventory description: Manage {{ 'our' if service_provider.type == 'legal' else 'my' }} inventory
icon: icon:
class: fas fa-box-open class: fas fa-box-open
url: https://{{domains.snipe_it}}/ url: https://{{domains.snipe_it}}/
@ -236,7 +484,7 @@ navigation:
{% endif %} {% endif %}
{% if "mailu" in group_names %} {% if "mailu" in group_names %}
- name: Mailu - name: Mailu
description: Send{{ 'our' if person.type == 'legal' else 'my' }}a mail description: Send{{ 'our' if service_provider.type == 'legal' else 'my' }}a mail
icon: icon:
class: fa-solid fa-envelope class: fa-solid fa-envelope
url: https://{{domains.mailu}}/ url: https://{{domains.mailu}}/
@ -309,5 +557,5 @@ navigation:
description: Check out the imprint information description: Check out the imprint information
icon: icon:
class: fa-solid fa-scale-balanced class: fa-solid fa-scale-balanced
url: "{{person.legal.imprint}}" url: "{{service_provider.legal.imprint}}"

View File

@ -5,7 +5,7 @@ This **Ansible role** provides a **global theming solution** for Nginx-based web
## 🚀 Features ## 🚀 Features
**Automatic CSS Deployment** Injects `global.css` into all Nginx-served applications. **Automatic CSS Deployment** Injects `global.css` into all Nginx-served applications.
**Dynamic Theming** Uses `global_theming.css.colors` from Ansible variables for **full customization**. **Dynamic Theming** Uses `design.css.colors` from Ansible variables for **full customization**.
**Bootstrap Override Support** Ensures Bootstrap-based apps use the **unified global styles**. **Bootstrap Override Support** Ensures Bootstrap-based apps use the **unified global styles**.
**Versioning System** Prevents caching issues with automatic **timestamp-based versioning**. **Versioning System** Prevents caching issues with automatic **timestamp-based versioning**.
**Dark Mode Support** Automatically adapts to user preferences. **Dark Mode Support** Automatically adapts to user preferences.

View File

@ -1,14 +1,5 @@
# Load this role via nginx-modifier-all for consistency # Load this role via nginx-modifier-all for consistency
- name: Ensure {{nginx.directories.global}} directory exists
file:
path: "{{nginx.directories.global}}"
state: directory
owner: "{{nginx.user}}"
group: "{{nginx.user}}"
mode: '0755'
when: run_once_nginx_global_css is not defined
- name: Deploy global.css from template - name: Deploy global.css from template
template: template:
src: global.css.j2 src: global.css.j2

View File

@ -11,15 +11,15 @@ HINT:
:root { :root {
/** Derived Colors from the Base Color **/ /** Derived Colors from the Base Color **/
{% for i in range(1, 100) %} {% for i in range(1, 100) %}
--color-{{ "%02d"|format(i) }}: {{ global_theming.css.colors.base | adjust_color(target_lightness=(i / 100),saturation_change=global_theming.css.filters.saturation_change,hue_shift=global_theming.css.filters.hue_shift) }}; --color-{{ "%02d"|format(i) }}: {{ design.css.colors.base | adjust_color(target_lightness=(i / 100),saturation_change=design.css.filters.saturation_change,hue_shift=design.css.filters.hue_shift) }};
--color-rgb-{{ "%02d"|format(i) }}: {{ global_theming.css.colors.base | adjust_color_rgb(target_lightness=(i / 100),saturation_change=global_theming.css.filters.saturation_change,hue_shift=global_theming.css.filters.hue_shift) }}; --color-rgb-{{ "%02d"|format(i) }}: {{ design.css.colors.base | adjust_color_rgb(target_lightness=(i / 100),saturation_change=design.css.filters.saturation_change,hue_shift=design.css.filters.hue_shift) }};
{% endfor %} {% endfor %}
/** Special Action Colors **/ /** Special Action Colors **/
--success-color: {{ global_theming.css.colors.success }}; --success-color: {{ design.css.colors.success }};
--warning-color: {{ global_theming.css.colors.warning }}; --warning-color: {{ design.css.colors.warning }};
--error-color: {{ global_theming.css.colors.error }}; --error-color: {{ design.css.colors.error }};
--info-color: {{ global_theming.css.colors.info }}; --info-color: {{ design.css.colors.info }};
} }
@ -27,15 +27,15 @@ HINT:
:root { :root {
/** Dark Mode Derived Colors from the Base Color **/ /** Dark Mode Derived Colors from the Base Color **/
{% for i in range(1, 100) %} {% for i in range(1, 100) %}
--color-{{ "%02d"|format(i) }}: {{ global_theming.css.colors.base | adjust_color(target_lightness=(1 - (i / 100)),saturation_change=global_theming.css.filters.saturation_change,hue_shift=global_theming.css.filters.hue_shift) }}; --color-{{ "%02d"|format(i) }}: {{ design.css.colors.base | adjust_color(target_lightness=(1 - (i / 100)),saturation_change=design.css.filters.saturation_change,hue_shift=design.css.filters.hue_shift) }};
--color-rgb-{{ "%02d"|format(i) }}: {{ global_theming.css.colors.base | adjust_color_rgb(target_lightness=(1 - (i / 100)),saturation_change=global_theming.css.filters.saturation_change,hue_shift=global_theming.css.filters.hue_shift) }}; --color-rgb-{{ "%02d"|format(i) }}: {{ design.css.colors.base | adjust_color_rgb(target_lightness=(1 - (i / 100)),saturation_change=design.css.filters.saturation_change,hue_shift=design.css.filters.hue_shift) }};
{% endfor %} {% endfor %}
/** Special Action Colors **/ /** Special Action Colors **/
--success-color: {{ global_theming.css.colors.success | adjust_color(target_lightness=(1 - 0.2)) }}; --success-color: {{ design.css.colors.success | adjust_color(target_lightness=(1 - 0.2)) }};
--warning-color: {{ global_theming.css.colors.warning | adjust_color(target_lightness=(1 - 0.3)) }}; --warning-color: {{ design.css.colors.warning | adjust_color(target_lightness=(1 - 0.3)) }};
--error-color: {{ global_theming.css.colors.error | adjust_color(target_lightness=(1 - 0.3)) }}; --error-color: {{ design.css.colors.error | adjust_color(target_lightness=(1 - 0.3)) }};
--info-color: {{ global_theming.css.colors.info | adjust_color(target_lightness=(1 - 0.2)) }}; --info-color: {{ design.css.colors.info | adjust_color(target_lightness=(1 - 0.2)) }};
} }
} }

View File

@ -1,3 +1,3 @@
location = /global.css { location = /global.css {
root {{nginx.directories.global}}; root {{nginx.directories.data.global}};
} }

View File

@ -1 +1 @@
global_css_destination: "{{nginx.directories.global}}global.css" global_css_destination: "{{nginx.directories.data.global}}global.css"

View File

@ -1,8 +1,14 @@
--- ---
- name: "include role nginx-modifier-all for {{domain}}"
include_role:
name: nginx-modifier-all
- name: "include role nginx-https-recieve-certificate for {{domain}}"
include_role:
name: nginx-https-recieve-certificate
- name: "generate {{domains[application_id]}}.conf" - name: "generate {{domains[application_id]}}.conf"
template: template:
src: "nginx.conf.j2" src: "nginx.conf.j2"
dest: "{{nginx.directories.http.servers}}{{domains[application_id]}}.conf" dest: "{{nginx.directories.http.servers}}{{domains[application_id]}}.conf"
notify: restart nginx notify: restart nginx
var:
domain: "{{domains[application_id]}}"

View File

@ -9,14 +9,14 @@ server
location / location /
{ {
alias {{nginx.directories.homepage.files}}; {# Path to your file directory #} alias {{nginx.directories.data.files}}; {# Path to your file directory #}
autoindex on; {# Enable directory listing #} autoindex on; {# Enable directory listing #}
autoindex_exact_size off; {# Display sizes in a human-readable format #} autoindex_exact_size off; {# Display sizes in a human-readable format #}
autoindex_localtime on; {# Show local time #} autoindex_localtime on; {# Show local time #}
} }
location /.well-known/ { location /.well-known/ {
alias {{nginx.directories.well_known}}; alias {{nginx.directories.data.well_known}};
allow all; allow all;
default_type "text/plain"; default_type "text/plain";
autoindex on; autoindex on;

View File

@ -1 +1,2 @@
application_id: "file_server" application_id: "file_server"
domain: "{{domains[application_id]}}"

View File

@ -2,4 +2,4 @@
- name: copy imprint.html - name: copy imprint.html
template: template:
src: "imprint.html.j2" src: "imprint.html.j2"
dest: "{{nginx.directories.html}}imprint.html" dest: "{{nginx.directories.data.html}}imprint.html"

View File

@ -10,29 +10,29 @@
<h2>Information in accordance with § 5 TMG</h2> <h2>Information in accordance with § 5 TMG</h2>
<p> <p>
<strong>{{ person.name }}</strong><br> <strong>{{ service_provider.name }}</strong><br>
{{ person.description.subtitel }}<br> {{ service_provider.description.subtitel }}<br>
<br> <br>
<strong>Address:</strong><br> <strong>Address:</strong><br>
{{ person.address.street }}<br> {{ service_provider.address.street }}<br>
{{ person.address.postal_code }} {{ person.address.city }}<br> {{ service_provider.address.postal_code }} {{ service_provider.address.city }}<br>
{{ person.address.country }} {{ service_provider.address.country }}
</p> </p>
<h2>Contact</h2> <h2>Contact</h2>
<p> <p>
Telephone: {{ person.contact.phone }}<br> Telephone: {{ service_provider.contact.phone }}<br>
Email: <a href="mailto:{{ person.contact.email }}">{{ person.contact.email }}</a> Email: <a href="mailto:{{ service_provider.contact.email }}">{{ service_provider.contact.email }}</a>
</p> </p>
<h2>Editorial Responsibility</h2> <h2>Editorial Responsibility</h2>
<p> <p>
{{ person.legal.editorial_responsible }} {{ service_provider.legal.editorial_responsible }}
</p> </p>
<h2>Source Code</h2> <h2>Source Code</h2>
<p> <p>
Code repository available at: <a href="{{ person.legal.source_code }}">{{ person.legal.source_code }}</a> Code repository available at: <a href="{{ service_provider.legal.source_code }}">{{ service_provider.legal.source_code }}</a>
</p> </p>
<h2>Consumer Dispute Resolution / Universal Arbitration Board</h2> <h2>Consumer Dispute Resolution / Universal Arbitration Board</h2>

View File

@ -1,8 +1,14 @@
--- ---
- name: "include role nginx-modifier-all for {{domain}}"
include_role:
name: nginx-modifier-all
- name: "include role nginx-https-recieve-certificate for {{domain}}"
include_role:
name: nginx-https-recieve-certificate
- name: "generate {{domains[application_id]}}.conf" - name: "generate {{domains[application_id]}}.conf"
template: template:
src: "nginx.conf.j2" src: "nginx.conf.j2"
dest: "{{nginx.directories.http.servers}}{{domains[application_id]}}.conf" dest: "{{nginx.directories.http.servers}}{{domains[application_id]}}.conf"
notify: restart nginx notify: restart nginx
var:
domain: "{{domains[application_id]}}"

View File

@ -9,12 +9,12 @@ server
location / location /
{ {
root {{nginx.directories.homepage.html}}; root {{nginx.directories.data.html}};
index index.html index.htm; index index.html index.htm;
} }
location /.well-known/ { location /.well-known/ {
alias {{nginx.directories.well_known}}; alias {{nginx.directories.data.well_known}};
allow all; allow all;
default_type "text/plain"; default_type "text/plain";
autoindex on; autoindex on;

View File

@ -1 +1,2 @@
application_id: "html_server" application_id: "html_server"
domain: "{{domains[application_id]}}"

View File

@ -14,9 +14,28 @@
file: file:
path: "{{ item }}" path: "{{ item }}"
state: directory state: directory
owner: "{{nginx.user}}"
group: "{{nginx.user}}"
mode: '0755' mode: '0755'
recurse: yes recurse: yes
loop: "{{ nginx.directories.http.values() | list + [nginx.directories.streams] }}" loop: >
{{
[ nginx.directories.configuration ] +
(nginx.directories.http.values() | list) +
[ nginx.directories.streams ]
}}
when: run_once_nginx is not defined
- name: Ensure nginx data storage directories are present
file:
path: "{{ item }}"
state: directory
recurse: yes
owner: "{{nginx.user}}"
group: "{{nginx.user}}"
mode: '0755'
loop: >
{{ nginx.directories.data.values() | list }}
when: run_once_nginx is not defined when: run_once_nginx is not defined
- name: create nginx config file - name: create nginx config file