Nextcloud 파일서버 구축 1 (with docker-compose)

zuckerfrei·2022년 12월 15일
0

Nextcloud

목록 보기
1/3

요약

docker-compose로 Nextcloud를 설치하여 사내 파일서버를 구축한 내용 정리

  • Nextcloud v20.0.14
  • docker-compose v1.29.2
  • CentOS 7.8
  • Object Storage(S3)

1. 설치 전 고려사항

S3를 붙이고 파일을 저장하고자 할 때, S3에 대해 크게 2가지 접근이 있다.
S3를 external storage(외부 저장소)로 사용할 것인지, primary storage(주 저장소)로 사용할 것인지

아래는 각 접근에 대해 내가 생각한 특징을 정리한 내용이다.

S3 as external storage

  • 업로드시 파일 조합은 서버 내의 디스크에서 진행되고, 최종 파일만 S3에 업로드
  • 휴지통으로 보내면 서버 내의 디스크에 저장되어서 주기적으로 관리해야 한다는 단점
  • 포팅 필요할 경우, 다른 서버로 포팅하기 용이하다는 장점
  • 단점에도 불구하고, S3에는 최종 업로드된 파일만 존재하므로 S3관리 하기가 더 쉽다는 장점
    - 이 장점이 큰 메리트로 느껴져서 이 방식을 선택

S3 as primary storage

  • S3를 주저장소로 활용. NC서버와 관련된 모든 데이터를 S3에 보관함
  • 업로드시 파일 조합도 S3내부에서 실행, 최종 파일도 S3에 업로드
  • 업로드시 에러 발생하면, 청크 파일조각이 S3내부에 남게 되므로 S3관리가 어렵다는 단점
    - 그러나 성공적으로 업로드가 완료되면, 합쳐진 청크 파일조각은 사라지는 것 확인
  • mysql에는 S3 파일에 대한 ID를 저장하는 방식이고, 실제 데이터가 S3에 저장되는 듯
    - 그래서 mysql, s3 백업에 주의해야한다고 한다 → id 싱크를 맞춰야 하기 때문인듯
  • 설치 전 S3 내부가 깨끗하게 비워져 있는지 확인해야 한다.
  • S3에 대한 설정까지 docker-compose.yml에 작성해서 설치하면 굳이 config.php에서 S3에 대한 설정을 추가하지 않아도 되고, 이 방식이 더 안정적임 참조
    • 그러나 external storage를 사용하기로 함 2022-05-09

2. 설치 가이드

아래 링크의 가이드를 베이스로 삼아 설치를 진행했다.
참조

3. 설치 이슈

1) S3 as External Storage 이슈

설치 후 외부 저장소 app을 통해 S3를 external storage(외부저장소)로 등록했지만 에러가 발생

  • 이 에러에 대한 레퍼런스를 찾을 수 없어서 이 방법은 포기하려했으나
    nextcloud이미지 버전을 20.0.14로 낮추니 이 기능에 문제가 없는 것을 확인
  • docker-compose에 버전을 명시하지 않으면 최신버전인 v23으로 설치됨(2022-05-08 기준)
    v23에서는 내가 사용하려던 external storage기능에 문제가 있는 것으로 보였음

2) php-imagick 설치 필요

아래 명령어를 docker 컨테이너 내부에서 실행 -> 나중에 보니 php-imagick이 필수는 아니었음

apt update
apt-get install -y --no-install-recommends $(apt-cache search libmagickcore-6.q[0-9][0-9]-[0-9]-extra | cut -d " " -f1)

    

3) php.ini 설정 파일 위치

php명령어로 찾은 php.ini파일을 수정해도 설정값이 적용되지 않는 이슈가 있었음

  • docker container 내부에서 php.ini파일 찾기(컨테이너 내부에서 실행)
    php -i |grep php.ini
  • 결과
    root@1cf2b5525c37:/usr/local/etc/php# php -i | grep php.ini
    Configuration File (php.ini) Path => /usr/local/etc/php

그러나 이 경로에 있는 php.ini-development, php.ini-production 파일을 변경해도 서버에 적용되지는 않았다.
아래의 방법으로 php 설정 상황을 확인하여 변경한 설정이 적용되는지 확인했다. 참조

  • 추가로 ini파일을 만들어서 넣어줘야 원하는 설정값을 적용 할 수 있었다
    vi /usr/local/etc/php/conf.d/smlee-uploadTmpDir.ini
    upload_tmp_dir = /var/www/html/upload_temp_dir
  • 도커를 쓰니까 /var/www/html/로 경로를 설정해야함
    • 생성한 upload_temp_dir의 권한 설정 필수
    • 컨테이너 내부에서 아래 명령어 실행 참조
sudo chmod 755 /var/www/html/upload_temp_dir
sudo chown -R www-data:www-data /var/www/html/upload_temp_dir
  • 이렇게 upload_tmp_dir 을 설정하면 upload_temp_dir에 청크조각이 스쳐지나갔다가, 각 유저의 uploads폴더에 모이게 되고, 마지막으로 upload_temp_dir에서 합쳐진 후 S3에 업로드되는 것 확인

4) mysql

Nextcloud에서 제공하는 docker-compose.yaml로 설치 했을 경우, 사용에는 문제가 없으나 mysql 메타DB에 접속하여 확인할 수가 없었음 -> DB상태 확인을 위한 외부접속 시도
에러) unexpected end of stream, read 0 bytes from 4 (socket was closed by server)

  • 위의 에러 발생시 간단하게 db컨테이너의 포트를 매핑시켜주기만 하면 외부접속 가능함
    - 3306:3306 → docker-compose.yml 명시
    - 참조

4. 설정 파일

설정파일 예시

vi /nc_data/app_data/.htaccess  

php_value upload_max_filesize 100G 
php_value post_max_size 100G
php_value memory_limit 7200M
php_value max_execution_time 21600

---------------------------------------------------------
vi /nc_data/app_data/.user.ini -> 적용되는지 확실하지않음

upload_max_filesize = 100G
post_max_size =100G
memory_limit=7200M

---------------------------------------------------------
vi /nc_data/app_data/config/config.php -> 설치된 후 건드리지 않음

---------------------------------------------------------
/usr/local/etc/php/conf.d/smlee-uploadTmpDir.ini -> 개인적으로 설정한 파일

upload_tmp_dir = /var/www/html/upload_temp_dir

5. docker-compose.yaml

최종 작성한 yaml파일
참조 링크에 따르면 id방식으로 mysql에 저장하고, 실제 데이터는 s3에 저장되는 듯

version: '2'

volumes:
  nextcloud:
  db:

services:
  db:
    image: mariadb
    restart: always
    ports: 
      - 3306:3306   # 외부 접속을 위해 설정
    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
    volumes:
      - /nc_data/mysql_data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=[패스워드]
      - MYSQL_PASSWORD=[패스워드]
      - MYSQL_DATABASE=[DB이름]
      - MYSQL_USER=[DB유저]

  app:
    image: nextcloud:20.0.14-apache
    restart: always
    ports:
      - 8080:90   # http redirect를 위해 설정
      - 8081:100  # http redirect를 위해 설정
    links:
      - db
    volumes:
      - /nc_data/app_data:/var/www/html
    environment:
      - MYSQL_PASSWORD=[패스워드]
      - MYSQL_DATABASE=[DB이름]
      - MYSQL_USER=nc-[DB유저]
      - MYSQL_HOST=db
      
      # 아래는 S3를 primary storage로 사용할 경우 설정하는 값
      #- OBJECTSTORE_S3_HOST=kr.object.ncloudstorage.com    
      #- OBJECTSTORE_S3_BUCKET=[s3 bucket이름]
      #- OBJECTSTORE_S3_KEY=1234
      #- OBJECTSTORE_S3_SECRET=1234
      #- OBJECTSTORE_S3_REGION=kr-standard
      #- OBJECTSTORE_S3_SSL=true

    depends_on:
      - db

6. 실행

docker-compose up -d 명령어 실행

  • 서버ip:8080 포트로 접속
  • 백업에 대한 고민하기 2022-05-07

7. s3fs-fuse 설치

s3fs-fuse를 설치하여 S3를 마운트시킨다.
이렇게 하면 서버에서 S3를 마치 서버의 디스크인 것 처럼 사용할 수 있다.
참고 가이드

yum install automake fuse-devel gcc-c++ git libcurl-devel libxml2-devel make openssl-devel

git clone https://github.com/s3fs-fuse/s3fs-fuse.git

cd s3fs-fuse

./autogen.sh

./configure

make

make install

설치 후 마운트 작업

echo 1234567:abcdefg > /etc/passwd-s3fs

chmod 600 /etc/passwd-s3fs

mkdir [마운트 포인트]

s3fs [버킷이름] [마운트 포인트] -o url=https://kr.object.ncloudstorage.com

8. Load Balancer 붙여서 접속

NCP(Naver Cloud Platform) 기준으로 아래처럼 세팅한다.
Health check 경로를 /index.html 로 설정하지 않으면, 302 redirect 이슈로 헬스체크에 실패하므로 주의


다음에는 Nextcloud http redirect 작업 포스트를 작성해야겠다.

profile
무설탕 음료를 좋아합니다

0개의 댓글