I got an Eufy E220 camera working on a public WordPress page, while still keeping the actual recordings on the Eufy HomeBase 3 / S380.
Home Assistant is not in the actual video path yet.
The final video path is:
Eufy E220 → RTSP → go2rtc → Caddy reverse proxy → HTTPS subdomain → WordPress iframe
Eufy setup
The important part for my Eufy E220 was the configuration order.
What worked for me:
1. Insert a microSD card into the Eufy E220
2. Add the camera first as a standalone camera
3. Enable continuous / 24/7 recording
4. Then link the camera to the HomeBase 3
After that, continuous recording remained active in my setup, but the relevant recordings were stored on the HomeBase 3 instead of the microSD card.
I would treat this as a practical workaround/configuration order rather than a guaranteed official feature. It may depend on firmware and app version.
RTSP
In the Eufy app I enabled NAS/RTSP for the E220.
The RTSP URL looks like this:
rtsp://USER:[email protected]:554/live0
I also reserved a fixed DHCP address for the camera, so the RTSP URL does not break when the camera reconnects.
go2rtc
go2rtc runs in Docker on a small Ubuntu machine.
My go2rtc configuration is roughly:
streams:
eufy_e220:
- "rtsp://USER:[email protected]:554/live0"
- "ffmpeg:eufy_e220#audio=opus"
webrtc:
candidates:
- camera.example.com:8555
The second line is used to provide Opus audio for WebRTC compatibility.
Caddy reverse proxy
Caddy is used as HTTPS reverse proxy in front of go2rtc.
Example Caddyfile:
camera.example.com {
reverse_proxy 127.0.0.1:1984
}
Caddy handles HTTPS automatically.
Router forwarding
The following ports are forwarded to the Ubuntu machine:
TCP 80 → Ubuntu machine port 80
TCP 443 → Ubuntu machine port 443
TCP 8555 → Ubuntu machine port 8555
UDP 8555 → Ubuntu machine port 8555
Port 80/443 are for Caddy and HTTPS. Port 8555 TCP/UDP is used by go2rtc WebRTC.
WordPress embed
The WordPress page uses a simple iframe:
<iframe
src="https://camera.example.com/webrtc.html?src=eufy_e220"
width="800"
height="450"
style="border:0; max-width:100%;"
allow="autoplay; fullscreen">
</iframe>
The stream takes about 5–10 seconds to appear, but after that it runs reliably.