소개

혼자 만들고, 혼자 배포하고, 혼자 깨뜨려 봅니다

안녕하세요. 코딩아빠의 개발일지에 오신 것을 환영합니다.

저는 아이를 키우면서 웹과 앱을 만드는 1인 개발자입니다. 기획부터 개발, 서버 운영, 배포, 그리고 새벽에 터진 장애를 수습하는 일까지 전부 혼자 합니다. 팀이 없다는 건 물어볼 사람도 없다는 뜻이라, 문제 하나를 붙들고 며칠씩 헤매는 일이 잦습니다. 이 블로그는 그렇게 헤맸던 기록을 남겨두는 곳입니다.

여기에 쓰는 글

검색해서 나오지 않아 혼자 알아내야 했던 것들을 씁니다. 공식 문서에 한 줄로 적혀 있지만 실제로는 그렇게 동작하지 않았던 것, 에러 메시지가 원인과 전혀 상관없는 곳을 가리켰던 것, “설정을 켰는데 왜 안 되지”의 답이 엉뚱한 파일에 있었던 것 같은 이야기들입니다.

  • 서버 운영과 보안 — fail2ban이 정작 비표준 SSH 포트를 못 막고 있던 이유, MySQL 3306 포트가 인터넷에 통째로 열려 있었다는 걸 뒤늦게 알아챈 날, 컨테이너에 채굴기가 심어진 걸 발견하고 대응한 기록.
  • Docker와 배포 — Nginx·PHP-FPM·MariaDB를 Docker Compose로 묶어 운영하면서 부딪힌 문제들. 타임존이 9시간 어긋나고 이모지가 깨지던 원인 같은 것.
  • Flutter 앱 개발 — AAB 릴리스 빌드 서명과 난독화, iOS 심사에서 받은 거절과 그 진짜 원인, AdMob 광고 ID를 개발·운영으로 자동 분기시킨 방법.
  • 자동화 파이프라인 — 영상 자막을 Whisper로 자동 정렬하다 숫자 때문에 싱크가 밀렸던 이야기, YouTube 대용량 업로드 재개와 OAuth 토큰 갱신 처리.

글을 쓰는 방식

제가 직접 겪지 않은 일은 쓰지 않습니다. 모든 글은 실제로 제 서버에서 터졌던 문제, 실제로 제가 만든 앱에서 났던 오류를 다룹니다. 그래서 글에는 성공한 해법만이 아니라 제가 처음에 잘못 짚었던 원인도 함께 적습니다. 어차피 검색해서 이 글에 들어온 분은 저와 같은 지점에서 헤매고 있을 가능성이 크고, 그렇다면 “그건 원인이 아니더라”라는 정보도 시간을 아껴줄 테니까요.

해결하지 못한 문제는 해결하지 못했다고 씁니다. 어설프게 아는 것을 아는 척 쓰는 것보다, 여기까지 알아냈고 여기서 막혔다고 적어두는 편이 저에게도 읽는 분에게도 낫다고 생각합니다.

운영자

육아와 개발을 병행하는 1인 개발자입니다. 주로 Flutter로 모바일 앱을, PHP와 Next.js로 웹을 만들고, 리눅스 서버를 직접 운영합니다. 글에 대한 질문이나 “저는 이렇게 해결했다”는 제보는 언제든 환영합니다. 문의 페이지를 통해 연락 주시면 확인하는 대로 답장드리겠습니다.

읽어주셔서 감사합니다.

위로 스크롤