\documentclass[border={30pt 0pt 0pt 30pt}]{standalone}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{automata, positioning, arrows, shapes.geometric}
\tikzstyle{startstop} = [rectangle, rounded corners, minimum width=3cm, minimum height=1cm,text centered, draw=black]
\tikzstyle{ha} = [rectangle, minimum width=3cm, minimum height=1cm,text centered, draw=black]
\usepackage{environ}
\usepackage[margin=2cm]{geometry}
\renewcommand{\baselinestretch}{1.15}
\setlength{\parskip}{6pt}
% https://tex.stackexchange.com/questions/442991/database-shape-in-tikz/442994
\makeatletter
\tikzset{
database/.style={
path picture={
\draw (0, 1.5*\database@segmentheight) circle [x radius=\database@radius,y radius=\database@aspectratio*\database@radius];
\draw (-\database@radius, 0.5*\database@segmentheight) arc [start angle=180,end angle=360,x radius=\database@radius, y radius=\database@aspectratio*\database@radius];
\draw (-\database@radius,-0.5*\database@segmentheight) arc [start angle=180,end angle=360,x radius=\database@radius, y radius=\database@aspectratio*\database@radius];
\draw (-\database@radius,1.5*\database@segmentheight) -- ++(0,-3*\database@segmentheight) arc [start angle=180,end angle=360,x radius=\database@radius, y radius=\database@aspectratio*\database@radius] -- ++(0,3*\database@segmentheight);
},
minimum width=2*\database@radius + \pgflinewidth,
minimum height=3*\database@segmentheight + 2*\database@aspectratio*\database@radius + \pgflinewidth,
},
database segment height/.store in=\database@segmentheight,
database radius/.store in=\database@radius,
database aspect ratio/.store in=\database@aspectratio,
database segment height=0.1cm,
database radius=0.25cm,
database aspect ratio=0.35,
}
\makeatother
\begin{document}
\begin{tikzpicture}[node distance=4cm]
\node(clientA)[startstop]{Mobile Client A};
\node(clientB)[startstop, right of=clientA, xshift=8cm]{Mobile Client B};
\node(haA)[ha, above of=clientA, minimum height=3cm]{Health Authority A};
\node(dsA)[database, above of=haA, database radius=0.8cm,database segment height=0.25cm]{};
\node(dsAT)[below of=dsA, yshift=3cm]{Datastore A};
\draw [<->] (clientA) -- node[anchor=south] {1. A and B exchange contact} (clientB);
\draw [->] (haA) -- node[anchor=west] {2. A tests positive, health authority issues an upload token} (clientA);
\draw [->] (clientA.west) -- ++(-1cm,0) |- (dsA) node[pos=0.25,sloped,above]{3. A transmits an anonymous report to health authority using token};
\draw [->] (dsA) -| node[above,pos=0.30] {4. B fetches reports from server, checking it's local database to find encounters} (clientB);
\end{tikzpicture}
\end{document}