diff --git a/roles/authelia-for-vikunja/defaults/main.json b/roles/authelia-for-vikunja/defaults/main.json new file mode 100644 index 0000000..82bc456 --- /dev/null +++ b/roles/authelia-for-vikunja/defaults/main.json @@ -0,0 +1,5 @@ +{ + "var_authelia_for_vikunja_vikunja_url_base": "https://vikunja.example.org", + "var_authelia_for_vikunja_client_id": "vikunja", + "var_authelia_for_vikunja_client_secret": "REPLACE_ME" +} diff --git a/roles/authelia-for-vikunja/info.md b/roles/authelia-for-vikunja/info.md new file mode 100644 index 0000000..c3da4d0 --- /dev/null +++ b/roles/authelia-for-vikunja/info.md @@ -0,0 +1,10 @@ +## Beschreibung + +Um [Vikunja](../vikunja) gegen [Authelia](../authelia) authentifizieren zu lassen + + +## Verweise + +- [Authelia-Dokumentation | Vikunja Integration](https://www.authelia.com/integration/openid-connect/vikunja/) +- [Vikunja-Dokumentation | OpenID](https://vikunja.io/docs/openid/) +- [Vikunja-Dokumentation | OpenID example configurations](https://vikunja.io/docs/openid-example-configurations/) diff --git a/roles/authelia-for-vikunja/tasks/main.json b/roles/authelia-for-vikunja/tasks/main.json new file mode 100644 index 0000000..3067d3d --- /dev/null +++ b/roles/authelia-for-vikunja/tasks/main.json @@ -0,0 +1,25 @@ +[ + { + "name": "configuration | emplace", + "become": true, + "ansible.builtin.template": { + "src": "authelia-client-conf.json.j2", + "dest": "/etc/authelia/conf.d/clients/vikunja.json" + } + }, + { + "name": "configuration | apply", + "become": true, + "ansible.builtin.command": { + "cmd": "/usr/bin/authelia-conf-compose" + } + }, + { + "name": "restart service", + "become": true, + "ansible.builtin.systemd_service": { + "state": "restarted", + "name": "authelia" + } + } +] diff --git a/roles/authelia-for-vikunja/templates/authelia-client-conf.json.j2 b/roles/authelia-for-vikunja/templates/authelia-client-conf.json.j2 new file mode 100644 index 0000000..47d38e7 --- /dev/null +++ b/roles/authelia-for-vikunja/templates/authelia-client-conf.json.j2 @@ -0,0 +1,17 @@ +{ + "client_id": "{{var_authelia_for_vikunja_client_id}}", + "client_secret": "{{var_authelia_for_vikunja_client_secret}}", + "client_name": "Vikunja", + "public": false, + "authorization_policy": "one_factor", + "redirect_uris": [ + "{{var_authelia_for_vikunja_vikunja_url_base}}/_vikunja/client/oidc/callback" + ], + "scopes": [ + "openid", + "email", + "profile" + ], + "userinfo_signed_response_alg": "none", + "token_endpoint_auth_method": "client_secret_basic" +} diff --git a/roles/vikunja-and-nginx/defaults/main.json b/roles/vikunja-and-nginx/defaults/main.json new file mode 100644 index 0000000..e08064b --- /dev/null +++ b/roles/vikunja-and-nginx/defaults/main.json @@ -0,0 +1,3 @@ +{ + "var_vikunja_and_nginx_domain": "vikunja.example.org" +} diff --git a/roles/vikunja-and-nginx/info.md b/roles/vikunja-and-nginx/info.md new file mode 100644 index 0000000..badd0b2 --- /dev/null +++ b/roles/vikunja-and-nginx/info.md @@ -0,0 +1,3 @@ +## Verweise + +- [Vikunja-Dokumentation](https://vikunja.io/docs/reverse-proxy/#nginx) diff --git a/roles/vikunja-and-nginx/tasks/main.json b/roles/vikunja-and-nginx/tasks/main.json new file mode 100644 index 0000000..014244d --- /dev/null +++ b/roles/vikunja-and-nginx/tasks/main.json @@ -0,0 +1,35 @@ +[ + { + "name": "deactivate default site", + "become": true, + "ansible.builtin.file": { + "state": "absent", + "dest": "/etc/nginx/sites-enabled/default" + } + }, + { + "name": "emplace configuration | data", + "become": true, + "ansible.builtin.template": { + "src": "conf.j2", + "dest": "/etc/nginx/sites-available/{{var_vikunja_and_nginx_domain}}" + } + }, + { + "name": "emplace configuration | link", + "become": true, + "ansible.builtin.file": { + "state": "link", + "src": "/etc/nginx/sites-available/{{var_vikunja_and_nginx_domain}}", + "dest": "/etc/nginx/sites-enabled/{{var_vikunja_and_nginx_domain}}" + } + }, + { + "name": "restart nginx", + "become": true, + "ansible.builtin.systemd_service": { + "state": "restarted", + "name": "nginx" + } + } +] diff --git a/roles/vikunja-and-nginx/templates/conf.j2 b/roles/vikunja-and-nginx/templates/conf.j2 new file mode 100644 index 0000000..028f8f3 --- /dev/null +++ b/roles/vikunja-and-nginx/templates/conf.j2 @@ -0,0 +1,16 @@ +server { + listen 80; + listen [::]:80; + listen 443 ssl; + listen [::]:443 ssl; + + server_name {{var_vikunja_and_nginx_domain}}; + + ssl_certificate /etc/ssl/fullchains/{{var_vikunja_and_nginx_domain}}.pem; + ssl_certificate_key /etc/ssl/private/{{var_vikunja_and_nginx_domain}}.pem; + + location / { + proxy_pass http://localhost:3456; + client_max_body_size 20M; + } +} diff --git a/roles/vikunja/defaults/main.json b/roles/vikunja/defaults/main.json new file mode 100644 index 0000000..e237df5 --- /dev/null +++ b/roles/vikunja/defaults/main.json @@ -0,0 +1,20 @@ +{ + "var_vikunja_version": "0.23.0", + "var_vikunja_architecture": "amd64", + "var_vikunja_domain": "vikunja.example.org", + "var_vikunja_directory": "/opt/vikunja", + "var_vikunja_user": "vikunja", + "var_vikunja_database_kind": "sqlite", + "var_vikunja_database_data_sqlite_path": "data.sqlite", + "var_vikunja_database_data_postgresql_host": "postgresql.example.org", + "var_vikunja_database_data_postgresql_port": 5432, + "var_vikunja_database_data_postgresql_username": "vikunja_user", + "var_vikunja_database_data_postgresql_password": "REPLACE_ME", + "var_vikunja_database_data_postgresql_schema": "vikunja", + "var_vikunja_authentication_kind": "internal", + "var_vikunja_authentication_data_authelia_provider_id": "authelia", + "var_vikunja_authentication_data_authelia_provider_name": "Authelia", + "var_vikunja_authentication_data_authelia_client_id": "vikunja", + "var_vikunja_authentication_data_authelia_client_secret": "REPLACE_ME", + "var_vikunja_authentication_data_authelia_url_base": "https://authelia.example.org" +} diff --git a/roles/vikunja/info.md b/roles/vikunja/info.md new file mode 100644 index 0000000..ca47178 --- /dev/null +++ b/roles/vikunja/info.md @@ -0,0 +1,9 @@ +## Beschreibung + +- Einrichtung der Aufgaben-Verwaltung [Vikunja](https://vikunja.io/) + + +## Verweise + +- [git-Repository](https://kolaente.dev/vikunja/vikunja) +- [Konfiguration](https://vikunja.io/docs/config-options/) diff --git a/roles/vikunja/tasks/main.json b/roles/vikunja/tasks/main.json new file mode 100644 index 0000000..112e6c5 --- /dev/null +++ b/roles/vikunja/tasks/main.json @@ -0,0 +1,64 @@ +[ + { + "name": "user", + "ansible.builtin.user": { + "name": "{{var_vikunja_user}}", + "create_home": true, + "home": "{{var_vikunja_directory}}" + } + }, + { + "name": "download", + "become": true, + "become_user": "{{var_vikunja_user}}", + "ansible.builtin.get_url": { + "url": "https://dl.vikunja.io/vikunja/{{var_vikunja_version}}/vikunja-v{{var_vikunja_version}}-linux-{{var_vikunja_architecture}}-full.zip", + "dest": "/tmp/vikunja.zip" + } + }, + { + "name": "unpack", + "become": true, + "become_user": "{{var_vikunja_user}}", + "ansible.builtin.unarchive": { + "src": "/tmp/vikunja.zip", + "dest": "{{var_vikunja_directory}}" + } + }, + { + "name": "link", + "become": true, + "become_user": "{{var_vikunja_user}}", + "ansible.builtin.file": { + "state": "link", + "src": "{{var_vikunja_directory}}/vikunja-v{{var_vikunja_version}}-{{var_vikunja_architecture}}", + "dest": "{{var_vikunja_directory}}/vikunja" + } + }, + { + "name": "conf", + "become": true, + "become_user": "{{var_vikunja_user}}", + "ansible.builtin.template": { + "src": "config.json.j2", + "dest": "{{var_vikunja_directory}}/config.json" + } + }, + { + "name": "systemd-unit", + "become": true, + "ansible.builtin.template": { + "src": "systemd-unit.j2", + "dest": "/etc/systemd/system/vikunja.service" + } + }, + { + "name": "apply", + "become": true, + "ansible.builtin.systemd_service": { + "state": "restarted", + "enabled": true, + "name": "vikunja" + } + } +] diff --git a/roles/vikunja/templates/config.json.j2 b/roles/vikunja/templates/config.json.j2 new file mode 100644 index 0000000..616d77b --- /dev/null +++ b/roles/vikunja/templates/config.json.j2 @@ -0,0 +1,44 @@ +{ + "database": { +{% if var_vikunja_database_kind == 'sqlite' %} + "type": "sqlite", + "path": "{{var_vikunja_database_data_sqlite_path}}" +{% endif %} +{% if var_vikunja_database_kind == 'postgresql' %} + "type": "postgres", + "host": "{{var_vikunja_database_data_postgresql_host}}", + "port": {{var_vikunja_database_data_postgresql_port | string}}, + "user": "{{var_vikunja_database_data_postgresql_username}}", + "password": "{{var_vikunja_database_data_postgresql_password}}", + "database": "{{var_vikunja_database_data_postgresql_schema}}" +{% endif %} + }, + "auth": { +{% if var_vikunja_authentication_kind == 'internal' %} + "local": { + "enabled": true + }, + "openid": { + "enabled": false + } +{% endif %} +{% if var_vikunja_authentication_kind == 'authelia' %} + "local": { + "enabled": false + }, + "openid": { + "enabled": true, + "redirecturl": "https://{{var_vikunja_domain}}/auth/openid/", + "providers": [ + { + "name": "Authelia", + "authurl": "{{var_vikunja_authentication_data_authelia_url_base}}", + "clientid": "{{var_vikunja_authentication_data_authelia_client_id}}", + "clientsecret": "{{var_vikunja_authentication_data_authelia_client_secret}}", + "scope": "openid profile email" + } + ] + } +{% endif %} + } +} diff --git a/roles/vikunja/templates/systemd-unit.j2 b/roles/vikunja/templates/systemd-unit.j2 new file mode 100644 index 0000000..66474fe --- /dev/null +++ b/roles/vikunja/templates/systemd-unit.j2 @@ -0,0 +1,16 @@ +[Unit] +Description=Vikunja +After=syslog.target +After=network.target + +[Service] +User={{var_vikunja_user}} +Group={{var_vikunja_user}} +RestartSec=2s +Type=simple +WorkingDirectory={{var_vikunja_directory}} +ExecStart=/usr/bin/vikunja +Restart=always + +[Install] +WantedBy=multi-user.target diff --git a/roles/vikunja/vardef.json b/roles/vikunja/vardef.json new file mode 100644 index 0000000..6a741c1 --- /dev/null +++ b/roles/vikunja/vardef.json @@ -0,0 +1,82 @@ +{ + "version": { + "type": "string", + "mandatory": false + }, + "architecture": { + "type": "string", + "mandatory": false + }, + "domain": { + "type": "string", + "mandatory": false + }, + "directory": { + "type": "string", + "mandatory": false + }, + "user": { + "type": "string", + "mandatory": false + }, + "database_kind": { + "type": "string", + "mandatory": false, + "options": [ + "sqlite", + "postgresql" + ] + }, + "database_data_sqlite_path": { + "type": "string", + "mandatory": false + }, + "database_data_postgresql_host": { + "type": "string", + "mandatory": false + }, + "database_data_postgresql_port": { + "type": "integer", + "mandatory": false + }, + "database_data_postgresql_username": { + "type": "string", + "mandatory": false + }, + "database_data_postgresql_password": { + "type": "string", + "mandatory": false + }, + "database_data_postgresql_schema": { + "type": "string", + "mandatory": false + }, + "authentication_kind": { + "type": "string", + "mandatory": false, + "options": [ + "internal", + "authelia" + ] + }, + "authentication_data_authelia_provider_id": { + "type": "string", + "mandatory": false + }, + "authentication_data_authelia_provider_name": { + "type": "string", + "mandatory": false + }, + "authentication_data_authelia_client_id": { + "type": "string", + "mandatory": false + }, + "authentication_data_authelia_client_secret": { + "type": "string", + "mandatory": false + }, + "authentication_data_authelia_url_base": { + "type": "string", + "mandatory": false + } +}