If your surveillance camera can upload recordings by FTP, the clean ZimaOS design is to run an FTP server in Docker and map only a dedicated camera-recordings folder into that container. Give each camera its own restricted account or subfolder, use passive mode correctly, and keep the FTP service on the trusted LAN.
The source user eventually got VSFTPD working, but the thread stopped before a reusable configuration was documented. Current ZimaOS documentation now explicitly lists FTP among file-sharing use cases, so the useful article is a complete camera-to-NAS workflow rather than a recap of the user's trial and error.
Choose the Recording Folder First
Create a dedicated storage location such as:
/DATA/Surveillance/Camera01
Keep camera footage away from the small system disk. If you use RAID, place the recordings on the storage pool that has the capacity and redundancy you want.
Use a Containerized FTP Server
Run VSFTPD or another maintained FTP server in Docker rather than modifying the ZimaOS host. Map the camera folder into the container and expose TCP port 21 plus a small passive-port range.
The current ZimaOS installation guide lists FTP as one of the supported file-sharing patterns after installation.
Why Passive Ports Matter
FTP uses a control connection and a separate data connection. Many camera uploads fail because port 21 works but the passive data ports are blocked or not published from Docker.
Pick a narrow range such as 21000-21010, publish that same range from the container, and configure VSFTPD to advertise the ZimaOS LAN IP.
Create a Restricted Camera Account
Do not let an IP camera log in with a general NAS administrator account. Give it access only to the recording folder it needs.
If you have multiple cameras, separate credentials or folders make retention and troubleshooting easier.
Test with a Normal FTP Client Before the Camera
From another computer on the LAN, connect using the same server IP, username, password, and passive-mode settings. Upload a small file and verify it appears in the mapped ZimaOS folder.
If a desktop FTP client works but the camera fails, the remaining problem is likely camera-side FTP behavior rather than Docker storage permissions.
Check Docker Folder Permissions
The container must be able to create files in the mapped recording folder. If the camera authenticates but receives write errors, inspect ownership and permissions on the host path.
Avoid solving permissions with broad 777 access. Give the FTP service only the write permissions it needs.
Keep FTP on the LAN
Classic FTP does not encrypt credentials or file transfers. Do not port-forward a camera FTP server directly to the public internet.
If the camera supports FTPS or SFTP, those are stronger choices. If it supports only FTP, isolate it on the LAN or camera VLAN and restrict which clients can reach the service.
Plan Retention Before the Disk Fills
Cameras generate data continuously. Estimate daily recording volume, set the camera's own retention/overwrite policy if available, or use a scheduled cleanup process that removes files older than a defined age.
The storage and backup overview is useful when deciding which recordings actually need a second copy.
When an NVR App Is Better Than FTP
FTP is simple archival storage. If you need timelines, motion events, object detection, live view, or multi-camera search, use an NVR application instead. Current ZimaOS App Store documentation includes camera/NVR workloads as a first-class media-server use case.
FAQ
What ports does an FTP camera need?
Usually TCP 21 plus the passive data-port range configured on the FTP server. The exact range is your choice as long as Docker, firewall, and server configuration match.
Can I save footage straight to RAID?
Yes. Map a folder on the RAID-backed storage into the FTP container and verify write permissions.
Should I expose FTP to the internet?
No. Keep plain FTP on a trusted LAN or isolated camera network.
Do I need Kerberos.io just to archive camera files?
No. If the camera already knows how to upload clips by FTP, a simple FTP server is enough for basic archival storage.
