WordPress na Coolify: Kompletny przewodnik po konfiguracji z SSH, SFTP, WP-CLI i zarządzaniem zasobami [2026]
![WordPress na Coolify: Kompletny przewodnik po konfiguracji z SSH, SFTP, WP-CLI i zarządzaniem zasobami [2026]](https://important.is/wp-content/uploads/2026/03/wordpress-na-coolify-kompletny-przewodnik-po-konfiguracji-z-ssh-sftp-wp-cli-i-zarzadzaniem-zasobami.webp)
Coolify to open-source’owa platforma do self-hostingu aplikacji — alternatywa dla Vercel, Heroku czy tradycyjnych paneli typu cPanel i DirectAdmin. W tym przewodniku pokazuję krok po kroku, jak skonfigurować profesjonalne środowisko WordPress na Coolify z pełnym dostępem developerskim.
Artykuł powstał na podstawie rzeczywistego wdrożenia produkcyjnego na serwerze Hetzner — opisuję każdy problem, który napotkałem, i jak go rozwiązałem.
Czego dowiesz się z tego artykułu?
- Jak wygląda architektura WordPress na Coolify vs tradycyjny hosting
- Jak zarządzać zasobami (RAM, CPU) w kontenerach Docker
- Jak skonfigurować SSH/SFTP z izolowanym dostępem per developer
- Jak dodać WP-CLI dostępny przez SSH
- Jak ustawić wyższe limity PHP (upload, pamięć, czas wykonania)
- Jakie problemy napotkałem i jak je rozwiązałem
- Plusy i minusy WordPress na Coolify vs klasyczny hosting
Potrzebujesz pomocy z tym tematem?
Pomagam firmom wdrażać nowoczesne rozwiązania. Umów bezpłatną 30-minutową rozmowę.
Umów bezpłatną rozmowę →
Coolify vs tradycyjny hosting WordPress — kluczowe różnice
Na tradycyjnym hostingu (cPanel, DirectAdmin, shared hosting) WordPress działa na współdzielonym serwerze z dziesiątkami lub setkami innych stron. Na Coolify każda aplikacja działa w izolowanym kontenerze Docker z własnymi zasobami.
| Aspekt | Coolify (Docker) | Shared hosting (cPanel/DirectAdmin) |
|---|---|---|
| Izolacja | Pełna — osobny kontener | Ograniczona — współdzielone zasoby |
| Zasoby (RAM/CPU) | Konfigurowalne limity per kontener | Współdzielona pula, „noisy neighbor” |
| Wydajność | ~320ms ładowanie strony | ~650ms ładowanie strony |
| SSH/SFTP | Wymaga konfiguracji (ten przewodnik) | Wbudowane |
| WP-CLI | Przez kontener helper | Wbudowane |
| PHP limity | Pełna kontrola | Ograniczone przez panel |
| Deployment | Git push → auto deploy | FTP / panel |
| SSL | Automatyczny (Let’s Encrypt) | Automatyczny lub ręczny |
| Koszt | ~5-15€/mies (VPS) + Twój czas | ~3-10€/mies, zero zarządzania |
| Skalowalność | Łatwe skalowanie horyzontalne | Ograniczone planem |
Zarządzanie zasobami: RAM, CPU i dysk
To jedna z największych zalet Coolify nad tradycyjnym hostingiem — masz pełną kontrolę nad zasobami każdego kontenera.
Limity zasobów w Docker Compose
W klasycznym Coolify WordPress nie ma wbudowanego UI do ustawiania limitów RAM/CPU per kontener. Musisz to zrobić ręcznie w docker-compose.yml:
services:
wordpress:
image: wordpress:latest
deploy:
resources:
limits:
cpus: '2.0'
memory: 2048M
reservations:
cpus: '1.0'
memory: 1024M
Co oznaczają te ustawienia:
limits.memory: 2048M— maksymalna ilość RAM. Przekroczenie = Docker zabija kontenerreservations.memory: 1024M— gwarantowane minimum RAMlimits.cpus: '2.0'— maksymalnie 2 rdzenie CPUreservations.cpus: '1.0'— gwarantowany 1 rdzeń
Uwaga: Bez ustawionych limitów kontenery mają nieograniczony dostęp do zasobów hosta — jeden kontener może „zjeść” całą pamięć serwera.
Monitoring zasobów
Coolify ma wbudowany Sentinel — lekki kontener monitorujący, który zbiera metryki CPU, RAM i dysku dla każdego kontenera. Możesz śledzić zużycie zasobów bezpośrednio w dashboardzie Coolify.
Minimalne wymagania serwera
| Zastosowanie | CPU | RAM | Dysk |
|---|---|---|---|
| Coolify + 1 WordPress | 2 rdzenie | 2 GB | 30 GB |
| Coolify + 3-5 WordPress | 4 rdzenie | 8 GB | 60 GB |
| Coolify + 10+ aplikacji | 8 rdzeni | 16 GB | 120 GB |
Docker Compose — kompletna konfiguracja
Poniżej pełny, przetestowany docker-compose.yml do wdrożenia w Coolify:
services:
wordpress:
image: wordpress:latest
volumes:
- wordpress-files:/var/www/html
- type: bind
source: ./uploads.ini
target: /usr/local/etc/php/conf.d/uploads.ini
content: |
file_uploads = On
upload_max_filesize = 512M
post_max_size = 512M
memory_limit = 512M
max_execution_time = 600
max_input_time = 600
max_input_vars = 10000
environment:
- WORDPRESS_DB_HOST=mariadb
- WORDPRESS_DB_USER=$SERVICE_USER_WORDPRESS
- WORDPRESS_DB_PASSWORD=$SERVICE_PASSWORD_WORDPRESS
- WORDPRESS_DB_NAME=wordpress
depends_on:
mariadb:
condition: service_healthy
healthcheck:
test: ["CMD-SHELL", "curl -sL http://localhost:80/ -o /dev/null -w '%{http_code}' | grep -qE '^[23]'"]
interval: 10s
timeout: 5s
retries: 5
start_period: 60s
mariadb:
image: mariadb:11
volumes:
- mariadb-data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=$SERVICE_PASSWORD_ROOT
- MYSQL_DATABASE=wordpress
- MYSQL_USER=$SERVICE_USER_WORDPRESS
- MYSQL_PASSWORD=$SERVICE_PASSWORD_WORDPRESS
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 5s
timeout: 20s
retries: 10
wpcli:
image: wordpress:cli
init: true
volumes:
- wordpress-files:/var/www/html
environment:
- WORDPRESS_DB_HOST=mariadb
- WORDPRESS_DB_USER=$SERVICE_USER_WORDPRESS
- WORDPRESS_DB_PASSWORD=$SERVICE_PASSWORD_WORDPRESS
- WORDPRESS_DB_NAME=wordpress
depends_on:
- wordpress
- mariadb
entrypoint: ["tail", "-f", "/dev/null"]
user: "0:0"
volumes:
wordpress-files:
mariadb-data:
Na co zwrócić uwagę w konfiguracji
1. Składnia content: — tworzenie plików w locie
Coolify ma specjalną składnię content:, która tworzy pliki automatycznie bez commitowania ich do repozytorium. Dzięki temu uploads.ini z limitami PHP jest generowany przy każdym deploy’u.
2. Zmienne środowiskowe Coolify
$SERVICE_USER_WORDPRESS i $SERVICE_PASSWORD_WORDPRESS — Coolify automatycznie generuje bezpieczne hasła do bazy danych. Nie musisz ich tworzyć ręcznie.
3. Healthcheck z obsługą redirectów
Standardowy healthcheck nie działa z WordPress, bo zwraca redirect 302 (np. na stronę instalacji). Flaga -L w curl podąża za redirectami, a regex '^[23]' akceptuje kody 2xx i 3xx.
4. init: true — zapobieganie zombie processes
Kontener wpcli z tail -f /dev/null jako entrypoint nie „sprząta” procesów potomnych. Bez init: true po kilku dniach miałem 2869 procesów zombie na serwerze. Dodanie init: true rozwiązuje problem całkowicie.
5. Plik docker-compose musi mieć rozszerzenie .yml
Coolify nie rozpoznaje plików .yaml — tylko .yml. To drobna rzecz, ale może kosztować sporo debugowania.
6. Branch musi być main
Jeśli repozytorium ma branch master, Coolify nie znajdzie pliku. Zmień domyślny branch na main.
Konfiguracja PHP — trzy metody
Metoda 1: Przez docker-compose (trwała, rekomendowana)
Użyj składni content: jak w konfiguracji powyżej. Ustawienia przetrwają każdy redeploy.
Metoda 2: Przez .htaccess (szybka, bez redeployu)
php_value upload_max_filesize 512M
php_value post_max_size 512M
php_value memory_limit 512M
php_value max_execution_time 600
php_value max_input_time 600
php_value max_input_vars 10000
Metoda 3: Przez php.ini w kontenerze (tymczasowa)
docker exec wordpress-CONTAINER sh -c "cat > /usr/local/etc/php/conf.d/uploads.ini << 'EOF'
upload_max_filesize = 512M
post_max_size = 512M
memory_limit = 512M
max_execution_time = 600
EOF"
Uwaga: Metoda 3 nie przetrwa restartu kontenera. Metoda 2 przetrwa restart, ale nie redeploy z nowym wolumenem.
SSH i SFTP — izolowany dostęp dla developerów
To był najtrudniejszy problem do rozwiązania. Na tradycyjnym hostingu SSH/SFTP jest wbudowane. Na Coolify z Docker? Nie ma gotowego rozwiązania.
Podejścia, które NIE zadziałały
- Kontener SSH (linuxserver/openssh-server) — komplikuje konfigurację sieci, wymaga osobnych portów per instalacja, nie skaluje się
- SSH przez domenę — SSH nie routuje się przez HTTP reverse proxy jak Traefik. Potrzebujesz unikatowych portów lub Cloudflare Tunnel
- FileBrowser (web-based) — nie zastępuje prawdziwego SSH/SFTP. Developerzy potrzebują FileZilla, WinSCP, VS Code Remote
Rozwiązanie: użytkownicy systemowi na hoście
Kluczowa innowacja: tworzymy użytkowników systemowych na serwerze hosta, których katalog domowy wskazuje na Docker Volume z plikami WordPress. Działa to identycznie jak DirectAdmin:
- SSH/SFTP przez standardowy port 22
- Każdy developer widzi tylko swój WordPress
- Nie potrzeba osobnych kontenerów ani portów
Skrypt automatyzacji
# Po deploymencie WordPress w Coolify:
# 1. Znajdź prefix wolumenu
docker volume ls | grep wordpress-files
# 2. Utwórz użytkownika
./setup-wordpress-user.sh klient PREFIX
# Skrypt automatycznie:
# - Tworzy użytkownika z grupą www-data (GID 33)
# - Dodaje go do grupy docker (dla WP-CLI)
# - Ustawia home directory na Docker Volume
# - Tworzy wrapper WP-CLI
# - Generuje hasło
# - Naprawia uprawnienia
Kluczowe szczegóły techniczne
- GID 33 (www-data) — użytkownik musi być w grupie www-data, żeby mógł edytować pliki WordPress. Nie używaj UID 33 (to alias istniejącego www-data), tylko normalny UID z grupą 33
- Grupa docker — potrzebna do uruchamiania WP-CLI (który wykonuje
docker execwewnątrz kontenera) - chmod o+x — cała ścieżka
/var/lib/docker/volumes/PREFIX/musi mieć execute permission dla „others” - Pliki .bashrc i .bash_history — muszą być własnością użytkownika, nie www-data, bo inaczej SSH zgłasza „Permission denied”
WP-CLI przez SSH
Po skonfigurowaniu użytkownika, WP-CLI działa bezpośrednio po SSH:
ssh klient@serwer-ip
wp plugin list
wp theme list
wp core version
wp user list
wp db export backup.sql
wp search-replace 'stara-domena.pl' 'nowa-domena.pl'
Jak to działa pod spodem: Wrapper script /usr/local/bin/wp-klient wykonuje docker exec wewnątrz kontenera wordpress:cli. Ważne: musi celować w kontener z obrazem wordpress:cli, nie wordpress:latest (który nie zawiera WP-CLI).
Problemy, które napotkałem — i jak je rozwiązałem
Problem 1: 2869 zombie processes
Objaw: Po kilku dniach serwer zgłaszał tysiące procesów zombie.
Przyczyna: Kontener wpcli z tail -f /dev/null nie zbierał procesów potomnych z docker exec.
Rozwiązanie: Dodanie init: true do kontenera wpcli w docker-compose.yml.
Problem 2: DNS nie działa w kontenerach Docker (Hetzner)
Objaw: Deployment fails z błędem „Could not resolve host: github.com”.
Przyczyna: Docker był skonfigurowany z publicznymi DNS (1.1.1.1, 8.8.8.8), ale Hetzner blokuje zewnętrzne serwery DNS i wymaga własnych.
Rozwiązanie: Zmiana /etc/docker/daemon.json:
{
"dns": ["185.12.64.2", "185.12.64.1"]
}
Po zmianie: systemctl restart docker
Problem 3: „No available server” w Coolify
Objaw: Po deploymencie Coolify pokazuje błąd healthcheck.
Przyczyna: WordPress zwraca redirect 302, a domyślny curl tego nie obsługuje.
Rozwiązanie: Healthcheck z flagą -L (follow redirects) i regex akceptującym kody 2xx/3xx.
Problem 4: SSH Permission Denied na katalog domowy
Objaw: SSH loguje, ale nie może wejść do katalogu domowego.
Przyczyna: Ścieżka /var/lib/docker nie ma execute permission dla non-root.
Rozwiązanie:
chmod o+x /var/lib/docker
chmod o+x /var/lib/docker/volumes
chmod o+x /var/lib/docker/volumes/PREFIX_wordpress-files
chmod o+x /var/lib/docker/volumes/PREFIX_wordpress-files/_data
Problem 5: WP-CLI „executable not found”
Objaw: wp komenda zgłasza, że nie może znaleźć pliku wykonywalnego.
Przyczyna: Wrapper WP-CLI celował w kontener wordpress:latest (Debian, UID 33), a nie wordpress:cli (Alpine).
Rozwiązanie: Zmiana filtra w wrapperze na --filter "ancestor=wordpress:cli".
Problem 6: PasswordAuthentication wyłączone
Objaw: SSH odmawia połączenia hasłem.
Przyczyna: Ubuntu domyślnie wyłącza PasswordAuthentication w sshd_config.
Rozwiązanie: Ustawienie PasswordAuthentication yes w /etc/ssh/sshd_config i systemctl restart ssh.
Plusy i minusy WordPress na Coolify
Plusy
- Pełna kontrola nad zasobami — ustawiasz dokładne limity RAM i CPU per kontener
- Izolacja — problem z jedną stroną nie wpływa na inne (brak „noisy neighbor”)
- Wydajność — ~51% szybsze ładowanie stron vs shared hosting
- Deployment z Git — push do repozytorium automatycznie deployuje zmiany
- Darmowe SSL — automatyczny Let’s Encrypt bez konfiguracji
- Skalowalność — łatwe dodawanie nowych instancji WordPress
- Pełna kontrola PHP — żadnych ograniczeń panelu hostingowego
- Nowoczesna architektura — Docker, CI/CD, Infrastructure as Code
Minusy
- Brak wbudowanego SSH/SFTP — wymaga ręcznej konfiguracji (ten przewodnik)
- Brak UI do zarządzania zasobami — limity RAM/CPU ustawia się ręcznie w docker-compose
- Krzywa uczenia — wymaga znajomości Docker, Linux, sieci
- Zarządzanie serwerem — aktualizacje, backup, security to Twoja odpowiedzialność
- Brak panelu email — potrzebujesz osobnego rozwiązania (Mailcow, zewnętrzny provider)
- Specyficzne problemy DNS — np. Hetzner blokuje publiczne DNS (1.1.1.1, 8.8.8.8)
- Uprawnienia po redeployu — chmod na Docker volumes trzeba ponawiać po niektórych operacjach
Kiedy wybrać Coolify?
- Jesteś developerem lub agencją z wieloma WordPress
- Potrzebujesz pełnej kontroli nad serwerem
- Chcesz lepszej wydajności niż shared hosting
- Planujesz skalowanie
Kiedy zostać przy tradycyjnym hostingu?
- Masz jedną stronę i nie chcesz zarządzać serwerem
- Potrzebujesz wbudowanego email, FTP, phpMyAdmin
- Nie znasz Docker’a i nie chcesz się uczyć
- Budżet jest priorytetem, nie wydajność
Automatyzacja nowych klientów
Cały proces dodawania nowego klienta WordPress:
- W Coolify: Utwórz nowy projekt z docker-compose (z tego repo GitHub)
- Ustaw domenę: np.
klient.twojadomena.pl - Deploy
- Na serwerze:
# Znajdź prefix wolumenu
docker volume ls | grep wordpress-files
# Utwórz użytkownika
./setup-wordpress-user.sh nazwa-klienta PREFIX
Skrypt wyświetli dane do przekazania klientowi: login SSH, hasło, adres serwera.
Repozytorium z kodem
Cały kod, skrypty i konfiguracja dostępne na GitHub:
github.com/lukelocksmith/wordpress-ssh-coolify
Zawiera:
docker-compose.yml— kompletna konfiguracja dla Coolifyscripts/setup-wordpress-user.sh— automatyzacja tworzenia użytkownika SSHscripts/new-wordpress.sh— pełna automatyzacja z Coolify API
Najczęściej zadawane pytania
Czy redeploy nadpisze moje pliki WordPress?
Nie. Docker Volumes (wordpress-files, mariadb-data) przetrwają redeploy. Twoje treści, wtyczki i konfiguracja pozostaną nienaruszone.
Czy mogę dać dostęp SSH tylko do jednego WordPress?
Tak. Każdy użytkownik systemowy ma katalog domowy wskazujący na konkretny Docker Volume — widzi tylko swoje pliki.
Ile WordPress mogę uruchomić na jednym serwerze?
Zależy od zasobów. Na serwerze z 8 GB RAM i 4 rdzeniami CPU możesz spokojnie hostować 3-5 instancji WordPress + Coolify + inne aplikacje. Z limitami zasobów per kontener masz pełną kontrolę.
Czy muszę robić backup ręcznie?
Coolify ma wbudowany system backupów. Możesz też użyć WP-CLI: wp db export i rsync do archiwizacji plików.
Co się stanie jak serwer się zrestartuje?
Docker automatycznie uruchomi wszystkie kontenery. Jedyny problem: uprawnienia chmod o+x na ścieżkach Docker volumes mogą się zresetować po aktualizacji Docker — trzeba je ponowić.
Artykuł oparty na rzeczywistym wdrożeniu produkcyjnym. Ostatnia aktualizacja: luty 2026.
]]>Zostań w pętli
Nowe artykuły, narzędzia i case study — prosto na maila.