OpenProject installieren: Unterschied zwischen den Versionen

Aus Hostsharing Wiki
Zur Navigation springen Zur Suche springen
 
(7 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
== Allgemein ==
OpenProject ist eine umfangreiche Projektmanagement-Software.  Die Software ist multiprojektfähig;  für jedes Projekt stehen unter anderem folgende Werkzeuge zur Verfügung:
OpenProject ist eine umfangreiche Projektmanagement-Software.  Die Software ist multiprojektfähig;  für jedes Projekt stehen unter anderem folgende Werkzeuge zur Verfügung:
* Wiki
* Wiki
Zeile 8: Zeile 9:


Die Anleitung wurde für OpenProject Version 11 erstellt.
Die Anleitung wurde für OpenProject Version 11 erstellt.
== Ansible Skript ==
Alternativ zur manuellen Installation, die in diesem Wiki Artikel beschrieben wird, gibt es ein
Ansible Skript, das die Installationsschritte für OpenProject automatisiert durchführt.
Die Quellen für das Ansible Skript können hier eingesehen werden: https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/openproject


== Vorbereitungen ==
== Vorbereitungen ==
Zeile 23: Zeile 31:
Die "leichtgewichtige" Subdomain "www" wird gelöscht. Ebenso die ''.htaccess''-Datei mit der Weiterleitung dorthin.
Die "leichtgewichtige" Subdomain "www" wird gelöscht. Ebenso die ''.htaccess''-Datei mit der Weiterleitung dorthin.


    xyz00@h20 $ sudo -u xyz00-project -i
<syntaxhighlight lang="bash">
    xyz00-project@h20:~$ cd ~/doms/projekt.example.com/
xyz00@h20 $ sudo -u xyz00-project -i
    xyz00-project@h20:~/doms/projekt.example.com$ rm -rf subs/www/ subs-ssl/www/ htdocs-ssl/.htaccess  
xyz00-project@h20:~$ cd ~/doms/projekt.example.com/
xyz00-project@h20:~/doms/projekt.example.com$ rm -rf subs/www/ subs-ssl/www/ htdocs-ssl/.htaccess  
</syntaxhighlight>


=== Installation von Ruby ===
=== Installation von Ruby ===
Zeile 35: Zeile 45:
Die Installation-Anleitung für OpenProject schlägt für die Installation ''rbenv'' vor.
Die Installation-Anleitung für OpenProject schlägt für die Installation ''rbenv'' vor.


    xyz00-project@h20:~/doms/projekt.example.com$ cd
<syntaxhighlight lang="bash">
    xyz00-project@h20:~$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
xyz00-project@h20:~/doms/projekt.example.com$ cd
    xyz00-project@h20:~$ touch .profile
xyz00-project@h20:~$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
    xyz00-project@h20:~$ chmod u+x .profile
xyz00-project@h20:~$ touch .profile
    xyz00-project@h20:~$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.profile
xyz00-project@h20:~$ chmod u+x .profile
    xyz00-project@h20:~$ echo 'eval "$(rbenv init -)"' >> ~/.profile
xyz00-project@h20:~$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.profile
    xyz00-project@h20:~$ source ~/.profile
xyz00-project@h20:~$ echo 'eval "$(rbenv init -)"' >> ~/.profile
    xyz00-project@h20:~$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
xyz00-project@h20:~$ source ~/.profile
    xyz00-project@h20:~$ rbenv install 2.7.4
xyz00-project@h20:~$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
    xyz00-project@h20:~$ rbenv rehash
xyz00-project@h20:~$ rbenv install 2.7.4
    xyz00-project@h20:~$ rbenv global 2.7.4
xyz00-project@h20:~$ rbenv rehash
xyz00-project@h20:~$ rbenv global 2.7.4
</syntaxhighlight>


Als Test bitte aufrufen: ''ruby -v''
Als Test bitte aufrufen: ''ruby -v''
Zeile 56: Zeile 68:
Die Installation-Anleitung für OpenProject schlägt für die Installation ''nodenv'' vor.  
Die Installation-Anleitung für OpenProject schlägt für die Installation ''nodenv'' vor.  


    xyz00-project@h20:~$ git clone https://github.com/OiNutter/nodenv.git ~/.nodenv
<syntaxhighlight lang="bash">
    xyz00-project@h20:~$ echo 'export PATH="$HOME/.nodenv/bin:$PATH"' >> ~/.profile
xyz00-project@h20:~$ git clone https://github.com/OiNutter/nodenv.git ~/.nodenv
    xyz00-project@h20:~$ echo 'eval "$(nodenv init -)"' >> ~/.profile
xyz00-project@h20:~$ echo 'export PATH="$HOME/.nodenv/bin:$PATH"' >> ~/.profile
    xyz00-project@h20:~$ source ~/.profile
xyz00-project@h20:~$ echo 'eval "$(nodenv init -)"' >> ~/.profile
    xyz00-project@h20:~$ git clone git://github.com/OiNutter/node-build.git ~/.nodenv/plugins/node-build
xyz00-project@h20:~$ source ~/.profile
    xyz00-project@h20:~$ nodenv install 12.18.4
xyz00-project@h20:~$ git clone git://github.com/OiNutter/node-build.git ~/.nodenv/plugins/node-build
    xyz00-project@h20:~$ nodenv rehash
xyz00-project@h20:~$ nodenv install 12.18.4
    xyz00-project@h20:~$ nodenv global 12.18.4
xyz00-project@h20:~$ nodenv rehash
xyz00-project@h20:~$ nodenv global 12.18.4
</syntaxhighlight>


Ein Test mit ''node --version'' solte anzeigen: v12.18.4
Ein Test mit ''node --version'' solte anzeigen: v12.18.4
Zeile 73: Zeile 87:
Wir installieren die OpenProject Community Edition. siehe https://github.com/opf/openproject
Wir installieren die OpenProject Community Edition. siehe https://github.com/opf/openproject


    xyz00-project@h20:~$ git clone https://github.com/opf/openproject.git --branch stable/11 --depth 1
<syntaxhighlight lang="bash">
    xyz00-project@h20:~$ cd ~/openproject
xyz00-project@h20:~$ git clone https://github.com/opf/openproject.git --branch stable/11 --depth 1
    xyz00-project@h20:~$ gem update --system
xyz00-project@h20:~$ cd ~/openproject
    xyz00-project@h20:~$ gem install bundler
xyz00-project@h20:~$ gem update --system
    xyz00-project@h20:~$ bundle update --bundler
xyz00-project@h20:~$ gem install bundler
    xyz00-project@h20:~$ bundle config set deployment 'true'
xyz00-project@h20:~$ bundle update --bundler
    xyz00-project@h20:~$ bundle config set without 'mysql2 sqlite development test therubyracer docker'
xyz00-project@h20:~$ bundle config set deployment 'true'
    xyz00-project@h20:~$ bundle install
xyz00-project@h20:~$ bundle config set without 'mysql2 sqlite development test therubyracer docker'
    xyz00-project@h20:~$ npm install
xyz00-project@h20:~$ bundle install
xyz00-project@h20:~$ npm install
</syntaxhighlight>


=== Konfiguration von OpenProject ===
=== Konfiguration von OpenProject ===
Zeile 87: Zeile 103:
Erstelle eine Konfiguration für den Datenbank-Zugriff in der Datei ''config/database.yml''
Erstelle eine Konfiguration für den Datenbank-Zugriff in der Datei ''config/database.yml''


    xyz00-project@h20:~$ cd ~/openproject
<syntaxhighlight lang="bash">
    xyz00-project@h20:~/openproject$ cp config/database.yml.example config/database.yml
xyz00-project@h20:~$ cd ~/openproject
xyz00-project@h20:~/openproject$ cp config/database.yml.example config/database.yml
</syntaxhighlight>


In der neuen Datei ''database.yml'' wird die mit HSAdmin angelegte PostgreSQL-Datenbank eingetragen:
In der neuen Datei ''database.yml'' wird die mit HSAdmin angelegte PostgreSQL-Datenbank eingetragen:
 
<syntaxhighlight lang="yaml" line>
    production:
production:
      adapter: postgresql
  adapter: postgresql
      encoding: unicode
  encoding: unicode
      host: localhost
  host: localhost
      database: xyz00_prjdb (wie oben angegeben)
  database: xyz00_prjdb (wie oben angegeben)
      pool: 10
  pool: 10
      username: xyz00_dbuser (wie oben angegeben)
  username: xyz00_dbuser (wie oben angegeben)
      password: meinPasswort (wie oben angegeben)
  password: meinPasswort (wie oben angegeben)
</syntaxhighlight>


Die Einträge für ''development'' und ''test'' können gelöscht werden.
Die Einträge für ''development'' und ''test'' können gelöscht werden.
Zeile 105: Zeile 124:
Dann wird die Datei ''configuration.yml'' angelegt:
Dann wird die Datei ''configuration.yml'' angelegt:


    xyz00-project@h20:~$ cd ~/openproject
<syntaxhighlight lang="yaml" line>
    xyz00-project@h20:~/openproject$ cp config/configuration.yml.example config/configuration.yml
xyz00-project@h20:~$ cd ~/openproject
xyz00-project@h20:~/openproject$ cp config/configuration.yml.example config/configuration.yml
</syntaxhighlight>


Dort erfolgen die Einstellungen für ausgehende E-Mails:
Dort erfolgen die Einstellungen für ausgehende E-Mails:


    default:
<syntaxhighlight lang="yaml" line>
      log_level: info
default:
      email_delivery_method: :smtp
  log_level: info
      smtp_address: localhost
  email_delivery_method: :smtp
      smtp_port: 25
  smtp_address: localhost
      smtp_domain: example.com
  smtp_port: 25
      #smtp_authentication: :login
  smtp_domain: example.com
      #smtp_user_name: "openproject@example.net"
  #smtp_authentication: :login
      #smtp_password: "my_openproject_password"
  #smtp_user_name: "openproject@example.net"
  #smtp_password: "my_openproject_password"
</syntaxhighlight>


Die Zeilen mit smtp_authentication, smtp_user_name und smtp_password können auskommentiert werden, sie werden in unserem Setup nicht benötigt.
Die Zeilen mit smtp_authentication, smtp_user_name und smtp_password können auskommentiert werden, sie werden in unserem Setup nicht benötigt.
Zeile 124: Zeile 147:
Es muss außerdem vermieden werden, dass beim Hochladen von Dateien in /tmp geschrieben wird. Dazu wird das Verzeichnis $HOME/var/tmp angelegt, und die Datei <code>openproject/config/initializers/tmpdir.rb</code> mit folgendem Inhalt erstellt:
Es muss außerdem vermieden werden, dass beim Hochladen von Dateien in /tmp geschrieben wird. Dazu wird das Verzeichnis $HOME/var/tmp angelegt, und die Datei <code>openproject/config/initializers/tmpdir.rb</code> mit folgendem Inhalt erstellt:


<pre>
<syntaxhighlight lang="ruby" line>
class Dir
class Dir
    def self.tmpdir
  def self.tmpdir
      "/home/pacs/xyz00/users/project/var/tmp/"
    "/home/pacs/xyz00/users/project/var/tmp/"
    end
   end
   end
</pre>
end
</syntaxhighlight>


=== Einen geheimen Schlüssel erzeugen ===
=== Einen geheimen Schlüssel erzeugen ===


    xyz00-project@h20:~$ cd ~/openproject
<syntaxhighlight lang=bash>
    xyz00-project@h20:~/openproject$ EDITOR=cat ./bin/rails credentials:edit
xyz00-project@h20:~$ cd ~/openproject
xyz00-project@h20:~/openproject$ EDITOR=cat ./bin/rails credentials:edit
</syntaxhighlight>


=== Initialisiere Datenbank und erzeuge Web-Ressourcen ===
=== Initialisiere Datenbank und erzeuge Web-Ressourcen ===


    xyz00-project@h20:~$ cd ~/openproject
<syntaxhighlight lang=bash>
    xyz00-project@h20:~/openproject$ export RAILS_ENV="production"
xyz00-project@h20:~$ cd ~/openproject
    xyz00-project@h20:~/openproject$ source ~/.profile
xyz00-project@h20:~/openproject$ export RAILS_ENV="production"
    xyz00-project@h20:~/openproject$ ./bin/rails db:prepare
xyz00-project@h20:~/openproject$ source ~/.profile
    xyz00-project@h20:~/openproject$ ./bin/rake assets:precompile
xyz00-project@h20:~/openproject$ ./bin/rails db:prepare
xyz00-project@h20:~/openproject$ ./bin/rake assets:precompile
</syntaxhighlight>


=== Anlegen des Administrators ===
=== Anlegen des Administrators ===


Es kann eine Demo Installation installiert werden:
Es kann eine Demo Installation installiert werden:
    xyz00-project@h20:~$ cd ~/openproject
<syntaxhighlight lang=bash>
    xyz00-project@h20:~/openproject$ export RAILS_ENV="production"
xyz00-project@h20:~$ cd ~/openproject
    xyz00-project@h20:~/openproject$ source ~/.profile
xyz00-project@h20:~/openproject$ export RAILS_ENV="production"
    xyz00-project@h20:~/openproject$ LOCALE=en ./bin/rake db:seed
xyz00-project@h20:~/openproject$ source ~/.profile
xyz00-project@h20:~/openproject$ LOCALE=en ./bin/rake db:seed
</syntaxhighlight>


Damit wird ein Beispiel-Projekt angelegt, dass man wieder löschen kann.
Damit wird ein Beispiel-Projekt angelegt, das man wieder löschen kann.


Wichtig ist aber, dass der Benutzer <code>admin</code> mit dem Passwort <code>admin</code> angelegt wird. Das Passwort muss bei der ersten Anmeldung geändert werden.
Wichtig ist aber, dass der Benutzer <code>admin</code> mit dem Passwort <code>admin</code> angelegt wird. Das Passwort muss bei der ersten Anmeldung geändert werden.
Zeile 159: Zeile 188:
=== Konfiguration in Passenger ===
=== Konfiguration in Passenger ===


    xyz00-project@h20:~$ cd ~/doms/prj.example.com
<syntaxhighlight lang=bash>
    xyz00-project@h20:~/doms/prj.example.com$ rm -rf app-ssl htdocs-ssl
xyz00-project@h20:~$ cd ~/doms/prj.example.com
    xyz00-project@h20:~/doms/prj.example.com$ ln -s $HOME/openproject app-ssl
xyz00-project@h20:~/doms/prj.example.com$ rm -rf app-ssl htdocs-ssl
    xyz00-project@h20:~/doms/prj.example.com$ ln -s $HOME/openproject/public htdocs-ssl
xyz00-project@h20:~/doms/prj.example.com$ ln -s $HOME/openproject app-ssl
xyz00-project@h20:~/doms/prj.example.com$ ln -s $HOME/openproject/public htdocs-ssl
</syntaxhighlight>


Weiterhin muss in einer .htaccess-Datei in diesem Verzeichnis die richtige Umgebung gesetzt sein:
Weiterhin muss in einer .htaccess-Datei in diesem Verzeichnis die richtige Umgebung gesetzt sein:


    xyz00-project@h20:~/doms/prj.example.com$ cat .htaccess
<syntaxhighlight lang=apache>
    PassengerRuby /home/pacs/xyz00/users/project/.rbenv/shims/ruby
# xyz00-project@h20:~/doms/prj.example.com$ cat .htaccess


== Aufsetzen des Cronjobs für Hintergrundprozesse ==
SetEnv OPENPROJECT_STORAGE_TMP__PATH /home/pacs/xyz00/users/project/var/tmp/
SetEnv TMPDIR /home/pacs/xyz00/users/project/var/tmp/
PassengerRuby /home/pacs/xyz00/users/project/.rbenv/shims/ruby
</syntaxhighlight>
 
== Aufsetzen des systemd Timers für Hintergrundprozesse ==


Es werden Benachrichtigungs-E-Mails im Hintergrund verschickt. Dazu muss ein Prozess im Hintergrund gestartet werden. Um Probleme zu vermeiden, dass source nicht zur Verfügung steht, kann der Aufruf in einer eigenen Skriptdatei geschehen, die zwingend mit Bash ausgeführt wird, wo source verfügbar ist.
Es werden Benachrichtigungs-E-Mails im Hintergrund verschickt. Dazu muss ein Prozess im Hintergrund gestartet werden. Um Probleme zu vermeiden, dass source nicht zur Verfügung steht, kann der Aufruf in einer eigenen Skriptdatei geschehen, die zwingend mit Bash ausgeführt wird, wo source verfügbar ist.
Zeile 175: Zeile 211:
Datei ''/home/pacs/xyz00/users/project/emailjob.sh'':
Datei ''/home/pacs/xyz00/users/project/emailjob.sh'':


    #!/bin/bash
<syntaxhighlight lang=bash line>
    source ~/.profile
#!/bin/bash
    cd ~/openproject
source ~/.profile
    RAILS_ENV="production" ./bin/rake jobs:workoff
cd ~/openproject
RAILS_ENV="production" ./bin/rake jobs:workoff
</syntaxhighlight>


Datei ''/home/pacs/xyz00/users/project/jobrestart.sh'':
Datei ''/home/pacs/xyz00/users/project/jobrestart.sh'':


    #!/bin/bash
<syntaxhighlight lang=bash line>
    source ~/.profile
#!/bin/bash
    cd ~/openproject
source ~/.profile
    RAILS_ENV="production"  ./bin/delayed_job restart
cd ~/openproject
RAILS_ENV="production"  ./bin/delayed_job restart
</syntaxhighlight>
 
Nun können die Timer eingerichtet werden:
 
''~/.config/systemd/user/openproject_emails.service''
<syntaxhighlight lang=ini line>
[Unit]
Description=openproject mails


Nun können die cronjobs eingerichtet werden:
[Service]
Type=oneshot
ExecStart=/home/pacs/xyz00/users/project/emailjob.sh
</syntaxhighlight>


    xyz00-project@h20:~$ crontab -e
~/.config/systemd/user/openproject_emails.timer
<syntaxhighlight lang=ini line>
[Unit]
Description=openproject mails


Nun öffnet sich die Crontab Datei im voreingestellten Editor. Hier muss folgende Zeile eingefügt werden:
[Timer]
OnCalendar=*:0/2
Persistent=True


    */2 * * * * /home/pacs/xyz00/users/project/emailjob.sh
[Install]
WantedBy=timers.target
</syntaxhighlight>


Damit wird der Hintergrundprozess alle 2 Minuten gestartet.
Damit wird der Hintergrundprozess alle 2 Minuten gestartet.
Zeile 199: Zeile 256:
Es gibt noch einen Hintergrundjob, den ich einmal in der Stunde neu starte:
Es gibt noch einen Hintergrundjob, den ich einmal in der Stunde neu starte:


    22 * * * * /home/pacs/xyz00/users/project/jobrestart.sh
''~/.config/systemd/user/openproject_jobrestart.service''
<syntaxhighlight lang=ini line>
[Unit]
Description=openproject restart job
 
[Service]
Type=oneshot
ExecStart=/home/pacs/xyz00/users/project/jobrestart.sh
</syntaxhighlight>
 
~/.config/systemd/user/openproject_jobrestart.timer
<syntaxhighlight lang=ini line>
[Unit]
Description=openproject restart job
 
[Timer]
OnCalendar=*:22
Persistent=True
 
[Install]
WantedBy=timers.target
</syntaxhighlight>
 
 
Timer aktivieren und starten:
<syntaxhighlight lang=bash line>
$ systemctl --user enable openproject_emails.timer
$ systemctl --user start openproject_emails.timer
$ systemctl --user enable openproject_jobrestart.timer
$ systemctl --user start openproject_jobrestart.timer
</syntaxhighlight>


== Upgrade durchführen ==
== Upgrade durchführen ==
Zeile 207: Zeile 294:
Für das Upgrade von OpenProject 11.2.4 auf 11.3.4, musste eine neue Version von Ruby installiert werden:
Für das Upgrade von OpenProject 11.2.4 auf 11.3.4, musste eine neue Version von Ruby installiert werden:


    xyz00-project@h20:~$ cd ~/openproject
<syntaxhighlight lang=bash>
    xyz00-project@h20:~/openproject$ source ~/.profile
xyz00-project@h20:~$ cd ~/openproject
    xyz00-project@h20:~/openproject$ git -C $HOME/.rbenv/plugins/ruby-build pull
xyz00-project@h20:~/openproject$ source ~/.profile
    xyz00-project@h20:~/openproject$ rbenv install 2.7.4
xyz00-project@h20:~/openproject$ git -C $HOME/.rbenv/plugins/ruby-build pull
    xyz00-project@h20:~/openproject$ rbenv rehash
xyz00-project@h20:~/openproject$ rbenv install 2.7.4
    xyz00-project@h20:~/openproject$ rbenv global 2.7.4
xyz00-project@h20:~/openproject$ rbenv rehash
    xyz00-project@h20:~/openproject$ source ~/.profile
xyz00-project@h20:~/openproject$ rbenv global 2.7.4
    xyz00-project@h20:~/openproject$ rm -Rf $HOME/.rbenv/versions/2.7.3/  # alte Version kann gelöscht werden
xyz00-project@h20:~/openproject$ source ~/.profile
xyz00-project@h20:~/openproject$ rm -Rf $HOME/.rbenv/versions/2.7.3/  # alte Version kann gelöscht werden
</syntaxhighlight>


Weil das Git Repository bei der Erstinstallation nur einen Branch enthielt, muss nun das Repository vollständig geladen werden:
Weil das Git Repository bei der Erstinstallation nur einen Branch enthielt, muss nun das Repository vollständig geladen werden:


    xyz00-project@h20:~$ cd openproject
<syntaxhighlight lang=bash>
    xyz00-project@h20:~/openproject$ source ~/.profile
xyz00-project@h20:~$ cd openproject
    xyz00-project@h20:~/openproject$ git config remote.origin.fetch +refs/heads/*:refs/remotes/origin/*
xyz00-project@h20:~/openproject$ source ~/.profile
    xyz00-project@h20:~/openproject$ git fetch --unshallow
xyz00-project@h20:~/openproject$ git config remote.origin.fetch +refs/heads/*:refs/remotes/origin/*
    xyz00-project@h20:~/openproject$ git checkout --track remotes/origin/stable/11
xyz00-project@h20:~/openproject$ git fetch --unshallow
xyz00-project@h20:~/openproject$ git checkout --track remotes/origin/stable/11
</syntaxhighlight>


Generell müssen diese Schritte durchgeführt werden:
Generell müssen diese Schritte durchgeführt werden:


    xyz00-project@h20:~$ cd openproject
<syntaxhighlight lang=bash>
    xyz00-project@h20:~/openproject$ source ~/.profile
xyz00-project@h20:~$ cd openproject
    xyz00-project@h20:~/openproject$ git fetch
xyz00-project@h20:~/openproject$ source ~/.profile
    xyz00-project@h20:~/openproject$ git pull
xyz00-project@h20:~/openproject$ git fetch
    xyz00-project@h20:~/openproject$ gem update --system
xyz00-project@h20:~/openproject$ git pull
    xyz00-project@h20:~/openproject$ bundle install
xyz00-project@h20:~/openproject$ gem update --system
    xyz00-project@h20:~/openproject$ npm install
xyz00-project@h20:~/openproject$ bundle install
    xyz00-project@h20:~/openproject$ export RAILS_ENV="production"
xyz00-project@h20:~/openproject$ npm install
    xyz00-project@h20:~/openproject$ ./bin/rake db:migrate
xyz00-project@h20:~/openproject$ export RAILS_ENV="production"
    xyz00-project@h20:~/openproject$ ./bin/rake assets:precompile
xyz00-project@h20:~/openproject$ ./bin/rake db:migrate
    xyz00-project@h20:~/openproject$ touch ~/doms/prj.example.com/app-ssl/tmp/restart.txt
xyz00-project@h20:~/openproject$ ./bin/rake assets:precompile
xyz00-project@h20:~/openproject$ touch ~/doms/prj.example.com/app-ssl/tmp/restart.txt
</syntaxhighlight>


== Referenzen ==
== Referenzen ==


* [https://docs.openproject.org/installation-and-operations/installation/manual/ Anleitung für die manuelle Installation]
* [https://docs.openproject.org/installation-and-operations/installation/manual/ Anleitung für die manuelle Installation]
 
* [https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/openproject Ansible Playbook für Hostsharing]
----
----
[[Kategorie:HSDoku]]
[[Kategorie:HSDoku]]
[[Kategorie:Installationsanleitungen]]
[[Kategorie:Installationsanleitungen]]
[[Kategorie:Ansible Playbook]]
[[Kategorie:Software]]
[[Kategorie:Software]]
[[Kategorie:RubyOnRails]]
[[Kategorie:RubyOnRails]]

Aktuelle Version vom 3. Dezember 2024, 13:10 Uhr

Allgemein

OpenProject ist eine umfangreiche Projektmanagement-Software. Die Software ist multiprojektfähig; für jedes Projekt stehen unter anderem folgende Werkzeuge zur Verfügung:

  • Wiki
  • Vorgangsverfolgung (Ticketsystem, Issue Tracker)
  • Zeiterfassung
  • Dokument- und Dateiverwaltung

Diese Anleitung beschreibt, wie man OpenProject auf der Managed Hosting Plattform von Hostsharing installieren kann. OpenProject lässt sich in jedem Managed Webspace betreiben.

Die Anleitung wurde für OpenProject Version 11 erstellt.

Ansible Skript

Alternativ zur manuellen Installation, die in diesem Wiki Artikel beschrieben wird, gibt es ein Ansible Skript, das die Installationsschritte für OpenProject automatisiert durchführt.

Die Quellen für das Ansible Skript können hier eingesehen werden: https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/openproject

Vorbereitungen

Service-User, Domain und Datenbank

Mit Hilfe von HSAdmin werden angelegt:

  1. Ein User als Service-User mit /bin/bash als Shell, zum Beispiel Beispiel: xyz00-project"
  2. Eine Domain mit xyz00-project als Domain-Administrator, zum Beispiel "prj.example.com"
  3. Einen Postgresql-User xyz00_dbuser mit Passwort meinPasswort
  4. Eine Postgresql-Datenbank xyz00_prjdb mit Datenbank-Owner xyz00_dbuser

Vorbereitung des Webspace

Die "leichtgewichtige" Subdomain "www" wird gelöscht. Ebenso die .htaccess-Datei mit der Weiterleitung dorthin.

xyz00@h20 $ sudo -u xyz00-project -i
xyz00-project@h20:~$ cd ~/doms/projekt.example.com/
xyz00-project@h20:~/doms/projekt.example.com$ rm -rf subs/www/ subs-ssl/www/ htdocs-ssl/.htaccess

Installation von Ruby

Weiterhin benötigt OpenProject eine geeignete Version der Programmiersprache Ruby.

Die gewünschte Version kann hier abgelesen werden: https://github.com/opf/openproject/blob/stable/11/.ruby-version

Die Installation-Anleitung für OpenProject schlägt für die Installation rbenv vor.

xyz00-project@h20:~/doms/projekt.example.com$ cd
xyz00-project@h20:~$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
xyz00-project@h20:~$ touch .profile
xyz00-project@h20:~$ chmod u+x .profile
xyz00-project@h20:~$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.profile
xyz00-project@h20:~$ echo 'eval "$(rbenv init -)"' >> ~/.profile
xyz00-project@h20:~$ source ~/.profile
xyz00-project@h20:~$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
xyz00-project@h20:~$ rbenv install 2.7.4
xyz00-project@h20:~$ rbenv rehash
xyz00-project@h20:~$ rbenv global 2.7.4

Als Test bitte aufrufen: ruby -v

Die Anzeige sollte etwa das Folgende enthalten: ruby 2.7.4pXYZ (....) [x86_64-linux]

Installation von Node

Die Installation-Anleitung für OpenProject schlägt für die Installation nodenv vor.

xyz00-project@h20:~$ git clone https://github.com/OiNutter/nodenv.git ~/.nodenv
xyz00-project@h20:~$ echo 'export PATH="$HOME/.nodenv/bin:$PATH"' >> ~/.profile
xyz00-project@h20:~$ echo 'eval "$(nodenv init -)"' >> ~/.profile
xyz00-project@h20:~$ source ~/.profile
xyz00-project@h20:~$ git clone git://github.com/OiNutter/node-build.git ~/.nodenv/plugins/node-build
xyz00-project@h20:~$ nodenv install 12.18.4
xyz00-project@h20:~$ nodenv rehash
xyz00-project@h20:~$ nodenv global 12.18.4

Ein Test mit node --version solte anzeigen: v12.18.4

Installation und Konfiguration

Installation von OpenProject

Wir installieren die OpenProject Community Edition. siehe https://github.com/opf/openproject

xyz00-project@h20:~$ git clone https://github.com/opf/openproject.git --branch stable/11 --depth 1
xyz00-project@h20:~$ cd ~/openproject
xyz00-project@h20:~$ gem update --system
xyz00-project@h20:~$ gem install bundler
xyz00-project@h20:~$ bundle update --bundler
xyz00-project@h20:~$ bundle config set deployment 'true'
xyz00-project@h20:~$ bundle config set without 'mysql2 sqlite development test therubyracer docker'
xyz00-project@h20:~$ bundle install
xyz00-project@h20:~$ npm install

Konfiguration von OpenProject

Erstelle eine Konfiguration für den Datenbank-Zugriff in der Datei config/database.yml

xyz00-project@h20:~$ cd ~/openproject
xyz00-project@h20:~/openproject$ cp config/database.yml.example config/database.yml

In der neuen Datei database.yml wird die mit HSAdmin angelegte PostgreSQL-Datenbank eingetragen:

production:
  adapter: postgresql
  encoding: unicode
  host: localhost
  database: xyz00_prjdb (wie oben angegeben)
  pool: 10
  username: xyz00_dbuser (wie oben angegeben)
  password: meinPasswort (wie oben angegeben)

Die Einträge für development und test können gelöscht werden.

Dann wird die Datei configuration.yml angelegt:

xyz00-project@h20:~$ cd ~/openproject
xyz00-project@h20:~/openproject$ cp config/configuration.yml.example config/configuration.yml

Dort erfolgen die Einstellungen für ausgehende E-Mails:

default:
  log_level: info
  email_delivery_method: :smtp
  smtp_address: localhost
  smtp_port: 25
  smtp_domain: example.com
  #smtp_authentication: :login
  #smtp_user_name: "openproject@example.net"
  #smtp_password: "my_openproject_password"

Die Zeilen mit smtp_authentication, smtp_user_name und smtp_password können auskommentiert werden, sie werden in unserem Setup nicht benötigt.

Es muss außerdem vermieden werden, dass beim Hochladen von Dateien in /tmp geschrieben wird. Dazu wird das Verzeichnis $HOME/var/tmp angelegt, und die Datei openproject/config/initializers/tmpdir.rb mit folgendem Inhalt erstellt:

class Dir
  def self.tmpdir
    "/home/pacs/xyz00/users/project/var/tmp/"
  end
end

Einen geheimen Schlüssel erzeugen

xyz00-project@h20:~$ cd ~/openproject
xyz00-project@h20:~/openproject$ EDITOR=cat ./bin/rails credentials:edit

Initialisiere Datenbank und erzeuge Web-Ressourcen

xyz00-project@h20:~$ cd ~/openproject
xyz00-project@h20:~/openproject$ export RAILS_ENV="production"
xyz00-project@h20:~/openproject$ source ~/.profile
xyz00-project@h20:~/openproject$ ./bin/rails db:prepare
xyz00-project@h20:~/openproject$ ./bin/rake assets:precompile

Anlegen des Administrators

Es kann eine Demo Installation installiert werden:

xyz00-project@h20:~$ cd ~/openproject
xyz00-project@h20:~/openproject$ export RAILS_ENV="production"
xyz00-project@h20:~/openproject$ source ~/.profile
xyz00-project@h20:~/openproject$ LOCALE=en ./bin/rake db:seed

Damit wird ein Beispiel-Projekt angelegt, das man wieder löschen kann.

Wichtig ist aber, dass der Benutzer admin mit dem Passwort admin angelegt wird. Das Passwort muss bei der ersten Anmeldung geändert werden.

Konfiguration in Passenger

xyz00-project@h20:~$ cd ~/doms/prj.example.com
xyz00-project@h20:~/doms/prj.example.com$ rm -rf app-ssl htdocs-ssl
xyz00-project@h20:~/doms/prj.example.com$ ln -s $HOME/openproject app-ssl
xyz00-project@h20:~/doms/prj.example.com$ ln -s $HOME/openproject/public htdocs-ssl

Weiterhin muss in einer .htaccess-Datei in diesem Verzeichnis die richtige Umgebung gesetzt sein:

# xyz00-project@h20:~/doms/prj.example.com$ cat .htaccess

SetEnv OPENPROJECT_STORAGE_TMP__PATH /home/pacs/xyz00/users/project/var/tmp/
SetEnv TMPDIR /home/pacs/xyz00/users/project/var/tmp/
PassengerRuby /home/pacs/xyz00/users/project/.rbenv/shims/ruby

Aufsetzen des systemd Timers für Hintergrundprozesse

Es werden Benachrichtigungs-E-Mails im Hintergrund verschickt. Dazu muss ein Prozess im Hintergrund gestartet werden. Um Probleme zu vermeiden, dass source nicht zur Verfügung steht, kann der Aufruf in einer eigenen Skriptdatei geschehen, die zwingend mit Bash ausgeführt wird, wo source verfügbar ist.

Datei /home/pacs/xyz00/users/project/emailjob.sh:

#!/bin/bash
source ~/.profile
cd ~/openproject
RAILS_ENV="production" ./bin/rake jobs:workoff

Datei /home/pacs/xyz00/users/project/jobrestart.sh:

#!/bin/bash
source ~/.profile
cd ~/openproject
RAILS_ENV="production"  ./bin/delayed_job restart

Nun können die Timer eingerichtet werden:

~/.config/systemd/user/openproject_emails.service

[Unit]
Description=openproject mails

[Service]
Type=oneshot
ExecStart=/home/pacs/xyz00/users/project/emailjob.sh

~/.config/systemd/user/openproject_emails.timer

[Unit]
Description=openproject mails

[Timer]
OnCalendar=*:0/2
Persistent=True

[Install]
WantedBy=timers.target

Damit wird der Hintergrundprozess alle 2 Minuten gestartet.

Es gibt noch einen Hintergrundjob, den ich einmal in der Stunde neu starte:

~/.config/systemd/user/openproject_jobrestart.service

[Unit]
Description=openproject restart job

[Service]
Type=oneshot
ExecStart=/home/pacs/xyz00/users/project/jobrestart.sh

~/.config/systemd/user/openproject_jobrestart.timer

[Unit]
Description=openproject restart job

[Timer]
OnCalendar=*:22
Persistent=True

[Install]
WantedBy=timers.target


Timer aktivieren und starten:

$ systemctl --user enable openproject_emails.timer
$ systemctl --user start openproject_emails.timer
$ systemctl --user enable openproject_jobrestart.timer
$ systemctl --user start openproject_jobrestart.timer

Upgrade durchführen

Die gewünschte Ruby Version kann hier abgelesen werden: https://github.com/opf/openproject/blob/stable/11/.ruby-version

Für das Upgrade von OpenProject 11.2.4 auf 11.3.4, musste eine neue Version von Ruby installiert werden:

xyz00-project@h20:~$ cd ~/openproject
xyz00-project@h20:~/openproject$ source ~/.profile
xyz00-project@h20:~/openproject$ git -C $HOME/.rbenv/plugins/ruby-build pull
xyz00-project@h20:~/openproject$ rbenv install 2.7.4
xyz00-project@h20:~/openproject$ rbenv rehash
xyz00-project@h20:~/openproject$ rbenv global 2.7.4
xyz00-project@h20:~/openproject$ source ~/.profile
xyz00-project@h20:~/openproject$ rm -Rf $HOME/.rbenv/versions/2.7.3/  # alte Version kann gelöscht werden

Weil das Git Repository bei der Erstinstallation nur einen Branch enthielt, muss nun das Repository vollständig geladen werden:

xyz00-project@h20:~$ cd openproject
xyz00-project@h20:~/openproject$ source ~/.profile
xyz00-project@h20:~/openproject$ git config remote.origin.fetch +refs/heads/*:refs/remotes/origin/*
xyz00-project@h20:~/openproject$ git fetch --unshallow
xyz00-project@h20:~/openproject$ git checkout --track remotes/origin/stable/11

Generell müssen diese Schritte durchgeführt werden:

xyz00-project@h20:~$ cd openproject
xyz00-project@h20:~/openproject$ source ~/.profile
xyz00-project@h20:~/openproject$ git fetch
xyz00-project@h20:~/openproject$ git pull
xyz00-project@h20:~/openproject$ gem update --system
xyz00-project@h20:~/openproject$ bundle install
xyz00-project@h20:~/openproject$ npm install
xyz00-project@h20:~/openproject$ export RAILS_ENV="production"
xyz00-project@h20:~/openproject$ ./bin/rake db:migrate
xyz00-project@h20:~/openproject$ ./bin/rake assets:precompile
xyz00-project@h20:~/openproject$ touch ~/doms/prj.example.com/app-ssl/tmp/restart.txt

Referenzen