MaxMindDB를 찾을 수 없는 오류

로그에 몇 가지 오류가 있습니다

빨간색:

ActiveRecord::StatementInvalid (PG::UndefinedTable: ERROR: relation "groups" does not exist LINE 1: SELECT "groups"."id", "groups"."name" FROM "groups" WHERE

노란색

Failed to handle exception in exception app middleware : PG::UndefinedTable: ERROR: relation "groups" does not exist LINE 1: 
MaxMindDB (/var/www/discourse/vendor/data/GeoLite2-City.mmdb) could not be found: No such file or directory @ rb_sysopen - /var/www/discourse/vendor/data/GeoLite2-City.mmdb
MaxMindDB (/var/www/discourse/vendor/data/GeoLite2-ASN.mmdb) could not be found: No such file or directory @ rb_sysopen - /var/www/discourse/vendor/data/GeoLite2-ASN.mmdb

maxmind 문제를 검색해 보시는 것이 좋습니다.

해당 문제에 대해 검색을 해봐도 권위 있는 답변을 찾지 못했습니다. 이 문제를 잘 아시는 분께서 관련 자료를 여기에 링크해 주실 수 있을까요?

이 MaxMindDB 경고는 무시해도 되는 건가요? 재구성을 해봐도 문제가 해결되지 않는 것 같습니다. 몇 달째 계속 이런 경고가 나오고 있습니다.

이제 가능합니다! Configure MAXMIND for reverse IP lookups

우리는 리버스 프록시 뒤에 Discourse를 사용하고 있으므로 모든 사용자의 IP가 동일합니다. 따라서 GeoIP 조회가 필요하지만, IP 조회를 완전히 비활성화하는 옵션을 찾지 못했습니다. 등록 과정을 거치고, 실제로 필요하지도 않은 라이선스를 구매하는 것만으로도 로그에 나오는 오류를 제거할 수 있다면 좋겠지만, 그런 옵션이 없는 것 같습니다.

IP 조회를 비활성화하는 설정을 놓치고 있는 건가요?

이 부분을 수정해야 합니다. 기존 Apache 사이트가 있는 서버에 Discourse를 설정하는 방법(Set up Discourse on a server with existing Apache sites)과 같은 주제에 해당 설정에 대한 설명이 있을 것 같습니다.

maxmind 키를 설정하지 않으면 재빌드 시 경고가 표시되지만, 이로 인해 발생하는 문제는 없을 것입니다.

라이선스 키가 설정되지 않은 경우, 사용자 관리 설정에서 GeoIP 조회를 숨기고 건너뛰는 것이 합리적이지 않을까요? 아니면 Configure MAXMIND for reverse IP lookups 에 따라 라이선스 키를 설정하면 GeoIP 조회가 가능하다는 정보/플레이스홀더를 표시하는 것이 나을까요?

시스템 운영을 모니터링하기 위해 에러 로그를 반복 확인하는 것은 좋은 관행이지만, 기본적으로 실패할 것으로 예상되는 작업이 시도되어 발생한 에러임을 확인하기 위해 에러를 조사하는 데 시간을 보내는 것은 번거롭습니다. 단일 설정만 확인하면 쉽게 건너뛸 수 있는 상황인데도 말입니다 :wink:.

기본적으로 동의해 주신다면 GitHub에서 PR을 열어볼 수 있습니다. 하지만 제가 무언가를 간과하고 있어서 그렇게 간단하지 않거나, 제가 인지하지 못하는 단점이 있을 수도 있습니다.

좋은 아이디어네요. PR을 올려주시면 기꺼이 검토하겠습니다.

PR을 올렸는데, 코드에 테스트를 적용하는 방법과 실행 중인 Discourse 인스턴스에서 테스트하는 방법에 대한 도움이 필요합니다: UX: Show if MaxMind key is missing on IP lookup - Pull Request #18993 - discourse/discourse - GitHub

이 메시지를 무시하고 있었습니다:

MaxMindDB (/var/www/discourse/vendor/data/GeoLite2-ASN.mmdb) could not be found: No such file or directory @ rb_sysopen - /var/www/discourse/vendor/data/GeoLite2-ASN.mmdb
MaxMindDB (/var/www/discourse/vendor/data/GeoLite2-City.mmdb) could not be found: No such file or directory @ rb_sysopen - /var/www/discourse/vendor/data/GeoLite2-City.mmdb

…그런데 방금 이 메시지를 억제하는 방법을 찾아보고 있었습니다.

MaxMind를 구성할 수도 있지만, 실제로는 필요하지 않습니다.

위 PR은 2023-11-23에 병합되었습니다 – 이 에러를 더 이상 볼 필요가 없는 것 아닌가요?

자동화된 테스트를 조정하기가 너무 복잡해서 다시 되돌려졌(revert)습니다. 시도는 했지만, 그 시도들은 경고를 다시 추가하여 제 PR의 원래 목적을 무너뜨렸습니다:

따라서 두 PR 모두 되돌려졌습니다:

가장 큰 문제는 데이터베이스 읽기를 MaxMind 키의 존재 여부에 의존하게 만든 것이었습니다. 하지만 데이터베이스는 다른 방식으로 추가할 수도 있습니다. 저희 인스턴스에서는 그동안 계정이 필요 없는 무료 DB-IP 데이터베이스를 추가하고 있습니다. 따라서 제 PR은 현재 우리가 사용하는 방식을 깨뜨렸을 것입니다. 제 PR에서 수정했던 실패하는 테스트의 원인이기도 했지만, 메인 브랜치와/또는 특정 플러그인에서는 다른 문제를 일으켰을 가능성이 높습니다.

누군가 이 문제를 다시 다룬다면 더 나은 해결책은 라이선스 키가 정의되어 있는지 확인하는 대신, 데이터베이스 파일을 로드하려고 시도하기 전에 파일이 존재하는지 확인하는 것입니다. 즉, 여기에서:

  • File.join(path, "GeoLite2-City.mmdb")가 존재할 경우에만 mmdb_load를 실행해야 합니다.

조절된 GUI 출력도 일부 테스트에서 문제가 되었을 수 있지만, 위치 정보가 없을 때만 폴백으로 사용되고 해당 플래그가 true일 때만(제 PR에서 ret[:no_license] = true로 설정한 플래그) 표시되도록 하면 테스트를 깨뜨리지 않고 추가하는 것이 가능해야 합니다. 하지만 MaxMind 라이선스 키가 정의되었는지에 관한 것이 아니라 실제 데이터베이스 파일이 존재하는지 여부를 나타내기 위해 no_db 등으로 이름이 변경되어야 합니다. 이렇게 하면 단위 테스트에서 실제 데이터베이스나 라이선스 키 없이 위치 정보를 주입하여 출력을 테스트할 수 있습니다.

정보 주셔서 감사합니다! 파일을 로드하기 전에 파일의 존재 여부를 확인하는 것이 합리적인 것 같습니다. 제가 패치를 개발할 사람은 아니니, MaxMind를 활성화해서 로그를 정리해 보겠습니다.