ํค์ด ํ๋ธ๋ฅด! ๋๋ ๊ธฐ์ฌ์ ๋ฒ์ญ์ ๋น์ ์ ๊ด์ฌ์ ์ ์ํฉ๋๋ค
๊ธฐ์ ์งํฅ์ ์ธ ์ฌ๋๋ค์ ์ถ์์ Google ๋ฌธ์๋๊ตฌ ๋ฐ ํด๋ผ์ฐ๋ ์คํ ๋ฆฌ์ง์ ๊ฐ์ ์จ๋ผ์ธ ์คํผ์ค ์ ํ๊ตฐ์ ๊ฐ์น๋ฅผ ๊ณผ์ํ๊ฐํ๊ธฐ๋ ์ด๋ ต์ต๋๋ค. ์ค๋ซ๋์ ์คํผ์ค ์ ํ๋ฆฌ์ผ์ด์
์์ฅ์ ์ฅ์
ํด ์จ ๋ง์ดํฌ๋ก์ํํธ์กฐ์ฐจ ์ต๊ทผ ์คํผ์ค 365 ์น ์ ํ๋ฆฌ์ผ์ด์
๊ฐ๋ฐ์ ์ง์คํ๊ณ ์ฌ์ฉ์๋ค์ด ์์ ์ ์๋น์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ๊ตฌ๋
๋ชจ๋ธ๋ก ์ ํํ๋๋ก ์ค๋ํ๋ ๋ฐ ์ฃผ๋ ฅํ๊ณ ์๋ค. cat์์ ์์ ์ ์คํ ๋ฆฌ์ง๋ฅผ ์ค์นํ๊ณ ๊ตฌ์ฑํ๋ ๊ณผ์ ์ ๊ด์ฌ์ด ์๋ ๋ถ๋ค์ ์ด๋ํฉ๋๋ค.
์ผ๋ง ์ ์ ์ฐ๋ฆฌ๋ ์๊ท๋ชจ ๊ธฐ์
์์ ์ฌ์ฉํ๊ธฐ ์ํด ์ฝ๊ฒ ๋ฐฐํฌํ ์ ์๋ ํด๋ผ์ฐ๋ ์คํ ๋ฆฌ์ง ์๋ฃจ์
๊ณผ ์คํ ์์ค ์น ์คํผ์ค ์ ํ๊ตฐ์ ์ดํด๋ณด์์ต๋๋ค. ๋ชจ๋ ๋ฌธ์๋ฅผ ์จ๋ผ์ธ์ผ๋ก ์ ์งํ๋ ์ฃผ์ ๋๊ธฐ๋ ๊ฑฐ๋๋์ด ์ ์์๋ ๋ถ๊ตฌํ๊ณ ์๋ฅ ์์
์ ์ต์ํํ๊ณ ์ข์ ๋น์ฆ๋์ค ๊ดํ์ ๊ตฌํํ๋ ๊ฒ์
๋๋ค. ๋์ ์ ๋ค๋ฅธ ๋ฉด์ ์ด ์๋น์ค๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ํด๋ผ์ฐ๋ ์๋ฒ๋ฅผ ์๋ํ๋ ๊ฒ์ด ์๋ฒ๋ ํธ๋ํฝ์ ๋ํ ๋ฌผ๋ฆฌ์ ์ก์ธ์ค๋ฅผ ๊ฐ์ฌํ ์๋จ์ด ์๊ธฐ ๋๋ฌธ์ ๊ธฐ์
๊ตฌ๋ด์ ์ง์ ์ ์ฅํ๋ ๊ฒ๋ณด๋ค ๋ ์์ ํ๋ค๋ ๊ฒ์
๋๋ค. ๋ฐ๋ผ์ ์ข
๋จ ๊ฐ ์ํธํ ๋ฐ ์คํ ์์ค ์ํํธ์จ์ด๋ ํ์ํฉ๋๋ค.
์คํ ์์ค ์๋ฃจ์ ์ ๋ํด ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ ์ ๋ณด๋ฅผ ๊ณ ๋ คํ์ฌ ํด๋ผ์ฐ๋ ์คํ ๋ฆฌ์ง์ฉ์ผ๋ก ๊ฐ๋ฐ๋ ๋ ๊ฐ์ ํ์ฑ ํ๋ก์ ํธ(์ง๋ 12๊ฐ์ ๋์ git ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ปค๋ฐ ํฌํจ)์ธ NextCloud ๋ฐ OwnCloud์ ์ ์ผํ ํ์ฑ ONLYOFFICE ์คํผ์ค ์ ํ๊ตฐ์ ์ฐพ์์ต๋๋ค. ๋ ํด๋ผ์ฐ๋ ์คํ ๋ฆฌ์ง ๋๊ตฌ๋ ๊ฑฐ์ ๋์ผํ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ NextCloud๋ฅผ ์ ํํ๊ธฐ๋ก ํ ๊ฒฐ์ ์ ํธ์ํ ์ฌ์ฉ์ ์ํธ ์์ฉ์ ์ํด ONLYOFFICE์ ํตํฉํ ์ ์๋ค๋ ์ฆ๊ฑฐ์ ์กด์ฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ต๋๋ค. ๊ทธ๋ฌ๋ ์๋น์ค๋ฅผ ๋ฐฐํฌํ๊ธฐ ์์ํ์ ๋ ์์ ์๋น์ค ํตํฉ์ ๋ํ ์ ๋ณด๊ฐ ๋ถ์กฑํ๋ค๋ ๊ฒ์ด ๋ถ๋ช ํด์ก์ต๋๋ค. ํตํฉ ๋ฐฉ๋ฒ์ ๋ํ 3๊ฐ์ ํํ ๋ฆฌ์ผ ๋น๋์ค๋ฅผ ์ฐพ์์ต๋๋ค.
www.youtube.com/watch?v=GAd-x_sP6ng www.youtube.com/watch?v=ceOld6P16wI www.youtube.com/watch?v=DvTXyl-OOZA
๊ณต์ nginx๋ฅผ ์ฌ์ฉํ์ฌ NextCloud์ ๋์ผํ ๋ฌผ๋ฆฌ์ ์๋ฒ์ ONLYOFFICE ๋ฌธ์ ์๋น์ค๋ฅผ ์ค์นํ๋ ์ง๋ฌธ์ ์ธ ๊ฐ์ ๋น๋์ค ์ค ์ด๋ ๊ฒ๋ ๋๋ตํ์ง ์์์ต๋๋ค. ๋์ ๋ฌธ์ ์๋น์ค API์ ๋ณ๋์ ํฌํธ๋ฅผ ์ฌ์ฉํ๋ ๋ฑ์ ๋ถ๋ฆฌ ๊ธฐ์ ์ ์ฌ์ฉํ์ต๋๋ค. ๋ ๋ค๋ฅธ ์ ์์ Document Service์ ๋ณ๋์ ์๋ฒ๋ฅผ ๋ฐฐํฌํ๊ณ Document Service์ ๋ด์ฅ๋ nginx ์ธ์คํด์ค๋ฅผ ์๋์ผ๋ก ๊ตฌ์ฑํ์ฌ ์ก์ธ์ค ํค(๋ฐ์ดํฐ ํด๋ผ์ฐ๋์ ๋ํ ์ก์ธ์ค ๊ถํ์ ํ์ธํ๋ ๋ฏธ๋ฆฌ ์๋ ค์ง ์ก์ธ์ค ํค) ๋ฐ TLS ์ธ์ฆ์๋ฅผ ์ค์นํ๋ ๊ฒ์ด์์ต๋๋ค. ์์ ์ ๊ทผ ๋ฐฉ์์ ์์ ํ์ง ์๊ณ ์ถฉ๋ถํ ํจ๊ณผ์ ์ด์ง ์์ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋์ด NextCloud, ONLYOFFICE ๋ฐ docker-compose๋ฅผ ์ฌ์ฉํ์ฌ ๋๋ฉ์ธ ์ด๋ฆ๋ณ๋ก ์์ฒญ์ ๊ตฌ๋ถํ๋ ๊ณตํต nginx๋ฅผ ํตํฉํ์ต๋๋ค. ๋ค์์ ์ด๋ฅผ ์ํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋จ๊ณ๋ณ ์ ๋ณด์ ๋๋ค.
1๋จ๊ณ: nginx ์ปจํ ์ด๋
์ด๊ฒ์ ๋งค์ฐ ๊ฐ๋จํ ์ค์ ์ด์ง๋ง ์ญ๋ฐฉํฅ ํ๋ก์ ์๋ฒ๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐ ๊ฐ์ฅ ๋ง์ ์์ ์ด ํ์ํ ๋จ๊ณ์ ๋๋ค. ๋จผ์ nginx:stable ์ด๋ฏธ์ง์ ๋ํ docker-compose ๊ตฌ์ฑ์ ๋ง๋ค์์ต๋๋ค.
version: '2'
services:
nginx:
image : nginx:stable
restart: always
volumes:
- ./nginx/nginx-vhost.conf:/etc/nginx/conf.d/default.conf:ro
- ./nginx/certificates:/mycerts
ports:
- 443:443
- 80:80
์ด๋ ๊ฒ ํ๋ฉด ํฌํธ 80 ๋ฐ 443์ด ๊ณต๊ฐ๋ ์ปจํ
์ด๋๊ฐ ์์ฑ๋๊ณ , ๊ตฌ์ฑ์ nginx/nginx-vhost.conf ์ ๋งคํํ๊ณ , ์์ฒด ์๋ช
๋ ์ธ์ฆ์๋ก ์์ฑ๋๊ฑฐ๋ /nginx/certificates์์ Let's encrypt์ certbot์ ์ฌ์ฉํ์ฌ ์์ฑ๋ ์ธ์ฆ์์ฉ ์ ์ฅ์๋ฅผ ์ ์ํฉ๋๋ค. ์ด ์์น์๋ ๊ฐ๊ฐ ์ธ์ฆ์ ์ฒด์ธ ๋ฐ ์๋ฒ ๊ฐ์ธ ํค์ ๋ํ fullchain1.pem ๋ฐ privkey1.pem ํ์ผ์ด ์๋ office.yourdomain.com ๋ฐ cloud.yourdomain.com์ ๋ํ ํด๋๊ฐ ํฌํจ๋์ด์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์์ ์์ฒด ์๋ช
๋ ์ธ์ฆ์๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์ธํ ์์๋ณผ ์ ์์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ vhost ํ์ผ์ ์ ์ํ์ต๋๋ค. ๋จผ์ ํฌํธ 80์ ๋์์ https๋ก์ ๋จ์ ๋ฆฌ๋๋ ์ ์ผ๋ก ์ ์ํฉ๋๋ค. ์ฐ๋ฆฌ๋ http ํธ๋ํฝ์ ํ์ฉํ๊ณ ์ถ์ง ์์ต๋๋ค
server {
listen 80;
location / {
return 301
https://$host$request_uri;
}
}
๊ทธ๋ฐ ๋ค์ ์๋น์ค๋ฅผ ์ํด ํฌํธ 443์ ๋ ๊ฐ์ ๊ฐ์ ์๋ฒ๋ฅผ ๋ง๋ค์์ต๋๋ค.
server {
listen 443 ssl;
server_name cloud.yourdomain.com ;
root /var/www/html;
ssl_certificate /mycerts/cloud.yourdomain.com/fullchain1.pem;
ssl_certificate_key /mycerts/cloud.yourdomain.com/privkey1.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app:80;
}
}
server {
listen 443 ssl;
server_name office.yourdomain.com;
root /var/www/html;
ssl_certificate /mycerts/office.yourdomain.com/fullchain1.pem;
ssl_certificate_key /mycerts/office.yourdomain.com/privkey1.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://onlyoffice:80;
}
}
2๋จ๊ณ: ๋ฌธ์ ์๋น์ค
์ด์ docker-compose.yml์ ๋ฌธ์ ์๋น์ค ์ปจํ ์ด๋๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์ ํน๋ณํ ๊ตฌ์ฑํ ์ฌํญ์ ์์ต๋๋ค.
services:
...
onlyoffice:
image: onlyoffice/documentserver
restart: always
๊ทธ๋ฌ๋ nginx ์ปจํ ์ด๋๋ฅผ ๋ฌธ์ ์๋น์ค์ ์ฐ๊ฒฐํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค.
services:
...
nginx:
...
depends_on:
- onlyoffice
3๋จ๊ณ: ๋ฅ์คํธํด๋ผ์ฐ๋
๋จผ์ ์ ์๋น์ค๋ฅผ ์ถ๊ฐํฉ๋๋ค.
services:
...
db:
image: mariadb
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
restart: always
volumes:
- /data/nextcloud_db:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=#put some password here
- MYSQL_PASSWORD=#put some other password here
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
app:
image: nextcloud
depends_on:
- db
- onlyoffice
restart: always
nginx์ ๋ํ ๋งํฌ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
services:
...
nginx:
...
depends_on:
- app
์ด์ ์ปจํ ์ด๋๋ฅผ ๋ก๋ํ ์๊ฐ์ ๋๋ค.
docker-compose up -d
์ ์ ํ nginx๋ ๊ธฐ๋ณธ ๊ตฌ์ฑ ํ์ด์ง์ธ NextCloud ํ๋ฐํธ ์๋๋ก ๋ฆฌ๋๋ ์ ํ๊ธฐ ์์ํฉ๋๋ค. ์ฒซ ๋ฒ์งธ ๊ด๋ฆฌ์์ ์ฌ์ฉ์ ์ด๋ฆ๊ณผ ์ํธ๋ฅผ ์ ๋ ฅํ๊ณ docker-compose.yml์์ ์ ๊ณตํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๊ฒฉ ์ฆ๋ช ์ ์ ๋ ฅํด์ผ ํฉ๋๋ค. ์ค์ ์ด ์๋ฃ๋๋ฉด ๋ก๊ทธ์ธํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ ๋๊ธฐํ๋ ๋ฐ ๊ฑฐ์ XNUMX๋ถ์ด ๊ฑธ๋ ธ๊ณ ํด๋ผ์ฐ๋ ์๋น์ค์ ๋ก๊ทธ์ธํ๋ ค๋ฉด ๋ก๊ทธ์ธ ํ์ด์ง๋ฅผ ์ถ๊ฐ๋ก ์๋ก ๊ณ ์ณ์ผ ํ์ต๋๋ค.
Nextํด๋ผ์ฐ๋ ์๋น์ค ์ค์ ์ฐฝ
4๋จ๊ณ: NextCloud์ ONLYOFFICE ์ฐ๊ฒฐ
์ด ๋จ๊ณ์์ ONLYOFFICE ๊ธฐ๋ฅ์ ์ฐ๊ฒฐํ๋ NextCloud์ฉ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์นํด์ผ ํฉ๋๋ค. ๋ฉ๋ด์ ์ค๋ฅธ์ชฝ ์๋จ ๋ชจ์๋ฆฌ์ ์๋ ์์ฉ ํ๋ก๊ทธ๋จ ์ ์ดํ๋ถํฐ ์์ํ๊ฒ ์ต๋๋ค. ONLYOFFICE ์ฑ(Office & text ๋๋ ๊ฒ์ ์ฌ์ฉ)์ ์ฐพ์ ์ค์นํ๊ณ ํ์ฑํํฉ๋๋ค.
๊ทธ๋ฐ ๋ค์ ์ค๋ฅธ์ชฝ ์๋จ ๋ชจ์๋ฆฌ์ ์๋ ๋ฉ๋ด๋ฅผ ํตํด ์ค์ ์ผ๋ก ์ด๋ํ๋ฉด ์ผ์ชฝ ๋ฉ๋ด์์ ONLYOFFICE ํญ๋ชฉ์ ์ฐพ์ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋ค์ด๊ฐ์ญ์์ค. ์๋์ ๊ฐ์ด ์ฃผ์๋ฅผ ๋ฑ๋กํด์ผ ํฉ๋๋ค.
ํตํฉ ์ ํ๋ฆฌ์ผ์ด์
์ค์
์ฒซ ๋ฒ์งธ ์ฃผ์๋ ๋ธ๋ผ์ฐ์ ์์ ์คํ๋๋ ์ ํ๋ฆฌ์ผ์ด์
์์ ์ง์ ์ผ๋ถ js ๋ฐ css ํ์ผ์ ์ฐ๊ฒฐํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค(nginx๋ฅผ ํตํด ONLYOFFICE ์๋น์ค์ ๋ํ ์ก์ธ์ค๋ฅผ ์ด๋ ค๋ฉด ์ด ์ฃผ์๊ฐ ํ์ํจ). ์๊ตฌ ์ธ์ฆ ํค๋ณด๋ค Docker ๊ฒฉ๋ฆฌ ๊ณ์ธต์ ๋ ์ ๋ขฐํ๊ธฐ ๋๋ฌธ์ ๋น๋ฐ ํค๋ ์ฌ์ฉ๋์ง ์์ต๋๋ค. ์ธ ๋ฒ์งธ ์ฃผ์๋ NextCloud ์ปจํ
์ด๋์์ ONLYOFFICE API์ ์ง์ ์ฐ๊ฒฐํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ Docker์ ๊ธฐ๋ณธ ๋ด๋ถ ํธ์คํธ ์ด๋ฆ์ ์ฌ์ฉํฉ๋๋ค. ์, ๋ง์ง๋ง ํ๋๋ ONLYOFFICE๊ฐ ์ธ๋ถ IP ์ฃผ์ ๋๋ Docker ๋คํธ์ํฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ด๋ถ Docker ์ฃผ์๋ฅผ ์ฌ์ฉํ์ฌ NextCloud API์ ๋ค์ ์์ฒญํ ์ ์๋๋ก ์ฌ์ฉ๋์ง๋ง ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ์๋ ์ฌ์ฉ๋์ง ์์ต๋๋ค. ๋ฐฉํ๋ฒฝ ์ค์ ์ด ์ด๋ฌํ ์ข
๋ฅ์ ์ํธ ์์ฉ์ ํ์ฉํ๋์ง ํ์ธํ์ญ์์ค.
์ ์ฅ ํ NextCloud๋ ์ฐ๊ฒฐ์ ํ ์คํธํ๊ณ ๋ชจ๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅธ ๊ฒฝ์ฐ ํตํฉ๊ณผ ๊ด๋ จ๋ ์ค์ (์: ์ด ํตํฉ์ผ๋ก ํธ์งํ ์ ์๋ ํ์ผ ์ ํ)์ ํ์ํฉ๋๋ค. ๋น์ ์ด ์ ํฉํ๋ค๊ณ ์๊ฐํ๋๋๋ก ์ฌ์ฉ์ ์ ์ํ์ญ์์ค.
๋ง์ง๋ง ๋จ๊ณ: ํธ์ง๊ธฐ๋ฅผ ์ฐพ์ ์์น
ํด๋ผ์ฐ๋ ์ ์ฅ์ ํด๋๋ก ๋์๊ฐ์ "+"๋ฅผ ํด๋ฆญํ์ฌ ์ ํ์ผ์ ๋ง๋ค๋ฉด ๋ฌธ์, ์คํ๋ ๋์ํธ ๋๋ ํ๋ ์ ํ ์ด์ ์ ๋ง๋ค ์ ์๋ ์๋ก์ด ์ต์ ์ด ๋ํ๋ฉ๋๋ค. ๊ทธ๋ค์ ๋์์ผ๋ก ONLYOFFICE๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ์ ํ์ ํ์ผ์ ๋ง๋ค๊ณ ์ฆ์ ํธ์งํ ์ ์์ต๋๋ค.
ํ์ผ ์์ฑ ๋ฉ๋ด
๋ณด์ถฉ 1
docker-compose.yml์ ์ ์ฒด ๋ด์ฉ์ ์ฌ๊ธฐ์์ ์ฐพ์ ์ ์์ต๋๋ค.
์ถ์ฒ : habr.com