Bỏ qua để đến nội dung

Sao lưu và khôi phục

Hướng dẫn thao tác
Dành cho:
Người vận hành máy chủ

Hãy sao lưu ReputeCast bằng pg_dump cùng khóa bí mật và thư mục tệp: một lần khôi phục cần đủ cả ba, chỉ riêng cơ sở dữ liệu là không đủ.

Phần Nội dung Vị trí
Cơ sở dữ liệu PostgreSQL Mọi thứ còn lại: không gian làm việc, liên hệ, chiến dịch, hình ảnh đã tải lên, hàng đợi công việc, nhật ký kiểm tra và mọi thông tin xác thực đã lưu ở dạng mã hóa. Cơ sở dữ liệu trong database.url.
Khóa bí mật Khóa AES-256-GCM dùng để mã hóa thông tin xác thực của nhà cung cấp, client secret OIDC, token HostRepute và seed của ứng dụng xác thực (TOTP) trong cơ sở dữ liệu. REPUTECAST_SECRETS__KEY nếu bạn đặt biến này; nếu không thì là tệp khóa secrets.key_file: /var/lib/reputecast/secret.key trong Docker, data/secret.key với tệp nhị phân (tính từ thư mục mà ReputeCast khởi động).
Thư mục tệp Tệp của sản phẩm số và quà tặng đăng ký, vốn quá lớn để lưu trong cơ sở dữ liệu. files.dir; mặc định là thư mục files nằm cạnh tệp khóa (/var/lib/reputecast/files trong Docker). Thư mục này chỉ xuất hiện khi có người tải lên một tệp.

Hãy giữ cả cấu hình: tệp .env hoặc các biến shell bạn dùng để khởi động Docker Compose, hoặc tệp cấu hình YAML và tệp môi trường của tệp nhị phân. Tham chiếu cấu hình liệt kê mọi thiết lập.

  • Quyền truy cập shell vào máy chủ, cùng thư mục dự án Docker Compose (thư mục chứa docker-compose.yml) hoặc tệp môi trường của tệp nhị phân.
  • Với tệp nhị phân: pg_dump, pg_restore và psql cùng phiên bản chính với máy chủ PostgreSQL, hoặc mới hơn.
  • Đủ dung lượng đĩa bên ngoài volume dữ liệu để chứa các bản dump.

Tệp compose đi kèm đặt tên dự án là reputecast, nên các volume của nó là reputecast_pgdata và reputecast_appdata. Volume của ứng dụng chứa tệp khóa và thư mục tệp.

  1. Dump cơ sở dữ liệu từ bên trong container postgres, để phiên bản client và máy chủ luôn khớp nhau. -T tắt chế độ terminal, nếu không bản dump dạng nhị phân sẽ bị hỏng:

    Terminal window
    docker compose exec -T postgres pg_dump -U reputecast -d reputecast -Fc > reputecast-$(date +%F).dump

    pg_dump lấy một snapshot nhất quán trong lúc ReputeCast vẫn tiếp tục chạy.

  2. Nén volume của ứng dụng (khóa bí mật và thư mục tệp) bằng một container chạy tạm. Image nào có tar cũng dùng được:

    Terminal
    docker run --rm -v reputecast_appdata:/data -v "$PWD":/backup alpine:3.22 \
    tar czf /backup/appdata-$(date +%F).tar.gz -C /data .

    tar giữ nguyên chủ sở hữu (user 65532, user không phải root của image) và quyền 0600 của secret.key.

  3. Nếu bạn tự đặt REPUTECAST_SECRETS__KEY thay vì dùng tệp khóa, hãy lưu giá trị đó cùng bản sao lưu cấu hình.

  4. Sao chép bản dump và tệp nén ra khỏi máy chủ.

Hãy khôi phục cơ sở dữ liệu trước khi ReputeCast khởi động. Image Docker chạy với --auto-install: khi khởi động trên một cơ sở dữ liệu trống, nó tạo một Chủ sở hữu đầu tiên mới, điều bạn không muốn có chồng lên bản khôi phục.

  1. Dừng ứng dụng và giữ PostgreSQL chạy. Trên máy chủ mới, chỉ khởi động PostgreSQL:

    Terminal
    docker compose stop app
    docker compose up -d --wait postgres
  2. Thay cơ sở dữ liệu bằng một cơ sở dữ liệu trống:

    Terminal
    docker compose exec -T postgres dropdb -U reputecast --force --if-exists reputecast
    docker compose exec -T postgres psql -U reputecast -d postgres -c 'CREATE DATABASE reputecast'
  3. Trên máy chủ PostgreSQL mới, hãy tạo role mà phân khúc SQL dùng để chạy. pg_dump sao chép một cơ sở dữ liệu chứ không sao chép các role của máy chủ, và nếu thiếu role này, quá trình khôi phục sẽ dừng với lỗi role "reputecast_segments" does not exist:

    Terminal
    docker compose exec -T postgres psql -U reputecast -d postgres \
    -c 'CREATE ROLE reputecast_segments NOLOGIN NOINHERIT' \
    -c 'GRANT reputecast_segments TO reputecast'
  4. Khôi phục bản dump:

    Terminal window
    docker compose exec -T postgres pg_restore -U reputecast -d reputecast --exit-on-error < reputecast-2026-10-22.dump
  5. Đưa khóa bí mật và các tệp trở lại volume của ứng dụng. docker compose create app tạo container và volume của nó mà không khởi động:

    Terminal
    docker compose create app
    docker run --rm -v reputecast_appdata:/data -v "$PWD":/backup alpine:3.22 \
    tar xzf /backup/appdata-2026-10-22.tar.gz -C /data
  6. Khởi động ReputeCast:

    Terminal window
    docker compose up -d

    Nếu image mới hơn bản sao lưu, nó áp dụng các migration còn chờ ngay khi khởi động.

  • curl -s http://localhost:8080/readyz trả về ready. Xem health check, metrics và log.
  • Log của ứng dụng không chứa generated a new secret key. Nếu có, nghĩa là ReputeCast không tìm thấy khóa đã khôi phục: hãy dừng nó, đặt lại khóa rồi khởi động lại.
  • Đăng nhập bằng mật khẩu và ứng dụng xác thực. Đăng nhập bằng ứng dụng xác thực thành công chứng tỏ khóa khớp với cơ sở dữ liệu.
  • Mở Nhà cung cấp gửi thư trong một không gian làm việc: các nhà cung cấp gửi thư đã kết nối vẫn giữ trạng thái thay vì đòi nhập thông tin xác thực.

Hãy thử khôi phục trước khi bạn thật sự cần đến nó: khôi phục bản sao lưu mới nhất vào một dự án Compose thứ hai trên một cổng khác (ví dụ docker compose -p reputecast-restore-test với REPUTECAST_PORT=8090) rồi đăng nhập vào đó.

  • role "reputecast_segments" does not exist khi chạy pg_restore: đây là máy chủ mới. Hãy tạo role (bước 3 của phần khôi phục), tạo lại cơ sở dữ liệu trống và khôi phục lại.
  • Đăng nhập bằng ứng dụng xác thực thất bại với secrets: cannot decrypt value: cơ sở dữ liệu được khôi phục mà không có khóa, hoặc với khóa sai. Hãy đặt lại khóa gốc. Nếu khóa đã mất, mọi người đăng nhập bằng mã khôi phục hoặc khóa truy cập, quản trị viên hệ thống gỡ ứng dụng xác thực của họ bằng reputecast user reset-2fa, và mỗi không gian làm việc nhập lại thông tin xác thực của nhà cung cấp.
  • Log xuất hiện một Chủ sở hữu mới với mật khẩu tạm thời: ứng dụng đã khởi động trước khi cơ sở dữ liệu được khôi phục. Hãy dừng nó, tạo lại cơ sở dữ liệu và khôi phục lại.
  • pg_restore: error: unsupported version hoặc lỗi tương tự: pg_restore của bạn cũ hơn pg_dump đã ghi tệp. Hãy chạy lệnh khôi phục bên trong container postgres, hoặc cài client mới hơn.