Tài liệu nhà phát triển
Tiếng Việt

Vận hành máy chủ

Quản trị và cấu hình

Trang quản trị, gửi mã đăng ký (SMS, email), các giá trị cấu hình máy chủ, sao lưu và bảo mật — tài liệu tham chiếu cho người vận hành.

Máy chủ có sẵn một trang quản trị mở bằng trình duyệt. Tại đây bạn xem trạng thái máy chủ, quyết định cách gửi mã đăng ký và đăng nhập, và quản lý người dùng cũng như bot. Tài liệu này là tài liệu tham chiếu, tập hợp trang quản trị và các giá trị cấu hình máy chủ vào một chỗ. Nếu bạn cần cài đặt trước, hãy xem Cài đặt máy chủ.

Giao diện trang quản trị hiện bằng tiếng Hàn. Khi tài liệu này nhắc đến một tab, nút hay mục cài đặt, nhãn tiếng Hàn đúng như trên màn hình được ghi kèm trong ngoặc.

Mở trang quản trị

Trang quản trị nằm ở /admin/ trên cổng HTTP quản trị (8080 trong cấu hình vận hành), và chỉ mở trên chính máy chủ (127.0.0.1). Người vận hành truy cập qua tunnel SSH.

# Trên máy tính của bạn (để nguyên cửa sổ này)
ssh -N -L 8080:127.0.0.1:8080 <người-dùng>@<máy-chủ>
# Trình duyệt: http://localhost:8080/admin/

# Token (trên máy chủ)
sudo cat /srv/pabal/pabal_server/data/admin-token

Nhập token rồi bấm Mở (열기). Trình duyệt sẽ ghi nhớ token; muốn xóa thì bấm Xóa token (토큰 지우기) ở góc trên bên phải. Muốn tự đặt token, hãy truyền TELEGRAM_ADMIN_TOKEN (từ 16 ký tự trở lên) — khi đó máy chủ sẽ không ghi tệp token.

Các tab hiển thị gì

TabNội dungLàm mới
Bảng điều khiển (대시보드)Số người, phiên và kết nối đang truy cập; số người, bot, nhóm, tin nhắn, ảnh; thời gian chạy, cổng, DB, JVM, kiểm tra trạng thái. Nếu số thử nghiệm đang bật thì có dải cảnh báo5 giây
Mã đăng ký (가입 코드)Các mã đang chờ (số điện thoại, cách gửi, trạng thái gửi, mã, thời gian còn lại, số lần nhập sai) và lịch sử gần đây. Sao chép mã, hủy mã3 giây
Người dùng (사용자)Mọi tài khoản — số điện thoại, email đăng nhập (sửa được), có đang truy cập không, số thiết bị đăng nhập, số tin nhắn. Đăng xuất mọi thiết bị (모든 기기 로그아웃), Chặn số (번호 차단)10 giây
Bot ()Các bot được tạo bằng BotFather — người tạo, menu lệnh, cách kết nối (MTProto · HTTP polling · địa chỉ webhook và lý do thất bại), số update đang chờ10 giây
Cài đặt (설정)Quy tắc đăng ký và đăng nhập, SMS, email (SMTP), chặn số điện thoạiLưu thủ công
Lưu trữ (저장소)Thư mục dữ liệu, địa chỉ DB (ẩn mật khẩu), số lượng và dung lượng ảnh, số stream được lưu theo từng loại10 giây

Các thao tác nguy hiểm (đăng xuất, chặn, hủy mã) phải bấm hai lần mới được thực hiện.

Mã đăng ký và đăng nhập

Khi người dùng nhập số điện thoại vào ứng dụng, máy chủ tạo mã và gửi theo cách đã chọn trong tab Cài đặt (설정).

Cách gửiMã được gửi đến đâuMàn hình ứng dụng
Trang quản trị (관리 화면)Tab Mã đăng ký (가입 코드). Người vận hành sao chép và tự báo cho người dùngSố điện thoại → "Đã gửi mã" → nhập mã (nếu là số mới thì nhập tên)
SMSTin nhắn qua một trong Twilio · Solapi · webhookGiống như cách trang quản trị
Email (이메일)Thư qua SMTPSố điện thoại → nhập email → "Đã gửi mã qua email" → nhập mã
  • Với cách email, đăng ký mới có thể dùng địa chỉ bất kỳ, và địa chỉ đó trở thành email đăng nhập của tài khoản. Tài khoản đã có chỉ nhận mã qua email đăng nhập đã đăng ký — để ngăn việc ai đó điền địa chỉ của mình vào số điện thoại của người khác để vào tài khoản. Tài khoản đã có mà chưa có email đăng nhập sẽ được gửi mã qua SMS (nếu đã cấu hình) hoặc qua trang quản trị. Bạn có thể nhập email đăng nhập cho người dùng trong tab Người dùng (사용자).
  • Việc gửi diễn ra ở phía sau, nên ứng dụng chuyển ngay sang màn hình nhập mã. Kết quả gửi (thành công, thất bại và lý do) hiện trong tab Mã đăng ký.
  • Chỉ đăng ký (nhập tên) được sau khi đã nhập đúng mã. Mã sai chỉ được chấp nhận trong số lần cho phép; sau đó ngay cả mã đúng cũng bị từ chối.

Cài đặt — đăng ký và đăng nhập

MụcÝ nghĩaMặc định
Cho phép đăng ký mới (새 가입 허용)Nếu tắt, chỉ tài khoản đã có mới đăng nhập được. Số mới bị từ chối với thông báo "số điện thoại không hợp lệ"Bật
Cách gửi mã (코드 전달 방식)Trang quản trị (관리 화면) / SMS / email (이메일)Trang quản trị
Hiện mã trên trang quản trị (관리 화면에 코드 표시)Hiện mã trong tab Mã đăng ký ngay cả khi dùng cách SMS hoặc email (phòng khi gửi thất bại)Bật
Số thử nghiệm (테스트 번호) (+99966…)Theo cấu hình máy chủ (서버 설정대로) / bật (켜기) / tắt (끄기). Khi vận hành thật thì tắtTheo cấu hình máy chủ
Số chữ số của mã (코드 자릿수) · thời hạn hiệu lực (코드 유효 시간)5–6 chữ số · 1–60 phút5 chữ số · 5 phút
Khoảng cách yêu cầu lại (재요청 간격) · tối đa mỗi ngày (번호당 하루 최대 요청)Số giây trước khi cùng một số được nhận mã lại (0–3600) · số lần tối đa trong 24 giờ (1–1000)60 giây · 10 lần
Số lần nhập sai cho phép (틀린 입력 허용 횟수)Vượt quá thì mã đó bị khóa (1–20)5 lần

Cài đặt — SMS

Nhà cung cấpGiá trị cần điềnGhi chú
WebhookĐịa chỉ nhận (https://…), header Authorization (tùy chọn)Máy chủ gửi POST {"phone":"+8210…","code":"12345","text":"…"}. Phản hồi 2xx là thành công. Dùng khi kết nối với máy chủ SMS riêng hoặc dịch vụ khác
TwilioAccount SID, Auth Token, số gửi hoặc Messaging Service SIDToàn thế giới, kể cả số nước ngoài
Solapi (trước đây là CoolSMS)API Key, API Secret, số gửiSMS trong nước Hàn Quốc. Số gửi phải là số đã được đăng ký trước với Solapi. Số +82 được gửi theo định dạng 010…

Nội dung tin nhắn có thể chứa {code} (mã) và {minutes} (thời hạn hiệu lực). Mặc định: [파발] 인증 코드: {code} (nghĩa là "[Pabal] Mã xác thực: {code}"; mặc định này bằng tiếng Hàn, bạn có thể đổi nội dung). Sau khi lưu, hãy kiểm tra bằng Gửi thử (테스트 발송).

Cài đặt — email (SMTP)

Dịch vụMáy chủ · cổng · bảo mậtTên người dùng · mật khẩu
Gmailsmtp.gmail.com · 587 · STARTTLSĐịa chỉ Gmail · mật khẩu ứng dụng (Tài khoản Google → Bảo mật → Xác minh 2 bước → Mật khẩu ứng dụng)
Naversmtp.naver.com · 587 · STARTTLSID · mật khẩu (bật sử dụng POP3/SMTP trong cài đặt thư)
Máy chủ chuyển tiếp thư nội bộĐịa chỉ relay · 25 · không cóĐể trống

Địa chỉ gửi phải là địa chỉ mà tài khoản SMTP được phép gửi. Tiêu đề và nội dung cũng dùng được {code}, {minutes}.

Quản lý người dùng

  • Đăng xuất mọi thiết bị (모든 기기 로그아웃): ngắt mọi phiên đăng nhập (khóa xác thực) của tài khoản đó. Dùng cho người dùng bị mất thiết bị.
  • Chặn số (번호 차단): số đó không nhận được mã, và tài khoản của số đó bị đăng xuất ngay khỏi mọi thiết bị. Giống với danh sách chặn số điện thoại (전화번호 차단) trong tab Cài đặt.
  • Email đăng nhập (로그인 이메일): cần thiết để tài khoản đã có đăng nhập bằng email khi dùng cách email.
  • @BotFather là bot bên trong máy chủ nên không thể bị đăng xuất.

Quản lý bot

Trong tab Bot (), bạn xem cách kết nối của từng bot — có đang kết nối qua MTProto không, có gọi getUpdates qua HTTP trong 1 phút gần đây không, địa chỉ webhook là gì và hiện có đang thất bại không (kèm lý do). Nếu số update đang chờ cứ tăng mãi, nghĩa là chương trình bot đã dừng hoặc webhook đang thất bại. Việc xóa bot và cấp lại token do người tạo bot thực hiện tại @BotFather.

Biến môi trường

Máy chủ đọc tệp cấu hình (server-config.json) rồi ghi đè bằng biến môi trường. Tệp compose vận hành đã đặt sẵn các giá trị dưới đây, nên thông thường bạn chỉ cần sửa .env.

BiếnÝ nghĩaGiá trị trong compose vận hành
TELEGRAM_PORTCổng MTProtoMTPROTO_PORT (8443)
TELEGRAM_HOSTĐịa chỉ mà MTProto lắng nghe0.0.0.0
TELEGRAM_PUBLIC_HOSTĐịa chỉ máy chủ thông báo cho ứng dụng (help.getConfig)PUBLIC_IP
TELEGRAM_WEB_PORTCổng của trang web, tài liệu, Bot API, trang quản trị8080
TELEGRAM_WEB_HOSTĐịa chỉ mà cổng đó lắng nghe. Mặc định 127.0.0.10.0.0.0 (bên trong container; trên host chỉ công khai ở 127.0.0.1)
TELEGRAM_PUBLIC_URLĐịa chỉ trang web. Dùng cho liên kết (me_url_prefix), liên kết mời, ví dụ trong tài liệu, ảnh xem trướchttps://DOMAIN/
TELEGRAM_DATA_DIRVị trí của ảnh, admin-token, operations.json/app/data
TELEGRAM_RSA_KEYĐường dẫn khóa bí mật RSA của máy chủ (nếu chưa có thì được tạo lần đầu, khóa công khai là .pub)/app/keys/private.pem
TELEGRAM_DC_IDSố DC của máy chủ này(mặc định của image là 1)
TELEGRAM_DB_TYPEmemory · h2 · postgresqlpostgresql
TELEGRAM_DB_URL, TELEGRAM_DB_USERNAME, TELEGRAM_DB_PASSWORDKết nối JDBCjdbc:postgresql://pabal-postgres:5432/pabal, pabal, POSTGRES_PASSWORD
TELEGRAM_DB_MAX_POOL_SIZESố kết nối DB20
TELEGRAM_ADMIN_TOKENToken trang quản trị (nếu để trống thì được tạo trong data/admin-token)ADMIN_TOKEN
TELEGRAM_TEST_NUMBERSSố thử nghiệm +99966…. Chỉ dùng khi phát triểnfalse
TELEGRAM_WEBHOOK_ALLOW_LOCALCho phép webhook của bot dùng http:// và địa chỉ nội bộ. Chỉ dùng khi phát triển(không đặt = false)
JAVA_OPTSTùy chọn JVM (bộ nhớ)Giá trị trong .env

Tệp dữ liệu

TệpNội dungQuyền
keys/private.pemKhóa bí mật RSA của máy chủ. Tuyệt đối không đưa ra ngoài600
keys/private.pem.pubKhóa công khai. Dùng khi build ứng dụng và cho /docs/server-key.pem
data/admin-tokenToken trang quản trị600
data/operations.jsonCác giá trị trong tab Cài đặt — quy tắc đăng ký, giá trị bí mật SMS và SMTP, số bị chặn600
data/media/Ảnh gốc
Bảng events của PostgreSQLTài khoản, cuộc trò chuyện, tin nhắn, đăng nhập, bot, cấu hình webhook — nhật ký của mọi thay đổi

Ghi chú bảo mật

  • Đừng mở cổng quản trị trực tiếp ra Internet. Caddy trong cấu hình vận hành chặn các đường dẫn quản trị như /admin, /health, /metrics bằng 404.
  • Mọi request dữ liệu quản trị đều cần Authorization: Bearer <token>, và trang của website khác không thể đọc được dữ liệu này.
  • Các giá trị bí mật SMS và SMTP chỉ nằm trong operations.json; màn hình và API chỉ báo "đã lưu". Nếu để trống ô giá trị bí mật khi lưu, giá trị cũ vẫn được giữ.
  • Token và giá trị bí mật không bị ghi vào log, còn số điện thoại trong log được che bớt. Địa chỉ Bot API (có chứa token) cũng không được ghi vào log.
  • Khóa xác thực nằm trong DB, nên người truy cập được DB có thể giải mã lưu lượng của người dùng. Hãy bảo vệ DB và bản sao lưu kỹ như khóa RSA.

Giới hạn

  • Mã đang chờ và lịch sử gần đây nằm trong bộ nhớ nên sẽ mất khi máy chủ khởi động lại (chỉ cần yêu cầu lại trong ứng dụng).
  • Việc gửi thật của nhà cung cấp SMS cần được kiểm tra bằng tài khoản của từng nhà cung cấp. Máy chủ tạo request theo đúng tài liệu của từng nhà cung cấp.
  • Chưa có: xóa tài khoản, buộc xóa bot, xem tin nhắn, xem log, biểu đồ.