Vì sao mình viết bài này?
Mỗi lần cài lại máy là một lần “tái sinh” và… mất thời gian. Mình gom lại mọi thứ cần thiết cho môi trường dev web (Laravel, Node, Python, Git) thành 1 bài duy nhất, kèm 2 script cho Linux và macOS. Bạn chỉ cần copy chạy, rồi đi pha cà phê. Quay lại là code được ngay.
Bạn sẽ có gì sau bài này
- PHP 8.3 đầy đủ extension phổ biến cho Laravel
- Composer + Laravel Installer toàn cục
- Node.js bản LTS + npm
- Python 3.12 + pip + virtualenv
- Git đã config tên/email
- SSH key sẵn để thêm lên GitHub
- Kiểm tra version cuối bài để chắc chắn mọi thứ OK
Hướng dẫn nhanh cho Linux (Ubuntu/Debian)
- Mở terminal với quyền sudo.
- Dán toàn bộ đoạn script bên dưới vào file setup.sh rồi chạy:
sudo bash setup.sh. - Làm theo prompt nhập git name/email, chờ máy tự chạy.
#!/bin/bash echo "🔧 Bắt đầu quá trình cài đặt môi trường phát triển..." # Kiểm tra quyền root
if [ "$EUID" -ne 0 ]; then echo "❌ Vui lòng chạy script với quyền root (sudo)" exit 1
fi # Cập nhật hệ thống
apt update && apt upgrade -y # Cài các công cụ cơ bản
apt install -y curl wget gnupg2 lsb-release software-properties-common unzip zip build-essential \\
libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncursesw5-dev \\
xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev ca-certificates # --- PHP & Composer ---
echo "📦 Đang cài đặt PHP 8.3 và Composer..." add-apt-repository ppa:ondrej/php -y
apt update apt install -y php8.3 php8.3-cli php8.3-common php8.3-mbstring php8.3-xml php8.3-curl php8.3-mysql \\
php8.3-bcmath php8.3-zip php8.3-gd php8.3-intl php8.3-soap php8.3-readline php8.3-pgsql php8.3-sqlite3 \\
php8.3-imap php8.3-opcache php8.3-xdebug php8.3-dev update-alternatives --set php /usr/bin/php8.3 # Cài Composer nếu chưa có
if ! command -v composer &> /dev/null; then echo "📦 Cài Composer..." cd ~ php -r "copy('<https://getcomposer.org/installer>'', 'composer-setup.php');" php composer-setup.php --install-dir=/usr/local/bin --filename=composer rm composer-setup.php
else echo "✅ Composer đã tồn tại."
fi # --- Laravel Installer ---
echo "🚀 Cài đặt Laravel Installer..." # Cài đặt Laravel global
su - "$SUDO_USER" -c "composer global require laravel/installer" # Lấy đường dẫn bin Laravel
LARAVEL_BIN_PATH=$(su - "$SUDO_USER" -c 'composer global config bin-dir --absolute') # Thêm vào PATH nếu chưa có (cho bash và zsh)
if ! grep -q "$LARAVEL_BIN_PATH" /home/"$SUDO_USER"/.bashrc; then echo "export PATH=\\"$LARAVEL_BIN_PATH:\\$PATH\\"" >> /home/"$SUDO_USER"/.bashrc
fi
if [ -f /home/"$SUDO_USER"/.zshrc ] && ! grep -q "$LARAVEL_BIN_PATH" /home/"$SUDO_USER"/.zshrc; then echo "export PATH=\\"$LARAVEL_BIN_PATH:\\$PATH\\"" >> /home/"$SUDO_USER"/.zshrc
fi echo "✅ Laravel đã được thêm vào PATH cho user: $SUDO_USER"
echo "👉 Bạn cần mở terminal mới hoặc chạy: source ~/.bashrc" # --- Node.js ---
echo "📦 Đang kiểm tra Node.js..."
if ! command -v node &> /dev/null; then echo "📦 Đang cài đặt Node.js LTS..." curl -fsSL <https://deb.nodesource.com/setup_lts.x> | bash - apt install -y nodejs
else echo "✅ Node.js đã được cài đặt."
fi # --- Python 3.12 ---
echo "🐍 Cài đặt Python 3.12 và pip..."
add-apt-repository ppa:deadsnakes/ppa -y
apt update
apt install -y python3.12 python3.12-venv python3.12-dev python3-distutils update-alternatives --install /usr/bin/python python /usr/bin/python3.12 1
update-alternatives --install /usr/bin/pip pip /usr/bin/pip3 1 # Cài pip cho Python 3.12 nếu chưa có
if ! python3.12 -m pip &> /dev/null; then curl -sS <https://bootstrap.pypa.io/get-pip.py> | python3.12
fi pip install virtualenv # --- Git & SSH ---
echo "🔐 Cài đặt Git và thiết lập SSH..." apt install -y git read -p "📝 Nhập tên Git ([user.name](<http://user.name>)): " git_username
read -p "📧 Nhập email Git ([user.email](<http://user.email>)): " git_email git config --global [user.name](<http://user.name>) "$git_username"
git config --global [user.email](<http://user.email>) "$git_email"
git config --global core.editor "nano" echo "✅ Đã cấu hình Git:"
git config --global --list # Tạo SSH key nếu chưa có
if [ ! -f /home/"$SUDO_USER"/.ssh/id_[rsa.pub](<http://rsa.pub>) ]; then echo "🔐 Chưa có SSH key, đang tạo mới..." sudo -u "$SUDO_USER" ssh-keygen -t rsa -b 4096 -C "$git_email" -N "" -f /home/"$SUDO_USER"/.ssh/id_rsa
else echo "🔐 SSH key đã tồn tại."
fi eval "$(ssh-agent -s)"
ssh-add /home/"$SUDO_USER"/.ssh/id_rsa echo ""
echo "👉 SSH public key của bạn (dán vào GitHub):"
cat /home/"$SUDO_USER"/.ssh/id_[rsa.pub](<http://rsa.pub>)
echo ""
echo "🔗 Thêm SSH key vào GitHub: <https://github.com/settings/keys>"
echo ""
echo "📌 Kiểm tra kết nối GitHub sau khi thêm key:"
echo " ssh -T [git@github.com](<mailto:git@github.com>)" # --- Kiểm tra lại ---
echo ""
echo "✅ Phiên bản đã cài:"
php -v
composer -V
su - "$SUDO_USER" -c "laravel --version"
node -v
npm -v
python --version
pip --version
git --version echo ""
echo "🎉 Xong rồi! Môi trường dev đã sẵn sàng."Mẹo nhỏ:
- Nếu bạn dùng zsh mặc định, mở phiên mới hoặc
source ~/.zshrcđể nhận PATH mới. - Trên server không có giao diện, đừng quên mở cổng SSH và cập nhật bảo mật.
Hướng dẫn nhanh cho macOS
- Mở Terminal.
- Chạy lệnh cài Homebrew và toolchain, sau đó cấu hình Git và SSH.
/bin/bash -c "$(curl -fsSL <https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh>)" echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)" brew install php node git composer
composer global require laravel/installer ssh-keygen -t rsa -b 4096 -C "[you@example.com](<mailto:you@example.com>)"
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa
cat ~/.ssh/id_[rsa.pub](<http://rsa.pub>) echo 'Use: ssh -T [git@github.com](<mailto:git@github.com>)'
echo 'git config --global [user.name](<http://user.name>) "Tên của bạn"'
echo 'git config --global [user.email](<http://user.email>) [you@example.com](<mailto:you@example.com>)'Sau khi dán SSH key vào GitHub ở mục Settings → SSH and GPG keys, chạy ssh -T git@github.com để test. Nếu ra “Hi <username>! You’ve successfully authenticated…”, mọi thứ ổn áp.
Câu hỏi thường gặp
- Vì sao chọn PHP 8.3? Vì Laravel hiện chạy rất ổn trên 8.3, hiệu năng tốt, extension đầy đủ.
- Cần Docker không? Bài này tập trung cài native. Nếu bạn dùng Docker, môi trường vẫn cần Git và SSH. Các bài Docker mình có riêng series.
- Có cần Xdebug? Mình cài kèm sẵn, khi dev cần thì enable cấu hình, còn không thì để off để nhẹ.
Troubleshooting nhanh
- Lỗi apt khóa: chạy
sudo rm /var/lib/apt/lists/lockvàsudo dpkg --configure -a, rồiapt updatelại. - Composer không nhận lệnh: mở terminal mới hoặc
source ~/.bashrcđể cập nhật PATH. ssh -T git@github.combáo Permission denied: kiểm tra bạn đã add đúng public key và chưa bật 2FA yêu cầu token.
Điều kiện và nguyên tắc trước khi cài
Bài này phù hợp với Ubuntu/Debian và macOS có quyền cài package. Hãy kiểm tra phiên bản hệ điều hành, tạo điểm khôi phục hoặc ghi lại package hiện có trước khi chạy script. Không nên chạy một script dài với quyền root mà không đọc trước: bản dưới đây dùng cho máy cá nhân, nên tách phần cài hệ thống và phần cấu hình user để dễ kiểm soát.
| Thành phần | Mốc tham chiếu | Cách kiểm tra |
|---|---|---|
| PHP | 8.3 và các extension theo dự án | php -v, php -m |
| Composer | Bản ổn định hiện hành | composer --version |
| Node.js | Active/Maintenance LTS theo dự án | node --version, npm --version |
| Python | 3.12 nếu dependency yêu cầu | python3 --version |
| Git và OpenSSH | Bản từ package manager | git --version, ssh -V |
Laravel yêu cầu phiên bản PHP và extension theo chính phiên bản Laravel mà dự án đang dùng. Vì vậy, đừng nâng PHP chỉ theo bài viết nếu composer.json của dự án đang pin một phiên bản khác. Hãy chạy composer check-platform-reqs sau khi clone code để phát hiện thiếu extension sớm.
Script nên chạy theo từng phần
Script gốc có vài rủi ro thực tế: chạy apt upgrade toàn hệ thống, thêm PPA không cần thiết cho mọi máy, cài Xdebug mặc định và tạo SSH key không mã hóa với passphrase rỗng. Cách an toàn hơn là chạy từng nhóm lệnh, kiểm tra đầu ra, rồi mới sang nhóm kế tiếp.
# Ubuntu/Debian: công cụ cơ bản
sudo apt update
sudo apt install -y ca-certificates curl git openssh-client unzip zip build-essential
# Kiểm tra trước khi chọn PHP 8.3
php -v 2>/dev/null || true
lsb_release -a 2>/dev/null || cat /etc/os-release
# Sau khi cài PHP/Composer theo tài liệu của distro
php -m | grep -E 'curl|mbstring|xml|zip|pdo|openssl'
composer check-platform-reqs 2>/dev/null || true
# Node: dùng bản LTS theo Node.js và pin version bằng nvm hoặc file .nvmrc
node --version
npm --version
# Python: luôn tạo virtual environment cho từng project
python3 -m venv .venv
. .venv/bin/activate
python -m pip install --upgrade pip
python -m pip --version
deactivateVới Node.js, chọn đúng dòng LTS trên trang chính thức và pin phiên bản bằng .nvmrc hoặc công cụ quản lý version mà team đã thống nhất. Với Python, không dùng sudo pip install cho package của project. Với Laravel, Composer nên chạy bằng user thường; chỉ phần cài package hệ thống mới cần sudo.
SSH và Git: tạo key an toàn, không làm lộ secret
Ưu tiên Ed25519 trên máy hiện đại; RSA 4096 chỉ dùng khi hệ thống đích không hỗ trợ Ed25519. Không đưa private key vào Git, không gửi qua chat và không dùng cùng một key cho mọi máy hoặc mọi dịch vụ.
mkdir -p ~/.ssh
chmod 700 ~/.ssh
ssh-keygen -t ed25519 -C "you@example.com" -f ~/.ssh/id_ed25519
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
# Nạp key vào agent trong phiên hiện tại
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
# Xem public key để đăng ký trên GitHub/GitLab
cat ~/.ssh/id_ed25519.pub
ssh -T git@github.comNếu máy dùng nhiều tài khoản, tạo ~/.ssh/config với các host alias riêng, sau đó kiểm tra bằng ssh -vT git@github-work. Khi thấy Permission denied (publickey), kiểm tra đúng remote, agent, quyền file và public key đã đăng ký; không khắc phục bằng cách bật lại password hoặc chép private key lên server.
Checklist nghiệm thu và đường lui
- Mở terminal mới hoặc nạp lại
~/.bashrc/~/.zshrcsau khi thay PATH. - Chạy
php -v,composer --version,node -v,npm -v,python3 -V,git --versionvàssh -V. - Clone một repository thử nghiệm, chạy
composer install,npm civà kiểm traphp artisan --version. - Ghi lại package/PPA đã thêm. Nếu cài lỗi, gỡ package vừa thêm hoặc quay về phiên bản PHP/Node mà dự án pin; không xóa thủ công thư mục hệ thống.
- Không dùng lệnh xóa lock file apt khi còn process package manager đang chạy. Trước hết kiểm tra
psvà chờ hoặc xử lý tiến trình bị treo đúng quy trình.
Tài liệu tham khảo
- Laravel Installation
- Node.js Downloads và các dòng LTS
- Composer Installation
- Python venv
- Git: Generating Your SSH Public Key
Đọc thêm: setup website với Nginx trên VPS Ubuntu và CI/CD GitHub Secrets an toàn để hoàn thiện workflow từ máy dev đến môi trường triển khai.