Cài đặt
Yêu cầu hệ thống
Phần tiêu đề “Yêu cầu hệ thống”Phần cứng tối thiểu: 2 GB RAM (dev) / 4 GB RAM (production 1-10 users) · 10 GB disk trống · 2 vCPU.
Phần mềm: Docker Engine 24+ và Docker Compose plugin v2.20+ · Git. PostgreSQL không cần cài riêng — chạy trong Docker.
OS hỗ trợ: Ubuntu 22.04 / 24.04 LTS (khuyến nghị cho production) · Debian 12+ · macOS + Windows/WSL2 (chỉ dev).
Cài đặt nhanh cho dev (5 phút)
Phần tiêu đề “Cài đặt nhanh cho dev (5 phút)”Chạy local trên laptop để demo / develop.
-
Clone repo
Terminal window git clone https://github.com/bsdinsight/realtypro.gitcd realtypro -
Tạo file
.env+ đặt password mạnhTerminal window cp .env.example .envPOSTGRES_PASSWORD=<random-string-32-chars> -
Boot PostgreSQL trước
Terminal window docker compose up -d dbdocker compose logs -f db# Ctrl-C sau khi thấy "database system is ready to accept connections" -
Boot Odoo
Terminal window docker compose up -d odoodocker compose logs -f odoo# Ctrl-C sau khi thấy "HTTP service running" -
Truy cập
http://localhost:8169/odoo— login mặc địnhadmin/admin. -
Cài 6 module — Settings → Apps → Update Apps List → search “Realty” → cài cả 6 (
re_loan,rp_estimate,rp_contract,rp_progress,rp_contractor,rp_loan_bridge). Dependencies tự xử lý thứ tự.
Triển khai production trên VPS
Phần tiêu đề “Triển khai production trên VPS”Phù hợp cho 5-50 user, nhiều dự án, backup tự động.
Kiến trúc
Phần tiêu đề “Kiến trúc”Internet └── domain.com (DNS) └── Cloudflare Tunnel HOẶC Nginx + Let's Encrypt └── Docker network → odoo container :8069 ├── realtypro-odoo (Odoo 19) ├── realtypro-db (PostgreSQL 16) └── realtypro-cloudflared (tunnel client, tuỳ chọn)-
Pre-flight (VPS Ubuntu 22.04+)
Terminal window curl -fsSL https://get.docker.com | shsudo usermod -aG docker $USER # logout/login lại để group có hiệu lựcdocker --version # >= 24docker compose version # >= v2.20 -
Clone + cấu hình
.envTerminal window cd /opt && git clone https://github.com/bsdinsight/realtypro.git && cd realtyprocp .env.example .env && nano .envĐặt:
POSTGRES_PASSWORD(random 32+ ký tự) ·TUNNEL_TOKEN(để trống tạm) ·ADMIN_PASSWD(random, KHÔNG dùng “admin”). -
Init theo thứ tự (Postgres trước, Odoo sau)
Terminal window docker compose up -d db && docker compose logs -f db # đợi "ready"docker compose up -d odoo && docker compose logs -f odoo # đợi "HTTP service running" -
Tạo DB + cài modules
Terminal window docker compose exec -T db createdb -U odoo devdocker compose exec odoo odoo -d dev -i base --stop-after-init --no-httpdocker compose exec odoo odoo -d dev \-i re_loan,rp_estimate,rp_contract,rp_progress,rp_contractor,rp_loan_bridge \--stop-after-init --no-httpdocker compose restart odoo
Restore từ backup (migrate dev → prod)
Phần tiêu đề “Restore từ backup (migrate dev → prod)”Trên máy nguồn: ./backup.sh → copy backups/ sang VPS qua scp. Trên VPS:
cd /opt/realtypro# Drop DB cũ + tạo lạidocker compose exec -T db psql -U odoo -d postgres -c \ "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname='dev';"docker compose exec -T db psql -U odoo -d postgres -c "DROP DATABASE IF EXISTS dev;"docker compose exec -T db createdb -U odoo dev# Restore dump + filestoregunzip -c restore/dev.dump.gz | docker compose exec -T db pg_restore -U odoo --no-owner -d devmkdir -p data/filestore && tar -xzf restore/filestore.tar.gz -C data/filestore/# Fix quyền filestore (extract bởi root → Odoo uid 101 không write được)docker compose exec --user root odoo chown -R odoo:odoo /var/lib/odoo# Đổi web.base.url cho hostname mới + clear asset cachedocker compose exec -T db psql -U odoo -d dev -c " UPDATE ir_config_parameter SET value='https://your-domain.com' WHERE key='web.base.url'; UPDATE ir_config_parameter SET value='False' WHERE key='web.base.url.freeze'; DELETE FROM ir_attachment WHERE name LIKE '%web.assets%';"docker compose restart odooExpose ra Internet
Phần tiêu đề “Expose ra Internet”Phương án A — Cloudflare Tunnel (khuyến nghị)
Phần tiêu đề “Phương án A — Cloudflare Tunnel (khuyến nghị)”Không cần mở port public, không cần SSL cert riêng, miễn phí.
- Cloudflare Zero Trust → Networks → Tunnels → Create tunnel → Connector Docker → copy token
eyJ.... - Dán chỉ token vào
/opt/realtypro/.env:TUNNEL_TOKEN=eyJ...(không paste full lệnhdocker run). - Cloudflare Public Hostname: Subdomain
realtypro· Domainyour-domain.com· Path để trống · ServiceHTTP→odoo:8069. - Start:
docker compose --profile tunnel up -d cloudflared— đợi “Connection registered”.
Phương án B — Nginx + Let’s Encrypt
Phần tiêu đề “Phương án B — Nginx + Let’s Encrypt”Cần port 80/443 public.
sudo apt install nginx certbot python3-certbot-nginxsudo cp nginx/sites-available/realtypro.conf.example /etc/nginx/sites-available/realtypro.confsudo ln -s /etc/nginx/sites-available/realtypro.conf /etc/nginx/sites-enabled/sudo nginx -t && sudo systemctl reload nginxsudo certbot --nginx -d realtypro.your-domain.comNginx proxy realtypro.your-domain.com → localhost:8169.
Cài đặt Enterprise modules
Phần tiêu đề “Cài đặt Enterprise modules”Realty Project Enterprise có thêm: Bryntum Gantt (Critical Path, Resource Leveling), không giới hạn quy mô, multi-company, hỗ trợ cao cấp. License OPL-1 — cần key từ BSD Insight: liên hệ qua trang Liên hệ.
Sau khi được cấp truy cập repo private:
cd /opt && git clone https://github.com/bsdinsight/realtypro-enterprise.gitMount thêm enterprise addons trong docker-compose.yml + cập nhật addons_path trong odoo.conf, rồi:
docker compose restart odoodocker compose exec odoo odoo -d dev -u all --stop-after-init --no-httpApply license: Settings → General → License key.
Verify
Phần tiêu đề “Verify”docker compose exec -T db psql -U odoo -d dev -c \ "SELECT name, latest_version FROM ir_module_module WHERE state='installed' AND (name LIKE 're_%' OR name LIKE 'rp_%') ORDER BY name;"Phải thấy 6 module Realty Project + dependencies. Trên browser: menu Realty Project xuất hiện với Quản lý Vay, HĐ nhà thầu, Đấu thầu…
Checklist bảo mật trước go-live
Phần tiêu đề “Checklist bảo mật trước go-live”POSTGRES_PASSWORDđổi từ mặc định- Password admin + master password (
admin_passwd) đổi từ “admin” - Daily backup cron + ship off-VPS (S3, B2, rsync sang host khác)
- Firewall: chỉ mở port cần (chỉ outbound nếu dùng Cloudflare Tunnel)
.env+compose.override.ymltrong.gitignore- 2FA cho Cloudflare account (nếu dùng Tunnel)
- SSH key + tắt password auth trên VPS
- Uptime monitor (UptimeRobot, healthchecks.io)
Backup hằng ngày
Phần tiêu đề “Backup hằng ngày”./backup.sh /opt/backups/realtypro# Cron daily 02:30:30 2 * * * root cd /opt/realtypro && ./backup.sh /opt/backups/realtypro >> /var/log/realtypro-backup.log 2>&1Troubleshooting nhanh
Phần tiêu đề “Troubleshooting nhanh”| Lỗi | Nguyên nhân | Fix |
|---|---|---|
lookup odoo ... no such host | cloudflared trên default bridge | Dùng docker compose --profile tunnel up -d cloudflared |
500 PermissionError /var/lib/odoo/sessions | Filestore extract bởi root | docker compose exec --user root odoo chown -R odoo:odoo /var/lib/odoo |
Login redirect về localhost:8169 | web.base.url cũ trong DB từ backup | Update ir_config_parameter + web.base.url.freeze=False |
| Postgres password mới không apply | Postgres chỉ apply lúc init data-dir | Đặt đúng trước docker compose up -d db lần đầu, hoặc ALTER USER |
| Browser load JS cũ | Asset bundle cache | DELETE FROM ir_attachment WHERE name LIKE '%web.assets%'; + Cmd+Shift+R |
Ước lượng RAM
Phần tiêu đề “Ước lượng RAM”| Stack | RAM |
|---|---|
| Odoo (workers=2) | 600 MB – 1 GB |
| PostgreSQL | 200 – 400 MB |
| Cloudflared | 50 MB |
| OS + Docker daemon | 400 – 500 MB |
| Tối thiểu | 1.5 – 2 GB |
Khuyến nghị: VPS 4 GB cho 1-10 users · 8 GB cho 10-50 users · trên 50 users → multi-host.
Tiếp theo: Cấu hình ban đầu →