> For the complete documentation index, see [llms.txt](https://overleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://overleaf-pro.ayaka.space/on-premises/vi/ho-tro/support-guides/full-project-history-migration.md).

# (Di chuyển v3.5.13) Di chuyển toàn bộ lịch sử dự án

## Di chuyển toàn bộ lịch sử dự án

Trường `3.5.x` bản phát hành của Community Edition bao gồm [tính năng Lịch sử dự án đầy đủ](https://www.overleaf.com/learn/latex/Using_the_History_feature) đã có sẵn trong gói SaaS của chúng tôi, [overleaf.com](http://overleaf.com/)

Sau khi nâng cấp phiên bản của bạn lên Overleaf CE `3.5.13`, tất cả dự án mới sẽ mặc định sử dụng Lịch sử dự án đầy đủ. Các dự án hiện có sẽ tiếp tục sử dụng hệ thống Lịch sử cũ cho đến khi chúng được di chuyển.

{% hint style="info" %}
Nếu bạn nâng cấp lên `3.5.13` và quyết định hạ cấp xuống phiên bản cũ hơn, thì bạn nên khôi phục từ bản sao lưu hệ thống đầy đủ. Lịch sử của các dự án được tạo trong `3.5.13` không tương thích với các phiên bản Overleaf CE cũ hơn.
{% endhint %}

Lịch sử dự án đầy đủ mới mang lại một số cải tiến cho người dùng:

* Nó theo dõi các thay đổi trong tệp nhị phân, điều mà hệ thống cũ không hỗ trợ.
* Có hỗ trợ cho các phiên bản có nhãn.
* Hệ thống nhìn chung ổn định hơn, khả năng mất dữ liệu thấp hơn.

Xem [tài liệu Lịch sử dự án đầy đủ](https://www.overleaf.com/learn/latex/Using_the_History_feature) để biết thêm thông tin về lịch sử dự án đầy đủ.

### Di chuyển các dự án hiện có

{% stepper %}
{% step %}

#### Tạo bản sao lưu

Tạo một [bản sao lưu](https://docs.overleaf.com/on-premises/maintenance/data-and-backups#performing-a-consistent-backup) đầy đủ của phiên bản của bạn với một ảnh chụp nhất quán của các **mongo**, **redis** và **sharelatex** thư mục.
{% endstep %}

{% step %}

#### Cập nhật

Cập nhật phiên bản ảnh sharelatex/sharelatex lên 3.5.13.

Toolkit: Sử dụng `$ bin/upgrade` script để nâng cấp toolkit lên phiên bản mới nhất và chỉnh sửa **config/version** thành 3.5.13.
{% endstep %}

{% step %}

#### Khởi động phiên bản

Lý tưởng nhất, bạn nên ngăn người dùng truy cập vào phiên bản của bạn trong khi quá trình di chuyển diễn ra, để tránh mất dữ liệu trong trường hợp bạn cần khôi phục bản sao lưu. Xem [di chuyển ngoại tuyến](https://github.com/overleaf/overleaf/wiki/Full-Project-History-Migration/#offline-migration) để biết thêm thông tin về cách thực hiện điều này.
{% endstep %}

{% step %}

#### Đợi cho đến khi tất cả dịch vụ đã khởi động và đang chạy

Đợi cho đến khi tất cả dịch vụ đã khởi động và đang chạy (xem lệnh bên dưới)

{% code overflow="wrap" %}

```bash
$ bin/docker-compose exec sharelatex /bin/bash -c "curl http://localhost:3000/status"
web sharelatex đang hoạt động (api)%
```

{% endcode %}
{% endstep %}

{% step %}

#### Chạy script di chuyển

{% code overflow="wrap" %}

```bash
# Người dùng Overleaf Toolkit:
$ bin/docker-compose exec sharelatex /bin/bash -c "cd /overleaf/services/web; VERBOSE_LOGGING=true node scripts/history/migrate_history.js --force-clean --fix-invalid-characters --convert-large-docs-to-file"

# người dùng legacy docker-compose.yml:
$ docker exec sharelatex /bin/bash -c "cd /overleaf/services/web; VERBOSE_LOGGING=true node scripts/history/migrate_history.js --force-clean --fix-invalid-characters --convert-large-docs-to-file"
```

{% endcode %}

`--force-clean` xóa dữ liệu lịch sử dự án đã được di chuyển một phần trong hệ thống mới, điều này cho phép thử lại quá trình di chuyển cho từng dự án riêng lẻ đã thất bại ở các lần thử trước;

`--fix-invalid-characters` thay thế các ký tự không in được mà hệ thống lịch sử mới không hỗ trợ;

`--convert-large-docs-to-file` chuyển các tài liệu có kích thước trên ngưỡng 2MB có thể chỉnh sửa thành một tệp không thể chỉnh sửa)

Kết quả đầu ra sẽ trông như sau:

```bash
Dự án đã di chuyển  :  1
Tổng số dự án     :  51
Dự án còn lại :  51
Tổng số bản ghi lịch sử cần di chuyển: 98
Bắt đầu di chuyển...
Đang di chuyển dự án: 63d29b5772dd80015a81bffe
kết quả di chuyển { upgraded: true, historyType: 'NoneWithoutConversion' }
Đang di chuyển dự án: 63d29c2e72dd80015a81c0a2
kết quả di chuyển { upgraded: true, historyType: 'NoneWithoutConversion' }

// …

Di chuyển hoàn tất
==================
Số dự án đã di chuyển:  51
Số dự án thất bại:  0
Đã xong.
```

Nếu quá trình di chuyển thành công, bạn sẽ nhận được mã thoát là `0`, và các dòng cuối cho biết không có lỗi:

```bash
Số dự án thất bại:  0
Đã xong.
```

Bạn có thể mở lại quyền truy cập cho người dùng của mình (xem bước tiếp theo). Nếu có lỗi, vui lòng xem phần khắc phục sự cố bên dưới. Bạn vẫn có thể mở lại trang web nếu sự cố không được khắc phục ngay, và các dự án chưa được di chuyển sẽ vẫn ở hệ thống lịch sử cũ.
{% endstep %}

{% step %}

#### Mở lại trang web

Nếu bạn đã chọn thực hiện di chuyển ngoại tuyến thì bạn sẽ cần mở lại trang web. Nếu bạn vẫn đang đăng nhập, bạn sẽ cần:

1. Nhấp vào nút **Quản trị** nút và chọn **Quản lý trang web**
2. Nhấp vào nút **Mở/Đóng trình soạn thảo** tab
3. Nhấp vào nút **Mở lại trình soạn thảo** nút

Nếu bạn đã đóng trình duyệt thì bạn sẽ cần khởi động lại trang web bằng `$ bin/up`.
{% endstep %}
{% endstepper %}

#### di chuyển ngoại tuyến

Để ngăn người dùng có thể đăng nhập trong khi script di chuyển lịch sử đang chạy, vui lòng làm theo các bước sau:

* Đăng nhập vào phiên bản Overleaf của bạn bằng tài khoản quản trị
* Nhấp vào nút **Quản trị** nút và chọn **Quản lý trang web**
* Nhấp vào nút **Mở/Đóng trình soạn thảo** tab
* Nhấp vào nút **Đóng trình soạn thảo** nút
* Nhấp vào nút **Ngắt kết nối tất cả người dùng** nút

Sau khi hoàn tất, nếu có người dùng nào đang đăng nhập thì họ sẽ được chuyển hướng đến trang bảo trì, và bất kỳ người dùng mới nào truy cập trang đăng nhập sẽ thấy trang bảo trì và **sẽ không** có thể đăng nhập.

#### Di chuyển trực tuyến

Có thể chạy các script di chuyển trong khi ứng dụng vẫn đang chạy. Có một vài điểm cần lưu ý:

* Quá trình di chuyển tiêu tốn nhiều CPU, bạn nên theo dõi mức sử dụng tài nguyên trong khi script đang chạy.
* Với giá trị `--concurrency` cao, vòng lặp sự kiện ở một số dịch vụ (`track-changes` đặc biệt là) có thể bị chặn một phần, dẫn đến trải nghiệm UX kém hơn. Chúng tôi khuyến nghị bắt đầu với giá trị mặc định `--concurrency=1` .
* Bạn có thể dừng script bất cứ lúc nào. Khởi động lại nó sẽ tiếp tục quá trình di chuyển từ chỗ bạn đã dừng. Điều này hữu ích nếu bạn muốn chạy di chuyển vào những giờ ít bận rộn hơn (ví dụ: ban đêm).

Khuyến nghị của chúng tôi là đóng trang web và chạy di chuyển ngoại tuyến trong một khoảng thời gian bảo trì khi số lượng dự án của bạn ít hơn 1000 dự án (`db.projects.count()`). Nếu số lượng dự án lớn, bạn có thể chạy script và theo dõi tiến độ của nó, rồi quyết định có tiếp tục chạy trực tuyến hay ngoại tuyến dựa trên trường hợp cụ thể của bạn.

#### Dọn dẹp dữ liệu lịch sử cũ

Một script để dọn dẹp dữ liệu lịch sử cũ đã được thêm vào Server Pro `3.5.6`, `4.0.6` và `4.1.0`.

{% code overflow="wrap" %}

```bash
bin/docker-compose exec sharelatex /bin/bash -c "cd /overleaf/services/web; node scripts/history/clean_sl_history_data.js"
```

{% endcode %}

Script này có thể được chạy sau khi tất cả dự án đã được di chuyển. Nó cũng có thể được dùng để giải phóng một phần dung lượng trong khi thực hiện di chuyển trực tuyến.

{% hint style="info" %}
Trong Server Pro trước phiên bản 3.5.13, script sẽ xóa nội dung của `docHistory` và `docHistoryIndex` các bộ sưu tập. MongoDB không giải phóng dung lượng đĩa sau khi bạn xóa tài liệu; thay vào đó, nó sẽ tái sử dụng dung lượng đó cho các tài liệu tương lai trong cùng bộ sưu tập. Sẽ không có gì ghi vào các bộ sưu tập này nữa sau quá trình di chuyển lịch sử, vì vậy dung lượng đĩa sẽ vẫn chưa được sử dụng.

Nếu bạn muốn làm cho dung lượng đĩa có thể sử dụng lại, bạn có thể nâng cấp lên Server Pro 3.5.13 (khi vẫn dùng bản phát hành 3.x) hoặc Server Pro 4.2.5 (khi dùng bản phát hành 4.x) và chạy lại script dọn dẹp.

Script dọn dẹp đi kèm trong các bản phát hành vá mới nhất của Server Pro `3.5.x` và mới nhất `4.x.x` đang xóa các bộ sưu tập như bước cuối cùng.

Có thể an toàn khi chạy lại script dọn dẹp.
{% endhint %}

### Khắc phục sự cố

Chúng tôi sẽ bổ sung lời khuyên khắc phục sự cố ở đây. Xin lưu ý rằng mặc dù bình thường chúng tôi chỉ hỗ trợ khách hàng Server Pro, nhưng với bản chất của quá trình di chuyển này, chúng tôi cũng sẽ cố gắng hết sức để hỗ trợ khách hàng CE gặp sự cố cụ thể liên quan đến việc di chuyển toàn bộ lịch sử dự án.

Nếu script di chuyển toàn bộ lịch sử dự án thất bại (tức là thoát ra với lỗi hoặc in ra số lượng dự án thất bại khác 0), vui lòng gửi các chi tiết sau cho đội hỗ trợ của chúng tôi qua email [support+historymigration@overleaf.com](mailto:support+historymigration@overleaf.com?subject=Full%20project%20history%20migration%20problem\&body=Instance%20Type%3A%20CE%20or%20Server%20Pro%20%28delete%20as%20appropriate%29%0A%0AInstallation%20Type%3A%20Overleaf%20toolkit%20or%20docker-compose.yml%20or%20other%20%28delete%20as%20appropriate%29%0A%0AScript%20output%3A%0A%0Abin%2Fdoctor%20output%20%28if%20using%20toolkit%29%3A%0A), nêu rõ:

Tiêu đề: Vấn đề di chuyển toàn bộ lịch sử dự án

* Loại phiên bản: CE hoặc Server Pro (xóa phần không phù hợp)
* Loại cài đặt: Overleaf toolkit hoặc `docker-compose.yml` hoặc khác (xóa phần không phù hợp)
* Phiên bản: 3.5.x (toolkit: `$ cat config/version`)
* Đầu ra của script di chuyển (nên nằm trong container tại `/overleaf/services/web`)
* Dự án đã di chuyển: (theo đầu ra của script di chuyển)
* Tổng số dự án: (theo đầu ra của script di chuyển)
* Dự án còn lại: (theo đầu ra của script di chuyển)
* Thời lượng của quá trình di chuyển:
* `bin/doctor` đầu ra (khi dùng toolkit)
* Phiên bản toolkit: `$ git rev-parse HEAD` (khi dùng Toolkit)

Cân nhắc đính kèm các tệp log của `history-v1`, `project-history` và `track-changes` dịch vụ vào email. Bạn có thể tìm chúng tại `/var/log/sharelatex` bên trong `sharelatex` container và xuất chúng như sau:

```bash
$ docker cp sharelatex:/var/log/sharelatex/history-v1.log history-v1.log
$ docker cp sharelatex:/var/log/sharelatex/project-history.log project-history.log
$ docker cp sharelatex:/var/log/sharelatex/track-changes.log track-changes.log
```

Vui lòng che/mask mọi thông tin nhạy cảm khỏi các tệp log trước khi đính kèm chúng.

#### Tìm cây tệp bị lỗi

Quá trình di chuyển có thể thất bại với những dự án có cây tệp bị lỗi định dạng (ví dụ, nơi tên tệp trống). Bạn có thể tìm danh sách các vấn đề này bằng `script find_malformed_filetrees` script này, script kiểm tra tất cả dự án trong cơ sở dữ liệu:

{% code overflow="wrap" %}

```bash
$ bin/docker-compose exec sharelatex /bin/bash -c "cd /overleaf/services/web; node scripts/find_malformed_filetrees.js"
ĐƯỜNG DẪN LỖI: 123456789012345678901234 rootFolder.0.1.2.3
ĐƯỜNG DẪN LỖI: 123456789012345678901234 rootFolder.0.4.5.6
...
```

{% endcode %}

Để sửa các đường dẫn không hợp lệ, hãy dùng `script fix_malformed_filetree` script, chạy lệnh một lần cho mỗi đường dẫn lỗi:

{% code overflow="wrap" %}

```bash
$ bin/docker-compose exec sharelatex /bin/bash -c "cd /overleaf/services/web; node scripts/fix_malformed_filetree.js 123456789012345678901234 rootFolder.0.1.2.3"
$ bin/docker-compose exec sharelatex /bin/bash -c "cd /overleaf/services/web; node scripts/fix_malformed_filetree.js 123456789012345678901234 rootFolder.0.4.5.6"
...
```

{% endcode %}

#### Hạ cấp các dự án từ lịch sử dự án đầy đủ về lịch sử cũ

Nếu có một dự án đã được di chuyển sang lịch sử dự án đầy đủ nhưng bạn muốn quay lại lịch sử cũ, hãy dùng `script downgrade_project` như sau:

{% code overflow="wrap" %}

```bash
$ bin/docker-compose exec sharelatex /bin/bash -c "cd /overleaf/services/web; PROJECT_ID=YOUR
```

{% endcode %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://overleaf-pro.ayaka.space/on-premises/vi/ho-tro/support-guides/full-project-history-migration.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
