본문 바로가기
Linux/RaspberryPi Server

[NextCloud] Media Server 구축

by 暻煥 2025. 10. 9.

.

Next Cloud 라는 Open Source를 이용해서 개인 서버를 구축한다.

목적은 "외부망 및 내부망에서 브라우저를 이용하여 파일 탐색 가능한" 서비스를 라즈베리 파이에 설치하는 것이다.

 


 

먼저 apache 설치한다.

sudo apt install apache2
sudo apt install mariadb-server

 

 

설치가 완료되면, 라즈베리 파이의 IP 주소를 브라우저 창에 입력해서 정상 동작 확인 가능하다.

 

다음으로는 php를 설치한다.

sudo apt install php php-gd php-mysql php-curl php-zip php-xml php-mbstring php-bz2 php-intl php-imagick php-gmp libapache2-mod-php -y
sudo apt install php-cli php-mysqlnd php-xml php-bcmath -y

 

 apache 재시작 한다.

sudo service apache2 restart

 

MySQL cmdline tool 실행한다.

sudo mysql -u root -p

 

DB를 생성한다.

CREATE DATABASE nextclouddb;

 

DB에 접근 가능한 user를 생성한다. ( __password__ 부분은 사용할 비밀번호를 입력한다.)

CREATE USER 'nextclouduser'@'localhost' IDENTIFIED BY '__password__';

 

DB에 접근 권한을 부여한다.

GRANT ALL PRIVILEGES ON nextclouddb.* TO 'nextclouduser'@'localhost';

 

권한 테이블을 flush하고, MariaDB를 종료한다.

FLUSH PRIVILEGES;
exit;

 


이제 Next Cloud를 설치한다.

먼저 html directory로 이동한다.

cd /var/www/

 

최신 Next Cloud Server를 다운로드 한다.

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

 

압축을 해제한다.

sudo tar -xvf latest.tar.bz2

 

NextCloud가 동작하기 위한 data 폴더를 생성한다.

sudo mkdir -p /var/www/nextcloud/data

 

Owner 정보를 설정한다. (NextCloud 동작을 수행하는 계정 이름은 www-data 이다.)

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

 

권한 정보를 설정한다.

sudo chmod 750 /var/www/nextcloud/data

 

텍스트 편집기를 열어서 설정 파일을 생성 및 수정한다.

sudo vim /etc/apache2/sites-available/nextcloud.conf
Alias /nextcloud "/var/www/nextcloud/"

<Directory /var/www/nextcloud/>
  Require all granted
  AllowOverride All
  Options FollowSymLinks MultiViews

  <IfModule mod_dav.c>
    Dav off
  </IfModule>

</Directory>

 

이제 apache에게 설정이 변경되었다고 전달한다.

sudo a2ensite nextcloud.conf

 

apache를 재실행 한다.

sudo systemctl reload apache2

 

이제 동작확인을 위해서 라즈베리 파이 IP를 이용해 접속한다.

예를 들어, "http://123.456.789.123/nextcloud/"와 같은 형식의 주소를 브라우저에 입력하면, 접속이 가능하다.

 

정상 동작이 되면, 초기 관리자 계정 설정이 진행되고,

몇가지 설명서가 들어있는 파일을 조회할 수 있다.

 


넉넉한 저장 공간을 확보하기 위해서 외부 Disk에서 구동하도록 한다.

아래 예시에서 Disk 이름은 "T7" 이다.

 

먼저 disk의 mount 위치를 /mnt/ 경로로 변경하기 위해 폴더를 생성한다.

(기존의 mount 되어진 위치가 있다면 해제한다.)

sudo umount /media/sagik1123/T7
sudo mkdir -p /mnt/T7

 

www-data의 계정의 UID 및 GID를 확인한다. (확인결과: 33)

id www-data
uid=33(www-data) gid=33(www-data) groups=33(www-data)

 

T7의 block id 또한 확인한다. (확인결과: UUID 항목)

sudo blkid -o list
device                             fs_type      label         mount point                            UUID
-----------------------------------------------------------------------------------------------------------------------------------------
/dev/mmcblk0p1                     vfat         bootfs        /boot/firmware                         F737-8E10
/dev/mmcblk0p2                     ext4         rootfs        /                                      d6ecfcd5-2703-41bf-9301-10c403b6fb0c
/dev/sda1                          ext4         T7            (not mounted)                          c7648f94-8725-4ea6-a24e-415c613baad6

 

외장하드가 sda1로 인식되어 있는 상태라면, 아래 처럼 mount 및 권한 설정을 한다.

sudo mount /dev/sda1 /mnt/T7
sudo chown -R 33:33 /mnt/T7/

 

다음 부터는 지정된 경로에 자동으로 mount 되도록 /etc/fstab을 수정한다.

sudo cat /etc/fstab
proc            /proc           proc    defaults          0       0
PARTUUID=07ab6e65-01  /boot/firmware  vfat    defaults          0       2
PARTUUID=07ab6e65-02  /               ext4    defaults,noatime  0       1
UUID=c7648f94-8725-4ea6-a24e-415c613baad6 /mnt/T7 ext4 defaults 0 2
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that

정상적으로 mount 되는지 아래의 명령어로 테스트 한다.

mount -a

 


이제 NextCloud DB를 외부 Disk로 옮긴다.

cd /mnt/T7/
mkdir -p nextcloud
sudo mv -v /var/www/nextcloud/data/ ./nextcloud/data/

 

새로운 경로를 사용하도록 설정 파일을 수정한다.

경로를 먼저 이동하고,

cd /var/www/nextcloud/config/

 

설정 파일을 백업한다.

sudo cp config.php  config.php.bk

 

설정 파일을 수정한다.

"datadirectory" 항목을 추가 및 변경한다.

sudo vim config.php
'datadirectory' => '/media/sagik1123/T7/nextcloud/data'

 

외장 Disk의 권한을 설정한다.

sudo chown -R www-data:www-data /mnt/T7/nextcloud/data/

 

권한이 제대로 부여됬는지 테스트 한다.

sudo -u www-data touch /mnt/T7/nextcloud/data/testfile

 


최대 업로드 사이즈를 수정한다.

즉, 파일 하나의 크기가 최대 2GB로 지정한다.

 

편집기로 php.ini 파일을 수정한다.

sudo vim /etc/php/8.2/apache2/php.ini

 

아래 2개 항목을 찾아서 수정한다.

post_max_size = 2048M
upload_max_filesize = 2048M

 

apache를 재시작 한다.

sudo service apache2 restart

 


다음으로는 HTTPS 접근이 가능하도록 SSL 설정한다.

이를 위해서는 self-signed certificate 생성이 필요하다.

 

먼저 인증서를 저장할 폴더를 만들고

sudo mkdir -p /etc/apache2/ssl

 

인증서를 생성한다. (유효기간은 10년으로 지정했다.)

sudo openssl req -x509 -nodes -days 3650 -newkey rsa:4096 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.crt

 

이후 여러가지를 물어보는데, 특별한 보안 설정을 추가하지 않는다면 ENTER를 연타한다.

Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:

 

이제 apache가 SSL을 사용하도록 한다.

sudo a2enmod ssl

 

설정 파일을 열어서 인증서를 지정한다.

sudo vim /etc/apache2/sites-available/default-ssl.conf

 

아래 2개 항목을 수정한다.

        SSLCertificateFile      /etc/apache2/ssl/apache.crt
        SSLCertificateKeyFile   /etc/apache2/ssl/apache.key

 

apache를 재시작 한다.

sudo a2ensite default-ssl.conf
sudo service apache2 restart

 

이제 https로 접속이 가능하다. (초기 접속시에는 경고창이 표시된다.)

 


스마트폰을 이용한 외부 접속을 위해서는 포트 포워딩이 필요하다.

공유기 설정에 접속해서 80 및 443 포트를 라즈베리 파이 IP에 포워딩 한다.

 


스마트폰의 Store에서 Next Cloud APP을 설치하면,

이제 외부 접속이 가능하다.

.

 


※ 참고 및 출처

 

https://pimylifeup.com/raspberry-pi-nextcloud-server/

 

How to Setup a Raspberry Pi Nextcloud Server

Build your own private file server.

pimylifeup.com

https://docs.nextcloud.com/server/latest/admin_manual/installation/source_installation.html

 

Installation on Linux — Nextcloud latest Administration Manual latest documentation

There are multiple ways of installing Nextcloud depending on your preferences, requirements and goals. In case you prefer installing from the source tarball, you can setup Nextcloud from scratch using a classic LAMP stack (Linux, Apache, MySQL/MariaDB, PHP

docs.nextcloud.com

                          


※ 별첨 #1.

 

만약, http 접속은 불가능 하게 하고, https 접속만 허용하고 싶다면 아래 방법을 사용한다.

 

설정 파일을 수정하고.

sudo vim /etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
   ServerAdmin <EMAIL>
RewriteEngine On
   RewriteCond %{HTTPS} off
   RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
</VirtualHost>

 

apache를 재시작 한다.

sudo a2enmod rewrite
sudo service apache2 restart

※ 별첨 #2.

 

webui가 말고 다른 경로( samba 등)를 이용해서 파일을 조작하는 경우, 아래 명령어를 통해서 nextcloud에게 파일이 수정되었음을 알려주어야 한다.

sudo -u www-data php /var/www/nextcloud/occ -vvv files:scan --all

 


※ 별첨 #3.

 

만약 "File Locked Error" 발생하는 경우,

Starting scan for user 1 out of 1 (sagik1123)

In Common.php line 642:

  "files/d6042cf71cfba87dc4216110ed25cf14"("files_trashbin/files/abc.mp4.d1750950568") is locked

 

잠시만 file lock 기능을 해제하면 높은 확률로 해결 가능하다.

sudo vim /var/www/nextcloud/config/config.php
  'filelocking.enabled' => false,

 


※ 별첨 #4.

 

매일 새벽 5시에 전체 파일 정보를 자동으로 갱신하고자 한다면,

crontab 기능을 이용한다.

sudo crontab -u www-data -e
no crontab for www-data - using an empty one

Select an editor.  To change later, run 'select-editor'.
  1. /usr/bin/vim.gtk3
  2. /bin/nano        <---- easiest
  3. /usr/bin/vim.basic
  4. /usr/bin/vim.tiny
  5. /bin/ed

Choose 1-5 [2]: 1

 

아래와 같이 추가한다.

0 5 * * * /usr/bin/php /var/www/nextcloud/occ -vvv files:scan --all >> /mnt/T7/nextcloud-scan.log 2>&1

 


※ 별첨 #5.

 

사용하다보면 원하는 사진을 찾는데 너무 오래 걸려 답답할때가 있다.

이럴 때는 썸네일을 미리 생성해 놓으면 빠르게 스크롤 하면서 찾을 수 있다.

 

APP Discover에서 "Preview Generator"를 설치한다.

 

아래 명령어를 실행하면, 모든 파일에 대해서 썸네일(미리보기)을 생성한다.

sudo -u www-data php /var/www/nextcloud/occ preview:generate-all -vvv

 

만약 매일 새벽6시에 자동으로 실행되기를 원한다면, crontab 기능을 활용한다.

sudo crontab -u www-data -e

 

아래와 같이 추가한다.

0 6 * * * /usr/bin/php /var/www/nextcloud/occ preview:generate-all -vvv >> /mnt/T7/nextcloud-scan.log 2>&1

.