제가 직접 운영하는 클라우드 서비스 만들고 싶어요
첫 NAS를 구축한지 벌써 대충 6년이 넘었다
맨 처음 라즈베리파이 3B+로 만들었던 내 NAS가 벌써...?
이제는 원격 접속해서 스트리밍하는 것 정도로는 만족이 안된다
알아서 동기화하고, 전용 링크로 공유해주고, 뭣보다 웹, 앱 모두 접근성이 편한 전용툴이 있는...
진짜 클라우드 서비스를 구축해보고 싶었다
그래서 찾다보니 Nextcloud라는게 있네요??
바로 설치하고 간단하게 세팅하는 것까지 진행해보자!
오늘의 진행순서는 아래와 같다
1. 홈서버에 Nextcloud 설치하기
2. Nextcloud 내부에서 접속하기
3. Nextcloud 외부에서 접속하기 (feat. HTTPS)
4. 간단한 기능 몇 개 살펴보기
1. 홈서버에 Nextcloud 설치하기
우선 나는 Docker를 쓰고 있으니까 Docker로 띄울 것이다
일단 내 홈서버 구조는 아래와 같다
docker-compose 안에 Nextcloud를 띄우고, Nginx에다가 외부에서 Nextcloud에 접속할 수 있도록 세팅해줄 것이다
우선 컨테이너를 띄워보자
nextcloud:
image: nextcloud
restart: always
container_name: nextcloud-container
volumes:
- nextcloud_data:/var/www/html
environment:
OVERWRITEPROTOCOL: https # HTTPS 풀링 경고 방지
OVERWRITECLIURL: https://Test.com # 외부 도메인 주소 입력
MYSQL_PASSWORD: ${MYSQL_PASSWORD} # MYSQL 비밀번호
MYSQL_DATABASE: ${MYSQL_DATABASE} # MYSQL 사용할 데이터 베이스
MYSQL_USER: ${MYSQL_USER} # MYSQL 계정명
MYSQL_HOST: mysql-container
depends_on:
- mysql # MYSQL 컨테이너가 먼저 시작되어야 동작하도록 의존성 주입(= 순서 지정)
networks:
- jenkins_network
여기까지 설정하고 컨테이너 실행하면 내부망에서 ip 입력하고 접속할 수 있다
(물론 포트 안맞고 뭐하면 접속 안 될 수 있다)
이 타이밍에서 주의해야 할 것이 기본적으로 Nextcloud는 80포트를 쓴다
근데 Nginx나 다른 80포트를 쓰는 것이 있다면 충돌해서 서비스가 막힐 수 있음!
(나 같은 경우엔 컨테이너 포트를 8081로 변경해서 내부망 ip:8081로 접근해서 정상동작 확인했다
아 지금은 로그인하라고 뜨지만, 맨 처음에 로그인하면 관리자 ID/PW를 입력하라는 창이 떴다
거기서 로그인하는 값이 admin ID/PW이다!
2. Nextcloud 내부에서 접속하기
기본적으로 IP를 입력하고 들어가면 된다
80포트를 쓰기 때문인데, 만약 다른 서비스가 이미 80포트를 점유하고 있다면 컨테이너를 띄울 때, 다른 포트로 할당해서 웹 브라우저 URL에 {IP:포트번호} 입력하면 접속된다
3. Nextcloud 외부에서 접속하기 (feat. HTTPS)
이것은 일단 SSL 인증이 선행되어야 한다
서버 DNS는 Duckdns 썼고, SSL은 Certbot을 썼는데 이 과정은 아래 포스팅이 도와줄 것이다
(울분과 분노로 점철된 당시의 HTTPS 적용 포스팅...)
https://ratatou2.tistory.com/85
Certbot으로 서버에 HTTPS 적용하기 (feat. 부셔버릴 통신사 공유기)
통신사 공유기는 못 들어오십니다통신사 공유기세요? 그거 안돼요 버리세요그래도 하시겠다구요? 그럼 따라하시다가 안되면 일단 통신사 공유기 탓입니다공유기 바꾸시는게 정신건강에 좋아
ratatou2.tistory.com
아무튼! 여기서는 인증받은 DNS가 있다고 가정하고 진행한다
testorgforpost.duckdns.org 는 포스팅을 위해 발급 받은 주소이며, 이것을 여러분의 주소로 치환해서 진행하면 된다
서버에 DNS 발급받고 해당 DNS를 Nextcloud랑 연결한 다음 접속하면 위처럼 뜬다
인증받은 DNS 주소이지만, Nextcloud 자체에서 이 주소를 인정하지 못하기 때문에 거절하는 것임
Nextcloud가 이 주소로 들어오는 요청들을 어색해하지 않게 세팅해줘야 한다
1.docker-compose.yml 수정
nextcloud의 enviroment에 아래 두 줄을 추가해야한다
OVERWRITEPROTOCOL: https # 👈 HTTPS 풀링 경고 방지
OVERWRITECLIURL: testorgforpost.duckdns.org # 👈 외부 도메인 주소 입력
요청을 https로 안보내면 칭얼대는데, 칭얼대지 못하도록 미리 처리해주는 것과
외부에서 접속할 도메인 주소를 입력해주는 것이다
이제 Nextcloud 컨테이너 재시작하면 된다
(아래 명령어는 컨테이너 전부 재실행하는 명령어임)
docker-compose down
docker-compose up -d
근데 여기서도 여전히 똑같다?
그러면 2번으로 가면 된다
2. /var/www/html/config/config.php 수정하기
이젠 그냥 Nextcloud 컨테이너에 직접 들어가서 안전한 주소야~ 라고 알려주면 된다
# Nextcloud 컨테이너 내부로 진입
docker exec -it nextcloud-container /bin/bash
# config.php 수정
nano /var/www/html/config/config.php
수정할 내용은 아래와 같다
Nginx로 리버스 프록시 설정을 하고 있기 때문에 필요한 내용
'trusted_domains' =>
array (
0 => '192.168.0.99:8081', # 위에는 내부망 IP (기존에 적혀있었음)
1 => 'testorgforpost.duckdns.org', # 이것은 외부망 DNS로 직접 추가하였다
),
'overwrite.cli.url' => 'testorgforpost.duckdns.org',
'overwritehost' => 'testorgforpost.duckdns.org',
'overwriteprotocol' => 'https',
각 옵션에 대한 것이 궁금해서 좀 찾아서 정리해봄
1) overwrite.cli.url
- CLI(명령어 실행)에서 사용하는 기본 URL 경로
- 예를 들어, occ 명령어 등에서 URL이 필요할 때 참조
2) overwritehost
- Nextcloud가 외부에서 들어오는 요청의 Host 헤더를 무시하고, 항상 이 값으로 간주하라는 의미
- 주로 리버스 프록시(Nginx 등) 뒤에 있을 때 필요함 (나처럼 Nginx 앞에 두고 Docker로 Nextcloud 띄운 경우)
- 보안상 위험할 수 있으니 리버스 프록시 상황에서만 설정
3) overwriteprotocol
- 외부에서 들어오는 요청이 http인데, 실제론 프록시에서 https로 처리 중이라면, Nextcloud에게 "https로 동작 중이야" (소근소근)라고 알려주는 용도
- 이 설정 없으면 Nextcloud가 리디렉션을 http로 보내거나, 리소스 경로를 http://로 만들어버림 (브라우저에서 혼합 콘텐츠 경고 발생)
- 특히 이게 없어서 내가 계속 위와 같은 에러를 마주했던듯 하다
OCC 명령어란?
- Nextcloud의 명령어 기반 도우미 툴(Command Line Interface)을 의미한다
- OwnCloud Console의 줄임말
- Nextcloud의 내부 관리 작업을 할 수 있게 해줌
- 한줄 요약하면 Nextcloud 전용, 관리자용 터미널 명령어 도구
확실하게 재시작까지 하면 됨 (혹시 모를 캐시를 날리기 위함)
docker restart nextcloud-container
여기까지 했는데도 안되면... 3번으로 가자!
3. .htaccess 업데이트하기
2번까지 했는데도 안되길래 찾아보니까 설정을 변경하면 .htaccess도 다시 생성해줘야 적용이 제대로 된단다
명령어 두줄이면 새로 생성할 수 있다
# 컨테이너 접속
docker exec -u www-data -it nextcloud-container bash
# .htaccess 새로 생성
php occ maintenance:update:htaccess
이렇게 하고 나니까 정상 접속 되었다!! 휴!!
.htaccess란?
- .htaccess = HyperText Access
- Apache 웹서버에서 디렉토리마다 설정을 커스터마이징할 수 있게 해줌
- 보통 사이트 보안, 리다이렉트, URL 재작성, 접근 제어 같은 걸 설정함
위 명령어에서 -u www-data의 의미는?
https://ratatou2.tistory.com/156
docker 명령어에서 -u www-data의 의미는?
저 옵션은 아래 세가지를 위함이다1) 파일 권한 문제 방지 2) Nextcloud의 파일 액세스 정책 준수 3) 보안 즉, 안정적인 사용을 위해서 저런 옵션이 붙은 것임 그냥 일반 컨테이너 접속 명령어와는 아
ratatou2.tistory.com
여기에 다 욱여넣긴 많아서 따로 간단히 포스팅
4. 간단한 기능 몇 개 살펴보기
4-1) 계정 추가하기
계정을 추가해서 다른 이들과 같이 쓸 수 있다
오른쪽 상단의 계정을 누르고 '계정'을 누르면 된다
그러면 아래처럼 계정 리스트들이 나오는데 여기서 권한, 비밀번호, 용량 제한, 그룹 등등을 설정해줄 수 있다
그리고 새로운 계정을 누르면 추가해줄 수 있음
필요한 정보 기입하고 추가하면 된다!
4-2) 링크 공유하기
솔직히 이게 제일 편리하다고 생각하는데, 링크를 만들어서 건네줄 수 있다! (심지어 QR로도 가능)
구글 드라이브처럼 잠깐 공유하기 넘 좋을듯 하여서 제일 탐났던 기능!
그냥 순서대로 클릭하면 빨간 박스처럼 변하는데 저기서 옵션 변경하면 된다
추가 기능들이나 개선부분은 추후 포스팅으로 진행 예정!
inotifywait? (Ubuntu 자체 세팅으로 클라우드 서비스 구현하기)
몰랐는데 inotifywait 같은 것을 쓰면 Ubuntu 기본 세팅으로도 위와 동일한 기능 구현이 가능하단다
디렉토리를 지정해서, 자동화 백업, 업데이트가 가능하다고 한다...
심지어 실시간으로!
근데? UI도 없고, 편의성이 구리니까 이게 낫겠쥬?
아래와 같은 구성 방식인듯!
inotifywait 설치
sudo apt install inotify-tools
스크립트 파일
#!/bin/bash
WATCH_DIR="/home/n100/문서"
BACKUP_DIR="/mnt/nas_backup/docs"
inotifywait -m -r -e modify,create,delete "$WATCH_DIR" |
while read path action file; do
rsync -avh "$WATCH_DIR" "$BACKUP_DIR"
done