Changes

Jump to navigation Jump to search
678 bytes added ,  16:35, 27 July 2023
no edit summary
Line 3: Line 3:  
[[File:Rocket-dot-chat-logo.png|200px]]
 
[[File:Rocket-dot-chat-logo.png|200px]]
 
</blockquote>
 
</blockquote>
 +
{{Warning box| Due to the changes in Rockets requirements noted below please see the [[Rocket_Chat:Contrib|Rocket Chat Contrib]] This will run Rocket in a docker container}}
 +
{{Warning box| Most of the following is obsolete but here for posterity and reference}}
    
===Maintainer===
 
===Maintainer===
[mailto:RequestedDeletion@gmail.com[[User:RequestedDeletion|RequestedDeletion]]]
+
'''Maintainer:''' [mailto:RequestedDeletion@gmail.com[[User:RequestedDeletion|RequestedDeletion]]]
 
      
==About==
 
==About==
Line 23: Line 24:       −
In short, a [https://slack.com/ Slack], [https://www.hipchat.com/ HipChat] or even a [https://skype.com Skype] alternative, completely and '''securely self hosted and controlled'''. Great for closed (company/family/friends/community) teams.
+
In short, a [https://slack.com/ Slack], [https://www.hipchat.com/ HipChat], Jabber (XMMP), IRC or even a [https://skype.com Skype] alternative, completely and '''securely self hosted and controlled'''. Great for closed (company/family/friends/community) teams.
 +
 
 +
{{Note box|Rocket.Chat is a young project and therefore under very active development. Very regularly they release new (minor) versions. Your mileage may vary! Please see their [https://github.com/RocketChat/Rocket.Chat development] on [https://github.com/RocketChat/Rocket.Chat GitHub] for the activities and Rocket.Chat developments.}}
 +
 
 +
==Obsolete Notes==
   −
{{Note box|Rocket.Chat is a young project and therefore under very active development. Very regularly they release new (minor) versions. Your milage may vary! Please see their [https://github.com/RocketChat/Rocket.Chat development] on [https://github.com/RocketChat/Rocket.Chat GitHub] for the activities and Rocket.Chat developments.}}
      
This how-to can be discussed on the forums [https://forums.contribs.org/index.php/topic,52405.0.html '''here''']
 
This how-to can be discussed on the forums [https://forums.contribs.org/index.php/topic,52405.0.html '''here''']
 +
Latest Rocket.Chat version tested: '''0.39''' (please see the change log [https://github.com/RocketChat/Rocket.Chat/releases here]).
   −
RocketChat for '''SME Server 9.x 64-bit only!'''<br>
+
==Requirements==
Latest Rocket.Chat version tested: '''0.28.0''' (please see the change log [https://github.com/RocketChat/Rocket.Chat/releases here]).
+
{{Warning box|Please be aware that for now only Rocket.Chat up to version '''0.39''' can be installed due to dependencies on the Nodejs version available via software collections.}}
 +
Rocket.Chat requires several higher versions of applications and frameworks than provided by Koozali SME Server by default. Therefore we need to install some '''[[Software Collections]]''' Packages and enable some addition repo's.
   −
==Installation SCL environment==
+
# You must have '''SME Server 9.x 64-bit'''
===Add the epel repository===
+
# You must install the '''[[epel]]''' repository
/sbin/e-smith/db yum_repositories set epel repository \
+
# You must install the '''[[centos-sclo-rh]]''' repository
Name 'Epel - EL6' \
+
# You must install the '''[[Software Collections]]''' tool
BaseURL 'http://download.fedoraproject.org/pub/epel/6/$basearch' \
  −
MirrorList 'http://mirrors.fedoraproject.org/mirrorlist?repo=epel-6&arch=$basearch' \
  −
EnableGroups no \
  −
GPGCheck yes \
  −
GPGKey http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL \
  −
Exclude perl-Razor-Agent \
  −
Visible no \
  −
status disabled
     −
===Add scl and centos-sclo-rh repositories===
+
After having installed the above repo's and installing Software Collections, you can install the required collections by:
/sbin/e-smith/db yum_repositories set scl \
+
yum install rh-python34-python rh-mongodb32-mongodb rh-mongodb32-mongodb-server nodejs010 GraphicsMagick --enablerepo=centos-sclo-rh,epel
repository Name 'Software collections' \
  −
BaseURL 'http://mirror.centos.org/centos/$releasever/SCL/$basearch/' \
  −
EnableGroups no Visible yes status disabled
     −
/sbin/e-smith/db yum_repositories set centos-sclo-rh \
+
After installing the Software Collections we need to update some packages using NodeJS package manager NPM:
  repository Name 'Centos-RH Software collections' \
+
  scl enable nodejs010 'npm install -g npm ws inherits n forever forever-service'
  BaseURL 'http://mirror.centos.org/centos/$releasever/sclo/$basearch/rh/' \
+
  scl enable nodejs010 'n 0.10.40'
EnableGroups no Visible yes status disabled
  −
Expand new repo’s
  −
signal-event yum-modify
     −
===Install Software Collections applications===
+
== Installation of Rocket.Chat==
Before you can install any of the Software Collections applications, you must install the Software Collections tools first. Please see '''[[Software Collections]]''' how to install and enable '''[[Software Collections]]'''.
+
First we need to create the SME Server services:
   −
  yum install rh-python34-python rh-mongodb26-mongodb rh-mongodb26-mongodb-server \
+
For Rocket.Chat:
  nodejs010 GraphicsMagick --enablerepo=centos-sclo-rh,epel
+
  ln -s /etc/rc.d/init.d/e-smith-service /etc/rc.d/rc7.d/S99rocketchat
 +
  config set rocketchat service status enabled TCPPort 3000 access public
   −
using NodeJS package manager NPM to install additional NodeJS packages:
+
For MongoDB (please note the usage of mongod and NOT mongod'''b'''):
  scl enable nodejs010 bash
+
  ln -s /etc/rc.d/init.d/e-smith-service /etc/rc.d/rc7.d/S99rh-mongodb32-mongod
npm install -g inherits
+
  config set rh-mongodb32-mongod service status enabled access private TCPPort 27017
npm install -g n
  −
n 0.10.40
  −
  exit
     −
===Create SME Server MongoDB service===
+
And to update the ports:
(please note the usage of mongod and NOT mongodb)
  −
ln -s /etc/rc.d/init.d/e-smith-service /etc/rc.d/rc7.d/S99rh-mongodb26-mongod
  −
config set rh-mongodb26-mongod service
  −
config setprop rh-mongodb26-mongod status enabled
  −
config setprop rh-mongodb26-mongod access private
  −
config setprop rh-mongodb26-mongod TCPPort 27017
   
  signal-event remoteaccess-update
 
  signal-event remoteaccess-update
   −
===Create boot scripts for the Software Collections applications===
+
Now we can download and install the latest Rocket.Chat version from their [https://rocket.chat/releases/ downloads] repository:
nano -w /etc/profile.d/scls-rh-mongodb26.sh
+
  cd /root
#!/bin/sh
+
  curl -L https://rocket.chat/releases/0.39.0/download -o rocket.chat.tgz
  source /opt/rh/rh-mongodb26/enable
+
  tar zxvf rocket.chat.tgz
  export X_SCLS="`scl enable rh-mongodb26 'echo $X_SCLS'`"
+
  mv bundle /opt/Rocket.Chat
export ROOT_URL=http://localhost:3000/
  −
  export PORT=3000
  −
  export MONGO_URL=mongodb://localhost:27017/rocketchat
     −
nano -w /etc/profile.d/scls-rh-python34.sh
+
Once Rocket.Chat has been downloaded and unpacked, we need to 'register' Rocket.Chat with NodeJS with NPM:
  #!/bin/sh
+
  cd /opt/Rocket.Chat/programs/server
source /opt/rh/rh-python34/enable
+
  scl enable nodejs010 'npm install'
  export X_SCLS="`scl enable rh-python34 'echo $X_SCLS'`"
     −
nano -w /etc/profile.d/scls-rh-java-common.sh
+
Rocket.Chat has now been installed and you can test-drive you installation.
#!/bin/sh
  −
source /opt/rh/rh-java-common/enable
  −
export X_SCLS="`scl enable rh-java-common 'echo $X_SCLS'`"
     −
nano -w /etc/profile.d/scls-nodejs010.sh
+
First we need to set some environment variables manually (Please use your own correct settings):
  #!/bin/sh
+
export ROOT_URL=http://yourserver.com/
  source /opt/rh/nodejs010/enable
+
  export MONGO_URL=mongodb://localhost:27017/rocketchat
  export X_SCLS="`scl enable nodejs010 'echo $X_SCLS'`"
+
  export PORT=3000
 +
  export MAIL_URL=smtp://localhost:25
   −
A reboot at this point is required to load all of the Software Collections profile/config files.
+
and then we can start Rocket.Chat manually (with CTL-C you can quit Rocket.Chat):
  signal-event reboot
+
cd /opt/Rocket.Chat
 +
  node main.js
   −
== Installation of Rocket.Chat==
+
Browse to http://yourserver:3000 and create the first admin user.
===Create the SME Server Rocket.Chat service===
  −
config set rocketchat service
  −
config setprop rocketchat status enabled
  −
config setprop rocketchat TCPPort 3000
  −
config setprop rocketchat access public
  −
signal-event remoteaccess-update
     −
===Get Rocket.Chat from their [https://rocket.chat/releases/ downloads] repository===
+
{{Note box|This FIRST user will be the 'master administrator' even if you use [[Rocket_Chat#LDAP_Authentication|'''LDAP authentication''']] for your users. So if even if you use LDAP, this user will still be able to login and grant Rocket.Chat admin rights to [[Rocket_Chat#LDAP_Authentication|LDAP]] accounts.}}
cd /root
  −
curl -L https://rocket.chat/releases/latest/download -o rocket.chat.tgz
  −
tar zxvf rocket.chat.tgz
  −
mv bundle /opt/Rocket.Chat
     −
===Install NodeJS dependencies for Rocket.Chat===
+
==Auto start Rocket.Chat at boot==
cd /opt/Rocket.Chat/programs/server
+
Since SME Server has put it's name in /etc/system-release, the (NodeJS) forever utility will not be able to detect the main distribution name (e.g. CentOS) and will exit with an error. To add 'SME Server' to the list of recognised distributions so that the forever-service tool will run properly, is to execute the following command (don't be disturbed by the Oracle mentioning, it's just to locate the correct position):
  npm install
+
sed -i -e 's/(Oracle Linux)/(Oracle Linux)|(SME Server)/' \
 +
  /opt/rh/nodejs010/root/usr/lib/node_modules/forever-service/templates/sysvinit/installer.js
   −
===Start Rocket.Chat===
+
Generate the init script 'rocketchat' that will automatically be placed into /etc/rc.d/init.d:
 
  cd /opt/Rocket.Chat
 
  cd /opt/Rocket.Chat
  node main.js &
+
  forever-service install -s main.js -e "ROOT_URL=https://chat.mycompany.local/ \
 +
MONGO_URL=mongodb://localhost:27017/rocketchat PORT=3000 MAIL_URL=smtp://mycompany.local:25" \
 +
-p "/opt/rh/nodejs010/root/usr/lib/node_modules/forever/bin" rocketchat
 +
Please use the correct values in the command above from your specific setup.
   −
Browse to http://yourserver:3000 and create the first admin user.
+
The created init script '/etc/rc.d/init.d/rocketchat' is not aware that we use [[Software Collections]], so we have to add directives to the init script that we do:
 +
sed -i '26 a source /opt/rh/nodejs010/enable' /etc/rc.d/init.d/rocketchat
 +
sed -i '27 a source /opt/rh/rh-mongodb26/enable' /etc/rc.d/init.d/rocketchat
 +
sed -i '28 a source /opt/rh/rh-python34/enable' /etc/rc.d/init.d/rocketchat
 +
sed -i '29 a source /opt/rh/rh-java-common/enable' /etc/rc.d/init.d/rocketchat
 +
 
 +
 
 +
{{Note box|Please note that if you change anything on your Rocket.Chat environment such as URL's, subdomain name(s), ports or mail server, you have to run the above again to reflect your new environment. If so, please remove /etc/rc.d/init.d/rocketchat first. (rm /etc/rc.d/init.d/rocketchat).}}
   −
The Rocket.Chat log files are at /var/log/rocketchat.log
+
Rocket.Chat will now start at boot time or manually:
 +
service rocketchat start|stop|status|restart
      −
{{Note box|This FIRST user will be the 'master administrator' even if you use [[Rocket_Chat#LDAP_Authentication|'''LDAP authentication''']] for your users. So if even if you use LDAP, this user will still be able to login and grant Rocket.Chat admin rights to [[Rocket_Chat#LDAP_Authentication|LDAP]] accounts.}}
+
Please note that it may take a little while, up to a minute, for Rocket.Chat to become available. In the mean time you can be shown a HTTP error 503. Please try again in a minute or a bit longer. Why this is? No Idea for now, other that it may be related to MongoDB processes.
   −
==Rocket.Chat on a sub domain==
+
==Make Rocket.Chat available on a sub domain==
 
Install the '''[[Webapps-common]]''' contrib.
 
Install the '''[[Webapps-common]]''' contrib.
    
To create your sub domain (e.g. https://chat.yourserver.com)
 
To create your sub domain (e.g. https://chat.yourserver.com)
  db domains set chat.mycompany.local domain Description "RocketChat" Nameservers internet \
+
  db domains set chat.yourserver.local domain Description "RocketChat" Nameservers internet \
  TemplatePath WebAppVirtualHost RequireSSL enabled ProxyPassTarget http://localhost:3000/
+
  TemplatePath WebAppVirtualHost RequireSSL enabled ProxyPassTarget http://localhost:3000/ ProxyPreserveHost yes
 
The 'ProxyPassTarget' property could also point to another host (IP) that has Rocket.Chat installed, e.g. a virtual SME Server on the same LAN. In that case, also LDAP and open/close ports have to be taken into consideration.
 
The 'ProxyPassTarget' property could also point to another host (IP) that has Rocket.Chat installed, e.g. a virtual SME Server on the same LAN. In that case, also LDAP and open/close ports have to be taken into consideration.
 
To expand and activate:
 
To expand and activate:
 
  signal-event webapps-update
 
  signal-event webapps-update
   −
To disable the default access on port 3000, for we now access our chat platform via the subdomain, and for security we close the default access method.
+
If your servers' default FQDN is already chat.yourserver.com, there is no need to create a new subdomain. Instead of the above command, you can enter the following:
 +
db domains setprop chat.yourserver.com TemplatePath WebAppVirtualHost RequireSSL enabled ProxyPassTarget http://localhost:3000/ ProxyPreserveHost yes
 +
 
 +
To disable the default access on port 3000, for we now access our chat platform via the subdomain, and for security we change the default access method from public to private.
 
  config setprop rocketchat access private
 
  config setprop rocketchat access private
 
  signal-event remoteaccess-update
 
  signal-event remoteaccess-update
Line 152: Line 136:  
You can now visit Rocket.Chat at https://chat.yourserver.com. Rocket.Chat will notice that the URL that is being used to access Rocket.Chat has been changed, and will propose to change it to the new URL.
 
You can now visit Rocket.Chat at https://chat.yourserver.com. Rocket.Chat will notice that the URL that is being used to access Rocket.Chat has been changed, and will propose to change it to the new URL.
   −
==Auto start Rocket.Chat at boot==
+
==WebRTC configuration==
To be able to auto start Rocket.Chat one could use the /etc/rc.d/rc.local file, but using the init system is cleaner and much more controlled. Nodejs has small utilities (modules) that can create the correct init script based on your specific Rocket.Chat setup.
+
{{Note box|Please note that WebRTC connections on the chromium engines based browsers '''require''' secure connections (http'''s'''). Normal http connections will be refused. Please see the '''[[letsencrypt]]''' wiki page for more info on how to obtain a valid certificate for your Koozali SME Server(s) and domains. Please see [https://sites.google.com/a/chromium.org/dev/Home/chromium-security/deprecating-powerful-features-on-insecure-origins '''this'''] article on why. How other browsers such as Firefox and IE manage this is not known, if you do, please add a note.}}
 +
Rocket.Chat uses WebRTC to make voice/video calls. This requires the additional Apache module proxy_wstunnel. This is available from the '''[[fws]]''' repository.
 +
yum install mod_proxy_wstunnel --enablerepo=fws
   −
To install these Nodejs modules issue:
+
A custom template is required to load the proxy_wstunnel module by default and in the correct order:
  npm install -g forever
+
  mkdir -p /etc/e-smith/templates-custom/etc/httpd/conf/httpd.conf
  npm install -g forever-service
+
  nano -w /etc/e-smith/templates-custom/etc/httpd/conf/httpd.conf/20LoadModule60
Since SME Server has put it's name in /etc/system-release, the forever utility will not be able to detect the main distribution name (e.g. CentOS) and will exit with an error. To add 'SME Server' to the list of recognised distributions so that the forever-service tool will run properly, is to execute the following command (don't be disturbed by the Oracle mentioning, it's just to locate the correct position):
+
and paste the following content and save:
  sed -i -e 's/(Oracle Linux)/(Oracle Linux)|(SME Server)/' \
+
  {
  /opt/rh/nodejs010/root/usr/lib/node_modules/forever-service/templates/sysvinit/installer.js
+
    $OUT .= load_modules(qw(
 +
    proxy_wstunnel
 +
    ));
 +
}
 +
Then expand httpd.conf and restart Apache:
 +
  expand-template /etc/httpd/conf/httpd.conf
 +
service httpd-e-smith restart
   −
====Generate the Rocket.Chat init script====
+
To show if the module is correctly loaded:
Generate the init script 'rocketchat' that will automatically be placed into /etc/rc.d/init.d:
+
  apachectl -M |grep wstunnel
  cd /opt/Rocket.Chat
+
it should be listed as '''proxy_wstunnel_module (shared)'''
forever-service install -s main.js -e "ROOT_URL=https://chat.mycompany.local/ \
  −
MONGO_URL=mongodb://localhost:27017/rocketchat PORT=3000 MAIL_URL=smtp://mycompany.local:25" \
  −
-p "/opt/rh/nodejs010/root/usr/lib/node_modules/forever/bin" rocketchat
  −
Please use the correct values in the command above from your specific setup.
     −
The created init script '/etc/rc.d/init.d/rocketchat' is not aware that we use [[Software Collections]], so we have to add a directive to the init script that we do:
+
To be able to redirect websocket requets to the Rocket.Chat engine, the following must be present in httpd.conf under the virtualhost sub-domain:
  sed -i '26 a source /etc/profile.d/scls-nodejs010.sh' /etc/rc.d/init.d/rocketchat
+
  ProxyPass /.well-known/acme-challenge/ !
{{Note box|Please note that if you change anything on your Rocket.Chat environment such as URL's, subdomain name(s), ports or mail server, you have to run the above again to reflect your new environment. If so, please remove /etc/rc.d/init.d/rocketchat first. (rm /etc/rc.d/init.d/rocketchat).}}
+
ProxyPreserveHost On
 
+
ProxyPassMatch ^/sockjs/(.*)/websocket ws://localhost:3000/sockjs/$1/websocket
====Create SME Server service link====
+
  ProxyPass / http://localhost:3000/
Now we can create a link to the SME Server way of starting services automatically at boot time or manually:
+
ProxyPassReverse / http://localhost:3000/
  ln -s /etc/rc.d/init.d/e-smith-service /etc/rc.d/rc7.d/S99rocketchat
  −
 
  −
and you can start/stop/status your rocketchat service e.g.:
  −
service rocketchat status
  −
service rocketchat start
  −
service rocketchat stop
  −
service rocketchat restart
  −
 
  −
Please note that it may take a little while, up to a minute, for rocketchat to become available. In the mean time you can be shown a HTTP error 503. Please try again in a minute or a bit longer. Why this is? No Idea for now, other that it may be related to MongoDB processes.
      
==LDAP Authentication==
 
==LDAP Authentication==
Line 197: Line 176:  
  Sync data: True
 
  Sync data: True
 
  Default domain: chat.yourserver.com (as per the subdomain)
 
  Default domain: chat.yourserver.com (as per the subdomain)
Save the settings and use the test button to test the connection to the LDAP directory. Then 'Sync users'. For more specific details on Rocket.Chat and LDAP user authentication please see [https://rocket.chat/docs/master/admin-guides/ldap/ '''their documentation'''].
+
Save the settings and use the test button to test the connection to the LDAP directory. Then 'Sync users'. For more specific details on Rocket.Chat and LDAP user authentication please see [https://rocket.chat/docs/administrator-guides/authentication/ldap '''their documentation'''].
   −
==Upgrade Rocket.Chat==
+
==Maintenance==
 +
====Upgrade Rocket.Chat====
 
Interestingly there is not much information on upgrading your Rocket.Chat version. It does not help either that the Rocket.Chat team closed their wiki and took it off-line in favour of a new doc system which is not populated with info as much.
 
Interestingly there is not much information on upgrading your Rocket.Chat version. It does not help either that the Rocket.Chat team closed their wiki and took it off-line in favour of a new doc system which is not populated with info as much.
   Line 205: Line 185:  
  service rocketchat stop
 
  service rocketchat stop
 
  rm -rf /opt/Rocket.Chat
 
  rm -rf /opt/Rocket.Chat
and then repeat the download, unpack and move [[Rocket_Chat#Get_Rocket.Chat_from_downloads|'''get Rocket.Chat procedure above''']]. Then start Rocket.Chat:
+
and then repeat the download, unpack and move as descibed above. Then start Rocket.Chat:
 
  service rocketchat start
 
  service rocketchat start
 
Please note it can take a bit for the Rocket.Chat service to become available for the MongoDB structure version is being checked and automatically updated according to the Rocket.Chat version.
 
Please note it can take a bit for the Rocket.Chat service to become available for the MongoDB structure version is being checked and automatically updated according to the Rocket.Chat version.
   −
==Backup Rocket.Chat==
+
====Backup Rocket.Chat====
 
{{Note box|Please note that this section is experimental. Somebody with more extensive knowledge of MongoDB may help here. This section is not finished yet, so please do NOT use on production servers, just test VM's. The default storage location of MongoDB is '/var/opt/rh/rh-mongodb26/lib/mongodb' (as set in '/etc/opt/rh/rh-mongodb26/mongod.conf'.) We might want to change this to /home/e-smith/files/mongodb' or '/var/lib/mongodb' and run a script to be included in the pre-backup event, just like MySQL, to hold transactions and make a backup.}}
 
{{Note box|Please note that this section is experimental. Somebody with more extensive knowledge of MongoDB may help here. This section is not finished yet, so please do NOT use on production servers, just test VM's. The default storage location of MongoDB is '/var/opt/rh/rh-mongodb26/lib/mongodb' (as set in '/etc/opt/rh/rh-mongodb26/mongod.conf'.) We might want to change this to /home/e-smith/files/mongodb' or '/var/lib/mongodb' and run a script to be included in the pre-backup event, just like MySQL, to hold transactions and make a backup.}}
   Line 222: Line 202:  
You may want to automate the execution of the above mongodump command by means of a cron job. For easy management of this, you could use the excellent [[Crontab_Manager|'''Crontab Manager''']] contrib.
 
You may want to automate the execution of the above mongodump command by means of a cron job. For easy management of this, you could use the excellent [[Crontab_Manager|'''Crontab Manager''']] contrib.
   −
==Remove Rocket.Chat==
+
====Remove Rocket.Chat====
 
TBA
 
TBA
   −
==Desktop clients==
+
==Rocket.Chat clients==
Next to your browser, you can use Rocket.Chat desktop clients for Linux, Windows and Mac.
+
Next to your browser, you can use Rocket.Chat desktop clients for Linux, Windows and Mac. Please see https://github.com/RocketChat/Rocket.Chat.Electron/releases
   −
Please see:
  −
https://github.com/RocketChat/Rocket.Chat.Electron/releases
  −
  −
==Mobile clients==
   
Obviously there are mobile clients for both Android and iOS. Please search for 'Rocket chat' in either app store.
 
Obviously there are mobile clients for both Android and iOS. Please search for 'Rocket chat' in either app store.
    
==TO DO==
 
==TO DO==
* <s>Auto start Rocket.Chat</s>
   
* Backup and how to manage Rocket.Chat data (e.g. mongodb and FS options)
 
* Backup and how to manage Rocket.Chat data (e.g. mongodb and FS options)
* <s>Fine tune various things (e.g. Security)</s>
+
* Include the push server config for both Android and iOS
* <s>Enable LDAP authentication</s>
  −
* <s>Create subdomain e.g. https://chat.yourdomain.com using the webapps-common contrib</s>
  −
* <s>Activiation/Notification emails are not sent, despite test success</s>
  −
* <s>Upgrade Rocket.Chat</s>
   
* Remove Rocket.Chat
 
* Remove Rocket.Chat
<br>
   
* Watch developments such as using PostgreSQL/MariaDB opposed to MongoDB
 
* Watch developments such as using PostgreSQL/MariaDB opposed to MongoDB
 
* Test, test, test
 
* Test, test, test
* Create a contrib
   
* Showcase SME Server, contribs and software collections.
 
* Showcase SME Server, contribs and software collections.
      
==Tips & Tricks==
 
==Tips & Tricks==

Navigation menu