mirror of
https://github.com/kevinveenbirkenbach/computer-playbook.git
synced 2025-02-22 12:29:39 +01:00
Optimized and refactored portfolio for flock.town
This commit is contained in:
parent
0c7af2ce89
commit
e10deb9e54
14
group_vars/all/14_about.yml
Normal file
14
group_vars/all/14_about.yml
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
# This is just a dummy person.
|
||||||
|
# Adapt the values in your inventory file
|
||||||
|
person:
|
||||||
|
type: "legal" # Accepted Values: natural, legal
|
||||||
|
name: "CyMaIS Demo Instance"
|
||||||
|
address:
|
||||||
|
street: "Binary Avenue 01"
|
||||||
|
city: "Cybertown"
|
||||||
|
postal_code: "00001"
|
||||||
|
country: "Nexusland"
|
||||||
|
contact:
|
||||||
|
email: "contact@{{primary_domain}}"
|
||||||
|
phone: "+0 000 000 404"
|
||||||
|
mastodon: "@{{administrator_username}}@{{domains.mastodon}}"
|
@ -42,7 +42,7 @@
|
|||||||
- role: docker-keycloak
|
- role: docker-keycloak
|
||||||
|
|
||||||
- name: setup nextcloud hosts
|
- name: setup nextcloud hosts
|
||||||
hosts: nextcloud_server
|
hosts: nextcloud
|
||||||
become: true
|
become: true
|
||||||
roles:
|
roles:
|
||||||
- role: docker-nextcloud
|
- role: docker-nextcloud
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
application_id: "akaunting"
|
application_id: "akaunting"
|
||||||
database_type: "mariadb"
|
database_type: "mariadb"
|
||||||
database_password: "{{akaunting_database_password}}"
|
database_password: "{{akaunting_database_password}}"
|
||||||
repository_address: "https://github.com/akaunting/docker.git"
|
docker_repository_address: "https://github.com/akaunting/docker.git"
|
||||||
|
@ -2,4 +2,4 @@
|
|||||||
application_id: "attendize"
|
application_id: "attendize"
|
||||||
database_type: "mariadb"
|
database_type: "mariadb"
|
||||||
database_password: "{{attendize_database_password}}"
|
database_password: "{{attendize_database_password}}"
|
||||||
repository_address: "https://github.com/Attendize/Attendize.git"
|
docker_repository_address: "https://github.com/Attendize/Attendize.git"
|
@ -17,5 +17,5 @@
|
|||||||
- name: rebuild discourse
|
- name: rebuild discourse
|
||||||
command:
|
command:
|
||||||
cmd: "./launcher rebuild {{applications.discourse.container}}"
|
cmd: "./launcher rebuild {{applications.discourse.container}}"
|
||||||
chdir: "{{discourse_repository_directory}}"
|
chdir: "{{docker_repository_directory }}"
|
||||||
listen: recreate discourse
|
listen: recreate discourse
|
@ -32,15 +32,15 @@
|
|||||||
- name: pull docker repository
|
- name: pull docker repository
|
||||||
git:
|
git:
|
||||||
repo: "https://github.com/discourse/discourse_docker.git"
|
repo: "https://github.com/discourse/discourse_docker.git"
|
||||||
dest: "{{discourse_repository_directory}}"
|
dest: "{{docker_repository_directory }}"
|
||||||
update: yes
|
update: yes
|
||||||
notify: recreate discourse
|
notify: recreate discourse
|
||||||
become: true
|
become: true
|
||||||
ignore_errors: true
|
ignore_errors: true
|
||||||
|
|
||||||
- name: set chmod 700 for {{discourse_repository_directory}}containers
|
- name: set chmod 700 for {{docker_repository_directory }}containers
|
||||||
ansible.builtin.file:
|
ansible.builtin.file:
|
||||||
path: "{{discourse_repository_directory}}/containers"
|
path: "{{docker_repository_directory }}/containers"
|
||||||
mode: '700'
|
mode: '700'
|
||||||
state: directory
|
state: directory
|
||||||
|
|
||||||
@ -53,7 +53,7 @@
|
|||||||
- name: "destroy container discourse_application"
|
- name: "destroy container discourse_application"
|
||||||
command:
|
command:
|
||||||
cmd: "./launcher destroy discourse_application"
|
cmd: "./launcher destroy discourse_application"
|
||||||
chdir: "{{discourse_repository_directory}}"
|
chdir: "{{docker_repository_directory }}"
|
||||||
ignore_errors: true
|
ignore_errors: true
|
||||||
notify: recreate discourse
|
notify: recreate discourse
|
||||||
when: mode_reset | bool
|
when: mode_reset | bool
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
application_id: "discourse"
|
application_id: "discourse"
|
||||||
database_password: "{{ applications.discourse.database_password }}"
|
database_password: "{{ applications.discourse.database_password }}"
|
||||||
database_type: "postgres"
|
database_type: "postgres"
|
||||||
discourse_repository_directory: "{{docker_compose.directories.services}}{{applications.discourse.repository}}/"
|
docker_repository_directory : "{{docker_compose.directories.services}}{{applications.discourse.repository}}/"
|
||||||
discourse_application_yml_destination: "{{discourse_repository_directory}}containers/{{applications.discourse.container}}.yml"
|
discourse_application_yml_destination: "{{docker_repository_directory }}containers/{{applications.discourse.container}}.yml"
|
@ -1,22 +1,8 @@
|
|||||||
# README.md for Docker OpenProject Role
|
# OpenProject Role
|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
|
|
||||||
This role is designed to deploy the OpenProject application using Docker. It includes tasks for setting up the environment, pulling the Docker repository, and configuring a reverse proxy with Nginx.
|
This role is designed to deploy the [OpenProject](https://www.openproject.org/) application using Docker. It includes tasks for setting up the environment, pulling the Docker repository, and configuring a reverse proxy with Nginx. It was developed by [Kevin Veen-Birkenbach](https://www.veen.world/)
|
||||||
|
|
||||||
## Requirements
|
|
||||||
|
|
||||||
- Ansible
|
|
||||||
- Docker
|
|
||||||
- Docker Compose
|
|
||||||
- Access to the GitHub repository "opf/openproject-deploy"
|
|
||||||
|
|
||||||
## Role Variables
|
|
||||||
|
|
||||||
The role uses several variables, defined in `vars/main.yml`:
|
|
||||||
|
|
||||||
- `repository_directory`: The directory for the OpenProject repository.
|
|
||||||
- `docker_compose.directories.instance`: Directory for Docker Compose instances.
|
|
||||||
|
|
||||||
## Handlers
|
## Handlers
|
||||||
|
|
||||||
@ -32,14 +18,6 @@ Outlined in `tasks/main.yml`, the role includes tasks for:
|
|||||||
- Warning if the repository is not reachable.
|
- Warning if the repository is not reachable.
|
||||||
- Copying the `.env` file from a template.
|
- Copying the `.env` file from a template.
|
||||||
|
|
||||||
## Templates
|
|
||||||
|
|
||||||
`env.j2` in `templates/` folder is a Jinja2 template for the `.env` file, setting up environment variables for the OpenProject container.
|
|
||||||
|
|
||||||
## Dependencies
|
|
||||||
|
|
||||||
This role depends on `nginx-docker-reverse-proxy`, as defined in `meta/main.yml`.
|
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
To use this role, include it in your Ansible playbook and set the necessary variables, especially those required in the `.env` file template.
|
To use this role, include it in your Ansible playbook and set the necessary variables, especially those required in the `.env` file template.
|
||||||
|
@ -6,11 +6,3 @@
|
|||||||
environment:
|
environment:
|
||||||
COMPOSE_HTTP_TIMEOUT: 600
|
COMPOSE_HTTP_TIMEOUT: 600
|
||||||
DOCKER_CLIENT_TIMEOUT: 600
|
DOCKER_CLIENT_TIMEOUT: 600
|
||||||
|
|
||||||
- name: rebuild openproject repository
|
|
||||||
command:
|
|
||||||
cmd: docker compose build
|
|
||||||
chdir: "{{openproject_repository_service}}"
|
|
||||||
environment:
|
|
||||||
COMPOSE_HTTP_TIMEOUT: 600
|
|
||||||
DOCKER_CLIENT_TIMEOUT: 600
|
|
@ -7,12 +7,6 @@
|
|||||||
include_role:
|
include_role:
|
||||||
name: nginx-domain-setup
|
name: nginx-domain-setup
|
||||||
|
|
||||||
#- name: "include tasks update-repository-with-files.yml"
|
|
||||||
# include_tasks: update-repository-with-files.yml
|
|
||||||
# vars:
|
|
||||||
# detached_files:
|
|
||||||
# - "docker-compose.yml"
|
|
||||||
|
|
||||||
- name: "Create {{openproject_plugins_service}}"
|
- name: "Create {{openproject_plugins_service}}"
|
||||||
file:
|
file:
|
||||||
path: "{{openproject_plugins_service}}"
|
path: "{{openproject_plugins_service}}"
|
||||||
@ -35,15 +29,9 @@
|
|||||||
- docker compose project setup
|
- docker compose project setup
|
||||||
- rebuild custom openproject docker image
|
- rebuild custom openproject docker image
|
||||||
|
|
||||||
- name: pull docker repository
|
- name: "include role docker-repository-setup for {{application_id}}"
|
||||||
git:
|
include_role:
|
||||||
repo: "{{ repository_address }}"
|
name: docker-repository-setup
|
||||||
dest: "{{ openproject_repository_service }}"
|
|
||||||
update: yes
|
|
||||||
notify:
|
|
||||||
- docker compose project setup
|
|
||||||
- rebuild openproject repository
|
|
||||||
become: true
|
|
||||||
|
|
||||||
- name: "create {{dummy_volume}}"
|
- name: "create {{dummy_volume}}"
|
||||||
file:
|
file:
|
||||||
|
@ -1,12 +1,10 @@
|
|||||||
application_id: "openproject"
|
application_id: "openproject"
|
||||||
repository_address: "https://github.com/opf/openproject-deploy"
|
docker_repository_address: "https://github.com/opf/openproject-deploy"
|
||||||
database_password: "{{openproject_database_password}}"
|
database_password: "{{openproject_database_password}}"
|
||||||
database_type: "postgres"
|
database_type: "postgres"
|
||||||
|
|
||||||
openproject_plugins_service: "{{docker_compose.directories.services}}plugins/"
|
openproject_plugins_service: "{{docker_compose.directories.services}}plugins/"
|
||||||
openproject_repository_service: "{{docker_compose.directories.services}}repository/"
|
|
||||||
custom_openproject_image: "custom_openproject"
|
custom_openproject_image: "custom_openproject"
|
||||||
|
|
||||||
|
|
||||||
# The following volume doesn't have a practcical function. It just exist to prevent the creation of unnecessary anonymous volumes
|
# The following volume doesn't have a practcical function. It just exist to prevent the creation of unnecessary anonymous volumes
|
||||||
dummy_volume: "{{docker_compose.directories.volumes}}dummy_volume"
|
dummy_volume: "{{docker_compose.directories.volumes}}dummy_volume"
|
@ -7,17 +7,28 @@
|
|||||||
include_role:
|
include_role:
|
||||||
name: nginx-domain-setup
|
name: nginx-domain-setup
|
||||||
|
|
||||||
- name: "include tasks update-repository-with-files.yml"
|
- name: "include role docker-repository-setup for {{application_id}}"
|
||||||
include_tasks: update-repository-with-files.yml
|
include_role:
|
||||||
vars:
|
name: docker-repository-setup
|
||||||
detached_files:
|
|
||||||
- "docker-compose.yml"
|
|
||||||
|
|
||||||
- name: create {{docker_compose.directories.instance}}/app/config.yaml
|
- name: Check if host-specific config.yaml exists
|
||||||
|
stat:
|
||||||
|
path: "{{ config_inventory_path }}"
|
||||||
|
register: config_file
|
||||||
|
|
||||||
|
- name: Copy host-specific config.yaml if it exists
|
||||||
copy:
|
copy:
|
||||||
src: "{{ inventory_dir }}/files/{{ inventory_hostname }}/docker/portfolio/config.yaml"
|
src: "{{ config_inventory_path }}"
|
||||||
dest: "{{docker_compose.directories.instance}}/app/config.yaml"
|
dest: "{{docker_repository_path}}/app/config.yaml"
|
||||||
notify: docker compose project setup
|
notify: docker compose project setup
|
||||||
|
when: config_file.stat.exists
|
||||||
|
|
||||||
|
- name: Copy default config.yaml from the role template if host-specific file does not exist
|
||||||
|
template:
|
||||||
|
src: "config.yaml.j2"
|
||||||
|
dest: "{{docker_repository_path}}/app/config.yaml"
|
||||||
|
notify: docker compose project setup
|
||||||
|
when: not config_file.stat.exists
|
||||||
|
|
||||||
- name: add docker-compose.yml
|
- name: add docker-compose.yml
|
||||||
template: src=docker-compose.yml.j2 dest={{docker_compose.directories.instance}}docker-compose.yml
|
template: src=docker-compose.yml.j2 dest={{docker_compose.directories.instance}}docker-compose.yml
|
||||||
|
431
roles/docker-portfolio/templates/config.yaml.j2
Normal file
431
roles/docker-portfolio/templates/config.yaml.j2
Normal file
@ -0,0 +1,431 @@
|
|||||||
|
---
|
||||||
|
accounts:
|
||||||
|
name: Online Presence
|
||||||
|
description: Discover {{ 'our' if person.type == 'legal' else 'my' }} online presence.
|
||||||
|
icon:
|
||||||
|
class: fa-solid fa-users
|
||||||
|
children:
|
||||||
|
- name: Publishing Channels
|
||||||
|
description: Platforms where I share content.
|
||||||
|
icon:
|
||||||
|
class: fas fa-newspaper
|
||||||
|
children:
|
||||||
|
- name: Microblogs
|
||||||
|
description: Stay updated with {{ 'our' if person.type == 'legal' else 'my' }} microblog posts.
|
||||||
|
icon:
|
||||||
|
class: fa-solid fa-pen-nib
|
||||||
|
children:
|
||||||
|
- name: Mastodon
|
||||||
|
description: Follow {{ 'our' if person.type == 'legal' else 'my' }} updates on Mastodon.
|
||||||
|
icon:
|
||||||
|
class: fa-brands fa-mastodon
|
||||||
|
url: https://{{ person.contact.mastodon.split('@')[2] }}/@{{ person.contact.mastodon.split('@')[1] }}
|
||||||
|
identifier: "{{person.contact.mastodon}}"
|
||||||
|
- name: Bluesky
|
||||||
|
description: Follow me on Bluesky (coming soon).
|
||||||
|
icon:
|
||||||
|
class: fa-brands fa-bluesky
|
||||||
|
info: Bluesky is coming soon.
|
||||||
|
alternatives:
|
||||||
|
- link: accounts.publishingchannels.microblogs.mastodon
|
||||||
|
|
||||||
|
- name: Pictures
|
||||||
|
description: View {{ 'our' if person.type == 'legal' else 'my' }} photography.
|
||||||
|
icon:
|
||||||
|
class: fa-solid fa-images
|
||||||
|
children:
|
||||||
|
- name: Pixelfed
|
||||||
|
description: Explore {{ 'our' if person.type == 'legal' else 'my' }} photo gallery on Pixelfed.
|
||||||
|
icon:
|
||||||
|
class: fa-solid fa-camera
|
||||||
|
url: https://s.veen.world/pictures
|
||||||
|
- name: Instagram
|
||||||
|
description: Follow me on Instagram.
|
||||||
|
icon:
|
||||||
|
class: fa-brands fa-instagram
|
||||||
|
url: https://www.instagram.com/kevinveenbirkenbach/
|
||||||
|
identifier: kevinveenbirkenbach
|
||||||
|
warning: Platforms by Meta (e.g., Instagram, Facebook) may compromise your data privacy. Consider using decentralized alternatives.
|
||||||
|
alternatives:
|
||||||
|
- link: accounts.publishingchannels.pictures.pixelfed
|
||||||
|
|
||||||
|
- name: Videos
|
||||||
|
description: Watch {{ 'our' if person.type == 'legal' else 'my' }} video content.
|
||||||
|
icon:
|
||||||
|
class: fa-solid fa-video
|
||||||
|
children:
|
||||||
|
- name: Peertube
|
||||||
|
description: Discover {{ 'our' if person.type == 'legal' else 'my' }} videos on Peertube.
|
||||||
|
icon:
|
||||||
|
class: fa-solid fa-video
|
||||||
|
url: https://s.veen.world/videos
|
||||||
|
- name: YouTube
|
||||||
|
description: Follow me on YouTube (inactive).
|
||||||
|
icon:
|
||||||
|
class: fa-brands fa-youtube
|
||||||
|
url: https://s.veen.world/youtube
|
||||||
|
warning: I no longer publish videos on YouTube. Please visit {{ 'our' if person.type == 'legal' else 'my' }} Peertube channel instead.
|
||||||
|
alternatives:
|
||||||
|
- link: accounts.publishingchannels.videos.peertube
|
||||||
|
|
||||||
|
- name: Blog
|
||||||
|
description: Read {{ 'our' if person.type == 'legal' else 'my' }} articles and stories.
|
||||||
|
icon:
|
||||||
|
class: fa-solid fa-blog
|
||||||
|
url: https://blog.veen.world
|
||||||
|
|
||||||
|
- name: Code
|
||||||
|
description: Access {{ 'our' if person.type == 'legal' else 'my' }} coding projects.
|
||||||
|
icon:
|
||||||
|
class: fa-solid fa-laptop-code
|
||||||
|
children:
|
||||||
|
- name: GitHub
|
||||||
|
description: View {{ 'our' if person.type == 'legal' else 'my' }} GitHub repositories.
|
||||||
|
icon:
|
||||||
|
class: bi bi-github
|
||||||
|
url: https://github.com/kevinveenbirkenbach
|
||||||
|
- name: Gitea
|
||||||
|
description: Explore {{ 'our' if person.type == 'legal' else 'my' }} self-hosted repositories.
|
||||||
|
icon:
|
||||||
|
class: fa-solid fa-code
|
||||||
|
url: https://git.veen.world/kevinveenbirkenbach
|
||||||
|
|
||||||
|
- name: Social Networks
|
||||||
|
description: Social and developer platforms.
|
||||||
|
icon:
|
||||||
|
class: fa fa-users
|
||||||
|
children:
|
||||||
|
- name: Facebook
|
||||||
|
warning: I recommend to don't use Facebook and connect instead with me via the Fediverse. Check out the listed alternatives.
|
||||||
|
description: Visit {{ 'our' if person.type == 'legal' else 'my' }} Facebook page.
|
||||||
|
icon:
|
||||||
|
class: fa-brands fa-facebook
|
||||||
|
url: https://www.facebook.com/kevinveenbirkenbach
|
||||||
|
alternatives:
|
||||||
|
- link: accounts.socialnetworks.friendica
|
||||||
|
- name: Friendica
|
||||||
|
description: Visit {{ 'our' if person.type == 'legal' else 'my' }} friendica profile
|
||||||
|
icon:
|
||||||
|
class: fas fa-network-wired
|
||||||
|
url: https://s.veen.world/friendica
|
||||||
|
identifier: "kevinveenbirkenbach@friendica.veen.world"
|
||||||
|
- link: navigation.header.contact.messenger
|
||||||
|
|
||||||
|
- name: Career Profiles
|
||||||
|
description: Professional networking profiles.
|
||||||
|
icon:
|
||||||
|
class: fa-solid fa-user-tie
|
||||||
|
children:
|
||||||
|
- name: XING
|
||||||
|
description: View {{ 'our' if person.type == 'legal' else 'my' }} XING profile.
|
||||||
|
icon:
|
||||||
|
class: bi bi-building
|
||||||
|
url: https://s.veen.world/xing
|
||||||
|
- name: LinkedIn
|
||||||
|
description: Connect with me on LinkedIn.
|
||||||
|
icon:
|
||||||
|
class: bi bi-linkedin
|
||||||
|
url: https://s.veen.world/linkedin
|
||||||
|
- name: upwork.com
|
||||||
|
description: Check out {{ 'our' if person.type == 'legal' else 'my' }} profile on upwork
|
||||||
|
icon:
|
||||||
|
class: fas fa-users
|
||||||
|
url: https://s.veen.world/upwork
|
||||||
|
- name: freelancermap.de
|
||||||
|
description: Check out {{ 'our' if person.type == 'legal' else 'my' }} profile on freelancermap.de
|
||||||
|
icon:
|
||||||
|
class: fas fa-people-arrows
|
||||||
|
url: https://s.veen.world/freelancermap
|
||||||
|
- name: malt
|
||||||
|
description: Check out {{ 'our' if person.type == 'legal' else 'my' }} profile on malt
|
||||||
|
icon:
|
||||||
|
class: fas fa-sun
|
||||||
|
url: https://s.veen.world/malt
|
||||||
|
- name: Sports
|
||||||
|
description: My sports activities and logs.
|
||||||
|
icon:
|
||||||
|
class: fa-solid fa-running
|
||||||
|
children:
|
||||||
|
- name: Garmin
|
||||||
|
description: Explore {{ 'our' if person.type == 'legal' else 'my' }} Garmin activity records.
|
||||||
|
icon:
|
||||||
|
class: fa-solid fa-person-running
|
||||||
|
url: https://s.veen.world/garmin
|
||||||
|
- name: Eversports
|
||||||
|
description: View {{ 'our' if person.type == 'legal' else 'my' }} Eversports sessions.
|
||||||
|
icon:
|
||||||
|
class: fa-solid fa-dumbbell
|
||||||
|
url: https://s.veen.world/eversports
|
||||||
|
|
||||||
|
- name: Duolingo
|
||||||
|
description: Join me in language learning.
|
||||||
|
icon:
|
||||||
|
class: fa-solid fa-language
|
||||||
|
url: https://www.duolingo.com/profile/kevinbirkenbach
|
||||||
|
|
||||||
|
- name: Spotify
|
||||||
|
description: Listen to {{ 'our' if person.type == 'legal' else 'my' }} playlists.
|
||||||
|
icon:
|
||||||
|
class: fa-brands fa-spotify
|
||||||
|
url: https://open.spotify.com/user/31vebfzbjf3p7oualis76qfpr5ty
|
||||||
|
|
||||||
|
- name: Patreon
|
||||||
|
description: Support {{ 'our' if person.type == 'legal' else 'my' }} work on Patreon.
|
||||||
|
icon:
|
||||||
|
class: fa-brands fa-patreon
|
||||||
|
url: https://patreon.com/kevinveenbirkenbach
|
||||||
|
|
||||||
|
- name: Discourse
|
||||||
|
description: Join discussions on {{ 'our' if person.type == 'legal' else 'my' }} forum.
|
||||||
|
icon:
|
||||||
|
class: fa-brands fa-discourse
|
||||||
|
url: https://forum.veen.world/u/kevinveenbirkenbach
|
||||||
|
|
||||||
|
- name: Nextcloud
|
||||||
|
description: Share data with me via nextcloud
|
||||||
|
icon:
|
||||||
|
class: fa fa-cloud
|
||||||
|
url: https://s.veen.world/cloud
|
||||||
|
|
||||||
|
cards:
|
||||||
|
- icon:
|
||||||
|
source: https://cloud.veen.world/s/logo_agile_coach_512x512/download
|
||||||
|
title: Agile Coach
|
||||||
|
text: I lead agile transformations and improve team dynamics through Scrum, DevOps,
|
||||||
|
and Agile Coaching. My goal is to enhance collaboration and efficiency in organizations,
|
||||||
|
ensuring agile principles are effectively implemented for sustainable success.
|
||||||
|
url: https://www.agile-coach.world
|
||||||
|
link_text: www.agile-coach.world
|
||||||
|
- icon:
|
||||||
|
source: https://cloud.veen.world/s/logo_personal_coach_512x512/download
|
||||||
|
title: Personal Coach
|
||||||
|
text: Offering personalized coaching for growth and development, I utilize a blend
|
||||||
|
of hypnotherapy, mediation, and holistic techniques. My approach is tailored to
|
||||||
|
help you achieve personal and professional milestones, fostering holistic well-being.
|
||||||
|
url: https://www.personalcoach.berlin
|
||||||
|
link_text: www.personalcoach.berlin
|
||||||
|
- icon:
|
||||||
|
source: https://cloud.veen.world/s/logo_yachtmaster_512x512/download
|
||||||
|
title: Yachtmaster
|
||||||
|
text: As a Yachtmaster, I provide comprehensive sailing education, yacht delivery,
|
||||||
|
and voyage planning services. Whether you're learning to sail or need an experienced
|
||||||
|
skipper, my expertise ensures a safe and enjoyable experience on the water.
|
||||||
|
url: https://www.yachtmaster.world
|
||||||
|
link_text: www.yachtmaster.world
|
||||||
|
company:
|
||||||
|
titel: Kevin Veen-Birkenbach
|
||||||
|
subtitel: Consulting and Coaching Solutions
|
||||||
|
logo:
|
||||||
|
source: https://cloud.veen.world/s/logo_face_512x512/download
|
||||||
|
favicon:
|
||||||
|
source: https://cloud.veen.world/s/veen_world_favicon/download
|
||||||
|
address:
|
||||||
|
street: Afrikanische Straße 43
|
||||||
|
postal_code: DE-13351
|
||||||
|
city: Berlin
|
||||||
|
country: Germany
|
||||||
|
imprint_url: https://s.veen.world/imprint
|
||||||
|
navigation:
|
||||||
|
header:
|
||||||
|
children:
|
||||||
|
- link: accounts.publishingchannels.children
|
||||||
|
- link: accounts.socialnetworks
|
||||||
|
- name: Contact
|
||||||
|
description: Get in touch
|
||||||
|
icon:
|
||||||
|
class: fa-solid fa-envelope
|
||||||
|
children:
|
||||||
|
- name: Email
|
||||||
|
description: Send me an email
|
||||||
|
icon:
|
||||||
|
class: fa-solid fa-envelope
|
||||||
|
children:
|
||||||
|
- name: Email
|
||||||
|
description: Send me an email
|
||||||
|
icon:
|
||||||
|
class: fa-solid fa-envelope
|
||||||
|
url: mailto:kevin@veen.world
|
||||||
|
identifier: kevin@veen.world
|
||||||
|
alternatives:
|
||||||
|
- link: navigation.header.contact.messenger.matrix
|
||||||
|
- name: Mobile
|
||||||
|
description: Call me
|
||||||
|
icon:
|
||||||
|
class: fa-solid fa-phone
|
||||||
|
url: "tel:+491781798023"
|
||||||
|
identifier: "+491781798023"
|
||||||
|
target: _top
|
||||||
|
- name: Messenger
|
||||||
|
description: Social and developer networks
|
||||||
|
icon:
|
||||||
|
class: fa-solid fa-comments
|
||||||
|
children:
|
||||||
|
- name: Matrix
|
||||||
|
description: Chat with me on Matrix
|
||||||
|
icon:
|
||||||
|
class: fa-solid fa-cubes
|
||||||
|
identifier: "@kevinveenbirkenbach:veen.world"
|
||||||
|
info: |
|
||||||
|
#### Why Use Matrix?
|
||||||
|
Matrix is a secure, decentralized communication platform that ensures privacy and control over your data. Learn more about [Matrix](https://matrix.org/).
|
||||||
|
|
||||||
|
#### Privacy and Security
|
||||||
|
End-to-end encryption keeps your conversations private and secure.
|
||||||
|
|
||||||
|
#### Decentralized and Open
|
||||||
|
Matrix's federated network means you can host your own server or use any provider while staying connected.
|
||||||
|
|
||||||
|
#### A Movement for Digital Freedom
|
||||||
|
By using Matrix, you support open, transparent, and secure communication.
|
||||||
|
- name: Signal
|
||||||
|
description: Message me on Signal
|
||||||
|
icon:
|
||||||
|
class: fa-brands fa-signal-messenger
|
||||||
|
identifier: "+491781798023"
|
||||||
|
warning: Signal is not hosted by me!
|
||||||
|
alternatives:
|
||||||
|
- link: navigation.header.contact.messenger.matrix
|
||||||
|
- name: Telegram
|
||||||
|
description: Message me on Telegram
|
||||||
|
icon:
|
||||||
|
class: fa-brands fa-telegram
|
||||||
|
target: _blank
|
||||||
|
url: https://t.me/kevinveenbirkenbach
|
||||||
|
identifier: kevinveenbirkenbach
|
||||||
|
warning: Telegram is not hosted by me!
|
||||||
|
alternatives:
|
||||||
|
- link: navigation.header.contact.messenger.matrix
|
||||||
|
- name: WhatsApp
|
||||||
|
description: Chat with me on WhatsApp
|
||||||
|
icon:
|
||||||
|
class: fa-brands fa-whatsapp
|
||||||
|
url: https://wa.me/491781798023
|
||||||
|
identifier: "+491781798023"
|
||||||
|
info: Consider using decentralized and privacy-respecting alternatives to maintain control over your data, improve security, and foster healthier online interactions.
|
||||||
|
alternatives:
|
||||||
|
- link: navigation.header.contact.messenger.matrix
|
||||||
|
- link: navigation.header.contact.messenger.signal
|
||||||
|
- link: navigation.header.contact.messenger.telegram
|
||||||
|
footer:
|
||||||
|
children:
|
||||||
|
- link: accounts
|
||||||
|
- name: Solution Hub
|
||||||
|
description: Curated collection of self hosted tools
|
||||||
|
icon:
|
||||||
|
class: fa-solid fa-network-wired
|
||||||
|
url:
|
||||||
|
children:
|
||||||
|
- name: Community
|
||||||
|
description: Tools to manage the community
|
||||||
|
icon:
|
||||||
|
class: fa-solid fa-users
|
||||||
|
children:
|
||||||
|
- name: Forum
|
||||||
|
description: Join the discussion
|
||||||
|
icon:
|
||||||
|
class: fa-brands fa-discourse
|
||||||
|
url: https://forum.veen.world/
|
||||||
|
- name: Learning Platform
|
||||||
|
description: Learn with {{ 'our' if person.type == 'legal' else 'my' }} academy
|
||||||
|
icon:
|
||||||
|
class: fa-solid fa-graduation-cap
|
||||||
|
url: https://academy.veen.world/
|
||||||
|
- name: Newsletter
|
||||||
|
description: Subscribe to {{ 'our' if person.type == 'legal' else 'my' }} newsletter
|
||||||
|
icon:
|
||||||
|
class: fa-solid fa-envelope-open-text
|
||||||
|
url: https://newsletter.veen.world/subscription/form
|
||||||
|
- name: Project Management
|
||||||
|
description: Project Management Tools
|
||||||
|
icon:
|
||||||
|
class: fa-solid fa-chart-line
|
||||||
|
children:
|
||||||
|
- name: Open Project
|
||||||
|
description: Explore {{ 'our' if person.type == 'legal' else 'my' }} projects
|
||||||
|
icon:
|
||||||
|
class: fa-solid fa-tasks
|
||||||
|
url: https://project.veen.world/
|
||||||
|
|
||||||
|
- name: Taiga
|
||||||
|
description: View {{ 'our' if person.type == 'legal' else 'my' }} Kanban board
|
||||||
|
icon:
|
||||||
|
class: bi bi-clipboard2-check-fill
|
||||||
|
url: https://kanban.veen.world/
|
||||||
|
|
||||||
|
- name: Snipe IT
|
||||||
|
description: Manage {{ 'our' if person.type == 'legal' else 'my' }} inventory
|
||||||
|
icon:
|
||||||
|
class: fas fa-box-open
|
||||||
|
url: https://inventory.veen.world/
|
||||||
|
|
||||||
|
- name: Communication
|
||||||
|
icon:
|
||||||
|
class: fa-solid fa-comments
|
||||||
|
children:
|
||||||
|
- name: Elements
|
||||||
|
description: Chat with me
|
||||||
|
icon:
|
||||||
|
class: fa-solid fa-comment
|
||||||
|
url: https://element.veen.world/
|
||||||
|
|
||||||
|
- name: Big Blue Button
|
||||||
|
description: Join live events
|
||||||
|
icon:
|
||||||
|
class: fa-solid fa-video
|
||||||
|
url: https://meet.veen.world/
|
||||||
|
|
||||||
|
- name: Mailu
|
||||||
|
description: Send me a mail
|
||||||
|
icon:
|
||||||
|
class: fa-solid fa-envelope
|
||||||
|
url: https://mail.veen.world/
|
||||||
|
- name: Administration
|
||||||
|
icon:
|
||||||
|
class: fas fa-building
|
||||||
|
children:
|
||||||
|
- name: Matomo
|
||||||
|
description: Analyze with Matomo
|
||||||
|
icon:
|
||||||
|
class: fa-solid fa-chart-simple
|
||||||
|
url: https://matomo.veen.world/
|
||||||
|
- name: phpMyAdmin
|
||||||
|
description: Administrate MySQL and MariaDB databases
|
||||||
|
icon:
|
||||||
|
class: fas fa-database
|
||||||
|
url: https://phpmyadmin.veen.world/
|
||||||
|
- name: Keycloak
|
||||||
|
description: Manage User via Keycloak
|
||||||
|
icon:
|
||||||
|
class: fas fa-user-shield
|
||||||
|
url: https://auth.veen.world/admin
|
||||||
|
- name: LDAP
|
||||||
|
description: Manage LDAP
|
||||||
|
icon:
|
||||||
|
class: fas fa-key
|
||||||
|
url: https://ldap.veen.world/
|
||||||
|
- name: Tools
|
||||||
|
icon:
|
||||||
|
class: fas fa-tools
|
||||||
|
children:
|
||||||
|
- name: Baserow
|
||||||
|
description: Organize with Baserow
|
||||||
|
icon:
|
||||||
|
class: fa-solid fa-table
|
||||||
|
url: https://baserow.veen.world/
|
||||||
|
- name: Yourls
|
||||||
|
description: Find {{ 'our' if person.type == 'legal' else 'my' }} curated links
|
||||||
|
icon:
|
||||||
|
class: bi bi-link
|
||||||
|
url: https://s.veen.world/admin/
|
||||||
|
|
||||||
|
- name: Nextcloud
|
||||||
|
description: Access {{ 'our' if person.type == 'legal' else 'my' }} cloud storage
|
||||||
|
icon:
|
||||||
|
class: fa-solid fa-cloud
|
||||||
|
url: https://cloud.veen.world/
|
||||||
|
- name: Imprint
|
||||||
|
description: Check out the imprint information
|
||||||
|
icon:
|
||||||
|
class: fa-solid fa-scale-balanced
|
||||||
|
url: https://s.veen.world/imprint
|
||||||
|
|
@ -1,14 +1,14 @@
|
|||||||
services:
|
services:
|
||||||
portfolio:
|
portfolio:
|
||||||
build:
|
build:
|
||||||
context: .
|
context: {{docker_repository_path}}
|
||||||
dockerfile: Dockerfile
|
dockerfile: Dockerfile
|
||||||
image: application-portfolio
|
image: application-portfolio
|
||||||
container_name: portfolio
|
container_name: portfolio
|
||||||
ports:
|
ports:
|
||||||
- 127.0.0.1:{{http_port}}:5000
|
- 127.0.0.1:{{http_port}}:5000
|
||||||
volumes:
|
volumes:
|
||||||
- ./app:/app
|
- {{docker_repository_path}}app:/app
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
{% include 'templates/docker/container/networks.yml.j2' %}
|
{% include 'templates/docker/container/networks.yml.j2' %}
|
||||||
healthcheck:
|
healthcheck:
|
||||||
|
@ -1,2 +1,3 @@
|
|||||||
application_id: "portfolio"
|
application_id: "portfolio"
|
||||||
repository_address: "https://github.com/kevinveenbirkenbach/portfolio"
|
docker_repository_address: "https://github.com/kevinveenbirkenbach/portfolio"
|
||||||
|
config_inventory_path: "{{ inventory_dir }}/files/{{ inventory_hostname }}/docker/portfolio/config.yaml"
|
50
roles/docker-repository-setup/README.md
Normal file
50
roles/docker-repository-setup/README.md
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
# Docker Repository Setup 🚀
|
||||||
|
|
||||||
|
This Ansible role sets up and manages your Docker repository. It ensures that the repository is pulled from your remote Git source, and it automatically triggers a rebuild of your Docker images using Docker Compose.
|
||||||
|
|
||||||
|
## Features 🔧
|
||||||
|
|
||||||
|
- **Default Path Setup:**
|
||||||
|
Automatically sets a default `docker_repository_path` if not already defined.
|
||||||
|
|
||||||
|
- **Repository Management:**
|
||||||
|
Clones or updates your Docker repository from a specified Git repository.
|
||||||
|
|
||||||
|
- **Automated Build Trigger:**
|
||||||
|
Notifies handlers to rebuild the Docker repository using Docker Compose with extended timeouts.
|
||||||
|
|
||||||
|
## Role Structure 📂
|
||||||
|
|
||||||
|
- **Handlers:**
|
||||||
|
- `rebuild docker repository`: Runs `docker compose build` in the designated repository directory with custom timeout settings.
|
||||||
|
|
||||||
|
- **Tasks:**
|
||||||
|
- Sets the default repository path if undefined.
|
||||||
|
- Pulls the latest code from the Docker repository.
|
||||||
|
- Notifies the Docker Compose project setup and triggers a repository rebuild.
|
||||||
|
|
||||||
|
- **Meta:**
|
||||||
|
- Declares a dependency on the `docker-compose` role to ensure that handlers and related dependencies are loaded.
|
||||||
|
|
||||||
|
## Usage ⚙️
|
||||||
|
|
||||||
|
Ensure that you have set the following variables (either via your inventory, `group_vars`, or `host_vars`):
|
||||||
|
|
||||||
|
- `docker_repository_address`: The Git repository URL of your Docker repository.
|
||||||
|
- `docker_compose.directories.services`: The base directory where your Docker services are stored.
|
||||||
|
The role will append `repository/` to this path to form `docker_repository_path`.
|
||||||
|
|
||||||
|
If `docker_repository_path` is not defined, the role will automatically set it to:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
"{{ docker_compose.directories.services }}repository/"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Author
|
||||||
|
|
||||||
|
Kevin Veen-Birkenbach
|
||||||
|
[https://www.veen.world](https://www.veen.world)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Happy deploying! 🚀🐳
|
7
roles/docker-repository-setup/handlers/main.yml
Normal file
7
roles/docker-repository-setup/handlers/main.yml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
- name: rebuild docker repository
|
||||||
|
command:
|
||||||
|
cmd: docker compose build
|
||||||
|
chdir: "{{docker_repository_path}}"
|
||||||
|
environment:
|
||||||
|
COMPOSE_HTTP_TIMEOUT: 600
|
||||||
|
DOCKER_CLIENT_TIMEOUT: 600
|
2
roles/docker-repository-setup/meta/main.yml
Normal file
2
roles/docker-repository-setup/meta/main.yml
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
dependencies:
|
||||||
|
- docker-compose # To load handlers and make dependencies visible
|
14
roles/docker-repository-setup/tasks/main.yml
Normal file
14
roles/docker-repository-setup/tasks/main.yml
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
- name: Set default docker_repository_path if not defined
|
||||||
|
set_fact:
|
||||||
|
docker_repository_path: "{{docker_compose.directories.services}}repository/"
|
||||||
|
when: docker_repository_path is not defined
|
||||||
|
|
||||||
|
- name: pull docker repository
|
||||||
|
git:
|
||||||
|
repo: "{{ docker_repository_address }}"
|
||||||
|
dest: "{{ docker_repository_path }}"
|
||||||
|
update: yes
|
||||||
|
notify:
|
||||||
|
- docker compose project setup
|
||||||
|
- rebuild docker repository
|
||||||
|
become: true
|
@ -7,13 +7,9 @@
|
|||||||
include_role:
|
include_role:
|
||||||
name: nginx-domain-setup
|
name: nginx-domain-setup
|
||||||
|
|
||||||
- name: pull docker repository
|
- name: "include role docker-repository-setup for {{application_id}}"
|
||||||
git:
|
include_role:
|
||||||
repo: "{{ repository_address }}"
|
name: docker-repository-setup
|
||||||
dest: "{{ docker_compose.directories.services }}"
|
|
||||||
update: yes
|
|
||||||
notify: docker compose project setup
|
|
||||||
become: true
|
|
||||||
|
|
||||||
- name: "create {{docker_compose_init}}"
|
- name: "create {{docker_compose_init}}"
|
||||||
template:
|
template:
|
||||||
|
@ -81,7 +81,7 @@ services:
|
|||||||
ports:
|
ports:
|
||||||
- "127.0.0.1:{{http_port}}:80"
|
- "127.0.0.1:{{http_port}}:80"
|
||||||
volumes:
|
volumes:
|
||||||
- {{docker_compose.directories.services}}taiga-gateway/taiga.conf:/etc/nginx/conf.d/default.conf
|
- {{docker_repository_path}}taiga-gateway/taiga.conf:/etc/nginx/conf.d/default.conf
|
||||||
- static-data:/taiga/static
|
- static-data:/taiga/static
|
||||||
- media-data:/taiga/media
|
- media-data:/taiga/media
|
||||||
{% include 'roles/docker-compose/templates/services/base.yml.j2' %}
|
{% include 'roles/docker-compose/templates/services/base.yml.j2' %}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
application_id: "taiga"
|
application_id: "taiga"
|
||||||
database_type: "postgres"
|
database_type: "postgres"
|
||||||
database_password: "{{taiga_database_password}}"
|
database_password: "{{taiga_database_password}}"
|
||||||
repository_address: "https://github.com/taigaio/taiga-docker"
|
docker_repository_address: "https://github.com/taigaio/taiga-docker"
|
||||||
email_backend: "smtp" ## use an SMTP server or display the emails in the console (either "smtp" or "console")
|
email_backend: "smtp" ## use an SMTP server or display the emails in the console (either "smtp" or "console")
|
||||||
docker_compose_init: "{{docker_compose.directories.instance}}docker-compose-inits.yml.j2"
|
docker_compose_init: "{{docker_compose.directories.instance}}docker-compose-inits.yml.j2"
|
@ -124,9 +124,9 @@ def update_discourse(directory):
|
|||||||
"""
|
"""
|
||||||
Updates Discourse by running the rebuild command on the launcher script.
|
Updates Discourse by running the rebuild command on the launcher script.
|
||||||
"""
|
"""
|
||||||
repository_directory = os.path.join(directory, "services", "{{applications.discourse.repository}}")
|
docker_repository_directory = os.path.join(directory, "services", "{{applications.discourse.repository}}")
|
||||||
print(f"Using path {repository_directory} to pull discourse repository.")
|
print(f"Using path {docker_repository_directory } to pull discourse repository.")
|
||||||
os.chdir(repository_directory)
|
os.chdir(docker_repository_directory )
|
||||||
if git_pull():
|
if git_pull():
|
||||||
print("Start Discourse update procedure.")
|
print("Start Discourse update procedure.")
|
||||||
update_procedure("docker stop {{applications.discourse.container}}")
|
update_procedure("docker stop {{applications.discourse.container}}")
|
||||||
|
@ -21,10 +21,12 @@
|
|||||||
chdir: "{{docker_compose.directories.instance}}"
|
chdir: "{{docker_compose.directories.instance}}"
|
||||||
ignore_errors: true
|
ignore_errors: true
|
||||||
|
|
||||||
|
# This could be replaced by include_role: docker-repository-setup
|
||||||
|
# Attendize and Akaunting still use this. When you refactor this code replace this.
|
||||||
- name: pull docker repository
|
- name: pull docker repository
|
||||||
git:
|
git:
|
||||||
repo: "{{ repository_address }}"
|
repo: "{{ docker_repository_address }}"
|
||||||
dest: "{{ repository_directory | default(docker_compose.directories.instance) }}"
|
dest: "{{ docker_repository_directory | default(docker_compose.directories.instance) }}"
|
||||||
update: yes
|
update: yes
|
||||||
notify: docker compose project setup
|
notify: docker compose project setup
|
||||||
become: true
|
become: true
|
||||||
|
Loading…
x
Reference in New Issue
Block a user