parent
a8d417f91e
commit
0ec1868b95
@ -0,0 +1,69 @@
|
|||||||
|
# Setting up ChatGPT (optional)
|
||||||
|
|
||||||
|
The playbook can install and configure [matrix-chatgpt-bot](https://github.com/matrixgpt/matrix-chatgpt-bot) for you.
|
||||||
|
|
||||||
|
Talk to ChatGPT via your favourite Matrix client!
|
||||||
|
|
||||||
|
|
||||||
|
## 1. Register the bot account
|
||||||
|
|
||||||
|
The playbook does not automatically create users for you. The bot requires an access token to be able to connect to your homeserver.
|
||||||
|
|
||||||
|
You **need to register the bot user manually** before setting up the bot.
|
||||||
|
|
||||||
|
Choose a strong password for the bot. You can generate a good password with a command like this: `pwgen -s 64 1`.
|
||||||
|
|
||||||
|
You can use the playbook to [register a new user](registering-users.md):
|
||||||
|
|
||||||
|
```
|
||||||
|
ansible-playbook -i inventory/hosts setup.yml --extra-vars='username=bot.chatgpt password=PASSWORD_FOR_THE_BOT admin=no' --tags=register-user
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## 2. Get an access token
|
||||||
|
|
||||||
|
Refer to the documentation on [how to obtain an access token](obtaining-access-tokens.md).
|
||||||
|
|
||||||
|
|
||||||
|
## 3. Adjusting the playbook configuration
|
||||||
|
|
||||||
|
Add the following configuration to your `inventory/host_vars/matrix.DOMAIN/vars.yml` file (adapt to your needs):
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
matrix_bot_chatgpt_enabled: true
|
||||||
|
# See instructions on
|
||||||
|
# https://www.npmjs.com/package/chatgpt
|
||||||
|
matrix_bot_chatgpt_openai_email: ''
|
||||||
|
matrix_bot_chatgpt_openai_password: ''
|
||||||
|
matrix_bot_chatgpt_openai_login_type: google
|
||||||
|
# With the @ and :DOMAIN, ie @SOMETHING:DOMAIN
|
||||||
|
matrix_bot_chatgpt_matrix_bot_username: '@bot.chatgpt:{{ matrix_domain }}'
|
||||||
|
# Matrix access token (from bot user above)
|
||||||
|
# see: https://webapps.stackexchange.com/questions/131056/how-to-get-an-access-token-for-element-riot-matrix
|
||||||
|
matrix_bot_chatgpt_matrix_access_token: ''
|
||||||
|
matrix_bot_chatgpt_matrix_default_prefix: '!chatgpt '
|
||||||
|
matrix_bot_chatgpt_matrix_default_prefix_reply: false
|
||||||
|
matrix_bot_chatgpt_matrix_whitelist: ':{{ matrix_domain }}'
|
||||||
|
```
|
||||||
|
|
||||||
|
You will need to get tokens for ChatGPT.
|
||||||
|
|
||||||
|
|
||||||
|
## 4. Installing
|
||||||
|
|
||||||
|
After configuring the playbook, run the [installation](installing.md) command again:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
ansible-playbook -i inventory/hosts setup.yml --tags=setup-all,start
|
||||||
|
```
|
||||||
|
|
||||||
|
**Notes**:
|
||||||
|
|
||||||
|
- if you change the bot password (`matrix_bot_chatgpt_matrix_password` in your `vars.yml` file) subsequently, the bot user's credentials on the homeserver won't be updated automatically. If you'd like to change the bot user's password, use a tool like [synapse-admin](configuring-playbook-synapse-admin.md) to change it, and then update `matrix_bot_chatgpt_matrix_password` to let the bot know its new password
|
||||||
|
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
To use the bot, invite the `@bot.chatgpt:DOMAIN` to the room you specified in a config, after that start speaking to it, use the prefix if you configured one or mention the bot.
|
||||||
|
|
||||||
|
You can also refer to the upstream [documentation](https://github.com/matrixgpt/matrix-chatgpt-bot).
|
@ -0,0 +1,78 @@
|
|||||||
|
---
|
||||||
|
# chatgpt is a bot for chatting to openAI chatgpt matrix bot
|
||||||
|
# Project source code URL: https://github.com/matrixgpt/matrix-chatgpt-bot
|
||||||
|
|
||||||
|
matrix_bot_chatgpt_enabled: true
|
||||||
|
|
||||||
|
matrix_bot_chatgpt_container_image_self_build: false
|
||||||
|
matrix_bot_chatgpt_docker_repo: "https://github.com/matrixgpt/matrix-chatgpt-bot"
|
||||||
|
matrix_bot_chatgpt_docker_repo_version: "{{ 'latest' if matrix_bot_chatgpt_version == 'latest' else matrix_bot_chatgpt_version }}"
|
||||||
|
matrix_bot_chatgpt_docker_src_files_path: "{{ matrix_base_data_path }}/chatgpt/docker-src"
|
||||||
|
|
||||||
|
matrix_bot_chatgpt_version: 1.1.1
|
||||||
|
matrix_bot_chatgpt_docker_image: "{{ matrix_bot_chatgpt_docker_image_name_prefix }}matrixgpt/matrix-chatgpt-bot:{{ matrix_bot_chatgpt_version }}"
|
||||||
|
matrix_bot_chatgpt_docker_image_name_prefix: "{{ 'localhost/' if matrix_bot_chatgpt_container_image_self_build else 'ghcr.io/' }}"
|
||||||
|
matrix_bot_chatgpt_docker_image_force_pull: "{{ matrix_bot_chatgpt_docker_image.endswith(':latest') }}"
|
||||||
|
|
||||||
|
matrix_bot_chatgpt_base_path: "{{ matrix_base_data_path }}/chatgpt"
|
||||||
|
matrix_bot_chatgpt_config_path: "{{ matrix_bot_chatgpt_base_path }}/config"
|
||||||
|
matrix_bot_chatgpt_data_path: "{{ matrix_bot_chatgpt_base_path }}/data"
|
||||||
|
|
||||||
|
# A list of extra arguments to pass to the container
|
||||||
|
matrix_bot_chatgpt_container_extra_arguments: []
|
||||||
|
|
||||||
|
# List of systemd services that matrix-bot-chatgpt.service depends on
|
||||||
|
matrix_bot_chatgpt_systemd_required_services_list: ['docker.service']
|
||||||
|
|
||||||
|
# List of systemd services that matrix-bot-chatgpt.service wants
|
||||||
|
matrix_bot_chatgpt_systemd_wanted_services_list: []
|
||||||
|
|
||||||
|
# ChatGPT Settings
|
||||||
|
matrix_bot_chatgpt_openai_email: '' # OPENAI_EMAIL=
|
||||||
|
matrix_bot_chatgpt_openai_password: '' # OPENAI_PASSWORD=
|
||||||
|
matrix_bot_chatgpt_openai_login_type: 'google' # OPENAI_LOGIN_TYPE="google"
|
||||||
|
|
||||||
|
# Matrix Static Settings (required, see notes)
|
||||||
|
# Defaults to "https://matrix.org"
|
||||||
|
matrix_bot_chatgpt_matrix_homeserver_url: "{{ matrix_homeserver_container_url }}" # MATRIX_HOMESERVER_URL=
|
||||||
|
# With the @ and :DOMAIN, ie @SOMETHING:DOMAIN, needs to be set, created manually beforehand.
|
||||||
|
matrix_bot_chatgpt_matrix_bot_username: '@bot.chatgpt:{{ matrix_domain }}' # MATRIX_BOT_USERNAME=
|
||||||
|
# Set `MATRIX_BOT_PASSWORD` the bot will print an `MATRIX_ACCESS_TOKEN` to the terminal
|
||||||
|
# or https://webapps.stackexchange.com/questions/131056/how-to-get-an-access-token-for-element-riot-matrix
|
||||||
|
matrix_bot_chatgpt_matrix_access_token: '' # MATRIX_ACCESS_TOKEN=
|
||||||
|
# Once `MATRIX_BOT_ACCESS_TOKEN` is set this is no longer used.
|
||||||
|
matrix_bot_chatgpt_matrix_bot_password: '' # MATRIX_BOT_PASSWORD=
|
||||||
|
|
||||||
|
# Matrix Configurable Settings Defaults (optional)
|
||||||
|
matrix_bot_chatgpt_matrix_default_prefix: "!chatgpt " # MATRIX_DEFAULT_PREFIX= Leave prefix blank to reply to all messages, trailing space matters
|
||||||
|
matrix_bot_chatgpt_matrix_default_prefix_reply: false # MATRIX_DEFAULT_PREFIX_REPLY=
|
||||||
|
|
||||||
|
# Matrix Access Control (optional)
|
||||||
|
matrix_bot_chatgpt_matrix_blacklist: ''
|
||||||
|
matrix_bot_chatgpt_matrix_whitelist: ':{{ matrix_domain }}'
|
||||||
|
|
||||||
|
# Matrix Feature Flags (optional)
|
||||||
|
matrix_bot_chatgpt_matrix_autojoin: true # MATRIX_AUTOJOIN=true
|
||||||
|
matrix_bot_chatgpt_matrix_encryption: true # MATRIX_ENCRYPTION=true
|
||||||
|
matrix_bot_chatgpt_matrix_threads: true # MATRIX_THREADS=true
|
||||||
|
matrix_bot_chatgpt_matrix_rich_text: true # MATRIX_RICH_TEXT=true
|
||||||
|
|
||||||
|
|
||||||
|
# A list of admins
|
||||||
|
# Example set of rules:
|
||||||
|
# matrix_bot_chatgpt_admins:
|
||||||
|
# - @someone:example.com
|
||||||
|
# - @another:example.com
|
||||||
|
# - @bot.*:example.com
|
||||||
|
# - @*:another.com
|
||||||
|
# matrix_bot_chatgpt_admins: "{{ [matrix_admin] if matrix_admin else [] }}"
|
||||||
|
|
||||||
|
# Log level
|
||||||
|
# matrix_bot_chatgpt_loglevel: 'INFO'
|
||||||
|
|
||||||
|
# Additional environment variables to pass to the chatgpt container
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
# matrix_bot_chatgpt_environment_variables_extension: |
|
||||||
|
# chatgpt_TEXT_DONE=Done
|
||||||
|
matrix_bot_chatgpt_environment_variables_extension: ''
|
@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
|
||||||
|
- block:
|
||||||
|
- when: matrix_bot_chatgpt_enabled | bool
|
||||||
|
ansible.builtin.include_tasks: "{{ role_path }}/tasks/validate_config.yml"
|
||||||
|
|
||||||
|
- when: matrix_bot_chatgpt_enabled | bool
|
||||||
|
ansible.builtin.include_tasks: "{{ role_path }}/tasks/setup_install.yml"
|
||||||
|
tags:
|
||||||
|
- setup-all
|
||||||
|
- setup-bot-chatgpt
|
||||||
|
- install-all
|
||||||
|
- install-bot-chatgpt
|
||||||
|
|
||||||
|
- block:
|
||||||
|
- when: not matrix_bot_chatgpt_enabled | bool
|
||||||
|
ansible.builtin.include_tasks: "{{ role_path }}/tasks/setup_uninstall.yml"
|
||||||
|
tags:
|
||||||
|
- setup-all
|
||||||
|
- setup-bot-chatgpt
|
@ -0,0 +1,63 @@
|
|||||||
|
---
|
||||||
|
- name: Ensure chatgpt paths exist
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: "{{ item.path }}"
|
||||||
|
state: directory
|
||||||
|
mode: 0750
|
||||||
|
owner: "{{ matrix_user_username }}"
|
||||||
|
group: "{{ matrix_user_groupname }}"
|
||||||
|
with_items:
|
||||||
|
- {path: "{{ matrix_bot_chatgpt_config_path }}", when: true}
|
||||||
|
- {path: "{{ matrix_bot_chatgpt_data_path }}", when: true}
|
||||||
|
- {path: "{{ matrix_bot_chatgpt_docker_src_files_path }}", when: matrix_bot_chatgpt_container_image_self_build}
|
||||||
|
when: "item.when | bool"
|
||||||
|
|
||||||
|
- name: Ensure chatgpt environment variables file created
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: "{{ role_path }}/templates/env.j2"
|
||||||
|
dest: "{{ matrix_bot_chatgpt_config_path }}/env"
|
||||||
|
owner: "{{ matrix_user_username }}"
|
||||||
|
group: "{{ matrix_user_groupname }}"
|
||||||
|
mode: 0640
|
||||||
|
|
||||||
|
- name: Ensure chatgpt image is pulled
|
||||||
|
community.docker.docker_image:
|
||||||
|
name: "{{ matrix_bot_chatgpt_docker_image }}"
|
||||||
|
source: "{{ 'pull' if ansible_version.major > 2 or ansible_version.minor > 7 else omit }}"
|
||||||
|
force_source: "{{ matrix_bot_chatgpt_docker_image_force_pull if ansible_version.major > 2 or ansible_version.minor >= 8 else omit }}"
|
||||||
|
force: "{{ omit if ansible_version.major > 2 or ansible_version.minor >= 8 else matrix_bot_chatgpt_docker_image_force_pull }}"
|
||||||
|
when: "not matrix_bot_chatgpt_container_image_self_build | bool"
|
||||||
|
register: result
|
||||||
|
retries: "{{ devture_playbook_help_container_retries_count }}"
|
||||||
|
delay: "{{ devture_playbook_help_container_retries_delay }}"
|
||||||
|
until: result is not failed
|
||||||
|
|
||||||
|
- name: Ensure chatgpt repository is present on self-build
|
||||||
|
ansible.builtin.git:
|
||||||
|
repo: "{{ matrix_bot_chatgpt_docker_repo }}"
|
||||||
|
version: "{{ matrix_bot_chatgpt_docker_repo_version }}"
|
||||||
|
dest: "{{ matrix_bot_chatgpt_docker_src_files_path }}"
|
||||||
|
force: "yes"
|
||||||
|
become: true
|
||||||
|
become_user: "{{ matrix_user_username }}"
|
||||||
|
register: matrix_bot_chatgpt_git_pull_results
|
||||||
|
when: "matrix_bot_chatgpt_container_image_self_build | bool"
|
||||||
|
|
||||||
|
- name: Ensure chatgpt image is built
|
||||||
|
community.docker.docker_image:
|
||||||
|
name: "{{ matrix_bot_chatgpt_docker_image }}"
|
||||||
|
source: build
|
||||||
|
force_source: "{{ matrix_bot_chatgpt_git_pull_results.changed if ansible_version.major > 2 or ansible_version.minor >= 8 else omit }}"
|
||||||
|
force: "{{ omit if ansible_version.major > 2 or ansible_version.minor >= 8 else matrix_mailer_git_pull_results.changed }}"
|
||||||
|
build:
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
path: "{{ matrix_bot_chatgpt_docker_src_files_path }}"
|
||||||
|
pull: true
|
||||||
|
when: "matrix_bot_chatgpt_container_image_self_build | bool"
|
||||||
|
|
||||||
|
- name: Ensure matrix-bot-chatgpt.service installed
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: "{{ role_path }}/templates/systemd/matrix-bot-chatgpt.service.j2"
|
||||||
|
dest: "{{ devture_systemd_docker_base_systemd_path }}/matrix-bot-chatgpt.service"
|
||||||
|
mode: 0644
|
||||||
|
register: matrix_bot_chatgpt_systemd_service_result
|
@ -0,0 +1,25 @@
|
|||||||
|
---
|
||||||
|
|
||||||
|
- name: Check existence of matrix-chatgpt service
|
||||||
|
ansible.builtin.stat:
|
||||||
|
path: "{{ devture_systemd_docker_base_systemd_path }}/matrix-bot-chatgpt.service"
|
||||||
|
register: matrix_bot_chatgpt_service_stat
|
||||||
|
|
||||||
|
- when: matrix_bot_chatgpt_service_stat.stat.exists | bool
|
||||||
|
block:
|
||||||
|
- name: Ensure matrix-chatgpt is stopped
|
||||||
|
ansible.builtin.service:
|
||||||
|
name: matrix-bot-chatgpt
|
||||||
|
state: stopped
|
||||||
|
enabled: false
|
||||||
|
daemon_reload: true
|
||||||
|
|
||||||
|
- name: Ensure matrix-bot-chatgpt.service doesn't exist
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: "{{ devture_systemd_docker_base_systemd_path }}/matrix-bot-chatgpt.service"
|
||||||
|
state: absent
|
||||||
|
|
||||||
|
- name: Ensure Matrix chatgpt paths don't exist
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: "{{ matrix_bot_chatgpt_base_path }}"
|
||||||
|
state: absent
|
@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
|
||||||
|
- name: Fail if required Chatgpt settings not defined
|
||||||
|
ansible.builtin.fail:
|
||||||
|
msg: >-
|
||||||
|
You need to define a required configuration setting (`{{ item.name }}`).
|
||||||
|
when: "item.when | bool and vars[item.name] == ''"
|
||||||
|
with_items:
|
||||||
|
- {'name': 'matrix_bot_chatgpt_openai_email', when: true}
|
||||||
|
- {'name': 'matrix_bot_chatgpt_openai_password', when: true}
|
||||||
|
- {'name': 'matrix_bot_chatgpt_openai_login_type', when: true}
|
||||||
|
- {'name': 'matrix_bot_chatgpt_matrix_bot_username', when: true}
|
@ -0,0 +1,25 @@
|
|||||||
|
MATRIX_HOMESERVER_URL={{ matrix_bot_chatgpt_matrix_homeserver_url }}
|
||||||
|
MATRIX_ACCESS_TOKEN={{ matrix_bot_chatgpt_matrix_access_token }}
|
||||||
|
|
||||||
|
OPENAI_EMAIL={{ matrix_bot_chatgpt_openai_email }}
|
||||||
|
OPENAI_PASSWORD={{ matrix_bot_chatgpt_openai_password }}
|
||||||
|
OPENAI_LOGIN_TYPE={{ matrix_bot_chatgpt_openai_login_type }}
|
||||||
|
|
||||||
|
# With the @ and :DOMAIN, ie @SOMETHING:DOMAIN
|
||||||
|
MATRIX_BOT_USERNAME={{ matrix_bot_chatgpt_matrix_bot_username }}
|
||||||
|
MATRIX_BOT_PASSWORD={{ matrix_bot_chatgpt_matrix_bot_password }}
|
||||||
|
|
||||||
|
MATRIX_DEFAULT_PREFIX={{ matrix_bot_chatgpt_matrix_default_prefix }}
|
||||||
|
MATRIX_DEFAULT_PREFIX_REPLY={{ matrix_bot_chatgpt_matrix_default_prefix_reply|lower }}
|
||||||
|
|
||||||
|
MATRIX_BLACKLIST={{ matrix_bot_chatgpt_matrix_blacklist }}
|
||||||
|
MATRIX_WHITELIST={{ matrix_bot_chatgpt_matrix_whitelist }}
|
||||||
|
|
||||||
|
MATRIX_AUTOJOIN={{ matrix_bot_chatgpt_matrix_autojoin|lower }}
|
||||||
|
MATRIX_ENCRYPTION={{ matrix_bot_chatgpt_matrix_encryption|lower }}
|
||||||
|
MATRIX_THREADS={{ matrix_bot_chatgpt_matrix_threads|lower }}
|
||||||
|
MATRIX_RICH_TEXT={{ matrix_bot_chatgpt_matrix_rich_text|lower }}
|
||||||
|
|
||||||
|
DATA_PATH=/data/
|
||||||
|
|
||||||
|
{{ matrix_bot_chatgpt_environment_variables_extension }}
|
@ -0,0 +1,40 @@
|
|||||||
|
#jinja2: lstrip_blocks: "True"
|
||||||
|
[Unit]
|
||||||
|
Description=Matrix chatgpt bot
|
||||||
|
{% for service in matrix_bot_chatgpt_systemd_required_services_list %}
|
||||||
|
Requires={{ service }}
|
||||||
|
After={{ service }}
|
||||||
|
{% endfor %}
|
||||||
|
{% for service in matrix_bot_chatgpt_systemd_wanted_services_list %}
|
||||||
|
Wants={{ service }}
|
||||||
|
{% endfor %}
|
||||||
|
DefaultDependencies=no
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
Environment="HOME={{ devture_systemd_docker_base_systemd_unit_home_path }}"
|
||||||
|
ExecStartPre=-{{ devture_systemd_docker_base_host_command_sh }} -c '{{ devture_systemd_docker_base_host_command_docker }} kill matrix-bot-chatgpt 2>/dev/null || true'
|
||||||
|
ExecStartPre=-{{ devture_systemd_docker_base_host_command_sh }} -c '{{ devture_systemd_docker_base_host_command_docker }} rm matrix-bot-chatgpt 2>/dev/null || true'
|
||||||
|
|
||||||
|
ExecStart={{ devture_systemd_docker_base_host_command_docker }} run --rm --name matrix-bot-chatgpt \
|
||||||
|
--log-driver=none \
|
||||||
|
--user={{ matrix_user_uid }}:{{ matrix_user_gid }} \
|
||||||
|
--cap-drop=ALL \
|
||||||
|
--read-only \
|
||||||
|
--tmpfs /tmp \
|
||||||
|
--network={{ matrix_docker_network }} \
|
||||||
|
--env-file={{ matrix_bot_chatgpt_config_path }}/env \
|
||||||
|
--mount type=bind,src={{ matrix_bot_chatgpt_data_path }},dst=/data \
|
||||||
|
{% for arg in matrix_bot_chatgpt_container_extra_arguments %}
|
||||||
|
{{ arg }} \
|
||||||
|
{% endfor %}
|
||||||
|
{{ matrix_bot_chatgpt_docker_image }}
|
||||||
|
|
||||||
|
ExecStop=-{{ devture_systemd_docker_base_host_command_sh }} -c '{{ devture_systemd_docker_base_host_command_docker }} kill matrix-bot-chatgpt 2>/dev/null || true'
|
||||||
|
ExecStop=-{{ devture_systemd_docker_base_host_command_sh }} -c '{{ devture_systemd_docker_base_host_command_docker }} rm matrix-bot-chatgpt 2>/dev/null || true'
|
||||||
|
Restart=always
|
||||||
|
RestartSec=30
|
||||||
|
SyslogIdentifier=matrix-bot-chatgpt
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
Loading…
Reference in new issue