nodebb docker 설치하기
-
https://github.com/NavyStack/nodebb-docker
NavyStack 님의 nodebb의 docker compose 를 이용한 설치 과정을 적어봅니다.
우선 docker 이미지는 NavyStack이 만들어주신 이미지를 sql은 postgres를 이용하였습니다.docker compose
version: "3.8" services: app: container_name: nodebb restart: unless-stopped image: navystack/nodebb:latest volumes: - ./setup.json:/usr/src/app/setup.json - ./data/build:/usr/src/app/build - ./data/uploads:/usr/src/app/public/uploads - ./data/config:/opt/config - ./data/nodebb-modules:/usr/src/app/node_modules ports: - 4567:4567/tcp environment: OVERRIDE_UPDATE_LOCK: true TZ: Asia/Seoul depends_on: - sql networks: - npm-network - nodebb sql: image: postgres:16.2-alpine restart: unless-stopped environment: POSTGRES_DB: nodebb POSTGRES_USER: nodebb POSTGRES_PASSWORD: VKSl2cYx7kD8hSL2s42xuDT7vqYDVp TZ: Asia/Seoul volumes: - ./postgresql:/var/lib/postgresql/data networks: - nodebb networks: nodebb: {} npm-network: external: true
npm-network 는 개인적으로 사용하는 브릿지 네트워크이며 자신이 사용하는 네트워크를 넣어주시면 될꺼에요.
우선 docker 를 구동하면 setup.json 파일이 없다고 하며 오류가 발생을 합니다. setup.json 이 폴더 형식으로
만들어 질 수도 있습니다. 폴더로 만들어졌으면 폴더를 지우시고 vi 나 nano를 이용해서 setup.json을 열어줍니다.
그리고 아래코드를 넣어줍니다.{ "postgres": { "host": "sql", "port": 5432, "database": "nodebb", "username": "nodebb", "password": "VKSl2cYx7kD8hSL2s42xuDT7vqYDVp" } }
그리고 data 폴더가 생성되며 하위 폴더가 생성되어져 있습니다. 폴더의 권한을 줍니다.
sudo chmod -R 777 data
이제 끝이 났습니다. 다시 docker을 시작하면 설치 화면시 생성 됩니다.
관리자 아이디 암호를 넣어주시고 sql은 postgress를 맞춰주시면 설정 된 아이디 암호가 자동으로 들어가게 됩니다.수고하셨습니다.
-
우선 좋은 글을 써주신 점에 대해 깊이 감사를 드리고 싶습니다.
- WebUI로 진행하면,
config.json
을 자동으로 생성하고 진행하기에, 기본 탬플릿만 적용했습니다. 현재 하드코딩된 값을 사용하는 오류에 대해서 https://github.com/NodeBB/NodeBB/pull/12335 여기에서 진행중에 있습니다.
- 권한을 확인하는 습관이 있어서, 권한 관련된 오류를 기대하지는 않았습니다.
괜찮으시다면, 사용 중인 환경을 알려주실 수 있으신가요? ( Dockerfile을 보시면 권한 관련 오류를 막으려 안간힘을 쓰고 있습니다. ㅎㅎ) (또한 권한777
은 너무 개방적입니다.)
현재 저는 1003:1004로 사용 중에 있고, 제가 만든 이미지 그대로 사용 중에 있습니다. 관련된 모든 오류는 저에게는 없었습니다.
아래는
navystack/nodebb:latest
를 바로 docker run 했을 때의 로그입니다.
폴더 권한 관련된 것도 제가 따로 수정하지 않았구요 :)
도커 볼륨과 마운트의 차이로 권한 관련 처리가 적절하게 되지 않는 것일 수 있습니다.
소유자가 누구로 되어있는지 확인 부탁드리겠습니다.
node_module
의 디렉토리는 도커 볼륨 관련해서 도커가 적절히 처리하도록 일부러 매핑을 하지 않았습니다. 일반 사용자 및 도커를 사용하는 방법에 적절하지 않다고 판단했습니다. ( 다만 유지는 중요하므로, 볼륨 선언만 진행 )
- 현재 pgsql을 사용하시면, 데이터 검색 플러그인을 따로 설정하셔야 할겁니다. :(
개인적으로 몽고디비 아틀라스 프리티어 추천 드립니다.
- 아직 완전히 검토한 것은 아니나, 바로 프록시를 때리면 속도가 약간 늦습니다.
따라서 저는 try_files를 사용합니다. (또한 현재 홈페이지에 적용된 설정이기도 하구요)
참고 하셔서 수정해 보시고 속도 비교 한번 해보세요 :)
proxy_cache_path /var/run/openresty/proxy_cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m; upstream nodes { ip_hash; server nodebb:4567; keepalive 2; } server { listen 80; server_name _; more_set_headers 'Server: OCI-QUN'; set_real_ip_from 0.0.0.0/0; real_ip_header X-Forwarded-For; real_ip_recursive on; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-Proto https; proxy_hide_header X-Powered-By; proxy_hide_header X-Dns-Prefetch-Control; proxy_hide_header X-Download-Options; proxy_set_header Content-Disposition "attachment"; proxy_redirect off; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; # Gzip Settings gzip on; gzip_disable "msie6"; gzip_vary on; gzip_proxied any; gzip_comp_level 1; gzip_buffers 16 8k; gzip_http_version 1.1; gzip_min_length 1024; gzip_types text/plain text/css text/js text/xml text/javascript application/javascript application/x-javascript application/json application/xml application/xml+rss image/svg+xml; # Brotli Settings brotli on; brotli_comp_level 6; brotli_static on; brotli_min_length 1024; brotli_types text/plain text/css text/js text/xml text/javascript application/javascript application/x-javascript application/json application/xml application/xml+rss image/svg+xml; location @nodebb { proxy_pass http://nodes; } location ~ ^/(?:assets|plugins)/(.*) { root /usr/share/nginx/; try_files /build/public/$1 /build/public/src/$1 /public/$1 @nodebb; add_header Cache-Control "public, max-age=31536000"; proxy_cache my_cache; proxy_cache_valid 200 304 12h; } location / { try_files $uri @nodebb; proxy_pass http://nodes; proxy_cache my_cache; proxy_cache_valid 200 304 12h; } }
혹시나 해서 제가 사용하는
docker-compose.yml
파일을 첨부 드립니다.version: '3.9' services: nodebb: container_name: nodebb restart: unless-stopped image: navystack/nodebb:1003 volumes: - nodebb-config:/opt/config - nodebb-build:/usr/src/app/build - nodebb-uploads:/usr/src/app/public/uploads - nodebb-modules:/usr/src/app/node_modules environment: OVERRIDE_UPDATE_LOCK: true networks: - interanl ports: - 4567:4567 redis: container_name: redis image: redis:7-bookworm restart: unless-stopped volumes: - redis-data:/data networks: - interanl volumes: nodebb-config: driver: local driver_opts: o: bind type: none device: ./config/ nodebb-build: driver: local driver_opts: o: bind type: none device: ./build/ nodebb-uploads: driver: local driver_opts: o: bind type: none device: ./uploads/ nodebb-modules: redis-data: networks: interanl:
고맙습니다.
- WebUI로 진행하면,
-
코드를 원본 그대로 설치를 해보았습니다. 정상적으로 작동이 됩니다.
우선 dockge로 설치를 진행했으며.. 처음에는 오류가 발생을 했습니다.
그래서 폴더를 생성을 해주었습니다.
sudo mkdir -p config build uploads
그리고 실행을 하니 동작을 했습니다. ㅎㅎㅎ. 굳이 config.json 을 만들지 않아도 되더군요.. ㅠㅠ...
proxy_cache_path /var/run/openresty/proxy_cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m; . . .
요런 설정 감사하지만 제가 사용하는 범위를 넘어섰습니다. ㅎㅎ. ㅠㅠ;;
지금 나스를 운영하는 정도의 스킬? 만 가지고 있고 필요한 것들 조금씩 알아가다 보니.. 참조 후 나중에 적용해볼 수 있도록 하겠습니다. 감사합니다.
아. 777을 만드는 것은 퍼미션 에러가 나타나서 그랬습니다. 웹에서 검색을 하니 해주라고 설정을 했고 설치가 완성
되어서 그랬던 것입니다.아래와 같이 폴더를 매핑을 해봤습니다.
version: "3.8" services: nodebb: container_name: nodebb restart: unless-stopped image: navystack/nodebb:latest volumes: - ./config:/opt/config - ./build:/usr/src/app/build - ./uploads:/usr/src/app/public/uploads - ./modules:/usr/src/app/node_modules environment: OVERRIDE_UPDATE_LOCK: true networks: - interanl ports: - 4567:4567 redis: container_name: redis image: redis:7-bookworm restart: unless-stopped volumes: - ./redis:/data networks: - interanl networks: interanl: null
이럴 경우
이와 같이 오류가 생성이 되더군요 ㅎㅎ. 그래서 777로 해줬던 것입니다.
...
아..
생성 폴더의 권한은 root 로 되어져 있고 uid 는 1002 입니다. docker bash 로 접속해서 확인해보면 정상적으로
nodebb 되어져 있습니다. 알려주신 코드로 하고 폴더 생성만 하면 정상적으로 잘 됩니다. :) -
올려주신 코드로 실행 할 경우 정상적으로 작동되었습니다.
아 선행작업으로 폴더를 생성해줘야 되지만 정상작동 됩니다. ㅎ.volumes: nodebb-config: driver: local driver_opts: o: bind type: none device: ./config/
위 부분처럼 연결을 해주면 퍼미션 에러 없이 동작하더라고요 하지만 제가 알던 방식으로 해버리면 에러가 났지만.
사용법을 알았으니 올려주신 compose로 사용할 경우 문제가 없었습니다. ㅎ.하지만 nodebb가 제 입맛에 안맞아서 코드정리만 해둔 상태입니다.. ㅠㅠ;; 또 열심히 찾아봐야죠. ㅎ.
아.. grafana 설치를 할 경우도 동일하게 퍼미션 에러나 나오더군요.
version: "3.8" services: grafana: image: grafana/grafana-enterprise container_name: grafana restart: unless-stopped ports: - 3000:3000 volumes: - ./grafana:/var/lib/grafana
위와 같이 제가 아는 방법으로 사용을 하면 퍼미션 에러가 나타나더라고요.. 동일하게
하지만. 알려주신 코드를 응용하고 폴더를 생성한 후 아래코드 처럼 연결하면 문제 없이 오류가 없더군요..version: "3.8" services: grafana: image: grafana/grafana-enterprise container_name: grafana restart: unless-stopped ports: - 3000:3000 volumes: - grafana-storage:/var/lib/grafana volumes: grafana-storage: driver: local driver_opts: o: bind type: none device: ./grafana/
이로서 또 하나의 응용 방법을 알게 되었습니다. ㅎㅎㅎ. 감사합니다.
-
nodebb가 클라우드플레어와 궁합이 참 좋습니다.
물론 현재 클라우드플레어 인천 ICN 엣지로 잡아두어서 그런것도 있지만,
woff2/PretendardVariable.woff2
가변 폰트를 통채로 로드하고 있음에도 불구하고 속도가 잘 나오는 것 보면요 :)혹시 저와 같은 테마와 설정을 사용하고 싶으시다면
CSS/SASS 사용자 정의
에
@import url(https://cdnjs.cloudflare.com/ajax/libs/pretendard/1.3.9/variable/pretendardvariable.min.css); .text-md { font-size: 1.21rem!important; } .text-sm { font-size: 0.99rem!important; } .small { font-size: 0.99rem!important; } .text-xs { font-size: 0.88rem!important; }
_variables.css
에
$font-base: "Pretendard Variable", Pretendard, -apple-system, BlinkMacSystemFont, system-ui, Roboto, "Helvetica Neue", "Segoe UI", "Apple SD Gothic Neo", "Noto Sans KR", "Malgun Gothic", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", sans-serif; $font-family-base: $font-base !default; $font-monospace: "D2Coding", ui-monospace, "Noto Mono", SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; $font-family-monospace: $font-monospace !default; $font-family-sans-serif: $font-base !default; $font-family-secondary: $font-base !default; $font-size-base: 1.1rem; $font-size-lg: 1.375rem; $font-size-md: 1.21rem; $font-size-sm: 0.99rem; $font-size-xs: 0.88rem; $gray-100: #f3f6fd; $gray-200: #e8eefc; $gray-300: #bbc2d3; $gray-500: #a6abbd; $gray-600: #4c5774; $gray-700: #303340; $gray-800: #2d3752; $gray-900: #1c263f; $primary: #161f38; $secondary: #434656; $theme-color-interval: 7%; $teal: #5fecbe; $green: #007d57; $yellow: #f1c03a; $blue: #458dff; $cyan: #00adba;
입력하시면 됩니다. 참고로 재빌드가 필요합니다.
폰트는 보시는 것과 같이
$font-base: "Pretendard Variable", Pretendard, -apple-system, BlinkMacSystemFont, system-ui, Roboto, "Helvetica Neue", "Segoe UI", "Apple SD Gothic Neo", "Noto Sans KR", "Malgun Gothic", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", sans-serif;
로 Pretendard를 사용합니다.
-
@purndal 개인적으로 NodeBB가 마음에 듭니다.
오묘한 모양새로 런타임과 정적 빌드를 동시에 사용하는데, 다른 CMS와 다르게 의외로 신경쓸게 별로 없습니다.- 업로드 파일은
uploads
폴더만 관리해주면 됩니다. - 외부 무료 DB서비스 사용 가능합니다.
- 예를 들어 Azure Cosmos DB for MongoDB를 사용하면 연속 적인 백업도 가능한데 심지어 무료입니다. 1000RU/s라는 오묘한 제약으로 무료로 사용하는 건데, 충분합니다. 로그인 세션은 Redis로 보관합니다.
(다만 Azure Cosmos DB for MongoDB의 경우 설명이 조금 불친절 하여, 처음 데이터베이스와 컬렉션을 만들때 CLI로 작업 한번 해줘야 합니다. 아니면 인덱스가 안됩니다..... 친절하게 컬렉션을 지우고 다시하라라고 알려줍니다. ㅡㅡ)
- MongoDB Atlas를 사용해도 되는데, 무료 버전에서는 사용만 가능하고 자동 백업은 되지 않습니다.
- 마찬가지로 Oracle JSON 데이터베이스도 프리티어로 사용 가능합니다.
오라클을 사용하면 DB의 명가 답게 속도가 엄청 빠릅니다. 같은 구조에서DOMContentLoaded: 100 ms
가 나옵니다. 왜그런지는 저도 모르겠습니다.
그런데 여기는 index 관련 문제를 해결할 수 없어서 온몸 비틀기 하다가 포기했습니다.... SQL로 뭘 하라는데 불친절하다고 느낀 Azure가 엄청 친절한 것이었다는 것을 느끼게 해줬습니다. (마찬가지로 로그인 세션은 Redis로 보관)
- DB를 전부
db.objects
에 때려 박습니다. Redis의 구조를 따와서 그렇다고 합니다.
그래서 관리할게 없네요 :) Redis를 DB로 사용할 수도 있습니다. - DB를 전부
db.objects
에 때려 박는 구조 때문에 어떤 외부 DB를 사용하던 Lock-in이 불가능합니다 ㅎㅎ - 마크다운을 지원하고, github와 유사하게 동적으로 참조도 가능합니다. :)
- 테마도 내부적 런타임으로 Node.JS를 사용하기에 git으로 연결해주면 됩니다.
워드프레스나 라이믹스 그리고 그누보드와 같이 파일 백업하랴, 이것 저것 하랴 신경쓸 것이 적어서 너무 편합니다. - 그리고 카테고리가 껍데기 인것도 마음에 듭니다. 거의 대부분의 CMS에서 글 주소의 링크를 카테고리의 슬러그를 집어 넣어버리는데 이러면.... 카테고리 이름이 바뀌면 온몸비틀기를 해야하니까요....
아쉬운 점
- 한국어 검색은 별도의 외부 검색엔진 같은 것으로 연결해 주어야 합니다.
유료인 Elasticsearch를 사용해도 되지만, 거기까지는 필요 없는 것 같아서 (그리고 저렴한 기능 $96라니요....) 저는 Meilisearch를 사용합니다. - 현재 Docker 이미지 PR이 진행 중인데 빨리 Merge 되어 제 손을 떠났으면 좋겠습니다.. ㅠㅠ
- 번역도 한국어, 일본어 리더로 참여 중인데, 번역을 먼저 올리는 것이 아니라, 버전을 먼저 올려버려서 새로운 기능이 추가되면 영문이 뜹니다.
제가 만드는 이미지는 번역을 반영하고 판올림 해서 한국어 사용자의 불편을 최소화 하려고 노력 중인데, 그냥 사용하시면 정말bleeding edge
를 사용하는 기분입니다. - 속도를 원하는 건지 js 파일을 쪼개서 요청을 하는데 덕분에 로그가 지저분합니다.
- 업로드 파일은