κ³Όμ° μ΄λ κ² μλ²λ₯Ό λ°°ν¬νκ³ λμ€μ μ¬λ°°ν¬λ₯Ό ν κ²½μ° μ΄λ―Έμ§λ₯Ό μ΄λ»κ² λ°±μ νκ³ κ΄λ¦¬νλμ§ κ³ λ―Όμ λΉ μ‘λ€.
Gpt λ μμ μλμ κ°μ ν΄κ²°λ°©μμ μ μν΄μ£Όμλ€.
ν΄λΌμ°λ μ€ν λ¦¬μ§ μλΉμ€: AWS S3, Google Cloud Storage, Azure Blob Storage λ±μ ν΄λΌμ°λ μ€ν λ¦¬μ§ μλΉμ€λ₯Ό μ¬μ©νμ¬ νμΌμ λ°±μ ν μ μμ΅λλ€. μ΄λ¬ν μλΉμ€λ€μ λμ©λμ λ°μ΄ν°λ₯Ό μ μ₯νκ³ κ΄λ¦¬νκΈ° μν΄ μ€κ³λμμΌλ―λ‘ μμ μ μ΄λ©° νμ₯μ±μ΄ μ’μ΅λλ€.
μ μ© λ°±μ μλΉμ€: Backblaze B2, CrashPlan, Carbonite λ±μ μ μ© λ°±μ μλΉμ€λ₯Ό μ¬μ©νμ¬ μλ²μ νμΌμ μ£ΌκΈ°μ μΌλ‘ λ°±μ ν μ μμ΅λλ€.
FTP/SFTP: FTP λλ SFTPλ₯Ό μ¬μ©νμ¬ λ€λ₯Έ μλ²λ μ μ₯μμ νμΌμ μ μ‘νμ¬ λ°±μ ν μ μμ΅λλ€.
λ‘컬 λ°±μ : μλ²μμ μ§μ μ λ‘λλ νμΌμ λ‘컬 μμ€ν μΌλ‘ 볡μ¬νμ¬ λ°±μ ν©λλ€. μ΄ λ°©λ²μ μλμΌλ‘ μνλ μλ μκ³ , μλν μ€ν¬λ¦½νΈλ₯Ό μ¬μ©νμ¬ μ£ΌκΈ°μ μΌλ‘ μνλ μλ μμ΅λλ€.
λ°μ΄ν°λ² μ΄μ€ μ€λ μ·: νμΌ μΈμλ λ°μ΄ν°λ² μ΄μ€μ μ 보λ₯Ό λ°±μ ν΄μΌ νλ κ²½μ°, λ°μ΄ν°λ² μ΄μ€μ μ€λ μ· κΈ°λ₯μ μ¬μ©νμ¬ λ°±μ μ μμ±νκ³ μ μ₯ν μ μμ΅λλ€.
λ²μ κ΄λ¦¬ μμ€ν : Gitκ³Ό κ°μ λ²μ κ΄λ¦¬ μμ€ν μ μ¬μ©νμ¬ μ λ‘λλ νμΌμ λ³κ²½ λ΄μμ μΆμ νκ³ λ°±μ ν μ μμ΅λλ€. νμ§λ§ μ΄ λ°©λ²μ λμ©λ νμΌμλ μ ν©νμ§ μμ μ μμ΅λλ€.
μ¬κΈ°μ 1λ²μ μκ°νκΈ΄ νμΌλ, κ·Έλ¬λ©΄ μ§μ GCS μ μ΄λ―Έμ§λ₯Ό μ μ₯νμ¬ λΆλ¬μ μ¬μ©νμκ²μ΄λ€. κ·Έλ¬λ€ μκ°νκ²μ΄, μμμ μΌμ§λ λͺ¨λ₯΄μ§λ§ κ΅°λμμ λΌμ°ν° λ°±μ νμΌμ μ μ₯νλ μμ μ΄ μκ°λ¬λ€. κ·Έλ₯ μ 체νμΌμ 볡μ¬ν΄μ λΆμ¬λ£λκ²μ΄λ€.
κ²°κ³Όμ μΌλ‘λ μμμ μΌλ‘ ν΄κ²°νμλ€.
μΌμ£ΌμΌμ νλ²μ© uploads ν΄λλ₯Ό λ°±μ
νλ λ°©μμ ννμλ€.
κ·Έλ¬κΈ° μν΄μ μμΉ΄μ΄λΈ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©ν΄μ, uploads ν΄λλ₯Ό μ 체λ₯Ό λ€μ΄λ°μμ μλ λ§ν¬λ₯Ό κ±Έμ΄μ£Όμλ€.
// μ΄λ―Έμ§ λ€μ΄λ‘λ
app.get("/download-uploads", ensureAdmin, (req, res, next) => {
const archive = archiver("zip", {
zlib: { level: 9 }, // μμΆ μμ€ μ€μ
});
const output = res;
output.attachment("uploads.zip"); // λΈλΌμ°μ μμ λ€μ΄λ‘λν νμΌ μ΄λ¦ μ€μ
archive.pipe(output);
archive.directory(path.join(__dirname, "uploads"), false);
archive.finalize();
archive.on("error", (err) => {
next(err);
});
});