Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

✨ Add Casdoor #146

Merged
merged 2 commits into from
May 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ If you have a spare domain name you can configure applications to be accessible
* [Budibase](https://github.com/Budibase/budibase) - Low code platform for building business apps and workflows in minutes
* [Calibre](https://calibre-ebook.com) - Calibre is a powerful and easy to use e-book manager.
* [Calibre-web](https://github.com/janeczku/calibre-web) - Provides a clean interface for browsing, reading and downloading eBooks using an existing Calibre database.
* [Casdoor](https://github.com/casdoor/casdoor) - An open-source UI-first Identity and Access Management (IAM) / Single-Sign-On (SSO) platform.
* [Changedetection.io](https://github.com/dgtlmoon/changedetection.io) - Free open source website change detection, monitor and notification service
* [Chatpad](https://chatpad.ai/) - Not just another ChatGPT user-interface!
* [Chatwoot](https://github.com/chatwoot/chatwoot) - Open-source live-chat, email support, omni-channel desk
Expand Down
4 changes: 4 additions & 0 deletions nas.yml
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,10 @@
tags:
- calibreweb

- role: casdoor
tags:
- casdoor

- role: changedetection
tags:
- changedetection
Expand Down
50 changes: 50 additions & 0 deletions roles/casdoor/defaults/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
---
casdoor_enabled: false

# Networking
casdoor_available_externally: false
casdoor_port: "8006"
casdoor_hostname: "casdoor"
casdoor_network_name: "casdoor"

# Directories
casdoor_data_directory: "{{ docker_home }}/casdoor"

# Security
casdoor_basic_auth_user: "casdoor_user"
casdoor_basic_auth_password: "casdoor_change_me"

# docker
casdoor_container_name: "casdoor"
casdoor_image_name: "casbin/casdoor"
casdoor_image_version: "latest"
casdoor_mysql_container_name: "casdoor-mysql"
casdoor_mysql_image_name: mysql
casdoor_mysql_image_version: "8.0.25"

# specs
casdoor_memory: 1g
casdoor_mysql_memory: 1g
casdoor_mysql_root_password: "supersecure"
casdoor_mysql_database: casdoor
casdoor_mysql_user: casdoor
casdoor_mysql_password: casdoor
casdoor_driver_name: "mysql"
casdoor_data_source_name: "root:{{ casdoor_mysql_root_password }}@tcp({{ casdoor_mysql_container_name }}:3306)/"
# casadoor_staticbaseurl: "https://{{ casdoor_hostname }}.{{ ansible_nas_domain }}"
casdoor_runmode: "prod"


casdoor_env:
RUNNING_IN_DOCKER: "true"
driverName: "{{ casdoor_driver_name }}"
dataSourceName: "{{ casdoor_data_source_name }}"
# staticBaseUrl: "{{ casadoor_staticbaseurl }}"
dbName: "{{ casdoor_mysql_database }}"
runmode: "{{ casdoor_runmode | default('prod') }}"

casdoor_mysql_env:
MYSQL_ROOT_PASSWORD: "{{ casdoor_mysql_root_password }}"
MYSQL_DATABASE: "{{ casdoor_mysql_database }}"
MYSQL_USER: "{{ casdoor_mysql_user }}"
MYSQL_PASSWORD: "{{ casdoor_mysql_password }}"
17 changes: 17 additions & 0 deletions roles/casdoor/molecule/default/molecule.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
---
platforms:
- name: instance
image: geerlingguy/docker-ubuntu2204-ansible:latest
volumes:
- /sys/fs/cgroup:/sys/fs/cgroup:ro
- /var/run/docker.sock:/var/run/docker.sock
- /tmp:/tmp:rw
privileged: true
pre_build_image: true

provisioner:
inventory:
group_vars:
all:
casdoor_enabled: true
casdoor_data_directory: "/tmp/casdoor"
10 changes: 10 additions & 0 deletions roles/casdoor/molecule/default/side_effect.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
- name: Stop
hosts: all
become: true
tasks:
- name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role"
ansible.builtin.include_role:
name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}"
vars:
casdoor_enabled: false
26 changes: 26 additions & 0 deletions roles/casdoor/molecule/default/verify.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
---
- name: Verify
hosts: all
gather_facts: false
tasks:
- name: Include vars
ansible.builtin.include_vars:
file: ../../defaults/main.yml

- name: Get casdoor mysql container state
community.docker.docker_container:
name: "{{ casdoor_mysql_container_name }}"
register: result_mysql

- name: Get casdoor container state
community.docker.docker_container:
name: "{{ casdoor_container_name }}"
register: result

- name: Check if casdoor containers are running
ansible.builtin.assert:
that:
- result_mysql.container['State']['Status'] == "running"
- result_mysql.container['State']['Restarting'] == false
- result.container['State']['Status'] == "running"
- result.container['State']['Restarting'] == false
26 changes: 26 additions & 0 deletions roles/casdoor/molecule/default/verify_stopped.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
---
- name: Verify
hosts: all
gather_facts: false
tasks:
- name: Include vars
ansible.builtin.include_vars:
file: ../../defaults/main.yml

- name: Try and stop and remove casdoor
community.docker.docker_container:
name: "{{ casdoor_container_name }}"
state: absent
register: result

- name: Try and stop and remove casdoor mysql
community.docker.docker_container:
name: "{{ casdoor_mysql_container_name }}"
state: absent
register: result_mysql

- name: Check if casdoor is stopped
ansible.builtin.assert:
that:
- not result.changed
- not result_mysql.changed
1 change: 1 addition & 0 deletions roles/casdoor/requirements.yml
72 changes: 72 additions & 0 deletions roles/casdoor/tasks/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
---
- name: Start Casdoor
block:
- name: Create Casdoor Directory
ansible.builtin.file:
path: "{{ item }}"
state: directory
# owner: 1000
# group: 1000
with_items:
- "{{ casdoor_data_directory }}"

- name: Create Casdoor network
community.docker.docker_network:
name: "{{ casdoor_network_name }}"

- name: Create Casdoor Mysql Docker Container
community.docker.docker_container:
name: "{{ casdoor_mysql_container_name }}"
image: "{{ casdoor_mysql_image_name }}:{{ casdoor_mysql_image_version }}"
pull: true
volumes:
- "{{ casdoor_data_directory }}/mysql:/var/lib/mysql:rw"
networks:
- name: "{{ casdoor_network_name }}"
network_mode: "{{ casdoor_network_name }}"
restart_policy: unless-stopped
memory: "{{ casdoor_mysql_memory }}"
env: "{{ casdoor_mysql_env }}"
labels:
traefik.enable: "false"


- name: Pause for 70 seconds to wait for DB to get up
ansible.builtin.pause:
seconds: 70

- name: Create Casdoor Docker Container
community.docker.docker_container:
name: "{{ casdoor_container_name }}"
image: "{{ casdoor_image_name }}:{{ casdoor_image_version }}"
pull: true
ports:
- "{{ casdoor_port }}:8000"
# volumes:
# - "{{ casdoor_data_directory }}/conf:/conf:rw"
networks:
- name: "{{ casdoor_network_name }}"
network_mode: "{{ casdoor_network_name }}"
restart_policy: unless-stopped
memory: "{{ casdoor_memory }}"
env: "{{ casdoor_env }}"
labels:
traefik.enable: "{{ casdoor_available_externally | string }}"
traefik.http.routers.casdoor.rule: "Host(`{{ casdoor_hostname }}.{{ ansible_nas_domain }}`)"
traefik.http.routers.casdoor.tls.certresolver: "letsencrypt"
traefik.http.routers.casdoor.tls.domains[0].main: "{{ ansible_nas_domain }}"
traefik.http.routers.casdoor.tls.domains[0].sans: "*.{{ ansible_nas_domain }}"
traefik.http.services.casdoor.loadbalancer.server.port: "8000"
when: casdoor_enabled is true

- name: Stop Casdoor
block:
- name: Stop Casdoor
community.docker.docker_container:
name: "{{ casdoor_container_name }}"
state: absent
- name: Stop Casdoor Mysql
community.docker.docker_container:
name: "{{ casdoor_mysql_container_name }}"
state: absent
when: casdoor_enabled is false
2 changes: 1 addition & 1 deletion roles/mantium/defaults/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -79,5 +79,5 @@ mantium_db_env:

mantium_dashboard_env:
TZ: "{{ ansible_nas_timezone }}"
DASHBOARD_PORT: "{{ mantium_dashboard_port}}"
DASHBOARD_PORT: "{{ mantium_dashboard_port }}"
API_ADDRESS: "{{ mantium_api_address }}"
14 changes: 14 additions & 0 deletions website/docs/applications/system-tools/casdoor.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
title: "Casdoor"
description: "An open-source UI-first Identity and Access Management (IAM) / Single-Sign-On (SSO) platform"
---

Homepage: [https://github.com/casdoor/casdoor](https://github.com/casdoor/casdoor)

An open-source UI-first Identity and Access Management (IAM) / Single-Sign-On (SSO) platform with web UI supporting OAuth 2.0, OIDC, SAML, CAS, LDAP, SCIM, WebAuthn, TOTP, MFA, Face ID, RADIUS, Google Workspace, Active Directory and Kerberos

## Usage

Set `casdoor_enabled: true` in your `inventories/<your_inventory>/group_vars/nas.yml`. Run the playbook.

Casdoor web interface can be found at [http://ansible_nas_host_or_ip:8006](http://ansible_nas_host_or_ip:8006). Login with user `admin` and password `123`.