본문 바로가기
서버구축 (WEB,DB)

Node.js 환경에서 생성되는 캐시나 임시 파일을 정리하는 방법

by 날으는물고기 2024. 6. 4.

Node.js 환경에서 생성되는 캐시나 임시 파일을 정리하는 방법

n8n을 Kubernetes 환경에서 운영할 때 /home/node에 대한 PVC(Persistent Volume Claim)를 사용하여 데이터를 저장하는 설정을 사용하게 됩니다. 그런데, 이 디렉토리에 캐시나 임시 파일들이 많이 생성되어 용량이 증가하는 문제를 관리하기 위해 몇 가지 방법을 적용할 수 있습니다.

캐시 및 불필요한 파일 정리

n8n은 워크플로우 실행 시 여러 임시 파일과 캐시를 생성할 수 있습니다. 이러한 파일들을 주기적으로 정리하는 스크립트를 작성하여 CronJob으로 실행할 수 있습니다.

 

예를 들어, 특정 디렉토리 내의 모든 파일을 7일 이상된 파일을 삭제하는 스크립트는 다음과 같습니다.

find /home/node -type f -mtime +7 -name '*.cache' -exec rm -f {} +

이 명령어는 /home/node 디렉토리 안에서 생성된 지 7일이 지난 .cache 확장자를 가진 파일을 찾아서 삭제합니다.

Kubernetes CronJob 설정

이 스크립트를 Kubernetes CronJob으로 설정하여 정기적으로 실행되게 할 수 있습니다. 예를 들어, 매주 일요일 자정에 실행되도록 CronJob을 설정할 수 있습니다.

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: cleanup-n8n-cache
spec:
  schedule: "0 0 * * 0"  # 매주 일요일 자정
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: cleanup
            image: busybox
            command: ["/bin/sh", "-c", "find /home/node -type f -mtime +7 -name '*.cache' -exec rm -f {} +"]
          restartPolicy: OnFailure
          volumes:
          - name: node-home
            persistentVolumeClaim:
              claimName: node-pvc
          volumeMounts:
          - mountPath: /home/node
            name: node-home

이러한 접근 방식을 사용하여 n8n 인스턴스의 파일 시스템 관리와 관련된 이슈를 최소화할 수 있습니다.

고려 사항

  • 파일 선택: 삭제하려는 파일 유형을 잘 선택해야 합니다. 모든 캐시 또는 임시 파일이 반드시 삭제되어야 하는 것은 아니므로, 어떤 파일이 삭제되어도 안전한지를 파악하는 것이 중요합니다.
  • 데이터 백업: 주기적인 백업 스케줄을 설정하여 중요 데이터를 잃지 않도록 해야 합니다.
  • 모니터링: 디스크 사용량과 PVC의 용량을 모니터링하여 필요 시 확장을 고려해야 합니다.

 

전역 라이브러리를 설치하면 /usr/local/lib/node_modules 디렉토리 아래에 생성되는데 이 경로의 파일들 중에서 TypeScript 소스 파일(*.ts), JavaScript 소스맵 파일(*.js.map), 그리고 Vue 컴포넌트 파일(*.vue)을 삭제하는 작업을 수행할 수 있습니다. 이러한 파일들은 개발 과정에서 생성되며, 프로덕션 환경에서는 불필요할 수 있습니다. 파일 삭제는 시스템의 용량을 확보하고, 보안을 강화하는 데 도움을 줄 수 있습니다.

명령어 설명

find /usr/local/lib/node_modules -type f '(' -name '*.ts' -o -name '*.js.map' -o -name '*.vue' ')' -delete
  • find /usr/local/lib/node_modules: 지정된 디렉토리와 그 하위 디렉토리를 탐색합니다.
  • -type f: 파일 타입이 파일(f)인 것만 대상으로 합니다.
  • '(' -name '*.ts' -o -name '*.js.map' -o -name '*.vue' ')': 파일 이름이 *.ts, *.js.map, *.vue 중 하나와 일치하는 경우를 찾습니다. 여기서 -o는 OR 조건을 의미합니다.
  • -delete: 찾은 파일을 삭제합니다.

캐시 및 임시 파일 정리 명령어

Node.js 환경에서 생성되는 캐시나 임시 파일은 위 경우 외에도 여러 종류가 있을 수 있으며, 아래는 몇 가지 일반적인 예시와 이를 삭제하는 명령어입니다.

  1. npm 캐시 파일 삭제
    npm cache clean --force
    이 명령어는 npm의 캐시를 강제로 삭제합니다. npm은 패키지 설치 과정에서 파일을 캐시 디렉토리에 저장하는데, 이는 재사용을 위해서이지만 때로는 용량을 많이 차지할 수 있습니다.
  2. 로그 파일 삭제
    find /path/to/log/directory -type f -name '*.log' -delete
    로그 디렉토리에서 .log 확장자를 가진 모든 파일을 삭제합니다.
  3. 임시 디렉토리 내 파일 삭제
    rm -rf /tmp/*
    /tmp 디렉토리는 시스템의 임시 파일을 저장하는 곳으로, 주기적으로 내용을 비워주는 것이 좋습니다.

이러한 명령어를 사용할 때는 삭제 대상 파일이 시스템 운영에 필요하지 않은지 확인해야 하며, 중요한 데이터를 삭제하지 않도록 주의해야 합니다. 또한, 이 명령어들을 정기적으로 실행하는 스크립트를 작성하고, 예를 들어 cronjob 등을 통해 주기적으로 실행되게 할 수 있습니다. 이렇게 함으로써 시스템의 안정성과 성능을 유지할 수 있습니다.

 

npm install과 같은 npm 명령어는 일반적으로 프로젝트의 루트 디렉토리에서 실행됩니다. 이는 해당 디렉토리에 package.json 파일이 위치해 있기 때문입니다. package.json 파일은 프로젝트의 의존성, 스크립트, 메타데이터 등을 정의하며, npm은 이 파일을 참조하여 필요한 패키지를 설치합니다.

npm install 명령어

  • 위치: 프로젝트 루트 디렉토리에서 실행합니다.
  • 동작: package.json 파일에 정의된 모든 의존성을 현재 디렉토리의 node_modules 폴더에 설치합니다.

npm cache clean --force 명령어

반면에, npm cache clean --force 명령어는 위치에 상관없이 실행할 수 있습니다. 이 명령어는 전역적으로 npm 캐시를 관리하며, npm이 내부적으로 사용하는 캐시 디렉토리를 정리합니다. npm 캐시는 보통 사용자의 홈 디렉토리 내에 존재하는 별도의 경로(예: ~/.npm)에 위치합니다.

  • 위치: 어느 위치에서든 실행 가능합니다.
  • 동작: npm이 관리하는 모든 캐시 데이터를 삭제합니다.

 

따라서, npm cache clean --force 명령어를 사용할 때는 특정 프로젝트의 디렉토리에 있을 필요가 없으며, 터미널에서 바로 실행하면 됩니다. 이 명령어는 전역적인 캐시를 대상으로 하므로 프로젝트 위치에 영향을 받지 않습니다.

 

아래는 Kubernetes에서 find 명령어를 사용하여 특정 파일을 삭제하고, npm cache clean --force를 수행하는 CronJob의 YAML 매니페스트 예시입니다. 이 CronJob은 주기적으로 지정한 파일을 삭제하고 npm 캐시를 정리합니다.

Kubernetes CronJob YAML 매니페스트

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: cleanup-files-and-npm-cache
spec:
  schedule: "0 2 * * *"  # 매일 새벽 2시에 실행
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: cleanup
            image: node:latest  # 최신 Node.js 이미지 사용
            command:
              - "/bin/sh"
              - "-c"
              - >
                find /usr/local/lib/node_modules -type f '(' -name '*.ts' -o -name '*.js.map' -o -name '*.vue' ')' -delete;
                npm cache clean --force;
          restartPolicy: OnFailure
          volumeMounts:
          - name: node-modules-volume
            mountPath: /usr/local/lib/node_modules
          volumes:
          - name: node-modules-volume
            hostPath:
              path: /path/to/your/node_modules
              type: Directory
  • apiVersionkind: Kubernetes API 버전과 리소스 유형(CronJob)을 지정합니다.
  • metadata: 리소스의 이름과 기타 메타데이터를 정의합니다.
  • spec:
    • schedule: Cron 형식으로 작업 실행 시간을 지정합니다. 여기서는 매일 새벽 2시에 작업이 실행되도록 설정했습니다.
    • jobTemplate: 실행될 작업의 템플릿을 정의합니다.
      • template: 실제 Pod 템플릿을 지정합니다.
        • spec:
          • containers:
            • name: 컨테이너의 이름입니다.
            • image: 사용할 컨테이너 이미지, 여기서는 node:latest를 사용합니다.
            • command: 쉘을 사용하여 두 명령어를 연속으로 실행합니다. 먼저 find 명령어로 파일을 삭제하고, npm cache clean --force를 실행하여 npm 캐시를 정리합니다.
          • restartPolicy: 작업 실패 시 재시도 정책을 정의합니다. OnFailure는 실패 시에만 재시작합니다.
          • volumeMountsvolumes:
            • 이 부분에서 /usr/local/lib/node_modules의 실제 경로를 마운트합니다. 이 경로는 실제 시스템에 따라 조정해야 할 수 있습니다.

이 매니페스트를 사용하여 Kubernetes 클러스터에 배포하면, 정의된 스케줄에 따라 자동으로 파일 정리 및 npm 캐시 정리 작업이 실행됩니다. 필요에 따라 경로나 스케줄을 조정할 수 있습니다.

 

Kubernetes 환경에서 CronJob을 설정할 때, 기존의 Pod와는 독립적으로 작동하는 별도의 Job 리소스가 생성되어 실행됩니다. 이 말은, CronJob이 구성된 컨테이너가 따로 실행되며, 필요한 데이터에 접근하려면 해당 데이터의 위치를 명시적으로 마운트해줘야 한다는 의미입니다. 따라서, CronJob이 특정 파일을 접근하거나 작업을 수행해야 할 때는 필요한 볼륨을 CronJob 스펙에 포함시켜야 합니다.

 

기존 Pod에서 사용하는 데이터나 설정을 CronJob에서도 사용하려면, 해당 데이터를 저장하는 볼륨을 CronJob에 마운트해주어야 합니다. 예를 들어, /usr/local/lib/node_modules 경로에 접근해 파일을 삭제하려면, 이 경로가 마운트된 볼륨을 CronJob에 지정해야 합니다. 이렇게 함으로써, CronJob이 필요한 파일 시스템에 접근하여 명령을 수행할 수 있습니다.

볼륨 마운트 필요성

  • 데이터 일관성: 기존 Pod에서 사용하는 데이터와 동일한 데이터에 접근해야 할 경우, 데이터의 일관성을 유지하기 위해 볼륨 마운트가 필요합니다.
  • 작업 범위: 특정 디렉토리 내의 파일을 처리해야 하는 경우, 그 디렉토리를 포함하는 볼륨을 CronJob에 마운트해야만 해당 작업을 수행할 수 있습니다.

마운트 과정 간소화

기존 Pod와 동일한 스토리지 볼륨을 사용하는 경우, 기존 Pod의 볼륨 구성을 참조하여 CronJob에 필요한 볼륨과 볼륨 마운트 설정을 재사용할 수 있습니다. 이 방식은 구성 관리를 효율적으로 하고, 기존 데이터와의 호환성을 보장합니다.

volumes:
- name: node-modules-volume
  persistentVolumeClaim:
    claimName: your-pvc-name

volumeMounts:
- name: node-modules-volume
  mountPath: /usr/local/lib/node_modules

이 설정은 기존 Pod에서 사용하는 PersistentVolumeClaim(PVC)을 CronJob에서도 사용하게 하여, CronJob이 필요한 데이터에 접근할 수 있게 해줍니다. 이렇게 하면, CronJob도 기존의 데이터를 읽고, 변경할 수 있으며, 파일 시스템의 동일한 뷰를 공유할 수 있습니다.

 

홈 디렉토리의 .npm 폴더는 npm이 패키지 설치 시 생성하는 캐시 파일들을 저장하는 곳입니다. 이 폴더를 삭제하는 것은 일반적으로 안전합니다. 폴더를 삭제하면 npm은 필요할 때 캐시를 다시 생성하기 때문에 시스템에 영구적인 손상을 주지 않습니다.

.npm 폴더 삭제 시 고려할 점

  1. 저장 공간 확보: .npm 폴더를 삭제하면 하드 드라이브에 공간을 확보할 수 있습니다.
  2. 성능 영향: 캐시가 삭제되면 npm이 패키지를 다운로드하고 설치할 때 추가적인 시간이 소요될 수 있습니다. 캐시의 목적은 반복적인 다운로드를 줄이고 설치 속도를 빠르게 하는 것이기 때문입니다.
  3. 다운로드 데이터량 증가: 자주 사용하는 패키지의 경우, 캐시를 삭제하면 다시 다운로드해야 하므로 인터넷 데이터 사용량이 증가할 수 있습니다.

.npm 폴더 삭제 방법

커맨드 라인을 사용하여 .npm 폴더를 직접 삭제할 수 있습니다.

  • Linux/macOS: rm -rf ~/.npm
  • Windows (명령 프롬프트): rmdir /s /q "%USERPROFILE%\.npm"

이 명령어는 .npm 폴더의 내용을 안전하게 삭제하고 필요한 경우 npm이 자동으로 캐시를 재구성하게 합니다. 폴더를 수동으로 삭제하는 것보다 이 방법을 사용하는 것이 좀 더 안전하고 권장되는 접근 방법입니다.

728x90

댓글