💻 Server/Linux

Redmine <-> NAS CIFS-Mount

신건우 2024. 11. 20. 15:47

📚 Redmine <-> Synology NAS CIFS-Mount

프로젝트 관리 툴로 Redmine을 써보고자 Redmine을 설치 후 Redmine 에서 사용하는 데이터들은 NAS에 저장하고 싶어 연동했던 기록을 작성합니다.

현재 제 서버 환경은 별도의 서버에 Redmine을 NAS의 OS에 설치하는 것이 아닌 Docker-Compose로 올려뒀고, DB는 NAS 내부에 세팅 해두었습니다.

원래 DB도 별도의 서버에 했었지만, Redmine 내부 앱의 파일과 Redmine 개별 프로젝트에 올리는 "파일" 탭의 파일의 저장 위치가 달랐고,

1개는 앱 내부에서 DB로, 1개는 앱 외부에 특정 디렉터리로 저장이 되어 있었습니다.


그래서 앱 내부에 저장되는 파일(DB)은 NAS 내부에 DB를 설치하여 그곳에 저장하게 해뒀고,

앱 외부 파일(별도 서버)이 저장되는 디렉터리에 NAS의 디렉터리와 마운트 해주었습니다.


📚 Mount Script 작성

Dockerfile에서 사용할 마운트 스크립트입니다.

컨테이너 실행 후 entrypoint로 mount.sh를 실행하게 해두었습니다.

SMB(CIFS-Utils)를 사용해 컨테이너 내부 디렉터리 <-> 로컬 시스템과 같은 망인 NAS의 `/Dev/Redmine디렉터리와 마운트 해줍니다.

마운트 전 기본적인 파일시스템(ext4)과의 마운트를 해제하고 다시 새로 마운트 해주는 방식을 사용하였습니다.

#!/bin/bash

MOUNT_POINT="/usr/src/redmine/files"
REMOTE_PATH="//192.168.0.16/Dev/Redmine"

# SMB Credentials
CREDENTIALS_FILE="/usr/src/redmine/custom-config/smbcredentials"

# SMB Credentials 생성
touch /usr/src/redmine/custom-config/smbcredentials
echo "username=skw" | tee /usr/src/redmine/custom-config/smbcredentials
echo "password=1234" | tee -a /usr/src/redmine/custom-config/smbcredentials

# 권한 설정 후 확인
chmod 600 /usr/src/redmine/custom-config/smbcredentials
ls -l /usr/src/redmine/custom-config/smbcredentials  # 권한 확인

# 기존 ext4 마운트 포인트 해제 & CIFS 마운트 여부 확인 및 실행
if grep -qs "$MOUNT_POINT" /proc/mounts; then
  echo "Unmounting existing mount at $MOUNT_POINT"
  umount "$MOUNT_POINT"
fi

echo "Attempting to mount CIFS at $MOUNT_POINT"
if ! mount -t cifs -o credentials=$CREDENTIALS_FILE "$REMOTE_PATH" "$MOUNT_POINT"; then
  echo "Failed to mount CIFS at $MOUNT_POINT"
fi

# docker-entrypoint.sh 실행
exec "$@"

📚 Dockerfile

Dockerfile을 작성하여 Docker-Compose에서 사용합니다.

컨테이너 내부엔 ruby on rails만 깔려있고 기본적인 패키지들이 안 깔려있기 떄문에 apt update와 vim, 마운트를 위한 cifs-utils를 설치해 줍니다.

그리고 기본 디렉터리에 custom-config를 만들어 여기에 마운트 스크립트를 저장 후 컨테이너가 실행되면 자동으로 NAS와 마운트 됩니다.

FROM redmine:latest

# 추가 패키지 설치
RUN apt-get update && apt-get install -y vim cifs-utils

# /usr/src/redmine/custom-config 디렉토리 생성
RUN mkdir -p /usr/src/redmine/custom-config

# mount.sh 스크립트를 컨테이너에 복사
COPY ./config/mount.sh /usr/src/redmine/custom-config/mount.sh

# 실행 권한 부여
RUN chmod +x /usr/src/redmine/custom-config/mount.sh

# ENTRYPOINT 명시: mount.sh 실행 후 /docker-entrypoint.sh 실행
ENTRYPOINT ["/bin/bash", "-c", "/usr/src/redmine/custom-config/mount.sh && exec /docker-entrypoint.sh rails server -b 0.0.0.0"]

📚 Docker Compose 파일

간단하게 포트포워딩과 DB정보들을 env로 넣어 주었습니다.

하나 유의할 점은 privileged 옵션을 넣어주었는데, 이 옵션을 안넣으면 커널과 관련된 명령어인 mount 명령을 root 계정임에도 실행할 수 없기에 넣어 주었습니다.

그리고, 비교적 용량이 적은 플러그인과 테마 디렉토리만 서버 내에 저장하고 컨테이너 내부의 파일 디렉터리는 NAS와 마운트됩니다.

version: '3.7'
services:
  redmine:
    build: .
    privileged: true
    container_name: redmine
    restart: always
    ports:
      - "7000:3000"
    environment:
      REDMINE_DB_MYSQL: 192.168.0.16
      REDMINE_DB_PORT: 7001
      REDMINE_DB_USERNAME: skw
      REDMINE_DB_PASSWORD: 1234
      REDMINE_DATABASE: redmine
      REDMINE_DB_ENCODING: utf8mb4
      TZ: Asia/Seoul
    volumes:
      - ./data/plugins:/usr/src/redmine/plugins
      - ./data/themes:/usr/src/redmine/themes

📚 실행

Docker Compose를 실행 시키고 실행 로그를 보면 Dockerfile이 잘 실행되면서 mount.sh가 실행된 걸 볼 수 있습니다.

docker-compose up -d --build

마운트가 되어있는지 확인 해보면, 컨테이너 내부 파일 저장 디렉터리인 /usr/src/redmine/files와 NAS의 /Dev/Redmine과 마운트 되어있고,

Redmine 프로젝트 내부에서 파일업로드를 해보면 NAS에 잘 들어옵니다.

docker exec -it redmine bash

df -h