블로그
개발, 디자인, 기술에 관한 생각과 이야기.
홈서버 IaC 전환기 (1) [with OCI & Terraform]
서론 홈서버를 운영하며 LXC와 VM이 점점 늘어감에 따라 각각의 상세 스펙 및 설정을 다 기억하기엔 한계가 왔다. 어떤 서비스는 systemctl 을 통해 백그라운드 데몬으로 돌고 있고, 어떤 서비스는 Docker 기반으로 돌고 있고. 이걸 계속 잊어버려 매번 들어가서 이 명령어가 왜 없지 고민하곤 한다. 이를 해결하기 위해 문서화를 하는 것도 방법이 될 수 있겠지만, 이는 지속적으로 문서를 업데이트해야 하는 또 다른 피로감이 생기게 된다. 따라서 이번 글에서는 이러한 고충을 모두 해결할 수 있는, Terraform + Ansible 기반으로 홈서버 인프라를 IaC로 전환해보고자 한다. 보다 정확히는 인프라 전환을 위한 사전 준비를 하고자 한다. 본론 Gemini 가라사대, IaC(Infrastructure as Code, 코드형 인프라)의 정의 IaC는 물리적 하드웨어 구성이나 대화형 구성 도구를 사용한 수동 프로세스가 아닌, 기계가 읽을 수 있는 정의 파
홈서버에 투트랙(Two-Track) 백업 구축하기 [with PBS, Backblaze]
서론 홈서버를 운영한 지 약 반년 정도가 지났다. 고작 반년 사이에 무슨 사건·사고가 있었겠냐 하지만, 생각보다 다양한 일이 있었다. 집의 퓨즈가 나가 정전되어 서버가 내려간다든지, 멀티탭을 잘못 뽑는다든지 등등. 사실 SSD만 있다면 그냥 웃어넘겼겠지만, NAS용 HDD의 경우 강제로 중단되면 디스크에 손상이 갈 수 있기에 미뤄두었던 백업 시스템을 구축해 보고자 한다. 보다 근본적인 해결을 위해 이사하면 UPS(Uninterruptible Power Supply)를 구매할까도 생각 중이다. 본론 대충 찾아보았을 때는 Proxmox에서 제공하는 PBS(Proxmox Backup Server)라는 자체 백업 서비스가 존재한다고 한다. 얼핏 들었을 때는 해당 기능을 일종의 스냅샷(Snapshot)을 뜨는 것이라 이해하였으나, Gemini와 교차 검증을 하니 전혀 다른 개념임을 알 수 있었다. Proxmox의 스냅샷(Snapshot)과 Proxmox Backup Se
홈서버에 안전하게 OpenClaw 도입하기
서론 근래 기술 커뮤니티에서 굉장히 화두가 되는 흥미로운 사안이 있다. moltbook - the front page of the agent internetA social network built exclusively for AI agents. Where AI agents share, discuss, and upvote. Humans welcome to observe.moltbook AI끼리 대화하는 공간은 흥미롭지만, 사실 그들이 잡담하건 투표하건 그게 중요한 게 아니다. 오히려 Moltbook을 구성하는 OpenClaw(구 Clawdbot, MoltBot)가 보다 흥미롭다. 기존 대화형으로만 동작하던 방식을 탈피하여 24/7 스스로 굴러가는 실행형 방식을 적용하였다고 한다. 따라서 본 글에서는 이러한 유행을 쫓아가고자 24/7 굴러가는 내 홈서버에 OpenClaw를 설치해 보겠다. 혹자는 이를 위해 맥미니를 구매한다고도 하는데, 나는 홈서버가 있으니까 오늘도 멘징에 성
홈서버에 포트폴리오 안전하게 배포하기 [with Cloudflare Tunnel & Workers]
서론 개발자로 살아남기 위해서 개인 포트폴리오 관리는 필수적이라고 생각한다. 글을 시작하기에 앞서 본 글은 어떻게 포트폴리오를 작성하느냐가 아닌, 어떻게 홈서버에 안전하고 편리하게 배포할 수 있을까를 중심으로 서술하였음을 미리 안내한다. 필자는 취업 준비를 하며 포트폴리오를 처음 만들었고, 그 이후로는 단 한 번도 유지보수한 적이 없었다. 그런 의미에서, 처음 홈서버 및 도메인을 구매할 때 상상만 하였던 것을 이번 글을 통해 실제로 만들어보고자 한다. 다만 필자는 백엔드 개발자이니만큼, 포트폴리오 디자인에 집착하기보다는 안정적인 배포 파이프라인 구성 및 홈서버 인프라 세팅을 중심으로 하여 다뤄보고자 한다. 참고로 디자인을 비롯한 프론트엔드 최적화는 자신이 없기에 검증된 Astro 프레임워크의 템플릿을 활용하였다. Bloomfolio | AstroAstro portfolio template with 🌼 Daisy UI. A modern, responsive, and cus
리눅스 파일 권한 시스템의 이해와 응용 [with Proxmox, Docker]
서론 현재 Proxmox OS 기반의 홈서버를 구축하여 아래처럼 서비스들을 운용하고 있다. 기본적으로 헤놀로지(XPEnology) NAS를 중심으로 하여 각 서비스들을 사용하는 구조이다. 현재 서비스들은 헤놀로지의 공유 폴더를 Proxmox OS로 마운트 한 뒤, 해당 마운트 디렉토리를 다시 각 VM, LXC 컨테이너 내부로 연결하여 사용하는 구조이다. 일례로, Dockge LXC 컨테이너 내부에 Immich(사진 관리 서비스)는 다음과 같은 흐름으로 구성된다. XPEnology Volume → Proxmox Mount → Dockge Mount → Immich Container Volume 대충 아래같은 그림이라고 생각하면 되겠다. 위와 같은 구조를 설계하는 와중 지속적으로 겪은 문제가 존재하는데, 마운트 된 디렉토리에 접근할 때마다 “Permission Denied” 오류가 반복적으로 발생했다. 이에 이번 글을 통해 리눅스 파일 권한 구조에 대해 보다
Proxmox 홈서버 구축기 [네트워크와 방화벽, DNS]
서론 드디어 서버가 도착했다. 25.08.21에 구매하고 25.09.23에 수령하였으니, 거의 한 달이 걸린 셈이다. 참고로 사용할 서버의 스펙은 다음과 같다. 베어본 : AOOSTAR WTR PRO AMD Ryzen 7 5825u 4 Bay Nas Mini PC RAM : PUSKILL DDR4 16GB 3200 x 2 pcs, 총 32GB SSD : Western Digital WD BLACK SN850X M.2 NVMe 1TB HDD : Western Digital WD RED 5400/64M 2TB x 4, 총 8TB HDD는 거의 새것과 같은 중고로 구매해서 총 60만 원 정도 들었다. 실제 사용할 서비스들을 올리기에 앞서 외부(WAN) 접근을 고려하여 방화벽을 먼저 설정하고자 한다. 본 글은 아래 글을 베이스로 하여 기본적인 설치 및 설정을 진행하였다. 관심 있는 사람은 참고해 보면 좋을 것 같다. Proxmox로 사설 클라우드 구축하기더이상 프리티어는 그만.
파이썬 코인 자동매매 봇 만들기 (3) [with Celery & GIL]
서론 지난 글과 지지난 글을 통해 자동매매의 기본적인 틀을 잡았다면, 최적화하는 옵티마이저를 만들어보고자 한다. * Scheduler (Celery Beat) : 주기적으로 작업을 트리거 * Redis : 메시지 브로커 * Collector : 시세(분봉) 데이터를 수집하여 DB에 적재 * Trader : 전략에 따라 매수/매도 시그널을 실행 * Optimizer : 전략 파라미터(가중치 등)를 백테스트하여 최적화 * Database (TimescaleDB) : 시계열 데이터 저장소 원래는 서버 세팅 글부터 쓰려했는데 주문한 모델이 잘못 배송돼서 교환 중이다. 그래서 미뤄두었던 자동매매 봇 개발을 우선 마무리지으려고 한다. 참고로 누가 볼 진 모르겠으나, 현재까지 개발된 코드는 아래 깃허브에서 확인할 수 있다. GitHub - bigpie1367/trading-bot: 단타 위주 코인 자동매매 봇단타 위주 코인 자동매매 봇. Contribute to bigpie1
NIC(네트워크 인터페이스)와 통신의 이해 [with NAT & Docker]
서론 최근 구매한 서버의 인프라 세팅을 위해 자료들을 조사 중, 아래와 같은 글을 발견하였다. 물론 아직 서버가 도착한 건 아니다. 분명 반송한 게 도착했다곤 하는데 언제 보내줄련지 모르겠다. 상기 글에 워낙 잘 정리가 되어 있다 보니 혹여 관심있는 사람들도 그대로 따라 해도 무방할 것 같다. 다만 해당 구성에서 좀 꺼려졌던 부분은 이미지와 같이 구성할 경우 Proxmox GUI가 외부로 노출된다는 점이다. 물론 2FA 인증 등을 설정할 수 있으나 어찌 되었든 외부로 공격 포인트가 노출된다는 점에서 좀 꺼려졌다. 그래서 내가 보완하려 한 구조는 pfSense 방화벽으로 모든 트래픽을 1차 검증하고, 검증된 트래픽에 한해서만 서버 및 서비스에 접근할 수 있도록 하는 방식으로 보완하고자 하였다. 이 과정에서 자연스럽게 WAN, LAN, NIC, 라우팅, 스위칭 같은 기초 개념을 다시 학습할 필요를 느꼈고, 이에 대해 공부한 바를 정리해보고자 한다. 본론 NIC
파이썬 코인 자동매매 봇 만들기 (2)
서론 지난 글에 이어 이번에는 본격적인 인프라 설정 및 자동매매의 기본 플로우를 구현해보고자 한다. 본론 1. 인프라 구축 자동매매 시스템의 전반적인 파이프라인은 다음과 같은 구성요소들로 이루어져 있다. * Scheduler (Celery Beat) : 주기적으로 작업을 트리거 * Redis : 메시지 브로커 * Collector : 시세(분봉) 데이터를 수집하여 DB에 적재 * Trader : 전략에 따라 매수/매도 시그널을 실행 * Optimizer : 전략 파라미터(가중치 등)를 백테스트하여 최적화 * Database (TimescaleDB) : 시계열 데이터 저장소 전체 컴포넌트들과 그 사이의 데이터 흐름을 도식화해 보면 아래와 같다. 스케쥴러가 주기적으로 작업들을 트리거하고 각 워커들이 작업을 수행하는 매우 간단한 구성이다. 사실 현재 규모상으론 하나의 워커에서 작업들을 모두 수행하여도 지장 없는 수준이다. 그럼에도 불구하고 이와 같이 작업
파이썬 코인 자동매매 봇 만들기 (1)
서론 필자는 암호화폐(이하 코인)에 대해 무지하다. 그리고 지금도 마찬가지이다. 그럼에도 불구하고 암호화폐 자동매매 봇을 개발하고자 하는 이유는 단순하다. 최근 개인용 서버를 구매하였는데, 여기에 돌릴만한 게 없나 하고 찾아보다가 자동매매 봇을 떠올렸기 때문이다. 사실 개인 NAS용으로 구매하려 한 건데, '그돈씨' 하다 보니까 스펙이 생각보다 높아졌다 서버는 24시간 돌아가니, 24시간 시장이 열려 있는 코인과는 궁합이 맞지 않겠는가. 그래서 전지전능하신 ChatGPT님과 Cursor님의 도움을 받아 자동매매 봇 개발에 뛰어들게 되었다. 본론 어떤 전략을 활용해야 하는가? 앞서 언급한 것처럼 코인에 대해 무지한 상태에서 뛰어들다 보니, 어떤 전략을 선택할지가 가장 고민이었다. 아는 게 없다 보니 강의나 책을 구매해 볼까 했는데 쓸데없이 비싸더라 따라서 필자는 코인에 대한 지식이 전무하니만큼 구글신을 통해 트레이딩 전략을 탐색해 보았다. 찾아보니 아래
DRF QuerySet 처리 흐름과 FilterSet 동작 원리 분석
서론 Django REST Framework를 사용하면서 filterset_class를 설정하고 필터링을 적용하는 건 매우 흔한 일이다. 필터셋을 통해 URL 파라미터만으로 복잡한 조건 필터링을 쉽게 구현할 수 있고, django-filter 라이브러리를 활용하면 필드 단위, 메서드 단위로 커스텀 필터도 자유롭게 정의할 수 있다. 필자 또한 filterset_class에 커스텀 메서드를 정의하여 필터링을 적용했다. 하지만 API 성능을 점검해보는 과정에서, 단일 응답에 수백 개의 SQL 쿼리가 발생하는 문제를 발견했다. 때문에 해당 문제를 아래 흐름으로 살펴보며 구체적인 원인을 파악해보고자 한다. * filterset은 정확히 어떤 시점에 동작하는가? * filterset 내부에서 Model.objects.filter()를 호출하면 무슨 일이 벌어지는가? * get_queryset()에서 설정한 select_related, prefetch_related는 과연 유지되는
DRF Serializer 검증 흐름과 to_internal_value 동작 원리 분석
서론 DRF(Django REST Framework)를 사용하여 개발을 할 때, 시리얼라이저를 커스텀하는 것은 빈번한 일이다. 나 또한 마찬가지로 개발을 진행하던 중 DRF 시리얼라이저를 커스텀하였는데, 예상과 다른 동작이 일어났다. 입력값은 엑셀 파일에서 단일 행으로 제공되고, 이를 여러 모델로 정규화하여 나누는 과정에서 문제가 발생하였다. 보다 구체적으로 설명하면, A 시리얼라이저는 B, C, D, E라는 네 개의 모델 시리얼라이저를 포함하며, B 모델은 F 모델을 외래키로 참조하고 있는 상황이다. 이러한 구조 때문에 A 시리얼라이저의 입력값은 프리픽스를 활용해 각 모델로 분류하여 처리하도록 구현하였다. class BSerializer(serializers.ModelSerializer): f_ids = serializers.PrimaryKeyRelatedField( queryset=F.objects.all(), many=True, write_only=
Django Request 처리 흐름 분석
서론 Django를 통해 WAS 서버를 구성하다 보면 당연시하며 사용하는 것이 있다. 바로 'request(요청)' 객체가 이에 해당된다. 너무나도 당연시하며 사용하곤 있었지만 어떻게 이 'request' 객체가 생성되는지 흐름을 알고 있진 못하였다. 따라서 본 글에서는 WSGI 서버와 Django(장고) 사이에서 어떻게 'request' 객체가 생성되고, 비즈니스 로직이 담겨있는 뷰(View)를 거쳐 'response(응답)' 객체로 반환되는지를 알아보고자 한다. 본론 중국의 딥시크(R1) 모델의 발표로 인해 그 위상이 약간은 추락하신 Chat GPT 님께 자문을 구하였다. Django에서 클라이언트의 요청이 들어와 실제 뷰(View)에 전달되기까지의 흐름을 간단히 요약하면 아래와 같습니다. 1. 클라이언트 (브라우저, 모바일 앱, etc.) 2. 웹 서버 (Nginx, Apache) 3. WSGI 서버 (uWSGI, Gunicorn 등) 4. Django W
파이썬 매직 메서드(Magic Method)의 동작 원리 분석
서론 흔히들 파이썬(Python)은 자바(Java)와 비교하였을 때 보다 개발하기 쉬운 언어라고들 한다. 파이썬이 개발하기 쉬운 언어로 평가받는 이유 중 하나는 다양한 연산자들이 직관적이고 유연하게 설계되어 있기 때문이다. 일례로, 리스트 자료형의 경우 'in' 연산자를 통해 해당 리스트 내부에 특정 값이 존재하는지를 확인할 수 있다. fruits = ['apple', 'banana', 'cherry'] print('banana' in fruits) > 출력 : True 상기 예시를 보았을 때 파이썬 언어를 모르는 사람을 데려와도 무슨 코드인지 해석할 수 있을 것이다. 본 글에서는 이러한 연산자가 동작하는 원리에 대해서 보다 자세하게 알아보고자 한다. 본론 이전보다 한층 진일보하신(o1 모델) ChatGPT님께 자문을 구하였다 파이썬의 매직 메서드(Magic Methods)는 클래스 내에서 특별한 기능을 수행하기 위해 미리 정의된 메서드들로, 일반적으로 이름
리눅스 마운트(Mount)와 심볼릭 링크에 대한 이해
서론 근래 서버 설정을 하면서 NAS를 서버에 마운트(Mount) 해야 하는 상황이 생겼다. 마운트를 하며 든 의문점은 '마운트'와 '심볼릭 링크' 사이의 차이점이었다. 둘 모두 특정 파일 혹은 디렉토리를 가리킨다는 점에서 유사하다고 느꼈기 때문이다. 이후 조사를 한 결과, 내가 마운트에 대해 제대로 이해하지 못한 것 같아 이 글을 빌어 정리하고자 한다. 본론 여김 없이 전지전능하신 ChatGPT님께 자문을 구해보았다. 리눅스에서 파일 시스템을 마운트(Mount) 한다는 것은 특정 디렉터리(마운트 포인트)를 통해 장치(디스크, USB, 네트워크 파일 시스템 등)에 접근할 수 있도록 설정하는 것을 의미해. 예를 들어, 외장하드를 컴퓨터에 연결한 후 /mnt/usb 디렉터리에 마운트 하면, 그 디렉터리를 통해 외장하드의 파일에 접근할 수 있게 되는 거야. 마운트는 파일 시스템이 운영체제에 인식되고 사용할 수 있게 해주는 과정이기 때문에 디스크 파티션, 외부 저장 장