Hello,
I wanted to start a thread to share how I migrated OTRS 6 to Zammad to evaluate the use of Zammad within our organisation and will use this thread to keep track of my findings and experience.
I am thankful for all contributions to this forum and would like to thank every contributor. This would not have been possible without you!
Use case
IT Support for a regional schools’ network
5 Service centers (sites where agents are located)
~150 Organisations
~230 Sites (an organisation can have more than one site)
OTRS 6
- Version
- OS Centos 7
- Apache2 (httpd)
- 1229 users (agents and customers)
- 51668 tickets
Zammad
- Version 6.2.0-1707172848.16867851.bookworm
- OS Debian 12
- OS and SSH hardening
- Unattended updates for security updates
- PostgreSQL 15
- nginx
- Distribution package installation (not docker, not source code)
Migration time 6h on a notebook with two VMs on Hyper-V and 16GB RAM in total
Migration setup
OTRS6 Server
- Activate unsigned packages support
https://support.example.com/otrs/index.pl?Action=AdminSystemConfiguration;Subaction=View;Setting=Package%3A%3AAllowNotVerifiedPackages;
- Install migration plugins following the official guide
https://docs.zammad.org/en/latest/migration/otrs.html
- Avoid OOM (Out of memory)
- Create a file with the path
/etc/httpd/conf.d/mpm_prefork.conf
, and add the following command block to the file:
<IfModule mpm_prefork_module> StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxRequestWorkers 30 MaxConnectionsPerChild 0 </IfModule>
- Create a file with the path
- Test configuration
httpd -t
- Restart httpd
systemctl restart httpd
Zammad Server Setup
-
Set file storage for attachments before import
- (as root)
zammad run rails c Setting.get('storage_provider') Setting.set('storage_provider', 'File') Setting.get('storage_provider') Store::File.move('DB','File')
-
Import via CLI
- Set parameters, enter import mode and start import
(continue in the rails console)
Setting.set('import_otrs_endpoint', 'https://support.example.com/otrs/public.pl?Action=ZammadMigrator') Setting.set('import_otrs_endpoint_key', '<YOURKEY>') Setting.set('import_mode', true) Import::OTRS.start
Once done exit import mode
Setting.set('import_mode', false) Setting.set('system_init_done', true) Rails.cache.clear
- Set parameters, enter import mode and start import
Troubleshooting post import
CSRF token verification failed
Since OTRS 6 was running with a SSL certificate, we need to set up a self signed SSL certificate in Zammad to avoid the issue (reminder this is an evalutation installation and not production, therefore we will not register an SSL cert)
- Set up a self signed SSL for nginx
Addapt-get install openssl openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx.key -out /etc/ssl/certs/nginx.crt openssl dhparam -out /etc/nginx/dhparam.pem 4096
/etc/nginx/snippets/self-signed.conf
ssl_certificate /etc/ssl/certs/nginx.crt; ssl_certificate_key /etc/ssl/private/nginx.key; ssl_protocols TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384; ssl_session_timeout 10m; ssl_session_cache shared:SSL:10m; ssl_session_tickets off; ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s; add_header X-Frame-Options DENY; add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection "1; mode=block"; ssl_dhparam /etc/nginx/dhparam.pem; ssl_ecdh_curve secp384r1;
Open issues
file-2 attachment
Like https://community.zammad.org/t/file-1-file-2-attachment-after-migration-from-otrs/9276
- No solution found yet.
Since these are old tickets to be kept as archive. I do personally not see it as issue
Rethinking the structure
The goal is to have a correct group/organization structure and notifications for the agents
This is the hardest part as I am trying to figure out how that works correctly.
Example:
1 Organization (A)
3 Sites (A1, A2, A3)
3 Customers (CA1, CA2, CA3)
3 Technicians (TA1, TA2, TA3)
New tickets should be assigned to the correct technician (e.g. TA1 for tickets from CA1 for A1) but all other TA (or TB3 or TC4 for other organizations) should not be notified or see the ticket
Set up email boxes (or better MS365 channels)
Same as above, I still need some time to figure out how the things are connected correctly and how to set it up appropriately. I hope I’ll be able to share the setups too
Open points
Try OpenSearch
I know it is not supported, but it’s a good time to start trying it out before putting it in production
Testing with Agents and Customers
Reporting
Excuse the wall of text and have a good day.