Wordpress
![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.
Zrobić to razem?
Wdrażam takie rzeczy w firmach na co dzień. Umów 30 minut, pogadamy konkretnie o Twoim przypadku. Bez prezentacji sprzedażowej.
Umów bezpłatną rozmowę →
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 |
To jedna z największych zalet Coolify nad tradycyjnym hostingiem — masz pełną kontrolę nad zasobami każdego kontenera.
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.
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.
| 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 |
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: 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.
$SERVICE_USER_WORDPRESS i $SERVICE_PASSWORD_WORDPRESS — Coolify automatycznie generuje bezpieczne hasła do bazy danych. Nie musisz ich tworzyć ręcznie.
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.
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.
Coolify nie rozpoznaje plików .yaml — tylko .yml. To drobna rzecz, ale może kosztować sporo debugowania.
Jeśli repozytorium ma branch master, Coolify nie znajdzie pliku. Zmień domyślny branch na main.
Użyj składni content: jak w konfiguracji powyżej. Ustawienia przetrwają każdy redeploy.
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 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.
To był najtrudniejszy problem do rozwiązania. Na tradycyjnym hostingu SSH/SFTP jest wbudowane. Na Coolify z Docker? Nie ma gotowego rozwiązania.
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:
# 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 docker exec wewnątrz kontenera)/var/lib/docker/volumes/PREFIX/ musi mieć execute permission dla „others”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).
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.
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
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.
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 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".
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.
Cały proces dodawania nowego klienta WordPress:
klient.twojadomena.pl# 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.
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 APINie. Docker Volumes (wordpress-files, mariadb-data) przetrwają redeploy. Twoje treści, wtyczki i konfiguracja pozostaną nienaruszone.
Tak. Każdy użytkownik systemowy ma katalog domowy wskazujący na konkretny Docker Volume — widzi tylko swoje pliki.
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ę.
Coolify ma wbudowany system backupów. Możesz też użyć WP-CLI: wp db export i rsync do archiwizacji plików.
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. Bez spamu, bez sprzedaży.