Lando là gì? Hướng dẫn cài đặt Lando cho WordPress và Laravel

CD

Lando là công cụ local development environment mã nguồn mở dựa trên Docker, giúp developer tạo môi trường WordPress/Laravel chỉ với một file .lando.yml. Không cần cài XAMPP, MAMP, không cần config Apache/Nginx/PHP/MySQL thủ công.

Bài này đi chi tiết từng bước với code có thể copy-paste ngay.

1. Cài đặt Lando

Yêu cầu: Docker Desktop (macOS/Windows) hoặc Docker Engine (Linux).

# macOS
brew install --cask lando

# Linux (Debian/Ubuntu)
curl -fsSL https://github.com/lando/lando/releases/download/v3.23.12/lando-v3.23.12-linux-x64.tar.gz -o /tmp/lando.tar.gz
sudo tar -xzf /tmp/lando.tar.gz -C /usr/local/bin
sudo chmod +x /usr/local/bin/lando

# Kiểm tra
lando version

2. WordPress thuần (không code change)

Dành cho ai cần WordPress local nhanh, không Git, không theme phức tạp.

# Tạo project
mkdir my-wp && cd my-wp

# Init với recipe wordpress
lando init \
  --recipe wordpress \
  --webroot . \
  --name my-wp

# File .lando.yml tự động tạo:
# name: my-wp
# recipe: wordpress
# config:
#   webroot: .

# Start
lando start

# Output:
# BOOM! Provider "docker" has been booted successfully
# BOOM! Starting "my-wp"
# Your app has started up correctly
# - http://my-wp.lndo.site
# - https://my-wp.lndo.site (self-signed SSL)
# - http://localhost:32771 (direct port)

Sau khi start, Lando tự động tạo container với PHP + Nginx + MySQL. Cài WordPress:

# Xem thông tin database và services
lando info

# Kết quả lando info:
# [
#   {
#     "service": "appserver",
#     "urls": ["http://my-wp.lndo.site", "https://my-wp.lndo.site"],
#     "type": "php",
#     "version": "8.2",
#     "via": "nginx"
#   },
#   {
#     "service": "database",
#     "type": "mysql",
#     "version": "8.0",
#     "creds": {
#       "user": "lando",
#       "password": "lando",
#       "database": "my-wp",
#       "host": "database",
#       "port": 3306
#     }
#   }
# ]

# Download WordPress core
lando wp core download --locale=vi

# Cấu hình wp-config.php (Lando tự tạo sẵn, chỉ cần copy)
cp wp-config-sample.php wp-config.php

# Install
lando wp core install \
  --url=http://my-wp.lndo.site \
  --title="My WordPress Site" \
  --admin_user=admin \
  --admin_password=admin \
  [email protected]

# Cài tiếng Việt
lando wp language core install vi
lando wp site switch-language vi

Truy cập http://my-wp.lndo.site — WordPress đã chạy. Không cần config database thủ công, Lando tự tạo.

3. Migrate từ LocalWP sang Lando (step-by-step)

Chuyển từ LocalWP (hoặc MAMP, XAMPP) sang Lando gồm 5 bước: export database, copy uploads, tạo .lando.yml, import, search-replace URL.

Bước 1: Export database từ LocalWP

# Vào thư mục LocalWP site
cd "/path/to/Local Sites/my-site/app/public"

# Dùng WP-CLI export (nếu site đang chạy)
wp db export /tmp/localwp-dump.sql

# Hoặc dùng mysql trực tiếp (nếu biết socket path)
# mysql -u root --socket=/path/to/mysqld.sock local_db_name > /tmp/localwp-dump.sql

# Nếu dùng Adminer/phpMyAdmin: Export → method: Quick, format: SQL

Bước 2: Copy wp-content/uploads và plugins

# Từ LocalWP site root
cp -r wp-content/uploads /path/to/lando-project/wp-content/uploads
cp -r wp-content/plugins /path/to/lando-project/wp-content/plugins
cp -r wp-content/themes /path/to/lando-project/wp-content/themes

# Lưu ý: Không copy wp-content/cache, wp-content/upgrade, wp-content/debug.log

Bước 3: Tạo .lando.yml

# Tạo file .lando.yml trong thư mục gốc project Lando
name: my-migrated-site
recipe: wordpress
config:
  webroot: .
  php: "8.2"
  via: nginx
  database: mariadb:10.11
  xdebug: false
services:
  phpmyadmin:
    type: phpmyadmin
    hosts:
      - database

Bước 4: Start Lando và import database

# Start Lando
lando start

# Copy database dump vào thư mục project
cp /tmp/localwp-dump.sql .

# Import database vào Lando
lando db-import localwp-dump.sql

# Kiểm tra tables đã import
lando wp db tables

Bước 5: Search-replace URLs từ LocalWP sang Lando

LocalWP dùng domain .local hoặc .test, Lando dùng .lndo.site. Cần replace toàn bộ URL trong database:

# Kiểm tra URL cũ (từ localwp)
# Thường là http://my-site.local hoặc https://my-site.local

# Search-replace URL cũ sang Lando domain
lando wp search-replace "http://my-site.local" "http://my-migrated-site.lndo.site" --all-tables --precise

# Nếu có SSL (https), replace cả:
lando wp search-replace "https://my-site.local" "http://my-migrated-site.lndo.site" --all-tables --precise

# Verify
lando wp db query "SELECT option_value FROM wp_options WHERE option_name IN ('siteurl','home')"

Bước 6: Cấu hình wp-config.php

LocalWP thường có wp-config.php custom. Cần tạo lại cho Lando:

# Backup wp-config.php cũ
cp wp-config.php wp-config-localwp-backup.php

# Tạo wp-config.php mới cho Lando
# Lando tự động inject database credentials qua env vars:
# - LANDO_INFO (JSON chứa credentials)
# - DB_HOST, DB_USER, DB_PASSWORD, DB_NAME (tự động set)

# Có thể dùng wp-config.php mẫu này:
cat > wp-config.php << 'WPCONFIG'
<?php
define('DB_NAME', getenv('DB_NAME') ?: 'lando');
define('DB_USER', getenv('DB_USER') ?: 'lando');
define('DB_PASSWORD', getenv('DB_PASSWORD') ?: 'lando');
define('DB_HOST', getenv('DB_HOST') ?: 'database');
define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');

// Lando xác định môi trường
define('WP_ENVIRONMENT_TYPE', 'local');
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);

// URLs (quan trọng: khớp với domain Lando)
define('WP_HOME', 'http://my-migrated-site.lndo.site');
define('WP_SITEURL', 'http://my-migrated-site.lndo.site');

// Salt keys (copy từ wp-config-localwp-backup.php hoặc generate mới)
define('AUTH_KEY', '...');
define('SECURE_AUTH_KEY', '...');

$table_prefix = 'wp_';

if (!defined('ABSPATH')) define('ABSPATH', '/tmp' . '/');
require_once ABSPATH . 'wp-settings.php';
WPCONFIG

Bước 7: Verify

# Kiểm tra site
curl -sI http://my-migrated-site.lndo.site | head -5

# Kiểm tra images (upload đã được copy)
curl -sI http://my-migrated-site.lndo.site/wp-content/uploads/2024/01/sample.jpg

# Kiểm tra WP-CLI
lando wp core version
lando wp plugin list
lando wp theme list

# Nếu có lỗi 404, kiểm tra permalinks
lando wp rewrite flush

Xử lý lỗi thường gặp khi migrate:

  • 404 not found: Chạy lando wp rewrite flushlando wp cache flush
  • Mixed content (http/https): Kiểm tra siteurl/home trong database, chạy search-replace cả http và https
  • Plugin gây lỗi: Deactivate từng plugin: lando wp plugin deactivate plugin-name
  • PHP version mismatch: Kiểm tra PHP version LocalWP vs Lando, chỉnh php: "8.1" trong .lando.yml nếu cần
  • MySQL collation error: LocalWP dùng utf8mb4, Lando mặc định cũng utf8mb4 — ít khi lỗi

4. WordPress Git workflow (full repo)

Workflow này dùng cho các dự án WordPress có theme riêng, plugin, build scripts — quản lý toàn bộ code trong Git. File .lando.yml định nghĩa stack và chia sẻ qua Git cho cả team.

Tạo .lando.yml — copy-paste vào thư mục gốc dự án:

name: my-project
recipe: wordpress
config:
  webroot: .
  php: "8.2"
  via: nginx
  database: mariadb:10.11
  xdebug: true
  composer_version: "2-latest"
env:
  WP_ENVIRONMENT_TYPE: local
  WP_HOME: "http://my-project.lndo.site"
  WP_SITEURL: "http://my-project.lndo.site/wp"
services:
  node:
    type: node:20
    build_as_root:
      - npm install -g gulp-cli
  phpmyadmin:
    type: phpmyadmin
    hosts:
      - database
tooling:
  npm:
    service: node
  gulp:
    service: node
  wp:
    service: appserver
    cmd: wp --path=/app
  composer:
    service: appserver

Giải thích config:

  • php: "8.2" — PHP version
  • via: nginx — Web server (có thể dùng apache)
  • database: mariadb:10.11 — Database engine + version
  • xdebug: true — Bật Xdebug cho debugging
  • node service — Container riêng cho Node, không cài trên appserver
  • phpmyadmin — Truy cập database qua browser
  • tooling — Định nghĩa lệnh: lando npm, lando gulp, lando wp, lando composer

Khởi tạo project:

# Start containers
lando start

# Cài dependencies
lando composer install
lando npm install

# Download WordPress và install
lando wp core download --locale=vi --skip-content
lando wp core install \
  --url=http://my-project.lndo.site \
  --title="My Project" \
  --admin_user=admin \
  --admin_password=admin \
  [email protected]

# Kích hoạt theme
lando wp theme activate my-theme

# Import database từ production
lando db-import production-dump.sql
lando wp search-replace 'https://example.com' 'http://my-project.lndo.site'

# Build assets
lando gulp build

.gitignore mẫu cho WordPress Git repo:

# WordPress core (download từ WP-CLI, không commit)
wp-content/uploads/
wp-content/cache/
wp-content/upgrade/
wp-content/languages/

# Dependencies
node_modules/
vendor/
package-lock.json

# Build artifacts
dist/
*.css.map

# Env
.env
wp-config-local.php
.lando.local.yml

# OS
.DS_Store
Thumbs.db

Database workflow:

# Export (backup)
lando db-export backup-$(date +%Y%m%d).sql

# Import (restore)
lando db-import backup.sql

# Reset database (xoá và tạo lại)
lando db-import --no-wipe backup.sql
# Nếu cần wipe: lando db-import --wipe backup.sql

# Truy cập database qua phpMyAdmin
# http://my-project.lndo.site:8081 (port tuỳ theo lando info)

5. Laravel với Lando

File .lando.yml cho Laravel, tham khảo từ dự án thực tế:

name: my-laravel-app
recipe: laravel
config:
  webroot: public
  php: "8.3"
  via: nginx
  database: mysql:8.0
  cache: redis:7
  composer_version: "2-latest"
  xdebug: true
services:
  node:
    type: node:22
    build_as_root:
      - npm install -g vite
  mailpit:
    type: mailpit
    hogfrom:
      - appserver
tooling:
  artisan:
    service: appserver
    cmd: php artisan
  npm:
    service: node
  vite:
    service: node
  composer:
    service: appserver

Khởi tạo và chạy Laravel:

# Start
lando start

# Tạo Laravel project
lando composer create-project laravel/laravel --prefer-dist .

# Cấu hình .env (Lando tự gen, nhưng cần kiểm tra)
lando info
# Copy database credentials từ lando info vào .env:
# DB_CONNECTION=mysql
# DB_HOST=database
# DB_PORT=3306
# DB_DATABASE=my-laravel-app
# DB_USERNAME=lando
# DB_PASSWORD=lando
# REDIS_HOST=cache

# Generate key
lando artisan key:generate

# Migrate
lando artisan migrate

# Install frontend
lando npm install
lando npm run build

# Kiểm tra queue
lando artisan queue:work

# Xem mail tại Mailpit UI
# http://my-laravel-app.lndo.site:8025

Xdebug trong Laravel:

# .lando.yml đã bật xdebug:true

# Bật xdebug khi cần (mặc định tắt để giữ tốc độ)
lando xdebug on

# Set IDE key (PHPStorm)
lando xdebug on PHPSTORM

# Debug một request
lando xdebug on
lando artisan serve

# Tắt xdebug khi không dùng
lando xdebug off

6. Lệnh Lando thường dùng

# Quản lý containers
lando start          # Khởi động
lando stop           # Dừng (giữ containers)
lando poweroff       # Tắt toàn bộ Docker
lando rebuild        # Xây lại từ đầu (sau khi sửa .lando.yml)
lando destroy        # Xoá containers và data

# Thông tin
lando info           # Services, URLs, credentials
lando list           # Danh sách projects đang chạy
lando logs -s appserver   # Logs của service
lando logs -s database    # Logs database

# SSH vào container
lando ssh            # Mặc định appserver
lando ssh -s node    # SSH vào node service
lando ssh -s database "mysql -u lando -p lando"  # Chạy lệnh trong service

# Database
lando db-export dump.sql
lando db-import dump.sql
lando db-import --no-wipe dump.sql  # Không xoá data cũ

# WP-CLI (chỉ với WordPress recipe)
lando wp plugin list
lando wp db export
lando wp search-replace "http://old.com" "http://new.lndo.site"
lando wp cache flush

# Composer
lando composer require package/name
lando composer update

# Xdebug
lando xdebug on
lando xdebug off
lando xdebug on PHPSTORM

7. Troubleshooting thường gặp

Lỗi port bị conflict:

# Error: Port 80 already in use
# Kiểm tra process đang dùng port:
sudo lsof -i :80
# Tắt process đó hoặc đổi port Lando:
# Thêm vào .lando.yml:
# config:
#   proxy:
#     http_port: 8080  # Thay vì 80
#     https_port: 8443 # Thay vì 443
# Chạy lando rebuild

Lỗi "BOOM! Provider docker has not been booted yet":

# Docker chưa chạy. Mở Docker Desktop hoặc:
sudo systemctl start docker  # Linux
open -a Docker               # macOS (mở app)
# Sau đó lando start lại

Lỗi name resolution .lndo.site:

# Nếu không truy cập được .lndo.site:
# Kiểm tra DNS rebind protection (thường gặp trên router Unifi, MikroTik)
# Cách 1: Dùng direct port từ lando info (http://localhost:xxxxx)
# Cách 2: Thêm vào /etc/hosts:
echo "127.0.0.1 my-project.lndo.site" | sudo tee -a /etc/hosts

Kết luận

Lando giúp chuẩn hoá môi trường local cho WordPress và Laravel. Một file .lando.yml định nghĩa toàn bộ stack, chia sẻ qua Git cho cả team. Không conflict version PHP/MySQL/Node giữa các dự án.

Xem thêm: docs.lando.dev | Expose Lando site ra internet với Cloudflare Tunnel