Ảnh minh họa triển khai EmDash trên Ubuntu 22.04 với Nginx, systemd và HTTPS

Hướng dẫn cài đặt EmDash chi tiết trên Ubuntu 22.04 (Nginx + systemd + SSL) cho emdash.22.id.vn

(Đã bổ sung ảnh minh họa ở đầu bài)

Trong bài này mình sẽ hướng dẫn cài đặt EmDash (self-host) trên Ubuntu 22.04 theo mô hình Node/Astro + Nginx + systemd + SSL Let’s Encrypt. Đây là cách triển khai ổn định, dễ vận hành và phù hợp cho VPS/VM.

Lưu ý về tên miền: Trong bài viết này, mình sử dụng tên miền emdash.22.id.vn làm ví dụ. Bạn hãy thay thế bằng tên miền của riêng mình (ví dụ: cms.yourdomain.com) ở tất cả các bước bên dưới. Đảm bảo domain đã trỏ A record về IP server của bạn trước khi bắt đầu.

1) Chuẩn bị

Bạn cần:

• Ubuntu 22.04 với quyền sudo

• Tên miền đã trỏ A record về IP server (ví dụ: emdash.22.id.vn → thay bằng domain của bạn)

• Mở port 80/443 trên firewall

• Đã cài sẵn git và curl

2) Cài Node.js và pnpm

Kiểm tra phiên bản Node và NPM:

node -v
npm -v

Cài pnpm:

sudo npm i -g pnpm@latest
pnpm -v

3) Clone mã nguồn EmDash và cài dependencies

Cài vào thư mục /srv/emdash:

sudo mkdir -p /srv
cd /srv
sudo git clone https://github.com/emdash-cms/emdash.git
cd emdash

Cài dependencies:

pnpm install

4) Build demo site (production)

Build demo site demos/simple:

cd /srv/emdash
pnpm --filter emdash-demo build

Server entry sau build thường nằm tại:

/srv/emdash/demos/simple/dist/server/entry.mjs

5) (Quan trọng) Fix reverse proxy: tắt checkOrigin

Khi chạy sau Nginx reverse proxy, một số request POST có thể bị chặn do kiểm tra origin/CSRF. Cần tắt checkOrigin trong astro.config.mjs:

nano /srv/emdash/demos/simple/astro.config.mjs

Thêm cấu hình sau:

security: {
  checkOrigin: false,
},

Build lại sau khi sửa:

cd /srv/emdash
pnpm --filter emdash-demo build

6) Tạo systemd service để chạy EmDash

Tạo file service. Lưu ý thay emdash.22.id.vn bằng domain của bạn ở dòng EMDASH_PUBLIC_URL:

sudo nano /etc/systemd/system/emdash.service

Nội dung file:

[Unit]
Description=EmDash (Astro Node)
After=network.target

[Service]
Type=simple
WorkingDirectory=/srv/emdash/demos/simple
Environment=HOST=127.0.0.1
Environment=PORT=4322
Environment=NODE_ENV=production
# Đổi domain bên dưới thành tên miền của bạn
Environment=EMDASH_PUBLIC_URL=https://emdash.22.id.vn
ExecStart=/usr/bin/node /srv/emdash/demos/simple/dist/server/entry.mjs
Restart=on-failure
RestartSec=3
User=root

[Install]
WantedBy=multi-user.target

Enable và start service:

sudo systemctl daemon-reload
sudo systemctl enable --now emdash.service
sudo systemctl status emdash.service --no-pager -l

Test local:

curl -I http://127.0.0.1:4322

7) Cài Nginx reverse proxy

Cài Nginx:

sudo apt update
sudo apt install -y nginx

Tạo file vhost. Thay emdash.22.id.vn bằng domain của bạn:

# Thay YOUR_DOMAIN bằng domain của bạn, ví dụ: cms.yourdomain.com
sudo nano /etc/nginx/sites-available/YOUR_DOMAIN.conf

Nội dung file (thay emdash.22.id.vn thành domain của bạn):

server {
    listen 80;
    listen [::]:80;
    # Đổi server_name thành domain của bạn
    server_name emdash.22.id.vn;

    location / {
        proxy_pass http://127.0.0.1:4322;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Port $server_port;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

Enable site và reload Nginx:

# Thay YOUR_DOMAIN bằng domain của bạn
sudo ln -sf /etc/nginx/sites-available/YOUR_DOMAIN.conf /etc/nginx/sites-enabled/YOUR_DOMAIN.conf
sudo nginx -t
sudo systemctl reload nginx

8) Bật HTTPS bằng Let’s Encrypt (Certbot)

Cài certbot:

sudo apt install -y certbot python3-certbot-nginx

Xin SSL và tự động redirect HTTPS. Thay emdash.22.id.vn bằng domain của bạn:

# Thay domain bên dưới thành của bạn
sudo certbot --nginx -d emdash.22.id.vn --redirect

9) Link quản trị và vận hành

Sau khi cài xong, truy cập admin panel và setup (thay domain tương ứng):

Admin panel:  https://your-domain.com/_emdash/admin
Setup:        https://your-domain.com/_emdash/admin/setup

Xem log hệ thống:

journalctl -u emdash.service -n 200 --no-pager

Lưu ý

• Khi dùng passkeys/WebAuthn, hãy đảm bảo site chạy HTTPS và cấu hình EMDASH_PUBLIC_URL đúng domain để tránh lỗi mismatch origin.

• Nếu bạn dùng domain khác, nhớ thay thế emdash.22.id.vn bằng domain của bạn ở cả 3 nơi: systemd service (EMDASH_PUBLIC_URL), Nginx vhost (server_name), và Certbot (tham số -d).

• Sau khi đổi domain, cần restart service và reload Nginx:

sudo systemctl restart emdash.service
sudo systemctl reload nginx

No comments yet