Arrfab's blog - Ubnthttps://arrfab.net/2018-01-10T00:00:00+01:00Some tips and tricks, mostly around CentOSUsing a RaspberryPI3 as Unifi AP controller with CentOS 72018-01-10T00:00:00+01:002018-01-10T00:00:00+01:00Fabian Arrotintag:arrfab.net,2018-01-10:/posts/2018/Jan/10/using-a-raspberrypi3-as-unifi-ap-controller-with-centos-7/<p>That's something I should have blogged about earlier, but I almost forgot about it, until I read on twitter other people having replaced their home network equipment with Ubnt/Ubiquiti gear so I realized that it was on my to 'TOBLOG' list.</p>
<p>During the winter holidays, the whole family was at home, and also with kids on the WiFi network. Of course I already had a different wlan for them, separated/seggregated from the main one, but plenty of things weren't really working on that crappy device. So it was time to setup something else. I had opportunity to play with some <a href="https://www.ubnt.com/">Ubiquiti</a> devices in the past, so finding even an old <a href="https://www.ubnt.com/unifi/unifi-ap/">Unifi UAP model</a> was enough for my needs (just need Access Point, routing/firewall being done on something else).</p>
<p>If you've already played with those tools, you know that you need a controller to setup the devices up , and because it's 'only' a java/mongodb stack, I thought it would be trivial to setup on a low-end device like <a href="https://www.raspberrypi.org/">RaspberryPi3</a> (not limited to that , so all armhfp boards on which you can run CentOS would work)</p>
<p>After having installed <a href="http://mirror.centos.org/altarch/7/isos/armhfp/">CentOS 7 armhfp minimal</a> on the device, and once …</p><p>That's something I should have blogged about earlier, but I almost forgot about it, until I read on twitter other people having replaced their home network equipment with Ubnt/Ubiquiti gear so I realized that it was on my to 'TOBLOG' list.</p>
<p>During the winter holidays, the whole family was at home, and also with kids on the WiFi network. Of course I already had a different wlan for them, separated/seggregated from the main one, but plenty of things weren't really working on that crappy device. So it was time to setup something else. I had opportunity to play with some <a href="https://www.ubnt.com/">Ubiquiti</a> devices in the past, so finding even an old <a href="https://www.ubnt.com/unifi/unifi-ap/">Unifi UAP model</a> was enough for my needs (just need Access Point, routing/firewall being done on something else).</p>
<p>If you've already played with those tools, you know that you need a controller to setup the devices up , and because it's 'only' a java/mongodb stack, I thought it would be trivial to setup on a low-end device like <a href="https://www.raspberrypi.org/">RaspberryPi3</a> (not limited to that , so all armhfp boards on which you can run CentOS would work)</p>
<p>After having installed <a href="http://mirror.centos.org/altarch/7/isos/armhfp/">CentOS 7 armhfp minimal</a> on the device, and once logged, I just had to add the mandatory <a href="https://wiki.centos.org/SpecialInterestGroup/AltArch/Arm32#head-f2a772703b3caa90cc284e01bc87423ce9a87bcd">unofficial epel repository</a> for mongodb </p>
<div class="highlight"><pre><span></span><span class="nv">cat</span> <span class="o">></span> <span class="o">/</span><span class="nv">etc</span><span class="o">/</span><span class="nv">yum</span>.<span class="nv">repos</span>.<span class="nv">d</span><span class="o">/</span><span class="nv">epel</span>.<span class="nv">repo</span> <span class="o"><<</span> <span class="nv">EOF</span>
[<span class="nv">epel</span>]
<span class="nv">name</span><span class="o">=</span><span class="nv">Epel</span> <span class="nv">rebuild</span> <span class="k">for</span> <span class="nv">armhfp</span>
<span class="nv">baseurl</span><span class="o">=</span><span class="nv">https</span>:<span class="o">//</span><span class="nv">armv7</span>.<span class="nv">dev</span>.<span class="nv">centos</span>.<span class="nv">org</span><span class="o">/</span><span class="nv">repodir</span><span class="o">/</span><span class="nv">epel</span><span class="o">-</span><span class="nv">pass</span><span class="o">-</span><span class="mi">1</span><span class="o">/</span>
<span class="nv">enabled</span><span class="o">=</span><span class="mi">1</span>
<span class="nv">gpgcheck</span><span class="o">=</span><span class="mi">0</span>
<span class="nv">EOF</span>
</pre></div>
<p>After that, just installed what's required to run the application :</p>
<div class="highlight"><pre><span></span><span class="n">yum</span> <span class="n">install</span> <span class="n">mongodb</span> <span class="n">mongodb</span><span class="o">-</span><span class="n">server</span> <span class="n">java</span><span class="o">-</span><span class="mi">1</span><span class="p">.</span><span class="mi">8</span><span class="p">.</span><span class="mi">0</span><span class="o">-</span><span class="n">openjdk</span><span class="o">-</span><span class="n">headless</span> <span class="o">-</span><span class="n">y</span>
</pre></div>
<p>The "interesting" part is that now Ubnt only provides .deb packages , so we just have to download/extract what we need (it's all java code) and start it : </p>
<div class="highlight"><pre><span></span><span class="n">tmp_dir</span><span class="o">=</span><span class="err">$</span><span class="p">(</span><span class="n">mktemp</span> <span class="o">-</span><span class="n">d</span><span class="p">)</span>
<span class="n">cd</span> <span class="err">$</span><span class="n">tmp_dir</span>
<span class="n">curl</span> <span class="o">-</span><span class="n">O</span> <span class="n">http</span><span class="p">:</span><span class="o">//</span><span class="n">dl</span><span class="p">.</span><span class="n">ubnt</span><span class="p">.</span><span class="n">com</span><span class="o">/</span><span class="n">unifi</span><span class="o">/</span><span class="mi">5</span><span class="p">.</span><span class="mi">6</span><span class="p">.</span><span class="mi">26</span><span class="o">/</span><span class="n">unifi_sysvinit_all</span><span class="p">.</span><span class="n">deb</span>
<span class="n">ar</span> <span class="n">vx</span> <span class="n">unifi_sysvinit_all</span><span class="p">.</span><span class="n">deb</span>
<span class="n">tar</span> <span class="n">xvf</span> <span class="k">data</span><span class="p">.</span><span class="n">tar</span><span class="p">.</span><span class="n">xz</span>
<span class="n">mv</span> <span class="n">usr</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">unifi</span><span class="o">/</span> <span class="o">/</span><span class="n">opt</span><span class="o">/</span><span class="n">UniFi</span>
<span class="n">cd</span> <span class="o">/</span><span class="n">opt</span><span class="o">/</span><span class="n">UniFi</span><span class="o">/</span><span class="n">bin</span>
<span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">rm</span> <span class="o">-</span><span class="n">Rf</span> <span class="err">$</span><span class="n">tmp_dir</span>
<span class="n">ln</span> <span class="o">-</span><span class="n">s</span> <span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">mongod</span>
</pre></div>
<p>You can start it "by hand" but let's create a simple systemd file and use it directly :</p>
<div class="highlight"><pre><span></span><span class="n">cat</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">systemd</span><span class="o">/</span><span class="k">system</span><span class="o">/</span><span class="n">unifi</span><span class="p">.</span><span class="n">service</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">EOF</span><span class="w"></span>
<span class="o">[</span><span class="n">Unit</span><span class="o">]</span><span class="w"></span>
<span class="n">Description</span><span class="o">=</span><span class="n">UBNT</span><span class="w"> </span><span class="n">UniFi</span><span class="w"> </span><span class="n">Controller</span><span class="w"></span>
<span class="k">After</span><span class="o">=</span><span class="n">syslog</span><span class="p">.</span><span class="n">target</span><span class="w"> </span><span class="n">network</span><span class="p">.</span><span class="n">target</span><span class="w"></span>
<span class="o">[</span><span class="n">Service</span><span class="o">]</span><span class="w"></span>
<span class="n">WorkingDirectory</span><span class="o">=/</span><span class="n">opt</span><span class="o">/</span><span class="n">UniFi</span><span class="w"></span>
<span class="n">ExecStart</span><span class="o">=/</span><span class="n">usr</span><span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">java</span><span class="w"> </span><span class="o">-</span><span class="n">jar</span><span class="w"> </span><span class="o">/</span><span class="n">opt</span><span class="o">/</span><span class="n">UniFi</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">ace</span><span class="p">.</span><span class="n">jar</span><span class="w"> </span><span class="k">start</span><span class="w"></span>
<span class="n">ExecStop</span><span class="o">=/</span><span class="n">usr</span><span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">java</span><span class="w"> </span><span class="o">-</span><span class="n">jar</span><span class="w"> </span><span class="o">/</span><span class="n">opt</span><span class="o">/</span><span class="n">UniFi</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">ace</span><span class="p">.</span><span class="n">jar</span><span class="w"> </span><span class="n">stop</span><span class="w"></span>
<span class="o">[</span><span class="n">Install</span><span class="o">]</span><span class="w"></span>
<span class="n">WantedBy</span><span class="o">=</span><span class="n">multi</span><span class="o">-</span><span class="k">user</span><span class="p">.</span><span class="n">target</span><span class="w"></span>
<span class="n">EOF</span><span class="w"></span>
<span class="n">systemctl</span><span class="w"> </span><span class="n">daemon</span><span class="o">-</span><span class="n">reload</span><span class="w"></span>
<span class="n">systemctl</span><span class="w"> </span><span class="n">enable</span><span class="w"> </span><span class="n">unifi</span><span class="w"> </span><span class="c1">--now</span>
</pre></div>
<p>Don't forget that :</p>
<ul>
<li>it's "Java"</li>
<li>running on slow armhfp processor</li>
</ul>
<p>So that will take time to initialize. You can follow progress in /opt/UniFi/logs/server.log and wait for the TLS port to be opened : </p>
<div class="highlight"><pre><span></span><span class="k">while</span> <span class="nv">true</span> <span class="c1">; do sleep 1 ; ss -tanp|grep 8443 && break ; done</span>
</pre></div>
<p>Dont forget to open the needed ports for firewall and you can then reach the Unifi controller running on your armhfp board.</p>