From 3ba47707066a3951125b2d96a6b611165717271e Mon Sep 17 00:00:00 2001 From: Anarion <2185791+anarion80@users.noreply.github.com> Date: Mon, 13 May 2024 18:45:10 +0200 Subject: [PATCH] Add Huly Platform (#130) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * :sparkles: Add Huly * 🔒️ Update to work with https/wss * 💡 Uncomment TLS * 🚨 Fix lint --- README.md | 1 + nas.yml | 4 + roles/huly/defaults/main.yml | 115 +++++++ roles/huly/docs/huly.md | 11 + roles/huly/molecule/default/molecule.yml | 6 + roles/huly/molecule/default/side_effect.yml | 10 + roles/huly/molecule/default/verify.yml | 68 ++++ .../huly/molecule/default/verify_stopped.yml | 68 ++++ roles/huly/requirements.yml | 1 + roles/huly/tasks/main.yml | 295 ++++++++++++++++++ .../applications/content-management/huly.md | 15 + 11 files changed, 594 insertions(+) create mode 100644 roles/huly/defaults/main.yml create mode 100644 roles/huly/docs/huly.md create mode 100644 roles/huly/molecule/default/molecule.yml create mode 100644 roles/huly/molecule/default/side_effect.yml create mode 100644 roles/huly/molecule/default/verify.yml create mode 100644 roles/huly/molecule/default/verify_stopped.yml create mode 120000 roles/huly/requirements.yml create mode 100644 roles/huly/tasks/main.yml create mode 100644 website/docs/applications/content-management/huly.md diff --git a/README.md b/README.md index 08021f7b4f..bec85b2fa5 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,7 @@ If you have a spare domain name you can configure applications to be accessible * [Homebridge](https://github.com/nfarina/homebridge) - Emulate the iOS HomeKit API * [Homepage](https://gethomepage.dev/) - Highly customizable application dashboard with integrations for over 100 services. * [Huginn](https://github.com/huginn/huginn) - Create agents that monitor and act on your behalf. Your agents are standing by! +* [Huly Platform](https://github.com/hcengineering/platform) - All-in-One Project Management Platform (alternative to Linear, Jira, Slack, Notion, Motion) * [Huntly](https://github.com/lcomplete/huntly) - Self-hosted information management tool * [ICantBelieveItsNotValetudo](https://github.com/Hypfer/ICantBelieveItsNotValetudo) - companion service for Valetudo that renders ValetudoMap map data to raster graphics. * [Immich](https://immich.app/) - Self-hosted photo and video backup solution directly from your mobile phone. diff --git a/nas.yml b/nas.yml index b352c0155e..88560334fe 100644 --- a/nas.yml +++ b/nas.yml @@ -302,6 +302,10 @@ tags: - huginn + - role: huly + tags: + - huly + - role: huntly tags: - huntly diff --git a/roles/huly/defaults/main.yml b/roles/huly/defaults/main.yml new file mode 100644 index 0000000000..427276fc43 --- /dev/null +++ b/roles/huly/defaults/main.yml @@ -0,0 +1,115 @@ +--- +huly_enabled: false +huly_available_externally: false + +# directories +huly_data_directory: "{{ docker_home }}/huly" + +# network +huly_mongo_port: "27017" +huly_minio_port_a: "9010" +huly_minio_port_b: "9011" +huly_elastic_port: "9201" +huly_account_port: "3020" +huly_front_port: "8139" +huly_collaborator_port: "3078" +huly_transactor_port: "3333" +huly_rekoni_port: "4004" +huly_hostname: "huly" +huly_account_hostname: "huly-account" +huly_collaborator_hostname: "huly-collaborator" +huly_transactor_hostname: "huly-transactor" +huly_network_name: "huly" + +# specs +huly_mongo_memory: 1g +huly_minio_memory: 1g +huly_elastic_memory: 1g +huly_account_memory: 1g +huly_front_memory: 1g +huly_collaborator_memory: 1g +huly_transactor_memory: 1g +huly_rekoni_memory: 500m + +# docker + +huly_mongo_container_name: huly-mongo +huly_mongo_image_name: "mongo" +huly_mongo_image_version: "7-jammy" + +huly_minio_container_name: huly-minio +huly_minio_image_name: "minio/minio" +huly_minio_image_version: "latest" + +huly_elastic_container_name: huly-elastic +huly_elastic_image_name: "elasticsearch" +huly_elastic_image_version: "7.14.2" + +huly_account_container_name: huly-account +huly_account_image_name: "hardcoreeng/account" +huly_account_image_version: "latest" + +huly_front_container_name: huly-front +huly_front_image_name: "hardcoreeng/front" +huly_front_image_version: "latest" + +huly_collaborator_container_name: huly-collaborator +huly_collaborator_image_name: "hardcoreeng/collaborator" +huly_collaborator_image_version: "latest" + +huly_transactor_container_name: huly-transactor +huly_transactor_image_name: "hardcoreeng/transactor" +huly_transactor_image_version: "latest" + +huly_rekoni_container_name: huly-rekoni +huly_rekoni_image_name: "hardcoreeng/rekoni-service" +huly_rekoni_image_version: "latest" + +huly_user_id: "1000" +huly_group_id: "1000" + +# huly +huly_server_address: "{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address'] }}" + +huly_elastic_bitnami_debug: "true" +huly_elastic_discovery_type: single-node +huly_elastic_es_java_opts: "-Xms1024m -Xmx1024m" +huly_elastic_http_cors_enabled: "true" +huly_elastic_http_cors_allow_origin: "http://localhost:8082" # not sure what this points to, might need to be fixed later + +huly_account_server_port: "3000" +huly_account_server_secret: secret +huly_mongo_url: "mongodb://{{ huly_mongo_container_name }}:27017" +huly_transactor_url: "wss://{{ huly_transactor_hostname }}.{{ ansible_nas_domain }}" +huly_endpoint_url: "wss://{{ huly_transactor_hostname }}.{{ ansible_nas_domain }}" +huly_minio_endpoint: "{{ huly_minio_container_name }}" +huly_minio_access_key: minioadmin +huly_minio_secret_key: minioadmin +huly_front_url: "https://{{ huly_hostname }}.{{ ansible_nas_domain }}" +huly_init_workspace: "demo-tracker" +huly_model_enabled: "*" +huly_accounts_url: "https://{{ huly_account_hostname }}.{{ ansible_nas_domain }}" + +huly_front_server_port: "8080" +huly_front_server_secret: secret +huly_rekoni_url: "http://{{ huly_server_address }}:4004" +huly_calendar_url: "http://{{ huly_server_address }}:8095" +huly_gmail_url: "http://{{ huly_server_address }}:8088" +huly_telegram_url: "http://{{ huly_server_address }}:8086" +huly_upload_url: "/files" +huly_elastic_url: "http://{{ huly_elastic_container_name }}:9200" +huly_collaborator_url: "wss://{{ huly_collaborator_hostname }}.{{ ansible_nas_domain }}" +huly_collaborator_api_url: "https://{{ huly_collaborator_hostname }}.{{ ansible_nas_domain }}" +huly_title: "Huly Self Hosted" +huly_default_language: "en" +huly_last_name_first: "true" + +huly_collaborator_port_env: "3078" +huly_collaborator_server_secret: secret +huly_transactor_server_port: "3333" +huly_transactor_server_secret: secret +huly_transactor_cursor_maxtimesms: "30000" +huly_transactor_metrics_console: "false" +huly_transactor_metrics_file: "metrics.txt" +huly_transactor_server_provider: ws +huly_transactor_elastic_index_name: local_storage_index diff --git a/roles/huly/docs/huly.md b/roles/huly/docs/huly.md new file mode 100644 index 0000000000..e6c1982ed2 --- /dev/null +++ b/roles/huly/docs/huly.md @@ -0,0 +1,11 @@ +# Huly Platform + +Homepage: [https://github.com/hcengineering/platform](https://github.com/hcengineering/platform) + +Huly — All-in-One Project Management Platform (alternative to Linear, Jira, Slack, Notion, Motion) + +## Usage + +Set `huly_enabled: true` in your `inventories//group_vars/nas.yml` file. + +huly web interface can be found at [http://ansible_nas_host_or_ip:8139](http://ansible_nas_host_or_ip:8139). diff --git a/roles/huly/molecule/default/molecule.yml b/roles/huly/molecule/default/molecule.yml new file mode 100644 index 0000000000..1bcd1012e2 --- /dev/null +++ b/roles/huly/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + huly_enabled: true diff --git a/roles/huly/molecule/default/side_effect.yml b/roles/huly/molecule/default/side_effect.yml new file mode 100644 index 0000000000..90791c3469 --- /dev/null +++ b/roles/huly/molecule/default/side_effect.yml @@ -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: + huly_enabled: false diff --git a/roles/huly/molecule/default/verify.yml b/roles/huly/molecule/default/verify.yml new file mode 100644 index 0000000000..69ef0e4f18 --- /dev/null +++ b/roles/huly/molecule/default/verify.yml @@ -0,0 +1,68 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get huly mongo container state + community.docker.docker_container: + name: "{{ huly_mongo_container_name }}" + register: result_mongo + + - name: Get huly minio container state + community.docker.docker_container: + name: "{{ huly_minio_container_name }}" + register: result_minio + + - name: Get huly elastic container state + community.docker.docker_container: + name: "{{ huly_elastic_container_name }}" + register: result_elastic + + - name: Get huly account container state + community.docker.docker_container: + name: "{{ huly_account_container_name }}" + register: result_account + + - name: Get huly front container state + community.docker.docker_container: + name: "{{ huly_front_container_name }}" + register: result_front + + - name: Get huly collaborator container state + community.docker.docker_container: + name: "{{ huly_collaborator_container_name }}" + register: result_collaborator + + - name: Get huly transactor container state + community.docker.docker_container: + name: "{{ huly_transactor_container_name }}" + register: result_transactor + + - name: Get huly rekoni container state + community.docker.docker_container: + name: "{{ huly_rekoni_container_name }}" + register: result_rekoni + + - name: Check if huly containers are running + ansible.builtin.assert: + that: + - result_mongo.container['State']['Status'] == "running" + - result_mongo.container['State']['Restarting'] == false + - result_minio.container['State']['Status'] == "running" + - result_minio.container['State']['Restarting'] == false + - result_elastic.container['State']['Status'] == "running" + - result_elastic.container['State']['Restarting'] == false + - result_account.container['State']['Status'] == "running" + - result_account.container['State']['Restarting'] == false + - result_front.container['State']['Status'] == "running" + - result_front.container['State']['Restarting'] == false + - result_collaborator.container['State']['Status'] == "running" + - result_collaborator.container['State']['Restarting'] == false + - result_transactor.container['State']['Status'] == "running" + - result_transactor.container['State']['Restarting'] == false + - result_rekoni.container['State']['Status'] == "running" + - result_rekoni.container['State']['Restarting'] == false diff --git a/roles/huly/molecule/default/verify_stopped.yml b/roles/huly/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..327cf1a1a9 --- /dev/null +++ b/roles/huly/molecule/default/verify_stopped.yml @@ -0,0 +1,68 @@ +--- +- 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 huly mongo + community.docker.docker_container: + name: "{{ huly_mongo_container_name }}" + state: absent + register: result_mongo + + - name: Try and stop and remove huly minio + community.docker.docker_container: + name: "{{ huly_minio_container_name }}" + state: absent + register: result_minio + + - name: Try and stop and remove huly elastic + community.docker.docker_container: + name: "{{ huly_elastic_container_name }}" + state: absent + register: result_elastic + + - name: Try and stop and remove huly account + community.docker.docker_container: + name: "{{ huly_account_container_name }}" + state: absent + register: result_account + + - name: Try and stop and remove huly front + community.docker.docker_container: + name: "{{ huly_front_container_name }}" + state: absent + register: result_front + + - name: Try and stop and remove huly collaborator + community.docker.docker_container: + name: "{{ huly_collaborator_container_name }}" + state: absent + register: result_collaborator + + - name: Try and stop and remove huly transactor + community.docker.docker_container: + name: "{{ huly_transactor_container_name }}" + state: absent + register: result_transactor + + - name: Try and stop and remove huly rekoni + community.docker.docker_container: + name: "{{ huly_rekoni_container_name }}" + state: absent + register: result_rekoni + + - name: Check if huly is stopped + ansible.builtin.assert: + that: + - not result_mongo.changed + - not result_minio.changed + - not result_elastic.changed + - not result_account.changed + - not result_front.changed + - not result_collaborator.changed + - not result_transactor.changed + - not result_rekoni.changed diff --git a/roles/huly/requirements.yml b/roles/huly/requirements.yml new file mode 120000 index 0000000000..9a736435ab --- /dev/null +++ b/roles/huly/requirements.yml @@ -0,0 +1 @@ +../../requirements.yml \ No newline at end of file diff --git a/roles/huly/tasks/main.yml b/roles/huly/tasks/main.yml new file mode 100644 index 0000000000..465cae2637 --- /dev/null +++ b/roles/huly/tasks/main.yml @@ -0,0 +1,295 @@ +--- +- name: Start Huly + block: + - name: Create Huly Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + owner: "{{ huly_user_id }}" + group: "{{ huly_group_id }}" + with_items: + - "{{ huly_data_directory }}" + - "{{ huly_data_directory }}/elastic" + + - name: Create Huly Network + community.docker.docker_network: + name: "{{ huly_network_name }}" + + - name: Create Huly Mongo Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ huly_mongo_container_name }}" + image: "{{ huly_mongo_image_name }}:{{ huly_mongo_image_version }}" + pull: true + networks: + - name: "{{ huly_network_name }}" + network_mode: "{{ huly_network_name }}" + ports: + - "{{ huly_mongo_port }}:27017" + volumes: + - "{{ huly_data_directory }}/mongo_data:/data/db" + env: + PUID: "{{ huly_user_id }}" + GUID: "{{ huly_group_id }}" + labels: + traefik.enable: "false" + restart_policy: always + memory: "{{ huly_mongo_memory }}" + + - name: Create Huly Minio Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ huly_minio_container_name }}" + image: "{{ huly_minio_image_name }}:{{ huly_minio_image_version }}" + pull: true + command: server /data --address ":9000" --console-address ":9001" + networks: + - name: "{{ huly_network_name }}" + network_mode: "{{ huly_network_name }}" + ports: + - "{{ huly_minio_port_a }}:9000" + - "{{ huly_minio_port_b }}:9001" + volumes: + - "{{ huly_data_directory }}/files:/data" + labels: + traefik.enable: "false" + restart_policy: always + memory: "{{ huly_minio_memory }}" + + - name: Create Huly Elastic Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ huly_elastic_container_name }}" + image: "{{ huly_elastic_image_name }}:{{ huly_elastic_image_version }}" + pull: true + command: | + /bin/sh -c "./bin/elasticsearch-plugin list | grep -q ingest-attachment || yes | ./bin/elasticsearch-plugin install --silent ingest-attachment; + /usr/local/bin/docker-entrypoint.sh eswrapper" + networks: + - name: "{{ huly_network_name }}" + network_mode: "{{ huly_network_name }}" + ports: + - "{{ huly_elastic_port }}:9200" + volumes: + - "{{ huly_data_directory }}/elastic:/usr/share/elasticsearch/data" + env: + ELASTICSEARCH_PORT_NUMBER: "9200" + BITNAMI_DEBUG: "{{ huly_elastic_bitnami_debug }}" + discovery.type: "{{ huly_elastic_discovery_type }}" + ES_JAVA_OPTS: "{{ huly_elastic_es_java_opts }}" + http.cors.enabled: "{{ huly_elastic_http_cors_enabled }}" + http.cors.allow-origin: "{{ huly_elastic_http_cors_allow_origin }}" + labels: + traefik.enable: "false" + restart_policy: always + healthcheck: + interval: 20s + retries: 10 + test: curl -s http://{{ huly_elastic_container_name }}:9200/_cluster/health | grep -vq '"status":"red"' + memory: "{{ huly_elastic_memory }}" + + - name: Create Huly Account Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ huly_account_container_name }}" + image: "{{ huly_account_image_name }}:{{ huly_account_image_version }}" + pull: true + networks: + - name: "{{ huly_network_name }}" + network_mode: "{{ huly_network_name }}" + ports: + - "{{ huly_account_port }}:3000" + volumes: + - "{{ huly_data_directory }}/files:/data" + env: + SERVER_PORT: "{{ huly_account_server_port }}" + SERVER_SECRET: "{{ huly_account_server_secret }}" + MONGO_URL: "{{ huly_mongo_url }}" + TRANSACTOR_URL: "{{ huly_transactor_url }}" + ENDPOINT_URL: "{{ huly_endpoint_url }}" + MINIO_ENDPOINT: "{{ huly_minio_endpoint }}" + MINIO_ACCESS_KEY: "{{ huly_minio_access_key }}" + MINIO_SECRET_KEY: "{{ huly_minio_secret_key }}" + FRONT_URL: "{{ huly_front_url }}" + INIT_WORKSPACE: "{{ huly_init_workspace }}" + MODEL_ENABLED: "{{ huly_model_enabled }}" + ACCOUNTS_URL: "{{ huly_accounts_url }}" + labels: + traefik.enable: "{{ huly_available_externally | string }}" + traefik.http.routers.huly-account.rule: "Host(`{{ huly_account_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.huly-account.tls.certresolver: "letsencrypt" + traefik.http.routers.huly-account.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.huly-account.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.huly-account.loadbalancer.server.port: "3000" + restart_policy: always + memory: "{{ huly_account_memory }}" + + - name: Create Huly Front Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ huly_front_container_name }}" + image: "{{ huly_front_image_name }}:{{ huly_front_image_version }}" + pull: true + networks: + - name: "{{ huly_network_name }}" + network_mode: "{{ huly_network_name }}" + ports: + - "{{ huly_front_port }}:8080" + volumes: + - "{{ huly_data_directory }}/files:/data" + env: + SERVER_PORT: "{{ huly_front_server_port }}" + SERVER_SECRET: "{{ huly_front_server_secret }}" + ACCOUNTS_URL: "{{ huly_accounts_url }}" + REKONI_URL: "{{ huly_rekoni_url }}" + CALENDAR_URL: "{{ huly_calendar_url }}" + GMAIL_URL: "{{ huly_gmail_url }}" + TELEGRAM_URL: "{{ huly_telegram_url }}" + UPLOAD_URL: "{{ huly_upload_url }}" + TRANSACTOR_URL: "{{ huly_transactor_url }}" + ELASTIC_URL: "{{ huly_elastic_url }}" + MONGO_URL: "{{ huly_mongo_url }}" + COLLABORATOR_URL: "{{ huly_collaborator_url }}" + COLLABORATOR_API_URL: "{{ huly_collaborator_api_url }}" + MINIO_ENDPOINT: "{{ huly_minio_endpoint }}" + MINIO_ACCESS_KEY: "{{ huly_minio_access_key }}" + MINIO_SECRET_KEY: "{{ huly_minio_secret_key }}" + TITLE: "{{ huly_title }}" + DEFAULT_LANGUAGE: "{{ huly_default_language }}" + LAST_NAME_FIRST: "{{ huly_last_name_first }}" + labels: + traefik.enable: "{{ huly_available_externally | string }}" + traefik.http.routers.huly.rule: "Host(`{{ huly_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.huly.tls.certresolver: "letsencrypt" + traefik.http.routers.huly.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.huly.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.huly.loadbalancer.server.port: "8080" + restart_policy: always + memory: "{{ huly_front_memory }}" + + - name: Create Huly Collaborator Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ huly_collaborator_container_name }}" + image: "{{ huly_collaborator_image_name }}:{{ huly_collaborator_image_version }}" + pull: true + networks: + - name: "{{ huly_network_name }}" + network_mode: "{{ huly_network_name }}" + ports: + - "{{ huly_collaborator_port }}:3078" + volumes: + - "{{ huly_data_directory }}/files:/data" + env: + COLLABORATOR_PORT: "{{ huly_collaborator_port_env }}" + SECRET: "{{ huly_collaborator_server_secret }}" + ACCOUNTS_URL: "{{ huly_accounts_url }}" + TRANSACTOR_URL: "{{ huly_transactor_url }}" + UPLOAD_URL: "{{ huly_upload_url }}" + MONGO_URL: "{{ huly_mongo_url }}" + MINIO_ENDPOINT: "{{ huly_minio_endpoint }}" + MINIO_ACCESS_KEY: "{{ huly_minio_access_key }}" + MINIO_SECRET_KEY: "{{ huly_minio_secret_key }}" + labels: + traefik.enable: "{{ huly_available_externally | string }}" + traefik.http.routers.huly-collaborator.rule: "Host(`{{ huly_collaborator_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.huly-collaborator.tls.certresolver: "letsencrypt" + traefik.http.routers.huly-collaborator.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.huly-collaborator.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.huly-collaborator.loadbalancer.server.port: "3078" + restart_policy: always + memory: "{{ huly_collaborator_memory }}" + + - name: Create Huly Transactor Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ huly_transactor_container_name }}" + image: "{{ huly_transactor_image_name }}:{{ huly_transactor_image_version }}" + pull: true + networks: + - name: "{{ huly_network_name }}" + network_mode: "{{ huly_network_name }}" + ports: + - "{{ huly_transactor_port }}:3333" + volumes: + - "{{ huly_data_directory }}/files:/data" + env: + SERVER_PORT: "{{ huly_transactor_server_port }}" + SERVER_SECRET: "{{ huly_transactor_server_secret }}" + SERVER_CURSOR_MAXTIMEMS: "{{ huly_transactor_cursor_maxtimesms }}" + ELASTIC_URL: "{{ huly_elastic_url }}" + MONGO_URL: "{{ huly_mongo_url }}" + METRICS_CONSOLE: "{{ huly_transactor_metrics_console }}" + METRICS_FILE: "{{ huly_transactor_metrics_file }}" + MINIO_ENDPOINT: "{{ huly_minio_endpoint }}" + MINIO_ACCESS_KEY: "{{ huly_minio_access_key }}" + MINIO_SECRET_KEY: "{{ huly_minio_secret_key }}" + REKONI_URL: "{{ huly_rekoni_url }}" + FRONT_URL: "{{ huly_front_url }}" + SERVER_PROVIDER: "{{ huly_transactor_server_provider }}" + ACCOUNTS_URL: "{{ huly_accounts_url }}" + LAST_NAME_FIRST: "{{ huly_last_name_first }}" + ELASTIC_INDEX_NAME: "{{ huly_transactor_elastic_index_name }}" + UPLOAD_URL: "{{ huly_upload_url }}" + labels: + traefik.enable: "{{ huly_available_externally | string }}" + traefik.http.routers.huly-transactor.rule: "Host(`{{ huly_transactor_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.huly-transactor.tls.certresolver: "letsencrypt" + traefik.http.routers.huly-transactor.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.huly-transactor.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.huly-transactor.loadbalancer.server.port: "3333" + restart_policy: always + memory: "{{ huly_transactor_memory }}" + + - name: Create Huly Rekoni Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ huly_rekoni_container_name }}" + image: "{{ huly_rekoni_image_name }}:{{ huly_rekoni_image_version }}" + pull: true + networks: + - name: "{{ huly_network_name }}" + network_mode: "{{ huly_network_name }}" + ports: + - "{{ huly_rekoni_port }}:4004" + restart_policy: unless-stopped + memory: "{{ huly_rekoni_memory }}" + labels: + traefik.enable: "false" + when: huly_enabled is true + +- name: Stop Huly + block: + - name: Stop Huly Mongo + community.docker.docker_container: + name: "{{ huly_mongo_container_name }}" + state: absent + - name: Stop Huly Minio + community.docker.docker_container: + name: "{{ huly_minio_container_name }}" + state: absent + - name: Stop Huly Elastic + community.docker.docker_container: + name: "{{ huly_elastic_container_name }}" + state: absent + - name: Stop Huly Account + community.docker.docker_container: + name: "{{ huly_account_container_name }}" + state: absent + - name: Stop Huly Front + community.docker.docker_container: + name: "{{ huly_front_container_name }}" + state: absent + - name: Stop Huly Collaborator + community.docker.docker_container: + name: "{{ huly_collaborator_container_name }}" + state: absent + - name: Stop Huly Transactor + community.docker.docker_container: + name: "{{ huly_transactor_container_name }}" + state: absent + - name: Stop Huly Rekoni + community.docker.docker_container: + name: "{{ huly_rekoni_container_name }}" + state: absent + when: huly_enabled is false diff --git a/website/docs/applications/content-management/huly.md b/website/docs/applications/content-management/huly.md new file mode 100644 index 0000000000..05cfe75e8d --- /dev/null +++ b/website/docs/applications/content-management/huly.md @@ -0,0 +1,15 @@ +--- +title: "Huly Platform" +description: "Huly — All-in-One Project Management Platform (alternative to Linear, Jira, Slack, Notion, Motion)" +--- + + +Homepage: [https://github.com/hcengineering/platform](https://github.com/hcengineering/platform) + +Huly — All-in-One Project Management Platform (alternative to Linear, Jira, Slack, Notion, Motion) + +## Usage + +Set `huly_enabled: true` in your `inventories//group_vars/nas.yml` file. + +huly web interface can be found at [http://ansible_nas_host_or_ip:8139](http://ansible_nas_host_or_ip:8139).