MAXMIND 일일 한도가 소진되면 Rebuilding이 항상 실패합니다

방금 재빌드(rebuild)를 시도했는데 이 지점에서 실패했습니다:

 - dist/javascripts/media-optimization-worker.js: 5.01 kB (1.74 kB gzipped)
 - dist/javascripts/pikaday/1.8.2/pikaday.js: 42.54 kB (9.67 kB gzipped)
 - dist/javascripts/squoosh/mozjpeg_enc.js: 39.03 kB (10.81 kB gzipped)
 - dist/javascripts/squoosh/squoosh_resize.js: 4.53 kB (1.28 kB gzipped)
Done in 355.08s.

I, [2024-07-08T07:59:42.015855 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'SKIP_EMBER_CLI_COMPILE=1 bundle exec rake themes:update assets:precompile'
Purging temp files
Bundling assets
I, [2024-07-08T07:59:57.247206 #1532]  INFO -- : Writing /var/www/discourse/public/assets/break_string-cc617154cd957804f2f6a1f3bc68258c9cdca3d4b9a322bf777d145fed04790e.js
I, [2024-07-08T07:59:57.264957 #1532]  INFO -- : Writing /var/www/discourse/public/assets/service-worker-9764e1cd771b38dbe65a0d1e42d89cb2cb5f72b266ab7316e55d3371cb0ac870.js
I, [2024-07-08T07:59:57.271269 #1532]  INFO -- : Writing /var/www/discourse/public/assets/locales/i18n-3b40e842fd72b9bcc74ea83e094c823cd9ca535e4ecc5e78722e6f99d3656137.js
I, [2024-07-08T07:59:57.277082 #1532]  INFO -- : Writing /var/www/discourse/public/assets/scripts/discourse-test-listen-boot-9b14a0fc65c689577e6a428dcfd680205516fe211700a71c7adb5cbcf4df2cc5.js
I, [2024-07-08T07:59:59.103776 #1532]  INFO -- : Writing /var/www/discourse/public/assets/locales/ar-dfed7a58f30378bc60d7a2cc8d6347524f68b272ae012f0232604f730e442f91.js
I, [2024-07-08T08:00:00.112555 #1532]  INFO -- : Writing /var/www/discourse/public/assets/locales/be-e12ac4c99df2289f422efd371dd3da766754aecb1189ea763fe003376aca9028.js
rake aborted!
Zlib::BufError: buffer error (Zlib::BufError)
1개의 좋아요

질문이 하나 있습니다. S3를 사용하고 계신가요? 저도 그렇게 의심하고 있습니다.

:baymax_no: S3은 나에게 안 맞아요.

1개의 좋아요

일일 사용 한도가 소진될 때만 이런 문제가 발생하는지 확실하지 않습니다. 하지만 지난 2~3개월간 여기서는 항상 이런 일이 일어나고 있습니다. 다른 사용자들도 동일한 문제를 겪고 있는 것으로 보입니다:

Maxmind 파일을 로컬 디렉터리에서 제공하는 것이 좋은 아이디어일 수 있습니다. 다른 용도로도 이 파일을 다운로드하고 있으므로 이미 제 환경에 존재합니다.

아마도 Maxmind 파일을 Discourse 컨테이너의 공유 디렉터리에 제공하는 것이 더 나을 수도 있습니다. 이렇게 하면 항상 최신 버전을 유지할 수 있습니다. 앞서 말씀드린 것처럼 저는 어차피 이 파일을 매일 다운로드하여 업데이트하고 있습니다.

1개의 좋아요

문제가 한도와는 관련이 없다고 생각합니다. 다시 말해, 잘못된 키나 계정 ID를 입력해도 에러가 발생합니다. 여기서는 다음과 같이 문제를 해결할 수 있습니다: 에러가 발생하면 기존 데이터베이스를 사용하고 재구축을 계속하도록 하는 것입니다. 물론 이 문제의 근본적인 원인을 파악하는 것이 매우 중요합니다.

2일 전에 예제를 만들어 보았더니 에러가 발생했습니다. 한도와는 아무런 관련이 없었습니다. 왜냐하면 그날 처음 재구축을 한 것이었기 때문입니다. 그 후 새로운 키를 만들어 시도해 보니 작동했습니다. 여기에는 다음과 같은 상황이 있습니다: 키를 생성하면 활성화되는 데 시간이 걸립니다. 바로 다시 생성하면 에러가 발생합니다.

흥미롭네요 :slight_smile:

음, 내 키는 오래됐고, 처음 사용했을 때 이후로 한 번도 바꾼 적이 없어요. 새 키를 만들면 왜 동작하는 거죠? 활성화되는 데 시간이 좀 걸린다고 하셨잖아요. 그러면 그 시점에 에러가 발생해야 하는 거 아닌가요?

좋은 아이디어네요. 아니면 제가 제안했듯이 로컬 디렉터리에서 파일을 제공하는 것도 가능하죠. 전부 선택 사항입니다. 하지만 재구축이 몇 주째 로또처럼 작동하는 게 정말 짜증나요…

1개의 좋아요

이것은 Maxmind의 사용 약관에 위배되기 때문에, 모든 사용자가 파일을 개별적으로 다운로드하도록 API 키를 제공해야 합니다.

일일 한도에 도달했을 때 발생하는 문제의 원인을 파악하기 위해 제게 할당해 주셨습니다.

2개의 좋아요

리빌드가 실패한 후, maxmind 설정을 꺼둔 상태로 이미지를 빌드했습니다. 그리고 컨테이너 내부에서 설정을 다시 추가하고 rake 작업을 성공적으로 실행했습니다.

데이터베이스를 다운로드하지 않고 리빌드한 다음, 컨테이너가 부팅될 때 데이터베이스를 다운로드하도록 하는 것이 가능할까요?

또한, 다운로드가 실패하더라도 bootstrap이 성공할 수 있도록 허용하는 PR을 추가했습니다(병합되었습니다). 하지만 여전히 bootstrap이 실패하는 문제가 있습니다.

2개의 좋아요

네, 맞다고 생각해요. Maxmind는 핵심 기능이 아니니까, 다운로드가 안 될 때 부트스트랩까지 실패하게 할 필요는 없어요.

6개의 좋아요

제가 하려는 말을 이해하지 못하신 것 같습니다. 다시 설명해 보겠습니다:

저는 며칠에 한 번씩 Maxmind 파일을 다운로드하는 스크립트를 가지고 있습니다. 물론 제 자신의 API 키를 사용하는 것이죠. 이 파일들은 서버에서 AWstats 웹 통계, WordPress 플러그인 등 여러 용도로 사용됩니다.

결국 제 머신에는 이미 해당 파일들이 존재합니다. 그러면 Discourse 컨테이너를 다시 빌드할 때 왜 (다시) 파일을 다운로드해야 하는 걸까요?

정말 훌륭한 아이디어입니다. :slight_smile:

1개의 좋아요

네. 특히 인스턴스 간에 공유할 수 있다면, 해당 파일들을 영속적 저장소(persistent storage)에 유지할 수 있으면 좋겠습니다. 저는 traefik 뒤에 동일한 머신에 Discourse 사이트 여러 개를 운영하고 있는데, 이 사이트들이 모두 동일한 mmdb 파일을 공유할 수 있다면 여러 개의 개별 사본을 유지하고 다운로드하는 수고를 덜 수 있을 것입니다. 표준 설치 환경에서도 빌드 간에 파일이 영속적으로 유지될 수 있으면 좋겠습니다. 이미 가능한 것일까요? /var/www/discourse/vendor/data를 영속적인 위치에 마운트하는 것만으로 충분할까요?

아, 그렇군요. GlobalSetting.maxmind_backup_path가 바로 그 용도로 사용되는 것 같습니다. 즉, 어떤 이유로든 maxminddb를 가지고 있다면 DISCOURSE_MAXMIND_BACKUP_PATH를 컨테이너에서 접근 가능한 경로로 설정할 수 있을 것 같습니다.

또한, 에셋을 사전 컴파일할 때 mmdb가 왜 필요한가요?

2개의 좋아요

즉, 이미 이 기능이 작동하고 있는 건가요? app.yml에서 DISCOURSE_MAXMIND_BACKUP_PATH를 설정하면(컨테이너 내부의 내부 링크 또는 Docker 호스트의 절대 경로 중 어떤 것이든) 재빌드 시 Maxmind로부터의 다운로드가 비활성화되나요?

코드에 있습니다. 저는 한 번도 사용해 본 적이 없습니다. 거기에 경로를 포함하면 해당 경로를 찾는 것 같습니다. 정확히 기억은 나지 않지만, 디렉터리 경로를 지정하는 것 같습니다.

좋아요, 한번 시도해 볼 수 있겠네요. 여러 인스턴스가 있고 그중 하나는 테스트용으로만 사용되고 있습니다.

파일이 로컬에서 가져온 것인지, 아니면 다운로드된 것인지 확인할 수 있을까요?

그러면 Docker 호스트에서 /var/discourse/maxmind 같은 경로인가요?

죄송합니다. 정확하지는 않은데요. 디렉토리를 요구하는 것 같고, 원하는 이름으로 만들 수 있으니 app.yml에 볼륨을 추가해 보세요. 예를 들어 다음과 같이:

  - volume:
      host: /data/
      guest: /data

그리고 DISCOURSE_maxmind_backup_path=/data/mmdb (환경 변수의 대소문자를 수정)

해당 코드는 여기 있습니다.

다시 한번 감사합니다. /var/discourse/shared/discourse_test/data/mmdb를 생성했고, app.yml에는 다음과 같이 수정했습니다:

  ## The maxmind geolocation IP address key for IP address lookup
  ## see https://meta.discourse.org/t/-/137387/23 for details
  DISCOURSE_MAXMIND_ACCOUNT_ID: 123456
  DISCOURSE_MAXMIND_LICENSE_KEY: abcdefg
  DISCOURSE_MAXMIND_BACKUP_PATH: /data/mmdb

## The Docker container is stateless; all data is stored in /shared
volumes:
  - volume:
      host: /var/discourse/shared/discourse_test
      guest: /shared
  - volume:
      host: /var/discourse/shared/discourse_test/log/var-log
      guest: /var/log
  - volume:
      host: /var/discourse/shared/discourse_test/data
      guest: /data

DISCOURSE_MAXMIND_BACKUP_PATH를 추가하고 세 번째 볼륨을 추가했습니다.

DISCOURSE_MAXMIND_BACKUP_PATH의 디렉토리가 올바른가요? 이 경로는 컨테이너 내부의 경로를 의미하나요?

이제 DISCOURSE_MAXMIND_ACCOUNT_IDDISCOURSE_MAXMIND_LICENSE_KEY를 제거해야 하나요?

너무 들떠서 설명이 다소 불분명했던 것 같습니다. :wink:

오오오오 :smiley:

Detected MaxMindDB backup (downloaded: 2024-07-17 23:15:02 +0000) at /data/mmdb
Copying MaxMindDB from /data/mmdb to /var/www/discourse/vendor/data
Skip downloading MaxMindDB as it was last downloaded at 2024-07-17 23:15:02 +0000

이게 우리가(또는 나) 보고 싶었던 내용인 것 같습니다. :smiley:

3개의 좋아요

추가 볼륨을 생략하고

DISCOURSE_MAXMIND_BACKUP_PATH: /shared/data

이렇게 했을 수도 있다고 생각합니다.

다만, 다른 프로세스가 해당 데이터베이스를 다른 곳에서 최신 상태로 유지하고 있다면, 해당 디렉터리를 마운트하여 로컬 드라이브에 로컬 복사본을 하나만 가지고 있고, 그 하나만 업데이트하면 되도록 할 수 있습니다.

2개의 좋아요

그대로 두는 것이 좋겠다고 생각합니다. 제 눈에 더 명확한 구성이며, 몇 달이 지나도 여전히 이해할 수 있습니다. 또한 제 용도뿐 아니라 더 다양한 사용 사례에 적용할 수 있는 더 범용적인 구성일 수도 있습니다.

Maxmind에서 mmdb 파일 3개를 다운로드할 때 해당 디렉터리로 복사합니다. 제가 사용하는 스크립트를 조정했을 뿐입니다 (참고로, 다운로드에는 geoipupdate를 사용하는데, 이 도구는 Debian(그리고 아마도 다른 대부분의 Linux 배포판)에서도 패키지로 제공됩니다).

방금 4개의 서로 다른 Discourse 컨테이너를 다시 빌드했는데, 모두 오류 없이 완료되었습니다! 몇 달간 이런 일이 없었거든요. 정말 좋습니다! :slight_smile:

3개의 좋아요

이 문제가 여전히 지속되고 있습니다. 사고 내용을 자세히 설명드리겠습니다:
관리자에서 업데이트를 진행했는데 중간에 멈추었습니다. 그래서 SSH 패널에서 재컴파일을 시작했더니 바로 오류가 발생했습니다. 오류 예시는 아래와 같습니다.

그 후 MaxMind 키를 새로 생성하고 다시 컴파일했는데, 같은 오류가 다시 발생했습니다. (흥미로운 점은 키가 활성화되지 않았을 수도 있다는 것입니다.)

이어서 app.yml 파일에서 MaxMind 설정을 비활성화했습니다. 재컴파일을 진행했고, 이번에는 컴파일이 성공적으로 완료되었습니다.

사용한 애드온은 이미지에 표시되어 있으며, 추가로 사용한 항목은 다음과 같습니다:

  • Cloudflare R2
  • 별도 PostgreSQL 서버
  • Cloudflare

더 이상 문제의 원인을 파악할 수 없습니다.

1개의 좋아요