generated from ttipo/project-base
fix(docker): mail setup 받는 메일 크기 한도 50MiB · 전환 준비 문서 (mailcow 확인 · 서버 B 배포 · 백업 · 큰 메일) #12
Reference in New Issue
Block a user
Delete Branch "feat/mail-migration-password"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
무엇을 · 왜
PR #11(메일 이전)을 합친 뒤 운영 mailcow 를 직접 확인한 결과로
mail/README.md의 imapsync 절을 바로잡고, 같은 날 서버 B 를 12 · 13단계로 올리며 겪은 것을 배포 차례에 남겼다. 그리고 이전 1 · 2차에서 나온 큰 메일 문제로 setup 이 SMTP 받는 메일 크기 한도를 맞추게 했다(6dc2777— 나머지 커밋은 문서만)./opt/mailcow-dockerized—mailcow.conf· 저장소가 root 소유) — 확인 · 마스터 계정 명령을 sudo 와 전체 경로로. git 의safe.directory는 건드리지 않는다.generate_config.sh가DOVECOT_MASTER_USER=·DOVECOT_MASTER_PASS=를 넣어 두므로 "주석이 아니면 정해 둔 것"이 아니다(운영도 둘 다 빈 값). 확인은 값 대신 비었는지만 보고, 이전을 마칠 때는 줄을 지우지 않고 값을 비운다.--justlogin. 단계 2(계정 만들기)부터는 짧게 이어야 하므로 원본 쪽 문제(마스터 · 인증서 · 앞단 길)를 그 전에 고친다.10.9.0.1(사설)로 본다 — 최근 7일 로그인 줄과 지금 연결로 확인(공인 주소 0). mailcow 의 Fail2ban 은 사설 · 루프백 주소를 막지 않으므로(원본netfilter/main.py) 서버 B 를 예외에 넣을 필요가 없다. 남는 것은 Dovecot 의 늦추기(실패한 주소의 다음 로그인 최대 15초 — 바깥 직원 모두와 같은 주소)라 실패를 되풀이하지 않는다.--since만 주면 0줄이다(처음부터 읽다 중간에서 말없이 멈추는 것으로 보인다) — 로그 명령은 모두--tail로, 로그 없이 지금 연결을 보는doveadm who를 더했다.32156a33), Dovecot 2.3 줄기.docker update2g 뒤 다시 돌려 통과. 110 MiB 를 넘는 초안 두 통은 옮기지 못했다(사용자가 따로 보관). 이전 뒤 한도 · 메모리를 어떻게 둘지는 아래6dc2777에서 정했다.6dc2777— 개발 엔진 실측 · 사용자 결정): 큰 메일 한 통에 엔진 메모리가 그 크기의 5.5배쯤 들고, SMTP 받는 한도(x:MtaStageData의maxMessageSize, 기본 100MiB)는x:Email한도와 따로라 기본값 · 1g 에서 바깥 104MB 한 통이 984/1024MiB 였다.메모리는 1g 그대로 두고 setup 이 받는 한도를 50MiB 로 맞춘 뒤 리로드 뒤 EHLO 의
SIZE로 확인한다([확인] 받는 메일 크기 한도 — EHLO SIZE …). IMAP · 메일 크기 한도는 이전 동안 올리므로 바꾸지 않고 기본보다 크면[주의]만.운영 전환 7번은 이전을 마치면 세 값을 관리 화면에서 기본으로 → setup 의
[확인]→ 메모리 1g 차례다 — 이 PR 을 합친 뒤 서버 B 에서git pull해 둔다.e664217docs34d63cfdocsb43b747docs10.9.0.1이라 Fail2ban 예외 필요 없음 · 로그는--tail·doveadm who07b7fccdocs--recovery의 Spamhaus ZEN 시간 초과(종료 1)는 보통 setup 이 다시 켬 · 마이그레이션은migrations표로 · 손 백업에 DB 덤프(떠 있는alpine대신 지금 도는 DB 이미지)0388cf6docsops/ops.env.example머리말) — 서버 밖 사본이 백업보다 먼저 생긴다feabe0ddocs9b530dadocsops/ops.env.example· 체크리스트)3f8ba00docs5829814docsinit의Stat: Access Denied진단(S3 오류 코드 보기 — 겪은 것은SignatureDoesNotMatch) ·journalctl은 sudo · ops.env 의ARASYSTEM_DIR예시 값 주의3b59497docsConnection refused) ·docker update2g 는 다시 만들면 사라짐 · 옮기지 못한 초안 · 메모리 예산 표의 mail 줄6dc2777fix(docker)[주의]만, README 「엔진 한도」의 「받는 메일 크기」(잰 값 표 · 넘으면 · 확인하지 않은 것) · 이전 뒤 되돌리는 차례 · 문제 해결 줄, docker 스킬 한 항목2cd2764test(backend)jmap.client.spec.ts— 가짜 응답 없는 fetch 가 진짜http://mail:8080으로 나가던 것을 곧바로 연결 실패로 막고(afterEach 가 남은 주소를 잡는다), 메일 계정이 없는 세션 · 실시간 연결 403 두 테스트에 계정 정보 응답을 넣었다349c312test(frontend)vi.waitFor로 기다린 뒤 보낸다(조각 SHA-256 이 Node Web Crypto · 스레드 풀이라 부하에서 늦다),WAIT_FOR_TIMEOUT_MSbc22f5ftest(backend)backend/test/cpu-time.ts—process.threadCpuUsage, 없으면 예전처럼process.cpuUsage) · 받는 사람 맞추기 한도 2.5초,.claude/rules/testing.md· nestjs 스킬 문장 — 합치지 않고 두었던test/cpu-time-thread의da36e83을 그대로 옮겨 왔다(같은 패치)코드는
mail/scripts/setup.mjs하나(6dc2777)와 테스트 쪽 커밋 셋(2cd2764·349c312·bc22f5f— 제품 코드는 그대로). 그 밖의 공유 계약 · 백엔드 · 프론트 코드 · env 변경 없음 — 나머지는 문서(mail/README.md·ops/ops.env.example의 주석 ·.claude/rules/checklist.md한 줄 ·.claude/rules/testing.md의 성능 단언 문장 ·.claude/skills/docker/SKILL.md한 항목 ·.claude/skills/nestjs/SKILL.md한 줄).이 PR 을 합치면
test/cpu-time-thread브랜치(위da36e83하나뿐)는 할 일이 없어져 지워도 된다.서버 B 는 이 PR 을 합친 뒤
git pull만 하면 된다(컨테이너를 다시 만들지 않는다 — 전환 전까지 메일 컨테이너는docker update2g 그대로).확인
메일 계정이 없는 세션은 MAIL_001이 5초 시간 초과 — 가짜 응답 없는 두 번째 요청(13단계 계정 정보 조회)이 진짜 엔진 주소로 나갔다. 고친 뒤 개발 컨테이너에서 spec 84 · 전체 3,203 통과, lint 통과.첨부 합계는 서버 한도로 센다에서 보내기 요청이 없었다 — 대용량 파일을 다 올리기 전에 보내기를 눌러 막혔다. 고친 뒤TZ=UTC전체 2,354 통과, lint · type-check 통과. digest 를 늦춘 실험으로 고치기 전에는 깨지고 고친 뒤에는 통과함을 봤다(같은 꼴의 링크로 보내기 테스트도 함께).contacts/address-book.spec.ts3,230ms / 2,500 ·mail/recipient-match.spec.ts1,964ms / 1,500 — 러너가 개발 PC 라 다른 일과 CPU 를 나눈다).프로세스 전체 CPU 시간(GC · JIT 도우미 스레드 포함)을 재던 것을 지금 스레드의 user 시간으로 바꾼 고침(
da36e83— 2026-10-31 에 만들어 두고 합치지 않았다)을bc22f5f로 옮겨 왔다.개발 컨테이너에서 두 spec 88 통과(전체 수트를 함께 돌리는 부하에서도 세 번 모두 통과) · 전체 163 수트 3,203 통과 · lint · type-check 통과.
6dc2777)은 개발 엔진에서 두 번 돌렸다 —[변경] 받는 메일 크기 한도 … 52,428,800바이트 (50MiB) · 전 104,857,600→[유지], 둘 다 리로드 뒤[확인] 받는 메일 크기 한도 — EHLO SIZE 52,428,800, 종료 0.x:Imap한도를 115,343,360 으로 올려 두면[주의]이고 값은 그대로였다. 리로드가 걸리지 않은 경우 · SIZE 가 없는 경우 등은 가짜 클라이언트로 갈래를 봤다.리뷰 에이전트의 지적(저장 때 줄만으로는 리로드 실패를 못 거른다 → 리로드 뒤 EHLO 확인, 첨부 합계 경계 30MB, 시험하지 않은 것 표시)을 반영했다.
doveadm -f flow who -1·--justlogin두 쪽 원본)은 우분투 · 데비안의 기본 awk 인 mawk 1.3.4 에서, 표본과 개발 Dovecot 2.3.21.1(mailcow 꼴 — 마스터*)의 실제 출력으로 시험했다 — 비밀번호 · 공인 주소가 출력되지 않는다.[완료](final 스냅숏 · 엔진 멈춤 6초) → 타이머 둘 · 부팅 되살리기 켬 →drill[완료](계정 4 · 메일 4 · DB 표 15개 행 수 · env 가 운영과 같음). 알림(Healthchecks · UptimeRobot)은 아직.up -d --build(마이그레이션 둘) →setup --recovery(관리자 대리 접근 뺌 · 허용 IP · 웹훅 생성 · 확인 — ZEN 시간 초과로 종료 1) → 복구 관리자 끄기 → 보통 setup[완료]종료 0(ZEN 다시 켬).🤖 Generated with Claude Code