클라우드: Nextcloud (+Nginx)

July 1, 2019
    본문 업데이트
    2019년 7월 7일: php, APCu, Redis 설정 추가, 임시 디렉토리 제거, OpenSSL 업그레이드, Nginx 서버 블록 변경, 배경 작업 설정 추가
    

    Nextcloud

    우분투 서버에 설치할 수 있는 대표적인 클라우드 스토리지 프로그램으로 Nextcloud가 있다. Nextcloud는 구글 드라이브나 드롭박스 등과 같은 일을 하는 프로그램으로, 웹이나 앱에서 홈 서버의 파일을 사용하고, 홈 서버에 파일을 전송하고, 모바일 기기에서 촬영한 사진을 자동으로 홈 서버에 업로드하고, 파일을 외부와 공유할 URI를 만들고, PC나 Mac, 리눅스에 클라이언트 프로그램을 설치하면 홈 서버와 파일을 동기화할 수 있다. 자체적으로 WebDAV 프로토콜도 지원한다. Nextcloud에 ONLYOFFICE 등의 온라인 오피스 프로그램을 결합하면 웹에서 .docx .xlsx 등의 오피스 문서를 작성할 수도 있다. https://demo.nextcloud.com에서 데모를 사용해볼 수 있다.

    서브도메인 생성

    넥스트 클라우드 접속용 서브도메인을 하나 생성한다. 여기서는 cloud.example.com을 생성한 것으로 가정한다. (도메인에 대한 일반적인 내용은 도메인과 DNS를 참고한다.)

    TLS 인증서 발급

    https 보안 연결을 사용하기 위해서 TLS 인증서를 발급받는다. 자세한 방법은 앞선 글 TLS 인증서: Let’s Encrypt를 참고한다. 이 방법으로 인증서를 발급받으면 *.example.com 형태의 와일드카드 서브도메인에 대한 인증서가 발급되므로 이 인증서를 그대로 cloud.example.com 도메인에 사용할 수 있다.

    Nginx 설치

    넥스트 클라우드를 운영할 웹 서버로 Nginx를 사용할 것이다. Nginx 설치 및 작동에 관한 내용은 앞선 글 웹 서버: Nginx를 참고한다.

    php 설치 및 설정

    sudo apt update
    
    sudo apt install php-fpm
    
    sudo apt install php php-apcu php-bz2 php-curl php-gd php-gmp php-imagick php-imap php-intl php-json php-ldap php-mbstring php-mysql php-smbclient php-xml php-zip
    

    넥스트 클라우드는 php로 작성되어 있다. 패키지 저장소 정보를 업데이트하고, php 및 넥스트 클라우드 운영에 필요한 php 확장 모듈을 설치한다. 우분투 서버 18.04 LTS 버전에서는 php 7.2버전이 기본으로 설치되는데, php 설치 명령을 먼저 실행하면 Apache 웹 서버가 함께 설치된다. 여기서는 Nginx 웹 서버를 사용하므로 Apache 웹 서버를 설치하고 싶지 않다면 php-fpm을 단독으로 먼저 설치한 다음에 php를 설치하면 Apache 웹 서버가 설치되지 않는다. 앞선 글 웹사이트: WordPress를 통해 php를 설치한 경우에는 위의 명령을 실행하면 이미 설치된 모듈은 자동으로 건너뛰고 필요한 모듈만 추가로 설치된다.

    sudo nano /etc/php/7.2/fpm/php.ini

    php 설정 파일을 nano 편집기로 열고 아래를 참고해서 적절히 편집한다. 참고로 nano 편집기에서 항목을 찾을 때는 ctrl키와 w키를 동시에 누르면 찾을 내용을 입력하는 메뉴가 나타난다.

    memory_limit = 512M
    post_max_size = 65600M
    upload_max_filesize = 64G
    max_file_uploads = 100
    max_execution_time = 10800
    max_input_time = 10800
    date.timezone = Asia/Seoul
    mbstring.language = UTF-8
    mbstring.internal_encoding = UTF-8
    mbstring.http_input = UTF-8
    mbstring.http_output = UTF-8
    opcache.enable=1
    opcache.enable_cli=1
    opcache.memory_consumption=128
    opcache.interned_strings_buffer=8
    opcache.max_accelerated_files=10000
    opcache.revalidate_freq=1
    opcache.save_comments=1
    

    memory_limit은 php가 사용할 최대 메모리 용량으로, 기본값은 128M 이다. 웹사이트 운영 중에 “Fatal Error: Allowed Memory Size of XXXXX Bytes Exhausted” 오류가 나타나면 이 값을 적절히 늘려야 한다. 넥스트 클라우드는 512M 이상을 권장한다.
    post_max_size는 php로 생성되는 게시물 하나의 최대 용량으로, 게시물 자체의 용량 및 이 게시물에 포함된 첨부파일의 용량을 포함한다. 따라서 첨부파일 용량에 해당하는 아래의 max_file_uploads 보다 큰 값을 지정해야 한다. 기본값은 8M이다.
    upload_max_filesize는 php를 통해 업로드 되는 파일의 최대 용량으로, 기본값은 2M이다. 넥스트 클라우드는 클라우드 스토리지이므로 대용량 파일을 전송할 경우를 예상해서 적절히 늘려준다.
    max_file_uploads는 한 번에 업로드 할 수 있는 파일의 개수이다. 기본값은 20이다.
    max_execution_time은 php 스크립트가 실행되는 최대 시간으로, 기본값은 30초이다. 여기서 지정한 시간 이내에 php 스크립트 작동이 완료되지 않으면 강제로 종료된다. post_max_sizeupload_max_filesize의 값을 늘렸다면 늘린 크기의 파일을 업로드하는데 소요되는 충분한 시간으로 설정한다.
    max_input_time은 스크립트가 입력을 기다리는 최대 시간으로, 기본값은 60초이다. 여기서 지정한 시간 동안 아무런 입력이 없으면 스크립트는 종료된다.
    date.timezone은 시간대를 설정하는 옵션으로 옵션 앞에 주석 ;을 제거하고 Asia/Seoul로 지정한다.
    mbstring으로 시작하는 4개의 옵션 앞에 주석 ;을 제거하고 UTF-8로 지정한다.
    opcache으로 시작하는 7개의 옵션 앞에 주석 ;이 있다면 제거하고 위의 내용으로 지정한다.

    설정이 끝났으면 Ctrl키와 x키를 동시에 눌러서 nano 편집기를 빠져나오면서 저장한다.

    sudo nano /etc/php/7.2/fpm/pool.d/www.conf

    www.conf 파일을 nano 편집기로 연다.

    pm.max_children = 240
    pm.start_servers = 20
    pm.min_spare_servers = 10
    pm.max_spare_servers = 20
    pm.max_requests = 500
    
    env[HOSTNAME] = $HOSTNAME
    env[PATH] = /usr/local/bin:/usr/bin:/bin
    env[TMP] = /tmp
    env[TMPDIR] = /tmp
    env[TEMP] = /tmp
    

    위에 열거한 항목 앞에 주석 ;이 있다면 제거하고, 각 항목의 값 또한 위와 같이 설정한다. 허용할 프로세스 수와 환경변수를 설정하는 내용이다. 편집이 끝났으면 Ctrl키와 x키를 동시에 눌러서 nano 편집기를 빠져나오면서 저장한다.

    sudo nano /etc/php/7.2/mods-available/apcu.ini

    넥스트 클라우드가 사용하는 캐시 방식 중에 하나인 APCu의 php 설정 파일 apcu.ini를 nano 편집기로 연다.

    apc.enabled=1
    apc.enable_cli=1
    

    APCu 사용을 활성화하는 위 내용을 추가한다. 편집이 끝났으면 Ctrl키와 x키를 동시에 눌러서 nano 편집기를 빠져나오면서 저장한다.

    sudo systemctl restart php7.2-fpm

    설정한 내용을 반영하기 위해 php7.2-fpm을 재시작한다.

    Redis 설정

    보다 뛰어난 성능의 캐싱을 위해 넥스트 클라우드가 권장하는 Redis를 설치하고 설정한다.

    sudo apt update
    sudo apt install redis-server php-redis
    

    Redis 서버와 php 확장 모듈을 설치한다.

    sudo nano /etc/redis/redis.conf

    nano 편집기로 Redis 설정 파일 redis.conf를 연다.

    port 0
    unixsocket /var/run/redis/redis-server.sock
    unixsocketperm 770
    

    위에 열거한 항목 앞에 주석 #이 있다면 제거하고, 각 항목의 값 또한 위와 같이 설정한다. 성능이 조금 더 뛰어난 unix socket 방식으로 연결하기 위한 설정이다. 편집이 끝났으면 Ctrl키와 x키를 동시에 눌러서 nano 편집기를 빠져나오면서 저장한다.

    sudo usermod -a -G redis www-data

    php 사용자인 www-data를 redis 그룹에 포함시킨다.

    sudo systemctl restart redis-server

    Redis 서버를 재시작 한다.

    sudo systemctl restart php7.2-fpm

    php를 재시작 한다.

    MariaDB 설치 및 설정

    sudo apt update
    sudo apt install mariadb-server
    

    넥스트 클라우드가 사용할 데이터베이스로 MariaDB를 선택했다. 만일 앞서 워드프레스를 설치하는 과정 등에서 이미 MariaDB를 설치했다면 이 설치 명령은 생략하면 된다.

    sudo mysql_secure_installation

    MariaDB를 처음 설치하는 것이라면 MariaDB의 기본 보안 설정을 진행한다. 몇 가지 사항을 질문해오는데 다음 설명을 참고해서 입력한다.

    Enter current password for root:   MariaDB를 처음 설치한 경우 아직 루트 패스워드를 설정하지 않았으므로 그냥 엔터키를 입력한다.
    Set root password?   y를 입력해서 MariaDB의 루트 패스워드를 설정한다.
    New password:   패스워드를 결정해서 입력한다.
    Re-enter new password:   패스워드를 한 번 더 입력해서 확인한다.
    Remove anonymous users?   y를 입력한다.
    Disallow root login remotely?   y를 입력한다.
    Remove test database and access to it?   y를 입력한다.
    Reload privilege tables now?   y를 입력한다.

    sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

    MariaDB가 설치되었으면 MariaDB 설정 파일을 nano 편집기로 열고 아래와 같이 편집한다. 편집하는 위치가 중요하므로 정확히 확인한다.

    #
    # These groups are read by MariaDB server.
    # Use it for options that only the server (but not clients) should see
    #
    # See the examples of server my.cnf files in /usr/share/mysql/
    #
    
    # this is read by the standalone daemon and embedded servers
    [server]
    
    # this is only for the mysqld standalone daemon
    [mysqld]
    transaction-isolation = READ-COMMITTED
    
    #
    # * Basic Settings
    #
    
    중략
    
    #
    # * Logging and Replication
    #
    # Both location gets rotated by the cronjob.
    # Be aware that this log type is a performance killer.
    # As of 5.1 you can enable the log at runtime!
    #general_log_file        = /var/log/mysql/mysql.log
    #general_log             = 1
    #
    # Error log - should be very few entries.
    #
    log_error = /var/log/mysql/error.log
    log-bin = /var/log/mysql/mariadb-bin
    log-bin-index = /var/log/mysql/mariadb-bin.index
    binlog_format = MIXED
    #
    # Enable the slow query log to see queries with especially long duration
    
    중략
    
    #
    # * InnoDB
    #
    # InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.
    # Read the manual for more InnoDB related options. There are many!
    innodb_large_prefix = true
    innodb_file_format = barracuda
    innodb_file_per_table = 1
    
    #
    # * Security Features
    #
    
    하략
    

    빨간색으로 표시된 내용을 추가하는데, 지정된 위치에 정확히 추가한다. 편집이 끝났으면 Ctrl키와 x키를 동시에 눌러서 nano 편집기를 빠져나오면서 저장한다.

    sudo systemctl restart mariadb

    MariaDB를 재시작한다.

    Nextcloud DB 생성

    넥스트 클라우드가 사용할 데이터베이스를 생성한다.

    sudo mysql -u root -p

    위 명령어를 실행한 후 MariaDB의 루트 패스워드를 입력해서 MariaDB에 접속한다.

    CREATE DATABASE nextcloud DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

    nextcloud라는 이름의 데이터베이스를 utf8mb4 문자셋으로 생성한다. 데이터베이스 이름은 원하는 이름으로 생성하면 된다.

    CREATE USER 'ncuser'@'localhost' IDENTIFIED BY '비밀번호';

    ncuser라는 이름의 사용자와 이 사용자의 비밀번호를 생성한다. 역시 원하는 사용자 이름으로 생성하면 되고, 자신만의 비밀번호를 결정해서 입력한다.

    GRANT ALL PRIVILEGES ON nextcloud.* TO 'ncuser'@'localhost';

    ncuser 사용자에게 nextcloud라는 이름의 데이터베이스의 모든 권한을 부여한다.

    FLUSH PRIVILEGES;

    설정 사항을 반영한다.

    exit;

    MariaDB 접속을 종료한다.

    Nextcloud 디렉토리 설정

    이제 넥스트 클라우드 설치 파일을 내려받고, 넥스트 클라우드의 웹사이트 디렉토리와 데이터 디렉토리를 생성한다.

    cd /tmp

    작업하기 편하도록 /tmp 디렉토리로 이동한다.

    wget https://download.nextcloud.com/server/releases/latest.tar.bz2

    최신 버전의 넥스트 클라우드 설치 파일을 내려받는다.

    tar -xjvf latest.tar.bz2

    내려받은 파일의 압축을 해제한다.

    sudo cp -r nextcloud /var/www/

    압축을 해제하면 생성되는 nextcloud 디렉토리를 /var/www/ 경로에 복사해서 넥스트 클라우드의 웹사이트 디렉토리를 생성한다.

    sudo chown -R www-data:www-data /var/www/nextcloud

    생성한 넥스트 클라우드 디렉토리 및 그 하위 디렉토리(-R 옵션)의 소유자와 소유그룹을 www-data로 설정한다. www-data는 우분투 서버의 웹 서버 프로세스를 뜻한다.

    sudo mkdir -p /home/Nextcloud

    넥스트 클라우드에 업로드되는 데이터가 저장될 데이터 디렉토리를 생성한다. 데이터를 직접 관리하기 위해서 /home의 하위 경로에 Nextcloud 디렉토리를 생성했다.

    sudo chown -R www-data:www-data /home/Nextcloud

    /home/Nextcloud 디렉토리 및 하위 디렉토리(-R)의 소유자와 소유그룹을 www-data로 설정한다.

    sudo rm /tmp/latest.tar.bz2
    sudo rm -rf /tmp/nextcloud
    

    /tmp에 내려받은 넥스트 클라우드 설치 파일 및 압축을 해제한 디렉토리를 삭제하려면 위의 명령을 실행한다.

    DH Param 키 생성

    sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096

    앞선 글 웹 서버: Nginx를 통해서 DH Param 키를 생성했다면 그 키 하나로 모든 웹사이트에 사용할 수 있으므로 이 단계는 건너뛴다. 만일 생성하지 않았다면 위 명령으로 DH Param 키를 생성한다. DH Param 키는 https 보안 연결에서 암호화 성능을 높이기 위해서 추가로 사용하는 난수인데, 위 명령어는 4096 비트 (512 바이트) 로 생성하므로 시간이 오래 걸린다. 서버 컴퓨터의 성능에 따라 다르지만 길게는 수십분 가량 소요되기도 한다. 2048 비트 (256 바이트) 로 생성하려면 위의 명령에서 끝에 4096을 2048로 바꿔서 입력한다. 키가 생성되는 위치는 /etc/ssl/certs/dhparam.pem 으로 지정했다.

    OpenSSL 업그레이드

    보안 연결을 구축하는 프로토콜 TLS는 2018년 8월에 1.3버전으로 업데이트 되었다. 우분투 서버에서는 OpenSSL이 TLS를 담당하는데, 2018년 9월에 출시된 OpenSSL 1.1.1 버전부터 TLS 1.3을 지원한다. 다만 우분투 서버 18.04 ~ 18.04.2 버전에 기본 탑재된 OpenSSL은 1.1.0g 버전이기 때문에, 자신의 시스템에 설치된 OpenSSL의 버전을 확인한 후 1.1.1 미만의 버전이라면 1.1.1 이상의 버전으로 업그레이드해야 TLS 1.3을 이용할 수 있다.

    openssl version

    이 명령으로 현재 시스템의 OpenSSL 버전을 확인한다. 1.1.1 미만의 버전이라면 아래의 절차대로 업그레이드 한다.

    sudo apt update
    
    sudo apt install --only-upgrade openssl
    

    패키지 저장소 정보를 업데이트하고, openssl을 업그레이드 한다. 위의 openssl 개별 업그레이드 명령 대신에 sudo apt upgrade 명령으로 시스템의 모든 패키지 전체를 업그레이드 할 수도 있다. 업그레이드가 완료되면 openssl version 명령으로 업그레이드된 OpenSSL의 버전이 1.1.1 이상인지 확인해본다.

    Nginx 설정

    sudo nano /etc/nginx/sites-available/cloud.example.com

    cloud.example.com의 서버 블록 파일을 nano 편집기로 새로 생성한다. 구분하기 쉽도록 서버 블록 파일 이름을 cloud.example.com 도메인 이름 그대로 사용했다.

    upstream php-handler {
    	server unix:/var/run/php/php7.2-fpm.sock;
    }
    
    server {
    	listen 80;
    
    	server_name cloud.example.com;
    
    	return 301 https://$server_name$request_uri;
    }
    
    server {
    	listen 443 ssl http2;
    
    	server_name cloud.example.com;
    
    	root /var/www/nextcloud/;
    
    	ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    	ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    	ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
    	ssl_dhparam /etc/ssl/certs/dhparam.pem;
    
    	ssl_protocols TLSv1.2 TLSv1.3;
    	ssl_prefer_server_ciphers on;
    	ssl_ciphers TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256;
    	ssl_ecdh_curve secp384r1;
    	ssl_session_timeout 10m;
    	ssl_session_cache shared:SSL:10m;
    	ssl_session_tickets off;
    	ssl_stapling on;
    	ssl_stapling_verify on;
    	resolver 1.1.1.1 1.0.0.1 valid=300s;
    	resolver_timeout 5s;
    
    	add_header Strict-Transport-Security max-age=31536000;
    	add_header X-Content-Type-Options nosniff;
    	add_header X-XSS-Protection "1; mode=block";
    	add_header X-Robots-Tag none;
    	add_header X-Download-Options noopen;
    	add_header X-Permitted-Cross-Domain-Policies none;
    	add_header Referrer-Policy no-referrer;
    
    	fastcgi_hide_header X-Powered-By;
    
    	location = /robots.txt {
    		allow all;
    		log_not_found off;
    		access_log off;
    	}
    
    	location = /.well-known/carddav {
    		return 301 $scheme://$host/remote.php/dav;
    	}
    
    	location = /.well-known/caldav {
    		return 301 $scheme://$host/remote.php/dav;
    	}
    
    	client_max_body_size 65600M;
    	fastcgi_buffers 64 4K;
    
    	gzip on;
    	gzip_vary on;
    	gzip_comp_level 4;
    	gzip_min_length 256;
    	gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
    	gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
    
    	location / {
    		rewrite ^ /index.php$request_uri;
    	}
    
    	location ~ ^\/(?:build|tests|config|lib|3rdparty|templates|data)\/ {
    		deny all;
    	}
    
    	location ~ ^\/(?:\.|autotest|occ|issue|indie|db_|console) {
    		deny all;
    	}
    
    	location ~ ^\/(?:index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+)\.php(?:$|\/) {
    		fastcgi_split_path_info ^(.+?\.php)(\/.*|)$;
    		include fastcgi_params;
    		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    		fastcgi_param PATH_INFO $fastcgi_path_info;
    		fastcgi_param HTTPS on;
    		fastcgi_param modHeadersAvailable true;
    		fastcgi_param front_controller_active true;
    		fastcgi_pass php-handler;
    		fastcgi_intercept_errors on;
    		fastcgi_request_buffering off;
    	}
    
    	location ~ ^\/(?:updater|oc[ms]-provider)(?:$|\/) {
    		try_files $uri/ =404;
    		index index.php;
    	}
    
    	location ~ \.(?:css|js|woff2?|svg|gif|map)$ {
    		try_files $uri /index.php$request_uri;
    		add_header Cache-Control "public, max-age=15778463";
    		add_header Strict-Transport-Security max-age=31536000;
    		add_header X-Content-Type-Options nosniff;
    		add_header X-XSS-Protection "1; mode=block";
    		add_header X-Robots-Tag none;
    		add_header X-Download-Options noopen;
    		add_header X-Permitted-Cross-Domain-Policies none;
    		add_header Referrer-Policy no-referrer;
    		access_log off;
    	}
    
    	location ~ \.(?:png|html|ttf|ico|jpg|jpeg)$ {
    		try_files $uri /index.php$request_uri;
    		access_log off;
    	}
    }
    

    빨간색 부분을 자신의 것으로 변경해야 함을 유의하면서, 서버 블록 내용을 위와 같이 작성한다. ssl_certificatessl_certificate_keyssl_trusted_certificate에는 앞서 발급받은 TLS 인증서 파일의 경로가 들어가고, ssl_dhparam에는 DH Param 키의 경로가 들어간다. client_max_body_size 의 값은 앞서 php 설정에서 post_max_size 항목에 지정한 값으로 맞춰준다.

    작성이 끝났으면 Ctrl키와 x키를 동시에 눌러서 nano 편집기를 빠져나오면서 저장한다.

    sudo ln -s /etc/nginx/sites-available/cloud.example.com /etc/nginx/sites-enabled/

    작성한 서버 블록을 작동시키기 위해 /etc/nginx/sites-enabled/ 경로에 심볼릭 링크를 만들어준다.

    만일 이런 서버 블록을 여러 개 생성해서 다수의 웹사이트를 운영한다면 도메인 처리를 원활하게 하기 위해 Nginx 설정 파일 nginx.conf에 아래의 설정을 추가한다.

    sudo nano /etc/nginx/nginx.conf

    Nginx 설정 파일인 nginx.conf 파일을 nano 편집기로 연다.

    server_names_hash_bucket_size 64;

    server_names_hash_bucket_size 64;를 찾아서 앞에 주석 #을 제거하고, Ctrl키와 x키를 동시에 눌러서 nano 편집기를 빠져나오면서 저장한다. 이미 처리되어 있다면 그대로 nano 편집기를 빠져나온다.

    이상으로 서버 블록 설정이 끝났으면, 설정한 서버 블록이 Nginx에 반영되도록 아래와 같이 Nginx를 재시작한다.

    sudo nginx -t

    Nginx 설정에 기본적인 문법 오류가 없는지 점검한다. 오류가 없다면
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    이런 메시지가 출력된다. 만일 다른 메시지가 나온다면 메시지를 참고해서 설정 사항을 점검한다.

    sudo systemctl restart nginx

    오류가 없으면 Nginx를 재시작한다.

    Nextcloud 설치

    웹 브라우저로 cloud.example.com 주소에 접속하면 아래와 같은 설치 화면이 나타난다.

    Username   넥스트 클라우드 관리자의 ID를 결정해서 입력한다.
    Password   넥스트 클라우드 관리자의 비밀번호를 결정해서 입력한다
    Data folder   앞서 생성한 데이터 디렉토리를 입력한다. (여기서는 /home/Nextcloud)
    Database user   앞서 생성한 데이터베이스의 사용자 이름을 입력한다. (여기서는 ncuser)
    Database password   앞서 생성한 데이터베이스 사용자의 비밀번호를 입력한다.
    Database name   앞서 생성한 데이터베이스 이름을 입력한다. (여기서는 nextcloud)
    localhost   localhost가 입력된 그대로 놔둔다.

    입력할 내용을 정확하게 작성하고 Finish setup 버튼을 클릭하면 설치가 완료된다. 설치 후 로그인하면 아래와 같은 메인 화면이 나타난다.

    Nextcloud 설치 후 작업

    sudo nano /var/www/nextcloud/.user.ini

    넥스트 클라우드 버전이 15 이하라면 넥스트 클라우드 설치 경로의 .user.ini 파일을 nano 편집기로 열어서 아래의 내용으로 편집한다.

    upload_max_filesize=64G
    post_max_size=65600M
    memory_limit=512M
    mbstring.func_overload=0
    always_populate_raw_post_data=-1
    default_charset='UTF-8'
    output_buffering=0
    

    upload_max_filesize, post_max_size, memory_limit 항목을 앞서 php 설정에서 지정한 내용과 동일하게 맞춰준다. 넥스트 클라우드 16 버전부터는 이것을 설정할 필요가 없다. 편집을 완료했으면 Ctrl키와 x키를 동시에 눌러서 nano 편집기를 빠져나오면서 저장한다.

    sudo nano /var/www/nextcloud/config/config.php

    넥스트 클라우드 설치 경로의 config.php 파일을 nano 편집기로 열어서 아래에 빨간색으로 표시된 항목을 추가한다.

    <?php
    $CONFIG = array (
      'instanceid' => 'oc3acz5753ze',
      'passwordsalt' => 'Rx/otl70yb/Kz8uUHCNQ/f2rKH/ZTNd',
      'secret' => '+H0N+qtW03y5/eCVOuYtHVcUje/fGIGhKMHGh4Ct2SN2IVmw',
      'trusted_domains' =>
      array (
        0 => 'cloud.example.com',
      ),
      'datadirectory' => '/home/Nextcloud',
      'dbtype' => 'mysql',
      'version' => '16.0.2.1',
      'overwrite.cli.url' => 'https://cloud.example.com',
      'dbname' => 'nextcloud',
      'dbhost' => 'localhost',
      'dbport' => '',
      'dbtableprefix' => 'oc_',
      'mysql.utf8mb4' => true,
      'dbuser' => 'ncuser',
      'dbpassword' => 'ncuserpassword',
      'installed' => true,
      'memcache.local' => '\OC\Memcache\APCu',
      'memcache.distributed' => '\OC\Memcache\Redis',
      'memcache.locking' => '\OC\Memcache\Redis',
      'redis' => [
        'host'     => '/var/run/redis/redis-server.sock',
        'port'     => 0,
        'timeout'  => 0.0,
      ],
    );
    

    memcache 항목들은 캐시 종류별로 적합한 캐싱 방식을 지정하는 것이고, redis 항목은 Redis와 넥스트 클라우드를 연결하는 설정이다.

    만일 넥스트 클라우드에 로그인 할 때 긴 딜레이가 발생한다면 이는 대부분의 경우 무작위 접속 공격을 막기 위한 brute force protection 기능 때문인데, 이 brute force protection 기능을 끄고 싶다면 'auth.bruteforce.protection.enabled' => false, 코드를 추가한다.

    이밖에 다른 항목들은 시스템에 따라 위의 예시와는 다른 내용으로 나타날 수 있다. 편집을 완료했으면 Ctrl키와 x키를 동시에 눌러서 nano 편집기를 빠져나오면서 저장한다.

    sudo systemctl restart nginx

    설정한 내용이 반영되도록 Nginx를 재시작한다.

    Nextcloud 설정

    웹 브라우저로 cloud.example.com 에 접속해서 로그인한 다음, 우측 상단의 톱니바퀴 모양 또는 동그라미 모양의 버튼을 클릭하면 설정 메뉴가 나타난다. Settings는 넥스트 클라우드 전반을 설정하는 메뉴이고, Apps는 넥스트 클라우드에 추가로 설치할 수 있는 앱을 관리하는 메뉴이다. Users에서는 넥스트 클라우드에 접속하는 계정을 관리할 수 있다.

    한국어 설정

    Settings 화면에서 좌측 패널의 Personal info를 클릭하면 우측에 나타나는 항목 중에서, Language에서 한국어를 선택하면 대부분의 내용이 한국어로 번역된 환경을 사용할 수 있다.

    설치 상태 확인

    설정 화면에서 좌측 패널의 관리 영역에 있는 Overview를 클릭하면 오른쪽에 보안 및 설치 경고 항목에서 현재 넥스트 클라우드의 상태를 자동으로 확인하고 그 내용을 출력해준다. 모든 검사를 통과했습니다. 라는 메시지가 표시되지 않으면 화면에 출력된 내용을 참고해서 적절히 수정해준다. 만일 occ db:convert-filecache-bigint 등의 Nextcloud 자체 명령어를 실행하라는 내용이 출력되면 아래의 절차대로 실행한다.

    cd /var/www/nextcloud
    sudo -u www-data php occ db:convert-filecache-bigint
    

    넥스트 클라우드가 설치된 디렉토리로 이동한 다음, 위의 형식으로 명령어를 실행한다.

    업데이트

    설정 화면에서 좌측 패널의 Overview를 클릭하면 오른쪽에 넥스트 클라우드의 현재 버전이 표시되고, 새로운 버전이 출시되면 버그 점검 등의 테스트를 거친 뒤에 순차적으로 업데이트가 가능하게 된다. 만일 업데이트가 가능해질 때까지 기다리지 않고 새로운 버전 출시 직후에 곧바로 업데이트하려면 업데이트 채널beta로 변경하고 웹페이지를 새로 고침한 다음에 업데이트를 진행하면 된다. 업데이트 이후에 넥스트 클라우드 설정 파일 /var/www/nextcloud/.user.ini 가 초기화되는 경우가 있는데, 넥스트 클라우드 버전이 15 이하라면 앞서 설명한 Nextcloud 설치 후 작업을 참고해서 확인 후 재설정해준다.

    배경 작업 변경

    설정 화면에서 좌측 패널의 기본 설정를 클릭하면 오른쪽에 배경 작업 항목이 나타난다. 파일 확인, 캐싱 등의 백그라운드 작업을 어떤 방식으로 진행할 것인지를 선택하는 항목인데, 기본 설정은 AJAX로 각 사용자가 파일에 접근할 때에만 백그라운드 작업을 실행하는 방식이다. 보다 좋은 성능을 위해서는 우분투 시스템에서 주기적으로 백그라운드 작업을 진행하는 Cron 방식으로 변경하기를 권장하는데, Cron 방식으로 변경하려면 이 화면에서 Cron을 선택한 다음에, 우분투 서버의 crontab에 아래와 같이 작업 스케줄을 추가한다.

    sudo crontab -u www-data -e

    우분투 서버의 작업 스케줄러 crontab을 www-data 사용자로 연다. 만일 어떤 편집기를 사용하겠냐고 물어오면 nano 편집기를 뜻하는 숫자를 입력한다.

    */5 * * * * php -f /var/www/nextcloud/cron.php > /dev/null 2>&1

    넥스트 클라우드가 설치된 경로의 cron.php 파일을 5분마다 실행하는 내용의 위의 명령을 기록하고, Ctrl 카와 x 키를 동시에 눌러서 nano 편집기를 빠져나오면서 저장한다.

    외부 저장소 연결

    우측 상단의 메뉴를 클릭해서 앱 관리 화면으로 들어가면 좌측 패널의 내 앱 메뉴에서 현재 넥스트 클라우드에 설치된 앱들을 확인할 수 있다. 이 중에서 External storage support사용함을 클릭해서 활성화하면 넥스트 클라우드에 외부 저장소를 연결할 수 있다. 활성화하고 다시 우측 상단의 메뉴를 클릭해서 설정 화면으로 넘어가 보면 좌측 패널의 개인 영역과 관리 영역에 각각 외부 저장소 메뉴가 생성된 것이 보인다. 관리 영역의 외부 저장소 메뉴를 클릭하면 여러 가지 외부 데이터 위치를 연결할 수 있는 설정 화면이 나타난다. 저장소 추가 항목을 클릭하면 Amazon S3, FTP, Nextcloud, OpenStack, SFTP, SMB/CIFS, WebDAV, 로컬 경로를 연결할 수 있다.  

    예를 들어 앞선 글 네트워크 파일 공유: SMB에서 설정한 SMB 디렉토리를 연결한다면, 저장소 추가에서 SMB/CIFS를 선택하고, 폴더 이름에 이 SMB 디렉토리가 넥스트 클라우드 상에서 보여질 이름을 결정한다. 인증사용자 이름과 암호를 선택하고, 호스트localhost, 공유에 SMB 설정 파일 /etc/samba/smb.conf에 대괄호 [ ] 안에 기재한 내용, 도메인우분투 서버를 설치할 때 결정한 서버의 호스트 네임을 입력한다. 서버의 호스트 네임은 우분투 서버 상에서 hostnamectl 명령을 실행하면 Static hostname 항목에서도 확인할 수 있다. 사용자 이름암호에 SMB 접속 정보를 넣고, 다음으로 사용 가능에서 이 SMB 디렉토리를 사용할 수 있는 넥스트 클라우드 사용자를 선택한다. 3개의 점 모양의 버튼을 클릭하면 외부와 공유할 수 있게 할 것인지 등을 설정할 수 있고, 체크 표시 모양의 버튼을 클릭하면 설정이 완료된다. 정상적으로 연결되었으면 폴더 이름 앞쪽에 녹색 동그라미가 표시된다. 이제 넥스트 클라우드 메인 화면에 가보면 SMB 디렉토리에 접근할 수 있게 되어 있다.

    2단계 인증

    앱 관리 화면의 왼쪽 패널에는 추가로 설치할 수 있는 여러 가지 앱들의 카테고리가 있다. 보안 카테고리에서 Two Factor TOTP Provider (공식)을 활성화하면 넥스트 클라우드에 로그인할 때 2단계 인증을 사용할 수 있다. 활성화했으면 우측 상단 메뉴를 클릭해서 설정 화면으로 넘어와서, 좌측 패널의 개인 영역에서 보안을 클릭하면 오른쪽에 TOTP (Authenticator app) 항목이 생성된 것을 볼 수 있다. Enable TOTP을 클릭하면 구글 Authenticator 등의 OTP를 이용한 2단계 인증을 설정할 수 있다.

    추가 앱: ONLYOFFICE

    온라인 오피스 프로그램인 ONLYOFFICE를 우분투 서버에 설치하고 넥스트 클라우드에 ONLYOFFICE 앱을 활성화하면 넥스트 클라우드 상에서 바로 .doc 등의 오피스 문서를 작성할 수 있다. ONLYOFFICE 이외에 Collabora Online 등을 설치할 수도 있지만 ONLYOFFICE의 성능이 더 뛰어나고 문서 작성 이외에도 더 많은 일을 할 수 있다. ONLYOFFICE 설치 방법은 다음 글 온라인 오피스: Onlyoffice 에서 다룬다.

    데스크톱 및 모바일 앱

    넥스트 클라우드는 데스크톱 클라이언트 프로그램과 모바일 앱을 제공한다. 윈도우 PC, Mac, 리눅스, iOS, 안드로이드 등을 지원하고, 앱에서 넥스트 클라우드의 파일을 사용하고 업로드/다운로드 할 수 있다. 모바일 앱에는 촬영한 사진을 자동으로 넥스트 클라우드에 업로드하는 기능도 있다. 데스크톱 컴퓨터에 클라이언트 프로그램을 설치하면 PC나 Mac과 넥스트 클라우드의 데이터를 동기화할 수도 있다.

     

    본 글의 저작권은 작성자 Varins에게 있습니다.
    Varins의 사전 서면 동의 없이는 본 글의 전부 또는 일부를 무단으로 전재, 게시, 배포하는 것을 금지합니다.
    

Leave a comment

댓글은 관리자의 승인 이후에 게시됩니다.