Der Artikel war ungefähr 9 Monate lang eingeschlafen und wurde im Entwurf aufbewahrt, sodass die Informationen möglicherweise nicht mehr aktuell sind. .. .. Ich habe es so oft geschrieben, dass ich es als Gedenkgottesdienst veröffentlichen werde. ..
Es wurde beschlossen, das interne Kommunikationstool auf Mattermost zu verschieben. Ich wünschte, ich könnte meinen vorhandenen Bot nach Mattermost migrieren Ich habe auch Bot for Mattermost in Python [^ 1] für meine eigene Studie neu implementiert. Ich habe bei der Implementierung von Bot viel recherchiert, daher werde ich die Informationen für mich selbst zusammenfassen.
--CentOS 7.7 (wichtigster Server) --Ubunta 18.04 LTS (Bot-Server)
Irgendwie hatte ich das Gefühl, ich wollte sowohl CentOS als auch Ubuntu berühren. Ubuntu 18.04 wird standardmäßig mit Python 3 geliefert, daher habe ich versucht, es zu verwenden. Kurz gesagt, es hat nichts zu bedeuten.
Mattermost kann problemlos mit Docker installiert werden. Installieren Sie daher zuerst Docker.
CentOS
#Installieren Sie Docker
$ yum install -y yum-utils device-mapper-persistent-data lvm2
$ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
$ yum install docker-ce docker-ce-cli containerd.io
#Installationsbestätigung
$ docker --version
Docker version 19.03.5, build 633a0ea
$
#Starten Sie Docker
$ systemctl status docker
$ systemctl enable docker
$ systemctl start docker
$ systemctl status docker
#Funktionsprüfung
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:4df8ca8a7e309c256d60d7971ea14c27672fc0d10c5f303856d7bc48f8cc17ff
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
$
Sobald Docker installiert ist, können Sie Mattermost unten installieren und starten.
$ docker run --name mattermost-preview -d --publish 8065:8065 --add-host dockerhost:127.0.0.1 mattermost/mattermost-preview
Nach der Installation kann es wie folgt gestartet / gestoppt werden.
#Anlaufen
$ docker start mattermost-preview
#Halt
$ docker stop mattermost-preview
#Prozessbestätigung
$ docker ps
■ Referenz ・ Qiita: Installieren Sie Docker unter CentOS7
Sobald Mattermost gestartet werden kann, kann über den Browser darauf zugegriffen werden.
http://xxx.xxx.xxx.xxx:8065
Wenn Sie darauf zugreifen können, erstellen Sie ein Administratorkonto. Jede E-Mail-Adresse ist in Ordnung.
Bilden Sie ein geeignetes Team.
Ins Japanische übersetzen.
Main Menu -> Account Settings -> Display -> Language
Standardmäßig werden Verbindungsbeschränkungen auf private Netzwerke angewendet. Befindet sich der Kommunikationszielserver des Webhooks im selben Segment, muss die Kommunikationsberechtigung festgelegt werden. (Ich war hier ziemlich süchtig.)
Hauptmenü-> Systemkonsole-> Entwickler-> Nicht vertrauenswürdige interne Verbindungen zulassen
Standardmäßig können Sie kein Bot-Konto erstellen. Aktivieren Sie es daher.
Hauptmenü-> Systemkonsole-> Bot-Konto-> Bot-Konto-Erstellung aktivieren
Erstellen Sie einen ausgehenden Webhook.
Hauptmenü-> Integration-> Outward Webhooks
Inhaltstyp: application / json (diesmal habe ich JSON gewählt) Kanal: Kanal zur Überwachung des Triggers Auslösewort: Ein Wort, das die Aktivierung des Webhooks auslöst Rückruf-URL: URL des Nachrichtenziels (Bot-Server) (Da diesmal Flask verwendet wird, wird der Standardport 5000 angegeben.)
Erstellen Sie ein Bot-Konto.
Hauptmenü-> Integration-> Bot-Konto Hier werden Bot-Posting-Berechtigungen festgelegt.
Notieren Sie sich unbedingt das Bot-Konto-Token, da es später auf dem Menübildschirm nicht mehr überprüft werden kann. Selbst wenn Sie es vergessen, können Sie es mit dem folgenden Befehl überprüfen.
$ docker exec -t -e MYSQL_PWD=mostest mattermost-preview mysql -u mmuser mattermost_test -e "select * from UserAccessTokens;"
+----------------------------+----------------------------+----------------------------+-------------+----------+
| Id | Token | UserId | Description | IsActive |
+----------------------------+----------------------------+----------------------------+-------------+----------+
| xxxxxxxxxxxxxxxxxxxxxxxxxx | xxxxxxxxxxxxxxxxxxxxxxxxxx | xxxxxxxxxxxxxxxxxxxxxxxxxx | ????????? | 1 |
+----------------------------+----------------------------+----------------------------+-------------+----------+
$
Überprüfen Sie, ob Sie mit dem Befehl curl von Ihrem Bot-Konto aus posten können. Überprüfen Sie zunächst die Kanal-ID des Buchungsziels.
Kanal-> Informationen anzeigen
Sie können dies auch mit dem folgenden Befehl überprüfen.
$ docker exec -t -e MYSQL_PWD=mostest mattermost-preview mysql -u mmuser mattermost_test -e "select * from Channels;"
+----------------------------+---------------+---------------+----------+----------------------------+------+-------------+--------------------------------------------------------+--------+---------+---------------+---------------+---------------+-----------+----------+------------------+
| Id | CreateAt | UpdateAt | DeleteAt | TeamId | Type | DisplayName | Name | Header | Purpose | LastPostAt | TotalMsgCount | ExtraUpdateAt | CreatorId | SchemeId | GroupConstrained |
+----------------------------+---------------+---------------+----------+----------------------------+------+-------------+--------------------------------------------------------+--------+---------+---------------+---------------+---------------+-----------+----------+------------------+
| xxxxxxxxxxxxxxxxxxxxxxxxxx | 1574487544576 | 1574487544576 | 0 | xxxxxxxxxxxxxxxxxxxxxxxxxx | O | Off-Topic | off-topic | | | 1574487544652 | 0 | 0 | | NULL | NULL |
| xxxxxxxxxxxxxxxxxxxxxxxxxx | 1574489265292 | 1574489265292 | 0 | | D | | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | | | 1574489265315 | 1 | 0 | | NULL | NULL |
| xxxxxxxxxxxxxxxxxxxxxxxxxx | 1574487544570 | 1574487544570 | 0 | xxxxxxxxxxxxxxxxxxxxxxxxxx | O | Town Square | town-square | | | 1574487544611 | 0 | 0 | | NULL | NULL |
+----------------------------+---------------+---------------+----------+----------------------------+------+-------------+--------------------------------------------------------+--------+---------+---------------+---------------+---------------+-----------+----------+------------------+
$
Geben Sie die Kanal-ID und das Bot-Token an und senden Sie mit dem Befehl curl eine POST-Anforderung an die API.
$ curl -i -X POST -H 'Content-Type: application/json' -d '{"channel_id":"[Channel ID]", "message":"This is a message from a bot"}' -H 'Authorization: Bearer [Bot Token]' http://xxx.xxx.xxx.xxx:8065/api/v4/posts
Ich konnte bestätigen, dass ich mit meinem Bot-Konto posten konnte.
■ Referenz ・ Üblicher Software-Ingenieur: So erstellen Sie ein Bot-Konto mit Mattermost
Es schien einfach zu sein, es mit Flask zu machen, um es mit Python zu machen, also habe ich es mit Flask implementiert. POSTEN Sie JSON einfach an die API, wie Sie es mit Curl tun.
Ubuntu
$ sudo apt install python3-pip
$ pip3 -V
pip 9.0.1 from /usr/lib/python3/dist-packages (python 3.6)
$
$ pip3 install flask
$ pip3 install requests
bottest.py
import json
import requests
from flask import Flask, request
BOT_TOKEN = '[Bot Token]'
CHANNEL_ID = '[Channel ID]'
MM_API_ADDRESS = 'http://xxx.xxx.xxx.xxx:8065/api/v4/posts'
app = Flask(__name__)
@app.route('/bot-test', methods=['POST']) #Ausgehende Webhook-Rückruf-URL
def bot_reply():
posted_user = request.json['user_name']
posted_msg = request.json['text']
reply_headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + BOT_TOKEN,
}
reply_data = {
"channel_id": CHANNEL_ID,
"message": f"@{posted_user} Bot reply message.",
"props": {
"attachments": [
{
"author_name": posted_user,
"text": posted_msg,
}
]
},
}
reply_request = requests.post(
MM_API_ADDRESS,
headers = reply_headers,
data = json.dumps(reply_data)
)
return reply_request
if __name__ == '__main__':
app.debug = True
app.run(host='0.0.0.0')
Testen Sie, ob Sie eine Antwort erhalten können. Starten Sie den Testserver von Flask.
Ubuntu
$ python3 bottest.py
Veröffentlichen Sie eine Nachricht mit einem Auslösewort in Mattermost.
Ich konnte bestätigen, dass ich mit dem Webhook als Auslöser vom Bot-Konto aus posten konnte. Sie müssen lediglich die Bot-Logik implementieren.
Übrigens sieht der JSON, der von Mattermosts Webhook stammt, so aus.
{
'token': 'xxxxxxxxxxxxxxxxxxxxxxxxxx',
'team_id': 'xxxxxxxxxxxxxxxxxxxxxxxxxx',
'team_domain': 'bot-test',
'channel_id': 'xxxxxxxxxxxxxxxxxxxxxxxxxx',
'channel_name': 'town-square',
'timestamp': 1234567890123,
'user_id': 'xxxxxxxxxxxxxxxxxxxxxxxxxx',
'user_name': 'mmadmin',
'post_id': 'xxxxxxxxxxxxxxxxxxxxxxxxxx',
'text': '#bot test',
'trigger_word': '#bot',
'file_ids': ''
}
■ Referenz ・ [NOBWAK'S LAIR: Machen wir SLACK / MATTERMOST BOT mit FLASK of PYTHON](http://april.fool.jp/blogs/2016/06/02/slackmattermost%E3%81%AEbot%E3%82%92python % E3% 81% AEflask% E3% 81% A7% E4% BD% 9C% E3% 82% 8D% E3% 81% 86 /) ・ Qiita: Erstellen Sie einen einfachen Bot mit Mattermost und Python + Flask
Sobald der Bot fertig ist, benötigen Sie einen Webserver und einen WSGI-Server, um ihn als Webanwendung auszuführen. Nach vielen Recherchen habe ich mich für Nginx + Gunicorn entschieden. (Weil ich dachte, es sei das einfachste und einfachste) Dieser Bereich ist noch unklar, daher werde ich ihn schnell als Memo aufschreiben. ..
Gunicorn wird mit Pip installiert.
Ubuntu
$ sudo pip3 install gunicorn
gunicorn [Python-Skriptname]: Wird mit [Name der Flask-Instanz] gestartet. (Standardport ist 8000) (Im Folgenden wird eine App-Instanz in bottomest.py gestartet.)
#Führen Sie das Verzeichnis aus, in dem sich das Python-Skript befindet
$ cd /path/bot
$ sudo gunicorn bottest:app
[YYYY-MM-DD hh:mm:ss +0900] [1699] [INFO] Starting gunicorn 20.0.2
[YYYY-MM-DD hh:mm:ss +0900] [1699] [INFO] Listening at: http://127.0.0.1:8000 (1699)
[YYYY-MM-DD hh:mm:ss +0900] [1699] [INFO] Using worker: sync
[YYYY-MM-DD hh:mm:ss +0900] [1703] [INFO] Booting worker with pid: 1703
Wenn Sie denselben Port wie der Testserver von Flask verwenden möchten, gehen Sie wie folgt vor (Wenn es schwierig ist, die Webhook-Einstellungen auf der Mattermost-Seite zu ändern)
$ sudo gunicorn bottest:app -b 0.0.0.0:5000
Sie können die Option chdir verwenden, ohne zum Speicherort des Python-Skripts wechseln zu müssen.
$ sudo gunicorn --chdir /path/bot bottest:app -b 0.0.0.0:5000
Wenn Sie gestoppt sind, drücken Sie Strg + C, um den Vorgang abzubrechen.
Wenn Sie Gunicorn alleine ausführen möchten, ist dies in Ordnung, aber Sie können nicht mit Nginx arbeiten, wie es ist. Installieren Sie zuerst Nginx.
Ubuntu
$ sudo apt install nginx
$ nginx -v
nginx version: nginx/1.14.0 (Ubuntu)
$
Stellen Sie Nginx ein. Für die Kommunikation mit Gunicorn ist eine Steckdose erforderlich. (Erstellt in / tmp unten)
/etc/nginx/sites-available/default
upstream bot-test {
server unix:/tmp/bot-test.sock;
}
server {
listen 5000;
root path/bot;
server_name localhost;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location /bot-test {
try_files $uri @flask;
}
location @flask {
proxy_pass http://bot-test;
}
}
Bestätigung des Nginx-Betriebs.
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
$
$ sudo systemctl status nginx
$ sudo systemctl restart nginx
$ sudo systemctl status nginx
Wenn die Nginx-Einstellungen korrekt sind, erstellen Sie eine Gunicorn-Konfigurationsdatei. Der Speicherort und der Name der Einstellungsdatei können beliebig sein Beschreiben Sie den zuvor in der Nginx-Konfigurationsdatei beschriebenen Socket.
$ vim gunicorn_conf.py
gunicorn_conf.py
bind = 'unix:/tmp/bot-test.sock'
daemon = True
reload = True
Geben Sie die Einstellungsdatei mit der Option -c an und klicken Sie auf OK, wenn sie gestartet werden kann
$ sudo gunicorn bottest:app -c gunicorn_conf.py
Beenden Sie den Vorgang, wenn Sie gestoppt sind.
$ sudo pkill gunicorn
Um ehrlich zu sein, mache ich den zusätzlichen Teil mit dem Geist, den ich vorerst bewegen sollte Es muss einen besseren Weg geben. ..
■ Referenz ・ Qiita: Gunicorn + Flask + Nginx + Systemd ・ [Tagebuch von "Student mit der falschen Abteilung zur Eingabe": Verfahren zum manuellen Bereitstellen von Ubuntu + Nginx + Gunicorn](https: //nnsnodnb.hatenablog) .jp / entry / ubuntu-nginx-gunicorn-deploy) ・ Qiita: Memo, um Python zu einem Daemon zu machen
[^ 1]: Räder wieder montieren https://www.slideshare.net/RansuiIso/python-115121978 https://www.youtube.com/watch?v=kO4FNg648qE
Recommended Posts