> For the complete documentation index, see [llms.txt](https://ayakaleaf-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://ayakaleaf-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 Community Edition bao gồm [tính năng Lịch sử toàn bộ dự án](https://www.overleaf.com/learn/latex/Using_the_History_feature) đã có sẵn trong dịch vụ 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ẽ sử dụng Lịch sử toàn bộ dự án theo mặc định. Các dự án hiện có sẽ tiếp tục dùng hệ thống Lịch sử cũ cho đến khi đượ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ừ một bản sao lưu toàn hệ thống. 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ử toàn bộ dự án 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, ít có nguy cơ mất dữ liệu hơn.

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

### 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) toàn bộ của phiên bản của bạn với một ảnh chụp nhất quán của **mongo**, **redis** và **sharelatex** các thư mục.
{% endstep %}

{% step %}

#### Cập nhật

Cập nhật phiên bản image 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 việc này.
{% endstep %}

{% step %}

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

Chờ 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 việc di chuyển cho từng dự án bị lỗ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 vượt 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
==================
Dự án đã di chuyển:  51
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 cùng cho biết không có lỗi:

```bash
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 (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 **Quản trị** nút và chọn **Quản lý trang**
2. Nhấp vào **Mở/Đóng Trình soạn thảo** tab
3. Nhấp vào **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ị viên
* Nhấp vào **Quản trị** nút và chọn **Quản lý trang**
* Nhấp vào **Mở/Đóng Trình soạn thảo** tab
* Nhấp vào **Đóng Trình soạn thảo** nút
* Nhấp vào **Ngắt kết nối tất cả người dùng** nút

Khi việc này đã được thực hiện, 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 một `--concurrency` cao, vòng lặp sự kiện trong một số dịch vụ (`track-changes` đặc biệt) 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 `--concurrency=1` mặc định.
* Bạn có thể dừng script bất cứ lúc nào. Chạy lại nó sẽ tiếp tục việc di chuyển từ chỗ bạn đã dừng. Điều này hữu ích nếu bạn muốn chạy việc di chuyển vào những giờ ít bận hơn (ví dụ: ban đêm).

Khuyến nghị của chúng tôi là đóng trang web và chạy việc di chuyển ngoại tuyến trong một khoảng 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 độ, sau đó quyết định có tiếp tục chạy trực tuyến hay ngoại tuyến tùy theo 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 collection. 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 trong tương lai ở cùng collection. Sẽ không có gì ghi vào các collection này nữa sau khi di chuyển lịch sử, vì vậy dung lượng đĩa sẽ vẫn không được sử dụng.

Nếu bạn muốn làm cho dung lượng đĩa đó khả dụng trở lại, bạn có thể nâng cấp lên Server Pro 3.5.13 (khi vẫn đang dùng bản phát hành 3.x) hoặc Server Pro 4.2.5 (khi đang 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 như được bao gồm trong Server Pro ở các bản vá mới nhất của `3.5.x` và mới nhất `4.x.x` sẽ xóa các collection ở 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 hướng dẫn khắc phục sự cố tại đây. Xin lưu ý rằng mặc dù thông thường chúng tôi chỉ hỗ trợ khách hàng Server Pro, nhưng do tính chất của việc 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ể với việc di chuyển lịch sử toàn bộ dự án.

Nếu script di chuyển lịch sử toàn bộ dự án thất bại (tức là thoát 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 nhóm 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 lịch sử toàn bộ 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`)
* Kết quả đầ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` kết quả đầu ra (khi dùng toolkit)
* Phiên bản Toolkit: `$ git rev-parse HEAD` (khi dùng Toolkit)

Hãy cân nhắc đính kèm các tệp log của `history-v1`, `project-history` và `track-changes` các 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 xóa 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ác cây tệp bị lỗi

Quá trình di chuyển có thể thất bại đối với các dự án có cây tệp bị lỗi cấu trúc (ví dụ: tên tệp trống). Bạn có thể tìm danh sách các vấn đề này bằng `find_malformed_filetrees` 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 `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ử toàn bộ dự án xuống lịch sử cũ

Nếu có một dự án đã được di chuyển sang lịch sử toàn bộ dự án nhưng bạn muốn quay lại lịch sử cũ, hãy dùng `downgrade_project` script 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://ayakaleaf-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.
