<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.jb-vpn.uk/index.php?action=history&amp;feed=atom&amp;title=OpenVPN%3AWeb_Admin</id>
	<title>OpenVPN:Web Admin - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.jb-vpn.uk/index.php?action=history&amp;feed=atom&amp;title=OpenVPN%3AWeb_Admin"/>
	<link rel="alternate" type="text/html" href="https://wiki.jb-vpn.uk/index.php?title=OpenVPN:Web_Admin&amp;action=history"/>
	<updated>2026-10-16T18:47:48Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.44.5</generator>
	<entry>
		<id>https://wiki.jb-vpn.uk/index.php?title=OpenVPN:Web_Admin&amp;diff=271&amp;oldid=prev</id>
		<title>Josh: Document OpenVPN VPN-only web admin and monitor UIs</title>
		<link rel="alternate" type="text/html" href="https://wiki.jb-vpn.uk/index.php?title=OpenVPN:Web_Admin&amp;diff=271&amp;oldid=prev"/>
		<updated>2026-10-16T15:30:11Z</updated>

		<summary type="html">&lt;p&gt;Document OpenVPN VPN-only web admin and monitor UIs&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Two web UIs run on this VPS for managing and monitoring OpenVPN. Both listen only on the VPN address &amp;lt;code&amp;gt;10.8.0.1&amp;lt;/code&amp;gt; — they are &amp;#039;&amp;#039;&amp;#039;not&amp;#039;&amp;#039;&amp;#039; exposed via Caddy or the public internet.&lt;br /&gt;
&lt;br /&gt;
== Access (connect to VPN first) ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| UI || URL || Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;ovpn-admin&amp;#039;&amp;#039;&amp;#039; || http://10.8.0.1:8085 || Create / revoke / download &amp;lt;code&amp;gt;.ovpn&amp;lt;/code&amp;gt;, CCD/static IPs, live connection flags&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;openvpn-monitor&amp;#039;&amp;#039;&amp;#039; || http://10.8.0.1:8086 || Live clients, session history, traffic charts&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
There is &amp;#039;&amp;#039;&amp;#039;no login&amp;#039;&amp;#039;&amp;#039; on either UI. Anyone connected to the VPN can reach them.&lt;br /&gt;
&lt;br /&gt;
== Services ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Component || How it runs&lt;br /&gt;
|-&lt;br /&gt;
| ovpn-admin || systemd &amp;lt;code&amp;gt;ovpn-admin.service&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;/opt/ovpn-admin/ovpn-admin&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| openvpn-monitor || Docker Compose in &amp;lt;code&amp;gt;/var/www/openvpn-monitor&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;docker-compose.vpn-only.yml&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| OpenVPN management || &amp;lt;code&amp;gt;127.0.0.1:8989&amp;lt;/code&amp;gt; (localhost only)&lt;br /&gt;
|-&lt;br /&gt;
| Status log || &amp;lt;code&amp;gt;/var/log/openvpn-status.log&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;status-version 1&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| Status log perms || &amp;lt;code&amp;gt;openvpn-status-perms.service&amp;lt;/code&amp;gt; sets mode &amp;lt;code&amp;gt;644&amp;lt;/code&amp;gt; after OpenVPN start&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Useful commands:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;lang-bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl status ovpn-admin openvpn-server@server&lt;br /&gt;
docker compose -f /var/www/openvpn-monitor/docker-compose.vpn-only.yml ps&lt;br /&gt;
journalctl -u ovpn-admin -f&lt;br /&gt;
tail -f /var/log/ovpn-admin-easyrsa.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Creating a client (preferred: UI) ==&lt;br /&gt;
&lt;br /&gt;
# Connect to VPN and open http://10.8.0.1:8085&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Add user&amp;#039;&amp;#039;&amp;#039; → enter a client name (letters, numbers, underscore)&lt;br /&gt;
# Download the &amp;lt;code&amp;gt;.ovpn&amp;lt;/code&amp;gt; (Show config / download)&lt;br /&gt;
# Optional: set a static IP under CCD (see caveats below)&lt;br /&gt;
&lt;br /&gt;
Downloaded profiles are &amp;#039;&amp;#039;&amp;#039;full-tunnel&amp;#039;&amp;#039;&amp;#039; by default (&amp;lt;code&amp;gt;redirect-gateway&amp;lt;/code&amp;gt; + host DNS), with &amp;lt;code&amp;gt;tls-crypt&amp;lt;/code&amp;gt; matching the server.&lt;br /&gt;
&lt;br /&gt;
== Backup create path (CLI) ==&lt;br /&gt;
&lt;br /&gt;
[/root/openvpn-install.sh &amp;lt;code&amp;gt;/root/openvpn-install.sh&amp;lt;/code&amp;gt;] remains available if the UI cannot create a cert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;lang-bash&amp;quot;&amp;gt;&lt;br /&gt;
bash /root/openvpn-install.sh&lt;br /&gt;
# choose &amp;quot;Add a new client&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CCD / static IPs ==&lt;br /&gt;
&lt;br /&gt;
Existing CCD files live in &amp;lt;code&amp;gt;/etc/openvpn/ccd/&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Client || Address&lt;br /&gt;
|-&lt;br /&gt;
| StrawberryNAS || &amp;lt;code&amp;gt;10.8.0.2&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| jb-rpi2-webserver || &amp;lt;code&amp;gt;10.8.0.3&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| jb-rpi-homeassistant || &amp;lt;code&amp;gt;10.8.0.4&amp;lt;/code&amp;gt; (uses &amp;lt;code&amp;gt;push-reset&amp;lt;/code&amp;gt; + custom routes)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The UI CCD editor can rewrite these files to a simpler &amp;lt;code&amp;gt;ifconfig-push … 255.255.255.0&amp;lt;/code&amp;gt; form. After editing NAS/Pi CCD in the UI, verify:&lt;br /&gt;
&lt;br /&gt;
* https://plex.jb-vpn.uk and https://dsm.jb-vpn.uk still work&lt;br /&gt;
&lt;br /&gt;
* Client still gets the expected &amp;lt;code&amp;gt;10.8.0.x&amp;lt;/code&amp;gt; address&lt;br /&gt;
&lt;br /&gt;
Dynamic pool remains &amp;lt;code&amp;gt;10.8.0.51&amp;lt;/code&amp;gt;–&amp;lt;code&amp;gt;10.8.0.254&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Revoke ==&lt;br /&gt;
&lt;br /&gt;
Revoke in the UI. The Easy-RSA wrapper syncs &amp;lt;code&amp;gt;pki/crl.pem&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;/etc/openvpn/server/crl.pem&amp;lt;/code&amp;gt;. Revoked clients fail on &amp;#039;&amp;#039;&amp;#039;next reconnect&amp;#039;&amp;#039;&amp;#039; (sessions are not force-killed).&lt;br /&gt;
&lt;br /&gt;
== Layout on disk ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/ovpn-admin/&lt;br /&gt;
  ovpn-admin                 # binary&lt;br /&gt;
  easyrsa-wrapper            # injects --batch/--days=3650; syncs CRL&lt;br /&gt;
  templates/client.conf.tpl  # tls-crypt full-tunnel client template&lt;br /&gt;
&lt;br /&gt;
/etc/openvpn/server/easy-rsa/pki/ta.key  → symlink to ../tc.key  (for ovpn-admin TLS template field)&lt;br /&gt;
&lt;br /&gt;
/var/www/openvpn-monitor/    # farggus/openvpn-monitor checkout + compose&lt;br /&gt;
/root/backups/openvpn-*/     # PKI/CCD backups taken before install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Related Documentation ==&lt;br /&gt;
&lt;br /&gt;
* [[OpenVPN:User Management|OpenVPN:User Management]]&lt;br /&gt;
&lt;br /&gt;
* [[OpenVPN:Server Configuration|OpenVPN:Server Configuration]]&lt;br /&gt;
&lt;br /&gt;
* [[Documentation:Certificate-Management|OpenVPN:Certificate Management]]&lt;br /&gt;
&lt;br /&gt;
* [[Services:Current Services|Services:Current Services]]&lt;br /&gt;
&lt;br /&gt;
== Do not ==&lt;br /&gt;
&lt;br /&gt;
* Add a public Caddy site for these ports&lt;br /&gt;
&lt;br /&gt;
* Bind the UIs to &amp;lt;code&amp;gt;0.0.0.0&amp;lt;/code&amp;gt; / the public NIC&lt;br /&gt;
&lt;br /&gt;
* Remove &amp;lt;code&amp;gt;openvpn-install.sh&amp;lt;/code&amp;gt; (kept as backup)&lt;br /&gt;
&lt;br /&gt;
== Smoke-check after OpenVPN restart ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;lang-bash&amp;quot;&amp;gt;&lt;br /&gt;
# Live clients via management&lt;br /&gt;
(echo status; sleep 0.2; echo quit) | nc -w 2 127.0.0.1 8989&lt;br /&gt;
&lt;br /&gt;
# Admin + monitor&lt;br /&gt;
curl -s http://10.8.0.1:8085/api/users/list | head&lt;br /&gt;
curl -s http://10.8.0.1:8086/api/clients | head&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Documentation]]&lt;br /&gt;
[[Category:Documentation/OpenVPN]]&lt;/div&gt;</summary>
		<author><name>Josh</name></author>
	</entry>
</feed>