# 문제해결

# Redis : AOF 관련 오류 및 504 timeout

디스크가 SSD가 아닌 경우 AOF 쓰기작업 디스크가 느려서 발생 하며, 주로 발생되는 증상은 한꺼번에 많은 파일을 동기화하는 과정에서 504 timeout이 나오는 증상이 발생 합니다.

<p class="callout warning">Asynchronous AOF fsync is taking too long (disk is busy?).  
Writing the AOF buffer without waiting for fsync to complete, this may slow down Redis.  
</p>

```shell
 docker run --name redis \
     -p 6379:6379 \
     -v /volume1/docker/redis/data:/data \
     -e TZ=Asia/Seoul \
     -d redis:latest redis-server --appendonly yes --appendfsync no
```

이 경우 Redis Container 설치 시 "--appendfsync no" 옵션을 넣어 줍니다.

# 외부 저장소 추가 시 "Entry .... will not be accessible due to incompatible encoding" 문제

외부 저장소 추가 후 "occ files:scan" 동작시 "Entry .... will not be accessible due to incompatible encoding" error가 발생 되고,

자료 추가가 실패할 수 있습니다.

이 관련 문제는 외부 저장소의 Source단의 한글이나 특수문자로된 폴더/파일명 문제 입니다.

아래의 명령으로 문제가 되는 문자열을 utf-8로 일괄 변경 가능 합니다.

```shell
 ./convmv -f utf-8 -t utf-8 -r --notest --nfc <nextcloud-data-folder> 
```

<p class="callout success">Portainer &gt; nextcloud 콘솔 &gt; occ files:scan --all 재실행</p>

 \* convmv가 없어 실행 불가 시 "wget http://www.j3e.de/linux/convmv/convmv-2.05.tar.gz"으로 받아  
 "tar xzvf convmv-2.05.tar.gz"로 압축해제 후 실행 하시면 됩니다.

# "/.well-known/" 관련 문제

<p class="callout warning">**\[보안 및 설치 경고\]**  
  
설정을 살펴본 결과 몇 가지 경고할 것이 있습니다.  
  
웹 서버에서 "/.well-known/webfinger"을(를) 올바르게 처리할 수 없습니다. 더 많은 정보를 보려면 문서 ↗를 참고하십시오.  
웹 서버에서 "/.well-known/nodeinfo"을(를) 올바르게 처리할 수 없습니다. 더 많은 정보를 보려면 문서 ↗를 참고하십시오.  
웹 서버에서 "/.well-known/caldav"을(를) 올바르게 처리할 수 없습니다. 더 많은 정보를 보려면 문서 ↗를 참고하십시오.  
웹 서버에서 "/.well-known/carddav"을(를) 올바르게 처리할 수 없습니다. 더 많은 정보를 보려면 문서 ↗를 참고하십시오</p>

**\[해결책1\] nginx 설정 수정**

1\. "config &gt; nginx &gt; site-confs"에 들어가면 "default.conf"가 있습니다.

2\. "server { }" 중간에 아래를 추가 합니다. 또는 주석처리가 되어 있으면 주석 "#"를 삭제해 줍니다.

<p class="callout success">add\_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;</p>

3\. 중간에 "location ^~ /.well-known { }" 항목이 있는데 아래 3개 문장을 수정해 줍니다.  
 (경로에 https도메인과 포트 입력이 포인트 입니다.)

<p class="callout success">location = /.well-known/carddav { return 301 <span style="color: rgb(224, 62, 45);">https://도메인:포트</span>/remote.php/dav/; }  
location = /.well-known/caldav { return 301 <span style="color: rgb(224, 62, 45);">https://도메인:포트</span>/remote.php/dav/; }  
return 301 <span style="color: rgb(224, 62, 45);">https://도메인:포트</span>/index.php$request\_uri;</p>

**\[해결책2\] Nginx Proxy Manager을 사용할 경우 (Nginx Proxy Manager의 advanced에 스크립트 추가)**

<p class="callout success">proxy\_set\_header Host $host;  
proxy\_set\_header X-Forwarded-Proto $scheme;  
proxy\_set\_header X-Real-IP $remote\_addr;  
proxy\_set\_header X-Forwarded-For $proxy\_add\_x\_forwarded\_for;  
proxy\_max\_temp\_file\_size 1024k; #옵션  
client\_max\_body\_size 0;  
\#limit\_rate 500k;  
location = /.well-known/webfinger {  
 return 301 <span style="color: rgb(224, 62, 45);">https://도메인</span>/index.php/.well-known/webfinger;  
}  
location = /.well-known/nodeinfo {  
 return 301 <span style="color: rgb(224, 62, 45);">https://도메인</span>/index.php/.well-known/nodeinfo;  
}  
location = /.well-known/carddav {  
 return 301 <span style="color: rgb(224, 62, 45);">https://도메인</span>/remote.php/dav;  
}  
location = /.well-known/caldav {  
 return 301 <span style="color: rgb(224, 62, 45);">https://도메인</span>/remote.php/dav;  
}</p>

# SSL 인증서 오류 (기존 시놀로지 인증서 활용 방법)

SSL 관련 오류를 해결하기 위해서는 SSL 인증서를 설치해 주셔야 합니다.

본 해결 방법은 시놀로지를 사용할 경우 간단히 시놀로지의 인증서를 빼내서 nextcloud에 적용하는 방법입니다.

1\. "시놀로지 제어판 &gt; 보안 &gt; 인증서" 항목에서 기존 보유한 인증서를 선택 후 "인증서 내보내기"를 실행 합니다. (PC로 다운로드)

2\. 압축을 풀고 이 중에서 사용할 인증서는<span style="color: rgb(224, 62, 45);"> "cert.pem"</span>와 <span style="color: rgb(224, 62, 45);">"privkey.pem"</span> 입니다.

3\. nextcloud에 새로운 인증서 생성  
 1) "nextcloud/config" 밑에 "cert" 디렉토리를 생성 합니다.  
 2) cert 디렉토리 밑에 <span style="color: rgb(224, 62, 45);">"cert1.crt"</span> 파일을 생성하고 앞서 다운로드 받은 <span style="color: rgb(224, 62, 45);">"cert.pem"</span> 파일의 내용을 메모장을 열어 복사하고   
 붙여 줍니다.  
 3) cert 디렉토리 밑에 <span style="color: rgb(224, 62, 45);">"cert1.key" </span>파일을 생성하고 앞서 다운로드 받은 <span style="color: rgb(224, 62, 45);">"privkey.pem"</span> 파일의 내용을 메모장을 열어 복사하고   
 붙여 줍니다.

[![cert.png](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/scaled-1680-/cert.png)](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/cert.png)

4\. nextcloud "ngnix &gt; ssl.conf"에 신규 생성한 인증서 정보를 넣어 줍니다.  
 1) 위치는 "config &gt; nginx &gt; ssl.conf " 입니다. (nano 또는 시놀의 텍스트 편집기로 수정을 하시면 됩니다.)  
 2) 아래 두 문장을 주석 처리 합니다.

<p class="callout success"> #ssl\_certificate /config/keys/cert.crt;  
 #ssl\_certificate\_key /config/keys/cert.key;</p>

 3) 앞서 만든 root에 위치한 신규 인증서의 위치를 넣어 줍니다.

<p class="callout success"> ssl\_certificate /config/cert/cert1.crt;  
 ssl\_certificate\_key /config/cert/cert1.key;</p>

5\. Docker Container를 재시작 합니다.

# 로그인 시 IP 관련  오류 해결

<p class="callout warning">사용 중인 ip에서 여러 번의 잘못된 로그인 시도를 감지했습니다. 30초 후에 다시 로그인할 수 있습니다.</p>

이 문제는 로그인 시 Docker 내부가 가상의 ip로 처리를 시도하기 때문입니다.

이 경우 1차로 nextcloud의 관리자에 있는 "앱"에서 <span style="color: rgb(224, 62, 45);">"Brute-force setting"</span>을 <span style="color: rgb(224, 62, 45);">"사용"</span>으로 설정합니다.

[![brute_force.png](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/scaled-1680-/brute-force.png)](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/brute-force.png)

"관리자 설정 &gt; 관리항목"에 있는 <span style="color: rgb(224, 62, 45);">"보안"</span>으로 이동합니다.

1. 무작위 대입 ip 허용목록 (화이트리스트)에 nextcloud 도커에서 사용하는 ip 대역을 넣어줍니다.
2. 보통 Docker의 가상 ip는 "172.x.x.x"로 되어 있는데 portainer나 시놀로지 도커의 네트워크에서 ip 대역을 확인 할 수   
     있습니다.
3. ip는 "172.17.0.0/24"와 같이 맨 뒷자리는 "0"을 넣어주고 "/24"를 넣으면 됩니다.   
     (해당 게이트웨이에 있는 뒷자리 1~255까지의 대역 범위를 주는 의미)

[![brute_force2.png](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/scaled-1680-/brute-force2.png)](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/brute-force2.png)

# "server reached pm.max_children setting" 문제 발생 시

1\. Portainer 또는 다른 방법으로 nextcloud 컨테이너 Console 접속 후 <span style="color: rgb(224, 62, 45);">"/etc/php81/php-fpm.d" </span>경로로 이동 합니다.

2\. "www.conf" 수정를 nano나 vi editor로 아래와 같이 수정해 줍니다.

<p class="callout success">pm.max\_children = 128  
pm.start\_servers = 32  
pm.min\_spare\_servers = 32  
pm.max\_spare\_servers = 96</p>

# "X-Robots-Tag" HTTP 헤더 문제 발생 시

<p class="callout warning">"X-Robots-Tag" HTTP 헤더가 "noindex, nofollow"(으)로 설정되어 있지 않습니다. 잠재적인 정보 유출 및 보안 위협이 될 수 있으므로 설정을 변경하는 것을 추천합니다.</p>

**\[해결책\] nginx 설정 수정**

1\. "config &gt; nginx &gt; site-confs"에 들어가면 "default.conf"가 있습니다.

2\. "add\_header X-Robots-Tag" 부분을 찾아 아래와 같이 수정 합니다.

<p class="callout success"> "add\_header X-Robots-Tag "noindex, nofollow" always;"</p>

# Nextcloud Update 이후 "INVALID_HASH" (db index error) 문제 발생 시

<p class="callout warning"> - INVALID\_HASH:  
 - core/js/mimetypelist.js:  
 - expected: \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*  
 - current: \*\*\*\*\*\*\*\*\*\*\*\*\*\*</p>

1\. Nextcloud의 Docker Console에서 아래 명령을 실행 합니다.

<p class="callout info">\# occ db:add-missing-indices</p>

2\. Nextcloud의 "config &gt; www &gt; nextcloud &gt; config.php"에 아래 문장을 추가해 줍니다.

<p class="callout success">'integrity.check.disabled' =&gt; true,</p>

3\. Nextcloud Docker Container를 재실행 합니다.

4\. Nextcloud의 "관리자 설정" 진입 후 error 항목에서 <span style="color: rgb(224, 62, 45);">"Rescan" </span>클릭 합니다.

5\. 정상 확인 후 2번 항목을 원상복귀 (문장 삭제) 후 Nextcloud Docker Container를 재실행 합니다.

# 로그인 시간이 유난히 길때

"config/www/nextcloud/config/config.php"에 아래 문장을 추가해 줍니다.

<p class="callout success">"'auth.bruteforce.protection.enabled' =&gt; false,"</p>

# "sysvsem" 경고 문제 해결

<p class="callout warning">이 인스턴스에 추천하는 PHP 모듈 중 일부가 존재하지 않습니다. 성능 향상과 호환성을 위하여 PHP 모듈을 설치하는 것을 추천합니다.  
sysvsem</p>

1\. Nextcloud v26 버전부터 "sysvsem" PHP 모듈이 필요 합니다. 경고가 발생될 경우<span style="color: rgb(224, 62, 45);"> Nextcloud의 Docker 이미지를 최신버전으로</span>  
<span style="color: rgb(224, 62, 45);"> 업그레이드</span>해 주셔야 합니다. (php.ini의 extention을 설정해도 경고 문구 발생)

2\. linuxserver/nextcloud 대응 버전 : 21.03.23: - Add php81-sysvsem as new dep for v26. Update default X-Robots-Tag to `noindex,  
 nofollow``.

# DB 속도 개선 (DB반응이 늦을때)

MariaDB에 "my.cnf"파일을 생성 후 내용을 추가해 줍니다.

```shell
touch /var/packages/MariaDB10/etc/my.cnf
```

"my.cnf" 에 작성되야할 내용은 아래와 같습니다.

<p class="callout success">\[myisamchk\]  
key\_buffer\_size=64M  
sort\_buffer\_size=64M  
  
\[mysqld\]  
max\_connections = 1000  
innodb\_buffer\_pool\_size=500M  
key\_buffer=256M  
key\_buffer\_size=256M  
query\_cache\_limit=16M  
query\_cache\_size=32M  
max\_allowed\_packet=128M  
thread\_stack=192K  
thread\_cache\_size=8  
table\_open\_cache=128  
sort\_buffer\_size=512K  
read\_buffer\_size=512K  
read\_rnd\_buffer\_size=512K  
skip-name-resolve  
skip-host-cache  
skip-external-locking  
wait\_timeout = 28800  
innodb\_log\_file\_size = 128MB  
max\_allowed\_packet = 128M  
</p>

아래 명령으로 MariaDB를 재실행 합니다.

```shell
/var/packages/MariaDB10/scripts/start-stop-status restart
```

# "opcache" 경고 시

"php.ini"를 아래와 같이 수정 합니다.

<p class="callout success">opcache.enable=1  
opcache.interned\_strings\_buffer=512  
opcache.max\_accelerated\_files=10000  
opcache.memory\_consumption=2048  
opcache.save\_comments=1  
opcache.revalidate\_freq=1</p>

# "데이터베이스에 일부 인덱스가 없습니다" 오류 시

<p class="callout warning"><span class="message">설정을 살펴본 결과 몇 가지 경고할 것이 있습니다.  
</span>데이터베이스에 일부 인덱스가 없습니다. 큰 테이블에 인덱스를 추가하는 데 시간이 걸리기 때문에 자동으로 추가하지 않았습니다. 명령행에서 "occ db:add-missing-indices" 명령을 실행하여 인스턴스를 실행하는 동안 수동으로 인덱스를 추가할 수 있습니다. 해당 테이블에 인덱스를 추가하면 질의 속도가 다시 빨라집니다.  
테이블 "oc\_systemtag\_object\_mapping"에 인덱스 "systag\_by\_tagid"이(가) 없습니다.  
테이블 "text\_steps"에 인덱스 "textstep\_session"이(가) 없습니다.</p>

Nextcloud Version Update 시 발생되는 오류로 Nextcloud 콘솔에서 아래 명령을 실행하면 해결 됩니다.

<p class="callout success">occ db:add-missing-indices</p>

[![db_err.jpg](https://wiki.dhcloud.me/uploads/images/gallery/2023-07/scaled-1680-/KJsKnI6gBqh13Kya-db-err.jpg)](https://wiki.dhcloud.me/uploads/images/gallery/2023-07/KJsKnI6gBqh13Kya-db-err.jpg)

# "서버 유지관리 창의 시작 시간이 설정되지 않았습니다." 문제 발생

- 서버 유지관리 창의 시작 시간이 설정되지 않았습니다. 자원 집약적인 배경 작업이 사용자의 주된 사용 시간에 시작할 수 있습니다. 부하가 큰 작업에 의해 사용자가 불편을 겪지 않도록, 사용량이 적은 시간대로 이를 지정하십시오. 더 자세한 사항은 [문서 ↗](https://docs.nextcloud.com/server/28/go.php?to=admin-background-jobs)를 참조하십시오.

1\. Nextcloud의 "config &gt; www &gt; nextcloud &gt; config.php"에 아래 문장을 추가해 줍니다.

<p class="callout success">'maintenance\_window\_start' =&gt; 1,</p>

2\. Nextcloud Docker Container를 재실행 합니다.