UX(사용자 인터페이스)를 통해 업데이트를 수행하면, 결국 커맨드라인 업데이트가 필요하다는 메시지가 표시됩니다. 이는 Debian에 따라 달라지는 것이 아니라, 기본 Discourse 이미지(Docker 이미지)에 따라 달라집니다.
그리고 컨테이너 2개 방식이라면 GUI 업데이트 버튼이 아예 없게 되는 거죠, 맞나요?
GUI 업데이트는 discourse_docker 플러그인에서 제공됩니다. 해당 플러그인이 설치되어 있다면 GUI 업데이트도 함께 제공됩니다.
이미지 조작 도구에서 취약점이 발견되는 경우, 과거에 원격 코드 실행이 실제로 발생한 적이 있으므로, 이미지 업로드 한 번만으로도 시스템이 해킹당할 수 있음을 의미합니다.
Clear Linux는 Linux에서 부팅 속도가 얼마나 빠를 수 있는지를 보여주는 기준을 설정했습니다. 정말 훌륭한 작업이며, 전적으로 추천합니다.
아, 그러면 상황이 좀 달라지네요. 어째서인지 GUI 업데이트 도구가 비표준 2컨테이너 설치 환경에서는 작동하지 않는다고 생각하고 있었습니다. 그렇다면 관리자만 기술적으로 충분히 숙련되어 있다면, 2컨테이너 설치 방식의 단점이 그렇게 많지 않을 것 같습니다. 예를 들어, 휴대폰만 들고 여행 중이었는데 주요 Discourse 보안 업데이트가 나온 경우, SSH 접근 없이도 해당 업데이트를 적용할 수 있기 때문에 GUI 업데이트 기능은 꼭 갖추고 싶습니다.
저도 그렇게 생각합니다. 기본적으로는 Postgres나 Redis 업그레이드가 데이터 컨테이너 재빌드를 요구할 때만 주의를 기울이면 됩니다. 또한 ./launcher bootstrap web_only && ./launcher destry web_only; ./launcher start web_only 명령을 실행해야 한다는 점도 알아야 하지만, 이 정도는 어렵지 않습니다. ./launcher rebuild web_only를 실행하는 것도 가능하지만, 이 경우 재빌드 동안 사이트가 중단됩니다.
완벽하게 설명드리기 위해 덧붙이자면: 웹 UI 빌드는 일반적으로 실제로 다운타임이 전혀 없습니다. bootstrap/destroy/start 과정은 최소한의 다운타임이 발생하며, 이는 외부에서 제공되는 유지보수 페이지와 함께, 여기 문서화된 바와 같이 외부 nginx를 통해 정상적으로 수행하는 것이 좋습니다. 하지만 IPv6 주소를 컨테이너에 가져오는 것만으로도 이 방식은 좋은 관행입니다.
좋습니다, 감사합니다. 그리고 컨테이너 2개를 설치한 경우에도 컨테이너를 다시 빌드해야 할 때 Discourse 대시보드에서 알림을 받을 수 있나요? 그리고 그런 경우 앱만 다시 빌드할지, 데이터 컨테이너도 함께 다시 빌드할지 판단할 수 있을까요?
네. 지금 바로 확인됩니다. ‘버전만 변경된’ 3.1.0.beta1 업데이트를 아직 적용하지 않았기 때문이죠. ![]()
이것은 전형적인 "잘 돌아가다가 안 되면 큰일"인 경우입니다. UI에서 업데이트가 실패하면 사람들이 당황하는데, 문제를 우회하기 위해 git pull; ./launcher rebuild app을 실행해야 한다는 것을 알지 못하기 때문입니다. GUI 업데이트를 무효화하는 변경 사항이 있을 때마다 이런 일이 발생하는 것 같습니다. 또 다시 발생했습니다:
이런 혼란은 이러한 경험을 피할 수 있는 일관되고 정상적인 업데이트 메커니즘의 가치를 강조한다고 생각합니다.
동시에, 부트스트랩이 실행 중인 시스템을 깨뜨리는 드문 경우도 겪었습니다. 제로 다운타임(Zero-downtime) 업데이트도 가끔 이렇게 깨지는데, 평균적으로 연 1~2회 정도 발생하는 것 같습니다. 따라서 부트스트랩과 destroy/start 사이에 지연을 두지 마세요.
이 부분을 명확히 하도록 텍스트를 업데이트해야 할 것 같으니, 다음으로 이를 진행하겠습니다.
아직 LibreTranslate를 배포하지는 않았지만, 사이트를 더 국제적으로 접근 가능하게 만들기 위해 배포를 고려하고 있습니다.
성공적으로 배포하게 되면, 그 내용을 첫 번째 게시물에 반영할 예정입니다. ![]()
이 내용이 대부분 제 수준을 넘어서지만, 그래도 감사하다고 말씀드리고 싶어요. 언급해 주신 몇 가지 설정과 조정 제안, 그리고 커뮤니티 운영에 미치는 영향에 대한 설명만으로도 저에게는 정말 소중했거든요!
내가 지정한 대상 독자층을 넘어 도움이 되었다니 기쁩니다.
며칠 전 새로운 Discourse 인스턴스를 세울 때에도 이 글이 도움이 되었어요. 저도 이 모든 것을 다 기억하지 못하거든요. ![]()
위키의 THP 설정에 문제가 있는 것 같습니다.
Ubuntu에서 Redis를 사용하면서 문제를 겪고 있었습니다:
Your Redis network connection is performing extremely poorly. Last RTT readings were [96585, 101554, 97189, 99769, 94618], ideally these should be < 1000. Ensure Redis is running in the same AZ or dat
위키를 따랐으므로 THP가 이미 비활성화되어 있다고 생각했습니다. 하지만 실제로는 여전히 활성화되어 있었습니다
. THP를 비활성화하는 것이 위의 문제를 해결해 주었습니다(기억이 맞다면 작년 말이었을 겁니다).
Ubuntu 24.04 LTS (현재 위키에 따름):
cat /sys/kernel/mm/transparent_hugepage/enabled
# 출력:
# [always] madvise never
echo 'sys.kernel.mm.transparent_hugepage.enabled=never' > /etc/sysctl.d/10-huge-pages.conf
cat /etc/sysctl.d/10-huge-pages.conf
# 출력:
# sys.kernel.mm.transparent_hugepage.enabled=never
sudo sysctl --system
# 출력:
* Applying /usr/lib/sysctl.d/10-apparmor.conf ...
* Applying /etc/sysctl.d/10-bufferbloat.conf ...
* Applying /etc/sysctl.d/10-console-messages.conf ...
* Applying /etc/sysctl.d/10-huge-pages.conf ...
* Applying /etc/sysctl.d/10-ipv6-privacy.conf ...
* Applying /etc/sysctl.d/10-kernel-hardening.conf ...
* Applying /etc/sysctl.d/10-magic-sysrq.conf ...
* Applying /etc/sysctl.d/10-map-count.conf ...
* Applying /etc/sysctl.d/10-network-security.conf ...
* Applying /etc/sysctl.d/10-ptrace.conf ...
* Applying /etc/sysctl.d/10-zeropage.conf ...
* Applying /usr/lib/sysctl.d/50-pid-max.conf ...
* Applying /etc/sysctl.d/99-cloudimg-ipv6.conf ...
* Applying /usr/lib/sysctl.d/99-protect-links.conf ...
* Applying /usr/lib/sysctl.d/99-sysctl.conf ...
* Applying /etc/sysctl.conf ...
kernel.apparmor_restrict_unprivileged_userns = 1
net.core.default_qdisc = fq_codel
kernel.printk = 4 4 1 7
net.ipv6.conf.all.use_tempaddr = 2
net.ipv6.conf.default.use_tempaddr = 2
kernel.kptr_restrict = 1
kernel.sysrq = 176
vm.max_map_count = 1048576
net.ipv4.conf.default.rp_filter = 2
net.ipv4.conf.all.rp_filter = 2
kernel.yama.ptrace_scope = 1
vm.mmap_min_addr = 65536
kernel.pid_max = 4194304
net.ipv6.conf.all.use_tempaddr = 0
net.ipv6.conf.default.use_tempaddr = 0
fs.protected_fifos = 1
fs.protected_hardlinks = 1
fs.protected_regular = 2
fs.protected_symlinks = 1
cat /sys/kernel/mm/transparent_hugepage/enabled
# 출력:
# [always] madvise never
AlmaLinux 10 (현재 위키에 따름):
cat /sys/kernel/mm/transparent_hugepage/enabled
# 출력:
# [always] madvise never
echo 'sys.kernel.mm.transparent_hugepage.enabled=never' > /etc/sysctl.d/10-huge-pages.conf
cat /etc/sysctl.d/10-huge-pages.conf
# 출력:
# sys.kernel.mm.transparent_hugepage.enabled=never
sudo sysctl --system
# 출력:
* Applying /usr/lib/sysctl.d/10-default-yama-scope.conf ...
* Applying /etc/sysctl.d/10-huge-pages.conf ...
* Applying /usr/lib/sysctl.d/10-map-count.conf ...
* Applying /usr/lib/sysctl.d/50-coredump.conf ...
* Applying /usr/lib/sysctl.d/50-default.conf ...
* Applying /usr/lib/sysctl.d/50-libkcapi-optmem_max.conf ...
* Applying /usr/lib/sysctl.d/50-pid-max.conf ...
* Applying /usr/lib/sysctl.d/50-redhat.conf ...
* Applying /etc/sysctl.d/99-sysctl.conf ...
* Applying /etc/sysctl.conf ...
kernel.yama.ptrace_scope = 0
vm.max_map_count = 1048576
kernel.core_pattern = |/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h
kernel.core_pipe_limit = 16
fs.suid_dumpable = 2
kernel.sysrq = 16
kernel.core_uses_pid = 1
net.ipv4.conf.default.rp_filter = 2
net.ipv4.conf.eth0.rp_filter = 2
net.ipv4.conf.eth1.rp_filter = 2
net.ipv4.conf.lo.rp_filter = 2
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.eth0.accept_source_route = 0
net.ipv4.conf.eth1.accept_source_route = 0
net.ipv4.conf.lo.accept_source_route = 0
net.ipv4.conf.default.promote_secondaries = 1
net.ipv4.conf.eth0.promote_secondaries = 1
net.ipv4.conf.eth1.promote_secondaries = 1
net.ipv4.conf.lo.promote_secondaries = 1
net.ipv4.ping_group_range = 0 2147483647
net.core.default_qdisc = fq_codel
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
fs.protected_regular = 1
fs.protected_fifos = 1
net.core.optmem_max = 81920
kernel.pid_max = 4194304
kernel.kptr_restrict = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.eth0.rp_filter = 1
net.ipv4.conf.eth1.rp_filter = 1
net.ipv4.conf.lo.rp_filter = 1
cat /sys/kernel/mm/transparent_hugepage/enabled
# 출력:
# [always] madvise never
아래 방법이 위키에 적합할 것 같습니다. 테스트 결과 Ubuntu 24.04와 AlmaLinux 10에서 작동하는 것 같습니다:
echo 'w /sys/kernel/mm/transparent_hugepage/enabled - - - - never' | sudo tee /etc/tmpfiles.d/10-huge-pages.conf
sudo systemd-tmpfiles --create /etc/tmpfiles.d/10-huge-pages.conf
확인하려면:
cat /sys/kernel/mm/transparent_hugepage/enabled
예상 출력:
always madvise [never]
그렇게 들으면 다행이네요. 도움이 되는지 모르겠다면 서로 모방만 하고 있을지도 모르거든요!
/etc/sysctl.d가 비활성화(deprecated)되었다고 생각하지 않습니다. 해당 디렉토리에 나열된 다른 파일들을 살펴보고 /etc/sysctl.d/10-huge-pages.conf를 덮어쓰고 있는 파일이 있는지 확인해 주시겠어요? 아마도 그 50-priority 파일들 중 하나일 수도 있습니다.
더 나은 해결책은 huge-pages 설정의 우선순위를 높여서 이기도록 변경하는 것일 것입니다. 하지만 저는 현재 제 시스템에서 해당 버전 중 어느 것도 실행하고 있지 않습니다.
또한 tuned가 해당 설정을 덮어쓰고 있는지 여부도 확인해 보세요.
저는 THP 구성이 적용되는 데 문제가 있었을 뿐, vm.overcommit.memory는 /etc/sysctl.d를 통해 예상대로 적용되었습니다. 이는 작年末에 한 서버에서 발견되어 해결된 문제입니다. 그래서 어제 몇몇 마이크로 VPS를 통해 확인해 보았습니다.
기본 .conf 파일 중 THP 구성에 영향을 미치는 것이 있는지 확인해 보기 위해, 새로 설치한 AlmaLinux 9 마이크로 VPS에서 이 작업을 시도해 보았습니다:
echo always | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
# 출력:
# always
cat /sys/kernel/mm/transparent_hugepage/enabled
# 출력:
# [always] madvise never
sysctl --system
# 출력:
* Applying /usr/lib/sysctl.d/10-default-yama-scope.conf ...
* Applying /usr/lib/sysctl.d/50-coredump.conf ...
* Applying /usr/lib/sysctl.d/50-default.conf ...
* Applying /usr/lib/sysctl.d/50-libkcapi-optmem_max.conf ...
* Applying /usr/lib/sysctl.d/50-pid-max.conf ...
* Applying /usr/lib/sysctl.d/50-redhat.conf ...
* Applying /etc/sysctl.d/99-sysctl.conf ...
* Applying /etc/sysctl.conf ...
kernel.yama.ptrace_scope = 0
kernel.core_pattern = |/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h
kernel.core_pipe_limit = 16
fs.suid_dumpable = 2
kernel.sysrq = 16
kernel.core_uses_pid = 1
net.ipv4.conf.default.rp_filter = 2
net.ipv4.conf.eth0.rp_filter = 2
net.ipv4.conf.eth1.rp_filter = 2
net.ipv4.conf.lo.rp_filter = 2
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.eth0.accept_source_route = 0
net.ipv4.conf.eth1.accept_source_route = 0
net.ipv4.conf.lo.accept_source_route = 0
net.ipv4.conf.default.promote_secondaries = 1
net.ipv4.conf.eth0.promote_secondaries = 1
net.ipv4.conf.eth1.promote_secondaries = 1
net.ipv4.conf.lo.promote_secondaries = 1
net.ipv4.ping_group_range = 0 2147483647
net.core.default_qdisc = fq_codel
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
fs.protected_regular = 1
fs.protected_fifos = 1
net.core.optmem_max = 81920
kernel.pid_max = 4194304
kernel.kptr_restrict = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.eth0.rp_filter = 1
net.ipv4.conf.eth1.rp_filter = 1
net.ipv4.conf.lo.rp_filter = 1
cat /sys/kernel/mm/transparent_hugepage/enabled
# 출력:
# [always] madvise never
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
# 출력:
# never
cat /sys/kernel/mm/transparent_hugepage/enabled
# 출력:
# always madvise [never]
sysctl --system
# 출력:
* Applying /usr/lib/sysctl.d/10-default-yama-scope.conf ...
* Applying /usr/lib/sysctl.d/50-coredump.conf ...
* Applying /usr/lib/sysctl.d/50-default.conf ...
* Applying /usr/lib/sysctl.d/50-libkcapi-optmem_max.conf ...
* Applying /usr/lib/sysctl.d/50-pid-max.conf ...
* Applying /usr/lib/sysctl.d/50-redhat.conf ...
* Applying /etc/sysctl.d/99-sysctl.conf ...
* Applying /etc/sysctl.conf ...
kernel.yama.ptrace_scope = 0
kernel.core_pattern = |/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h
kernel.core_pipe_limit = 16
fs.suid_dumpable = 2
kernel.sysrq = 16
kernel.core_uses_pid = 1
net.ipv4.conf.default.rp_filter = 2
net.ipv4.conf.eth0.rp_filter = 2
net.ipv4.conf.eth1.rp_filter = 2
net.ipv4.conf.lo.rp_filter = 2
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.eth0.accept_source_route = 0
net.ipv4.conf.eth1.accept_source_route = 0
net.ipv4.conf.lo.accept_source_route = 0
net.ipv4.conf.default.promote_secondaries = 1
net.ipv4.conf.eth0.promote_secondaries = 1
net.ipv4.conf.eth1.promote_secondaries = 1
net.ipv4.conf.lo.promote_secondaries = 1
net.ipv4.ping_group_range = 0 2147483647
net.core.default_qdisc = fq_codel
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
fs.protected_regular = 1
fs.protected_fifos = 1
net.core.optmem_max = 81920
kernel.pid_max = 4194304
kernel.kptr_restrict = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.eth0.rp_filter = 1
net.ipv4.conf.eth1.rp_filter = 1
net.ipv4.conf.lo.rp_filter = 1
cat /sys/kernel/mm/transparent_hugepage/enabled
# 출력:
# always madvise [never]
제가 권장하는 오버라이드 우선순수에 대해 정보에 입각한 변경을 할 수 있도록, 이를 오버라이드하는 것이 무엇인지 찾아보기 위해 실제 파일을 살펴봐 주실 것을 요청하는 것입니다.
현재 (제한적인) 제 이해에 따르면, 이전 게시글의 명령어/출력 결과는 오버라이드가 없음을 나타내는 것으로 보입니다.
새로운 AlmaLinux 9 인스턴스의 파일들을 살펴본 결과:
아래 명령어들은 아무 결과도 반환하지 않았습니다:
grep -r "transparent_hugepage" /usr/lib/sysctl.d/ /etc/sysctl.d/ /etc/sysctl.conf
grep -r "transparent" /usr/lib/sysctl.d/ /etc/sysctl.d/ /etc/sysctl.conf
grep -r "huge" /usr/lib/sysctl.d/ /etc/sysctl.d/ /etc/sysctl.conf
grep -r "page" /usr/lib/sysctl.d/ /etc/sysctl.d/ /etc/sysctl.conf
설정 파일의 기본 값:
/usr/lib/sysctl.d/50-redhat.conf:kernel.kptr_restrict = 1
/usr/lib/sysctl.d/50-redhat.conf:net.ipv4.conf.default.rp_filter = 1
/usr/lib/sysctl.d/50-redhat.conf:net.ipv4.conf.*.rp_filter = 1
/usr/lib/sysctl.d/50-redhat.conf:-net.ipv4.conf.all.rp_filter
/usr/lib/sysctl.d/10-default-yama-scope.conf:kernel.yama.ptrace_scope = 0
/usr/lib/sysctl.d/50-libkcapi-optmem_max.conf:net.core.optmem_max = 81920
/usr/lib/sysctl.d/50-coredump.conf:kernel.core_pattern=|/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h
/usr/lib/sysctl.d/50-coredump.conf:kernel.core_pipe_limit=16
/usr/lib/sysctl.d/50-coredump.conf:fs.suid_dumpable=2
/usr/lib/sysctl.d/50-default.conf:kernel.sysrq = 16
/usr/lib/sysctl.d/50-default.conf:kernel.core_uses_pid = 1
/usr/lib/sysctl.d/50-default.conf:net.ipv4.conf.default.rp_filter = 2
/usr/lib/sysctl.d/50-default.conf:net.ipv4.conf.*.rp_filter = 2
/usr/lib/sysctl.d/50-default.conf:-net.ipv4.conf.all.rp_filter
/usr/lib/sysctl.d/50-default.conf:net.ipv4.conf.default.accept_source_route = 0
/usr/lib/sysctl.d/50-default.conf:net.ipv4.conf.*.accept_source_route = 0
/usr/lib/sysctl.d/50-default.conf:-net.ipv4.conf.all.accept_source_route
/usr/lib/sysctl.d/50-default.conf:net.ipv4.conf.default.promote_secondaries = 1
/usr/lib/sysctl.d/50-default.conf:net.ipv4.conf.*.promote_secondaries = 1
/usr/lib/sysctl.d/50-default.conf:-net.ipv4.conf.all.promote_secondaries
/usr/lib/sysctl.d/50-default.conf:-net.ipv4.ping_group_range = 0 2147483647
/usr/lib/sysctl.d/50-default.conf:-net.core.default_qdisc = fq_codel
/usr/lib/sysctl.d/50-default.conf:fs.protected_hardlinks = 1
/usr/lib/sysctl.d/50-default.conf:fs.protected_symlinks = 1
/usr/lib/sysctl.d/50-default.conf:fs.protected_regular = 1
/usr/lib/sysctl.d/50-default.conf:fs.protected_fifos = 1
/usr/lib/sysctl.d/50-pid-max.conf:kernel.pid_max = 4194304
저는 Discourse 인스턴스에 AlmaLinux 9를 사용 중이며, 제가 제공한 구성을 통해 모든 인스턴스에서 THP를 성공적으로 비활성화했습니다. 오버라이드가 없는 상태에서 sysctl.d를 통해 THP를 비활성화하는 것이 작동하지 않고, tuned가 이를 오버라이드하지도 않는다면, 저는 그것이 버그라고 생각합니다.
AlmaLinux 10에서는 더 이상 작동하지 않는다고 말씀하신 줄 알았기 때문에, 왜 거기서 적용되지 않는지 막는 것이 무엇인지 질문했던 것입니다.