Linux File System khi deploy: /etc, /var, /home và /opt
Giải thích cấu trúc thư mục Linux quan trọng khi deploy production: /etc, /var, /home, /opt, /tmp, /usr, log, config và dữ liệu.
Mục lục bài viết
VPS & Hosting cho dự án của bạn
Khám phá các gói máy chủ và lưu trữ phù hợp từ website cá nhân đến ứng dụng production.
Khi mới dùng VPS, nhiều người đặt source code, database dump, file upload và script ở bất kỳ thư mục nào miễn ứng dụng chạy được. Cách này khiến việc backup, phân quyền và xử lý sự cố trở nên khó khăn.
Hiểu Linux file system giúp bạn biết loại dữ liệu nào nên đặt ở đâu và tránh những lỗi như ghi log đầy phân vùng root hoặc xóa nhầm dữ liệu ứng dụng.
Linux có ổ C và ổ D không?
Linux thường tổ chức mọi thứ dưới một cây thư mục bắt đầu bằng:
/
Dấu / là root directory, không phải user root.
Ví dụ:
/
├── etc/
├── home/
├── var/
├── usr/
├── opt/
├── tmp/
└── root/
Ổ đĩa hoặc phân vùng khác có thể được mount vào một vị trí trong cây này.
/ là gì?
/ là điểm bắt đầu của toàn bộ file system.
Kiểm tra:
ls -la /
Xem phân vùng:
df -h
lsblk
findmnt
Không nên lưu file tùy ý trực tiếp dưới /.
/home dùng để làm gì?
/home chứa thư mục cá nhân của user thường.
Ví dụ:
/home/thien
/home/deploy
/home/dev1
Trong home có thể có:
~/.ssh
~/.config
~/.local
~/.bashrc
Ký hiệu:
~
là home của user hiện tại.
Kiểm tra:
echo "$HOME"
pwd
Source code đang phát triển hoặc script cá nhân có thể nằm trong home. Với ứng dụng production dùng chung, nên có cấu trúc rõ hơn trong /var/www, /srv hoặc /opt.
/root là gì?
/root là home directory của user root.
/root
Nó không giống thư mục /.
Không đặt source production ở /root nếu app cần chạy bằng user không phải root. Điều này dễ dẫn tới permission sai và buộc bạn chạy app bằng quyền cao.
/etc dùng để làm gì?
/etc chứa cấu hình hệ thống và dịch vụ.
Ví dụ:
/etc/nginx/
/etc/ssh/
/etc/systemd/
/etc/postgresql/
/etc/docker/
/etc/cron.d/
Các file thường gặp:
/etc/hosts
/etc/passwd
/etc/group
/etc/fstab
/etc/ssh/sshd_config
/etc/nginx/nginx.conf
Nguyên tắc:
- Backup cấu hình quan trọng.
- Kiểm tra cú pháp trước reload.
- Không lưu dữ liệu người dùng trong
/etc. - Không đặt password plaintext tùy tiện.
- Giữ owner và permission phù hợp.
Ví dụ kiểm tra Nginx:
sudo nginx -t
/var dùng để làm gì?
/var chứa dữ liệu thay đổi trong quá trình hệ thống hoạt động.
Các thư mục quan trọng:
/var/log
/var/lib
/var/cache
/var/www
/var/backups
/var/tmp
/var/log
Chứa log:
/var/log/nginx/
/var/log/auth.log
/var/log/syslog
Một số hệ thống chủ yếu dùng systemd journal:
journalctl
Kiểm tra dung lượng:
sudo du -sh /var/log/*
journalctl --disk-usage
Log không có rotation có thể làm đầy ổ đĩa.
/var/lib
Chứa state hoặc dữ liệu bền vững của service.
Ví dụ:
/var/lib/postgresql/
/var/lib/docker/
/var/lib/systemd/
Không xóa thủ công nội dung /var/lib chỉ để giải phóng dung lượng nếu chưa hiểu service đang dùng.
Ví dụ:
/var/lib/docker
chứa dữ liệu Docker. Xóa trực tiếp có thể phá container, image và volume.
/var/www
Thường dùng cho nội dung web hoặc ứng dụng web.
Ví dụ:
/var/www/deployeasy
/var/www/deployeasy-api
Cấu trúc production:
/var/www/deployeasy-api/
├── current -> releases/20260710-120000
├── releases/
├── shared/
└── backups/
Không bắt buộc mọi ứng dụng phải nằm ở /var/www, nhưng đây là vị trí dễ hiểu cho web app.
/var/backups
Có thể chứa backup local ngắn hạn:
/var/backups/deployeasy/
Backup quan trọng vẫn cần bản sao ngoài VPS.
/usr dùng để làm gì?
/usr chứa phần lớn chương trình, thư viện và tài nguyên dùng chung do hệ thống hoặc package manager quản lý.
Ví dụ:
/usr/bin
/usr/sbin
/usr/lib
/usr/share
/usr/local
/usr/bin
Chứa nhiều command:
which node
which git
which nginx
Ví dụ kết quả:
/usr/bin/git
Không tự ghi đè file do package manager quản lý.
/usr/local
Dùng cho phần mềm hoặc script do quản trị viên cài cục bộ.
Ví dụ:
/usr/local/bin/deploy-deployeasy
/usr/local/sbin/
Script deploy dùng chung có thể đặt tại:
/usr/local/bin/
Ví dụ:
sudo install -m 750 deploy.sh \
/usr/local/bin/deploy-deployeasy
/opt dùng để làm gì?
/opt thường dùng cho phần mềm tùy chọn hoặc ứng dụng đóng gói riêng.
Ví dụ:
/opt/deployeasy-agent
/opt/vendor-app
Một số đội đặt ứng dụng production vào:
/opt/apps/deployeasy
Điều quan trọng là chọn quy ước nhất quán và ghi tài liệu.
/srv dùng để làm gì?
/srv có thể chứa dữ liệu được phục vụ bởi hệ thống.
Ví dụ:
/srv/www
/srv/git
/srv/uploads
Không phải distro hoặc đội nào cũng sử dụng /srv.
/tmp là gì?
/tmp chứa file tạm.
Đặc điểm:
- Có thể bị xóa sau reboot hoặc theo policy.
- Nhiều user có thể sử dụng.
- Không phù hợp để lưu dữ liệu cần tồn tại.
- Không nên lưu secret lâu dài.
Ví dụ dùng tạm:
tar -czf /tmp/release.tar.gz dist package.json
Sau khi deploy:
rm -f /tmp/release.tar.gz
Không đặt database backup duy nhất trong /tmp.
/var/tmp khác /tmp thế nào?
/var/tmp thường dành cho file tạm cần tồn tại lâu hơn qua reboot, nhưng policy phụ thuộc hệ thống.
Không xem nó là nơi backup bền vững.
/run dùng để làm gì?
/run chứa runtime state từ lúc boot:
/run/nginx.pid
/run/docker.sock
/run/postgresql/
Nội dung thường nằm trong RAM và mất sau reboot.
Docker socket:
/run/docker.sock
có quyền rất cao. Không mount nó vào container nếu không thật sự cần.
/dev
Chứa device file:
/dev/null
/dev/random
/dev/sda
Ví dụ bỏ output:
command > /dev/null 2>&1
Không thao tác trực tiếp block device nếu chưa hiểu, vì có thể mất dữ liệu.
/proc và /sys
Đây là virtual file system cung cấp thông tin kernel và process.
Ví dụ:
cat /proc/cpuinfo
cat /proc/meminfo
Không coi chúng là file dữ liệu thông thường.
Đặt source production ở đâu?
Ba lựa chọn dễ hiểu:
/var/www
Phù hợp web app:
/var/www/deployeasy-api
/opt
Phù hợp app đóng gói riêng:
/opt/deployeasy-api
/srv
Phù hợp dữ liệu/service:
/srv/deployeasy-api
Tránh:
/root/app
/tmp/app
/
Đặt file upload ở đâu?
Ví dụ:
/var/www/deployeasy/shared/uploads
Hoặc:
/srv/deployeasy/uploads
Cần:
- Owner đúng.
- Backup.
- Giới hạn kích thước.
- Không cho thực thi file upload.
- Không lưu trong release directory nếu mỗi deploy thay thư mục.
Đặt .env ở đâu?
Ví dụ:
/var/www/deployeasy/shared/.env.production
Permission:
chmod 600 .env.production
Symlink vào release:
ln -s \
/var/www/deployeasy/shared/.env.production \
/var/www/deployeasy/current/.env.production
Không đặt secret trong Git hoặc image.
Đặt log ứng dụng ở đâu?
Tốt nhất app container log ra stdout/stderr.
App chạy trực tiếp có thể dùng:
/var/log/deployeasy/
Tạo:
sudo mkdir -p /var/log/deployeasy
sudo chown deploy:deploy /var/log/deployeasy
Phải có log rotation.
Mount là gì?
Mount gắn một file system vào một directory.
Kiểm tra:
findmnt
mount
lsblk -f
Ví dụ ổ dữ liệu được mount vào:
/mnt/data
Hoặc:
/srv/uploads
Cấu hình lâu dài thường nằm trong:
/etc/fstab
Sửa sai /etc/fstab có thể làm boot lỗi. Backup và test:
sudo mount -a
Symlink là gì?
Symlink là liên kết tới đường dẫn khác.
Tạo:
ln -s target link-name
Ví dụ:
ln -sfn \
/var/www/deployeasy/releases/20260710-120000 \
/var/www/deployeasy/current
Kiểm tra:
ls -l /var/www/deployeasy
readlink -f /var/www/deployeasy/current
Symlink hữu ích cho release và rollback.
Hard link là gì?
Hard link là tên khác trỏ tới cùng inode trong cùng file system.
ln original.txt hardlink.txt
Không dùng hard link như bản backup độc lập.
Inode là gì?
Inode lưu metadata của file. Một phân vùng có thể hết inode dù vẫn còn dung lượng.
Kiểm tra:
df -i
Nhiều file nhỏ trong cache, log, package hoặc node_modules có thể dùng hết inode.
Tìm file và thư mục lớn
Dung lượng cấp một:
sudo du -xhd1 / | sort -h
Trong /var:
sudo du -xhd1 /var | sort -h
Tìm file lớn:
sudo find /var \
-xdev \
-type f \
-size +500M \
-printf '%s %p\n' |
sort -n
Không xóa trước khi xác định file thuộc service nào.
Quyền sở hữu cơ bản
Xem:
ls -la
Kết quả:
-rw-r----- 1 deploy deploy 1200 app.env
Bao gồm:
- Loại file.
- Permission.
- Owner.
- Group.
- Kích thước.
- Tên.
Sửa owner:
sudo chown -R deploy:deploy /var/www/deployeasy
Không chown -R lên thư mục hệ thống rộng như /usr hoặc /var.
Sao chép và di chuyển an toàn
Copy file:
cp source destination
Copy directory:
cp -a source/ destination/
Move:
mv source destination
Xóa:
rm file
rm -r directory
Cẩn thận với:
sudo rm -rf
Kiểm tra biến trước khi dùng trong script:
: "${APP_DIR:?APP_DIR is required}"
Checklist tổ chức production
[ ] Source không nằm trong /root
[ ] Config hệ thống nằm trong /etc
[ ] Script quản trị nằm trong /usr/local/bin
[ ] App nằm trong /var/www, /opt hoặc /srv
[ ] Upload nằm ngoài release directory
[ ] Secret permission hạn chế
[ ] Log có rotation
[ ] Backup nằm ngoài VPS
[ ] Không lưu dữ liệu bền vững trong /tmp
[ ] Biết mount nào chứa Docker/database
[ ] Theo dõi disk và inode
[ ] Symlink current hỗ trợ rollback
Câu hỏi thường gặp
Có bắt buộc đặt website trong /var/www không?
Không. Đây là quy ước phổ biến, không phải yêu cầu kỹ thuật bắt buộc.
Có nên đặt app trong /home/user không?
Có thể với dự án cá nhân, nhưng production dùng chung nên có cấu trúc và owner rõ ràng.
Xóa /var/lib/docker có sao không?
Có thể làm mất hoặc hỏng dữ liệu Docker. Hãy dùng lệnh Docker và backup phù hợp.
/tmp có bị xóa không?
Có thể bị xóa theo reboot hoặc policy của hệ thống. Không lưu dữ liệu cần tồn tại.
Kết luận
Linux file system không chỉ là danh sách thư mục. Cách tổ chức đúng giúp phân quyền, backup, deploy và rollback dễ hơn.
Nguồn tham khảo
Đọc tiếp
Bài viết liên quan
SSH Key là gì? Đăng nhập VPS an toàn không cần mật khẩu
Hướng dẫn tạo SSH key, thêm public key vào VPS, cấu hình SSH alias, sửa permission và xử lý lỗi publickey trên Windows, Linux.
Đọc bài →Tạo systemd service cho Node.js: Tự chạy sau khi VPS reboot
Hướng dẫn tạo systemd service cho Node.js/NestJS, cấu hình User, WorkingDirectory, EnvironmentFile, restart, log và graceful shutdown.
Đọc bài →Linux Permission, User, Group và sudo cho môi trường production
Hướng dẫn quyền Linux rwx, chmod, chown, user, group, sudo, umask, setgid và cách phân quyền thư mục deploy an toàn.
Đọc bài →