엔지니어들이 자신의 스택에 대해 글을 쓸 때마다 새로운 도구를 배우는 것이 흥미롭습니다. 특히 혼자서 모든 것을 운영할 때는 다른 사람들의 경험에서 배우는 것이 중요하죠.
2015년, 저는 현재의 비밀번호 관리자들에 실망했습니다. 특히 개인 서버를 운영하는 사람들을 위한 괜찮은 솔루션이 없다는 점이 불만이었습니다. 그래서 저는 Psono, 오픈 소스 비밀번호 관리자를 개발하기 시작했습니다. Psono는 처음부터 SaaS로 운영될 것을 의도한 것이 아니었기 때문에 초기에는 멀티 테넌트 지원을 포함시키지 않았습니다.
Psono의 규모에 대해 간략히 설명드리면, Psono는 현재 약 70개국에서 로컬로 설치되어 있으며, 4000개 이상의 설치 사례가 있습니다. Psono SaaS는 현재 15,000명 이상의 사람들이 사용하고 있는데, 대부분은 Psono 커뮤니티 에디션을 사용하고 있으며, 이는 유료 엔터프라이즈 제품과 동일한 기술 스택에서 운영됩니다.
일반적인 Psono 설치 스택은 데이터베이스, 서버, 두 개의 웹 클라이언트(일반 사용자용과 관리자용), iOS 및 Android용 앱, Chrome 및 Firefox용 브라우저 확장 프로그램으로 구성됩니다. 고객은 LDAP 게이트웨이 또는 파일 서버를 추가로 설치할 수 있습니다.
또한 저는 많은 인프라를 운영하고 있습니다. 회사 홈페이지 및 제품 페이지를 운영하는 웹사이트, 엔터프라이즈 제품을 위한 라이선스 서버, 견적서 및 송장을 처리하는 중앙 ERP 시스템, 사람들이 Psono SaaS를 구매하고 설치를 관리할 수 있는 쇼핑몰, OIDC 인증 서비스를 갖추고 있습니다.
이 기사에서는 제가 오래되고 지루한 기술을 선호한다는 점을 알 수 있습니다.
언어
- Python: 모든 백엔드 코드는 Python으로 작성되었습니다. Python의 가장 큰 장점은 풍부한 생태계입니다. 많은 사람들이 단점으로 여기는 타입의 부족은 웹 서비스를 빠르게 작성하는 데 매우 유리합니다. 이는 스타트업에서 프로그래밍 언어에서 가장 중요한 측면 중 하나입니다.
- Javascript: 이미 2015년에 웹 사이트를 만들려면 Javascript 없이 불가능했습니다. ;)
웹 서비스용으로 Python은 제가 가장 좋아하는 언어입니다. (왜 다른 언어보다 Python이 좋은지에 대한 생각은 여기서 생략하겠습니다. 이는 또 다른 블로그 글을 채울 수 있는 주제입니다.) 단점으로는 모든 종속성을 신뢰하게 배포하는 것이 어렵다는 점이 있습니다. 이는 특히 사람들이 소프트웨어를 로컬에 설치하고 문제에 부딪히면 지원을 요청할 때 중요한 문제입니다. (속도는 많은 사람들이 언급하겠지만 별로 중요하지 않습니다. Python은 충분히 빠릅니다.)
프레임워크
- Django: "솔로 개발자에게는 특별한 능력" (여기서 Athony N. Simons의 말을 인용하겠습니다). 생태계와 함께 인증, 템플릿, 이메일, 데이터베이스 마이그레이션, totp 등을 포함하여 직면할 수 있는 거의 모든 문제를 해결해줍니다.
- Django Rest Framework: 현재 모든 API를 구동하며 훌륭한 성능을 발휘하고 있습니다. 다양한 레이어(직렬화, 인증, 권한, 뷰)가 코드의 정돈을 돕습니다.
- React: 최근에 일반 웹 클라이언트를 React로 마이그레이션했습니다. 이전 웹 클라이언트(기억해 주세요, 2015년에 시작했습니다)는 AngularJS로 작성되었으며, 경로를 변경하지 않기 위해 과거 클라이언트와의 호환성을 유지하는 데 어려움이 있었습니다. 사람들이 맞춤형 로고 등을 사용하는 경우 시스템의 경로를 변경하지 않기 위해 노력했습니다.
- webpack: 현재 유일하게 불만인 부분입니다. 속도가 느리고, 배우기 어려우며, 정신적인 스트레스를 유발합니다. 그러나 어떤 문제에 부딪혀도 Stackoverflow에서 해결책을 찾을 수 있습니다.
- Gatsby: 회사와 제품의 정적 웹사이트를 구동합니다. 초기에는 워드프레스를 사용했지만 업데이트 관리와 웹사이트의 보안 문제 때문에 Gatsby로 전환했습니다. 지금까지는 후회하지 않았습니다.
- Vuepress: 제가 찾은 가장 괜찮은 문서 관리 시스템입니다. 정적 웹사이트로 컴파일되고, 현대적인 모습을 가지며, 현재 Psono의 문서를 구동합니다.
- Material UI: 프론트엔드를 구동하는 주요 라이브러리입니다. 기능이 풍부하고 React와 잘 어울리며, 구식 Bootstrap 기반 테마에 비해 현대적인 외모를 가지고 있습니다.
여기서 언급할 만한 다른 수많은 프레임워크가 있지만, 제 의견에 따르면 이들이 가장 중요한 것들입니다.
데이터베이스
Django가 여러 데이터베이스를 지원하더라도, 초기에는 모든 Django 데이터베이스를 지원할 것인지 특정한 하나의 데이터베이스만 지원할 것인지에 대한 질문에 부딪히게 되었습니다. 그 이유는 데이터베이스에 중첩된 트리 구조를 저장하고 있었기 때문입니다. 효율적으로 이들 트리를 쿼리하는 것이 중요했습니다. 모든 옵션을 탐색한 결과 Postgre의 ltree 확장을 사용하기로 결정했습니다.
혼자서 어떤 것을 개발하고 운영하려면, 그것이 클라우드에서 안정적으로 운영되어야 하고, 클라우드 제공자가 관리해야 합니다. 그리고 공급업체 종속을 원하지 않을 가능성이 큽니다. 그래서 클라우드 특정한 것을 피해야 하므로 선택의 폭이 좁아집니다.
제 결정사항은 다음과 같습니다:
- Postgres: 선택할 수 있는 오픈 소스 데이터베이스는 두 가지가 있습니다. MariaDB 또는 Postgres입니다. 처음에는 Maria를 계획하고 있었으나 (주로 Maria DB의 Galera Cluster 때문), ltree 확장이 없어 Postgres로 결정했습니다. 지금까지 그 결정을 후회한 적이 없습니다.
- Redis: 큰 설치를 위한 캐시로 사용됩니다. Redis 또는 Memcache 중 선택할 수 있습니다. 둘 다 훌륭하지만, 현재 캐싱의 사실상 표준 프로토콜인 Redis로 결정했습니다. Redis의 유일한 단점은 단일 스레드라는 점입니다.
인프라
Psono가 의존하는 인프라를 간략히 설명드리겠습니다:
- Gitlab: Gitlab은 Psono의 모든 자동화를 구동합니다. Psono의 모든 것이 자동화되어 있으며, 이는 릴리스 관리와 전체 Psono 생태계를 유지하는 방법의 중요한 측면입니다. 2015년에는 모든 오픈 소스 프로젝트가 Github에서 운영되었지만, Gitlab은 여전히 기능적으로 우세합니다 (Github의 검색 기능을 제외하고). Gitlab은 모든 소프트웨어의 빌드, 릴리스, 취약성 스캔을 지원합니다.
- Cloudflare: 지난 10년 동안 저에게 가장 큰 영향을 준 회사입니다. 현재의 인터넷을 구동하는 회사라고 해도 과언이 아닙니다. 신뢰할 수 있는 네임 서버, TLS, CDN, 그리고 Edge Worker와 같은 고급 기능을 제공합니다. DDoS 보호와 WAF 기능은 비밀번호 관리자에게 매우 중요합니다. SaaS 고객이 자신의 도메인을 구성할 수 있도록 Cloudflare의 SSL을 사용하고 싶지만, Enterprise 레벨의 높은 비용은 큰 장벽입니다. 독립 플러그인으로 출시되기를 여전히 바랍니다.
- namecheap: 도메인 및 SSL 인증서의 주된 솔루션입니다.
- Google Cloud Run: 모든 백엔드 서버는 Google Cloud Run에서 실행됩니다. 서비스 그룹을 확장하는 데 매우 비용 효율적이고 신뢰할 수 있습니다. API / CLI 통합이 우수합니다. 몇 가지 단점은 Google의 지원이 부족하거나 Google이 클라우드 서비스 제공자로서 3위를 유지할 가치가 없는 경우 제품을 취소할 수 있다는 위협이 있습니다.
- Artifactory: Npm 중단에 대비하여 빌드 파이프라인을 보호하고 빌드 아티팩트를 저장합니다. (2015년에는 Gitlab에 포함되지 않았습니다)
- Docker Hub: 모든 도커 컨테이너를 저장하고 추가적인 보안 스캔 및 배포를 수행합니다.
- Mailgun: 모든 이메일을 처리합니다. 대부분의 이메일 솔루션 제공업체와 달리 Mailgun은 괜찮은 로깅 및 분석 기능을 제공합니다. 지원이 우수합니다. 유일한 문제는 SPF, DMARC 등을 설정해도 가끔 스팸 메일로 보내지는 경우가 있다는 점입니다.
- Poeditor: 모든 번역을 처리합니다. 기여자들이 액세스를 요청할 수 있는 점이 중요합니다. 지원이 우수하고 신속한 답변을 받을 수 있습니다.
- Docker: 전체 프로젝트를 위한 최고의 결정 중 하나입니다. 특히 Python을 사용함으로써 작동하는 Python 코드를 모든 Python / OS 라이브러리 종속성과 함께 배송하는 것이 어려운데, Docker는 이를 가능하게 해주며 패키지를 제어할 수 있어 전체 지원 이슈의 70%를 해결합니다 (물론 Docker를 사용하지 못하는 사람들로 인해 20%의 새로운 문제가 생깁니다 ;D).
모니터링
문제가 발생할 수 있으며, 그럴 때 상황을 파악해야 합니다. 이를 위해 다음 도구들이 유용합니다:
개발 인프라
로컬 개발 스택에 대한 간략한 개요입니다:
- Windows with WSL: 많은 사람에게 비판을 받을 수 있지만, 저는 Windows를 사용합니다. 예전에는 개발을 위해 Linux VM을 사용했지만, 현재는 WSL을 사용합니다. 두 세계의 장점을 모두 누리고 있습니다.
- Pycharm / Webstorm: Jetbrain IDE를 사용하고 있습니다. 원격 개발 기능은 제 개발 워크플로에 필수적입니다. 배터리가 포함된 철학이 제게 잘 맞습니다. 가끔 20개 정도의 프로젝트를 열어두어야 하므로 충분한 RAM을 갖춘 적절한 하드웨어가 필요합니다. VSCode도 좋은 대안으로 보이지만, Jetbrains에 익숙해지면 다른 것을 배우는 것은 정신적으로 힘들어 현재는 변경할 생각이 없습니다. 각자는 자신에게 익숙한 것을 사용해야 한다고 생각합니다.
지원
제품을 사용하는 사람들을 지원하기 위한 특정 도구가 필요합니다:
- Freshdesk: 전형적인 이메일 티켓 소프트웨어입니다. 다양한 고객 요청을 체계적으로 관리하는 데 도움이 됩니다. 초기에는 무료 계층을 제공하였으며, 설립 초기에는 매우 중요합니다.
- Discord: 일부 사람들은 채팅 또는 직접적인 대화/지원을 선호할 수 있습니다. 이때 Discord가 유용합니다.
기타
다른 사람들에게 유용할 수 있는 특정 도구들을 언급하고자 합니다. 특히 독일에서 비즈니스를 운영하려는 사람들을 위한 은행들:
- Odoo: 최고의 ERP 시스템. 오픈 소스 에디션은 무료이며, Python과 약간의 XML 지식을 통해 쉽게 확장할 수 있습니다. 맞춤형 API와의 통합 옵션이 뛰어납니다.
- Holvi: 주된 은행 계좌입니다. 독일에서는 창립 계좌 설정을 허용하는 은행이 필요합니다. 등록되지 않은 회사와 연결된 은행 계좌로 초기 자금을 이체해야 합니다. 등록 과정은 원활하게 진행되었습니다. 유일한 단점은 국제 결제를 지원하지 않는다는 점이지만, 이는 다음 서비스로 해결합니다.
- Wise: 두 번째 은행 계좌입니다. 수수료가 매우 저렴하고 (예: 월 수수료 없음), 설정 과정이 원활하며, 국제 은행 송금과 같은 기능을 빠르게 처리할 수 있습니다.
보안
사용자 계정, 인프라, 액세스 권한을 어떻게 구조화했는지에 대해 별도의 블로그 게시물을 작성할 수 있을 것입니다. 이는 Psono의 보안에 매우 중요한 측면 중 하나이기 때문에 정확한 세부 사항은 여기서 다루지 않겠습니다. 우리는 Google Cloud와 Azure 서비스를 모두 사용합니다. 두 서비스 모두 완전히 분리된 사용자와 그룹을 가지고 있습니다. 관리 작업을 위한 전용 사용자와 일상 작업을 위한 사용자 계정이 있습니다. Psono를 액세스/지원/관리/관리하는 물리적 및 가상 시스템이 있습니다. 관리 작업은 전용으로 강화된 물리적 장치에서만 수행됩니다. 모든 계정은 하드웨어 토큰으로 보호됩니다. 모든 시스템은 중앙에서 관리되며 은행에서 일반적으로 찾을 수 있는 보안 표준을 준수합니다.
크레딧
이 기사에 영감을 준 Anthony N. Simon의 Panelbear에 대한 글에 감사합니다.