Lưu trữ danh mục: Small ERP

Tối ưu chuỗi cung ứng bằng frePPLe lấy dữ liệu từ odoo

Tối ưu chuỗi cung ứng bằng frePPLe lấy dữ liệu từ odoo
Nội dung

    Tính toán bổ sung của Odoo chỉ bao gồm các đơn đặt hàng đã biết chứ không bao gồm dự báo doanh số dài hạn. Do đó, Khi cần phân tích phức tạp hơn, người lập kế hoạch sẽ sớm bắt đầu sử dụng bảng tính bên cạnh Odoo. Ngoài một quy mô và độ phức tạp nhất định, quy trình lập kế hoạch dựa trên bảng tính sẽ không còn đủ nữa và cần có sự hỗ trợ hệ thống phù hợp cho người lập kế hoạch của bạn. Một ứng dụng mở rộng để lập kế hoạch nhu cầu, lập kế hoạch hàng tồn kho,  lập kế hoạch sản xuất, lập kế hoạch vật liệu.

    FrePPLe yêu cầu phần cứng: Dung lượng ổ đĩa 80 GB, 4 lõi CPU, RAM 16 GB.

    Ubuntu 24 LTS hiện là hệ điều hành được hỗ trợ.

    Lưu ý: frepple chạy amd64

    1. Tải gói cài đặt

    Tải xuống gói cài đặt .deb. Sử dụng từ dòng lệnh để tải xuống file trong trang https://github.com/frePPLe/frepple/releases/:
    wget https://github.com/frePPLe/frepple/releases/download/9.0.0/ubuntudevel-frepple-9.0.0.deb

    2. Cài đặt và điều chỉnh cơ sở dữ liệu PostgreSQL

    LÀm theo hướng dẫn https://frepple.com/docs/current/installation-guide/linux-binaries.php

    Điều chỉnh cơ sở dữ liệu  max_connection được chuyển từ 100 mặc định sang ví dụ 400

    Tạo cơ sở dữ liệu và người dùng cơ sở dữ liệu

    3. Cài đặt gói frepple

    Chạy lệnh cài đặt:

    apt install -f ./*.deb

    sudo apt-get install ./ubuntudevel-frepple-9.0.0.deb
    Nếu gói đã tồn tại và bạn muốn cài đặt lại, hãy thêm tùy –reinstallchọn:
    sudo apt install –reinstall ./ubuntudevel-frepple-9.0.0.deb
    để xóa gói đó khỏi hệ thống:
    sudo apt remove package_name
    sudo dpkg -r package_name
    Ngoài ra, ở bước cuối cùng, bạn có thể sử dụng tính năng tự động xóa của trình quản lý gói apt để xóa mọi gói không mong muốn có thể có trong hệ thống của bạn khi bạn cài đặt gói bằng các lệnh trên,
    sudo apt autoremove

    TRÌNH CÀI ĐẶT LỆNH ODOO PYTHON PIP

    https://apps.odoo.com/apps/modules/17.0/odoo_python_pip_install_library/

    So sánh 2 file và thư mục bằng công cụ

    So sánh 2 file và thư mục bằng công cụ
    Nội dung

      Sánh nội dung 2 file text, mã nguồn, cấu trúc 2 thư mục có gì khác nhau là nhu cầu thường xuyên mà Beyond Compare là một phần mềm tiện ích để so sánh các file và thư mục. Với một vài nút bấm và giao diện đầy màu sắc, ứng dụng này cố gắng duy trì sự cân bằng giữa tính năng và hiệu suất.

      Ứng dụng sẽ hiển thị các file của bạn cạnh nhau. Nó sử dụng văn bản màu đỏ để làm nổi bật sự khác biệt quan trọng và màu xanh cho những thay đổi không đáng kể. Bạn có thể điều chỉnh các màu này cho phù hợp với sở thích của mình.

      Hình thu nhỏ tổng quan trên khung bên trái hiển thị bản đồ màu sắc trực quan. Để điều hướng, sử dụng nút Next Section và Pre Section để điểm qua tất cả sự khác biệt. Sau đó, sử dụng các nút mũi tên để hợp nhất các file. Nhấp vào nút Save nằm ở bên phải cửa sổ để lưu file.

      Beyond Compare cung cấp các tính năng vượt trội về so sánh nội dung file và thư mục:

      • Mọi tác vụ so sánh bắt đầu bằng một phiên mà bạn có thể tùy chỉnh và lưu lại để mở sau này. Những thứ này mang lại cho bạn sự linh hoạt tuyệt vời và tiết kiệm thời gian.
      • Các cài đặt phiên kiểm soát những so sánh này được gọi là Rules. Chúng kiểm soát bạn về cách mỗi phiên hoạt động và giúp bạn khám phá sự khác biệt đáng kể.
      • Phiên Table Compare so sánh các file văn bản với dữ liệu dạng bảng. Bạn có thể sắp xếp và căn chỉnh dữ liệu trên các trường chính, sau đó so sánh chúng theo từng ô.
      • Ứng dụng cung cấp tính năng xử lý script để tự động hóa các tác vụ thông thường. Để biết thêm chi tiết, hãy truy cập phần Scripting của trang Help tại:

      http://www.scootersoftware.com/v4help/index.html?scripts.html

      • So sánh các file trong bộ nhớ từ xa thông qua Dropbox, Google Drive, Amazon S3, OneDrive và Source Control Managers.

      • Folder Compare – so sánh nội dung 2 thư mục với nhau (file trong thư mục, thư mục con).
      • Folder Merge – hợp nhất 2 thư mục.
      • Folder Sync – đồng bộ 2 thư mục với nhau.
      • Text Compare – so sánh 2 file text với nhau.
      • Text Merge – hợp nhất 2 file text.
      • Table Compare – so sánh 2 bảng.
      • Hex Compare – so sánh 2 hex.
      • Picture Compare – so sánh 2 ảnh.
      • Registry Compare – so sánh 2 registry.
      • Verion Compare – so sánh 2 version.

      Dưới đây là hình ảnh so sánh 2 file text:

      Dưới đây là hình ảnh so sánh 2 folder:

      Tùy theo hệ điều hành trên máy tính của bạn và ngôn ngữ bạn muốn sử dụng để download bản cài đặt phù hợp, phần mềm Beyond Compare hỗ trợ các hệ điều hành Windows, MacOS, Linux.

      Sử dụng Beyond Compare vô cùng tiện lợi với Context Menu được tích hợp sẵn khi cài đặt phần mềm. Chúng ta có thể thao tác nhanh với Beyond Compare bằng 2 cách sau:

      Cách 1: Click chọn 2 file/thư mục, sau đó chuột phải và chọn Compare.

      Cách 2: Chọn 1 file và chuột phải, chọn “Select Left file for Compare”. Sau đó chọn file tiếp theo và chuột phải, chọn “Compare to <ten file1>”.

      Beyond Compare giúp bạn dễ dàng và nhanh chóng so sánh sự khác biệt về nội dung của 2 tập file hoặc thư mục mà bạn chọn. Sau đó bạn có thể đồng nhất thay đổi. Phần mềm có nhiều tùy chọn so sánh khác nhau, tốc độ scan rất nhanh, giúp bạn dễ dàng tìm ra sự khác biệt, tiết kiệm khá nhiều thời gian.

      IOT kết nối vào odoo

      IOT kết nối vào odoo
      Nội dung

        Hộp Internet of Things (IoT) giúp bạn kết nối dễ dàng với cơ sở dữ liệu Odoo của mình bằng các thiết bị bên ngoài. IoT nâng cao năng suất và tăng cường sự dễ dàng. Để xây dựng tích hợp IoT, bạn không cần phải có chuyên môn kỹ thuật. Có, nó đơn giản, có thể tùy chỉnh và có độ bảo mật cao để tăng năng suất trong doanh nghiệp của bạn bằng cách tích hợp hoàn toàn hộp IoT với các quy trình kinh doanh hiện tại của bạn.

        Hộp IoT của Odoo kết nối với các thiết bị bên ngoài của bạn như máy in, máy quét, Wi-Fi và cáp ethernet, v.v. Ngoài ra, nó đóng vai trò như một trung gian hòa giải với hộp IoT. Hộp Odoo IoT dựa trên Raspberry Pi.

        IOT kết nối vào odoo
        Kể từ ngày 1 tháng 10 năm 2020, odoo hiện hỗ trợ R-Pi 4.

        CÀI ĐẶT:

        Bạn phải flash thẻ SD để có phiên bản hình ảnh mới có sẵn từ Odoo. Các bước làm theo:

        a) Tải hình ảnh xuống: https://nightly.odoo.com/master/posbox/iotbox/

        (b) Giải nén hình ảnh) (rõ ràng không cần thiết với etcher)

        c) Sử dụng chương trình như Etcher để đưa hình ảnh lên thẻ. Bạn có thể tìm thấy nó ở đây (-> có thể là hình ảnh) trên Raspberry Pi. Bạn có thể cần một đầu đọc/bộ chuyển đổi thẻ mini SD sang thẻ SD đặc biệt để kết nối thẻ với máy tính của mình.

        Sau đó cấp nguồn cho Hộp IoT. Khi nó khởi động xong, như được biểu thị bằng đèn LED xanh, chúng ta có thể kết nối IoT Box bằng Ethernet hoặc với Wifi.

        Khi chúng ta kết nối với Ethernet, Network sẽ tự động được chọn là Ethernet. Sau đó, chúng tôi định cấu hình máy chủ để kết nối hộp IoT của chúng tôi với Cơ sở dữ liệu. Để làm được điều đó, chúng ta phải đi tới Mô-đun IoT và lấy mã thông báo máy chủ. Sau đó nhấp vào nút cấu hình trong máy chủ hiển thị bên dưới và dán mã thông báo máy chủ. Sau đó, hộp IoT sẽ tự động kết nối với cơ sở dữ liệu của chúng tôi. Ngoài ra, chúng tôi phải đảm bảo rằng không có nhiều Cơ sở dữ liệu. Để làm được điều đó, chúng ta có thể thêm tên Cơ sở dữ liệu mong muốn trong tham số conf db_name.

        Tương tự như vậy chúng ta có thể kết nối IoT box với Wifi. Đầu tiên, chúng ta phải kết nối hệ thống của mình với hộp IoT bằng cách sử dụng wifi của hệ thống (Chúng ta có thể kết nối với wifi của Raspberry Pi). Sau đó chúng ta sẽ được chuyển hướng đến Trang chủ của IoT. Ở đó chúng ta có thể cấu hình Wifi. Chúng ta có thể kết nối với cái mong muốn mà chúng ta cần. Sẽ có tùy chọn để chọn Wifi có BandWidth là 2,4GHz. Nếu không thì Wifi sẽ không hiển thị ở đó. Sau đó Nhập mật khẩu của wifi để kết nối với wifi đó. Sau đó, chúng ta phải đi đến Mô-đun IoT và lấy mã thông báo máy chủ. Sau đó nhấp vào nút cấu hình trong máy chủ hiển thị bên dưới và dán mã thông báo máy chủ. Sau đó, hộp IoT sẽ tự động kết nối với cơ sở dữ liệu của chúng tôi.

        Xem hướng dẫn kết nối với odoo:

        https://www.odoo.com/documentation/17.0/applications/productivity/iot.html

        https://www.cybrosys.com/blog/how-to-configure-iot-box-in-odoo

        Chúng ta có thể định cấu hình Hộp IoT bằng Odoo. Chúng tôi có thể kết nối máy quét mã vạch để quét sản phẩm trong POS, chụp ảnh trong quá trình sản xuất vì mục đích chất lượng, để kết nối thước cặp và thước đo để đo lường, giúp hoạt động kinh doanh của chúng tôi suôn sẻ và hiệu quả.

        Local ai trên máy cục bộ

        Local ai trên máy cục bộ
        Nội dung

          Dòng Orange Pi 3 với việc sử dụng chip RK3566 mới nhất 4 lõi hợp lý Cortex-A55 có tích hợp thêm NPU 0.8Tops@INT8 trong SoC này và khiến nó trở thành bo mạch chạy AI giá rẻ nhất trên thị trường hiện nay. một Bộ xử lý thần kinh (NPU) hoặc một bộ vi xử lý (CPU) trong khi thực hiện các phép tính liên quan đến mạng nơ-ron sâu (mạng lưới thần kinh sâu). TOPS là một đơn vị đo lường hiệu quả tính toán cho các mạng nơ-ron sâu vì chúng thường có số lượng tính cực lớn được phép.

          Khi một NPU có nhiều TOPS, nó có khả năng thực hiện nhiều tính năng nhanh hơn, cho phép xử lý và phân loại dữ liệu hình ảnh hoặc âm thanh nhanh hơn. Ví dụ, trong lĩnh vực trí tuệ nhân tạo và thị giác máy tính, một NPU có nhiều TOPS có thể xử lý các tác vụ như nhận dạng đối tượng, phát hiện khuôn mặt, hoặc dự đoán vị trí đối tượng trong thời gian thực hiện với hiệu suất cao.

          YOLOv5 sử dụng cho Orange Pi 3B trong máy tính giác.

          YOLO là bản viết tắt của “You Only Look mô Một lần” và đó là một mạng nơ-ron sâu (mạng lưới thần kinh sâu) hình nền được sử dụng để nhận dạng đối tượng trong hình ảnh và video. Mô hình YOLO đã trở nên phổ biến trong lĩnh vực thị giác máy tính và thị giác máy tính sâu rộng, như trong các ứng dụng như giám sát an ninh, xe tự lái, phân loại đối tượng và nhiều ứng dụng khác.

          Một trong những điểm mạnh của YOLO so với các phương pháp truyền tải là khả năng thực hiện phát hiện đối tượng và phân loại đối tượng trong một lần duy nhất (Bạn Chỉ Nhìn Một Lần), thay vì phải thực hiện nhiều lần quét ảnh và đối tượng phân loại. Điều này làm cho YOLO nhanh chóng và hiệu quả, và nó thường được sử dụng trong thời gian thực hiện các ứng dụng.

          YOLO sử dụng chiều sâu nơ-ron mạng để chia hình ảnh thành một ô vuông và sau đó dự đoán các hộp giới hạn (hộp giới hạn) và các nhãn (nhãn) cho các đối tượng có trong từng ô vuông. Mô hình này sử dụng một chức năng mất mát (chức năng mất mát) để cải thiện khả năng dự đoán giới hạn và nhãn cho độ chính xác thực sự của chúng.

          Với bản và các biến thể khác nhau của YOLO đã phát triển theo thời gian, YOLO đã trở thành một công cụ mạnh mẽ cho việc nhận dạng các đối tượng trong thời gian thực và nhiều ứng dụng trong thị giác máy tính. Hiện tại YOLO đã phát triển tới v8, tuy nhiên tốc độ của YOLOv5 cũng khá đáng kể rồi.

          Tham khao3: https://orangepi.vn/huong-dan-cai-dat-va-test-thu-yolov5-voi-orange-pi-3b.html

          Bước 1: cài đặt Ubuntu/Debian trên eMMC thì tốc độ sẽ nhanh hơn trên NVME.

          Bước 2:  Cài đặt các phần mềm cần thiết

          Chạy bản cập nhật hệ điều hành của bạn bằng lệnh sudo apt update && sudo apt upgrade -y

          Tiếp theo HDH của bạn sẽ có 2 phiên bản Python, chỉ sử dụng Python3 bằng cách cài đặt như sau sudo apt install python-is-python3

          Cài đặt Python PIP: sudo apt install python3-pip python3-dev

          Cài đặt các phần mềm khác khi bạn chưa có HDH sudo apt install gcc build-essential

          Bước 3:  Chuẩn bị cho công việc kiểm tra nhận dạng vật thể (phát hiện đối tượng)

          1. Bạn cần nhận diện Camera, hãy sử dụng 1 webcam có chất lượng tốt. Nếu như Orange Pi 5 Plus bạn có thể sử dụng 1 camera chất lượng cao cho đầu vào HDMI IN lên tới 4K thì Orange Pi 3B bạn chỉ có thể sử dụng webcam, hãy chọn 1 webcam chất lượng tốt.
          2. Một mạng lưới internet tốt để tải về mã nguồn và các thư viện python, công việc này rất cần thiết vì khi cài đặt các phần mềm python, chúng sẽ tự động tải về các thư viện phụ thuộc (phụ thuộc). Tôi đã cài đặt nhiều lần nhưng không thể kết nối được với thư viện máy chủ để tải về, mà tôi nghĩ rằng mình sai ở đâu đó. Trên thực tế, đường truyền chỉ là quá xa.
          3. Màn hình bàn phím thao tác trên Orange Pi 3B, bạn không thể chạy thao tác này qua lệnh CLI màn hình, vì vậy hãy cắm màn hình vào HDMI trên Orange Pi 3B, thêm bàn phím và sử dụng nó cho các thao tác sau này . Bạn cũng có thể VNC vào Orange Pi 3B bằng cách  cài đặt X11VNC trên Orange Pi , bằng cách nào thuận tiện thì bạn sử dụng.Mở terminal trên hệ điều hành, tải về mã nguồn này trên github git clone https://github.com/thanhtantran/rknn-single-thread-3566Trên thư mục này đã có đủ công cụ cho bạn. Chúng tôi sẽ sử dụng thư viện RKNN Toolkit Lite trên github này của Rockchip  https://github.com/rockchip-linux/rknn-toolkit2 Trên các thư mục  rknn-single-thread-3566 bạn cài đặt RKNN Toolkit Lite bằng lệnh sau pip install rknn_toolkit_lite2-1.5.0-cp39-cp39-linux_aarch64.whlTiếp theo đó cài đặt openCV trên Python pip install opencv-pythonTrong quá trình quá trình cài đặt, PIP sẽ luôn cài đặt cho bạn các thư viện cần thiết như numpy, psutils hay ruamel. Nếu không chắc chắn bạn có thể cài đặt riêng lẻ trên github của tôi thì cũng đã có sẵn 1 model create will và chuyển đổi sang dạng rknn là yolov5s.rknn. Việc đào tạo mô hình và chuyển đổi mô hình là một quá trình phức tạp khác, chúng tôi sẽ nghiên cứu sau. Tiếp đến, tìm xem Webcam của bạn được cài đặt trên HDH nằm ở đâu, thông thường nó sẽ là /dev/video0 hoặc /dev/ video1. Bạn chỉ cần sửa tệp main.py bằng trình soạn thảo nào (ví dụ nano) rồi sửa dòng cap = cv2.VideoCapture(0) thành số tương ứng.Cuối cùng hãy thử thử RKNN Toolkit Lite và mô hình bằng lệnhpython triển khai.pyNếu Kết quả trả về hình ảnh như thế này là thư viện và mô hình đã được cài đặt thành công.

          Việc tiếp theo đơn giản hơn, chạy tệp nhận biết thực tế thời gian. Quá trình này trên máy tính gọi là Inference – hay gọi là suy đoán.

          python camera.py

          Bạn sẽ thấy cửa sổ camera hiện lên và Orange Pi 3B đang nhận diện các vật thể trong camera theo thời gian thực hiện tới 28 khung hình / giây theo thư viện đào tạo đã có sẵn.

          Bạn sẵn sàng rằng liệu Orange Pi 3B có chạy quá nóng như các sản phẩm  máy tính Pi  khác không có NPU không? Hãy thử bằng 1 CLI cửa sổ khác với lệnh  htop, CPU chỉ chạy khoảng nơi 20%.

          Thế còn NPU? Tôi đã sẵn sàng tệp rkcat.sh trong nguồn mã thư mục, chạy trên 1 lệnh CLI cửa sổ khác  bash rkcat.sh, bạn sẽ thấy rằng Orange Pi 3B chỉ chạy ở đâu đạt 50-60% NPU của nó.

          Bạn muốn tăng cường sử dụng? Trong file camera.py có 2 hằng số là

          OBJ_THRESH = 0.25
          NMS_THRESH = 0.45

          Chỉnh sửa các thông số này để xem điều kỳ diệu nào sẽ xảy ra.
          cài đặt build dependency
          apt install abseil cmake go grpc protobuf wget
          sudo apt update && sudo apt install golang
          # clone kho
          git clone https://github.com/go-skynet/LocalAI.git
          cd LocalAI
          # build nhị phân
          make build
          # defined GOROOT thủ công
          sudo apt update && sudo apt upgrade -y
          sudo apt install -y build-essential debootstrap rsync gpg squashfs-tools git
          wget https://go.dev/dl/go1.20.2.linux-amd64.tar.gz
          tar – xvf go1.20.2.linux-amd64.tar.gz
          sudo mv go /usr/local
          export GOPATH=/usr/local/go/bin
          export GOROOT=/usr/local/go
          export PATH= $PATH : $GOROOT /bin: $GOPATH /bin
          go build go build main.go https://localai.io/basics/build/ kiểm tra phiên bản (1.20.2): go version
          clone https://github.com/lxc/distrobuilder
          cd distrobuilder
          make
          mv /usr/local/go/bin/bin/distrobuilder /usr/local/bin/

          # Tải gpt4all-j xuống models/
          wget https://gpt4all.io/models/ggml-gpt4all-j.bin -O models/ggml-gpt4all-j
          # Sử dụng mẫu từ các ví dụ
          cp -rf prompt-templates/ggml-gpt4all-j.tmpl models/
          # Chạy LocalAI
          ./local-ai –models-path=./models/ –debug=true # Bây giờ API có thể truy cập được tại localhost:8080 curl http://localhost:8080/v1/models curl http://localhost:8080/v1/chat/completions -H “Content-Type: application/json” -d ‘{ “model”: “ggml-gpt4all-j”, “messages”: [{“role”: “user”, “content”: “How are you?”}], “temperature”: 0.9 }’

           

          Nó là chữ viết tắt của “URL khách hàng”, dùng để kiểm tra kết nối tới URL và lệnh cuộn tròn thường được sử dụng để truyền tải dữ liệu. Curl được cung cấp bởi libcurl, là một URL truyền thư viện phía máy khách. Hãy cùng chúng tôi tìm hiểu cách sử dụng nó.

          Lệnh Curl hỗ trợ các giao thức bên dưới:

          • HTTP và HTTPS
          • FTP và FTPS
          • IMAP và IMAPS
          • POP3 và POP3S
          • SMB và SMBS
          • SFTP
          • SCP
          • TELNET
          • GOPHER
          • LDAP và LDAPS
          • SMTP và SMTPS

          Đây là những giao thức được hỗ trợ quan trọng nhất, đồng thời có các giao thức khác ít phổ biến hơn.

          sudo apt-get remove golang-go
          sudo apt-get remove --auto-remove golang-gocông việc này sẽ loại bỏ mọi gói liên quan đến go. Sau đó bạn có thể chạy
          sudo apt-get update
          

          Nhưng nếu bạn đã làm điều đó và không có tác dụng gì thì bạn có thể làm điều này

          sudo rm -rf /usr/local/go
          
          

          https://github.com/janhq/jan

          Một khuôn mặt cho thị thức học tập có giám sát từ giọng nói: wav2graph

          git clone https://github.com/leduckhai/wav2graph.git

          Trước khi bắt đầu, hãy tạo một môi trường Virtual Python và cài đặt các phụ thuộc cần thiết.

          pip install -r require.txt
          2. Cấu hình Mã thông báo khuôn mặt
          bạn sẽ cần mã hóa API Hugging Face thông báo để truy cập một số tài nguyên được sử dụng trong dự án này. Chèn thông báo Hugging Face của bạn mã hóa vào các cấu hình YAML có liên quan.

          3. Chạy thử nghiệm
          Sau khi thiết lập môi trường cài đặt và hoàn tất cấu hình, bạn có thể thử nghiệm bằng cách cung cấp lệnh.

          sh chạy.sh

          Biên soạn máy học cho Mali

          Biên dịch máy học (MLC) là một công nghệ tự động biên dịch nổi tiếng và tối ưu hóa khối lượng công việc học máy và phát triển khối lượng công việc được biên dịch thành một tập hợp các chương trình phụ trợ. Tại thời điểm viết bài, dựa trên Apache TVM Unity, MLC hỗ trợ các nền tảng bao gồm trình duyệt (WebGPU, WASM), GPU NVIDIA (CUDA), GPU AMD (ROCm, Vulkan), GPU Intel (Vulkan), iOS và MacBook (Kim loại), Android (OpenCL) và GPU Mali (https://blog.mlc.ai/2024/04/20/GPU-Accelerated-LLM-on-Orange-Pi).

          Biên dịch ML có thể tổng hợp hóa cho Mali Codegen
          MLC được xây dựng trên Apache TVM Unity, một giai đoạn tổng hợp để biên dịch các mô hình học trên nhiều phần cứng và các phần hỗ trợ khác. Để biên dịch LLM sang GPU Mali, chúng tôi sử dụng lại toàn bộ đường biên dịch hiện có mà không cần bất kỳ mã hóa tối ưu nào. Cụ thể hơn, chúng tôi đã phát triển thành công các mô hình Llama-2/3 và RedPajama với các bước sau:

          Tái sử dụng các mô hình hóa tối ưu hóa các bước, bao gồm bảo lượng tử hóa, hợp nhất, địa phương tối ưu hóa, vv;
          Tái sử dụng chung GPU không hạt nhân tối ưu hóa được viết bằng TVM TensorIR và chuyển hướng nó tới GPU Mali;
          Tái sử dụng codegen OpenCL hỗ trợ chương trình từ TVM và chuyển hướng nó sang GPU Mali;
          Tái sử dụng hiện tại giao diện người dùng, bao gồm Python API, CLI và REST API.
          Hãy thử xem
          phần cung cấp hướng dẫn từng bước này để bạn có thể tự thử trên thiết bị pi màu cam của mình. Ở đây, chúng tôi sử dụng Llama-3-8B-Instruct-q4f16_1-MLClàm ví dụ chạy. Bạn có thể thay thế bằng Llama-2-7b-chat-hf-q4f16_1hoặc ​​Llama-2-13b-chat-hf-q4f16_1(yêu cầu bo mạch 16GB).

          Trước
          tiên, vui lòng làm theo hướng dẫn tại đây để thiết lập bo mạch RK3588 với OpenCL điều khiển. Sau đó, sao chép MLC-LLM từ nguồn và tải xuống số lượng và thư viện sẵn có.

          # clone mlc-llm từ GitHub
          git clone –recursive https://github.com/mlc-ai/mlc-llm.git && cd mlc-llm
          # Tải xuống các trọng số và thư viện được dựng sẵn
          git lfs install
          mkdir -p dist/prebuilt && cd dist/prebuilt
          git clone https://github.com/mlc-ai/binary-mlc-llm-libs.git lib
          git clone https://huggingface.co/mlc-ai/Llama-3-8B-Instruct-q4f16_1-MLC
          cd ../../..
          Hãy thử CLI
          Xây dựng mlc_llm_cli từ mã nguồn

          cd mlc-llm/
          # tạo thư mục build
          mkdir -p build && cd build
          # tạo cấu hình build
          python3 ../cmake/gen_cmake_config.py
          # build `mlc_llm python package`
          cmake .. && cmake –build . –parallel $(nproc) && cd ..
          Xác định cài đặt của mình

          # dự kiến ​​sẽ thấy , `libmlc_llm.so` và `libmlc_llm_module.so`
          ls -l ./build/
          Hãy thử API Python
          Xây dựng thời gian chạy TVM

          # clone from GitHub
          git clone –recursive https://github.com/mlc-ai/relax.git tvm_unity && cd tvm_unity/
          # tạo thư mục build
          mkdir -p build && cd build
          # tạo cấu hình build
          cp ../cmake/config.cmake . && echo “set(CMAKE_BUILD_TYPE RelWithDebInfo)\nset(USE_OPENCL ON)” >> config.cmake
          # build `TVM runtime`
          cmake .. && cmake –build . –target runtime –parallel $(nproc) && cd ../..
          Thiết lập đường dẫn Python (vui lòng đặt thành bashrc hoặc zshrcđể thiết lập liên tục)

          export TVM_HOME=$(pwd)/tvm_unity
          export MLC_LLM_HOME=$(pwd)/mlc-llm
          export PYTHONPATH=$TVM_HOME/python:$MLC_LLM_HOME/python:${PYTHONPATH}
          Chạy tập lệnh python sau.

          từ mlc_llm nhập ChatModule
          từ mlc_llm.callback nhập StreamToStdout

          cm = ChatModule(
          mô hình=”dist/prebuilt/Llama-3-8B-Instruct-q4f16_1-MLC”,
          mô hình_lib_path=”dist/prebuilt/lib/Llama-3-8b-Instruct/Llama-3-8B-Instruct-q4f16_1-mali.so”,
          thiết bị=”opencl”
          )

          # Tạo phản hồi cho lời nhắc cho trước
          cm.generate(prompt=”Ý nghĩa của cuộc sống là gì?”, progress_callback=StreamToStdout(callback_interval=2))
          # In số liệu thống kê hiệu suất điền trước và giải mã
          print(f”Statistics: {cm.stats()}\n”)

          Thảo luận và công việc tương lai
          Các thử nghiệm hiện tại của chúng tôi cho thấy các mô hình 8B có thể là một điểm mạnh. Mô hình Llama-3-8b-Instruct có thể cung cấp tới 2 tok/giây và trải nghiệm trò chơi khác. Cũng có khả năng cải thiện, công cụ có thể xung quanh các chuyển đổi số nguyên sang số thực. Tiến về phía trước, chúng tôi sẽ giải quyết các vấn đề liên quan và cải thiện hiệu suất của GPU Mali.

          Bài đăng này góp phần vào nỗ lực của chúng tôi nhằm mục đích hợp lý hóa LLM vào các thiết bị giá cả phải chăng và mang AI đến với mọi người. Những nỗ lực trong tương lai của chúng tôi sẽ tập trung vào công việc khai thác những tiến bộ trong máy tính bảng đơn, tinh chỉnh các phần mềm đau đớn như OpenCL và MLC-LLM, và khám phá các ứng dụng rộng hơn như thiết bị nhà thông minh. Những nỗ lực hợp tác trong cộng đồng nguồn mở và cam kết học hỏi và thích nghi liên tục sẽ đóng vai trò sau đó thúc đẩy công việc điều hướng môi trường phát triển khai LLM trên phần cứng mới nổi đang phát triển.

          Xây dựng công cụ kotaemon để trả lời câu hỏi trên các tài liệu địa phương.

          Dự án này là người dùng giao diện người dùng RAG cho cả người dùng cuối cùng muốn thực hiện QA trên tài liệu của họ và các nhà phát triển muốn xây dựng quy trình RAG của riêng mình.

          Đối với người dùng cuối: Giao diện người dùng tối giản và gọn gàng dành cho QA dựa trên RAG. Hỗ trợ các nhà cung cấp API LLM (OpenAI, AzureOpenAI, Cohere, vv) và LLM local (thông qua ollamavà llama-cpp-python). Cài đặt lệnh dễ dàng.
          Dành cho nhà phát triển: Một công cụ khó khăn để xây dựng cơ sở tài liệu chất lượng đảm bảo trên RAG của riêng bạn. Tùy chỉnh và xem quy trình RAG của bạn hoạt động như thế nào với giao diện người dùng được cung cấp (xây dựng bằng Gradio)

          Sử dụng thử tại trang https://huggingface.co/spaces/cin-model/kotaemon-demo

          Các tính năng chính.

          • Lưu trữ tài liệu web QA (RAG) giao diện người dùng của riêng bạn . Hỗ trợ nhiều người đăng nhập, sắp xếp các tệp của bạn trong bộ sưu tập riêng tư/công khai, cộng tác và chia sẻ cuộc trò chuyện yêu thích của bạn với người khác.
          • Tổ chức các mô hình LLM & Embedding của bạn . Hỗ trợ cả địa phương LLM và các nhà cung cấp API phổ biến (OpenAI, Azure, Ollama, Groq).
          • Đường ống RAG lai . Đường ống RAG mặc định hợp lý với trình thu thập lai (toàn văn bản và thú vị) + xếp hạng lại để đảm bảo chất lượng thu thập tốt nhất.
          • Hỗ trợ đa phương thức QA . Thực hiện Trả lời câu hỏi trên nhiều tài liệu với hình ảnh và bảng được hỗ trợ. Đa phương thức tài liệu phân tích được hỗ trợ (tùy chọn có thể chọn trên giao diện người dùng).
          • Trích dẫn nâng cao với bản xem trước tài liệu . Theo mặc định, hệ thống sẽ cung cấp trích dẫn chi tiết để đảm bảo tính chính xác của câu trả lời LLM. Xem trích dẫn của bạn (bao gồm các số liên quan) trực tiếp trong trình xem PDF trong trình duyệt với các điểm nổi bật. Cảnh báo khi đường ống xuất ra trả về các bài viết có liên kết thấp.
          • Hỗ trợ các phương pháp suy luận phức tạp . Sử dụng phân tích câu hỏi để trả lời câu hỏi phức tạp/nhiều bước nhảy của bạn. Hỗ trợ suy luận dựa trên hoạt động với ReAct, ReWOO và các hoạt động khác.
          • Người dùng cài đặt giao diện có thể cấu hình . Bạn có thể điều chỉnh hầu hết các khía cạnh của quá trình truy cập và tạo trên giao diện người dùng (bao gồm cả lời nhắc).
          • Có thể mở rộng . Được xây dựng trên Gradio, bạn có thể tùy chỉnh bất kỳ thành phần UI nào theo ý muốn. Ngoài ra, chúng tôi còn hướng dẫn các mục tiêu hỗ trợ hỗ trợ nhiều chỉ mục cài đặt chiến lược và truy xuất tài liệu. Chỉ mục cài đặt đường ống GraphRAG được cung cấp làm ví dụ.

          Cài đặt

          https://github.com/Cinnamon/kotaemon

          https://cinnamon.github.io/kotaemon/

          Tải xuống kotaemon-app.ziptệp từ https://github.com/Cinnamon/kotaemon/releases/latest/

          File nén đã được tải xuống. Điều hướng đến thư mục script và khởi chạy cài đặt phù hợp với hệ điều hành của bạn:
          Windows: run_windows.bat. Chỉ cần nhấp vào tệp file.
          macOS:run_macos.sh
          Click chuột phải vào tệp của bạn và chọn Mở bằng và Khác. Kích hoạt tất cả ứng dụng và chọn Terminal.
          LƯU Ý: Nếu bạn luôn muốn mở tệp đó bằng Terminal, hãy chọn Luôn mở bằng. Từ bây giờ, hãy nhấp vào tệp của bạn và nó sẽ hoạt động.
          Linux: run_linux.sh. Vui lòng chạy lệnh bằng terminal bash run_linux.shtrong của bạn.
          Sau khi cài đặt, quá trình cài đặt sẽ yêu cầu người dùng giao diện ktem khởi động, vui lòng trả lời Y để tiếp tục. Nếu được khởi chạy, ứng dụng sẽ tự động mở trong trình duyệt của bạn. http://127.0.0.1:7860

          Để khởi động ứng dụng sau khi thiết lập ban đầu hoặc có bất kỳ thay đổi nào, chỉ cần chạy lệnh: bash ./kotaemon-app/scripts/run_linux.sh.

          môi trường conda tại /home/orangepi/kotaemon-app/install_dir/env

          [dữ liệu nltk]

          Setting LLM local & nhúng mô hình

          https://github.com/Cinnamon/kotaemon/blob/main/docs/local_model.md

          Máy chủ tương thích Ollama OpenAI (khuyến nghị)

          Bắt đầu và chạy với các mô hình ngôn ngữ lớn. https://github.com/ollama/ollama

          Cài đặt ARM64

          Tải xuống và giải nén gói dành riêng cho ARM64:

          curl -L https://ollama.com/download/ollama-linux-arm64.tgz -o ollama-linux-arm64.tgz
          sudo tar -C /usr -xzf ollama-linux-arm64.tgz
          Thêm Ollama làm dịch vụ khởi động (khuyến nghị)
          Tạo người dùng và nhóm cho Ollama:

          sudo useradd -r -s /bin/false -U -m -d /usr/share/ollama ollama
          sudo usermod -a -G ollama $(whoami)
          Tạo tệp dịch vụ trong:/etc/systemd/system/ollama.service

          [Unit] Description=Ollama Service
          After=network-online.target

          [Service] ExecStart=/usr/bin/ollama serve
          User=ollama
          Group=ollama
          Restart=always
          RestartSec=3
          Environment=”PATH=$PATH”

          [Install] WantedBy=default.target
          Sau đó bắt đầu dịch vụ:

          sudo systemctl daemon-reload
          sudo systemctl enable ollama

          Trong khi Ollama hỗ trợ một số mô hình, bạn nên sử dụng những mô hình đơn giản hơn như Gemma (2B), Dolphin Phi, Phi 2 và Orca Mini, vì chạy LLM có thể khá tốn kém trên Raspberry Pi của bạn. Nếu bạn có bo mạch Pi với RAM 8 GB, bạn có thể thử chạy 7B LLM, mặc dù hiệu suất sẽ không thực sự ấn tượng. Model nhỏ hơn (ví dụ gemma:2bphihoặc tinyllamacó thể chạy nhanh hơn)

          Để chạy và trò chuyện:

          ModelParametersSizeDownload
          Llama 3.18B4.7GBollama run llama3.1
          Llama 3.170B40GBollama run llama3.1:70b
          Llama 3.1405B231GBollama run llama3.1:405b
          Phi 3 Mini3.8B2.3GBollama run phi3
          Phi 3 Medium14B7.9GBollama run phi3:medium
          Gemma 22B1.6GBollama run gemma2:2b
          Gemma 29B5.5GBollama run gemma2
          Gemma 227B16GBollama run gemma2:27b
          Mistral7B4.1GBollama run mistral
          Moondream 21.4B829MBollama run moondream
          Neural Chat7B4.1GBollama run neural-chat
          Starling7B4.1GBollama run starling-lm
          Code Llama7B3.8GBollama run codellama
          Llama 2 Uncensored7B3.8GBollama run llama2-uncensored
          LLaVA7B4.5GBollama run llava
          Solar10.7B6.1GBollama run solar

          ollama run llama3.1

          Đợi vài phút trong khi nó tải xuống và tải mô hình, sau đó bắt đầu trò chuyện! Nó sẽ đưa bạn đến lời nhắc trò chuyện tương tự như thế này.
          ollama run llama3
          >>> Who was the second president of the united states?
          The second President of the United States was John Adams. He served from 1797 to 1801, succeeding
          George Washington and being succeeded by Thomas Jefferson.

          >>> Who was the 30th?
          The 30th President of the United States was Calvin Coolidge! He served from August 2, 1923, to March 4,
          1929.

          >>> /bye
          Bạn có thể trò chuyện cả ngày trong phần mềm trò chuyện này, nhưng nếu bạn muốn thứ gì đó giống ChatGPT hơn thì dùng Open WebUI là một giao diện người dùng có thể mở rộng, tự lưu trữ.

          Ollama hỗ trợ nhập các mô hình GGUF trong Modelfile: Tạo một tệp có tên , với một hướng dẫn với đường dẫn tệp cục bộ đến mô hình bạn muốn nhập. ModelfileFROM

          FROM ./vicuna-33b.Q4_0.gguf
          Tạo mô hình trong Ollama

          ollama create example -f Modelfile
          Chạy mô hình

          ollama run example

          >>> hi
          Hello! It’s your friend Mario.

          Các mô hình từ thư viện Ollama có thể được tùy chỉnh với một lời nhắc. Ví dụ: để tùy chỉnh mô hình:llama3.1

          ollama pull llama3.1
          Tạo tệp :Modelfile

          FROM llama3.1

          # set the temperature to 1 [higher is more creative, lower is more coherent] PARAMETER temperature 1

          # set the system message
          SYSTEM “””
          You are Mario from Super Mario Bros. Answer as Mario, the assistant, only.
          “””
          Tiếp theo, tạo và chạy mô hình:

          ollama create mario -f ./Modelfile
          ollama run mario
          >>> hi
          Hello! It’s your friend Mario.

          Tạo mô hình

          ollama create được sử dụng để tạo một mô hình từ một Modelfile.

          ollama create mymodel -f ./Modelfile

          Kéo mô hình

          ollama pull llama3.1
          Lệnh này cũng có thể được sử dụng để cập nhật mô hình cục bộ. Chỉ có sự khác biệt sẽ được kéo.

          Xóa mô hình

          ollama rm llama3.1

          Sao chép mô hình

          ollama cp llama3.1 my-model

          Đầu vào đa dòng

          Đối với nhập nhiều dòng, bạn có thể ngắt dòng bằng :”””

          >>> “””Hello,
          … world!
          … “””
          I’m a basic program that prints the famous “Hello, world!” message to the console.

          Mô hình đa phương thức

          ollama run llava “What’s in this image? /Users/jmorgan/Desktop/smile.png”
          The image features a yellow smiley face, which is likely the central focus of the picture.

          Chuyển lời nhắc làm đối số

          $ ollama run llama3.1 “Summarize this file: $(cat README.md)”
          Ollama is a lightweight, extensible framework for building and running language models on the local machine. It provides a simple API for creating, running, and managing models, as well as a library of pre-built models that can be easily used in a variety of applications.

          Hiển thị thông tin mô hình

          ollama show llama3.1

          Liệt kê các mô hình trên máy tính của bạn

          ollama list

          Bắt đầu Ollama

          ollama serve được sử dụng khi bạn muốn khởi động Ollama mà không cần chạy ứng dụng máy tính để bàn.

          khởi động máy chủ:

          ./ollama serve
          Cuối cùng, trong một shell riêng, chạy một model:

          ./ollama run llama3.1

          REST API

          API của Ollama. Nếu bạn muốn tích hợp Ollama vào các dự án của riêng bạn, Ollama cung cấp cả API riêng của nó cũng như API tương thích với OpenAI. Các API tự động tải LLM được lưu trữ cục bộ vào bộ nhớ, chạy suy luận, sau đó dỡ tải sau một khoảng thời gian chờ nhất định. Bạn phải kéo bất kỳ mô hình nào bạn muốn sử dụng trước khi có thể chạy mô hình thông qua API, điều này có thể dễ dàng thực hiện thông qua dòng lệnh.
          ollama pull mistral

          Ollama có API riêng của họ, trong đó cũng có một số SDK cho Javascript và Python.

          Sau đây là cách bạn có thể thực hiện suy luận tạo văn bản đơn giản bằng API.
          curl http://localhost:11434/api/generate -d ‘{
          “model”: “mistral”,
          “prompt”:”Why is the sky blue?”
          }’
          Và đây là cách bạn có thể thực hiện suy luận tạo cuộc trò chuyện bằng API.
          curl http://localhost:11434/api/chat -d ‘{
          “model”: “mistral”,
          “messages”: [
          { “role”: “user”, “content”: “why is the sky blue?” }
          ] }’
          Thay thế modeltham số bằng bất kỳ mô hình nào bạn muốn sử dụng. Xem tài liệu API chính thức để biết thêm thông tin.

          API tương thích OpenAI
          Bạn cũng có thể sử dụng Ollama như một sự thay thế (tùy thuộc vào trường hợp sử dụng) với các thư viện OpenAI. Sau đây là một ví dụ từ tài liệu của họ .
          # Python
          from openai import OpenAI

          client = OpenAI(
          base_url=’http://localhost:11434/v1/’,

          # required but ignored
          api_key=’ollama’,
          )

          chat_completion = client.chat.completions.create(
          messages=[
          {
          ‘role’: ‘user’,
          ‘content’: ‘Say this is a test’,
          }
          ],
          model=’mistral’,
          )
          Điều này cũng áp dụng được với Javascript.
          // Javascript
          import OpenAI from ‘openai’

          const openai = new OpenAI({
          baseURL: ‘http://localhost:11434/v1/’,

          // required but ignored
          apiKey: ‘ollama’,
          })

          const chatCompletion = await openai.chat.completions.create({
          messages: [{ role: ‘user’, content: ‘Say this is a test’ }],
          model: ‘llama2’,
          })

          Ollama có API REST để chạy và quản lý các mô hình.

          Tạo phản hồi trên Powershell
          curl http://localhost:11434/api/generate -d ‘{“model”: “llama3.1”, “prompt”:”Why is the sky blue?” }’
          Trò chuyện với người mẫu
          curl http://localhost:11434/api/chat -d ‘{ “model”: “llama3.1”,
          “messages”: [{ “role”: “user”, “content”: “why is the sky blue?” }]}’

          Xem nhật ký

          Để xem nhật ký của Ollama đang chạy như một dịch vụ khởi động, hãy chạy:

          journalctl -e -u ollama

          Gỡ cài đặt

          Xóa dịch vụ ollama:

          sudo systemctl stop ollama
          sudo systemctl disable ollama
          sudo rm /etc/systemd/system/ollama.service
          Xóa nhị phân ollama khỏi thư mục thùng rác của bạn (, , hoặc ):/usr/local/bin/usr/bin/bin

          sudo rm $(which ollama)
          Xóa các mô hình đã tải xuống và người dùng và nhóm dịch vụ Ollama:

          sudo rm -r /usr/share/ollama
          sudo userdel ollama
          sudo groupdel ollama

          Ollama Windows Preview

          powershell: (Invoke-WebRequest -method POST -Body ‘{“model”:”llama3″, “prompt”:”Why is the sky blue?”, “stream”: false}’ -uri http://localhost:11434/api/generate ).Content | ConvertFrom-json

          Khi tôi thực hiện ollama serve, tôi phải đối mặt với vấn đề dưới đây:

          Lỗi: nghe tcp 127.0.0.1:11434: bind: Chỉ cho phép một lần sử dụng mỗi địa chỉ socket (giao thức/địa chỉ mạng/cổng).

          Mở brower localhost:11434 thì Ollama is running

          Vì vậy, nếu bạn tắt cả hai hoặc ít nhất là tắt quá trình “ứng dụng ollama”, nó sẽ giải quyết vấn đề đó. Đây là phím tắt của bạn: Get-Process ollama* | Stop-Process -Force | ollama serve

          Ollama trên Windows lưu trữ các tệp ở một vài vị trí khác nhau. Bạn có thể xem chúng trong Cửa sổ Explorer bằng cách nhấn và gõ: cmd

          explorer %LOCALAPPDATA%\Ollama chứa nhật ký và các bản cập nhật đã tải xuống
          app.log chứa hầu hết các bản ghi được phẫn nộ từ ứng dụng GUI
          server.log chứa nhật ký máy chủ gần đây nhất
          upgrade.log chứa đầu ra nhật ký để nâng cấp
          explorer %LOCALAPPDATA%\Programs\Ollama chứa các tệp nhị phân (Trình cài đặt thêm tệp này vào đường dẫn người dùng của bạn)
          explorer %HOMEPATH%\.ollama chứa các mô hình và cấu hình
          explorer %TEMP% chứa các tệp thực thi tạm thời trong một hoặc nhiều thư mụcollama*

          Open WebUI

          Open WebUI cung cấp phương pháp cài đặt. Python 3.11 là bắt buộc đối với phương pháp này. Cài đặt Open WebUI : Mở terminal và chạy lệnh sau:

          pip install open-webui

          Bắt đầu Mở WebUI : Sau khi cài đặt, hãy khởi động máy chủ bằng cách sử dụng:

          open-webui serve

          Phương pháp này cài đặt tất cả các phụ thuộc cần thiết và khởi động Open WebUI, cho phép thiết lập đơn giản và hiệu quả. Sau khi cài đặt, bạn có thể truy cập Open WebUI tại http://localhost:8080

          Open WebUI bao gồm hai thành phần chính: frontend và backend (hoạt động như một proxy ngược, xử lý các tệp frontend tĩnh và các tính năng bổ sung)

          git clone https://github.com/open-webui/open-webui.git
          cd open-webui

          # Đối với Windows: copy .env.example .env

          # Copying required .env file Đối với Linux/macOS:
          cp -RPp .env.example .env

          npm install
          npm run build

          Đối với Linux/macOS: cd ./backend

          Đối với Windows: cd .\backend

          # Optional: To install using Conda as your development environment, follow these instructions:
          # Create and activate a Conda environment
          conda create –name open-webui-env python=3.11
          conda activate open-webui-env

          pip install -r requirements.txt -U

          start.bat

          Bạn nên mở Open WebUI và chạy tại http://localhost:8080/ .

          Tôi đã thử sử dụng Orca Mini và Phi 2 trên Raspberry Pi 5 của mình và chúng hoạt động khá tốt. Tuy nhiên, những hạn chế của SBC trở nên rõ ràng ngay khi tôi chạy các mô hình 7B như Mistral và Llama. Ngoài độ trễ dài sau khi nhập lời nhắc, LLM khá chậm trong việc tạo văn bản, với tốc độ trung bình là 1–2 mã thông báo mỗi giây.

          Mặc dù việc biến bo mạch Raspberry Pi của bạn thành trình tạo văn bản AI là một dự án nhỏ thú vị, nhưng thiết bị nhỏ bé này hầu như không thể phát huy hết sức mạnh của nó khi chạy các LLM phức tạp hơn. Do đó, bạn nên cân nhắc tìm hiểu về PC AI mạnh mẽ nếu bạn muốn phản hồi nhanh hơn từ các LLM yêu thích của mình.

          Xây dựng ứng dụng máy tính web — bằng Python

          https://github.com/gradio-app/gradio

          Gradio là một gói mở nguồn Python cho phép bạn nhanh chóng xây dựng bản demo hoặc ứng dụng web cho máy học, API hoặc bất kỳ tùy chọn Python chức năng nào. Sau đó, bạn có thể chia sẻ liên kết đến bản demo hoặc web ứng dụng của mình chỉ trong vài giây bằng cách sử dụng tính năng chia sẻ của Gradio. Không cần kinh nghiệm về JavaScript, CSS hoặc lưu trữ web! Ứng dụng Gradio có thể được phát triển miễn phí trên  Hugging Face Spaces .

          Điều kiện tiên quyết : Gradio yêu cầu Python 3.8 trở lên

          Chúng tôi khuyên bạn nên cài đặt Gradio bằng pip, được bao gồm theo mặc định trong Python. Chạy lệnh này trong terminal hoặc lệnh command của bạn:

          pip install gradio
          Tốt nhất là cài đặt Gradio trong môi trường ảo. Môi trường ảo trong Python là một thư mục độc lập chứa bản cài đặt Python cho một phiên bản cụ thể Python, cùng với một số gói bổ sung. Môi trường này được phân biệt từ bản cài đặt Python chính và các môi trường ảo khác. Mỗi môi trường có thể có gói Python được cài đặt độc lập, cho phép bạn duy trì các thư viện phiên bản khác nhau cho các dự án khác nhau mà không bị xung đột.

          Sử dụng môi trường ảo để đảm bảo rằng bạn có thể làm việc trên nhiều dự án Python trên cùng một máy mà không có bất kỳ xung đột nào. Điều này đặc biệt hữu ích khi các dự án khác nhau yêu cầu các phiên bản khác nhau của cùng một thư viện. Nó cũng đơn giản hóa việc quản lý phụ thuộc và tăng cường khả năng tái tạo, bởi vì bạn có thể dễ dàng chia sẻ các yêu cầu của dự án với những người khác. Mở Dấu nhắc Lệnh và điều hướng đến dự án thư mục của bạn. Sau đó tạo môi trường ảo bằng lệnh sau:

          python -m venv gradio-env
          Lệnh này tạo một dự án thư mục gradio-envtrong thư mục mới của bạn, chứa bản cài đặt Python mới. Kích hoạt môi trường ảo, hãy chạy:

          .\gradio-env\Scripts\kích hoạt

          Kích hoạt môi trường ảo : Để kích hoạt môi trường ảo trên MacOS/Linux, hãy sử dụng:

          nguồn gradio-env/bin/activate

          Lệnh nhắc của bạn bây giờ sẽ chỉ ra rằng bạn đang làm việc bên trong gradio-env. Lưu ý: bạn có thể chọn tên khác cho môi trường ảo gradio-env tên của mình trong bước này. Bây giờ bạn đã có thể cài đặt Gradio bằng pip: pip install gradio

          Xác minh : Để xác định cài đặt, hãy chạy pythonrồi:

          import gradio as gr
          print(gr.__version__)
          Thao tác này sẽ hiển thị phiên bản cài đặt Gradio đã cài đặt.

          Bằng cách thực hiện theo các bước này, bạn có thể cài đặt thành công Gradio trong môi trường ảo trên hệ điều hành của mình, đảm bảo không gian làm việc sạch sẽ và được quản lý cho các dự án Python của bạn.

          https://www.gradio.app/main/guides/installing-gradio-in-a-virtual-environment

          Xây dựng bản demo đầu tiên

          Bạn có thể chạy Gradio trong trình soạn thảo yêu thích mã hóa của mình, cửa sổ Jupyter, Google Colab, gradio.app/playground hoặc bất kỳ nơi nào khác mà bạn viết Python. Hãy cùng viết ứng dụng Gradio đầu tiên của bạn:

          nhập gradio dưới dạng gr

          def hello(tên, cường độ):
          trả về “Xin chào, ” + tên + “!” * int(cường độ)

          demo = gr.Interface(
          fn=greet,
          inputs=[“text”, “slider”],
          outputs=[“text”],
          )

          demo.launch()

          Bây giờ, hãy chạy mã của bạn. Nếu bạn đã viết mã Python trong tệp có tên app.py, thì bạn sẽ chạy python app.pytừ thiết bị đầu cuối.

          Bản demo bên dưới sẽ mở trong trình duyệt tại http://localhost:7860 nếu chạy từ tệp tệp. Nếu bạn đang chạy quá trình sao chép sổ sách, bản demo sẽ được hiển thị trong quá trình sao chép sổ sách. Nhập tên của bạn vào hộp văn bản bên trái, kéo thanh trượt, sau đó nhấn nút Gửi. Bạn sẽ tìm thấy lời chào thân thiện ở bên phải.

          Mẹo:
          Khi phát triển cục bộ, bạn có thể chạy ứng dụng Gradio của mình ở chế độ tải lại nóng, chế độ này sẽ tự động tải lại ứng dụng Gradio bất cứ khi nào bạn thực hiện thay đổi đối với tệp. Để thực hiện công việc này, chỉ cần nhập gradio trước tên tệp thay vì python. Trong ví dụ trên, bạn sẽ nhập: `gradio app.py` ở đầu thiết bị cuối cùng của mình.

          Chạy ứng dụng Gradio trên máy chủ của bạn với Nginx

          trong một số trường hợp, bạn có thể muốn phát triển ứng dụng Gradio trên máy chủ của riêng mình. Bạn có thể đã sử dụng Nginx, một máy chủ có hiệu suất cao, để phục vụ trang web của mình (ví dụ https://www.example.com), và bạn muốn đính kèm Gradio vào một phụ cụ đường dẫn thể trên trang web của mình (ví dụ https://www.example.com/gradio-demo).

          Bắt đầu bằng cách chỉnh sửa cấu hình tệp Nginx trên web máy chủ của bạn. Theo mặc định, tệp này nằm tại:/etc/nginx/nginx.conf
          Trong khối http, thêm dòng sau để bao gồm cấu hình khối máy chủ từ một tệp riêng biệt:

          include /etc/nginx/sites-enabled/*;
          Tạo một tệp mới trong /etc/nginx/sites-available thư mục (tạo thư mục nếu chưa tồn tại), sử dụng tên tệp đại diện cho ứng dụng của bạn, ví dụ:sudo nano /etc/nginx/sites-available/my_gradio_app

          Dán nội dung sau vào trình soạn thảo tệp của bạn:

          server {
          listen 80;
          server_name example.com www.example.com; # Change this to your domain name

          location /gradio-demo/ { # Change this if you’d like to server your Gradio app on a different path
          proxy_pass http://127.0.0.1:7860/; # Change this if your Gradio app will be running on a different port
          proxy_buffering off;
          proxy_redirect off;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection “upgrade”;
          proxy_set_header Host $host;
          proxy_set_header X-Forwarded-Host $host;
          proxy_set_header X-Forwarded-Proto $scheme;
          }
          }
          Mẹo: Việc thiết lập các tiêu đề `X-Forwarded-Host` và `X-Forwarded-Proto` rất quan trọng vì Gradio sử dụng các tiêu đề này, kết hợp với tham số `root_path` được thảo luận bên dưới, để xây dựng URL công khai mà ứng dụng của bạn đang được phục vụ. Gradio sử dụng URL công khai để lấy nhiều tài sản tĩnh khác nhau. Nếu các tiêu đề này không được thiết lập, ứng dụng Gradio của bạn có thể tải ở trạng thái bị hỏng.

          Lưu ý: Biến $hostkhông bao gồm cổng máy chủ. Nếu bạn đang phục vụ ứng dụng Gradio của mình trên địa chỉ IP và cổng thô, bạn nên sử dụng biến $http_hostthay thế, trong các dòng này:

          proxy_set_header Host $host;
          proxy_set_header X-Forwarded-Host $host;
          Chạy ứng dụng Gradio của bạn trên máy chủ web
          Trước khi khởi chạy ứng dụng Gradio, bạn cần phải thiết lập root_path giống với đường dẫn phụ mà bạn đã chỉ định trong cấu hình nginx. Điều này là cần thiết để Gradio chạy trên bất kỳ đường dẫn phụ nào ngoài gốc của tên miền.

          Lưu ý: Thay vì đường dẫn phụ, bạn cũng có thể cung cấp URL đầy đủ cho root_path (bắt đầu bằng http hoặc https), trong trường hợp đó root_path được coi là URL tuyệt đối thay vì hậu tố URL (nhưng trong trường hợp này, bạn sẽ cần cập nhật root_path nếu tên miền thay đổi).

          Sau đây là một ví dụ đơn giản về ứng dụng Gradio có tùy chỉnh root_pathtương ứng với cấu hình Nginx ở trên.

          import gradio as gr
          import time

          def test(x):
          time.sleep(4)
          return x

          gr.Interface(test, “textbox”, “textbox”).queue().launch(root_path=”/gradio-demo”)
          Bắt đầu tmux phiên bằng cách nhập tmux và nhấn enter (tùy chọn)
          Bạn nên chạy ứng dụng Gradio của mình trong một tmux phiên để có thể dễ dàng duy trì ứng dụng chạy ở chế độ nền

          Sau đó, bạn hãy khởi động ứng dụng Gradio của mình. Chỉ cần nhập vào python theo sau là tệp Python Gradio của bạn. Theo mặc định, ứng dụng của bạn sẽ chạy trên localhost:7860, nhưng nếu nó khởi động trên một cổng khác, bạn cần cập nhật cấu hình tệp nginx ở trên.
          Khởi động lại Nginx
          Nếu bạn đang ở phiên bản tmux, hãy thoát bằng cách nhấn CTRL+B (hoặc CMD+B), sau đó là phím “D”.

          Cuối cùng, khởi động lại nginx bằng cách chạy sudo systemctl restart nginx.

          Và thế là xong! Nếu bạn truy cập https://example.com/gradio-demo trên trình duyệt của mình, bạn sẽ thấy ứng dụng Gradio đang chạy ở đó.

          Cho phép localhost chấp nhận không an toàn trên trình duyệt

          • Trường hợp 1: Cấu hình Google Chrome/Cốc cốc

          Mở Google Chrome.
          Nhập vào thanh địa chỉ: chrome://flags sau đó nhấn Enter.
          Nhập từ khóa: #allow-insecure-localhost vào ô tìm kiếm.
          Đổi trạng thái từ Disabled thành Enabled trong kết quả tìm kiếm (Nếu trạng thái đang là Enabled thì không cần thực hiện).
          Khởi động lại Google Chrome/Cốc Cốc.

          • Trường hợp 2: Cấu hình Firefox

          Mở trình duyệt Firefox.
          Vào menu Tools chọn Options (hoặc nhấn vào biểu tượng ba dấu gạch ngang bên góc trên bên phải màn hình và chọn Options).
          Tìm đến phân hệ Privacy & Security.
          Trong phần Certificates chọn View certificates.
          Trong cửa sổ Certificate Manager, người dùng chọn tab Servers
          Nhấn vào Add Exeption.
          Tại cửa số Add Security Exeption, người dùng nhập localhost:8006 vào ô Location.
          Nhấn Get Certificate.
          Nhấn Confirm Security Exeption
          Nhấn OK để xác nhận thay đổi.
          Khởi động lại Firefox để hoàn thành cấu hình.

          Cách chạy Llama 3.2-Vision cục bộ với Ollama

          Ollama vừa tung ra hỗ trợ Llama 3.2-Vision! Mô hình này không chỉ vượt trội về khả năng hiểu ngôn ngữ tự nhiên mà còn xử lý hình ảnh liền mạch, và phần tuyệt nhất là gì? Nó miễn phí và được thiết kế cho AI biên (edge).

          Llama 3.2-Vision mang lại khả năng thị giác cho một trong những mô hình ngôn ngữ thú vị nhất, cho phép xử lý cả văn bản và hình ảnh.

          • Khả năng đa phương thức : Llama 3.2-Vision xử lý cả văn bản và hình ảnh, rất quan trọng cho các ứng dụng AI biên.
          • Xử lý thời gian thực : Được tối ưu hóa cho các thiết bị biên, cho phép phản hồi tức thì mà không cần dựa vào đám mây.
          • Nâng cao quyền riêng tư và giảm chi phí : Xử lý cục bộ lưu trữ dữ liệu nhạy cảm trên thiết bị và giảm chi phí đám mây.
          • Dễ triển khai : Thiết lập thân thiện với người dùng của Ollama giúp đơn giản hóa việc triển khai AI đa phương thức, ngay cả đối với các nhà phát triển không có chuyên môn sâu về AI.
          • Tối ưu hóa cạnh : Lý tưởng cho các ứng dụng thực tế như robot, AR và chăm sóc sức khỏe, nơi mà việc hiểu hình ảnh theo thời gian thực là yếu tố quan trọng.

          Bước 1 — Nâng cấp Ollama lên 0.4.1
          Để mở khóa sức mạnh của Llama 3.2-Vision , bạn sẽ cần nâng cấp Ollama lên phiên bản 0.4.1. Sau đây là cách thực hiện:

          1. Tải xuống phiên bản mới nhất Truy cập trang web của Ollama và tải xuống phiên bản 0.4.1.
          2. Chạy ứng dụng. Sau khi tải tệp xuống, hãy chạy ứng dụng.
          3. Xác minh cài đặt. Kiểm tra xem bản cập nhật có thành công hay không bằng cách chạy:

          ollama –version
          #ollama phiên bản là 0.4.1

          Bước 2 — Cài đặt mô hình Llama 3.2 Vision
          Bây giờ bạn đã cập nhật Ollama, hãy kéo mô hình Llama 3.2-Vision . Sử dụng lệnh sau:

          ollama run llama3.2-vision

          Llama 3.2 Vision là tập hợp các mô hình tạo lập lý luận hình ảnh được điều chỉnh theo hướng dẫn ở kích thước 11B và 90B.

          Thuật ngữ này 11b ám chỉ phiên bản 11 tỷ tham số của mô hình, đảm bảo độ chính xác cao trong các tác vụ thị giác.

          Bạn có thể xác minh cài đặt bằng cách chạy:

          ollama list

          Đầu ra sẽ hiển thị:

          TÊN ID KÍCH THƯỚC ĐÃ SỬA ĐỔI
          llama3.2-vision 2*****6a29 7,9 GB * giờ trước

          Bước 3— Chạy Llama 3.2-Tầm nhìn
          Chúng ta hãy cùng bắt đầu phần thú vị — chạy mô hình Llama 3.2-Vision trên một hình ảnh.

          Sau đây là cách thực hiện ngay từ giao diện dòng lệnh (CLI) của bạn:

          ollama run llama3.2-vision “describe this image: /Users/../images/Gryffindor_ClearBG.png”

          Thay thế /Users/../images/Gryffindor_ClearBG.png bằng đường dẫn đến hình ảnh bạn chọn. Mô hình sẽ phân tích hình ảnh và đưa ra phản hồi dựa trên sự hiểu biết của nó.

          Đầu ra

          Hình ảnh này có vẻ là logo hoặc biểu tượng cho nhà Gryffindor của Hogwarts. Nó có tông màu đỏ và vàng đậm, là những màu truyền thống gắn liền với Gryffindor. Thiết kế đơn giản nhưng nổi bật, với dòng chữ “Gryffindor” trên một đường cong phía trên đầu sư tử, là biểu tượng phổ biến của lòng dũng cảm và can đảm – những giá trị mà nhà Gryffindor thể hiện.

          Ví dụ này cho thấy khả năng nhận dạng vật thể và ý nghĩa tượng trưng của nó của mô hình.

          Tích hợp với Llama 3.2-Vision bằng Python

          Để tích hợp khả năng xử lý hình ảnh của Llama 3.2-Vision bằng Ollama trong Python , đây là một ví dụ thực tế trong đó bạn gửi hình ảnh đến mô hình để phân tích. Đoạn mã Python giới thiệu chatchức năng của Ollama để diễn giải hình ảnh.

          import ollama

          image_path = ‘/Users/../images/Gryffindor_ClearBG.png’ # Replace with your image path

          # Use Ollama to analyze the image with Llama 3.2-Vision
          response = ollama.chat(
          model=”llama3.2-vision”,
          messages=[{
          “role”: “user”,
          “content”: “Describe this image?”,
          “images”: [image_path] }],
          )

          # Trích xuất phản hồi của mô hình về hình ảnh
          cleaned_text = response[‘message’][‘content’].strip()
          print(f”Model Response: {cleaned_text}”)

          Trong phản hồi, mô hình trả về kết quả đã xử lý, chẳng hạn như xác định nội dung của bất kỳ dữ liệu trực quan nào được cung cấp.

          Thử nghiệm
          Xem Llama 3.2-Vision hoạt động như thế nào với bản demo OCR này, có tính năng nhận dạng bìa sách liền mạch tại đây: https://pub.towardsai.net/enhance-ocr-with-llama-3-2-vision-using-ollama-0b15c7b8905c

          import ollama

          # Example usage
          image_path = ‘image.png’ # Replace with your image path

          # Use Ollama to clean and structure the OCR output
          response = ollama.chat(
          model=”llama3.2-vision”,
          messages=[{
          “role”: “user”,
          “content”: “The image is a book cover. Output should be in this format – <Name of the Book>: <Name of the Author>. Do not output anything else”,
          “images”: [image_path] }],
          )
          # Extract cleaned text
          cleaned_text = response[‘message’][‘content’].strip()
          print(cleaned_text)

          Phần kết luận
          Với Llama 3.2-Vision , Meta đã có bước tiến lớn trong AI biên, giúp các thiết bị thông minh hơn và có khả năng hơn bao giờ hết. Cho dù bạn là nhà nghiên cứu AI, nhà phát triển AI hay chỉ đơn giản là người thích thử nghiệm công nghệ mới nhất, bản phát hành này sẽ mở ra những khả năng mới thú vị.

          Linh hoạt odoo trên Debian

          Tài liệu tham khảo triển khai odoo
          Nội dung

            Xem máy đang dùng Debian phiên bản nào bằng câu lệnh :

            lsb_release -a

            Mình sẽ thấy kết quả:

            No LSB modules are available.
            Distributor ID: Debian
            Description: Debian GNU/Linux 12 (bookworm)
            Release: 12
            Codename: bookworm

            Phải chắc hệ thống cập nhật:sudo apt update -y
            Wkhtmltopdf là một công cụ dòng lệnh nguồn mở để hiển thị dữ liệu HTML sang định dạng PDF bằng cách sử dụng webkit Qt. Để cài đặt wkhtmltopdf trên máy chủ Debian 12 của bạn, hãy thực hiện lệnh bên dưới.

            apt install wkhtmltopdf
            wkhtmltopdf --version

            Để kiểm tra phiên bản wkhtmltopdf, chúng ta có thể thực hiện lệnh bên dưới.
            Trước khi cài đặt Odoo 15 trên Debian 10 / Debian 11, chúng ta cần thêm kho lưu trữ Odoo apt vào hệ thống cục bộ của mình.

            Nhập khóa kho lưu trữ GPG:

            sudo apt install gnupg2 
            wget https://nightly.odoo.com/odoo.key 
            cat odoo.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/odoo.gpg >/dev/null
            

            Thêm kho lưu trữ Odoo vào hệ thống của bạn:
            echo “deb http://nightly.odoo.com/15.0/nightly/deb/ ./” | sudo tee /etc/apt/sources.list.d/odoo.list
            Sau khi kho lưu trữ được thêm vào, hãy cập nhật bộ đệm Apt của bạn.
            sudo apt update
            Sau đó cài đặt Odoo 15 trên Debian 11 / Debian 10.
            sudo apt install odoo
            Sau này có muốn thay đổi phiên bản odoo chỉ cần thay đổi trong
            sudo nano /etc/apt/sources.list.d/odoo.list

            Lưu ý nên xóa database trước khi remove app rồi thay đổi phiên bản.
            Thay đổi người dùng thành người dùng cơ sở dữ liệu của bạn: sudo su postgres
            Khởi động Psql:psql
            Liệt kê các cơ sở dữ liệu có sẵn: \l
            Bỏ cơ sở dữ liệu: drop database your_db_name_to_remove;
            Thoát psql: \q
            Thoát không gian người dùng-người dùng cơ sở dữ liệu: exit
            Khởi động lại máy chủ odoo, ví dụ: sudo service odoo-server restart
            Nếu bạn nhận được thông báo như “Không thể xóa cơ sở dữ liệu. CHI TIẾT: Có 5 phiên khác đang sử dụng cơ sở dữ liệu postgres”, bạn cần xóa các kết nối đang hoạt động bằng cách nhập: SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = ‘your_db_name_to_remove’ AND pid != pg_backend_pid();

            sudo apt-get remove odoo, sudo apt-get purge odoo, sudo apt-get autoremove
            sudo apt install -f
            OR
            sudo apt install –fix-broken
            sudo apt remove –purge package_name
            sudo apt clean
            sudo apt autoremove
            sudo ls -l /var/lib/dpkg/info | grep -i package_name
            sudo mv /var/lib/dpkg/info/package-name.* /tmp
            sudo rm -r /var/lib/dpkg/info/package-name.*
            sudo apt update

            Chấp nhận tất cả lời nhắc cài đặt được trình bày cho bạn
            Sau khi cài đặt Odoo 15 trên Debian 11/10, dịch vụ sẽ tự động khởi động.
            systemctl status odoo

            Liệt kê

            service --status-all

            Đặt dịch vụ để bắt đầu mỗi lần khởi động lại hệ thống.
            sudo systemctl enable –now odoo
            Dịch vụ Odoo sẽ liên kết với cổng TCP 8069 sau khi khởi động.
            ss -tunelp | grep 8069

            https://computingforgeeks.com/how-to-install-odoo-on-debian-linux/

            Chạy thử nghiệm odoo trên runbot.odoo.com

            Odoo Runbot (hoặc đơn giản là runbot) là một máy chủ lưu trữ các phiên bản/nhánh đã cài đặt của Odoo.

            Nó có sẵn tại http://runbot.odoo.com và là máy chủ được cập nhật liên tục chạy Odoo cho mục đích thử nghiệm và demo.

            Để biết thêm thông tin về phiên bản nào Odoo hỗ trợ và trong bao lâu, hãy xem  https://www.odoo.com/documentation/16.0/administration/maintain/supported_versions.html

            Cả hai phiên bản Cộng đồng và Doanh nghiệp đều có sẵn.

            Nhấp vào biểu tượng CỬA bên cạnh phiên bản bạn muốn truy cập:

            Lưu ý: bạn có thể không được nhắc chọn cơ sở dữ liệu.

            Đăng nhập:

            – admin / admin

            – demo / demo

            – portal / portal

            Đây là ba Người dùng khác nhau có quyền Toàn bộ/Một phần/Cổng thông tin để bạn có thể thử nghiệm các tình huống khác nhau.

            Trang chủ của runbot hiển thị các ô vuông được tô sáng màu xanh lá cây (ký hiệu #) và màu đỏ (ký hiệu #) để biểu thị bản dựng hoạt động (màu xanh lá cây) hoặc không hoạt động (màu đỏ).

            Nếu bạn gặp sự cố với quá trình cài đặt Odoo, bạn có thể kiểm tra xem sự cố tương tự có xảy ra trên runbot hay không (trong trường hợp đó có thể là lỗi) hoặc không xảy ra (trong trường hợp đó có thể là sự cố cấu hình).

            Bạn cũng có thể sử dụng runbot để xem bản dựng mới hơn bản dựng bạn đã cài đặt có gì khác biệt.

            Ghi chú phát hành đầy đủ cho các phiên bản có tại  https://www.odoo.com/page/release-notes

            Hãy nhớ rằng đây là một môi trường nhiều người dùng. Bạn có thể thấy bằng chứng về việc người khác đang sử dụng hệ thống vào cùng thời điểm bạn đang sử dụng nó.

            Đối với Đối tác của Odoo, runbot là nền tảng nơi bạn có thể kiểm tra các nhánh được đẩy trên GitHub.

            EDIT: (Để giải quyết câu hỏi về Tích hợp liên tục)

            Di chuột qua bất kỳ nhánh nào có hình vuông ĐỎ (ngón tay cái hướng xuống) và bạn sẽ thấy biểu tượng bánh răng. Nhấp vào nó và chọn “Nhật ký”. Sau đó, bạn sẽ có thể xem tệp nhật ký chi tiết cho biết những gì không thành công.

             

            Một số nhật ký cho biết điều gì đã xảy ra trong quá trình xây dựng sẽ có sẵn:

            Mô tả hình ảnh

            bắt đầu với test-all.txt

            Lưu ý: Hiệp hội cộng đồng Odoo có máy chủ runbot riêng tại https://runbot.odoo-community.org/runbot

            Nhân viên Odoo: bạn có thể đăng nhập thông qua nút ở góc trên bên phải – điều này cho phép bạn truy cập để chỉnh sửa Chế độ xem và dữ liệu khác bên trong cơ sở dữ liệu (một đặc quyền mà chúng tôi phải không cung cấp cho công chúng do lạm dụng).

            Nâng cấp python trên 3.10 để chạy odoo17

            Update hệ thống: sudo apt update && sudo apt upgrade -y
            Trước tiên chúng ta cần cài đặt các phần phụ thuộc cần thiết để có thể xây dựng Python 3.10:
            sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev wget libbz2-dev
            Sau đó tải xuống Python 3.10 từ trang phát hành Python chính thức: wget https://www.python.org/ftp/python/3.10.0/Python-3.10.0.tgz
            tar xzf Python-3.10.0.tgz
            Điều hướng đến thư mục được giải nén và chạy lệnh configure để kiểm tra xem các phụ thuộc cần thiết có sẵn hay không.
            cd Python-3.10.*/
            Sau đó thực hiện configurelệnh để xác nhận xem tất cả các phụ thuộc cho quá trình cài đặt Python 3.10 có được đáp ứng hay không.

            sudo ./configure --enable-optimizations

            Cờ -–enable-optimizationstối ưu hóa nhị phân Python và thực hiện nhiều thử nghiệm. Để bắt đầu quá trình xây dựng. Thực hiện lệnh sau make. Việc này mất khá nhiều thời gian, vì vậy hãy kiên nhẫn. Giá trị ‘ 2′ biểu thị số lõi CPU có thể được xác nhận bằng nproclệnh. Điều chỉnh giá trị này tùy theo số lượng lõi CPU có trên hệ thống của bạn:

            nproc
            sudo make -j 2

            Cuối cùng, hãy chạy lệnh bên dưới để cài đặt các tệp nhị phân python sau khi quá trình xây dựng hoàn tất:

            sudo make altinstall

            Cờ altinstall được sử dụng để duy trì đường dẫn nhị phân Python mặc định trong /usr/bin/python.
            Xác minh cài đặt: python3.10 –version
            Chúng ta cần chỉ định Python3.10 làm phiên bản Python ưu tiên cho hệ thống này. Thực hiện theo các bước sau để thay đổi phiên bản Python mặc định từ Python3.8 thành Python3.10.
            Trước tiên, bạn phải tạo các liên kết tượng trưng cho từng phiên bản Python được cài đặt trên hệ thống của mình. Khi tạo liên kết tượng trưng, ​​​​bạn nên bao gồm tên nhóm “python3” theo sau là số phiên bản. Để thực hiện việc này, hãy sử dụng các lệnh dưới đây:
            sudo update-alternatives –install /usr/bin/python3 python3 /usr/bin/python3.10 1

            update-alternatives --install /usr/bin/python python /usr/local/bin/python3.10 1

            Hoặc làm theo cách ghi đè:

            sudo mv /usr/bin/python3 /usr/bin/o_python3
            sudo ln -s /usr/bin/python3 /usr/local/bin/python3.10

            sudo update-alternatives –install /usr/bin/python3 python3 /usr/bin/python3.6 2
            Để xem các phiên bản Python có sẵn, bạn có thể sử dụng lệnh sau:sudo update-alternatives –config python3
            Xem thêm https://www.soladrive.com/support/knowledgebase/5149/-How-to-install-Odoo-17-on-AlmaLinux-8-or-CentOS-8.html
            Bạn phải nhập số lựa chọn tương ứng để đặt phiên bản Python khác làm mặc định, chẳng hạn như Python 3.10. Số lựa chọn có thể thay đổi tùy theo số lượng phiên bản Python được cài đặt trên hệ thống của bạn.
            Để chuyển sang Python 3.10, hãy nhập số 1. Sau khi hoàn thành thành công, bạn sẽ thấy kết quả đầu ra sau:

            update-alternatives: using /usr/bin/python3.10 to provide /usr/bin/python3 (python3) in manual mode
            Bây giờ bạn cần đóng cửa sổ terminal này và bắt đầu một cửa sổ khác để những thay đổi có hiệu lực. Đăng nhập lại vào VPS thông qua SSH và chuyển sang bước 3 bên dưới.

            Câu lệnh: sudo apt install python3.10 python3.10-venv python3.10-dev không có hiệu lực trong debian.

            Theo dõi điện năng và nhiệt độ máy Raspberry Pĩ

            Theo dõi điện năng và nhiệt độ máy Raspberry Pĩ
            Nội dung

              Khi chúng tôi đang sử dụng bảng Raspberry Pi, đôi khi bạn có thể thấy điện áp thấp qua lời nhắc bên phải của màn hình hệ thống, hoặc tự nhiện khởi động máy lại. Như thế hệ thống hoạt động không ổn định, mất dữ liệu và thậm chí làm hỏng thẻ SD.
              Ngay cả khi bộ đổi nguồn chất lượng cao được sử dụng để đáp ứng điện áp và dòng điện làm việc của Raspberry Pi, việc cắm và rút phích cắm lặp đi lặp lại sau khi sử dụng lâu dài sẽ dẫn đến tiếp xúc kém và điện trở cao, điều này sẽ làm cho điện áp đầu vào của Raspberry Pi không đủ.
              Có thể ta nhập lệnh sau: get_throttled VCGenCMD
              Chúng ta sẽ nhận được một số thập lục phân phản ánh thông tin trạng thái liên quan đến tần số hệ thống hiện tại, điện áp đầu vào, v.v. Sau khi số này được chuyển đổi thành nhị phân, 8 bit trong đó đại diện cho trạng thái của 8 lá cờ.
              Để biết chi tiết, vui lòng tham khảo liên kết này trên trang web Raspberry Pi: https://www.raspberrypi.com/documentation/computers/os.html

              Trả về trạng thái điều tiết của hệ thống. Đây là một mẫu bit – một bit được đặt chỉ ra các ý nghĩa sau:

              BitHex valueMeaning

              0

              0x1

              Phát hiện dưới điện áp

              1

              0x2

              Giới hạn tần số cánh tay

              2

              0x4

              Hiện đang bị điều tiết

              3

              0x8

              Giới hạn nhiệt độ mềm hoạt động

              16

              0x10000

              Đã xảy ra tình trạng dưới điện áp

              17

              0x20000

              Giới hạn tần số cánh tay đã xảy ra

              18

              0x40000

              Điều tiết đã xảy ra

              19

              0x80000

              Giới hạn nhiệt độ mềm đã xảy ra

              Hãy tập trung vào hai trong số chúng:
              Nếu bit thứ 0 của số này là 1, nó chỉ ra rằng điện áp đầu vào hiện tại là không đủ;
              Nếu bit thứ 16 của số này là 1, nó chỉ ra rằng đã có điện áp đầu vào không đủ sau khi khởi động;
              Trên thực tế, miễn là chúng tôi phát hiện hai lá cờ này trong thời gian thực, chúng tôi có thể theo dõi điện áp đầu vào của Raspberry Pi.

              Hiển thị điện áp hiện tại được sử dụng bởi khối cụ thể: vcgencmd measure_volts core

              khốiSự miêu tả

              core

              Điện áp lõi VC4

              sdram_c

              Điện áp lõi SDRAM

              sdram_i

              Điện áp I / O SDRAM

              sdram_p

              Điện áp SDRAM Phy

              Sử dụng câu lệnh python, đầu tiên cài thư viện

              sudo pip3 install vcgencmd -i https://mirrors.aliyun.com/pypi/simple/

               

              Tạo file pw.py

              #!/usr/bin/env python3

              # -*- coding: utf-8 -*-

              # cython: language_level=3

              #Flag Bits

              UNDERVOLTED         = ‘0’

              CAPPED              = ‘1’

              THROTTLED           = ‘2’

              SOFT_TEMPLIMIT      = ‘3’

              HAS_UNDERVOLTED     = ’16’

              HAS_CAPPED          = ’17’

              HAS_THROTTLED       = ’18’

              HAS_SOFT_TEMPLIMIT  = ’19’

               

              from vcgencmd import Vcgencmd

              from colorama import init

              from colorama import Fore, Back, Style

              import time

              init(autoreset=True)

              vcgm = Vcgencmd()

              def print_log(flag, info):

              if flag:

              print(Fore.RED + Style.BRIGHT + info, end = ‘  ‘)

              else:

              print(Fore.GREEN + Style.DIM + info, end = ‘  ‘)

               

              while True:

              print(‘[{}] ‘.format(time.strftime(‘%M:%S’)), end = ”)

              output = vcgm.get_throttled()

              flag = output[‘breakdown’][UNDERVOLTED]

              print_log(flag, ‘UNDERVOLTED’)

              flag = output[‘breakdown’][CAPPED]

              print_log(flag, ‘CAPPED’)

              flag = output[‘breakdown’][THROTTLED]

              print_log(flag, ‘THROTTLED’)

              flag = output[‘breakdown’][SOFT_TEMPLIMIT]

              print_log(flag, ‘SOFT_TEMPLIMIT’)

              flag = output[‘breakdown’][HAS_UNDERVOLTED]

              print_log(flag, ‘HAS_UNDERVOLTED’)

              flag = output[‘breakdown’][HAS_CAPPED]

              print_log(flag, ‘HAS_CAPPED’)

              flag = output[‘breakdown’][HAS_THROTTLED]

              print_log(flag, ‘HAS_THROTTLED’)

              flag = output[‘breakdown’][HAS_SOFT_TEMPLIMIT]

              print_log(flag, ‘HAS_SOFT_TEMPLIMIT’)

              print()

              time.sleep(1)

              #EOF

              Nếu bạn đang sử dụng nguồn điện bình thường trên Raspberry Pi 4B và bạn sẽ nhận được kết quả sau.

              Nếu hệ thống hiển thị thông báo màu đỏ, nó chỉ ra rằng bit cờ có liên quan là 1.
              Chúng ta có thể thấy rằng UNDERVOLTED màu đỏ chỉ ra rằng điện áp đầu vào quá thấp,Điều chỉnh màu đỏ cho biết tần số hoạt động của hệ thống đã bị ép xuống,HAS_UNDERVOLTED màu đỏ cho biết rằng tình trạng điện áp thấp đã được phát hiện,Một HAS_THROTTLED màu đỏ cho biết rằng nó đã được ép xung.

              Theo dõi nhiệt độ.

              Trả về nhiệt độ của SoC được đo bằng cảm biến nhiệt độ bên trong của nó; trên Raspberry Pi 4, trả về nhiệt độ của PMIC.
              vcgencmd measure_temp
              vcgencmd measure_temp pmic
              Nhiệt độ của Raspberry Pi đạt tới nhưng không vượt quá mức 80°C, mức nhiệt mà CPU sẽ bị giảm tốc trong quá trình
              vcgencmd measure_clock arm

              Chuyển noip qua dùng cloudflare truy cập về máy ở nhà

              Chuyển noip qua dùng cloudflare dùng truy cập về máy nhà
              Nội dung

                Mạng ở nhà đa số sử dụng IP động, do đó tên miền cần phải được tự động cập nhật mỗi khi Public IP thay đổi để tránh kết nối bị lỗi. Chỉ cần dùng 1 bash script chạy trên linux để tự động cập nhật IP động cho tên miền qua dịch vụ CloudFlare. Nhờ vậy tên miền luôn được trỏ đến IP mới nhất được cấp cho modem mạng ở nhà. Như thế chỉ cần mua tên miền, tài khoản cloudflare miển phí không cần phải gia hạn hằng tháng noip (không thì tốn 24$).

                Trước khi tạo script cần phải có 1 số thông tin

                • auth_token: Cloudflare API Token
                • zone_identifier: Zone ID
                • record_name: Tên miền

                Tạo Cloudflare API Token

                Truy cập vào trang Cloudflare API Token để tạo Token mới

                Bấm vào Create Token
                Chọn Use Template ở mục Edit Zone DNS
                Kéo xuống mục Zone Resources, chọn tên miền bạn muốn sử dụng để cập nhật IP sau đó bấm Continue to Summary
                Bấm Create Token
                Token đã tạo xong

                Bạn cần lưu lại Token vừa mới tạo để lưu vào script đã tạo. Token này sẽ không hiện ra lại trên Cloudflare vì lý do bảo mật. Nếu bạn quên lưu, cần phải xoá Token và tạo lại cái mới.

                Tìm thông tin Zone ID

                Từ trang chủ Cloudflare, bạn bấm vào tên miền muốn sử dụng để cập nhật IP. Sau đó kéo xuống dưới sẽ thấy mục Zone ID. Lưu lại thông số này để điền vào script

                Lưu lại thông tin Zone ID

                Tạo A Record cho tên miền

                Ví dụ mình muốn sử dụng tên miền alibaba.thuanbui.me để truy cập đến homelab ở nhà. Bấm vào Add record và tạo một A record mới.

                • Name: điền vào alibaba
                • IPv4: điền tạm 1.1.1.1, thông số này sẽ được tự động cập nhật về IP của modem sau khi chạy script.
                Tạo A Record cho subdomain alibaba.thuanbui.me

                Tạo script

                cd ~

                mkdir cloudflare

                cd cloudflare

                nano cloudflare.sh

                Nội dung https://thuanbui.me/cap-nhat-ip-dong-cho-ten-mien-qua-cloudflare-de-truy-cap-homelab-tai-nha/:

                #!/bin/bash

                # Forked from benkulbertis/cloudflare-update-record.sh

                # CHANGE THESE

                # API Token (Recommended) #####

                auth_token=“LrAB–xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx”

                # Domain and DNS record for synchronization zone_identifier=“48bxxxxxxxxxxxxxxxxxxxx60”

                # Can be found in the “Overview” tab of your domain record_name=“alibaba.thuanbui.me” # Which record you want to be synced

                # DO NOT CHANGE LINES BELOW # SCRIPT START

                echo -e “Check Initiated”

                # Check for current external network IP

                ip=$(curl -s4 https://icanhazip.com/)

                if [[ ! -z ${ip} ]]; then echo -e ” > Fetched current external network IP: ${ip}

                else >&2 echo -e “Network error, cannot fetch external network IP.”

                fi

                # The execution of update

                if [[ ! -z ${auth_token} ]]; then header_auth_paramheader=( -H ‘”Authorization: Bearer ‘${auth_token}‘”‘ ) else header_auth_paramheader=( -H ‘”X-Auth-Email: ‘${auth_email}‘”‘ -H ‘”X-Auth-Key: ‘${auth_key}‘”‘ ) fi

                # Seek for the record

                seek_current_dns_value_cmd=( curl -s -X GET ‘”https://api.cloudflare.com/client/v4/zones/’${zone_identifier}‘/dns_records?name=’${record_name}‘&type=A”‘ ${header_auth_paramheader[@]} -H ‘”Content-Type: application/json”‘ ) record=`eval ${seek_current_dns_value_cmd[@]}`

                # Can’t do anything without the record

                if [[ -z ${record} ]]; then >&2 echo -e “Network error, cannot fetch DNS record.” exit 1 elif [[ ${record} == *‘”count”:0’* ]]; then >&2 echo -e “Record does not exist, perhaps create one first?” exit 1 fi # Set the record identifier from result record_identifier=`echo “${record}” | sed ‘s/.*”id”:”//;s/”.*//’`

                # Set existing IP address from the fetched record

                old_ip=`echo “${record}” | sed ‘s/.*”content”:”//;s/”.*//’` echo -e ” > Fetched current DNS record value : ${old_ip}

                # Compare if they’re the same

                if [ ${ip} == ${old_ip} ]; then echo -e “Update for A record ‘${record_name} (${record_identifier})’ cancelled.\\n Reason: IP has not changed.” exit 0 else echo -e ” > Different IP addresses detected, synchronizing…” fi # The secret sause for executing the update json_data_v4=“‘”{“id”:“‘${zone_identifier}‘”,“type”:“A”,“proxied”:true,“name”:“‘${record_name}‘”,“content”:“‘${ip}‘”,“ttl”:120}‘”‘update_cmd=( curl -s -X PUT ‘”https://api.cloudflare.com/client/v4/zones/’${zone_identifier}‘/dns_records/’${record_identifier}‘”‘ ${header_auth_paramheader[@]} -H ‘”Content-Type: application/json”‘ )

                # Execution result

                update=`eval ${update_cmd[@]} –data $json_data_v4`

                # The moment of truth

                case $update in *‘”success”:true’*) echo -e “Update for A record ‘${record_name} (${record_identifier})’ succeeded.\\n – Old value: ${old_ip}\\n + New value: ${ip};; *) >&2 echo -e “Update for A record ‘${record_name} (${record_identifier})’ failed.\\nDUMPING RESULTS:\\n${update} exit 1;;

                esac

                Mặc định, script này sẽ kích hoạt chế độ proxy trên Cloudflare nhằm mục đích ẩn IP của modem, giảm nguy cơ bị tấn công vào mạng nhà. Nếu vì lý do nào đó không muốn ẩn IP của mình thì có thể thay đổi thông số "proxied":true thành "proxied":false

                Thiết lập quyền thực thi cho file cloudflare.sh

                chmod +X cloudflare.sh
                Chạy thử xem nào: ./cloudflare.sh

                Quay lại Cloudflare, tên miền alibaba.thuanbui.me, mình thấy đã được tự động cập nhật với IP mới. Ngon lành!

                Thiết lập chạy tự động

                Việc thiết lập cron để script tự động hay rc.local có vẽ không được khi máy chưa có vô mạng, nên một dịch vụ  riêng để chạy với systemd. Với một dịch vụ systemd làm cho service hợp lệ và hoạt động sau khi có mạng.
                Bây giờ bạn đã tạo file service: sudo nano /etc/systemd/system/cloudflare.service

                [Unit]
                Description=Update ip to dns cloudflare service.
                After=network-online.target
                
                [Service]
                Type=oneshot
                User=root
                ExecStart= /bin/bash /home/user/cloudflare/cloudflare.sh
                RemainAfterExit=yes
                [Install]
                WantedBy=network-online.target
                

                Kích hoạt cho dịch vụ khởi động cùng hệ thống:

                sudo systemctl enable cloudflare.service
                sudo systemctl start cloudflare.service
                sudo systemctl stop cloudflare.service
                

                Lưu ý: After=network.target không chạy được do máy khởi động lên là systemd đã chạy nên gây ra lỗi phần này, nên thay bằng:

                [Unit]
                Wants=network.target network-online.target
                After=network.target network-online.target

                Mục tiêu network-online là nó không tồn tại trừ khi bạn đang sử dụng một phương pháp “modern” để nâng cấp mạng của mình, như NetworkManager hoặc systemd-networkd .

                Nếu bạn không làm điều đó thì systemd sẽ tính ra rằng network-onlinekhông bao giờ có thể đạt được mục tiêu và bỏ qua nó dưới dạng tệp Want.

                Tôi đang sử dụng ifupdown trên máy chủ vì nó vẫn thực hiện mọi thứ tôi cần. Để ifupdown hỗ trợ network-onlinemục tiêu trên Debian, bạn nên kích hoạt dịch vụ ifupdown-wait-online:
                sudo systemctl kích hoạt ifupdown-wait-online.service
                Điều này sẽ đưa vào network-onlinetrạng thái “đạt được mục tiêu” khi mọi giao diện được đánh dấu là “tự động” trong /etc/network/interfaces đều hoạt động.
                Vi du nhu:

                [Unit]
                Description=ChatGPT assistant
                Wants=network-online.target
                After=network-online.target
                After=multi-user.target
                
                [Service]
                Type=simple
                User=pi
                WorkingDirectory=/home/pi
                ExecStartPre=/bin/sh -c 'until ping -c1 google.com; do sleep 1; done;'
                ExecStart=/usr/bin/python3 /home/pi/chat.py
                
                [Install]
                WantedBy=multi-user.target
                
                

                Sau do cho systemd biet service moi:
                sudo systemctl daemon-reload
                Kiem tra xem chay : systemctl start chat.service

                Thiết lập SSL miễn phí.

                Đầu tiên bạn cần đảm bảo rằng website đã thêm vào CloudFlare và bật Proxy (đám mây màu vàng) thành công.

                Tiếp đó, bạn truy cập vào SSL/TLS => Overview => chọn Flexible là hoàn tất và bạn không cần làm gì thêm.

                chứng chỉ do chính CloudFlare cung cấp.

                Bước 1: Chọn kiểu SSL

                Bạn truy cập vào SSL/TLS => Overview => chọn Full hoặc Full (strict) .

                Full SSL

                Bước 2: Tạo chứng chỉ SSL

                Bạn truy cập vào SSL/TLS => Origin Server => Create Certificate

                Create Certificate

                Chọn Generate private key and CSR with Cloudflare , rồi nhấn Create.

                Create Certificate
                Create Certificate

                Lúc này CloudFlare sẽ cung cấp cho bạn 2 nội dung Origin Certificate và Private Key. Bạn tiến hành copy và lưu lại nội dung 2 File này (quan trọng), sau khi đã lưu xong bạn chọn OK.

                Origin Certificate và Private Key

                Copy nội dung vào 2 file cert.pem và privatekey.key

                1. sudo nano /home/user/ssl/cert.pem
                2. sudo nano /home/user/ssl/privatekey.key
                3. sudo chmod -R 755 /home/user/ssl

                Tiếp đó bạn cần chờ vài phút để CloudFlare duyệt chứng chỉ. Nếu hiển thị như hình bên dưới là chứng chỉ đã được cấp phát và có thể sử dụng.

                Certificate

                 

                Bước 3: Cài đặt chứng chỉ lên máy chủ.

                Thiết lập nội dung vô tên miền
                sudo nano /etc/nginx/sites-available/your_domain

                Nội dung https://www.digitalocean.com/community/tutorials/how-to-host-a-website-using-cloudflare-and-nginx-on-ubuntu-22-04:

                server {
                listen 80;
                listen [::]:80;
                server_name your_domain;
                return 302 https://$server_name$request_uri;
                }

                server {

                # SSL configuration

                listen 443 ssl http2;
                listen [::]:443 ssl http2;
                ssl_certificate /home/user/ssl/cert.pem;
                ssl_certificate_key /home/user/ssl/privatekey.key;

                server_name your_domain;

                root /var/www/your_domain/html;
                index index.html index.htm index.nginx-debian.html;

                location / {
                try_files $uri $uri/ =404;
                }
                }

                sudo nginx -t

                Không có báo lỗi thì bắt đầu cho chạy:

                sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/
                sudo systemctl restart nginx

                Lưu ý proxied":true bật Proxy (đám mây màu vàng)

                SSL cho noip hơi tốn tiền

                RapidSSL Basic DV tốn $20, không thì mua No-IP Vital Encrypt DV giảm còn $8.

                Tạo CSR thông tin tên miền.

                Sử dụng  Trình hướng dẫn DigiCert OpenSSL CSR  để tạo lệnh OpenSSL nhằm tạo Nginx CSR của bạn. Chỉ cần điền vào biểu mẫu, nhấp vào Tạo rồi dán lệnh OpenSSL tùy chỉnh vào thiết bị đầu cuối của bạn.

                Hoặc dùng công cụ Csrgenerator.Com để bắt đầu tạo.

                 

                LƯU Ý: Sau khi tạo CSR sẽ có PRIVATE KEY đây là khóa đi kèm nên bạn phải lưu giữ không được làm mất. Vì khi mất KEY bạn sẽ không import được chứng chỉ CRT (Certificate) vào server/hosting được mà phải làm lại từ đầu. Sau khi có thông tin CSR, bạn có thể bắt đầu các thao tác chứng thực chứng chỉ SSL. File này có thể dùng cho lần tạo chứng thực sau này hết hạn.

                1 File key chỉ chứa: —–BEGIN PRIVATE KEY—– cho đến —–END PRIVATE KEY—–. Nạp vào ssl_certificate_key.

                Còn 1 file pem lấy từ No-IP Vital Encrypt DV thì Download Certificate chọn Chuỗi PEM (Khuyến nghị) Bao gồm tất cả các chứng chỉ cần thiết trong một tệp. Định dạng này bao gồm các chứng chỉ CA trung gian và được các máy chủ web phổ biến hỗ trợ để tích hợp dễ dàng nhất. Nó chứa toàn bộ 3 —–BEGIN CERTIFICATE—– —–END CERTIFICATE—–. File này nạp vào ssl_certificate

                Cách 2 dùng câu lệnh openssl req –new –newkey rsa:2048 –nodes –keyout domain.key –out domain.csr

                1. Tiến trình bắt đầu quá trình tạo hai tệp sau:
                  • Tệp khóa riêng : Được sử dụng để tạo CSR trở lên để bảo mật và xác minh các kết nối bằng chứng chỉ.
                  • Tệp Yêu cầu ký chứng chỉ (CSR) : Được sử dụng để đặt hàng chứng chỉ SSL của bạn và sau đó để mã hóa các tin nhắn mà chỉ khóa riêng tương ứng của nó mới có thể giải mã.
                2. Khi được nhắc về  Common Name  (tên miền), hãy nhập tên miền đủ điều kiện (FQDN) cho trang web mà bạn sắp bảo mật.

                  Lưu ý: Nếu bạn đang tạo Nginx CSR cho chứng chỉ Wildcard , hãy đảm bảo tên chung của bạn bắt đầu bằng dấu hoa thị (ví dụ: *.example.com ).

                3. Khi được nhắc, hãy nhập thông tin tổ chức của bạn, bắt đầu bằng thông tin địa lý của bạn.

                  Lưu ý: Có thể bạn đã thiết lập thông tin mặc định.

                4. Bây giờ, tệp .csr của bạn sẽ được tạo.

                Nạp CSR vào download CRT.

                1. Bạn cần ghép tệp chứng chỉ chính (your_domain_name.crt) và tệp chứng chỉ trung gian (DigiCertCA.crt) thành một tệp .pem.
                2. Để nối các tập tin, hãy chạy lệnh sau:
                  cat your_domain_name.crt DigiCertCA.crt >> bundle.crt
                3. add the lines in bold below:

                server {

                listen   443;

                ssl    on;
                ssl_certificate    /etc/ssl/bundle.crt
                ssl_certificate_key    /etc/ssl/your_domain_name.key;

                server_name your.domain.com;
                access_log /var/log/nginx/nginx.vhost.access.log;
                error_log /var/log/nginx/nginx.vhost.error.log;
                location / {
                root   /home/www/public_html/your.domain.com/public/;
                index  index.html;
                }
                }

                Chạy lệnh sau để khởi động lại Nginx: sudo /etc/init.d/nginx restart

                Mở trình duyệt web và truy cập trang web của bạn bằng https. Trình duyệt sẽ đưa ra cảnh báo nếu chứng chỉ trung gian của bạn chưa được cài đặt. Bạn sẽ không nhận được bất kỳ cảnh báo hoặc lỗi nào của trình duyệt.

                  1. Nếu bạn ngay lập tức nhận được thông báo trình duyệt về việc trang web không khả dụng thì Nginx có thể chưa được nghe trên cổng 443.
                  2. Nếu yêu cầu web của bạn mất nhiều thời gian và hết thời gian, tường lửa có thể đang chặn lưu lượng truy cập trên cổng TCP 443 tới máy chủ web.
                  3. Nếu bạn nhận được cảnh báo “không đáng tin cậy”, hãy xem chứng chỉ để xem đó có phải là chứng chỉ bạn mong đợi hay không.
                    • Khi bạn xem chứng chỉ, hãy kiểm tra các trường Chủ đề , Nhà phát hành và Hợp lệ cho
                    • Nếu bạn phải nối các tệp chứng chỉ thì chứng chỉ chính của bạn (ví dụ: your_domain_name.crt ) có thể không được kết hợp chính xác với chứng chỉ trung gian.

                Để biết thêm thông tin, hãy xem tài liệu Nginx SSL .

                CMS cho máy pi4

                CMS cho máy pi4
                Nội dung

                  Việc chọn một hệ thống quản lý nội dung (CMS – Content Management System) tốt phụ thuộc vào nhu cầu cụ thể của bạn, mức độ kỹ thuật, và mục tiêu sử dụng. Dưới đây là một số CMS phổ biến và được coi là tốt trong các tình huống khác nhau:

                  1. WordPress: WordPress là một trong những CMS phổ biến nhất trên thế giới. Nó dễ sử dụng, có nhiều plugin và chủ đề cho phép bạn tùy chỉnh trang web dễ dàng. WordPress thường được sử dụng cho các trang web cá nhân, doanh nghiệp nhỏ, và các blog.
                  2. Joomla: Joomla là một hệ thống quản lý nội dung mã nguồn mở mạnh mẽ, phù hợp cho các trang web phức tạp hơn. Nó có một cộng đồng lớn và nhiều phần mở rộng có sẵn.
                  3. Drupal: Drupal là một CMS mạnh mẽ hướng tới các dự án lớn và phức tạp. Nó có tích hợp sẵn nhiều tính năng bảo mật và quản lý nội dung mạnh mẽ.
                  4. Magento: Magento là một CMS chuyên về thương mại điện tử, phù hợp cho các cửa hàng trực tuyến và doanh nghiệp có yêu cầu cao về giao dịch trực tuyến.
                  5. Shopify: Shopify là một dịch vụ quản lý nội dung và thương mại điện tử hoàn chỉnh. Nó thích hợp cho người kinh doanh muốn dễ dàng tạo và quản lý cửa hàng trực tuyến.
                  6. Wix: Wix là một dịch vụ CMS và xây dựng trang web trực quan, thích hợp cho người không có kỹ năng lập trình.
                  7. Squarespace: Squarespace là một dịch vụ trực quan và dễ sử dụng, tập trung vào việc thiết kế trang web đẹp.
                  8. Ghost: Ghost là một CMS tập trung vào việc viết blog và nội dung, thích hợp cho các trang web có nội dung trực quan.

                  Khi chọn CMS, hãy xem xét các yêu cầu cụ thể của dự án của bạn, cần tích hợp những tính năng gì, có nguồn tài chính bao nhiêu, và mức độ kỹ thuật của bạn. Điều quan trọng là chọn một CMS phù hợp với mục tiêu và nhu cầu của bạn, và một có cộng đồng hỗ trợ đáng tin cậy để giúp bạn trong quá trình triển khai và quản lý.

                  Lý do chọn WordPress đề làm CMS

                  Raspberry Pi 4 là gì? sơ đồ chân, tính năng và ngoại vi của | Mecsu.vn
                  Có nhiều lý do mà WordPress thường được chọn làm hệ thống quản lý nội dung (CMS) cho các trang web. Dưới đây là một số lý do quan trọng:

                  1. Dễ sử dụng: WordPress có một giao diện người dùng trực quan, dễ sử dụng, giúp cả người mới học lập trình và người không có kiến thức kỹ thuật có thể tạo và quản lý trang web một cách dễ dàng.
                  2. Cộng đồng lớn: WordPress có một cộng đồng sôi nổi và lớn mạnh. Điều này có nghĩa là có nhiều tài liệu hướng dẫn, plugins và chủ đề sẵn có, cũng như sự hỗ trợ từ cộng đồng khi bạn gặp vấn đề.
                  3. Phong cách tùy chỉnh: WordPress cho phép bạn tùy chỉnh giao diện trang web của bạn thông qua sử dụng các chủ đề và plugins. Có nhiều chủ đề và plugins miễn phí và trả phí giúp bạn tạo ra trang web theo ý muốn.
                  4. Thích hợp cho nhiều loại trang web: WordPress không chỉ dành cho việc tạo blog. Nó có khả năng phát triển cho các loại trang web khác nhau, bao gồm cửa hàng trực tuyến, trang web doanh nghiệp, trang web cá nhân, và thậm chí các trang web phức tạp hơn.
                  5. SEO thân thiện: WordPress có nhiều plugin mạnh mẽ giúp bạn tối ưu hóa SEO cho trang web của bạn. Điều này giúp trang web của bạn dễ dàng được tìm thấy trên các công cụ tìm kiếm như Google.
                  6. Bảo mật và cập nhật: WordPress liên tục cập nhật phiên bản để bảo vệ trang web khỏi các lỗ hổng bảo mật. Nó cũng có nhiều plugin bảo mật để giúp tăng cường độ an toàn cho trang web.

                  Tuy nhiên, cũng cần lưu ý rằng WordPress có thể không phải lựa chọn tốt nhất cho mọi trang web. Nếu bạn có nhu cầu đặc biệt hoặc mục tiêu kỹ thuật phức tạp, có thể có các hệ thống CMS khác phù hợp hơn. Lựa chọn CMS cũng phụ thuộc vào mục tiêu cụ thể của bạn và mức độ kỹ thuật của bạn hoặc của đội ngũ phát triển của bạn.

                  Thực hện cài lên trực tiếp máy Raspberry Pi 4

                  sudo mysql -u root
                  CREATE USER ‘wp_user’@’localhost’ identified by ‘StrongPassword’;
                  CREATE DATABASE wp_db;
                  GRANT ALL PRIVILEGES ON wp_db.* TO ‘wp_user’@’localhost’;
                  FLUSH PRIVILEGES;

                  Đăng nhập vô mysql: mysql -u wp_user -p
                  Nhập pass: StrongPassword
                  MariaDB [(none)]> SHOW DATABASES;
                  MariaDB [(none)]> QUIT

                  Cài ứng dụng: sudo apt install nginx
                  sudo apt install php -y
                  sudo apt install php-mysl -y
                  Xem service php: sudo systemctl status php* | grep fpm.service

                  Truy cập vào thư mục muốn chứa website. Sau đó kéo file về wget wordpress.org/latest.tar.gz
                  Bun nén tar xvf latest.tar.gz
                  Hoặc lúc này có thể di chuyển thư mục nén đến sudo mv wordpress /srv/myblog
                  Thay đổi quyền truy cập /srv/myblog to web user: sudo chown -R www-data:www-data /srv/myblog
                  Cập nhật sudo nano /etc/nginx/conf.d/myblog.conf
                  Nội dung:
                  server {
                  listen 80;
                  root /srv/myblog;
                  server_name example.com;
                  access_log /var/log/nginx/wp_client_access.log;
                  error_log /var/log/nginx/wp_client_error.log;

                  location / {
                  index index.php index.html;
                  try_files $uri $uri/ /index.php?$args;
                  }

                  # Specify a charset
                  charset utf-8;
                  # GZIP
                  gzip off;

                  # Add trailing slash to */wp-admin requests.
                  rewrite /wp-admin$ $scheme://$host$uri/ permanent;

                  # Prevents hidden files (beginning with a period) from being served
                  location ~ /\. {
                  access_log off;
                  log_not_found off;
                  deny all;
                  }

                  ###########
                  # SEND EXPIRES HEADERS AND TURN OFF 404 LOGGING
                  ###########

                  location ~* ^.+.(xml|ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
                  access_log off;
                  log_not_found off;
                  expires max;
                  }

                  # Pass all .php files onto a php-fpm or php-cgi server
                  location ~ \.php$ {
                  try_files $uri =404;
                  include /etc/nginx/fastcgi_params;
                  fastcgi_read_timeout 3600s;
                  fastcgi_buffer_size 128k;
                  fastcgi_buffers 4 128k;
                  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                  fastcgi_pass unix:/run/php/php7.2-fpm.sock;
                  #fastcgi_pass unix:/run/php/php7.0-fpm.sock;
                  fastcgi_index index.php;
                  }

                  # ROBOTS

                  location = /robots.txt {
                  allow all;
                  log_not_found off;
                  access_log off;
                  }

                  # RESTRICTIONS
                  location ~* /(?:uploads|files)/.*\.php$ {
                  deny all;
                  }
                  }

                  Xác minh cú pháp cấu hình:sudo nginx -t
                  Khởi động lại máy chủ Web Nginx: sudo systemctl restart nginx
                  Truy cập trang trình hướng dẫn cài đặt WordPress để hoàn tất cài đặt.

                  Tạo ứng dụng app frappe chạy trên ERPNEXT

                  Tạo ứng Dụng App Frappe Chạy Trên Erpnext
                  Nội dung

                    Bạn sẽ tìm hiểu cách tạo một ứng dụng web từ đầu bằng Frappe Framework. Frappe Framework là một framework dựa trên web đầy đủ và nó bao gồm tất cả các công cụ cần thiết để triển khai một trang web vào sản xuất. được hỗ trợ bởi Python, JavaScript và Redis, cùng với một số công nghệ và hỗ trợ cơ sở dữ liệu MariaDB và PostgreSQL. Jinja được sử dụng làm công cụ tạo khuôn mẫu cho các định dạng Chế độ xem web và In. Redis được sử dụng để lưu vào bộ nhớ đệm, duy trì hàng đợi công việc và cập nhật theo thời gian thực. Tuy nhiên, bạn có thể không cần phải thành thạo tất cả các công cụ này để bắt đầu với nó.

                    Ví dụ: xây dựng một Hệ thống quản lý thư viện

                    Chúng tôi sẽ xây dựng một Hệ thống quản lý thư viện đơn giản trong đó Thủ thư Librarian có thể đăng nhập và quản lý Bài viết Articles  và Tư cách thành viên Memberships. Chúng ta sẽ xây dựng các mô hình sau:
                    Bài viết Article : Một cuốn sách hoặc món đồ tương tự có thể được thuê.
                    Thành viên Thư viện Library Member: Người dùng đã đăng ký làm thành viên.
                    Giao dịch Thư viện Library Transaction: Phát hành hoặc Trả lại một bài báo.
                    Tư cách thành viên Thư viện Library Membership: Tài liệu thể hiện tư cách thành viên tích cực của Thành viên Thư viện.
                    Cài đặt Thư viện Library Settings: Cài đặt xác định các giá trị như Thời gian mượn và số lượng bài viết tối đa có thể được phát hành tại một thời điểm.
                    Thủ thư sẽ đăng nhập vào một giao diện được gọi là Bàn làm việc , một giao diện quản trị phong phú đi kèm với khung. Bàn cung cấp nhiều chế độ xem tiêu chuẩn như Chế độ xem danh sách, Chế độ xem biểu mẫu, Chế độ xem báo cáo List view, Form view, Report view, v.v. và nhiều tính năng như Quyền dựa trên vai trò. Chúng tôi cũng sẽ tạo Chế độ xem web công khai mà Thành viên Thư viện có thể truy cập nơi họ có thể duyệt các Bài viết có sẵn.

                    Tạo một ứng dụng.

                    Trước khi chúng ta bắt đầu, hãy đảm bảo bạn đang ở trong một thư mục frappe-bench. Để xác nhận, hãy chạy bench find
                    Để tạo ứng dụng Quản lý Thư viện của chúng tôi, hãy chạy: bench new-app library_management
                    Khai báo cách thông tin như sau:
                    App Title (default: Library Management):
                    App Description: Library Management System
                    App Publisher: Faris Ansari
                    App Email: faris@example.com
                    App Icon (default ‘octicon octicon-file-directory’): Để chọn icon hãy xem danh sách đầy đủ tất cả các biểu tượng được hỗ trợ trong thư viện octicons, xem https://primer.style/octicons/
                    App Color (default ‘grey’):
                    App License (default ‘MIT’):
                    Mình sẽ nhận được thư mục trong frappe-bench/apps/library_management. Thư mục gồm những file liệt kê trong frappeframework.com/docs/user/en/tutorial/create-an-app.

                    • Library_management: Thư mục này sẽ chứa tất cả mã nguồn cho ứng dụng của bạn
                      • public : Lưu trữ các tệp tĩnh sẽ được cung cấp từ Nginx trong quá trình sản xuất
                      • mẫu : Mẫu Jinja được sử dụng để hiển thị lượt xem web
                      • www : Các trang web được phục vụ dựa trên đường dẫn thư mục của chúng
                      • thư viện_quản lý: Mô-đun mặc định được khởi động bằng ứng dụng
                      • module.txt: Danh sách các mô-đun được xác định trong ứng dụng
                      • Patch.txt : Các mục vá để di chuyển cơ sở dữ liệu
                      • hooks.py : Hook được sử dụng để mở rộng hoặc chặn chức năng tiêu chuẩn do framework cung cấp
                      • pyproject.toml: Chỉ định cách xây dựng ứng dụng của bạn, bạn có thể tùy ý thêm các phần phụ thuộc Python của bên thứ 3 tại đây, phần phụ thuộc này sẽ được cài đặt khi ứng dụng của bạn được cài đặt.

                    Nạp ứng dụng vào website

                    Để cài đặt ứng dụng Quản lý Thư viện trên trang web của chúng tôi, hãy chạy lệnh bench –site site install-app library_management
                    Để xác nhận xem ứng dụng đã được cài đặt chưa, hãy chạy lệnh bench –site library.test list-apps
                    Nếu chưa có website có thể xem frappeframework.com/docs/user/en/tutorial/create-a-site

                    Tạo một loại tài liệu DocTypes

                    DocType tương tự như Model trong các framework khác. Ngoài việc xác định các thuộc tính, nó còn xác định hành vi của Model. Nó không chỉ xác định tên bảng và cột mà còn cả cách hiển thị trong các chế độ xem khác nhau trong Desk. Trước khi có thể tạo DocTypes, chúng tôi cần bật chế độ nhà phát triển Bench của mình. Điều này sẽ cho phép tạo bản soạn sẵn khi chúng tôi tạo loại tài liệu và chúng tôi có thể theo dõi chúng trong quá trình kiểm soát phiên bản bằng ứng dụng của mình.
                    Thoát khỏi bench nếu nó đang chạy. Sau đó từ thư mục frappe-bench, chạy lệnh:
                    bench set-config -g developer_mode true
                    bench start
                    Vào trang web, ở trong Desk, hãy điều hướng đến DocType List bằng Thanh tìm kiếm . Danh sách này sẽ bao gồm DocTypes đi kèm với khung, những tài liệu là một phần của ứng dụng Frappe đã cài đặt và các ứng dụng tùy chỉnh mà bạn có thể tạo cụ thể cho từng trang web.

                    Loại tài liệu đầu tiên chúng ta sẽ tạo là Article . Để tạo nó, hãy nhấp vào Mới.

                    Nhập tên làm bài viết
                    Chọn Quản lý thư viện trong module
                    Thêm các trường sau vào bảng Trường:
                    Tên bài viết (Dữ liệu, bắt buộc) Article Name (Data, Mandatory)
                    Hình ảnh (Đính kèm hình ảnh) Image (Attach Image)
                    Tác giả (Dữ liệu) Author (Data)
                    Mô tả (Trình chỉnh sửa văn bản) Description (Text Editor)
                    ISBN (Dữ liệu) ISBN (Data)
                    Trạng thái (Chọn) Status (Select) – Nhập hai tùy chọn: Đã phát hành và Có sẵn Issued/Available (Nhập Issued, nhấn enter, sau đó nhập Available)
                    Nhà xuất bản (Dữ liệu) Publisher (Data)

                    Sau khi thêm các trường, nhấp vào Lưu.
                    Bạn sẽ thấy nút Chuyển đến Danh sách Bài viết ở phía trên bên phải của biểu mẫu. Bấm vào nó để đi đến Danh sách bài viết. Tại đây bạn sẽ thấy một danh sách trống không có bản ghi nào vì bảng không có bản ghi.
                    Hãy tạo một số bản ghi. Nhưng trước đó, chúng ta cần xóa bộ đệm của Desk. Nhấp vào menu thả xuống Cài đặt ở bên phải thanh điều hướng và nhấp vào Tải lại .
                    Bây giờ, bạn sẽ thấy nút Mới . Nhấp vào nó và bạn sẽ thấy chế độ xem Biểu mẫu của loại tài liệu Bài viết. Điền vào biểu mẫu và nhấp vào Lưu. Bạn đã tạo tài liệu Bài viết đầu tiên của mình. Quay lại chế độ xem danh sách và bạn sẽ thấy một bản ghi.
                    Điều gì đã xảy ra khi bạn tạo Article DocType? Thứ nhất bảng cơ sở dữ liệu: Một bảng cơ sở dữ liệu có tên tabArticle đã được tạo với các trường mà chúng tôi đã chỉ định trong bảng trường. Bạn có thể xác nhận điều này bằng cách kiểm tra nó từ bảng điều khiển MariaDB: bench –site site mariadb
                    Thứ 2. Chế độ xem bàn: Có một số chế độ xem cũng được tạo cho DocType của chúng tôi. Danh sách bài viết là dạng xem danh sách hiển thị các bản ghi từ bảng cơ sở dữ liệu. Chế độ xem Biểu mẫu là chế độ xem được hiển thị khi bạn muốn tạo một tài liệu mới hoặc xem một tài liệu hiện có.
                    Thứ 3. Bố cục biểu mẫu: Nếu bạn để ý, bố cục của các trường trong biểu mẫu sẽ theo cách bạn sắp xếp chúng trong bảng Trường. Ví dụ: Tên bài viết là trường đầu tiên theo sau là Hình ảnh, sau đó là Tác giả. Trong các phần sau của hướng dẫn, chúng ta sẽ tìm hiểu cách tùy chỉnh thêm điều này.
                    Thứ 4. Mã soạn sẵn. bạn sẽ thấy một số tệp đã được tạo. cd apps/library_management
                    git status -u
                    Những file đã thay đổi như :Article.json – Tệp JSON xác định thuộc tính loại tài liệu, Article.js – Bộ điều khiển phía máy khách cho chế độ xem Biểu mẫu, Article.py – Bộ điều khiển Python cho bài viết, test_article.py – Bản tóm tắt bài kiểm tra đơn vị Python để viết bài kiểm tra.
                    Đảm bảo bạn bỏ chọn ‘Tùy chỉnh?’ hộp kiểm trong cấu hình loại tài liệu. Nếu không, các tệp được thảo luận bên dưới sẽ không được tạo.

                    Features Tính năng của DocType

                    Ở phần này sẽ có những tính năng khác mà chúng ta có thể tùy chỉnh như:

                    Naming duy nhất

                    Nếu bạn đã tạo một tài liệu bằng Biểu mẫu, bạn có thể nhận thấy rằng giá trị nam của tài liệu là hàm băm được tạo ngẫu nhiên. Hãy thực hiện thay đổi để Tên bài viết mà chúng tôi cung cấp trở thành tên namecủa tài liệu.
                    Để làm điều đó, hãy mở danh sách loại tài liệu từ thanh tìm kiếm và nhấp vào Bài viết. Bây giờ, cuộn xuống phần Đặt tên và trong trường Tên tự động, nhập field:article_name . Bấm vào Lưu. Bây giờ, hãy quay lại Danh sách bài viết và tạo lại bài viết mới. Tên của tài liệu sẽ là Tên bài viết và nó phải là duy nhất trên các Bài viết. Vì vậy bạn không thể tạo thêm bài viết khác có cùng tên.

                    Form Layout

                    Chuyển đến loại tài liệu Bài viết, cuộn đến phần Trường và thêm hai trường mới thuộc loại Ngắt cột và Ngắt phần . Chúng tôi cũng sẽ ẩn trường Hình ảnh vì nó không cần thiết phải hiển thị trong biểu mẫu. Kiểm tra GIF để xem nó hoạt động. Chuyển đến loại tài liệu Bài viết và cuộn xuống phần Cài đặt biểu mẫu . Nhập hình ảnh vào Trường Hình ảnh. Điều này sẽ hiển thị hình ảnh ở phía trên bên trái của biểu mẫu. Bạn cũng có thể bật Allow Rename để cho phép đổi tên tài liệu.

                    Permissions Quyền truy cập

                    Bạn cũng có thể định cấu hình vai trò nào bạn muốn cho phép và hành động nào bạn muốn hạn chế đối với DocType. Đi tới loại tài liệu Bài viết, cuộn xuống phần Quy tắc cấp phép và thêm vai trò.
                    Bạn cũng có thể định cấu hình loại hành động được phép cho một vai trò cụ thể. Hãy thêm vai trò Thủ thư có quyền thực hiện mọi hành động và vai trò Thành viên Thư viện có quyền thực hiện hành động Đọc. Bạn có thể kiểm tra điều này bằng cách tạo một Người dùng mới có vai trò Thủ thư và một Người dùng khác có vai trò Thành viên Thư viện . Đăng nhập với từng người dùng và xem những hành động nào được phép.

                    Controller Methods

                    Viết phương thức điều khiển cho phép bạn viết logic nghiệp vụ trong suốt vòng đời của tài liệu.
                    Hãy tạo doctype thứ hai của chúng ta: Library Member . Nó sẽ có các trường sau:
                    Tên (Dữ liệu, Bắt buộc)First Name (Data, Mandatory)
                    Họ (Dữ liệu)Last Name (Data)
                    Tên đầy đủ (Dữ liệu, Chỉ đọc)Full Name (Data, Read Only)
                    Địa chỉ Email (Dữ liệu)Email Address (Data)
                    Điện thoại (Dữ liệu)Phone (Data)
                    Sau khi bạn đã tạo doctype, hãy chuyển tới danh sách Thành viên Thư viện, xóa bộ nhớ đệm Settings > Reload và tạo Thành viên Thư viện mới.
                    Nếu bạn để ý thì trường Họ và tên không hiển thị trong biểu mẫu. Điều này là do chúng tôi đặt nó ở chế độ Chỉ đọc. Nó sẽ chỉ được hiển thị khi nó có một số giá trị. Ở đây hãy viết mã trong python controller class sao cho Tên đầy đủ được tính toán tự động hiện nội dung từ Tên và Họ.
                    Mở trình soạn thảo mã của bạn và mở tệp library_member.py và thực hiện các thay đổi theo frappeframework.com/docs/user/en/tutorial/controller-methods

                    Types of DocType

                    Hãy tạo một loại tài liệu khác: Tư cách thành viên thư viện Library Membership. Nó sẽ có các trường sau:
                    Thành viên Thư viện (Liên kết, Bắt buộc)Library Member (Link, Mandatory)
                    Tên đầy đủ (Dữ liệu, Chỉ đọc)Full Name (Data, Read Only)
                    Từ Ngày (Ngày)From Date (Date)
                    Đến Ngày (Ngày)To Date (Date)
                    Đã thanh toán (Séc)Paid (Check)
                    Nó sẽ được kích hoạt Is Submittable . Nó sẽ được đặt tên là LMS.##### và bị giới hạn ở vai trò Thủ thư . Ngoài ra, Trường Tiêu đề phải được đặt thành full_nametrong phần Cài đặt Chế độ xem. Trường Liên kết Thành viên Thư viện tương tự như cột Khóa ngoài trong các khung khác. Nó sẽ cho phép bạn liên kết giá trị với một bản ghi trong DocType khác. Trong trường hợp này, nó liên kết tới một bản ghi của Library Member DocType.
                    Trường Tên đầy đủ là trường Chỉ đọc sẽ được tự động tìm nạp từ trường full_nametrong bản ghi được liên kết Library Member .
                    Bây giờ, hãy vào danh sách Thành viên Thư viện và tạo một tài liệu mới. Bạn sẽ thấy trường Thành viên Thư viện là một danh sách thả xuống với các bản ghi hiện có được hiển thị dưới dạng tùy chọn. Chọn Thành viên Thư viện và Tên đầy đủ sẽ được tìm nạp tự động. Khá tuyệt phải không?

                    Loại tài liệu được liên kết

                    Loại tài liệu được liên kết là Loại tài liệu được liên kết trong các loại tài liệu khác dưới dạng trường Liên kết. Tất cả các loại tài liệu đều có thể liên kết được. Chúng tôi có thể phân loại rộng rãi các loại tài liệu thành Chính và Giao dịch dựa trên loại dữ liệu chúng lưu trữ. Article, Library Member là những ví dụ về Master data vì chúng đại diện cho một thực thể (vật lý hoặc ảo). Tư cách thành viên thư viện là một ví dụ về loại tài liệu lưu trữ dữ liệu giao dịch.

                    Loại tài liệu có thể gửi

                    Khi bạn bật Có thể gửi được trong Loại tài liệu sẽ trở thành Loại tài liệu có thể gửi. Loại tài liệu có thể gửi có thể có 3 trạng thái: Bản nháp , Đã gửi và Đã hủy . Tài liệu ở trạng thái Bản nháp có thể được thay đổi giống như bất kỳ tài liệu nào, tuy nhiên khi tài liệu ở trạng thái Đã gửi , giá trị của bất kỳ trường nào trong tài liệu không thể thay đổi. Tài liệu đã gửi có thể bị hủy , điều này làm cho tài liệu không hợp lệ. Nếu bạn để ý, một trường bổ sung đã được thêm vào loại tài liệu Thành viên Thư viện của chúng tôi có tên là Đã sửa đổi Từ. Trường này được sử dụng để theo dõi các sửa đổi trong tài liệu. Sau khi tài liệu bị hủy, nó chỉ có thể được sửa đổi, nghĩa là nó có thể được sao chép và tài liệu bị hủy sẽ được liên kết với tài liệu được sửa đổi mới thông qua trường Đã sửa đổi từ .

                    Xác thực bộ điều khiển cho tư cách thành viên

                    Bây giờ, hãy viết mã để đảm bảo bất cứ khi nào Tư cách thành viên Thư viện được tạo thì Thành viên đó sẽ không có tư cách thành viên đang hoạt động.
                    Nội dung code xem: https://frappeframework.com/docs/user/en/tutorial/types-of-doctype
                    Chúng tôi đã viết logic của mình theo before_submitphương thức sẽ chạy trước khi chúng tôi gửi tài liệu. Chúng tôi đã sử dụng frappe.db.existsphương pháp này để kiểm tra xem bản ghi Thành viên Thư viện có tồn tại với các bộ lọc được cung cấp của chúng tôi hay không. Nếu nó tồn tại, chúng tôi thường frappe.throwdừng việc thực thi chương trình bằng một thông báo sẽ hiển thị cho người dùng biết lý do.
                    Bây giờ, hãy thử tạo Tư cách thành viên Thư viện với khoảng thời gian trùng lặp và bạn sẽ thấy lỗi khi gửi tài liệu.

                    Giao dịch thư viện

                    Hãy tạo một DocType để ghi lại Vấn đề hoặc Trả lại Bài viết của Thành viên Thư viện có tư cách thành viên tích cực.

                    Loại tài liệu này sẽ được gọi là Giao dịch thư viện và sẽ có các trường sau:

                    Bài viết – Liên kết đến bài viết
                    Thành viên Thư viện – Liên kết đến Thành viên Thư viện
                    Loại – Chọn với 2 lựa chọn: Phát hành và Trả lại
                    Ngày – Ngày giao dịch
                    Loại tài liệu này cũng sẽ là loại tài liệu có thể gửi.

                    Xác thực giao dịch

                    Khi một Bài viết được phát hành, chúng tôi nên xác minh xem Thành viên Thư viện có tư cách thành viên tích cực hay không. Chúng ta cũng nên kiểm tra xem Bài viết có sẵn để phát hành hay không. Hãy viết mã cho những xác nhận này.
                    Mã xem ở trang frappeframework.com/docs/user/en/tutorial/types-of-doctype

                    Cài đặt thư viện

                    Hãy tạo loại tài liệu cuối cùng cho ứng dụng của chúng ta: Cài đặt Thư viện . Nó sẽ có các trường sau:
                    Thời hạn cho vay – Sẽ xác định thời gian cho vay theo số ngày
                    Số lượng bài viết được phát hành tối đa – Hạn chế số lượng bài viết tối đa có thể được phát hành bởi một thành viên
                    Vì chúng tôi không cần có nhiều bản ghi cho các cài đặt này nên chúng tôi sẽ bật Là đơn cho loại tài liệu này.
                    Sau khi tạo loại tài liệu, hãy nhấp vào Chuyển đến Cài đặt thư viện , để chuyển đến biểu mẫu và đặt các giá trị cho Thời hạn mượn và Số lượng bài báo được phát hành tối đa .

                    Loại tài liệu đơn

                    Khi Loại tài liệu được bật là Loại tài liệu đơn , nó sẽ trở thành Loại tài liệu đơn. Một loại tài liệu tương tự như các bản ghi đơn trong các khung công tác khác. Nó không tạo ra một bảng cơ sở dữ liệu mới. Thay vào đó, tất cả các giá trị đơn lẻ được lưu trữ trong một bảng duy nhất có tên là tabSingles. Nó thường được sử dụng để lưu trữ các cài đặt chung.

                    Xác thực cài đặt thư viện

                    Hãy thực hiện thay đổi về Tư cách thành viên Thư viện sao cho Đến ngày được tính toán tự động dựa trên Thời gian mượn và Ngày bắt đầu.
                    Chúng tôi đã sử dụng frappe.db.get_single_valuephương pháp để lấy giá trị loan_periodtừ loại tài liệu Cài đặt Thư viện.

                    Bây giờ, hãy thực hiện thay đổi trong Giao dịch thư viện sao cho khi một Bài viết được phát hành, nó sẽ kiểm tra xem có đạt đến giới hạn tối đa hay không.
                    Chúng tôi đã thêm một validate_maximum_limitphương thức và sử dụng frappe.db.countđể đếm số lượng giao dịch được thực hiện bởi thành viên.

                    Tập lệnh biểu mẫu Form Scripts

                    Tập lệnh biểu mẫu là mã javascript phía máy khách giúp nâng cao trải nghiệm người dùng cho Biểu mẫu của bạn.
                    Giả sử bạn muốn tạo tư cách thành viên cho một thành viên. Để thực hiện việc này, bạn phải vào danh sách Thành viên Thư viện, tạo biểu mẫu mới, chọn thành viên và các trường khác rồi lưu.
                    Tương tự, khi bạn muốn tạo giao dịch với thành viên, bạn phải tạo biểu mẫu Giao dịch Thư viện mới. Chúng tôi có thể làm cho quá trình này dễ dàng hơn. Viết đoạn mã theo frappeframework.com/docs/user/en/tutorial/form-scripts vào thư viện_member.js
                    Bây giờ, hãy làm mới trang của bạn và chuyển đến biểu mẫu Thành viên Thư viện. Bạn sẽ thấy hai nút ở trên cùng bên phải. Bấm vào chúng để thử chúng. Họ sẽ tự động đặt Thành viên Thư viện trong mỗi tài liệu đó để giúp quá trình này trở nên dễ dàng hơn.

                    Web View Pages

                    Trang xem web là các trang được máy chủ hiển thị cho khách truy cập trang web của bạn.
                    Chúng tôi đã làm việc độc quyền với Desk, giao diện quản trị mà Người dùng hệ thống có thể truy cập. Thông thường, bạn sẽ muốn cấp quyền truy cập hạn chế cho khách hàng của mình. Trong trường hợp của chúng tôi, chúng tôi muốn Thành viên Thư viện có thể xem các Bài viết có sẵn mà họ có thể phát hành từ trang web của chúng tôi. Trang xem web có thể giúp chúng tôi đạt được điều đó.
                    Đi tới Loại tài liệu bài viết và cuộn xuống phần Chế độ xem web.
                    Bật chế độ xem web và cho phép khách xem
                    Nhập bài viết vào trường Tuyến đường
                    Thêm các trường có tên Tuyến đường và Xuất bản trong bảng trường
                    Bấm vào Lưu
                    Trường đã xuất bản sẽ giúp lọc ra những tài liệu không được hiển thị trong chế độ xem web, nếu không bạn sẽ gặp lỗi. Hiện chúng tôi đã bật chế độ xem web cho loại tài liệu Bài viết. Điều này có nghĩa là giờ đây bạn có thể xem chi tiết về Bài viết trên trang web của mình mà không cần đăng nhập vào Desk. Hãy kiểm tra điều này bằng cách tạo một Điều khoản mới. Bạn sẽ thấy Xem trên trang web ở phía trên bên trái biểu mẫu của bạn. Nhấp vào nó để xem chế độ xem web của Bài viết.

                    Tùy chỉnh mẫu xem web

                    Chế độ xem web mặc định được tạo khá đơn giản và chỉ đóng vai trò là điểm khởi đầu để chúng tôi tùy chỉnh nó. Khi chúng tôi đặt Bài viết ở chế độ xem web, hai tệp HTML đã được tạo là: article.html và article_row.html
                    Trước tiên hãy chỉnh sửa article.html. Frappe sử dụng Bootstrap 4 theo mặc định cho chế độ xem web. Vì vậy, bạn có thể sử dụng bất kỳ đánh dấu Bootstrap 4 hợp lệ nào để tạo kiểu cho các trang của mình. Thêm mã HTML sau vào bài viết.html như ví dụ frappeframework.com/docs/user/en/tutorial/portal-pages.
                    Tương tự, chỉnh sửa bài viết_row.html và thêm HTML.

                    Các kiến thức cần trang bị thêm.

                    1. Architecture
                    2. DocType
                    3. Document API
                    4. Form API
                    5. Bench CLI

                    Cần thảo luận thêm xem trang public forum: discuss.erpnext.com

                    CSS cho trang login

                    Tạo 1 file css với nội dung như sau, sudo nano sites/assets/newara/css/login.css:
                    /* login page */

                    [data-path=”login”] .navbar-light {
                    border-bottom: 1px solid var(–blue-400) !important;
                    background: white;
                    }

                    [data-path=”login”] .web-footer {
                    border-top: 1px solid var(–blue-400) !important;
                    }

                    .for-login .page-card {
                    border: 1px solid var(–blue-400) !important;
                    }

                    .for-login .btn-login{
                    background-color: var(–blue-800) !important;
                    border: none !important;
                    color: white;
                    }

                    .for-login .btn-login:hover{
                    background-color: var(–blue-600) !important;
                    border: none !important;
                    color: white;
                    }

                    .for-login .page-card-head h4 {
                    color: black !important;
                    }

                    .for-login .form-control, .for-login .form-control{
                    background-color: white !important;
                    border: solid 1px var(–blue-400) !important;
                    }

                    .for-login .form-control:focus, .for-login .form-control:hover{
                    box-shadow: 0 0 0 1px var(–blue-300) !important;
                    }

                    .for-login .page-card .page-card-body .forgot-password-message>* {
                    color: var(–blue-600) !important;
                    }

                    Sau đó, add file này vào trong Website Settings Header TAB

                    <link rel=”stylesheet” href=”/assets/newara/css/login.css”>

                    eTax API for EVCS

                    Ví dụ API của EVCS

                    1. Case sign Tax Invoice

                    Sample JSON body

                    {
                        "form_type": "frappe",
                        "form_name": "EM ETax Form",
                        "pdf_content": "",
                        "doc_data": {
                            "source_system": "https://xxx.energyabsolute.co.th",
                            "send_mail": "N",
                            "currency_code": "THB",
                            "document_type_code": "388",
                            "document_id": "IV_AAB_23110011",
                            "document_issue_dtm": "2023-11-04T00:00:00",
                            "create_purpose_code": "",
                            "create_purpose": "",
                            "ref_document_id": "",
                            "ref_document_issue_dtm": "",
                            "ref_document_type_code": "",
                            "buyer_ref_document": "?????",
                            "seller_branch_id": "00000",        <-------------------- YOUR COMPANY
                            "seller_tax_id": "0105554048641",   <-------------------- YOUR BRANCH
                            "buyer_name": "บริษัท เน็กซ์ จำกัด (มหาชน)",
                            "buyer_tax_id": "010???????788",
                            "buyer_branch_id": "00001",
                            "buyer_email": "fin_group@nexpoint.co.th",
                            "buyer_zip": "10540",
                            "buyer_building_name": "",
                            "buyer_building_no": "",
                            "buyer_address_line1": "9/11 หมู่ 4 ต.บางโฉลง",
                            "buyer_address_line2": "อ.บางพลี",
                            "buyer_address_line3": "",
                            "buyer_address_line4": "",
                            "buyer_address_line5": "",
                            "buyer_city_name": "จ.สมุทรปราการ",
                            "buyer_country_code": "TH",
                            "line_item_information": [
                                {
                                    "product_code": "03-C420",
                                    "product_name": "Electric tractor Head",
                                    "product_price": 100.0,  <-- ราคาต่อหน่วยก่อนภาษี
                                    "product_quantity": 10.0,
                                    "line_tax_type_code": "VAT",
                                    "line_tax_rate": 7.0,
                                    "line_base_amount": 1000.0,  <-- ราคารวมก่อนภาษี
                                    "line_tax_amount": 70.0,
                                    "line_total_amount": 1070.0  <-- ราคารวมหลังภาษี
                                }
                            ],
                            "original_amount_untaxed": 0,
                            "final_amount_untaxed": 0,
                            "adjust_amount_untaxed": 0
                        }
                    }
                    

                    Sample API Call

                    • auth_token = <token for frappe authen>
                    • server_url = <frappe server url>

                    Note: to pass PDF from EVCS

                    • form_type = “evcs”
                    • form_name = <name of your form>
                    • pdf_contenct = <string of pdf content>

                    To use PDF from frappe

                    • form_type = “frappe”
                    • form_name = “”
                    • pdf_content = “”

                    Sample in Postman

                    Sample in Python

                        def _send_to_frappe(self, doc_data, form_type, form_name, pdf_content):
                            auth_token, server_url = self._get_connection()
                            try:
                                # -- HERE is the API call --
                                res = requests.post(
                                    # https://<frappe server>/api/method/etax_inet.api.etax.sign_etax_document
                                    url="%s/api/method/%s" % (server_url, "etax_inet.api.etax.sign_etax_document"),
                                    headers={"Authorization": "token %s" % auth_token},
                                    data={
                                        "doc_data": json.dumps(doc_data),   # JSON input
                                        "form_type": form_type,
                                        "form_name": form_name,
                                        "pdf_content": pdf_content,
                                    },
                                    timeout=20,
                                ).json()
                                # -- END HERE - the rest are to update data back to the singing document
                                response = res.get("message")
                                if not response:  # Can't create record on Frappe
                                    self.etax_status = "error"
                                    self.etax_error_message = res.get("exception", res.get("_server_messages"))
                                    return
                                # Update status
                                self.etax_status = response.get("status").lower()
                                self.etax_transaction_code = response.get("transaction_code")
                                self.etax_error_code = response.get("error_code")
                                self.etax_error_message = response.get("error_message")
                                # Get signed document back
                                if self.etax_status == "success":
                                    pdf_url, xml_url = [response.get("pdf_url"), response.get("xml_url")]
                                    if pdf_url:
                                        self.env["ir.attachment"].create(
                                            {
                                                "name": "%s_signed.pdf" % self.name,
                                                "datas": base64.b64encode(requests.get(pdf_url).content),
                                                "type": "binary",
                                                "res_model": "account.move",
                                                "res_id": self.id,
                                            }
                                        )
                                    if xml_url:
                                        self.env["ir.attachment"].create(
                                            {
                                                "name": "%s_signed.xml" % self.name,
                                                "datas": base64.b64encode(requests.get(xml_url).content),
                                                "type": "binary",
                                                "res_model": "account.move",
                                                "res_id": self.id,
                                            }
                                        )
                            except Exception as e:
                                self.etax_status = "error"
                                self.etax_error_message = str(e)
                    

                    2. Case Check Status (document in process)

                    GET API

                    • auth_token = <token for frappe authen>
                    • server_url = <frappe server url>
                    • transaction_code = <transaction code received from previous step>

                    URL = **server_url**/api/resource/INET ETax Document?filters=[["transaction_code","="," **transaction_code**"]]&fields=["status","transaction_code","error_code","error_message","pdf_url","xml_url"]

                    Sample in Python

                        def update_processing_document(self):
                            self.ensure_one()
                            if self.etax_status != "processing":
                                return
                            auth_token, server_url = self._get_connection()
                            url=(
                                '%s/api/resource/?filters=[["transaction_code","=","%s"]]'
                                '&fields=["status","transaction_code","error_code","error_message","pdf_url","xml_url"]'
                                % (server_url, "INET ETax Document", self.etax_transaction_code)
                            )
                            res = requests.get(
                                url,
                                headers={"Authorization": "token %s" % auth_token},
                                timeout=20,
                            ).json()
                            if not res.get("data"):
                                return
                            response = res.get("data")[0]
                            # Update status
                            self.etax_status = response.get("status").lower()
                            self.etax_error_code = response.get("error_code")
                            self.etax_error_message = response.get("error_message")
                            if self.etax_status == "success":
                                pdf_url, xml_url = [response.get("pdf_url"), response.get("xml_url")]
                                if pdf_url:
                                    self.env["ir.attachment"].create(
                                        {
                                            "name": "%s_signed.pdf" % self.name,
                                            "datas": base64.b64encode(requests.get(pdf_url).content),
                                            "type": "binary",
                                            "res_model": self._name,
                                            "res_id": self.id,
                                        }
                                    )
                                if xml_url:
                                    self.env["ir.attachment"].create(
                                        {
                                            "name": "%s_signed.xml" % self.name,
                                            "datas": base64.b64encode(requests.get(xml_url).content),
                                            "type": "binary",
                                            "res_model": self._name,
                                            "res_id": self.id,
                                        }
                                    )
                    

                    3. Case Replacement (ใบแทน)

                    Replacement is just a normal document with reference to the old document and the purpose

                    Coding Steps:

                    1. Cancel existing document, i.e., IW20201203210836
                    2. Do the signing again with revised name i.e., IW20201203210836-R1
                    3. JSON is exactly the same with additonal informaiton as following,
                        "document_id": "IW20201203210836-R1",
                        "create_purpose_code: "TIVC01",              <---- TIVC01 (ชื่อผิด), TIVC02 (ที่อยู่ผิด), TIVC99 (อื่นๆ โปรดระบุ)
                        "create_purpose": "ชื่อผิด",                   <---- เหตุผล
                        "ref_document_id": IW20201203210836",
                        "ref_document_issue_dtm": "2023-11-04T00:00:00",
                        "ref_document_type_code": <same as document_type_code, i.e., T03>
                    

                    ERP miễn phí cho doanh nghiệp vừa và nhỏ (ERPNEXT)

                    Erp Miễn Phí Cho Doanh Nghiệp Vừa Và Nhỏ (erpnext)
                    Nội dung

                      ERPNext là phần mềm hoạch định nguồn lực doanh nghiệp tích hợp miễn phí và mã nguồn mở được phát triển bởi công ty phần mềm Ấn Độ Frappe Technologies Pvt. Ltd. và được xây dựng trên hệ thống cơ sở dữ liệu MariaDB sử dụng Frappe, một framework phía máy chủ dựa trên Python.
                      Điều kiện tiên quyết: Debian 11 có ít nhất 4GB RAM và 40GB ổ đĩa, quyền truy cập root hoặc người dùng có đặc quyền sudo, Tên miền hoặc tên miền phụ đủ điều kiện
                      ERPNext Hệ thống ERP cung cấp những tính năng vượt trội phù hợp cho cả doanh nghiệp vừa và nhỏ. Một số tính năng chính của nó là:
                      Quản lý hàng tồn kho
                      Quản lý kế toán
                      Quản lý mua hàng
                      Quản lý sản xuất
                      Hệ thống quản lý quan hệ khách hàng
                      Quản lý bán hàng
                      Quản lý dự án
                      Hệ thống quản lý nguồn nhân lực và hơn thế nữa.

                      Erp Miễn Phí Cho Doanh Nghiệp Vừa Và Nhỏ (erpnext)
                      Erp Miễn Phí Cho Doanh Nghiệp Vừa Và Nhỏ (erpnext)

                      Cài hệ thống ERP trên Debian

                      https://computingforgeeks.com/install-erpnext-erp-system-on-debian-linux
                      https://wiki.crowncloud.net/?How_to_Install_Erpnext_on_Debian_11

                      https://jwrober.github.io/erpnext_admin_guide/i-u-b/install.html

                      Hãy bắt đầu cài đặt ERPNext bằng cách đảm bảo hệ thống của chúng tôi được cập nhật:
                      sudo apt update && sudo apt -y upgrade
                      Bạn nên khởi động lại hệ thống của mình bất cứ khi nào bạn nâng cấp: sudo systemctl reboot
                      Bắt đầu quá trình cài đặt bằng cách đảm bảo tất cả các gói xây dựng Python cần thiết để xây dựng và thiết lập ERPNext đều được cài đặt:
                      sudo apt -y install git nano libffi-dev python3-pip python3-venv python3-distutils python3-dev libssl-dev wkhtmltopdf xvfb libfontconfig
                      Nếu dùng ERPNEXT13 thì python 3.8 và 3.9 chạy ổn nhưng từ ERPNext 14, Python 3.10+ là bắt buộc để chạy cũng như HRMs.
                      Theo mặc định, phiên bản mới nhất của Node.js không có sẵn trong Debian 9. Vì vậy, bạn sẽ cần thêm kho lưu trữ Nodesource cho Node.js
                      curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash –
                      sudo apt install -y nodejs gcc g++ make
                      cài đặt Node.js, Nginx và Redis bằng cách chạy lệnh sau:
                      sudo apt-get install nodejs redis-server nginx -y
                      sudo systemctl start nginx
                      sudo systemctl enable nginx
                      sudo systemctl start redis-server
                      sudo systemctl enable redis-server
                      Để cài đặt máy chủ MariaDB trên Debian, hãy chạy các lệnh bên dưới
                      curl -LsS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup sudo bash -s — –mariadb-server-version=10.8
                      sudo apt install mariadb-server mariadb-client -y
                      Đặt mật khẩu cơ sở dữ liệu cho người dùng theo root
                      sudo mariadb-secure-installation
                      Tiếp theo, bạn sẽ cần thêm công cụ lưu trữ Barracuda vào tệp cấu hình MariaDB để tạo cơ sở dữ liệu ERPNext. Bạn có thể làm điều này bằng cách chỉnh sửa tệp my.cnf:
                      sudo nano /etc/mysql/my.cnf
                      Thêm các dòng sau:
                      [mysqld] innodb-file-format=barracuda
                      innodb-file-per-table=1
                      innodb-large-prefix=1
                      character-set-client-handshake = FALSE
                      character-set-server = utf8mb4
                      collation-server = utf8mb4_unicode_ci
                      [mysql] default-character-set = utf8mb4
                      Lưu và đóng tệp khi bạn hoàn tất, sau đó khởi động dịch vụ MariaDB và cho phép nó khởi động khi khởi động bằng lệnh sau:
                      sudo systemctl restart mysql
                      sudo systemctl enable mysql
                      Tiếp theo, bảo mật MariaDB bằng cách chạy tập lệnh mysql_secure_installation:
                      sudo mysql_secure_installation
                      Tập lệnh này sẽ đặt mật khẩu root, xóa người dùng ẩn danh, không cho phép đăng nhập root từ xa và xóa cơ sở dữ liệu thử nghiệm và quyền truy cập vào MariaDB an toàn như hình dưới đây:
                      Đầu tiên n
                      Set root password? [Y/n] y
                      Remove anonymous users? [Y/n] y
                      Disallow root login remotely? [Y/n] y
                      Remove test database and access to it? [Y/n] y
                      Reload privilege tables now? [Y/n] y
                      Bench là một công cụ được sử dụng để cài đặt và quản lý ERPNext trên hệ thống Debian của bạn. Chúng tôi sẽ tạo một người dùng sẽ chạy hệ thống ERPNext, sau đó cấu hình hệ thống.
                      sudo useradd -m -s /bin/bash erpnext
                      sudo passwd erpnext
                      sudo usermod -aG sudo erpnext
                      Tiếp theo, đăng nhập user
                      sudo su – erpnext
                      nano ~/.bashrc
                      export PATH=$PATH:~/.local/bin/
                      source ~/.bashrc
                      Tạo một thư mục để thiết lập ERPNext và cung cấp cho người dùng quyền đọc và ghi vào thư mục:erpnext
                      sudo mkdir /home/erpnext/bench
                      sudo chown -R erpnext:erpnext /home/erpnext/bench
                      cd /home/erpnext/bench
                      Nâng cấp pip3:
                      pip3 install –upgrade pip
                      Cuối cùng, cài đặt Bench bằng lệnh pip:
                      pip3 install frappe-bench –user
                      Xác thực cài đặt:
                      bench –version
                      Bước tiếp theo là khởi tạo thư mục bench frappe framework được cài đặt với thông báo: SUCCESS: Bench frappe-bench initialized
                      cd frappe-bench
                      Để cài đặt phiên bản cụ thể, chỉ định nhánh của nó.
                      bench init –frappe-branch version-13 frappe-bench
                      Tạo một trang web Frappe mới.
                      cd /home/erpnext/bench/frappe-bench/
                      SITE=erp.wpvn.xyz
                      bench new-site $SITE
                      Nhập mật khẩu cơ sở dữ liệu MySQL của người dùng theo root. Nếu nhập sai phải xóa site không backup website, tốt nhất lúc làm nên nhớ.
                      Sau đó nhập mật khẩu tài khoản Administrator để truy cập web mới tạo.
                      Tải ứng dụng erpnext và cài đặt nó.
                      bench get-app –branch version-13 erpnext
                      bench –site $SITE install-app erpnext
                      Khi ứng dụng được triển khai, bạn có thể khởi động nó bằng lệnh:
                      bench start
                      bạn có thể thấy dịch vụ đang chạy trên http://0.0.0.0:8000/. Để truy cập giao diện web, hãy mở địa chỉ IP máy chủ và cổng http://ip-address:8000.

                      Thay đổi port : bench –site site_name serve –port port_number

                      Cài đặt trình giám sát:
                      sudo apt install supervisor
                      Chạy tập lệnh cấu hình
                      bench –site $SITE enable-scheduler
                      bench –site $SITE set-maintenance-mode off
                      sudo bench setup production erpnext
                      Để restrart ERPnext sử dụng dịch vụ:
                      sudo supervisorctl restart all
                      Bạn có thể cài đặt các ứng dụng khác trong trang web của mình bằng công cụ dòng lệnh.bench
                      bench get-app hrms
                      bench –site $SITE install-app hrms

                      Cấu hình nginx cho erpnext

                      Mình có thể tạo /etc/nginx/conf.d/frappe.conf:

                      server_names_hash_bucket_size 64;

                      upstream frappe { server 127.0.0.1:8000 fail_timeout=0; }

                      upstream socketio-server { server 127.0.0.1:3000 fail_timeout=0; }

                      server { listen 80 default ;

                      client_max_body_size 4G;

                      # server_name frappe_default_site;

                      server_name my-custom-domain.com;

                      keepalive_timeout 5;

                      sendfile on;

                      root /home/ubuntu/frappe-bench/sites;

                      location /assets { try_files $uri =404; }

                      location ~ ^/protected/(.*) { internal; try_files /site1.local/$1 =404; }

                      location /socket.io {

                      proxy_pass http://socketio-server;

                      proxy_http_version 1.1;

                      proxy_set_header Upgrade $http_upgrade;

                      proxy_set_header Connection “upgrade”;

                      proxy_set_header X-Frappe-Site-Name site1.local;

                      proxy_set_header Origin $scheme://$http_host;

                      proxy_set_header Host $host; }

                      location / { try_files /site1.local/public/$uri @magic; }

                      location @magic {

                      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

                      proxy_set_header X-Forwarded-Proto $scheme;

                      proxy_set_header X-Frappe-Site-Name site1.local;

                      proxy_set_header Host $host;

                      proxy_set_header X-Use-X-Accel-Redirect True;

                      proxy_read_timeout 120;

                      proxy_redirect off;

                      proxy_pass http://frappe; } }

                      Nếu dùng ssl thì thêm một vài nội dung:

                      listen 433 ssl;

                      ssl on;

                      ssl_certificate /etc/nginx/ssl/ssl.crt;

                      ssl_certificate_key /etc/nginx/ssl/ssl.key;

                      ssl_session_timeout 5m;

                      ssl_protocols SSLv3 TLSv1;

                      ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;

                      ssl_prefer_server_ciphers on;

                      ERPNext tự chạy khi máy boot

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

                      [Unit] Description=ERP NEXT

                      [Service] User=erpnext
                      WorkingDirectory=/home/erpnext/frappe-bench
                      StandardOutput=file:/tmp/bench_log
                      StandardError=file:/tmp/bench_log
                      ExecStart=bench start

                      [Install] WantedBy=multi-user.target

                      sudo systemctl daemon-reload

                      sudo systemctl restart erpnext.service

                      sudo systemctl status erpnext.service

                      /usr/local/bin/bench

                      /usr/bin/python3 /usr/local/bin/honcho start

                      Bench tự động chạy không qua systemd

                      Với systemd chỉ cần câu lệnh: bench setup systemd thì toàn bộ các https://gist.github.com/revant/f682aff12105b91a4ee3300142bea9e6 sẽ tự đưa vào /etc/systemd/system.
                      Để Bench bắt đầu tự động, bạn phải thiết lập bench production bằng cách cấu hình hai chương trình, Giám sát và nginx.
                      bench setup supervisor
                      sudo ln -s `pwd`/config/supervisor.conf /etc/supervisor/conf.d/frappe-bench.conf
                      Nginx là một máy chủ web và chúng tôi sử dụng nó để phục vụ các tệp tĩnh và phần còn lại của proxy của các yêu cầu sinh tố. Bạn có thể tạo cấu hình cần thiết cho nginx bằng lệnh . Cấu hình sẽ có sẵn trong tệp. Sau đó, bạn có thể sao chép / liên kết tệp này với thư mục cấu hình nginx và tải lại để nó có hiệu lực.
                      bench setup nginx
                      sudo ln -s `pwd`/config/nginx.conf /etc/nginx/conf.d/frappe-bench.conf
                      Lưu ý: Khi bạn khởi động lại nginx sau khi thay đổi cấu hình, nó có thể không thành công nếu bạn có một cấu hình khác với khối máy chủ làm mặc định cho cổng 80 (trong hầu hết các trường hợp cho trang chào mừng nginx). Bạn sẽ phải tắt cấu hình này. Hầu hết các nơi có thể tồn tại nó là /etc/nginx/conf.d/default.conf ,/etc/nginx/conf.d/default, /etc/nginx/sites-available/default tệp nằm trong.

                      sudo apt-get clean -y
                      sudo apt-get autoremove -y
                      sudo apt –fix-broken install -y
                      sudo dpkg –configure -a
                      sudo apt-get install -f
                      sudo apt-get update && sudo apt-get upgrade

                      su – root

                      Mở cổng firewall: ufw allow 22,25,143,80,443,3306,3022,8000/tcp
                      ufw enable

                      Cài một số tools yêu cầu:

                      apt-get install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev wget libbz2-dev

                      Nâng cấp lên python 3.10 để chạy erpnext 14 hoặc hrms

                      wget https://www.python.org/ftp/python/3.10.6/Python-3.10.6.tgz 14
                      tar -xvf Python-3.10.6.tgz
                      cd Python-3.10.6
                      ./configure –enable-optimizations

                      make install

                      update-alternatives –install /usr/bin/python python /usr/local/bin/python3.10 1

                      reboot

                      Kiểm tra version python phải 3.10.6:

                      python --version hoặc python3
                      Tiếp tục install những tool.
                      apt-get install git python2-dev python3-dev python3-setuptools python3-pip python3-distutils redis-server -y
                      apt-get install python3-venv -y
                      apt-get update -y
                      apt-get install xvfb libfontconfig wkhtmltopdf -y
                      Cài Mariadb
                      - Set mật khẩu cho root. Lưu ý password cho root và frappe nên giống nhau trong Mariadb.
                      sudo passwd root
                      password: frappe07
                      apt-get install mariadb-server mariadb-client -y
                      mysql_secure_installation
                      Chọn yes/no như sau:
                      Switch to unix_socket authentication [Y/n] n
                      Change the root password? [Y/n] y
                      password: frappe07
                      Remove anonymous users? [Y/n] y
                      Disallow root login remotely? [Y/n] y
                      Remove test database and access to it? [Y/n] y
                      Reload privilege tables now? [Y/n] y
                      Cấu hình trong Mysql:
                      mysql -u root -p
                      USE mysql;
                      ALTER USER root@localhost IDENTIFIED VIA mysql_native_password;
                      SET PASSWORD = PASSWORD(‘frappe07’);
                      ***password cho phải giống y đặt pass như trên.
                      FLUSH PRIVILEGES;
                      exit;
                      nano /etc/mysql/my.cnf

                      **add these lines @end of the file

                      [mysqld] character-set-client-handshake = FALSE
                      character-set-server = utf8mb4
                      collation-server = utf8mb4_unicode_ci

                      [mysql] default-character-set = utf8mb4

                      Khởi động lại MySql.

                      service mysql restart
                      sudo reboot không chạy thì dùng systemctl reboot

                      Tạo user chạy riêng.

                      sudo passwd frappe
                      password: frappe07
                      sudo usermod -aG sudo frappe
                      sudo su – frappe

                      Cài node js và npm

                      • Nếu dùng erpnext 13.x

                      sudo apt-get install curl
                      curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
                      sudo apt-get install -y nodejs

                      • Dùng 14 thì khác:

                      sudo apt-get install curl
                      curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -
                      sudo apt-get install -y nodejs

                      Cài Bench repo
                      pip3 install –upgrade pip
                      sudo pip3 install frappe-bench
                      bench –version
                      sudo npm install -g yarn
                      pip install psycopg2
                      sudo apt-get install libpq-dev python-dev
                      pip install cmake
                      pip3 install cmake
                      sudo apt-get install python3-dev python3-pip python3-venv python3-wheel -y
                      pip install wheel setuptools –upgrade
                      pip3 install wheel setuptools –upgrade
                      https://bobbyhadz.com/blog/python-setup-py-bdist-wheel-did-not-run-successfully

                       Tiến hành chạy nhanh trên docker

                      Dùng bản 12 có thể chạy từ bản này: GitHub – seibert-media/erpnext-docker: DockerImage for ERPNext

                      Thay đổi cổng

                      How can I change running port from http://0.0.0.0:8001/ 5 to http://0.0.0.0:9001/
                      bench set-nginx-port site1.local 9001
                      bench set-nginx-port #nginx.conf already exists and this will overwrite it. Do you want to continue? [y/N]: y
                      bench setup nginx
                      sudo systemctl reload nginx
                      Change relevant ports in common_site_config.json
                      And execute
                      bench setup procfile
                      Then bench start
                      Nhiều website trên cùng 1 server thì:
                      bench config dns_multitenant off
                      bench set-nginx-port site2name 8000
                      bench set-nginx-port site3name 8001 and so on
                      bench setup nginx
                      Nếu liên quan đến SSL:
                      run sudo bench config dns_multitenant on
                      but ensure that the sub domains are all pointing to the instance IP.
                      and then run sudo bench setup lets-encrypt abs.dexciss.com
                      repeat same for all sites
                      Còn nếu thay cổng thôi thì dùng: bench –site site-name serve –port 9020
                      Hoặc thay đổi trong từ website, You must execute following steps to change ports for your sites from xx to 8080
                      bench setup config (This will create common_site_config.json). Now, in your sites folder edit common_site_config.json to which should like as follows,
                      {
                      “auto_update”: false,
                      “background_workers”: 1,
                      “frappe_user”: “shreyasp”,
                      “gunicorn_workers”: 8,
                      “rebase_on_pull”: false,
                      “redis_cache”: “redis://localhost:11319”,
                      “redis_queue”: “redis://localhost:6387”,
                      “redis_socketio”: “redis://localhost:12319”,
                      “restart_supervisor_on_update”: false,
                      “serve_default_site”: true,
                      “shallow_clone”: true,
                      “socketio_port”: 3008,
                      “update_bench_on_update”: true,
                      “webserver_port”: 8008,
                      “developer_mode”: 1
                      }
                      Edit “webserver_port” : 8080 and save the file.

                      Xem demo

                      Câu lệnh nạp demo “bench –site t_erp make-demo –reinstall” hiện không hoạt động nên phải import băng tay.
                      Xóa app dùng câu lệnh: bench remove-app [app-name] –force thì app sẽ xóa trong thư mục app.
                      Dùng file json để load data vào: https://github.com/frappe/erpnext_demo
                      Dùng file csv thì có trong https://github.com/sahadnk72/erpnext-demo

                      Thêm ebook hướng dẫn điện tử vào website

                      Có 2 tài liệu hướng dẫn có thể đưa vào website. Xem các app có trong web: bench –site all list-apps
                      1: Nói về frappe
                      bench get-app frappe_docs
                      bench –site site install-app frappe_docs
                      link truy cập là: http://site:8000/docs
                      2: Tài liệu hướng dẫn ERPNext.
                      bench get-app erpnext_documentation
                      bench –site site install-app erpnext_documentation
                      link truy cập là: http://site:8000/docs/v13/user/manual/en/
                      Để xóa app trong website dùng câu lệnh:
                      bench –site site uninstall-app nextcloud-integration
                      không muốn backup thêm –force
                      xóa cache: bench –site site clear-cache
                      Xóa thư mục ứng dụng đó luôn trong thư mục apps:
                      bench remove-app woocommerceconnector –force

                      Thêm app tiện ích vào website

                      Tạo short URL và QR code

                      PibiCut là một Ứng dụng Frappe rất đơn giản để tạo URL rút ngắn trên Máy chủ Frappe, đồng thời cho ra Mã QR cho URL ngắn.
                      Từ thư mục Frappe-bench, thực thi: bench get-app pibicut https://github.com/pibico/pibicut.git
                      Nếu bạn đang sử dụng môi trường nhiều người thuê, hãy sử dụng lệnh sau
                      bench –site site_name install-app pibicut
                      Còn cho tất cả: bench install-app pibicut
                      Sau khi cài đặt, loại tài liệu mới ‘Shortener’ sẽ được tạo. Khi tìm kiếm Loại tài liệu ‘Shortener’, bạn sẽ nhập vào danh sách các url rút gọn đã tạo. Bạn có thể tạo một cái mới, chỉ cần nhấp vào Mới và nhập URL dài đích. Nếu muốn, bạn cũng có thể chèn hình ảnh chính giữa vào QR Code (hình ảnh phải ở định dạng PNG và nền trắng, không trong suốt).
                      Do lưu Doctype ‘Shortener’ nên bạn sẽ có url rút gọn theo kiểu http hoặc https://site_name/MnOpQ. Nếu bạn duyệt đến url ngắn này, bạn sẽ được chuyển hướng đến url dài, điều tương tự cũng được tạo ra nếu bạn đọc Mã QR được tạo.

                      hình ảnh

                      Nguồn github.com/pibico/pibicut

                      PDF on Submit

                      Tự động tạo và đính kèm tệp PDF khi tài liệu bán hàng được gửi. Hoạt động cho Báo giá , Đơn đặt hàng , Hóa đơn bán hàng , Phiếu giao hàng và Dunning .
                      bench get-app https://github.com/alyf-de/pdf_on_submit.git
                      bench –site MY_SITE install-app pdf_on_submit
                      Để thay đổi cài đặt của ứng dụng này, bạn có thể mở tệp PDF trên Gửi Cài đặt qua thanh tìm kiếm.
                      Chọn DocTypes đang hoạt động. Tại đây, bạn có thể chọn DocTypes mà ứng dụng này đang hoạt động. Các loại tài liệu bị tắt sẽ bị bỏ qua.
                      Tạo PDF ở chế độ nền. Bật tùy chọn này nếu bạn muốn tiếp tục công việc của mình ngay lập tức. Các tệp PDF sẽ chỉ xuất hiện sau khi chúng được tạo. (Điều này có thể yêu cầu tải lại tài liệu hiện tại.) Được khuyên dùng nếu bạn thường gửi nhiều tài liệu bán hàng với số lượng lớn.
                      Tắt tùy chọn này để tải bản PDF ngay lập tức. Khi gửi tài liệu, bạn sẽ thấy thanh tiến trình trong khi tệp PDF được tạo. Khi hoàn tất, bạn sẽ thấy ngay bản PDF được đính kèm vào tài liệu.
                      Ứng dụng này sử dụng Định dạng in mặc định. Để thay đổi định dạng in mặc định,
                      Mở chế độ xem danh sách của DocType được hỗ trợ,
                      Vào Menu > Tùy chỉnh, Trong phần “Xem cài đặt”, chọn Định dạng in mặc định.
                      Tệp PDF sẽ được tạo bằng ngôn ngữ được chỉ định trong trường “Ngôn ngữ” của tài liệu hiện tại. Trong bản gốc về Khách hàng và Nhà cung cấp , bạn có thể chọn “Ngôn ngữ in” mặc định. Xem video hướng dẫn: youtube.com/watch?v=FbMkQqyrhco
                      Nguồn: frappecloud.com/marketplace/apps/pdf-on-submit

                      POS

                      Point of Sale
                      Hỗ trợ Erpnext Phiên bản 12 & 13 & 14. Thân thiện với người dùng và cung cấp trải nghiệm người dùng tốt cũng như tốc độ sử dụng
                      Nhân viên thu ngân có tùy chọn sử dụng chế độ xem danh sách hoặc chế độ xem thẻ trong các giao dịch bán hàng. Chế độ xem thẻ hiển thị hình ảnh của các mục. Hỗ trợ gửi hóa đơn enqueue sau khi in biên lai để xử lý nhanh hơn. Hỗ trợ đánh số hàng loạt và nối tiếp. Hỗ trợ định giá theo lô. Hỗ trợ mã vạch và giá cả cụ thể của UOM. Hỗ trợ bán sản phẩm theo cân (có trọng lượng). Khả năng kiếm tiền từ POS. Hỗ trợ Trả lại bằng tiền mặt hoặc tín dụng của khách hàng. Hỗ trợ sử dụng giấy báo có của khách hàng để thanh toán. Hỗ trợ bán tín dụng
                      Cho phép người dùng chọn ngày đáo hạn để bán tín dụng. Hỗ trợ điểm khách hàng thân thiết.
                      Phím tắt:
                      CTRL or CMD + S:thanh toán mở
                      CTRL or CMD + X:gửi thanh toán
                      CTRL or CMD + D:xóa mục đầu tiên khỏi đầu
                      CTRL or CMD + A:mở rộng mục đầu tiên từ trên xuống
                      CTRL or CMD + E:tập trung vào lĩnh vực giảm giá
                      Hỗ trợ chiết khấu cho khách hàng. Hỗ trợ ưu đãi POS. Tự động áp dụng các đợt cho các gói sản phẩm. Tìm kiếm và thêm các mục theo Số Serial. Tạo đơn bán hàng từ POS trực tiếp. Hỗ trợ các mục mẫu với các biến thể. Hỗ trợ nhiều ngôn ngữ. Hỗ trợ thanh toán di động Mpesa
                      Phiếu giảm giá POS. Hỗ trợ mã giới thiệu. Hỗ trợ bảng giá khách hàng và nhóm khách hàng. Hỗ trợ nhân viên bán hàng. Hỗ trợ phí giao hàng.
                      Cài đặt POS AWESOME
                      bench get-app branch version-14 https://github.com/yrestom/POS-Awesome.git
                      bench setup requirements
                      bench build –app posawesome
                      bench restart
                      bench –site [your.site.name] install-app posawesome
                      bench –site [your.site.name] migrate
                      Nguon: github.com/yrestom/POS-Awesome

                      Backup lên FTP

                      FTP Backup Intrgration
                      bench get-app intergation_ftp_backup https://github.com/aleksas/frappe_ftp_backup_integration.git
                      bench –site site1.local install-app intergation_ftp_backup
                      Bench execute: bench execute intergation_ftp_backup.ftp_backup_intrgration.doctype.ftp_backup_settings.ftp_backup_settings.take_backup_to_ftp
                      image
                      Nguồn: github.com/aleksas/frappe_ftp_backup_integration

                      Backup lên Nextcloud

                      bench get-app https://github.com/frappe/nextcloud-integration.git
                      bench –site {site_name} install-app nextcloud_integration
                      Sau khi cài đặt thành công ứng dụng tích hợp nextcloud Bạn có thể tìm kiếm Cài đặt Nextcloud trong Thanh tuyệt vời để đưa bạn đến trang Cài đặt Nextcloud.
                      Tên người dùng : Tên người dùng tài khoản Nextcloud của bạn
                      Mật khẩu : Mật khẩu Tài khoản Nextcloud hoặc Mật khẩu ứng dụng mà bạn có thể đã tạo cho ứng dụng này.
                      URL Nextcloud : URL của trang web nơi tồn tại Tài khoản Nextcloud. Ví dụ:(“https://example.com”) . Theo tùy chọn, bạn cũng có thể cung cấp số cổng sau URL của mình dưới dạng (“https://example.com:443”)
                      URL WebDav (WebDav URL): Bạn sẽ tìm thấy thông tin này trong Tài khoản Nextcloud của mình. Ví dụ: /remote.php/dav/files/ {email_address} /
                      Đường dẫn đến Thư mục Tải lên (Path to Upload Folder): Bạn có thể cung cấp đường dẫn của thư mục nơi bạn muốn tải tệp của mình lên.
                      LƯU Ý :
                      Thư mục này lẽ ra đã được tạo rồi.
                      Nếu không được cung cấp, một thư mục Frappe Backups sẽ được tạo.
                      Tần suất sao lưu : Có thể chọn một trong hai loại Hàng ngày hoặc Hàng tuần .
                      Tệp sao lưu : Chọn tùy chọn này để Sao lưu các tệp công cộng và riêng tư cùng với cơ sở dữ liệu .
                      Gửi thông báo tới : Email mà thông báo về Sao lưu sẽ được gửi.
                      Gửi Email để sao lưu thành công : Chọn tùy chọn này để nhận email sao lưu thành công, theo mặc định, email sao lưu không thành công sẽ được gửi.
                      Sau khi lưu cấu hình, hãy nhấp vào nút Sao lưu ngay và xác minh xem các tệp đã được tải lên trong phiên bản Nextcloud của bạn hay chưa.
                      LƯU Ý : Quá trình này thường mất từ ​​vài phút đến nửa giờ tùy thuộc vào kích thước bản sao lưu của bạn.

                      Thêm tool điều chỉnh văn bản tinyMCE

                      bench get-app https://github.com/shridarpatil/frappe_tinymce
                      bench –site [sitename] install-app frappe_tinymce

                      Giám sát hệ thống

                      bench get-app https://github.com/mymi14s/frappe_system_monitor
                      bench –site sitename install-app frappe_system_monitor
                      bench restart
                      login
                      open yoururl.com/app/system-monitor

                      image

                      Chat

                      bench get-app chat
                      bench –site your-site.local install-app chat
                      Xem hướng dẫn dùng tại trang: github.com/frappe/chat

                      Thông báo đẩy qua PushBullet

                      Thông báo đẩy sẽ giúp người dùng được cập nhật ngay cả khi họ chưa đăng nhập vào trang web. Ứng dụng này sẽ thông báo cho người dùng có dấu đầu dòng đẩy trong trình duyệt tiện ích mở rộng về tài liệu đã lưu, gửi hoặc hủy của mọi người dùng.
                      https://github.com/johnrechcabatana/push_notification
                      pip install pushbullet.py
                      bench get-app https://github.com/johnrechcabatana/push_notification.git
                      bench –site install-app push_notification
                      Setup PushBullet
                      Đi tới PushBUllet, Fill up all fields, check the enable, list all document to be included in the notification.
                      Add PushBullet addon extension Firefox/Chrome
                      FireFox https://addons.mozilla.org/en-US/firefox/addon/pushbullet/ Chrome https://chrome.google.com/webstore/detail/pushbullet/chlffgpmiacpedhhbkiomidkjlcfhogd?utm_source=ext_app_menu
                      Signup and get the access token here https://www.pushbullet.com/#settings/account

                      Quản lý nhân sự

                      cd /opt/bitnami/erpnext/frappe-bench/
                      bench get-app hrms –branch v14.13.0

                      Xem phiên bản https://github.com/frappe/hrms/releases
                      sudo su daemon -s /bin/bash -c “bench –site erpnext install-app hrms”

                      Thêm TEMPLATE FRAPPE NEWARA CSS DESIGN LIKE ODOO

                      bench get-app https://github.com/half-ware/newara.git
                      bench install-app newara

                      For login page: Add the css file in Website Settings, Header TAB:
                      <link rel=”stylesheet” href=”/assets/newara/css/newara.css”>

                      Đồng bộ hóa khách hàng tiềm năng trên Facebook với ERPnext

                      khi khách hàng điền vào mẫu quảng cáo Facebook, ứng dụng sẽ tự động lấy khách hàng tiềm năng mới được tạo và tự động tạo khách hàng tiềm năng trong Lead doctype. Ngoài ra, khi thay đổi Trạng thái khách hàng tiềm năng, trạng thái mới sẽ được gửi đến meta Pixel.

                      bench get-app https://github.com/splinter-NGoH/mansico_meta_integration.git
                      bench –site [your.site.name] install-app mansico_meta_integration
                      bench –site [your.site.name] migrate

                      Cấu hình api theo trang https://github.com/splinter-NGoH/mansico_meta_integration

                      Tích hợp Nextcloud (old)

                      Ứng dụng này cho phép bạn sao lưu cơ sở dữ liệu, cấu hình và tệp vào phiên bản Nextcloud của bạn. Bạn có thể cấu hình để sao lưu hàng ngày hoặc hàng tuần.

                      bench get-app https://github.com/frappe/nextcloud-integration.git
                      bench --site {site_name} install-app nextcloud_integration

                      Sau khi cài đặt thành công ứng dụng nextcloud-integration, bạn có thể tìm kiếm Cài đặt Nextcloud trong Awesome Bar để được chuyển hướng đến trang Cài đặt Nextcloud sau

                      Nextcloud Setting Screen

                      Tên người dùng : Tên người dùng tài khoản Nextcloud của bạn
                      Mật khẩu : Mật khẩu tài khoản Nextcloud hoặc Mật khẩu ứng dụng mà bạn có thể đã tạo cho ứng dụng này.
                      URL Nextcloud : URL của trang web nơi Tài khoản Nextcloud tồn tại. Ví dụ (” https://example.com “) . Tùy chọn bạn cũng có thể cung cấp số cổng sau URL của mình là (” https://example.com:443 “)
                      URL WebDav : Bạn sẽ tìm thấy URL này trong Tài khoản Nextcloud của mình. Ví dụ: /remote.php/dav/files/ {email_address} /
                      Đường dẫn đến thư mục tải lên : Bạn có thể cung cấp đường dẫn đến thư mục mà bạn muốn tải tập tin lên.
                      GHI CHÚ :
                      Thư mục này hẳn đã được tạo sẵn.
                      Nếu không được cung cấp, thư mục Frappe Backups sẽ được tạo.
                      Tần suất sao lưu : Có thể chọn Hàng ngày hoặc Hàng tuần .
                      Sao lưu tệp : Chọn tùy chọn này để sao lưu các tệp công khai và riêng tư cùng với cơ sở dữ liệu .
                      Gửi thông báo tới : Email mà thông báo sao lưu sẽ được gửi tới.
                      Gửi email để sao lưu thành công : Chọn tùy chọn này để nhận email khi sao lưu thành công, theo mặc định, email khi sao lưu không thành công sẽ được gửi.
                      Sau khi lưu cấu hình, hãy nhấp vào nút Sao lưu ngay và kiểm tra xem các tệp đã được tải lên phiên bản Nextcloud của bạn chưa .

                      LƯU Ý : Quá trình này thường mất từ ​​vài phút đến nửa giờ tùy thuộc vào kích thước bản sao lưu của bạn.

                      Xem các app khác https://frappecloud.com/marketplace

                      Cập nhật website và app

                      Chạy cập nhật với bench update
                      Trong trường hợp bạn cập nhật từ các nguồn và phát hiện lỗi, hãy đảm bảo cập nhật các phần phụ thuộc: bench update –requirements

                      update bench by pip3 install –upgrade frappe-bench

                      Thoát update: bench set-config maintenance_mode 0

                      Cannot proceed with update: You have local changes in app “frappe” that are not committed.

                      cd ~/frappe-bench/apps/frappe && git stash
                      cd …/… && bench update

                      Disable maintenance mode by : bench set-config maintenance_mode 0