Zammad: Unterschied zwischen den Versionen

Aus Hostsharing Wiki
Zur Navigation springen Zur Suche springen
KKeine Bearbeitungszusammenfassung
 
(15 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
 
== Anforderungen ==
Zammad ist ein relativ umfangreiches, mächtiges und modernes OSS Helpdesk Tool. Für die Instalation wird benötigt:  
Zammad ist ein relativ umfangreiches, mächtiges und modernes OSS Helpdesk Tool. Für die Installation wird benötigt:  


* eine (Sub)Domain  
* eine (Sub)Domain  
Zeile 6: Zeile 6:
* ruby
* ruby
* nodejs
* nodejs
 
* mehrere Daemons für Hintergrunddienste (worker, websocket)
* evtl. noch ElasticSearch für Volltextsuche


== Installation ==
== Installation ==


Die Installation orientiert sich an dieser Anleitung und wurde für zammad 5.3 verfasst.  
Die Installation orientiert sich an dieser Anleitung und wurde für zammad 6.3 verfasst.  
Einige HS spezifische Abweichungen gibt es jedoch.
Einige HS spezifische Abweichungen gibt es jedoch.


Zeile 21: Zeile 22:
Prüfe die Version von ruby die zammad benötigt [https://docs.zammad.org/en/latest/prerequisites/software.html#ruby-programming-language hier].
Prüfe die Version von ruby die zammad benötigt [https://docs.zammad.org/en/latest/prerequisites/software.html#ruby-programming-language hier].


Für diese Anleitung nehmen wir Version 3.0.5 an für zammad 5.2+.
Für diese Anleitung nehmen wir Version 3.2.3 an für zammad 6.3.


Die Installationsanleitung für rubyenv und ruby findet sich unter [[RubyRBEnv]].
Die Installationsanleitung für rubyenv und ruby findet sich unter [[RubyRBEnv]].


Verifiziere das die Installation geklappt hat mit
Verifiziere das die Installation geklappt hat mit
  ruby -v  
<syntaxhighlight lang=shell>
ruby -v  
</syntaxhighlight>
dies sollte der herausgesuchten Versionsnummer entsprechen
dies sollte der herausgesuchten Versionsnummer entsprechen


Zeile 32: Zeile 35:
Prüfe die Version von nodejs die zammad benötigt [https://docs.zammad.org/en/latest/prerequisites/software.html#node-js  hier].
Prüfe die Version von nodejs die zammad benötigt [https://docs.zammad.org/en/latest/prerequisites/software.html#node-js  hier].


Für diese Anleitung nehmen wir Version 16.0+ an für zammad 5.2+.
Für diese Anleitung nehmen wir Version 20 an für zammad 6.3.


Verifiziere das die Installation geklappt hat mit
Verifiziere das die Installation geklappt hat mit
  node -v  
<syntaxhighlight lang=shell>
node -v  
</syntaxhighlight>
dies sollte der herausgesuchten Versionsnummer entsprechen
dies sollte der herausgesuchten Versionsnummer entsprechen
=== Installation Redis ===
Siehe [[Redis]]


=== Umgebungsvariablen ===  
=== Umgebungsvariablen ===  
Zeile 43: Zeile 52:


Die Datei `.bash_profile`:
Die Datei `.bash_profile`:
  . ~/.profile
. ~/.profile
  . ~/.bashrc
. ~/.bashrc
Die Datei `.profile` (vgl instalation ruby und nodejs):
Die Datei `.profile` (vgl instalation ruby und nodejs):
  #ruby
 
  export PATH="$HOME/.rbenv/bin:$PATH"
<syntaxhighlight lang=shell line>
  eval "$(rbenv init -)"
#ruby
  #nodejs
export PATH="$HOME/.rbenv/bin:$PATH"
  export NVM_DIR="$HOME/.nvm"
eval "$(rbenv init -)"
  [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
#nodejs
  [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion
</syntaxhighlight>
und die Datei `.bashrc`. Quellen vgl. [https://github.com/zammad/zammad/tree/develop/script/systemd/zammad.env] und  [https://docs.zammad.org/en/latest/appendix/configure-env-vars.html#performance-tuning]
und die Datei `.bashrc`. Quellen vgl. [https://github.com/zammad/zammad/tree/develop/script/systemd/zammad.env] und  [https://docs.zammad.org/en/latest/appendix/configure-env-vars.html#performance-tuning]
  # zammad env config
 
  WEB_CONCURRENCY=4
<syntaxhighlight lang=shell>
  # service config
export REDIS_URL=redis://:<your-password-goes-here>@127.0.0.1:<port>
  BUNDLE_BINARY=bundle
export RAILS_ENV=production
  RAILS_ENV=production
</syntaxhighlight>
  ZAMMAD_BIND_IP=127.0.0.1
  ZAMMAD_RAILS_PORT=3000
  ZAMMAD_WEBSOCKET_PORT=6042


Dann entweder alles neu einlesen oder einmal aus und wieder  einloggen. Wenn alles geklappt hat, sollten die folgenden Befehle alle sinnvolle Ausgaben liefern
Dann entweder alles neu einlesen oder einmal aus und wieder  einloggen. Wenn alles geklappt hat, sollten die folgenden Befehle alle sinnvolle Ausgaben liefern
  echo $RAILS_ENV # Ausgabe: production
 
  ruby -v # Ausgabe vgl. oben
<syntaxhighlight lang=shell>
  nodejs -v #  Ausgabe vgl. oben
echo $RAILS_ENV # Ausgabe: production
ruby -v # Ausgabe vgl. oben
nodejs -v #  Ausgabe vgl. oben
</syntaxhighlight>


=== Installation  von Zammad ===
=== Installation  von Zammad ===
Zuerst laden wir zammad herunter, entpacken es, und installieren die dependencies (nur production)
Zuerst laden wir zammad herunter, entpacken es, und installieren die dependencies (nur production)
 
 
  wget -O - https://ftp.zammad.com/zammad-latest.tar.gz |tar -xvvz
<syntaxhighlight lang=shell>
  cd zammad
mkdir zammad
  bundle config set --local without 'test development mysql'
cd zammad
  bundle install
wget -O - https://ftp.zammad.com/zammad-latest.tar.gz |tar -xvvz
 
bundle config set --local without 'test development mysql'
bundle install
</syntaxhighlight>
 
Dann tragen wir die zugangsdaten der postgres Datenbank ein (auf HS Admin selbst erstellen) hier: beides `xyz00_zammad`
Dann tragen wir die zugangsdaten der postgres Datenbank ein (auf HS Admin selbst erstellen) hier: beides `xyz00_zammad`
Mit folgendem Inhalt (Einrückung beachten!):  
Mit folgendem Inhalt (Einrückung beachten!):  
  nano config/database.yml
 
 
<syntaxhighlight lang=yaml line>
  # config/database.yml
# nano config/database.yml
  production:
 
    adapter: postgresql
# config/database.yml
    host: localhost
production:
    database: xyz00_zammad
  adapter: postgresql
    pool: 50
  host: localhost
    timeout: 5000
  database: xyz00_zammad
    encoding: utf8
  pool: 50
    username: xyz00_zammad
  timeout: 5000
    password: changeme
  encoding: utf8
  username: xyz00_zammad
  password: changeme
</syntaxhighlight>


Wenn alles stimmt sollten sich die folgenden Befehle ohne Fehler ausführen lassen und die Datenbanktabellen  sowie die statischen Dateien zum ausliefern  anlegen
Wenn alles stimmt sollten sich die folgenden Befehle ohne Fehler ausführen lassen und die Datenbanktabellen  sowie die statischen Dateien zum ausliefern  anlegen
 
 
  rake db:migrate
<syntaxhighlight lang=shell>
  rake assets:precompile
rake db:migrate
rake assets:precompile
</syntaxhighlight>


=== Zammad ausliefern ===  
=== Zammad ausliefern ===  
Zeile 103: Zeile 123:
* Optional kann das Domain Template noch um die subdomains bereinigt werden (2. Befehl)
* Optional kann das Domain Template noch um die subdomains bereinigt werden (2. Befehl)


  cd ~/doms/zammad.example.org/
<syntaxhighlight lang=shell>
  rm -r subs*
cd ~/doms/zammad.example.org/
  rm -r htdocs-ssl
rm -r subs*
  rm -r app-ssl
rm -r htdocs-ssl
  ln -s ~/zammad app-ssl
rm -r app-ssl
  ln -s ~/zammad/public htdocs-ssl
ln -s ~/zammad app-ssl
  nano .htaccess
ln -s ~/zammad/public htdocs-ssl
nano .htaccess
</syntaxhighlight>
 
In HS-Admin muss unter der Domain dann folgende Eigenschaft bei Passenger gesetzt werden:
 
<syntaxhighlight lang=apache>
PassengerRuby /home/pacs/xyz00/users/zammad/.rbenv/shims/ruby
</syntaxhighlight>
 
<syntaxhighlight lang=apache>
# Inhalt .htaccess
DirectoryIndex disabled
RewriteEngine On
RewriteBase /
 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{HTTP:Connection} Upgrade [NC]
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteRule .* ws://127.0.0.1:6042/%{REQUEST_URI}  [P,L]


  # Inhalt .htaccess
RewriteCond %{REQUEST_FILENAME} !-f
  #PassengerFriendlyErrorPages on # falls nötig zum debuggen einkommentieren
RewriteCond %{REQUEST_FILENAME} !-l
  RackEnv production
RequestHeader set X-Forwarded-Proto "https"
  RailsEnv production
RewriteRule .* http://127.0.0.1:6041/%{REQUEST_URI} [proxy,last]
  PassengerRuby /home/pacs/xyz00/users/zammad/.rbenv/shims/ruby
</syntaxhighlight>
  # local websocket ssl forwarding
  RewriteCond %{HTTP:Connection} Upgrade [NC]
  RewriteCond %{HTTP:Upgrade} websocket [NC]
  RewriteRule /(.*) ws://127.0.0.1:6042/$1  [P,L]


Wenn alles geklappt hat sollte auf der Domain das restliche Web-basierte Setup zu sehen sein. Dort muss dann auch der andere HS Postfach User eingetragen werden. Theoretisch könnte man das auf dem gleichen Account abwickeln, ich persönlich würde es allerdings trennen. Piping wie bei manch andren Mailbasierten Anwendungen scheint nicht so einfach  möglich zu sein (needs more investigation)
Wenn alles geklappt hat sollte auf der Domain das restliche Web-basierte Setup zu sehen sein. Dort muss dann auch der andere HS Postfach User eingetragen werden. Theoretisch könnte man das auf dem gleichen Account abwickeln, ich persönlich würde es allerdings trennen. Piping wie bei manch andren Mailbasierten Anwendungen scheint nicht so einfach  möglich zu sein (needs more investigation)
Zeile 126: Zeile 161:


Damit der Websocket-Server und der Hintergrund Worker ordentlich laufen müssen folgende Befehle ausgeführt werden. Die IP Adresse und der Port beim Socket werden aus den Enviroment Variablen von oben bezogen, können allerdings auch manuell  gesetzt werden.
Damit der Websocket-Server und der Hintergrund Worker ordentlich laufen müssen folgende Befehle ausgeführt werden. Die IP Adresse und der Port beim Socket werden aus den Enviroment Variablen von oben bezogen, können allerdings auch manuell  gesetzt werden.
  cd zammad
 
  bundle exec script/background-worker.rb start
<syntaxhighlight lang=shell>
  bundle exec script/websocket-server.rb -b ${ZAMMAD_BIND_IP} -p ${ZAMMAD_WEBSOCKET_PORT} start
cd zammad
bundle exec script/background-worker.rb start
bundle exec script/websocket-server.rb -b ${ZAMMAD_BIND_IP} -p ${ZAMMAD_WEBSOCKET_PORT} start
</syntaxhighlight>


== Empfohlen: Monit  ==
== Empfohlen: Monit  ==
Ich habe alles monit spezifische in den ordner monit gepackt
Ich habe alles monit spezifische in den ordner monit gepackt
  cd   
 
  mkdir monit
<syntaxhighlight lang=shell>
  cd monit
cd   
mkdir monit
cd monit
</syntaxhighlight>
 
Zum starten habe ich ein kleines start und stop script (für monit) erstellt (lange zeile ggf. beachten)
Zum starten habe ich ein kleines start und stop script (für monit) erstellt (lange zeile ggf. beachten)


  nano start-worker.sh
<syntaxhighlight lang=shell line>
# nano start-worker.sh


  #!/bin/bash
#!/bin/bash
  . ~/.bash_profile
. ~/.bash_profile
  cd ~/zammad
cd ~/zammad
  exec  ${BUNDLE_BINARY} exec script/background-worker.rb start > ~/monit/worker.log 2>&1 &
exec  ${BUNDLE_BINARY} exec script/background-worker.rb start > ~/monit/worker.log 2>&1 &
  echo $! > ~/monit/worker.pid
echo $! > ~/monit/worker.pid
</syntaxhighlight>


  nano start-websocket.sh
<syntaxhighlight lang=shell line>
# nano start-websocket.sh


  #!/bin/bash
#!/bin/bash
  . ~/.bash_profile
. ~/.bash_profile
  cd ~/zammad
cd ~/zammad
  # warnung, der  socket  produziert relativ viel log output im normalen Betrieb ggf. anpassen
# warnung, der  socket  produziert relativ viel log output im normalen Betrieb ggf. anpassen
  exec ${BUNDLE_BINARY} exec script/websocket-server.rb -b ${ZAMMAD_BIND_IP} -p ${ZAMMAD_WEBSOCKET_PORT}  start > ~/monit/socket.log 2>&1 &  
exec ${BUNDLE_BINARY} exec script/websocket-server.rb -b ${ZAMMAD_BIND_IP} -p ${ZAMMAD_WEBSOCKET_PORT}  start > ~/monit/socket.log 2>&1 &  
  echo $! > ~/monit/socket.pid
echo $! > ~/monit/socket.pid
</syntaxhighlight>


  nano stop-worker.sh
<syntaxhighlight lang=shell line>
# nano stop-worker.sh


  kill $( cat ~/monit/worker.pid )
kill $( cat ~/monit/worker.pid )
</syntaxhighlight>


  nano stop-websocket.sh
<syntaxhighlight lang=shell line>
# nano stop-websocket.sh


  kill $( cat ~/monit/socket.pid )
kill $( cat ~/monit/socket.pid )
</syntaxhighlight>


Das dann alles noch in der `~/.monitrc` zusammenführen (achtung einige xyz00, zammad (user) und Mail Platzhalter):
Das dann alles noch in der `~/.monitrc` zusammenführen (achtung einige xyz00, zammad (user) und Mail Platzhalter):


  nano ~/.monitrc
<syntaxhighlight lang=shell line>
# nano ~/.monitrc


  set daemon 60 with start delay 10
set daemon 60 with start delay 10
  set logfile /home/pacs/xyz00/users/zammad/monit/monit.log
set logfile /home/pacs/xyz00/users/zammad/monit/monit.log
  set idfile /home/pacs/xyz00/users/zammad/monit/monit.id
set idfile /home/pacs/xyz00/users/zammad/monit/monit.id
  set statefile /home/pacs/xyz00/users/zammad/monit/monit.state
set statefile /home/pacs/xyz00/users/zammad/monit/monit.state
  set mailserver localhost
set mailserver localhost
  set mail-format { from: monit@your-domain.com }
set mail-format { from: monit@your-domain.com }
  #set httpd port 39008 address localhost
#set httpd port 39008 address localhost
  #    allow zammadadmin:ein-monit-passwort
#    allow zammadadmin:ein-monit-passwort
  check process zammad_worker with pidfile /home/pacs/xyz00/users/zammad/monit/worker.pid
check process zammad_worker with pidfile /home/pacs/xyz00/users/zammad/monit/worker.pid
    start program "/home/pacs/xyz00/users/zammad/monit/start-worker.sh"
  start program "/home/pacs/xyz00/users/zammad/monit/start-worker.sh"
    stop program "/home/pacs/xyz00/users/zammad/monit/stop-worker.sh"
  stop program "/home/pacs/xyz00/users/zammad/monit/stop-worker.sh"
  check process zammad_socket with pidfile /home/pacs/opa00/users/zammad/monit/socket.pid
check process zammad_socket with pidfile /home/pacs/opa00/users/zammad/monit/socket.pid
    start program "/home/pacs/xyz00/users/zammad/monit/start-websocket.sh"
  start program "/home/pacs/xyz00/users/zammad/monit/start-websocket.sh"
    stop program "/home/pacs/xyz00/users/zammad/monit/stop-websocket.sh"
  stop program "/home/pacs/xyz00/users/zammad/monit/stop-websocket.sh"
</syntaxhighlight>


Noch schnell die rechte der 4 scripts anpassen:  
Noch schnell die rechte der 4 scripts anpassen:  
Zeile 189: Zeile 241:


Sobald monit einmal erfolgreich anlief sollte der monit Ordner so aussehen:
Sobald monit einmal erfolgreich anlief sollte der monit Ordner so aussehen:
  ls -lh


  -rw-r--r-- 1 xyz00-zammad xyz00    32 Feb 23 11:59 monit.id
<syntaxhighlight lang=shell line>
  -rw-r--r-- 1 xyz00-zammad xyz00  2867 Feb 24 23:46 monit.log
#  ls -lh
  -rw------- 1 xyz00-zammad xyz00  800 Feb 24 13:20 monit.state
 
  -rw-r--r-- 1 xyz00-zammad xyz00 41048 Feb 25 00:49 socket.log
-rw-r--r-- 1 xyz00-zammad xyz00    32 Feb 23 11:59 monit.id
  -rw-r--r-- 1 xyz00-zammad xyz00    5 Feb 24 23:45 socket.pid
-rw-r--r-- 1 xyz00-zammad xyz00  2867 Feb 24 23:46 monit.log
  -rwxr--r-- 1 xyz00-zammad xyz00  209 Feb 24 23:45 start-websocket.sh
-rw------- 1 xyz00-zammad xyz00  800 Feb 24 13:20 monit.state
  -rwxr--r-- 1 xyz00-zammad xyz00  161 Feb 24 23:27 start-worker.sh
-rw-r--r-- 1 xyz00-zammad xyz00 41048 Feb 25 00:49 socket.log
  -rwxr--r-- 1 xyz00-zammad xyz00    34 Feb 24 23:30 stop-websocket.sh
-rw-r--r-- 1 xyz00-zammad xyz00    5 Feb 24 23:45 socket.pid
  -rwxr--r-- 1 xyz00-zammad xyz00    34 Feb 23 11:53 stop-worker.sh
-rwxr--r-- 1 xyz00-zammad xyz00  209 Feb 24 23:45 start-websocket.sh
  -rw-r--r-- 1 xyz00-zammad xyz00    0 Feb 24 23:38 worker.log
-rwxr--r-- 1 xyz00-zammad xyz00  161 Feb 24 23:27 start-worker.sh
  -rw-r--r-- 1 xyz00-zammad xyz00    5 Feb 24 23:38 worker.pid
-rwxr--r-- 1 xyz00-zammad xyz00    34 Feb 24 23:30 stop-websocket.sh
-rwxr--r-- 1 xyz00-zammad xyz00    34 Feb 23 11:53 stop-worker.sh
-rw-r--r-- 1 xyz00-zammad xyz00    0 Feb 24 23:38 worker.log
-rw-r--r-- 1 xyz00-zammad xyz00    5 Feb 24 23:38 worker.pid
</syntaxhighlight>


== Optional: Mail-Piping ==
== Optional: Mail-Piping ==
Zeile 211: Zeile 266:
Der folgende Code schnippsel legt einen Mail-Kanal an, ohne einen dedizierten Eingang der regelmäßig abgerufen werden müsste. Quelle [https://admin-docs.zammad.org/en/latest/channels/email/advanced/sendmail.html]
Der folgende Code schnippsel legt einen Mail-Kanal an, ohne einen dedizierten Eingang der regelmäßig abgerufen werden müsste. Quelle [https://admin-docs.zammad.org/en/latest/channels/email/advanced/sendmail.html]


<syntaxhighlight lang=ruby>
   rails r "Channel.create(area: 'Email::Account', options: { inbound: { adapter: 'null', options: {} }, outbound: { adapter: 'sendmail' } }, active: true, preferences: { editable: false }, updated_by_id: 1, created_by_id: 1)"
   rails r "Channel.create(area: 'Email::Account', options: { inbound: { adapter: 'null', options: {} }, outbound: { adapter: 'sendmail' } }, active: true, preferences: { editable: false }, updated_by_id: 1, created_by_id: 1)"
</syntaxhighlight>


=== Maileingang per  procmail  ===   
=== Maileingang per  procmail  ===   
Zeile 218: Zeile 275:




== Optional: Elasticsearch anbindung ==
== Optional: Elasticsearch Anbindung ==


Weiteren User nach [[Elasticsearch]] anlegen. Dieser muss dann mit zammad verknüpft werden. Hier wird der  Port 39200 angenommen.  
Weiteren User nach [[Elasticsearch]] anlegen. Dieser muss dann mit zammad verknüpft werden. Hier wird der  Port 39200 angenommen.  


  cd ~/zammad
<syntaxhighlight lang=shell>
  rails r "Setting.set('es_url', 'http://localhost:39200')"
cd ~/zammad
  rails r "Setting.set('es_user', 'elasticsearch')"
rails r "Setting.set('es_url', 'http://localhost:39200')"
  rails r "Setting.set('es_password', 'changeme')"
rails r "Setting.set('es_user', 'elasticsearch')"
rails r "Setting.set('es_password', 'changeme')"
</syntaxhighlight>


Um Elasticsearch wieder zu deaktivieren einfach die URL durch einen leeren string ersetzen.
Um Elasticsearch wieder zu deaktivieren einfach die URL durch einen leeren string ersetzen.
Zeile 233: Zeile 292:
Zum ersten Einrichten, oder auch zum Testen der Verbindung:
Zum ersten Einrichten, oder auch zum Testen der Verbindung:


cd zammad
<syntaxhighlight lang=shell>
rake searchindex:rebuild --trace
cd ~/zammad
rake searchindex:rebuild --trace
</syntaxhighlight>
 
Problem:
  create indexes...rake aborted!
  Can't find config setting 'es_multi_index'
 
Lösung:
<syntaxhighlight lang=shell>
psql -U xyz00_zammad
  INSERT INTO settings \
    (title, name, description, area, frontend, created_at, updated_at) \
    VALUES ('ElasticSearch Multi Index', 'es_multi_index', \
    '','SearchIndex::ElasticSearch', \
    false, '2023-03-15 01:00:00', '2023-03-15 01:00:00');
cd ~/zammad
rails r "Setting.set('es_multi_index', false)"
rake searchindex:rebuild --trace
</syntaxhighlight>


== Zammad Upgrade ==
== Zammad Upgrade ==
Zeile 240: Zeile 318:
{{Baustelle}}
{{Baustelle}}


<pre>
<syntaxhighlight lang=shell>
killall -u $USER
killall -u $USER
killall -u $USER 9
killall -u $USER 9
Zeile 252: Zeile 330:
bundle config set --local without 'test development mysql'
bundle config set --local without 'test development mysql'
bundle install
bundle install
</syntaxhighlight>


Geht nicht, Ruby 2.2.5 fehlt!
Geht nicht, Ruby 2.2.5 fehlt!


<syntaxhighlight lang=shell>
cd
cd
rbenv install 2.5.5
rbenv install 2.5.5
</syntaxhighlight>


Geht nicht, Rbenv ist zu alt!
Geht nicht, Rbenv ist zu alt!


<syntaxhighlight lang=shell>
cd ~/.rbenv/plugins/ruby-build
cd ~/.rbenv/plugins/ruby-build
git pull
git pull
Zeile 273: Zeile 355:
bundle install
bundle install


Geht nicht, Bundler 1.17.x wird gebraucht.
# Geht nicht, Bundler 1.17.x wird gebraucht.


gem install bundler==1.17.3
gem install bundler==1.17.3


Geht auch nicht.
# Geht auch nicht.
Dann hacken wir das mal versuchsweise ins Lock.
# Dann hacken wir das mal versuchsweise ins Lock.


vim Gemfile.lock
# vim Gemfile.lock


bundle config set --local without 'test development mysql'
bundle config set --local without 'test development mysql'
bundle install
bundle install


Es fehlen Libs.
# Es fehlen Libs.
HS bitte installieren...
# HS bitte installieren...
[...]
# [...]
Danke!
# Danke!


bundle config set --local without 'test development mysql'
bundle config set --local without 'test development mysql'
Zeile 299: Zeile 381:


/usr/bin/supervisord -c $HOME/supervisor/etc/supervisord.conf
/usr/bin/supervisord -c $HOME/supervisor/etc/supervisord.conf
</pre>
</syntaxhighlight>


Nach Problemen mit Assets muss man den Dienst nochmal neustarten.
Nach Problemen mit Assets muss man den Dienst nochmal neustarten.


Nach dem Update testen, ob ElasticSearch noch funktioniert, eventuell muss auch ElasticSearch aktualisiert werden.
= weiterführende Links =
* [https://zammad.org/documentation Zammad Dokumentation]
* [https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/zammad Ansible Playbook für Hostsharing]


[[Kategorie:HSDoku]]
[[Kategorie:HSDoku]]
[[Kategorie:Installationsanleitungen]]
[[Kategorie:Installationsanleitungen]]
[[Kategorie:Ansible Playbook]]
[[Kategorie:RubyOnRails]]
[[Kategorie:RubyOnRails]]
[[Kategorie:Helpdesk]]

Aktuelle Version vom 5. Juli 2024, 11:20 Uhr

Anforderungen

Zammad ist ein relativ umfangreiches, mächtiges und modernes OSS Helpdesk Tool. Für die Installation wird benötigt:

  • eine (Sub)Domain
  • 2 bis 4 GB RAM (Schätzung, eure Erfahrung kann abweichen, je nach Nutzung)
  • ruby
  • nodejs
  • mehrere Daemons für Hintergrunddienste (worker, websocket)
  • evtl. noch ElasticSearch für Volltextsuche

Installation

Die Installation orientiert sich an dieser Anleitung und wurde für zammad 6.3 verfasst. Einige HS spezifische Abweichungen gibt es jedoch.

User anlegen

Für diese Anleitung wird angenommen das der User unter dem zammad laufen soll xyz00-zammad im Packet xyz00 ist.

Installation ruby / ruby env

Prüfe die Version von ruby die zammad benötigt hier.

Für diese Anleitung nehmen wir Version 3.2.3 an für zammad 6.3.

Die Installationsanleitung für rubyenv und ruby findet sich unter RubyRBEnv.

Verifiziere das die Installation geklappt hat mit

ruby -v

dies sollte der herausgesuchten Versionsnummer entsprechen

Installation nodejs

Prüfe die Version von nodejs die zammad benötigt hier.

Für diese Anleitung nehmen wir Version 20 an für zammad 6.3.

Verifiziere das die Installation geklappt hat mit

node -v

dies sollte der herausgesuchten Versionsnummer entsprechen

Installation Redis

Siehe Redis

Umgebungsvariablen

Meine `.profile`, `.bashrc`, `.bash_profile` sahen dann wie folgt aus (möglicherweise gibt es hier optimierungspotential)

Die Datei `.bash_profile`: . ~/.profile . ~/.bashrc Die Datei `.profile` (vgl instalation ruby und nodejs):

#ruby
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
#nodejs
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion

und die Datei `.bashrc`. Quellen vgl. [1] und [2]

export REDIS_URL=redis://:<your-password-goes-here>@127.0.0.1:<port>
export RAILS_ENV=production

Dann entweder alles neu einlesen oder einmal aus und wieder einloggen. Wenn alles geklappt hat, sollten die folgenden Befehle alle sinnvolle Ausgaben liefern

echo $RAILS_ENV # Ausgabe: production
ruby -v # Ausgabe vgl. oben
nodejs -v #  Ausgabe vgl. oben

Installation von Zammad

Zuerst laden wir zammad herunter, entpacken es, und installieren die dependencies (nur production)

mkdir zammad
cd zammad
wget -O - https://ftp.zammad.com/zammad-latest.tar.gz |tar -xvvz
bundle config set --local without 'test development mysql'
bundle install

Dann tragen wir die zugangsdaten der postgres Datenbank ein (auf HS Admin selbst erstellen) hier: beides `xyz00_zammad` Mit folgendem Inhalt (Einrückung beachten!):

# nano config/database.yml

# config/database.yml
production:
  adapter: postgresql
  host: localhost
  database: xyz00_zammad
  pool: 50
  timeout: 5000
  encoding: utf8
  username: xyz00_zammad
  password: changeme

Wenn alles stimmt sollten sich die folgenden Befehle ohne Fehler ausführen lassen und die Datenbanktabellen sowie die statischen Dateien zum ausliefern anlegen

rake db:migrate
rake assets:precompile

Zammad ausliefern

Um via Browser auf zammad zugreifen zu können kann es via Phusion Passenger ausgeliefert werden. Dazu muss im HS Admin eine Domain aufgeschaltet werden. Dann wird:

  • die .htaccess wie folgend gesetzt werden
  • der zammad ordner nach app-ssl gelinkt werden
  • und der statische content in htdocs-ssl
  • Optional kann das Domain Template noch um die subdomains bereinigt werden (2. Befehl)
cd ~/doms/zammad.example.org/
rm -r subs*
rm -r htdocs-ssl
rm -r app-ssl
ln -s ~/zammad app-ssl
ln -s ~/zammad/public htdocs-ssl
nano .htaccess

In HS-Admin muss unter der Domain dann folgende Eigenschaft bei Passenger gesetzt werden:

PassengerRuby /home/pacs/xyz00/users/zammad/.rbenv/shims/ruby
# Inhalt .htaccess
DirectoryIndex disabled
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{HTTP:Connection} Upgrade [NC]
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteRule .* ws://127.0.0.1:6042/%{REQUEST_URI}  [P,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RequestHeader set X-Forwarded-Proto "https"
RewriteRule .* http://127.0.0.1:6041/%{REQUEST_URI} [proxy,last]

Wenn alles geklappt hat sollte auf der Domain das restliche Web-basierte Setup zu sehen sein. Dort muss dann auch der andere HS Postfach User eingetragen werden. Theoretisch könnte man das auf dem gleichen Account abwickeln, ich persönlich würde es allerdings trennen. Piping wie bei manch andren Mailbasierten Anwendungen scheint nicht so einfach möglich zu sein (needs more investigation)

Hintergrunddienste

Damit der Websocket-Server und der Hintergrund Worker ordentlich laufen müssen folgende Befehle ausgeführt werden. Die IP Adresse und der Port beim Socket werden aus den Enviroment Variablen von oben bezogen, können allerdings auch manuell gesetzt werden.

cd zammad
bundle exec script/background-worker.rb start
bundle exec script/websocket-server.rb -b ${ZAMMAD_BIND_IP} -p ${ZAMMAD_WEBSOCKET_PORT} start

Empfohlen: Monit

Ich habe alles monit spezifische in den ordner monit gepackt

cd   
mkdir monit
cd monit

Zum starten habe ich ein kleines start und stop script (für monit) erstellt (lange zeile ggf. beachten)

# nano start-worker.sh

#!/bin/bash
. ~/.bash_profile
cd ~/zammad
exec  ${BUNDLE_BINARY} exec script/background-worker.rb start > ~/monit/worker.log 2>&1 &
echo $! > ~/monit/worker.pid
# nano start-websocket.sh

#!/bin/bash
. ~/.bash_profile
cd ~/zammad
# warnung, der  socket  produziert relativ viel log output im normalen Betrieb ggf. anpassen
exec ${BUNDLE_BINARY} exec script/websocket-server.rb -b ${ZAMMAD_BIND_IP} -p ${ZAMMAD_WEBSOCKET_PORT}  start > ~/monit/socket.log 2>&1 & 
echo $! > ~/monit/socket.pid
# nano stop-worker.sh

kill $( cat ~/monit/worker.pid )
# nano stop-websocket.sh

kill $( cat ~/monit/socket.pid )

Das dann alles noch in der `~/.monitrc` zusammenführen (achtung einige xyz00, zammad (user) und Mail Platzhalter):

# nano ~/.monitrc

set daemon 60 with start delay 10
set logfile /home/pacs/xyz00/users/zammad/monit/monit.log
set idfile /home/pacs/xyz00/users/zammad/monit/monit.id
set statefile /home/pacs/xyz00/users/zammad/monit/monit.state
set mailserver localhost
set mail-format { from: monit@your-domain.com }
#set httpd port 39008 address localhost
#    allow zammadadmin:ein-monit-passwort
check process zammad_worker with pidfile /home/pacs/xyz00/users/zammad/monit/worker.pid
  start program "/home/pacs/xyz00/users/zammad/monit/start-worker.sh"
  stop program "/home/pacs/xyz00/users/zammad/monit/stop-worker.sh"
check process zammad_socket with pidfile /home/pacs/opa00/users/zammad/monit/socket.pid
  start program "/home/pacs/xyz00/users/zammad/monit/start-websocket.sh"
  stop program "/home/pacs/xyz00/users/zammad/monit/stop-websocket.sh"

Noch schnell die rechte der 4 scripts anpassen:

  chmod u+x ~/monit/*.sh

Monit kann dann mit

  monit

gestartet werden.

Sobald monit einmal erfolgreich anlief sollte der monit Ordner so aussehen:

#  ls -lh

-rw-r--r-- 1 xyz00-zammad xyz00    32 Feb 23 11:59 monit.id
-rw-r--r-- 1 xyz00-zammad xyz00  2867 Feb 24 23:46 monit.log
-rw------- 1 xyz00-zammad xyz00   800 Feb 24 13:20 monit.state
-rw-r--r-- 1 xyz00-zammad xyz00 41048 Feb 25 00:49 socket.log
-rw-r--r-- 1 xyz00-zammad xyz00     5 Feb 24 23:45 socket.pid
-rwxr--r-- 1 xyz00-zammad xyz00   209 Feb 24 23:45 start-websocket.sh
-rwxr--r-- 1 xyz00-zammad xyz00   161 Feb 24 23:27 start-worker.sh
-rwxr--r-- 1 xyz00-zammad xyz00    34 Feb 24 23:30 stop-websocket.sh
-rwxr--r-- 1 xyz00-zammad xyz00    34 Feb 23 11:53 stop-worker.sh
-rw-r--r-- 1 xyz00-zammad xyz00     0 Feb 24 23:38 worker.log
-rw-r--r-- 1 xyz00-zammad xyz00     5 Feb 24 23:38 worker.pid

Optional: Mail-Piping

Um ein bisschen (viel) Last vom Background-Worker zu nehmen kann Mailpiping eingerichtet werden. Dafür sollte vermutlich zuerst der Webinstaller mit einer anderen IMAP/SMTP config durchgeklickt werden. Zusätzlich reduziert sich die Latenz von Maileingang bis Ticketeingang ein wenig.

Ausgangsserver auf sendmail festlegen

Der folgende Code schnippsel legt einen Mail-Kanal an, ohne einen dedizierten Eingang der regelmäßig abgerufen werden müsste. Quelle [3]

  rails r "Channel.create(area: 'Email::Account', options: { inbound: { adapter: 'null', options: {} }, outbound: { adapter: 'sendmail' } }, active: true, preferences: { editable: false }, updated_by_id: 1, created_by_id: 1)"

Maileingang per procmail

Optional: Elasticsearch Anbindung

Weiteren User nach Elasticsearch anlegen. Dieser muss dann mit zammad verknüpft werden. Hier wird der Port 39200 angenommen.

cd ~/zammad
rails r "Setting.set('es_url', 'http://localhost:39200')"
rails r "Setting.set('es_user', 'elasticsearch')"
rails r "Setting.set('es_password', 'changeme')"

Um Elasticsearch wieder zu deaktivieren einfach die URL durch einen leeren string ersetzen.

Es wird für Zammad 5.x ein ElasticSearch 7.x benötigt. siehe auch https://docs.zammad.org/en/latest/install/elasticsearch.html

Zum ersten Einrichten, oder auch zum Testen der Verbindung:

cd ~/zammad
rake searchindex:rebuild --trace

Problem:

 create indexes...rake aborted!
 Can't find config setting 'es_multi_index'

Lösung:

psql -U xyz00_zammad
  INSERT INTO settings \
    (title, name, description, area, frontend, created_at, updated_at) \
    VALUES ('ElasticSearch Multi Index', 'es_multi_index', \
    '','SearchIndex::ElasticSearch', \
    false, '2023-03-15 01:00:00', '2023-03-15 01:00:00');
cd ~/zammad
rails r "Setting.set('es_multi_index', false)"
rake searchindex:rebuild --trace

Zammad Upgrade

Diese Seite muss überarbeitet werden

Diese Seite wurde als Baustelle gekennzeichnet, weil sie überarbeitet werden muss. Eine Begründung dafür findest du auf der Diskussionsseite. Bitte hilf mit, diese Seite zu verbessern!
killall -u $USER
killall -u $USER 9

cp -a zammad zammad-old
cd zammad
rm -Rf app
rm -Rf public/assets
wget -O - https://ftp.zammad.com/zammad-5.3.1.tar.gz |tar -xvvz

bundle config set --local without 'test development mysql'
bundle install

Geht nicht, Ruby 2.2.5 fehlt!

cd
rbenv install 2.5.5

Geht nicht, Rbenv ist zu alt!

cd ~/.rbenv/plugins/ruby-build
git pull
cd
rbenv install 2.5.5
rbenv global 2.5.5
rbenv local 2.5.5

cd zammad
gem install bundle
gem install bundler
bundle config set --local without 'test development mysql'
bundle install

# Geht nicht, Bundler 1.17.x wird gebraucht.

gem install bundler==1.17.3

#	Geht auch nicht.
#	Dann hacken wir das mal versuchsweise ins Lock.

# vim Gemfile.lock

bundle config set --local without 'test development mysql'
bundle install

#	Es fehlen Libs.
#	HS bitte installieren...
#	[...]
#	Danke!

bundle config set --local without 'test development mysql'
bundle install
export RAILS_ENV=production
rake db:migrate
rake assets:clean
rake zammad:flush:cache
rake assets:precompile

/usr/bin/supervisord -c $HOME/supervisor/etc/supervisord.conf

Nach Problemen mit Assets muss man den Dienst nochmal neustarten.

Nach dem Update testen, ob ElasticSearch noch funktioniert, eventuell muss auch ElasticSearch aktualisiert werden.

weiterführende Links