Support-infrastructuur

Uit Limesco Wiki
Ga naar: navigatie, zoeken

Support@ is sinds het begin bemand geweest door Sjors, Gerdriaan en Mark, waarbij Sjors de meeste mails afhandelde. Omdat puur e-mail gebruiken tracken lastiger maakt, en er wel eens voor zorgde dat Sjors en Gerdriaan tegelijkertijd een antwoord stuurden, zijn we begin 2013 gaan kijken naar een ticketingsysteem. We hebben geëxperimenteerd met Request Tracker en hebben besloten dat we dat systeem als implementatie gaan gebruiken voor support-tickets.

We hadden verschillende eisen voor dit systeem:

  1. Het moet duidelijk zijn wie een ticket behandelt (eigenaar & claimfunctionaliteit)
  2. We moeten wel alle tickets in kunnen zien, ongeacht eigenaar
  3. Het systeem moet mailnotificaties sturen als er interessante dingen gebeuren
  4. Alle communicatie in een ticket moet in 1 overzicht zichtbaar zijn
  5. We willen extra properties kunnen zetten op een ticket, zodat een mail automatisch interessante informatie verzamelt (accountnaam, SIM-gegevens, eventuele SpeakUp-ticketnummers)
  6. Tickets moeten via een commandline-interface in te zien en te wijzigen zijn
  7. Voortgang van tickets moet snel zichtbaar zijn
  8. Er moet een systeem voor reminders zijn, bijv. "over 2 dagen nog eens kijken hoe het staat" of "moet maximaal over 3 dagen opgelost zijn"
  9. Dat systeem voor reminders moet ons ook kunnen e-mailen
  10. We moeten vanaf de commandline mensen e-mail kunnen sturen, zo dat replies automatisch in dezelfde ticket komen

Het bleek dat Request Tracker dit allemaal kon, of gemakkelijk aan te vullen was zodat het dit kon. Op deze pagina beschrijf ik hoe we de boel hebben geïmplementeerd, voor het geval we het nog eens moeten doen en in de hoop dat het nuttig is voor anderen.

Installatie

De Request Tracker-installatie draait op de Debian-machine api.limesco.nl. Installatie op Debian is zo simpel als apt-get install request-tracker4. Tijdens de installatie wordt gevraagd om de naam van de Request Tracker-instance (de rtname); die wordt bijvoorbeeld gebruikt voor de subject tag in mailtjes. In ons geval is dat simpelweg Limesco.

Request Tracker gaat uitgevoerd worden als de user www-data omdat er niets anders als de www-data-gebruiker uitgevoerd wordt. Zouden er al bestaande services gebruikmaken van die user, dan zouden we de voorkeur hebben een aparte gebruiker aan te maken voor RT. Op de vraag "Handle RT_SiteConfig.pm permissions?" antwoorden we nu dus ja. De databaseconfiguratie kan ook automatisch worden gedaan ("Yes") en voor het initial root password kiezen we een lang, onraadbaar wachtwoord. Zodra RT is geïnstalleerd maken we een setje accounts voor mensen; de root-account wordt dan alleen nog gebruikt voor geautomatiseerde scripts.

Het instellen van Request Tracker zelf gaat via /etc/request-tracker4/RT_SiteConfig.d/50-debconf, daar staat het volgende:

# THE BASICS:

Set($rtname, 'Limesco');
Set($Organization, 'Limesco');

Set($CorrespondAddress , 'support@limesco.nl');
Set($CommentAddress , 'support-comment@rt.limesco.nl');

# THE WEBSERVER:

Set($WebPath , "/rt");
Set($WebBaseURL , "https://api.limesco.nl");
Set($WebPort, 443);
Set($WebDomain, "api.limesco.nl");

Om deze configuratie bij te werken, voeren we update-rt-siteconfig-4 uit.

Configuratie website

Op api.limesco.nl gebruiken we nginx, een snelle lichte webserver met CGI-support. Om nginx en Request Tracker samen te laten werken is de package rt4-fcgi nodig. Die installeert een /etc/init.d/rt4-fcgi die Request Tracker via FastCGI bereikbaar maakt, en een /usr/share/doc/rt4-fcgi/examples/request-tracker4.conf die de interface naar Nginx maakt. Die interface gebruiken wij als opzetje voor de configuratie in nginx, die RT alleen bereikbaar maakt via SSL:

server {
	listen 443;
	server_name api.limesco.nl;

	root /var/www;
	index index.html index.htm;

	ssl on;
	ssl_certificate /etc/nginx/ssl/api.limesco.nl.bundle-primary-first.crt;
	ssl_certificate_key /etc/nginx/ssl/api.limesco.nl.key;

	ssl_session_timeout 5m;

	# request-tracker4 configuration for nginx
	# (belong to /etc/nginx/conf.d)
	location /rt {
		alias		/usr/share/request-tracker4/html;

		expires		epoch;
		include		/etc/nginx/fastcgi_params;
		fastcgi_param	SCRIPT_NAME		"/rt";
		fastcgi_pass	unix:/var/run/rt4-fcgi.sock;
	}

	# Bypass FastCGI for images
	location /rt/NoAuth/images {
		alias		/usr/share/request-tracker4/html/NoAuth/images/;
	}

	# Limit mail gateway access to localhost by default
	location /rt/REST/1.0/NoAuth {
		alias		/usr/share/request-tracker4/html/REST/1.0/NoAuth/;
		expires		epoch;
		include		/etc/nginx/fastcgi_params;
		fastcgi_param	SCRIPT_NAME "/rt";
		fastcgi_pass	unix:/var/run/rt4-fcgi.sock;

		allow		127.0.0.1;
		allow		93.191.131.63; # ons eigen IP-adres
		allow		::1/128;
		allow		2a02:348:9a:833f::1/128; # ons eigen v6-adres
		deny		all;
	}
}

Om de FastCGI-daemon aan te zetten verander je enabled=0 in enabled=1 in /etc/default/rt4-fcgi. Dan resteert ons nog het opstarten van de FastCGI-daemon en het herstarten van Nginx:

$ sudo ln -s /etc/nginx/sites-available/rt.conf /etc/nginx/sites-enabled/
$ sudo /etc/init.d/rt4-fcgi start
$ sudo /etc/init.d/nginx restart

En https://api.limesco.nl/rt geeft netjes het loginscherm van Request Tracker weer.

Configuratie gebruikers

Als eerste willen we users toevoegen. Dat kan in Tools → Configuration → Users → Create. Zet "let this user access RT" en "let this user be granted rights" aan. Maak ook een groep voor de administrators ("admin"): Tools → Configuration → Groups → Create; na het maken kun je rechtsboven bij "Members" members toevoegen. Deze groep geven we extra rechten: Tools → Configuration → Global → Group Rights; vul links onderin "admin" (de naam van de groep) in, klik op "Rights for Administrators", en tick "Do anything and everything".

We kunnen nu uitloggen als root en inloggen als één van de users die we hebben gemaakt.

Nieuwe tickets via e-mail

Zodra er een e-mail binnenkomt aan support@limesco.nl moet die e-mail in Request Tracker worden ingevoerd. Daarvoor gaan we de configuratie van Postfix in. E-mail aan support@limesco.nl (en andere supportadressen) wordt geforward naar support-rt@rt.limesco.nl, dus onze Postfix moet rt.limesco.nl als zijn destination zien. We voegen daarom dat adres toe aan mydestination in /etc/postfix/main.cf en herstarten Postfix.

Daarnaast is het nog belangrijk dat er bij e-mail aan support-rt@rt.limesco.nl een programma van RT (rt-mailgate) wordt uitgevoerd. Daarvoor voegen we de volgende twee regels toe aan /etc/aliases:

support-rt: "|/usr/bin/rt-mailgate --queue 'General' --action correspond --url https://api.limesco.nl/rt"
support-rt-comment: "|/usr/bin/rt-mailgate --queue 'General' --action comment --url https://api.limesco.nl/rt"

rt-mailgate zal dus nu uitgevoerd worden bij het ontvangen van zo'n e-mail; hij zal HTTP-requests doen aan het NoAuth-gedeelte van RT (dat alleen openstaat aan localhost door de configuratie hierboven). Voer sudo newaliases uit om de aliases-database bij te werken en e-mail zal nu netjes uitkomen bij Request Tracker.

Echter, voordat Request Tracker nieuwe tickets mag aanmaken voor ongeauthoriseerde e-mailadressen moet die permissie nog gegeven worden. Dat gebeurt onder Tools → Configuration → Global → Group Rights; klik links op Everyone en tick "Create Tickets" en "Reply to tickets".

Iedereens tickets kunnen zien

Volgens eis (2) moet iedereen iedereens tickets kunnen bekijken. Met name alle open tickets, ongeacht eigenaar, moeten op de voorpagina te zien zijn. Dat doen we door een Saved Search te maken (Tickets → New Search). Daar definiëren we:

Status != 'resolved'
AND Status != 'rejected'

Gesorteerd op LastUpdated ASC, en dan rechts opslaan als Saved Search "Open Tickets" (onder RT System's saved searches). Er wordt nu een nieuwe entry gemaakt die toegevoegd kan worden aan het Dashboard ("RT At A Glance"). Door dan naar Tools → Configuration → Global → RT at a glance te gaan, kun je onder "Body" links "Open Tickets" selecteren, verplaatsen naar rechts, en schuiven naar waar hij moet verschijnen. Eventueel dan per account nog dezelfde wijziging uitvoeren of resetten naar default (usermenu → Settings → RT at a glance), en het lijstje open tickets staat erbij op de voorpagina.

Notificaties sturen vanaf RT

Voor het versturen van de notificaties, voegen we het volgende toe aan /etc/request-tracker4/RT_SiteConfig.d/50-debconf:

# E-MAIL:

Set($SendmailArguments, "-oi -t -f support@limesco.nl");
Set($OwnerEmail, "postmaster@limesco.nl");

Voer weer update-rt-siteconfig-4 uit om de veranderingen te verwerken. Maak nu een groep genaamd DefaultQueueAdminCc (Tools → Configuration → Groups → Create); ga naar Members en iedere user toe die e-mail moet ontvangen voor de default queue.

We voegen nu de groep DefaultQueueAdminCc toe als AdminCc van de default queue: ga naar Tools → Configuration → Queues → Select, klik General en ga naar Watchers rechtsboven; "Find Groups whose Name matches DefaultQueueAdminCc", selecteer onder Groups "AdminCc" voor de groep, en klik op "Save Changes".

Welke e-mail de AdminCc van een queue krijgt is aan te passen onder Tools → Configuration → Global → Scrips → Select: standaard gelden de volgende regels:

  • On Comment Notify AdminCcs as Comment
  • On Correspond Notify AdminCcs
  • On Create Notify AdminCcs

Door bijv. de eerste twee regels weg te halen krijgen AdminCc's nog wel e-mail voor een nieuwe ticket, maar niet meer elkaars correspondentie op een ticket. (Dat doen wij hier niet.)

Mails sturen bij reminders

In RT kun je reminders zetten op een ticket. Dat zijn zelf ook weer simpele tickets met een "due date" en een link naar het oorspronkelijke ticket. Als we willen dat er ook een mail wordt gestuurd als een reminder nadert, kunnen we rt-crontool in een crontab zetten.

Eerst moet de UNIX-gebruiker "www-data" herkend worden door het RT-systeem, zodat hij toegang heeft, tickets kan bekijken en e-mail kan sturen. Daarvoor gaan we naar Tools → Configuration → Users → Select, selecteren we "root" en zetten we zijn UNIX login op "www-data" (of de gebruiker die gebruikt wordt voor RT). Je kunt hier ook de "Real name" aanpassen naar iets vriendelijkers. Je kunt ook een nieuwe gebruiker maken voor dit doel, maar "root" werd toch niet echt meer gebruikt.

We maken nu een template voor de e-mail die rt-crontool gaat laten sturen, in Tools → Configuration → Global → Templates → Create. We noemen hem "Reminder due soon" en zetten het volgende erin:

To: { $Target = $Ticket->RefersTo->First->TargetObj; ($Argument eq 'TicketOwner' ? $Target : $Ticket)->OwnerObj->EmailAddress }
Subject: {$Ticket->Subject} is due {$Ticket->DueAsString}

Just a friendly heads up.  This reminder is for ticket #{$Target->Id}.

Original ticket: {RT->Config->Get('WebURL')}Ticket/Display.html?id={$Target->Id}

Daarna maken we een /etc/cron.daily/request-tracker4-reminders, executable, met de volgende inhoud:

#!/bin/sh
sudo -H -u www-data rt-crontool \
                  --search RT::Search::FromSQL \
                  --search-arg 'Type = "reminder" and (Status = "open" or Status = "new")' \
                  --condition RT::Condition::BeforeDue \
                  --condition-arg 2d \
                  --action RT::Action::RecordComment \
                  --action-arg Owner \
                  --transaction first \
                  --template 'Reminder due soon'

Dit zal nu voor iedere reminder die binnen 2 dagen afloopt een comment plaatsen bij die reminder. De gebruiker die de reminder heeft geplaatst krijgt van comments een e-mail als je "Notificaties sturen vanaf RT" hierboven ook hebt gevolgd. Eventueel kun je de --action vervangen door RT::Action::SendEmail om direct een e-mail te versturen zonder een comment te plaatsen.

Andere kleine configuratie

  • Geen automatische mail meer sturen bij het sluiten van een ticket: Tools → Configuration → Global → Scrips → Select, On Resolve Notify Requestors, selecteer, Delete.
  • "Via RT" in de From weg: Set($FriendlyFromLineFormat, "\"%s\" <%s>"); in /etc/request-tracker4/RT_SiteConfig.d/50-debconf en voer update-rt-siteconfig-4 uit.
  • Nederlandse auto-replies: Tools → Configuration → Global → Templates → Select, klik Autoreply (2), verander het naar:
Subject: Ticket wordt in behandeling genomen: {$Ticket->Subject}

L.S.,

Dit is een automatisch gegenereerd bericht om te bevestigen dat uw e-mail is ontvangen en in behandeling wordt genomen. Wij zouden het waarderen als u "{ $Ticket->SubjectTag }" in het onderwerp van vervolg-e-mails laat staan.

Met vriendelijke groet,
Limesco

De oorspronkelijke tekst van uw bericht volgt.
-------------------------------------------------------------------------
{$Transaction->Content()}

Commandline-integratie

Een belangrijk doel was ook om via de commandline met het ticketingsysteem te integreren. De one-stop go daarvoor is /usr/bin/rt, een tool die interfacet met heel Request Tracker.

  • Status zetten: rt edit ticket/20 set status=resolved
  • Custom field zetten: rt edit ticket/20 set 'CF.{SpeakUp-Ticket}'=2468
    • Zo'n custom field kun je toevoegen via Tools → Configuration → Custom Fields → Create en activeren op een queue via Tools → Configuration → Global → Custom Fields → Ticket
  • Een lege ticket maken: rt create -t ticket set id="ticket/new" queue="General" subject="Subject van de ticket" cc="Correspondentie wordt ook hierheen gestuurd"
  • Correspondentie toevoegen: rt correspond -m "Het bericht staat hier" 4 (4 is de ticket-id)
  • Voor gebruik van /usr/bin/rt, zie rt help conf en rt help usage.