Agent-Box · Song Linh Plus

Hướng dẫn Cài đặt máy chủ AI riêng

Từ cài Ubuntu → đến agent AI dùng từ xa + bot Telegram riêng. Viết cho người mới, có AI hỗ trợ. Mỗi mục nói rõ là gì, vì sao cần, và bỏ qua được không.

0. Giới thiệu & cách làm việc với AI

Agent-Box = 1 máy Ubuntu (laptop/mini-PC) cho mỗi khách: bảo mật, truy cập từ xa, chạy 4 AI agent (Claude Code, Codex, Antigravity, Grok) qua SSH+tmux, kèm bot Telegram riêng. Khách dùng agent từ bất kỳ đâu.

Sơ đồ: 1 chiếc Agent-Box trông như thế nào

Khách — điện thoại / laptopdùng từ bất kỳ đâu
SSH qua Tailscale (admin) Telegram (thông báo)
Ubuntu Server — laptop / mini-PC đặt tại nhà khách
Bảo mật: UFW · Fail2ban · SSH hardening · tự vá lỗi
Tailscale (bắt buộc) · Cloudflare Tunnel (tuỳ chọn)
4 AI CLI: Claude · Codex · agy · Grok (chạy trong tmux)
sl-bot (long-poll) · secrets.env (mode 600)
Docker · Caddy (tuỳ chọn — web + HTTPS)
Nhiều người dùng: nhóm agent-team · thư mục /srv/shared
3 nguyên tắc khi làm:
  1. Chạy từng lệnh một (đừng copy cả khối).
  2. Ghi chép IP/mật khẩu/token vào tab Checklist bàn giao (điền + lưu file).
  3. Gặp lỗi → chụp/copy lỗi hỏi AI.

Luồng cài đặt — 9 bước

1Chuẩn bị
2Cài Ubuntu
3SSH
4Bảo mật
5Tailscale
6Docker
74 AI CLI
8Bot Telegram
9Bàn giao

1. Cài nhanh — script tự động (khuyên dùng)

Sau khi đã có Ubuntu + SSH (mục 3–4), phần lớn việc còn lại tự động bằng 1 script. Copy thư mục agent-box/ lên máy rồi chạy:

cd agent-box
bash bootstrap-agent-box.sh            # mặc định: có Caddy
# tuỳ chọn: --no-caddy  |  --with-tunnel (web ra internet)  |  --with-modules (Samba/Syncthing/Cockpit)

Script tự cài: công cụ cơ bản, UFW/Fail2ban/SSH hardening, Tailscale, Docker, Node + 4 AI CLI, Caddy, bot Telegram (sl-bot) + skills sl-*, banner thương hiệu. Idempotent — chạy lại an toàn. Bên dưới là bản thủ công để hiểu rõ / xử lý khi script lỗi.

2. Chuẩn bị

Phần cứngTài khoản tạo trước
Mini-PC/laptop: RAM ≥ 4GB, ổ ≥ 64GB · USB ≥ 4GB · màn hình+bàn phím (lúc cài) · dây mạng LAN Cloudflare (nếu cần web public) · Tailscale · GitHub · tài khoản AI của KHÁCH (Anthropic/OpenAI/Google/xAI)

Tải: Ubuntu Server 24.04 LTS (ubuntu.com/download/server) · Rufus (Windows) hoặc Balena Etcher (macOS) để tạo USB boot.

3. Cài Ubuntu Server

  1. Tạo USB boot (Rufus/Etcher → chọn file .iso).
  2. Cắm USB, vào Boot Menu (F12/F2/Del) → Try or Install Ubuntu Server.
  3. Ngôn ngữ English · Keyboard US · bản Ubuntu Server (không GUI).
  4. Mạng — để DHCP (tự xin IP): giữ mặc định (Automatic). KHÔNG đặt IP tĩnh cứng — khi bàn giao sang mạng khác của khách dễ bị sai subnet/trùng IP → mất kết nối. Ta sẽ truy cập bằng TÊN máy (mục 6), không cần nhớ IP.
    Muốn ghim IP trong nhà khách? Dùng DHCP reservation trên router của khách (gán theo MAC) — an toàn hơn IP tĩnh cứng, không lo trùng.
  5. Proxy: trống · Storage: Use entire disk (+LVM).
  6. Profile: hostname đặt theo khách (vd agentbox-khachA — dùng cho tên truy cập), username, mật khẩu mạnh (≥12).
  7. Ubuntu Pro: Skip.
  8. Tick "Install OpenSSH server".
  9. Snaps: không chọn → cài → Reboot, rút USB.

Sau reboot, đăng nhập rồi lấy IP: ip addr show (dòng inet 192.168.x.x).

4. Kết nối SSH (+ SSH key)

SSH — điều khiển máy từ xa qua dòng lệnh

Là gì?
Cửa vào máy chủ bằng bàn phím từ máy khác — như "điều khiển từ xa" nhưng bằng lệnh. SSH key = cặp chìa khoá thay cho gõ mật khẩu mỗi lần.
Vì sao cần?
Cài xong màn hình+bàn phím tháo ra; mọi thao tác về sau đều qua SSH. Key giúp đăng nhập nhanh & an toàn hơn mật khẩu.
Bỏ qua được?
Không — đây là đường vào chính. (SSH key có thể để sau, nhưng nên làm luôn.)
# từ máy cá nhân (PowerShell/Terminal)
ssh username@192.168.1.100

# tạo SSH key để khỏi nhập mật khẩu mỗi lần
ssh-keygen -t ed25519 -C "email@example.com"      # Enter 3 lần
ssh-copy-id username@192.168.1.100                # (macOS/Linux)  → nhập mật khẩu lần cuối
Windows: xem key bằng type $env:USERPROFILE\.ssh\id_ed25519.pub, rồi paste vào ~/.ssh/authorized_keys trên server (chmod 700 ~/.ssh; chmod 600 ~/.ssh/authorized_keys).

5. Bảo mật (script làm tự động — đây là bản tay)

Bảo mật cơ bản — UFW · Fail2ban · SSH hardening · tự vá lỗi

Là gì?
UFW = tường lửa, chỉ mở đúng cổng cần. Fail2ban = bảo vệ chống dò mật khẩu (sai 3 lần → cấm 24h). SSH hardening = cấm đăng nhập root, giới hạn số lần thử. unattended-upgrades = tự vá lỗi bảo mật.
Vì sao cần?
Máy đặt ở nhà khách, nối internet → luôn có kẻ dò tự động. 4 lớp này chặn gần hết các đợt tấn công phổ thông.
Bỏ qua được?
Không nên. Đây là mức bảo mật tối thiểu cho mọi máy chủ.
sudo apt update && sudo apt upgrade -y
sudo apt install -y ufw fail2ban
sudo ufw allow OpenSSH && sudo ufw --force enable
# Fail2ban: bật bảo vệ SSH (script tạo /etc/fail2ban/jail.local: maxretry 3, bantime 24h)
sudo systemctl enable --now fail2ban
# SSH: cấm root, giới hạn thử
sudo sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
sudo systemctl restart ssh

6. Truy cập bằng TÊN — Tailscale + .local

Tailscale — mạng riêng, vào máy từ xa mà không mở cổng

Là gì?
Một "đường hầm riêng" nối máy bạn với box của khách — như có chìa khoá vào nhà từ xa mà không phải mở toang cửa ra internet. Kèm MagicDNS để gọi máy bằng tên.
Vì sao cần?
Giải quyết nỗi lo "đổi mạng / trùng IP khi bàn giao": không phụ thuộc IP LAN. Khách đổi router/nhà mạng, bạn vẫn SSH vào được bằng tên máy — và không mở cổng nào ra internet (an toàn hơn nhiều).
Bỏ qua được?
Không — đây là bắt buộc. Là cách quản trị box từ xa an toàn nhất.
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up --hostname=agentbox-khachA   # đăng nhập 1 lần; đặt tên máy theo khách
sudo systemctl enable tailscaled
sudo ufw allow in on tailscale0
sudo apt install -y avahi-daemon               # để có "ten-may.local" trong LAN
Truy cậpLệnhHoạt động khi…
Từ xa (mọi nơi)ssh user@agentbox-khachABật MagicDNS (1 lần ở login.tailscale.com/admin/dns) — chạy trên MẠNG NÀO CŨNG ĐƯỢC, khách đổi router/IP vẫn vào.
Trong nhà khách (LAN)ssh user@agentbox-khachA.localavahi/mDNS — Windows/Mac/Linux đều thấy, khỏi biết IP.
Dự phòngssh user@100.x.x.xtailscale ip -4
Gõ gọn trên máy bạn — thêm vào ~/.ssh/config rồi chỉ cần ssh khachA:
Host khachA
    HostName agentbox-khachA      # Tailscale MagicDNS (hoặc agentbox-khachA.local trong LAN)
    User username
(Script bootstrap-agent-box.sh --name agentbox-khachA tự đặt hostname + in sẵn đoạn này.)

7. Docker + tmux

Docker — "đóng hộp" ứng dụng chạy cô lập

Là gì?
Công cụ đóng gói mỗi app + mọi thứ nó cần vào 1 "hộp" (container) chạy riêng, không đụng phần còn lại của máy. tmux = giữ phiên làm việc chạy nền dù đóng máy/rớt mạng.
Vì sao cần?
Chạy nhiều app không xung đột; cài/gỡ sạch sẽ. tmux để agent AI vẫn chạy khi bạn đóng laptop.
Bỏ qua được?
Docker: bỏ được nếu khách không deploy app đóng gói. tmux: nên có (agent cần chạy nền).
# Docker (script làm tự động). tmux để agent chạy nền khi đóng máy:
sudo apt install -y tmux
tmux new -s ai      # tạo phiên ;  Ctrl+b rồi d = thoát (vẫn chạy) ;  tmux attach -t ai = quay lại

8. Agent — 4 AI CLI (đăng nhập bằng tài khoản của KHÁCH)

4 AI CLI — Claude Code · Codex · Antigravity · Grok

Là gì?
4 trợ lý AI chạy bằng dòng lệnh ngay trên box: claude (Anthropic), codex (OpenAI), agy (Google Antigravity), grok (xAI). Cài trên nền Node.
Vì sao cần?
Đây là "sản phẩm chính": khách SSH vào box, chạy agent AI để viết/sửa code, tự động hoá việc. Mỗi CLI khách tự đăng nhập bằng tài khoản riêng → Song Linh Plus không gánh chi phí AI.
Bỏ qua được?
Cài cái nào khách dùng. Không nhất thiết cả 4 — nhưng script cài sẵn cho đủ lựa chọn.
AgentLệnh càiChạy
Claude Code (Anthropic)npm i -g @anthropic-ai/claude-codeclaude
Codex (OpenAI)npm i -g @openai/codexcodex
Antigravity (Google)curl -fsSL https://antigravity.google/cli/install.sh | bashagy
Grok Build (xAI)curl -fsSL https://x.ai/cli/install.sh | bashgrok
# lần đầu mỗi CLI: chạy nó để đăng nhập (qua SSH nó in URL+code, dán vào trình duyệt)
tmux new -s ai
claude          # đăng nhập tài khoản Anthropic của khách
# tương tự: codex / agy / grok
# Ctrl+b d để thoát — agent vẫn chạy; đóng laptop vẫn ok
Dùng agent trong thư mục ~/projects/<ten-du-an>. Skill sl-box (đã cài) nhắc sẵn các lệnh máy.

9. Bot Telegram riêng của khách

Bot Telegram — thông báo & điều khiển qua Telegram

Là gì?
Một bot Telegram riêng của mỗi khách: gửi thông báo từ box về điện thoại và nhận lệnh /status. Dùng cơ chế long-polling (bot tự hỏi Telegram) nên không cần mở port hay Cloudflare.
Vì sao cần?
Biết ngay tình trạng máy/việc mà không cần SSH; 1 máy = 1 bot riêng, cô lập hoàn toàn giữa các khách.
Bỏ qua được?
Có — nếu khách không cần thông báo. Nhưng rất tiện & nhẹ, nên khuyên bật.
  1. Mở @BotFather trên Telegram → /newbot → đặt tên → nhận BOT_TOKEN.
  2. Lấy chat-id: nhắn @userinfobot → copy số id của bạn.
  3. Điền vào ~/.config/agent-box/secrets.env (mode 600 — script tạo sẵn template):
    BOT_TOKEN=123456:ABC...
    ADMIN_CHAT_IDS=123456789
  4. Bật + test:
    sudo systemctl restart agent-box-bot
    /opt/agent-box/sl-bot/notify.sh "Xin chào từ Agent-Box"   # → nhận tin trên Telegram
    # trong Telegram nhắn /status để xem tình trạng máy

10. Caddy — deploy web app (cài mặc định)

Caddy — web server tự động cấp HTTPS

Là gì?
Một web server nhận yêu cầu từ tên miền rồi chuyển vào app của khách, tự xin chứng chỉ HTTPS (ổ khoá xanh) không cần cấu hình rối.
Vì sao cần?
Khi khách chạy web app/site có tên miền: Caddy định tuyến theo tên miền + bật HTTPS tự động.
Bỏ qua được?
Có — nếu khách chỉ dùng agent qua SSH. Cứ để đó không hại, hoặc cài với --no-caddy để bỏ.
sudo nano /etc/caddy/Caddyfile
vidu.com {
    reverse_proxy localhost:3000      # app Node/Python chạy cổng 3000
}
tinh.vidu.com {
    root * /var/www/tinh
    file_server                        # web tĩnh
}
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy
Web ra internet? Chạy lại script với --with-tunnel (Cloudflare Tunnel) — đưa app ra ngoài không cần mở port/IP tĩnh public. Trỏ tunnel thẳng vào localhost:port, hoặc qua Caddy nếu nhiều site.

11. Bàn giao & lệnh thường dùng

Chuyển sang tab Checklist bàn giao (ở đầu trang) để điền thông tin + chạy smoke test + lưu lại thành file JSON/Markdown trước khi giao. Lệnh hay dùng:

ViệcLệnh
IP truy cập xatailscale ip -4
Tình trạng dịch vụsystemctl status agent-box-bot docker caddy tailscaled
Gửi thông báo/opt/agent-box/sl-bot/notify.sh "..."
Reload websudo systemctl reload caddy
Dọn ổ đĩadocker system prune -a · sudo apt autoremove

12. Nhiều người dùng & module thêm

Nhiều người dùng — mỗi người 1 session/folder riêng

Là gì?
Mỗi người = 1 tài khoản Linux riêng → tự cô lập home + phiên làm việc. Nhóm agent-team + thư mục chung /srv/shared để chia sẻ khi cần.
Vì sao cần?
Khi 1 box phục vụ nhiều nhân viên: ai làm việc nấy, không giẫm chân, mỗi người đăng nhập AI bằng tài khoản của họ.
Bỏ qua được?
Có — nếu chỉ 1 người dùng box.

Admin tạo người dùng bằng 1 lệnh:

sudo /opt/agent-box/sl-adduser.sh nhanvienA --shared      # cho thấy /srv/shared
sudo /opt/agent-box/sl-adduser.sh sep --sudo --shared     # admin phụ

Người dùng đăng nhập (ssh nhanvienA@ten-may hoặc Cockpit web → Terminal) → tmux new -s ai → chạy claude/codex bằng tài khoản AI của họ. Giới hạn 1 folder cụ thể: setfacl -R -m u:nhanvienA:rwx /srv/duan-x.

2 nhân sự · 2 session riêng · 1 dự án chung

Cô lập thế nào?
Session riêng = tài khoản Linux riêng. tmux mỗi người ở socket /run/user/<uid>/… quyền 700tmux ls của người này không thấy session người kia. Thêm /srv/shared chỉ chia sẻ file dữ liệu, KHÔNG đụng cấu hình (~/.claude, đăng nhập Claude, secrets.env vẫn riêng).
Cách A vs B?
A (ACL): 1 folder, cấp đúng vài người — setfacl. B (nhóm): cả nhóm agent-team + /srv/shared — dưới đây.

Cách B — admin dựng 1 lần (ví dụ 2 nhân sự alice, bob; KHÔNG cấp --sudo để họ không xem session của nhau):

# tạo user + vào nhóm chung, siết home riêng tư
sudo /opt/agent-box/sl-adduser.sh alice --shared
sudo /opt/agent-box/sl-adduser.sh bob   --shared
sudo chmod 750 /home/alice /home/bob

# thư mục dự án chung (setgid: file mới tự thuộc nhóm) + git chống đè nhau
sudo install -d -m 2770 -g agent-team /srv/shared/du-an-x
echo 'umask 002' | sudo tee -a /home/alice/.bashrc /home/bob/.bashrc   # nhóm ghi được file mới
cd /srv/shared/du-an-x && sudo git init -b main

Hoặc 1 lệnh (tạo folder + set nhóm/umask cho tất cả thành viên):

sudo /opt/agent-box/sl-adduser.sh alice --project du-an-x --members alice,bob

Mỗi người làm việc bằng tài khoản của mình: ssh alice@ten-maytmux new -s workcd /srv/shared/du-an-xclaude (đăng nhập tài khoản Claude của họ). Cùng sửa 1 bộ file, session tách biệt.

Kiểm nhanh: sudo -u bob tmux ls không thấy session của alice · sudo -u bob ls /home/alice/projects báo Permission denied = đúng. Chi tiết + xử lý lỗi: docs/huong-dan-multi-user-cach-b-agent-team.md.

Module bật-khi-cần

ModuleLà gì / dùng khi nàoBật + dùng
Samba
ổ mạng
Biến /srv/shared thành ổ đĩa mạng cho Windows/Mac — kéo-thả file như ổ thường.Bật: --with-samba · Windows \\ten-may\shared · Mac smb://ten-may.local · mật khẩu: sudo smbpasswd -a <user>
Syncthing
đồng bộ
Đồng bộ thư mục 2 chiều giữa box ↔ máy/điện thoại, không qua cloud.Bật: --with-syncthing · UI :8384 (qua SSH/Tailscale)
Cockpit
quản trị web
Trang web quản trị máy: tạo user, mở Terminal, theo dõi tài nguyên — cho người ngại dòng lệnh.Bật: --with-cockpit · https://ten-may.local:9090

Bật cả ba: bash bootstrap-agent-box.sh --name agentbox-khachA --with-modules.

Các trang quản trị (Cockpit/Syncthing/Samba) chỉ cho LAN + Tailscale, KHÔNG public.

13. Lỗi thường gặp

Triệu chứngKiểm tra
SSH không vào đượcping 192.168.1.100 · sai IP/firewall · ssh -v ...
Bot không trả lờisudo systemctl status agent-box-bot · token/chat-id trong secrets.env · bạn có trong ADMIN_CHAT_IDS?
Web không lênsudo journalctl -u caddy -n 50 · app chạy chưa? curl localhost:3000
Agent CLI không thấymở SSH mới (PATH nvm/~/.local/bin) · đăng nhập lại CLI
Docker cần sudođăng xuất/đăng nhập lại sau khi thêm group docker
Bảo mật: chỉ truy cập admin qua Tailscale; không expose bot/agent ra internet; đổi mật khẩu mặc định; giữ secrets.env bí mật (mode 600).

Agent-Box · Dùng hằng ngày

Hướng dẫn sử dụng hàng ngày

Dành cho người dùng box mỗi ngày: kết nối vào máy, chạy AI chạy nền, làm dự án chung, dùng bot Telegram. Không cần biết cài đặt — phần đó đã xong ở tab Hướng dẫn cài đặt.

Nhớ 3 bước mỗi ngày
1Kết nốiSSH qua Tailscale
2Vào phiên AItmux attach -t ai
3Giao việc cho AIgõ việc cần làm

Xong thì Ctrl-b rồi d để thoát — AI vẫn chạy tiếp.

1. Kết nối vào máy

CáchLàm gìKhi nào
SSH qua Tailscale
chính
ssh <ten-cua-ban>@<ten-may> — bật Tailscale trên máy/điện thoại trước, rồi mở Terminal.Mọi nơi, mọi lúc (không cần cùng mạng nhà).
Cockpit web
ngại lệnh
Mở https://<ten-may>.local:9090 → đăng nhập → Terminal.Trong LAN, thích giao diện web (nếu đã bật --with-cockpit).
Mỗi người đăng nhập bằng tài khoản của chính mình — không dùng chung. Session của bạn tách biệt với người khác.

2. tmux — để AI chạy nền (đóng máy vẫn chạy)

tmux giữ phiên làm việc sống ngay cả khi bạn tắt Terminal / rớt mạng / đóng laptop. Chỉ cần nhớ vài lệnh:

ViệcLệnh
Mở phiên mới tên aitmux new -s ai
Thoát ra (AI chạy tiếp)bấm Ctrl-b rồi thả, bấm d
Quay lại phiên cũtmux attach -t ai
Xem các phiên đang cótmux ls chỉ thấy phiên của bạn
Cuộn xem lại (thoát: q)bấm Ctrl-b rồi [ , dùng mũi tên/PageUp

3. Chạy AI agent (Claude / Codex)

Trong phiên tmux, gõ tên agent để bắt đầu:

claude          # hoặc: codex
# Lần đầu sẽ hỏi đăng nhập → dùng TÀI KHOẢN AI CỦA BẠN (mở link, dán mã).
# Gõ yêu cầu bằng tiếng Việt. Thoát agent: gõ /exit (hoặc Ctrl-c 2 lần).
Đăng nhập 1 lần là nhớ. Rớt mạng giữa chừng: kết nối lại → tmux attach -t ai là thấy AI vẫn đang làm.

4. Làm dự án chung — nhiều người, mỗi người 1 phiên

Nếu admin đã tạo dự án chung, vào thư mục dự án rồi chạy AI ở đó. Cả nhóm sửa chung 1 bộ file, nhưng phiên ai nấy chạy:

cd /srv/shared/<ten-du-an>
git pull                 # lấy thay đổi mới nhất của người khác (nếu dùng git)
claude                   # làm việc
git add -A && git commit -m "viec cua toi" && git push   # lưu + chia sẻ
Tránh đè nhau: 2 người sửa cùng 1 file cùng lúc sẽ xung đột. Nên mỗi người 1 nhánh/thư mục con, hoặc hỏi nhau trước khi sửa file chung. Chi tiết cho admin: tab cài đặt §12 + docs/huong-dan-multi-user-cach-b-agent-team.md.

5. Bot Telegram

Lệnh / việcKết quả
Nhắn /status cho botBot báo tình trạng máy (CPU, ổ đĩa, dịch vụ).
Nhắn /helpDanh sách lệnh bot hiểu.
Nhận thông báo tự độngBot tự nhắn khi có sự kiện (backup, cảnh báo…). Không cần làm gì.

6. Đăng web app (nếu box có Caddy)

# chạy app của bạn ở 1 cổng, ví dụ localhost:3000, rồi trỏ tên miền qua Caddy
sudo nano /etc/caddy/Caddyfile     # thêm: ten-mien.com { reverse_proxy localhost:3000 }
sudo systemctl reload caddy        # áp dụng — Caddy tự lo HTTPS

Bỏ qua mục này nếu chỉ dùng AI qua SSH.

7. An toàn & khi gặp lỗi

Tình huốngLàm gì
Gặp lỗi bất kỳChụp / copy đúng dòng lỗi → dán hỏi AI (claude) hoặc gửi admin. Đừng đoán mò.
Quên mình đang ở đâupwd (thư mục hiện tại) · tmux ls (các phiên) · whoami (tài khoản).
AI/Terminal bị treoCtrl-c để dừng lệnh · thoát tmux (Ctrl-b d) rồi attach lại.
Bảo mậtKhông đưa mật khẩu/token cho người ngoài · chỉ vào máy qua Tailscale · không tự ý mở cổng ra internet.
Việc bàn giao/kiểm tra máy cho khách: xem tab Checklist bàn giao.

Agent-Box · Bàn giao khách

Checklist bàn giao Agent-Box

Điền thông tin, tích các mục đã xong, rồi bấm Lưu JSON hoặc Lưu Markdown để tải file lưu trữ. Dữ liệu tự lưu trên trình duyệt này (không gửi đi đâu).

Bản này chứa thông tin nhạy cảm khi điền (mật khẩu/token) — lưu bảo mật, KHÔNG public/đưa người ngoài. Dữ liệu chỉ nằm trên máy bạn (localStorage + file tải về).

1. Thông tin khách

Tên kháchNgày cài
HostnameUsername
IP nội bộTailscale IP
Domain (nếu có)Telegram chat-id
Telegram BOT_TOKEN
Tài khoản AI của khách   email:

2. Checklist cài đặt

3. Smoke test (BẮT BUỘC trước bàn giao)

4. Bàn giao cho khách

Người cài:   Ngày bàn giao:   Khách xác nhận:
Tự lưu trên trình duyệt này