For migrating a WordPress (+ Elementor) site from another host - specifically DomainFactory, keeping mail there - onto this Hetzner box that already runs Coolify. Not a generic any-host-to-any-host guide; it's tuned to how deployment actually works here.
Coolify's own Traefik proxy already owns ports 80 and 443 on this server, so a separate control panel (CloudPanel, etc.) would fight it for those ports. WordPress goes in as a Coolify Service - a WordPress + MySQL Docker Compose pair, the same mechanism as everything else on this server. Multiple domains on one server is completely normal; Traefik routes by hostname.
wp-content.free -h
df -h
docker stats --no-stream
WordPress + MySQL together want at least 512 MB-1 GB of free RAM.
wordpress + mysql container pair with persistent volumes and secure auto-generated DB credentials, visible under the resource's Environment Variables tab.Traefik routes by the Host header, not actual DNS, so the site can be previewed under the real domain before flipping DNS, with a hosts-file entry:
C:\Windows\System32\drivers\etc\hosts/etc/hosts188.245.70.171 yournewdomain.tld www.yournewdomain.tld
Let's Encrypt itself needs the domain to resolve publicly to issue a cert, so expect an HTTP-only preview or a cert warning before real DNS points here - that's expected. Remove the hosts entry once done testing.
Elementor stores page layouts as serialized/JSON blobs in wp_postmeta (_elementor_data) and in wp_options. A plain text find-and-replace on the raw database will corrupt this the moment string lengths change. Always use a migration plugin or WP-CLI's search-replace - never a raw SQL UPDATE ... REPLACE or sed on a SQL dump.
The simplest path for a Dockerized target, since it avoids guessing container/network/volume names.
1. Export from the old site. Install All-in-One WP Migration (or Duplicator) and export the full site to one file.
2. Install the same plugin on the new deployment.
3. Copy the export straight into the container, rather than uploading through the browser (hits PHP upload-size limits):
docker ps --filter "name=wordpress"
docker cp your-export-file.wpress <container_name>:/var/www/html/wp-content/ai1wm-backups/
The plugin's import screen should then list it as an available local backup.
4. Run the import from wp-admin.
5. Regenerate Elementor's cache. Elementor -> Tools -> Regenerate Files & Data, since paths changed even though content didn't.
6. Elementor Pro license: deactivate on the old site (or free a slot in the My Elementor account) before activating on the new one.
Exact container/network/volume names are per-resource, assigned by Coolify - always check with docker ps / docker network ls / docker volume ls rather than assuming.
On the old server:
mysqldump -h mysql-host -u DB_USER -p DB_NAME > site-backup.sql
tar -czf wp-content-backup.tar.gz wp-content
Copy to this server, then find the containers:
scp site-backup.sql wp-content-backup.tar.gz user@188.245.70.171:~/
docker ps
Copy files into the WordPress container:
docker cp wp-content-backup.tar.gz <wordpress_container>:/tmp/
docker exec -it <wordpress_container> bash -c "cd /var/www/html && tar -xzf /tmp/wp-content-backup.tar.gz"
Import the database (grab DB name/user/password from the resource's Environment Variables tab first):
docker cp site-backup.sql <mysql_container>:/tmp/
docker exec -it <mysql_container> bash -c "mysql -u root -p wordpress < /tmp/site-backup.sql"
Run a serialization-safe search-replace. The stock WordPress image doesn't ship WP-CLI, so use a temporary one-off container on the same network/volume:
docker run --rm --network <resource_network> -v <resource_wordpress_files_volume>:/var/www/html -e WORDPRESS_DB_HOST=mysql -e WORDPRESS_DB_USER=<db_user> -e WORDPRESS_DB_PASSWORD=<db_password> -e WORDPRESS_DB_NAME=wordpress wordpress:cli wp search-replace 'http://oldsite.tld' 'https://newdomain.tld' --allow-root
Then Elementor -> Tools -> Regenerate Files & Data, same as the plugin method.
Tip either way: Coolify's dashboard has a Terminal tab per resource - a browser shell straight into the container, often more convenient than SSH + docker exec.
@ and www to 188.245.70.171.search-replace or the migration plugin, never plain SQL/text tools.WORDPRESS_DB_HOST matches the MySQL service name Coolify generated (usually mysql) in the resource's environment variables.docker stats and free -h; this server may now be carrying more than one site's worth of load.