Bán hàng online · 11 phút đọc · 2026-09-17
Phần mềm quản lý bán hàng mã nguồn mở: cài OSPOS, đổi tiếng Việt và bán thử đơn
Mình cài OSPOS 3.4.1, đổi sang tiếng Việt và VND, bán thử một đơn 70.000 ₫ rồi đối chiếu báo cáo lợi nhuận với tính tay. Kèm các chỗ vấp: múi giờ, ô Giá bán buôn và cách sao lưu.

Bạn muốn một phần mềm quản lý bán hàng mã nguồn mở để tự cài, dữ liệu nằm trên máy của mình và không trả phí theo tháng? Open Source Point of Sale (gọi tắt OSPOS) là một lựa chọn như vậy: giấy phép MIT, vẫn đang ra bản mới. Mình cài bản 3.4.1 lên một máy Windows chạy Laragon, đổi sang tiếng Việt, thêm hai món, bán thử một đơn 70.000 ₫ rồi đối chiếu báo cáo lợi nhuận với phép tính tay.
Bài ghi lại từng lệnh đã chạy, các con số đo được và những chỗ vấp. Đây là bản cài thử trên máy cá nhân, không phải máy chủ thật. Mình chưa thử máy in hoá đơn nhiệt, máy quét mã vạch hay hoá đơn điện tử; phần cuối bài liệt kê đủ những gì chưa kiểm.
Nếu cửa hàng còn nhỏ và bạn đang ghi sổ bằng bảng tính, đọc bài File Excel quản lý bán hàng trước. Bảng tính có thể vẫn đủ dùng, và bạn sẽ biết rõ mình đang cần phần mềm để giải quyết việc gì.
OSPOS là gì, cần gì để chạy
Thông tin mình kiểm ngày 17/09/2026:
- Phiên bản: 3.4.1, phát hành ngày 05/06/2025, là bản mới nhất trên trang phát hành GitHub lúc kiểm.
- Giấy phép: MIT. Đây là phần mềm POS mã nguồn mở viết bằng PHP trên CodeIgniter 4.6.0, chạy trong trình duyệt.
- Gói tải về: tệp zip 33.321.358 byte, giải nén ra 12.866 tệp, tổng 165 MB (thư mục
vendorđã có sẵn). - Máy chủ: tệp INSTALL.md ghi cần PHP 8.1 đến 8.4 với các extension json, gd, bcmath, intl, openssl, mbstring, curl, xml; MySQL 5.7 hoặc MariaDB 10.x; Apache 2.4. Máy thử của mình chạy PHP 8.3.30 và MySQL 8.4.3.
INSTALL.md dặn hai điều nên đọc trước khi cài:
- Phải tải bản phát hành. Clone thẳng repo về sẽ không chạy nếu bạn không tự build.
- Có sẵn cấu hình Docker, nhưng chính tài liệu ghi rằng cách cài Docker thông thường không dành cho chạy thật.
Cài phần mềm quản lý bán hàng mã nguồn mở OSPOS từng bước
Các lệnh dưới đây chạy trong Git Bash hoặc terminal Linux. Tên cơ sở dữ liệu trong bài là ospos, trùng giá trị mặc định trong tệp .env.
Bước 1: tải bản phát hành và giải nén
curl -L -o ospos-3.4.1.zip https://github.com/opensourcepos/opensourcepos/releases/download/3.4.1/opensourcepos.3.4.1.5f395d.zip
unzip -q ospos-3.4.1.zip -d osposXong bước này khi trong thư mục ospos có đủ app, public, vendor, writable và tệp .env.
Bước 2: tạo cơ sở dữ liệu và chạy database.sql
mysql -u root -p -e "CREATE DATABASE ospos CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci"
mysql -u root -p ospos < ospos/app/Database/database.sqlTrên máy thử, tệp database.sql (27.937 byte) chạy hết 2.085 ms và tạo 27 bảng. Kiểm lại số bảng:
mysql -u root -p -N -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='ospos'"Bước 3: sửa tệp .env, sửa cả hai nhóm
Bản gốc để tên người dùng cơ sở dữ liệu là admin. Mở .env và sửa:
database.default.database = 'ospos'
database.default.username = 'ten_nguoi_dung'
database.default.password = 'mat_khau'
database.development.database = 'ospos'
database.development.username = 'ten_nguoi_dung'
database.development.password = 'mat_khau'Vì sao phải sửa cả nhóm development: tệp app/Config/Database.php chọn nhóm theo CI_ENVIRONMENT. Khi giá trị là development (mặc định của bản phát hành), OSPOS kết nối bằng nhóm database.development. Khi đổi sang production, nó dùng nhóm database.default. Chỉ sửa một nhóm thì sẽ hỏng ở một trong hai chế độ.
Bước 4: mở trình duyệt và đăng nhập
Chép thư mục ospos vào thư mục web, rồi mở http://localhost/ospos/public. Trang đăng nhập trả về trong khoảng 0,15 giây. Tài khoản mặc định là admin / pointofsale.
Lần đăng nhập đầu tiên, OSPOS tự chạy 40 bản cập nhật cơ sở dữ liệu (migration) trong khoảng 8 giây. Số bảng tăng từ 27 lên 39.
Dòng encryption.key trong .env để trống trong bản phát hành. Lần đầu bạn mở trang Cấu hình, OSPOS thấy khoá trống thì tự sinh một khoá dài 64 ký tự và ghi thẳng vào .env. Khoá này dùng để mã hoá mật khẩu SMTP, mật khẩu SMS và khoá Mailchimp mà bạn lưu trong phần cấu hình. Mất tệp .env thì mất luôn khả năng giải mã những giá trị đó.
Mật khẩu pointofsale nằm công khai trong tài liệu cài đặt, nên hãy đổi nó trước khi cho máy khác truy cập.
Tệp .env chứa mật khẩu cơ sở dữ liệu. Trên Apache của máy thử, gọi thẳng http://localhost/ospos/.env trả về 403 nhờ tệp .htaccess đi kèm gói. Nginx không đọc .htaccess, nên nếu dùng Nginx, bạn trỏ thư mục gốc của web vào public thay vì cả thư mục ospos.
Bước 5: chuyển sang chế độ production
CI_ENVIRONMENT = productionVới giá trị mặc định development, trang đăng nhập nhúng cả mã gỡ lỗi Kint và góc phải màn hình có nút thanh gỡ lỗi. INSTALL.md dặn chạy ổn rồi thì đổi sang production. Mình đổi xong, tải lại trang: không còn đoạn Kint nào.
Đổi sang tiếng Việt và tiền đồng
Bản OSPOS tiếng Việt có sẵn trong gói, không phải tải thêm. Vào Văn phòng → Cấu hình → tab Định dạng (bản tiếng Anh gọi là Localization). Mặc định là tiếng Anh, múi giờ America/New_York, ký hiệu $, định dạng số en_US với 2 chữ số thập phân, ngày kiểu tháng/ngày/năm. Mình đặt lại:
- Ngôn ngữ: Vietnamese.
- Định dạng số:
vi_VN. Ký hiệu tiền tệ: ₫. Mã tiền tệ: VND. - Số chữ số sau dấu phẩy của tiền: 0.
- Múi giờ: "(GMT+07:00) Bangkok, Hanoi, Jakarta".
- Định dạng ngày và giờ: dd/mm/yyyy và 24 giờ.
Bấm Gửi, trang báo "Cấu hình được lưu thành công." Ô ví dụ cạnh định dạng số hiện 1.234.567.890 ₫.
Đặt 0 chữ số thập phân cho gọn thì có một đánh đổi mình đo được sau đó: nếu bạn bật tính giá vốn bình quân khi nhập hàng, giá vốn có phần lẻ (ví dụ 9.830,50) sẽ bị ghi lại thành 9.830 mỗi khi bạn mở form sửa mặt hàng rồi lưu. Chi tiết ở bài Phần mềm quản lý kho miễn phí OSPOS.

Không có Asia/Ho_Chi_Minh trong danh sách múi giờ
Danh sách múi giờ của OSPOS là danh sách viết sẵn trong mã nguồn, không có mục Asia/Ho_Chi_Minh. Mục đúng cho Việt Nam là "(GMT+07:00) Bangkok, Hanoi, Jakarta", lưu thành giá trị Asia/Bangkok.
Mình vấp đúng chỗ này. Mình đặt cấu hình bằng script với giá trị Asia/Ho_Chi_Minh; ô chọn không có giá trị đó nên form gửi lên chuỗi rỗng, OSPOS vẫn báo lưu thành công, và từ đó mọi trang trả lỗi 500 với thông báo Timezone ID '' is invalid. Sửa trong cơ sở dữ liệu thôi thì trang vẫn lỗi, vì OSPOS giữ bản cache cấu hình trong writable/cache/settings. Cách gỡ đã thử và chạy:
mysql -u root -p ospos -e 'UPDATE ospos_app_config SET value="Asia/Bangkok" WHERE `key`="timezone"'
rm ospos/writable/cache/settingsSau hai lệnh này trang đăng nhập trả 200 trở lại.
Đổi thông tin cửa hàng trước khi bán đơn đầu
Tab Thông tin mặc định ghi tên "Open Source Point of Sale", địa chỉ "123 Nowhere street", số điện thoại 555-555-5555 và chính sách đổi trả "Test". Cả bốn dòng này in lên hoá đơn, nên hãy sửa trước. Mình đổi thành "Quán thử OSPOS", một địa chỉ mẫu và dòng "Cảm ơn quý khách!".
Thêm hàng hoá: chữ "Giá bán buôn" thực ra là giá vốn
Vào Hàng hóa → Hàng hóa mới. Các ô chữ đỏ là bắt buộc.

Chỗ dễ nhầm nhất là ô Giá bán buôn. Trong mã nguồn, trường này tên cost_price, tức giá vốn. Báo cáo lợi nhuận lấy đúng ô này để trừ. Nếu bạn nhập giá bán sỉ vào đây, lợi nhuận trên báo cáo sẽ sai. Mình nhập hai món:
- Cà phê sữa đá: thể loại Đồ uống, giá bán buôn (giá vốn) 12.000, giá bán lẻ 25.000, tồn 100.
- Bánh mì trứng: thể loại Đồ ăn, giá bán buôn (giá vốn) 10.000, giá bán lẻ 20.000, tồn 50.
Bản dịch tiếng Việt có 1.542 khoá (bản tiếng Anh 1.543), trong đó 195 khoá để trống. Những lỗi mình gặp trên màn hình:
- Cột giảm giá trên màn hình bán hàng ghi "Ggiá %".
- "Số chữ số sau dấy phẩy" và "Mức đặt mua bổ xung" sai chính tả.
Các lỗi này không làm sai số, nhưng nhân viên mới nhìn vào sẽ bối rối. Nếu muốn sửa, các chuỗi nằm trong thư mục app/Language/vi.
Hai chỗ trông giống lỗi dịch nhưng không phải: ô "Số lượng stock" trong form và dòng "[49 in stock]" dưới tên hàng. Ở đây "stock" là tên kho mặc định, còn chữ "in" viết cứng trong giao diện. Đổi tên kho ở Cấu hình → tab Kho thành "Kho chính" thì dòng dưới tên hàng thành "[98 in Kho chính]".
Bán thử một đơn và đọc biên lai
Vào Bán hàng, rồi làm theo thứ tự:
- Gõ mã số hàng hoá
1vào ô "Tìm hay quét Hàng hóa hay Biên lai", nhấn Enter. Làm lại lần nữa để có 2 ly cà phê. - Gõ
2, nhấn Enter để thêm 1 bánh mì. - Chọn phương thức Tiền mặt, nhập 100.000 vào ô số tiền, bấm Thêm thanh toán.
- Bấm Hoàn thành.

Trước khi bấm Hoàn thành, cột phải ghi "Số còn lại phải thanh toán -30.000 ₫". Số âm ở đây nghĩa là phải thối lại cho khách. Nút Thôi huỷ đơn đang mở sau một hộp xác nhận; mình thử rồi, giỏ trống và không có đơn nào được tạo.

Biên lai in dòng tiền mặt thành -100.000 ₫, có dấu âm. Khách đọc có thể thấy lạ, vì vậy hãy dặn trước nhân viên đứng quầy.
Mình mở cơ sở dữ liệu để xem OSPOS ghi những gì:
- Bảng
ospos_salescó 1 đơn. - Bảng
ospos_sales_itemslưu cả giá vốn tại thời điểm bán (12.000 và 10.000). Sau này bạn sửa giá vốn thì báo cáo của đơn cũ không bị đổi theo. - Tồn kho tự trừ: cà phê từ 100 còn 98, bánh mì từ 50 còn 49.
- Cột
payment_typetrongospos_sales_paymentslưu nguyên chữ "Tiền mặt", tức chữ theo ngôn ngữ đang dùng lúc bán. Mình chưa thử đổi ngôn ngữ sau khi đã có đơn, nên chọn tiếng Việt ngay từ đầu cho chắc.
Báo cáo lợi nhuận có khớp với tính tay không
Vào Báo cáo, ở khung Báo cáo tổng thể chọn Hàng hóa, rồi chọn ngày 17/09/2026.

Tính tay: (25.000 − 12.000) × 2 + (20.000 − 10.000) = 26.000 + 10.000 = 36.000 ₫. Báo cáo ghi lợi nhuận 36.000 ₫, khớp. Cột "Bán buôn" trong báo cáo chính là tổng giá vốn (34.000 ₫).
Một chi tiết nhỏ: hai cột đơn giá trong báo cáo hiện số thô 10000.00, không theo định dạng vi_VN như các cột tiền còn lại.
Sao lưu phần mềm quản lý bán hàng tự cài
Tự cài nghĩa là bạn tự lo sao lưu. Một bản sao lưu cơ sở dữ liệu:
mysqldump -u root -p --single-transaction ospos > ospos-sao-luu.sqlTrên máy thử, lệnh chạy 177 ms, ra tệp 64.587 byte chứa đủ 39 bảng. Chưa khôi phục thử thì chưa thể coi là đã có bản sao lưu, nên mình khôi phục vào một cơ sở dữ liệu mới:
mysql -u root -p -e "CREATE DATABASE ospos_khoiphuc CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci"
mysql -u root -p ospos_khoiphuc < ospos-sao-luu.sqlKhôi phục mất 1.555 ms. Kiểm lại thấy đủ 39 bảng, 1 đơn, tồn kho 98 và 49, đúng như trước khi sao lưu. Kiểm xong thì xoá cơ sở dữ liệu thử.
Ngoài tệp .sql, cần giữ thêm hai thứ:
- Tệp
.env, vì trong đó có khoá mã hoá. - Thư mục
public/uploads/item_picsnếu bạn có tải ảnh hàng hoá lên. Đường dẫn này lấy từapp/Controllers/Items.php.
Nếu bạn quản lý kho bằng bảng tính song song trong lúc chuyển sang phần mềm, cấu trúc nhật ký nhập xuất trong bài File Excel quản lý kho giúp bạn đối chiếu tồn kho giữa hai bên.
Phần mềm bán hàng mã nguồn mở này hợp với ai
Nếu bạn đang tìm phần mềm quản lý bán hàng miễn phí, cần hiểu đúng chữ miễn phí ở đây: giấy phép MIT không thu tiền, nhưng máy chạy, người cài đặt và việc sao lưu vẫn là chi phí của bạn.
Dựa trên những gì đo được, phần mềm quản lý bán hàng mã nguồn mở OSPOS hợp với bạn khi:
- Bạn có sẵn một máy chạy được PHP và MySQL, hoặc có người lo phần đó.
- Bạn bán tại quầy, cần giỏ hàng, biên lai, trừ tồn và báo cáo lợi nhuận theo giá vốn.
- Bạn chấp nhận tự sửa vài chuỗi dịch và tự sao lưu.
Chưa hợp khi bạn muốn mở trình duyệt là dùng ngay mà không cài gì, hoặc không có ai kiểm tra bản sao lưu định kỳ.
Những gì mình chưa kiểm
- Máy in hoá đơn nhiệt, máy quét mã vạch thật, két tiền.
- Nhiều chi nhánh hay nhiều kho, trả hàng, khách hàng thân thiết và điểm thưởng, gửi email hoặc SMS.
- Hoá đơn điện tử theo quy định Việt Nam: chưa kiểm, nên bài không khẳng định OSPOS có hay không có.
- Chạy trên máy chủ thật có HTTPS, nhiều máy bán cùng lúc, và cách cài bằng Docker.
- Đổi ngôn ngữ sau khi đã có đơn thì báo cáo theo phương thức thanh toán hiển thị ra sao.
- Tác giả
- Quản trị viên
- Đăng ngày
- 2026-09-17
- Cập nhật
- 2026-09-17
- Thời gian đọc
- 11 phút đọc
- Tất cả bài viết