수백 MB의 중복으로 보이는 로케일 .js 파일

작은 규모의 포럼(500MB 백업)을 운영 중인데, 50GB 디스크에서 공간 부족으로 인해 ./launcher rebuild 실행이 실패하고 있습니다. 다른 정리 방법을 알아보다가 (apt autoremove./launcher cleanup는 아무것도 정리하지 못했습니다) /var/lib/docker/overlay2/.../merged/var/www/discourse/public/assets/locales에 수백 MB에 달하는 쓸모없는 로케일이 여러 개 있는 것을 발견했습니다.

불행히도 스크린샷을 찍기 전에 삭제를 시작해서 이미 일부가 지워진 상태이지만, 여전히 동일한 언어에 대해 중복된 것으로 보이는 컴파일된 JS 파일이 많이 남아 있는 것을 볼 수 있습니다. Discourse 코드에서 이를 방지할 수 있는 방법이 있을까요? .map 파일은 어떤 용도로 사용되나요?

그리고 제 포럼은 영어만 사용하고 있습니다. 다른 모든 언어를 제외하는 방법은 무엇일까요?

수동으로 정리하고 싶지 않은 수백 MB의 로케일이 /usr/lib/locale에도 더 있습니다:

이 서버가 Discourse만 실행 중이라면, 다음 명령어를 실행해 볼 수 있습니다:

cd /var/discourse
./launcher stop app
docker rmi -f $(docker images -aq)
./launcher rebuild app

이 명령어는 Discourse를 중지하고 모든 Docker 이미지를 삭제한 후, 현재 이미지를 다운로드하여 Discourse를 다시 빌드합니다.

누적되는 파일과 관련하여, @david 님, 로컬 스토리지에 대해 rake s3:expire_missing_assets와 유사한 기능이 있나요?

컨테이너 내부의 /var/www/discourse/public 디렉터리는 호스트에 마운트되어 있지 않으니… 표준 설치 환경에서 ./launcher rebuild app을 실행하면 이 디렉터리의 모든 파일이 삭제될 것이라고 확신합니다. :thinking:

네, 근데 웹 업데이트는 어떡하죠?

서버는 실제로 Discourse만 실행되고 있습니다.

명령어를 실행했는데 로케일 관련 오류가 발생했고, 이제 출력 내용이 FATAL: database files are incompatible with server. The data directory was initialized by PostgreSQL version 13, which is not compatible with this version 15.12(데이터베이스 파일이 서버와 호환되지 않습니다. 데이터 디렉토리는 이 버전 15.12와 호환되지 않는 PostgreSQL 버전 13으로 초기화되었습니다)에서 멈춰 있습니다.

실수로 중요한 로케일 파일을 삭제한 걸까요? en_US.UTF-8은 성공적으로 재생성된 것 같습니다.

# uname -a
Linux localhost 4.4.0-266-generic #300-Ubuntu SMP Mon Feb 17 19:45:09 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux
root@localhost:/var/discourse# docker rmi -f $(docker images -aq)
Untagged: discourse/base:2.0.20250226-0128
Untagged: discourse/base@sha256:6f18aa2cd22bba0deb91d69194e577d4f96130ad555ae8ec646a8792cbfe37db
Deleted: sha256:557b1ff6168ad5bc1d1d80c6eaf6c10459780536cc281d020194a60aba9d833e
Untagged: local_discourse/app:latest
Deleted: sha256:06d986a896b239daabb5ed5ba64f70cb55ba53dc58e8c5147c19068378a2252d
Deleted: sha256:5f2aa2694b8b8e8ee8ac1a43dcf9d804ef9db3da11fc78027520c043408cc575
Error: No such image: 5f2aa2694b8b
root@localhost:/var/discourse# ./launcher rebuild app
WARNING: Docker version 20.10.7 deprecated, recommend upgrade to 24.0.7 or newer.
x86_64 arch detected.

WARNING: We are about to start downloading the Discourse base image
This process may take anywhere between a few minutes to an hour, depending on your network speed

Please be patient

2.0.20250226-0128: Pulling from discourse/base
af302e5c37e9: Already exists
ed49ab5c933d: Already exists
4d13d450f300: Already exists
[...]
bc6c17ae1969: Already exists
d19f089ead0e: Already exists
Digest: sha256:6f18aa2cd22bba0deb91d69194e577d4f96130ad555ae8ec646a8792cbfe37db
Status: Downloaded newer image for discourse/base:2.0.20250226-0128
docker.io/discourse/base:2.0.20250226-0128
WARNING: containers/app.yml file is world-readable. You can secure this file by running: chmod o-rwx containers/app.yml
Ensuring launcher is up to date
Fetching origin
Launcher is up-to-date
Stopping old container
+ /usr/bin/docker stop -t 600 app
app
2.0.20250226-0128: Pulling from discourse/base
Digest: sha256:6f18aa2cd22bba0deb91d69194e577d4f96130ad555ae8ec646a8792cbfe37db
Status: Image is up to date for discourse/base:2.0.20250226-0128
docker.io/discourse/base:2.0.20250226-0128
/usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups.rb
/usr/local/bin/pups --stdin
I, [2025-04-03T17:28:37.320187 #1]  INFO -- : Reading from stdin
I, [2025-04-03T17:28:37.358715 #1]  INFO -- : File > /etc/service/postgres/run  chmod: +x  chown: 
I, [2025-04-03T17:28:37.369442 #1]  INFO -- : File > /etc/service/postgres/log/run  chmod: +x  chown: 
I, [2025-04-03T17:28:37.376162 #1]  INFO -- : File > /etc/runit/3.d/99-postgres  chmod: +x  chown: 
I, [2025-04-03T17:28:37.381934 #1]  INFO -- : File > /root/install_postgres  chmod: +x  chown: 
I, [2025-04-03T17:28:37.386982 #1]  INFO -- : File > /root/upgrade_postgres  chmod: +x  chown: 
I, [2025-04-03T17:28:37.389829 #1]  INFO -- : Replacing data_directory = '/var/lib/postgresql/15/main' with data_directory = '/shared/postgres_data' in /etc/postgresql/15/main/postgresql.conf
I, [2025-04-03T17:28:37.391604 #1]  INFO -- : Replacing (?-mix:#?listen_addresses *=.*) with listen_addresses = '*' in /etc/postgresql/15/main/postgresql.conf
I, [2025-04-03T17:28:37.398346 #1]  INFO -- : Replacing (?-mix:#?synchronous_commit *=.*) with synchronous_commit = $db_synchronous_commit in /etc/postgresql/15/main/postgresql.conf
I, [2025-04-03T17:28:37.399876 #1]  INFO -- : Replacing (?-mix:#?shared_buffers *=.*) with shared_buffers = $db_shared_buffers in /etc/postgresql/15/main/postgresql.conf
I, [2025-04-03T17:28:37.401239 #1]  INFO -- : Replacing (?-mix:#?work_mem *=.*) with work_mem = $db_work_mem in /etc/postgresql/15/main/postgresql.conf
I, [2025-04-03T17:28:37.402470 #1]  INFO -- : Replacing (?-mix:#?default_text_search_config *=.*) with default_text_search_config = '$db_default_text_search_config' in /etc/postgresql/15/main/postgresql.conf
I, [2025-04-03T17:28:37.403467 #1]  INFO -- : Replacing (?-mix:#?checkpoint_segments *=.*) with checkpoint_segments = $db_checkpoint_segments in /etc/postgresql/15/main/postgresql.conf
I, [2025-04-03T17:28:37.404421 #1]  INFO -- : Replacing (?-mix:#?logging_collector *=.*) with logging_collector = $db_logging_collector in /etc/postgresql/15/main/postgresql.conf
I, [2025-04-03T17:28:37.405408 #1]  INFO -- : Replacing (?-mix:#?log_min_duration_statement *=.*) with log_min_duration_statement = $db_log_min_duration_statement in /etc/postgresql/15/main/postgresql.conf
I, [2025-04-03T17:28:37.406950 #1]  INFO -- : Replacing (?-mix:^#local +replication +postgres +peer$) with local replication postgres  peer in /etc/postgresql/15/main/pg_hba.conf
I, [2025-04-03T17:28:37.407960 #1]  INFO -- : Replacing (?-mix:^host.*all.*all.*127.*$) with host all all 0.0.0.0/0 md5 in /etc/postgresql/15/main/pg_hba.conf
I, [2025-04-03T17:28:37.408886 #1]  INFO -- : Replacing (?-mix:^host.*all.*all.*::1\/128.*$) with host all all ::/0 md5 in /etc/postgresql/15/main/pg_hba.conf
I, [2025-04-03T17:28:37.409731 #1]  INFO -- : > if [ -f /root/install_postgres ]; then
  /root/install_postgres && rm -f /root/install_postgres
elif [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then
  socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres already running stop container ; exit 1
fi

failed to set locale!
[error] character map file `UTF-8' not found: No such file or directory
failed to set locale!
[error] default character map file `ANSI_X3.4-1968' not found: No such file or directory
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
        LANGUAGE = "en_US.UTF-8",
        LC_ALL = "en_US.UTF-8",
        LANG = "en_US.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
/bin/bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
popen failure: Cannot allocate memory
initdb: error: program "postgres" is needed by initdb but was not found in the same directory as "/usr/lib/postgresql/15/bin/initdb"
I, [2025-04-03T17:28:38.987799 #1]  INFO -- : Generating locales (this might take a while)...
  en_US.UTF-8... done
Generation complete.
Upgrading PostgreSQL from version 13 to 15

I, [2025-04-03T17:28:38.988959 #1]  INFO -- : > HOME=/var/lib/postgresql USER=postgres exec chpst -u postgres:postgres:ssl-cert -U postgres:postgres:ssl-cert /usr/lib/postgresql/15/bin/postmaster -D /etc/postgresql/15/main
I, [2025-04-03T17:28:38.991509 #1]  INFO -- : Terminating async processes
2025-04-03 17:28:39.091 UTC [51] FATAL:  database files are incompatible with server
2025-04-03 17:28:39.091 UTC [51] DETAIL:  The data directory was initialized by PostgreSQL version 13, which is not compatible with this version 15.12 (Debian 15.12-1.pgdg120+1).



^C^C^C

프로세스가 Ctrl+C에 반응하지 않습니다.

네, 그 경우에도 유지됩니다. 하지만 CLI 업데이트는 최소 6개월에 한 번은 강제적으로 적용되므로, 큰 문제가 되지는 않을 것으로 생각합니다.

로케일(locale)에 대해서는, 처음 요청될 때 “즉시” 컴파일되도록 몇 가지 변경을 계획하고 있습니다. 대부분의 사이트가 한 가지 언어로만 운영되므로 훨씬 효율적일 것입니다.

이것은 상황이 좋지 않아 보입니다. 서버 메모리가 매우 부족합니까? 스왑이 설정되어 있습니까?

데이터베이스 업데이트에 대해서는 PostgreSQL 15 업데이트를 참조하십시오.

서버에는 2GB의 RAM이 있습니다. 스왑은 추가로 2GB로 설정되어 있습니다.

Ubuntu 16(알고 있습니다)에서 18로 인플레이스 업그레이드를 수행하고, /var/discourse/containers/app.yml 파일에 세 가지 로케일 환경 변수 설정을 추가했으며, 이제 PostgreSQL v13 마이그레이션이 성공적으로 완료되었고 최신 버전의 Discourse가 Ubuntu 18에서 정상적으로 실행되고 있습니다.