Bỏ qua, tới nội dung
Tài liệu APIv1

Tự dựng và vận hành

Tệp compose và biến môi trường Beta

Từng dịch vụ trong tệp compose của O3O Office Online và toàn bộ biến môi trường O3O_*, mặc định, biến phải đổi khi chạy thật.

Trang này mô tả tính năng đang ở giai đoạn beta: đã chạy được nhưng có thể còn thay đổi.

Trong trang này

Bản Docker v1 gói trong MỘT tệp compose: online/docker/compose.dev.yml, có sẵn hồ sơ nextcloud. Mọi cấu hình nằm trong online/.env, tạo bằng bash scripts/gen-secrets.sh --dev (PowerShell: scripts\gen-secrets.ps1 -Dev): script chép online/.env.example rồi sinh bí mật; máy chạy thật bỏ --dev. Mọi lệnh dưới đây chạy trong thư mục online/.

BashLệnh thường dùng
cd online
DC="docker compose --env-file .env -f docker/compose.dev.yml"

$DC up -d                      # khởi động bốn dịch vụ lõi
$DC --profile nextcloud up -d  # thêm Nextcloud, MariaDB, Redis
$DC ps                         # trạng thái và sức khoẻ
$DC logs -f o3o-gate           # xem nhật ký một dịch vụ
$DC down                       # dừng, giữ dữ liệu
$DC --profile nextcloud down -v   # dừng và XOÁ volume (mất dữ liệu)

# Chạy thêm một bản song song trên cùng máy: dự án khác (-p), cổng khác
O3O_PROXY_PORT=18080 O3O_NEXTCLOUD_PORT=18081 docker compose -p o3otest --env-file .env -f docker/compose.dev.yml up -d

Các dịch vụ#

Dịch vụImageVai tròKiểm tra sức khoẻDữ liệu
o3o-proxynginx:1.27-alpine + online/proxy/nginx.confCửa vào duy nhất (cổng 8080): định tuyến, hỏi gate trước khi mở phiên soạn thảo, chặn đường quản trị của máy chủ soạn thảo, cho qua khi gate ngừng chạy.GET /o3o/healthzkhông
o3o-onlineO3O_ONLINE_IMAGE (image DEV ghim digest)Máy chủ soạn thảo cộng tác (cổng 9980). Cần cap_add: [MKNOD]. Image không có shell: gỡ lỗi bằng nhật ký.sẵn trong image; qua proxy: GET /hosting/discoverykhông giữ tài liệu
o3o-gateO3O_GATE_IMAGE, mặc định o3o/gate:dev (python:3.12-slim-bookworm)Đếm kết nối và áp trần, token bản quyền, lớp nhúng O3O.Editor, WOPI host nội bộ, callback (cổng 8070).GET /o3o/healthzo3o-gate-data
o3o-docbuilderO3O_DOCBUILDER_IMAGE, mặc định o3o/docbuilder:dev (debian:bookworm-slim)API /v1/*: chuyển đổi, dựng từ o3oscript, điền mẫu, trích xuất (cổng 8060). Chạy bằng người dùng không phải root.GET /v1/statuso3o-docbuilder-data
o3o-nextcloudnextcloud:30-apacheHồ sơ nextcloud: kho tệp để thử đấu nối.GET /status.phpo3o-nextcloud-html
o3o-nextcloud-dbmariadb:11CSDL của Nextcloud.o3o-nextcloud-db
o3o-nextcloud-redisredis:7-alpineBộ nhớ đệm và khoá tệp của Nextcloud.không
  • Một mạng bridge duy nhất o3o-net; các dịch vụ gọi nhau bằng tên dịch vụ.
  • Tệp compose không đặt container_name, nên nhiều dự án (-p) chạy song song được trên một máy.
  • Image gate và DocBuilder dựng với ngữ cảnh online/ để chép spec/plans.json vào /app/plans.json; hạn mức của gói luôn đọc từ tệp đó.
  • DocBuilder chạy với no-new-privileges, có giới hạn bộ nhớ và pids_limit; macro trong tài liệu bị tắt cứng khi nạp qua LibreOffice, và mẫu có macro bị POST /v1/template/render từ chối với 422 macro_not_allowed.
  • Font cài sẵn trong DocBuilder: Liberation, Carlito, Caladea, DejaVu, Noto; đủ cho tiếng Việt và tương thích kích thước với Arial, Times New Roman, Calibri, Cambria.

Biến môi trường#

  • Mọi dịch vụ O3O đọc cấu hình qua biến có tiền tố O3O_. Giá trị logic: 1 là bật, 0 là tắt.
  • Danh sách phân tách bằng dấu phẩy, không có khoảng trắng thừa.
  • Giá trị chứa CHANGE_ME được coi là CHƯA ĐẶT: dịch vụ vẫn khởi động, ghi cảnh báo WARNING và tắt tính năng cần bí mật đó.
  • Ngoại lệ duy nhất là O3O_COOLWSD_ADMIN_PASSWORD, vì thiếu nó thì gate không đếm được kết nối và bảng quản trị của máy chủ soạn thảo dùng một mật khẩu ai cũng đoán được. Tệp compose không có giá trị dự phòng cho biến này và từ chối khởi động khi biến rỗng hoặc chưa đặt; gate ở chế độ chạy thật (O3O_DEV_MODE=0) từ chối khởi động khi mật khẩu rỗng hoặc còn CHANGE_ME. Chạy bash scripts/gen-secrets.sh để sinh mật khẩu này. Trên máy DEV (O3O_DEV_MODE=1) gate vẫn khởi động với cảnh báo, nhưng không đếm kết nối.
  • Cột "Đổi khi chạy thật": BẮT BUỘC nghĩa là để nguyên mặc định thì không an toàn hoặc không chạy đúng ngoài máy DEV.

Dùng chung cho gate và DocBuilder#

BiếnMặc địnhĐổi khi chạy thậtÝ nghĩa
O3O_PUBLIC_URLhttp://localhost:8080BẮT BUỘCURL công khai của proxy, không có / cuối. Dùng để dựng URL tải tệp trong callback và trong kết quả job.
O3O_LICENSE_TOKENrỗngKhi có bản quyềnToken bản quyền dạng chuỗi. Rỗng thì đọc O3O_LICENSE_FILE. Xem Bản quyền.
O3O_LICENSE_FILE/etc/o3o/license.tokenKhôngTệp chứa token. Không có tệp là bình thường (bản cộng đồng). Đọc lại mỗi 60 giây.
O3O_LICENSE_PUBKEY227be50bfccbdc0f…KhôngKhoá công khai Ed25519 (64 ký tự hex) của máy chủ bản quyền O3O. Chỉ đổi khi kiểm thử.
O3O_DEV_MODE0Phải là 01 = máy DEV: nhận khoá THỬ, bật /o3o/demo, trả chi tiết lỗi nội bộ trong error.detail.
O3O_BUILD_DATErỗngKhôngNgày dựng image YYYY-MM-DD (image tự đặt), so với trường upd của token. Rỗng thì bỏ qua phép so.
O3O_FETCH_ALLOW_HOSTSrỗngTuỳhost, host:port hoặc CIDR được phép tải dù là địa chỉ nội bộ (ngoại lệ chống SSRF). Mục theo tên được tin theo tên và phân giải lúc nối; mục CIDR vẫn ghim IP đã kiểm. DEV: host.docker.internal,o3o-nextcloud.
O3O_FETCH_TIMEOUT_SECONDS30KhôngThời gian tối đa cho một lần tải URL bên ngoài.
O3O_LOG_LEVELinfoKhôngdebug, info, warning, error. Một dòng JSON mỗi sự kiện ra stdout.
TZAsia/Ho_Chi_MinhKhôngMúi giờ container. Hạn bản quyền và hạn mức ngày luôn tính theo UTC+7.

o3o-gate#

BiếnMặc địnhĐổi khi chạy thậtÝ nghĩa
O3O_GATE_PORT8070KhôngCổng lắng nghe trong container.
O3O_GATE_DATA_DIR/dataKhôngThư mục dữ liệu (volume o3o-gate-data): instance-id, secret.key, embed/, usage/.
O3O_GATE_INTERNAL_URLhttp://o3o-gate:8070KhôngURL máy chủ soạn thảo dùng để gọi WOPI host nội bộ của gate. Phải khớp O3O_ONLINE_ALIASGROUP1.
O3O_COOLWSD_URLhttp://o3o-online:9980KhôngĐịa chỉ nội bộ của máy chủ soạn thảo.
O3O_COOLWSD_ADMIN_USERadminNên đổiTài khoản quản trị của máy chủ soạn thảo; gate dùng để đọc số phiên.
O3O_COOLWSD_ADMIN_PASSWORDkhông có, compose báo lỗi khi rỗngBẮT BUỘCMật khẩu quản trị, dùng chung với o3o-online. Không có giá trị dự phòng: compose từ chối khởi động khi biến rỗng hoặc chưa đặt; gate với O3O_DEV_MODE=0 từ chối khởi động khi mật khẩu rỗng hoặc còn CHANGE_ME. Đặt rồi mà lệch với máy chủ soạn thảo thì gate không đếm được và cho qua toàn bộ (upstream.coolwsd = "auth_failed", connections.source = "none").
O3O_GATE_SAMPLE_SECONDS10KhôngChu kỳ lấy mẫu số phiên, tối thiểu 2.
O3O_GATE_PEAK_WINDOW_SECONDS300KhôngCửa sổ của đỉnh trượt.
O3O_GATE_RECONNECT_GRACE_SECONDS120KhôngÂn hạn nối lại.
O3O_GATE_CONNECTION_CAPrỗngKhôngChỉ HẠ được trần: trần hiệu lực = số nhỏ hơn giữa gói và biến này. Dùng khi kiểm thử, ví dụ 2.
O3O_GATE_INSTANCE_IDrỗngKhôngMã instance. Rỗng thì gate tự sinh inst_ + 16 hex và lưu ở /data/instance-id.
O3O_WOPI_ALLOWED_HOSTSrỗngKhi đấu NextcloudGốc URL của WOPI host bên ngoài mà gate được gọi khi đã chạm trần, để nhận ra phiên chỉ đọc. Ví dụ http://o3o-nextcloud.
O3O_ONLINE_IMAGE_KINDdev-upstreamKhi dùng image O3Odev-upstream = image DEV, chỉ thử nội bộ; o3o = image O3O dựng từ nguồn. Chỉ để hiển thị trong /o3o/status.
O3O_EMBED_ENABLED1Không0 tắt lớp nhúng: /o3o/embed/*, /o3o/wopi/*, /o3o/api.js trả 404.
O3O_EMBED_JWT_SECRETrỗngBẮT BUỘCKhoá HS256 (tối thiểu 32 ký tự) kiểm config.token. Rỗng và không bật chế độ không ký: 401 embed_auth_not_configured.
O3O_EMBED_ALLOW_UNSIGNED0Phải là 01 = nhận config không ký. Chỉ cho máy DEV.
O3O_EMBED_ALLOWED_ORIGINS*Nên đổiOrigin của trang được nhúng, phân tách dấu phẩy; * = mọi origin. Dùng cho CORS và PostMessageOrigin.
O3O_EMBED_CALLBACK_SECRETrỗngBẮT BUỘCKhoá HMAC SHA-256 ký callback lưu tài liệu. Rỗng thì callback không có chữ ký.
O3O_EMBED_MAX_FILE_MB100KhôngCỡ tối đa của tài liệu nhúng.
O3O_EMBED_SESSION_TTL_MINUTES720KhôngThời hạn access_token của phiên nhúng.
O3O_EMBED_PENDING_TTL_SECONDS300KhôngPhiên đã tạo mà trình soạn thảo không nạp trong khoảng này thì huỷ.
O3O_EMBED_RETAIN_HOURS24KhôngGiữ bản làm việc cuối của tài liệu sau khi đóng.

o3o-docbuilder#

BiếnMặc địnhĐổi khi chạy thậtÝ nghĩa
O3O_DOCBUILDER_PORT8060KhôngCổng lắng nghe trong container.
O3O_DOCBUILDER_DATA_DIR/dataKhôngThư mục dữ liệu (volume o3o-docbuilder-data): jobs/, files/, profiles/.
O3O_DOCBUILDER_API_KEYSrỗngBẮT BUỘCKhoá API, dạng ten:khoa hoặc khoa, phân tách dấu phẩy. Rỗng: mọi endpoint cần xác thực trả 401.
O3O_DOCBUILDER_JWT_SECRETrỗngTuỳKhoá HS256 (tối thiểu 32 ký tự); có giá trị thì nhận thêm JWT.
O3O_DOCBUILDER_WORKERSmin(số nhân, 4)TuỳSố tiến trình xử lý tài liệu, từ 1 tới 32.
O3O_DOCBUILDER_MAX_FILE_MBrỗngKhôngChỉ HẠ được giới hạn cỡ tệp của gói.
O3O_DOCBUILDER_SYNC_TIMEOUT_SECONDS60KhôngThời gian chờ tối đa của chế độ đồng bộ.
O3O_DOCBUILDER_JOB_TIMEOUT_SECONDSrỗngKhôngChỉ HẠ được thời gian tối đa của job theo gói.
O3O_DOCBUILDER_CALLBACK_SECRETrỗngKhi dùng callbackKhoá HMAC SHA-256 ký callback của job.
O3O_DOCBUILDER_WORKER_MAX_JOBS200KhôngTái sinh tiến trình xử lý sau số việc này.
O3O_DOCBUILDER_WORKER_MAX_AGE_MINUTES60KhôngTái sinh tiến trình xử lý sau số phút này.
O3O_DOCBUILDER_SOFFICE/usr/bin/sofficeKhôngĐường dẫn chương trình xử lý tài liệu trong image.

o3o-online#

Image máy chủ soạn thảo không đọc biến O3O_*; tệp compose ánh xạ chúng sang tên mà image hiểu. Hai giá trị cố định trong compose: DONT_GEN_SSL_CERT=YESextra_params dưới đây.

BiếnÁnh xạ sangMặc địnhĐổi khi chạy thậtÝ nghĩa
O3O_ONLINE_IMAGEimage:image DEV, digest sha256:1efda304…bf97Khi dùng image O3OImage máy chủ soạn thảo, ghim theo digest.
O3O_ONLINE_SERVER_NAMEserver_namelocalhost:8080BẮT BUỘChost[:port] công khai; quyết định đường dẫn trong /hosting/discovery.
O3O_ONLINE_ALIASGROUP1aliasgroup1http://o3o-gate:8070KhôngWOPI host nội bộ của gate. LUÔN là nhóm 1.
O3O_ONLINE_ALIASGROUP2aliasgroup2http://o3o-nextcloud,http://localhost:8081Khi đấu NextcloudWOPI host của Nextcloud. Phần tử sau dấu phẩy là biểu thức chính quy (dấu chấm viết \.).
O3O_COOLWSD_ADMIN_USERusernameadminNên đổiDùng chung với gate.
O3O_COOLWSD_ADMIN_PASSWORDpasswordkhông có, compose báo lỗi khi rỗngBẮT BUỘCDùng chung với gate. Không có giá trị dự phòng: biến rỗng thì compose báo lỗi và không khởi động.
O3O_ONLINE_DICTIONARIESdictionariesvi en_USKhôngTừ điển kiểm tra chính tả.
O3O_ONLINE_SSL_TERMINATION--o:ssl.termination=falseBẮT BUỘC khi proxy có TLStrue khi người dùng vào bằng https qua proxy ngoài.
O3O_ONLINE_FRAME_ANCESTORS--o:net.frame_ancestors=rỗngBẮT BUỘC khi trang nhúng khác originMỘT giá trị không dấu cách, ví dụ https://app.example.com. Rỗng: chỉ cho phép tên máy của chính yêu cầu và của WOPI host.
BashGiá trị extra_params của v1 (một dòng)
--o:ssl.enable=false --o:ssl.termination=${O3O_ONLINE_SSL_TERMINATION} --o:welcome.enable=false --o:net.frame_ancestors=${O3O_ONLINE_FRAME_ANCESTORS} --o:security.enable_metrics_unauthenticated=false

Ghim image gate và DocBuilder#

Tệp compose không ghi cứng thẻ image của gate và DocBuilder mà đọc hai biến dưới; để trống thì dùng thẻ dựng tại chỗ o3o/gate:devo3o/docbuilder:dev. Lệnh python tools/release.py env (chạy ở gốc repo, hoặc python ../tools/release.py env từ online/) sinh khối phiên bản của .env từ versions.json, gồm O3O_ONLINE_IMAGE, O3O_ONLINE_IMAGE_KIND, O3O_GATE_IMAGEO3O_DOCBUILDER_IMAGE; thêm --write thì lệnh thay khối cũ trong tệp và lưu bản trước ở .env.bak.

BiếnMặc địnhĐổi khi chạy thậtÝ nghĩa
O3O_GATE_IMAGEo3o/gate:devKhi ghim bản phát hànhImage của o3o-gate. Tệp compose đọc ${O3O_GATE_IMAGE:-o3o/gate:dev}.
O3O_DOCBUILDER_IMAGEo3o/docbuilder:devKhi ghim bản phát hànhImage của o3o-docbuilder. Tệp compose đọc ${O3O_DOCBUILDER_IMAGE:-o3o/docbuilder:dev}.
BashSinh khối phiên bản của .env từ versions.json
cd online
# Xem trước khối phiên bản
python ../tools/release.py env

# Ghi vào .env (khối cũ được thay, bản trước lưu ở .env.bak)
python ../tools/release.py env --write .env

# Kiểm image mà compose sẽ dùng
grep -E '^O3O_(ONLINE|GATE|DOCBUILDER)_IMAGE=' .env
docker compose --env-file .env -f docker/compose.dev.yml config --images

o3o-proxy và hồ sơ nextcloud#

BiếnMặc địnhĐổi khi chạy thậtÝ nghĩa
O3O_PROXY_PORT8080TuỳCổng của proxy mở ra máy chủ.
O3O_NEXTCLOUD_PORT8081TuỳCổng của Nextcloud mở ra máy chủ (hồ sơ nextcloud).
O3O_NC_ADMIN_USERadminNên đổiQuản trị Nextcloud.
O3O_NC_ADMIN_PASSWORDCHANGE_MEBẮT BUỘCMật khẩu quản trị Nextcloud.
O3O_NC_DB_PASSWORDCHANGE_MEBẮT BUỘCMật khẩu CSDL của Nextcloud.
O3O_NC_DB_ROOT_PASSWORDCHANGE_MEBẮT BUỘCMật khẩu root MariaDB.
O3O_NC_TRUSTED_DOMAINSlocalhost localhost:8081 o3o-nextcloudBẮT BUỘCTên miền tin cậy của Nextcloud, cách nhau bằng dấu cách.