
Pokretanje FTP servera u Docker kontejneru — zašto i kako
FTP server u Docker kontejneru omogućava izolovano, prenosivo i automatizovano okruženje za razmenu fajlova. Ovaj vodič objašnjava zašto kontejnerizovati FTP server, kako izabrati između popularnih implementacija (vsftpd, ProFTPD), kako postaviti trajne volumene i ispravne dozvole, te daje pregled opcija za FTPS (TLS) i mrežne režime (bridge, host, macvlan). Cilj je da čitaoci — od početnika do DevOps inženjera — dobiju praktične smernice pre nego što pređu na Dockerfile i Docker Compose primere u narednim delovima.
Zašto kontejnerizovati FTP server i očekivani ishod
Kontejnerizacija donosi nekoliko prednosti:
- Izolacija servisa i lakše upravljanje verzijama FTP softvera.
- Reprodukovano okruženje između razvojnih, test i produkcijskih sistema.
- Jednostavno skaliranje i integracija u CI/CD pipeleine.
Očekivani rezultat: funkcionalan FTP server u kontejneru koji čuva podatke izvan kontejnera (trajni volumen), koristi šifrovani prenos (FTPS) kod produkcije i radi u mrežnom režimu koji odgovara infrastrukturi.
Izbor FTP softvera: vsftpd naspram ProFTPD
Izbor FTP implementacije utiče na sigurnost, performanse i mogućnosti konfiguracije. Dve najčešće opcije su vsftpd i ProFTPD.
vsftpd — lean i siguran
- Prednosti: jednostavna konfiguracija, fokus na sigurnost i performanse.
- Nedostaci: manje fleksibilnosti u kompleksnim konfiguracijama (virtuelni korisnici, modulacija).
- Preporuka: kada je prioritet sigurnost i lakša konfiguracija.
ProFTPD — fleksibilnost i extensibility
- Prednosti: vrlo konfigurisiv, podrška za mnoge module i napredne opcije (LDAP, virtual hosting).
- Nedostaci: složenija konfiguracija i potencijalno veći attack surface.
- Preporuka: kada su potrebne kompleksne politike pristupa ili integracije sa drugim sistemima.
U kontejnerima je uobičajeno koristiti zvanične ili minimalne base image-e i instalirati samo potrebne pakete. Primer instalacije na Ubuntu Server (izvan kontejnera):
# Na Ubuntu/Debian (zahteva sudo/root)
sudo apt update
sudo apt install -y vsftpd # instalira vsftpd
sudo apt install -y proftpd-basic # instalira ProFTPD (ako je potreban)
Objasnjenje: prvi red ažurira listu paketa; naredne dve linije instaliraju jedan od FTP servera. U kontejneru će se umesto ovoga obično koristiti Dockerfile koji radi iste korake.
Trajni volumeni i pravilne dozvole za fajl sistem
Podaci FTP servera moraju preživeti restart kontejnera — zato se koriste Docker volumeni ili bind mount-ovi. Izbor zavisi od potreba za kontrolom i backup-om.
- Docker volume: upravlja Docker-om, lak za backup pomoću docker CLI.
- Bind mount (host putanja): direktna kontrola nad fajlovima i dozvolama na hostu.
Primer kreiranja volumena i host direktorijuma (na većini Linux distribucija; zahteva sudo/root):
# Kreira named Docker volume
sudo docker volume create ftp_data
# Ili kreira host direktorijum i postavlja vlasništvo za korisnika 'ftpuser' (zameniti sa stvarnim UID/GID)
sudo mkdir -p /srv/ftp/uploads
sudo chown 1000:1000 /srv/ftp/uploads
sudo chmod 750 /srv/ftp/uploads
Objasnjenje: prvi komad pravi Docker volume; drugi blok kreira direktorijum na hostu, menja vlasnika na UID/GID 1000 (placeholder za korisnika iz kontejnera) i postavlja permisije. U RHEL/AlmaLinux sa SELinux-om, potreban je dodatni korak za kontekst:
# Na RHEL/CentOS/AlmaLinux (zahteva sudo/root)
sudo chcon -Rt svirt_sandbox_file_t /srv/ftp/uploads
Objasnjenje: chcon podešava SELinux kontekst kako bi kontejner mogao pristupiti host fajlovima. Alternativa je korišćenje :Z opcije kod bind mount-a u Docker run/Compose.
Sledeći deo vodiča sadržaće praktične Dockerfile i Docker Compose primere, detaljnu konfiguraciju FTPS (TLS certifikati) i konkretne mrežne postavke za bridge, host i macvlan, uključujući mapiranje pasivnih portova i NAT/port-forwarding smernice.
Podešavanje FTPS (TLS) — generisanje sertifikata i konfiguracija
Za produkciju je neophodno šifrovati FTP sesije koristeći FTPS (FTP over TLS). Osnovni koraci: generisanje sertifikata, montiranje sertifikata u kontejner i podešavanje konfiguracionih fajlova.
Brzi primer samo-potpisanog sertifikata (test okruženje):
# Na hostu (ili u Docker build procesu)
openssl req -x509 -nodes -days 365
-newkey rsa:2048
-keyout ftp.key
-out ftp.crt
-subj "/CN=ftp.example.com"
Montirajte ftp.crt i ftp.key u kontejner na bezbednu lokaciju (/etc/ssl/private/). Primer vsftpd konfiguracionih opcija:
# vsftpd.conf
ssl_enable=YES
rsa_cert_file=/etc/ssl/private/ftp.crt
rsa_private_key_file=/etc/ssl/private/ftp.key
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
require_ssl_reuse=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
Za ProFTPD koristite mod_tls:
# proftpd.conf (ili mods-enabled/tls.conf)
TLSEngine on
TLSLog /var/log/proftpd/tls.log
TLSProtocol TLSv1.2 TLSv1.3
TLSRSACertificateFile /etc/ssl/private/ftp.crt
TLSRSACertificateKeyFile /etc/ssl/private/ftp.key
TLSVerifyClient off
TLSRequired on
Ako koristite javno važeći sertifikat (Let’s Encrypt), automatizujte proces sa certbot-om na hostu i montirajte /etc/letsencrypt live direktorijum u kontejner. Nakon obnove sertifikata potrebno je reload-ovati FTP servis u kontejneru — to možete automatizovati webhook-om ili certbot deploy-hook-om koji pokreće docker exec ili docker-compose restart.
Dockerfile i Docker Compose primeri za vsftpd i ProFTPD
Minimalni Dockerfile za vsftpd (Debian-based):
FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y vsftpd && rm -rf /var/lib/apt/lists/*
COPY vsftpd.conf /etc/vsftpd.conf
COPY entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/entrypoint.sh
VOLUME /home/ftp
EXPOSE 21 30000-30009
CMD ["/usr/local/bin/entrypoint.sh"]
Primer docker-compose.yml za vsftpd (bind mount + named volume za podatke; pasivni port range 30000-30009):
version: '3.8'
services:
ftp:
build: .
image: my-vsftpd
container_name: ftp-server
ports:
- "21:21"
- "30000-30009:30000-30009"
volumes:
- ./vsftpd.conf:/etc/vsftpd.conf:ro
- ./certs:/etc/ssl/private:ro
- ftp_data:/home/ftp
restart: unless-stopped
volumes:
ftp_data:
Za ProFTPD je isti princip — zamena paketa i konfiguracionih fajlova; obratite pažnju na logove i ownership direktorijuma za virtuelne korisnike.
Mrežne opcije i mapiranje pasivnih portova (bridge, host, macvlan)
FTP (pogotovo pasivni režim) zahteva dodatno mapiranje portova i ispravnu eksternu IP adresu u konfiguraciji:
- bridge (podrazumevano): mapirajte port 21 i opseg pasivnih portova (npr. 30000-30009). U vsftpd podesite pasv_address= i pasv_min_port/pasv_max_port.
- host: kontejner deli mrežni stack hosta — nije potrebno mapiranje portova, ali obratite pažnju na konflikt portova i bezbednost.
- macvlan: daje kontejneru sopstvenu IP adresu na mreži. Dobro za kada želite da FTP server bude direktno dostupan bez NAT-a. Napomena: host i kontejner ne mogu komunicirati direktno po defaultu; treba kreirati macvlan sub-interface ili koristiti bridge za upravljanje.
Primer vsftpd opcija za pasivne portove:
# vsftpd.conf
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=30009
pasv_address=203.0.113.10 # javni IP ili domain koji rutuju do hosta
Ne zaboravite firewall i router: otvorite TCP port 21 i opseg 30000-30009 za ulazne konekcije i prosledite ih do hosta (NAT). Takođe, za SELinux koristite :Z kod bind mount-a ili chcon kako je ranije objašnjeno. U sledećem delu prikazaćemo napredne Docker Compose mrežne primere i skripte za automatsko osvežavanje sertifikata i korisničkih promena u CI/CD okruženju.
Operativne smernice i naredni koraci
Ovo poslednje poglavlje daje praktične smernice za prelazak sa eksperimentisanja na stabilno, održivo i bezbedno produkcijsko okruženje za FTP u kontejnerima. Fokusirajte se na automatizaciju, monitoring, backup i strogu politiku pristupa pre puštanja u rad.
Automatizacija i CI/CD integracija
- Ugradite build i test korake u CI pipeline: automatsko građenje image-a, statička provera konfiguracija i pokretanje linters-a za skripte.
- Koristite docker-compose ili Kubernetes manifest-e za deployment; držite konfiguracije u verzionom sistemu (secrets van repoa ili kroz secret manager).
- Automatizujte osvežavanje sertifikata (Let’s Encrypt) sa deploy-hook-om koji poziva docker exec/docker-compose restart ili reload servis-a bez ručnog intervencionisanja.
Monitoring i logovanje
- Eksportujte i centralizujte logove kontejnera (stdout/stderr ili fajlovi) u ELK/EFK ili sličan sistem radi lakšeg debug-a i audit-a.
- Primenite nadzor dostupnosti i osnovne metričke nadzore (network throughput, broj konekcija, greške prijave) putem Prometheus/Grafana ili cloud rešenja.
- Konfigurišite alerting za neuspešne obnove sertifikata, nagli porast neuspelih prijava i prekid konekcija.
Backup, obnova i konsistentnost podataka
- Planirajte regularne bekape volumena ili bind-mount direktorijuma; testirajte proceduru restore-a pre nego što to bude potrebno u incidentu.
- Za critical data koristite snapshot-ove ili replikaciju na nivou fajl-sistema/objektnog skladišta.
- Automatski testirajte integritet i pristup backup-ima kao deo rutina održavanja.
Sigurnosne preporuke
- Isključite nepotrebne protokole i stari TLS/SSL; forsirajte TLSv1.2/1.3 i jake cipher-suite-ove.
- Koristite najmanje privilegovane korisničke naloge, ograničite pristup direktorijumima i primenite chroot kada je moguće.
- Izolujući FTP servis u sopstvenom mrežnom opsegu i ograničite pristup firewall pravilima (ipset, security groups, iptables).
- Redovno ažurirajte base image-e i FTP softver radi zakrpa bezbednosti; razmislite o automatizovanim scanning alatima u CI.
Mrežne opcije i skalabilnost
- Za jednostavne postavke NAT/bridge je često dovoljan; za direktnu dostupnost i determinističke IP adrese koristi se macvlan.
- Ako očekujete veliki broj simultanih konekcija, testirajte performanse pasivnog port range-a i optimizujte kernel/tcp parametre na hostu.
- Razmotrite load balancing na nivou TCP (NAT/HAProxy) ili distribuiranje sadržaja na backend skladišta umesto direktnog skaliranja FTP servisa.
Testiranje i validacija
- Automatizujte end-to-end testove koji proveravaju TLS handshake, pasivni/aktivni režim, prava pristupa i performanse prenosa.
- Uvedite pen-testing i skeniranje ranjivosti kao deo rutine pre i posle promena konfiguracije.
- Dokumentujte procedure za rollback i testirajte ih redovno.
Uvođenje FTP servisa u Docker okruženje zahteva više od osnovne konfiguracije — potrebno je planiranje operacija, bezbednosti i automatizacije. Ako dodatno uvezete ove smernice u svoj DevOps proces, dobićete pouzdan i održiv servis koji se lako integriše u postojeću infrastrukturu.
