Computer Tips - Research

Nextcloud 설치, Owncloud -> Nextcloud migration

Owncloud 를 개인 클라우드로 사용하고 있었습니다. 뉴스에 PHP 보안 경고가 나오네요. 서버의 default PHP version 은 8.3.x 이니 그냥 update 를 하면 그만인데… Owncloud ver 10.x 는 PHP 7.3 을 사용해야 합니다. 당장 큰일 안나니까 놔두자… 는 안전 불감증이 될 것이고, 어떻게 해야 하는데… 몇가지 선택지가 있더군요.

  1. Owncloud classic 11.x 로 업그레이드
  2. Owncloud Infinity Scale (oCIS) 로 재설치
  3. Nextcloud 로 migration

1번이 제일 만만해 보여서 하려고 했더니만 뭐가 꼬여서 그러는지 업그레이드 잘 안됩니다. 이럴 거면 아예 첨부터 새로 설치다… 하면 1번을 하느니 (Owncloud classic 더 이상 update 가 아마 안되겠지요?) 아예 확실하고 장기적인 해결책으로 2번 아니면 3번인데… 2번은 PHP 가 아니라 Go 로 완전히 새로 만들어진 앱이네요. 쌈빡해 보이는데 기존의 Owncloud classic 과는 완전히 달라서 어떻게 해야 할지가 좀 엄두가… 그래서 PHP 를 사용하고 Owncloud 와 매우 유사한 구조이며 잘 업데이트가 되고 있는 걸로 보이는 Nextcloud 로 갈아타기로 했습니다. 그나마 제일 할만해 보여서 하는 건데 그래도 역시 상당한 삽질이 필요합니다. ^^;;;

상당 부분은 https://rafftechnologies.com/learn/tutorials/install-nextcloud-ubuntu-24-04 를 참고로 하고 그때 그때 Gemini 의 도움도 받아가면서 어찌어찌 성공하였습니다. 과정을 대충 적어봅니다.

Owncloud 가 돌아가고 있고 지금 이 블로그는 WordPress 에서 돌아가는 거라 PHP 8.3 이 이미 default 이고, Apache, MySQL 등과 기타 필요한 모듈들은 다 있는 상황이라 새로 설치가 필요 없었구요.

#! /bin/bash
sudo tee /etc/mysql/mariadb.conf.d/60-nextcloud.cnf > /dev/null <<'EOF'
[mysqld] 
transaction-isolation = READ-COMMITTED
binlog_format = ROW
innodb_file_per_table = 1
EOF

sudo systemctl restart mysql

mysql>
CREATE DATABASE IF NOT EXISTS nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE USER IF NOT EXISTS 'nextclouduser'@'localhost' IDENTIFIED BY 'REPLACE_WITH_A_STRONG_DATABASE_PASSWORD';
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextclouduser'@'localhost';
FLUSH PRIVILEGES;

# 확인
SHOW DATABASES LIKE 'nextcloud';
SELECT User, Host FROM mysql.user WHERE User='nextclouduser';

#! /bin/bash
curl -fLO https://download.nextcloud.com/server/releases/latest-34.tar.bz2
curl -fsSLo latest-34.tar.bz2.sha256 \
  https://download.nextcloud.com/server/releases/latest-34.tar.bz2.sha256

EXPECTED_SHA256="$(awk '{print $1}' latest-34.tar.bz2.sha256 | head -n 1)"
ACTUAL_SHA256="$(sha256sum latest-34.tar.bz2 | awk '{print $1}')"

test "$EXPECTED_SHA256" = "$ACTUAL_SHA256" \
  && echo "Nextcloud checksum OK" \
  || { echo "Checksum mismatch"; exit 1; }

test ! -e /var/www/nextcloud && echo "Install path is clear"

tar -xjf latest-34.tar.bz2
sudo mv nextcloud /var/www/nextcloud

sudo mkdir -p /var/nextcloud-data    # web root dir 밖에 데이터 디렉토리를 설치하는 게 안전하다네
sudo chown -R www-data:www-data /var/www/nextcloud /var/nextcloud-data

# PHP config 사실 정확히 다 이해 못하고 하라는대로... ;;;

PHP_INI="/etc/php/8.3/apache2/php.ini"

sudo sed -i 's/^memory_limit = .*/memory_limit = 512M/' "$PHP_INI"
sudo sed -i 's/^upload_max_filesize = .*/upload_max_filesize = 512M/' "$PHP_INI"
sudo sed -i 's/^post_max_size = .*/post_max_size = 512M/' "$PHP_INI"
sudo sed -i 's/^max_execution_time = .*/max_execution_time = 360/' "$PHP_INI"
sudo sed -i 's/^max_input_time = .*/max_input_time = 360/' "$PHP_INI"

# Give APCu a 128 MB cache allocation and enable APCu for CLI commands used by occ:
sudo tee /etc/php/8.3/apache2/conf.d/99-nextcloud-apcu.ini > /dev/null <<'EOF'
apc.shm_size=128M
EOF

sudo tee /etc/php/8.3/cli/conf.d/99-nextcloud-apcu.ini > /dev/null <<'EOF'
apc.enable_cli=1
EOF

sudo systemctl restart apache2

# Apache config
sudo tee /etc/apache2/sites-available/nextcloud.conf > /dev/null <<'EOF'
<VirtualHost *:80>
    ServerName cloud.your-domain.com
    DocumentRoot /var/www/nextcloud

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

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

    SetEnv HOME /var/www/nextcloud
    SetEnv HTTP_HOME /var/www/nextcloud

    ErrorLog ${APACHE_LOG_DIR}/nextcloud_error.log
    CustomLog ${APACHE_LOG_DIR}/nextcloud_access.log combined
</VirtualHost>
EOF

sudo a2ensite nextcloud.conf
sudo a2dissite 000-default.conf
sudo a2enmod rewrite headers env dir mime ssl setenvif
sudo apache2ctl configtest
sudo systemctl reload apache2

curl -I http://cloud.your-domain.com

# Apache should report Syntax OK, the Nextcloud site should be enabled, and the domain should 
# return an HTTP response from this VM.

# Enable HTTPS with Certbot
sudo apt install --classic certbot
sudo ln -sf /snap/bin/certbot /usr/local/bin/certbot

# Request the certificate and let Certbot configure Apache:
sudo certbot --apache \
  -d cloud.your-domain.com \
  --redirect \
  --agree-tos \
  --no-eff-email \
  -m admin@your-domain.com

# Verify HTTPS and certificate renewal:
curl -I https://cloud.your-domain.com
sudo certbot renew --dry-run

# 이제 web browser 에서 초기 화면이 떠야 함
https://cloud.your-domain.com

# 초기 화면 세팅: 필요에 따라 조정
Data folder: /var/nextcloud-data
Database user: nextclouduser
Database password: the password created in Step 4
Database name: nextcloud
Database host: localhost

일단 여기까지 하면 Nextcloud 는 우선 돌아갑니다. Owncloud 에 상당히 큰 용량의 파일들이 올려져 있으므로 이를 migration 해야 합니다.

#! /bin/bash
sudo -u www-data php /path/to/nextcloud/occ maintenance:mode --on

# Owncloud 파일을 Nextcloud data 디렉토리로 복사
sudo cp -r /var/www/owncloud/data/[사용자ID]/files/* /var/nextcloud_data/[사용자ID]/files/
#*/ cp 로 복사하려는 시도가 왠지 잘 안되고, 파일들이 너무 크기도 해서 rsync 사용이 나을 듯
# 이렇게 하면 완벽하게 정확하진 않지만 몇 % 진행되었는지도 보여주고, 혹시 중단되더라도 다시 이어서 할 수 있음

sudo -u www-data rsync -ah --info=progress2 /var/www/owncloud/data/[user id]/files/ \ /var/nextcloud_data/[user id]/files/

# rsync 완료된 후에: 사실 필요 없을 듯한데 확인 차원에서
sudo chown -R www-data:www-data /var/nextcloud_data/[사용자ID]/files/
sudo chmod -R 750 /var/nextcloud_data/[사용자ID]/files/

sudo -u www-data php /path/to/nextcloud/occ maintenance:mode --off
# 이부분이 Gemini 가 잘못 알켜준 것! 맨 나중에 maintenance mode 를 끄라고 알켜주는데,
# Nextcloud is in maintenance mode, only AppAPI commands are loaded.
# Commands provided by other apps are unavailable. 
# There are no commands defined in the "files" namespace.
# 이런 에러가 뜸. 그래서 먼저 maintenance mode off 한 후에 scan 을 해야 정상 작동

sudo -u www-data php /path/to/nextcloud/occ files:scan [사용자ID]
# 또는 모든 사용자를 한 번에 스캔할 경우
sudo -u www-data php /path/to/nextcloud/occ files:scan --all
# 용량이 크면 시간이 좀 오래 걸림. Backgroud task 로 걸어 놓고 다음 날 봤더니 스캔 완료

이제 웹에서 접속해보면 정상적으로 파일들이 보임. 삽질 끝!

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다