Sempre que vejo engenheiros escrevendo sobre sua stack, fico curioso para aprender novas ferramentas. Especialmente quando você está gerenciando tudo sozinho, você está sempre procurando aprender com a experiência dos outros.
Em 2015, eu estava frustrado com o nível atual dos gerenciadores de senhas, especialmente porque não havia nada decente para pessoas que gerenciam servidores privados. Comecei a trabalhar no Psono, um gerenciador de senhas de código aberto com um nível decente de criptografia e opções de compartilhamento seguro. O Psono nunca foi destinado a operar como SaaS, caso contrário, provavelmente teria incluído suporte para vários inquilinos desde o início.
Para que você tenha uma visão geral da escala do Psono. O Psono está atualmente instalado localmente em cerca de 70 países, com mais de 4000 instalações. O SaaS do Psono sozinho é usado atualmente por mais de 15.000 pessoas, a maioria delas utilizando nossa edição comunitária gratuita do Psono que roda na mesma stack tecnológica de nosso produto pago Enterprise.
A stack de uma instalação típica do Psono consiste em um banco de dados, servidor, dois clientes web (um para usuários regulares e outro para administradores), aplicativos para iOS e Android, extensões de navegador para Chrome e Firefox. Um cliente pode instalar um gateway LDAP ou um servidor de arquivos além disso.
Além disso, tenho muito mais infraestrutura em funcionamento. Desde o site para alimentar a página inicial da empresa e a página do produto, até um servidor de licenças para nosso produto empresarial, um sistema ERP central para lidar com cotações e faturas, uma loja onde as pessoas podem comprar o SaaS do Psono e gerenciar sua instalação e um serviço de autenticação com OIDC.
Ao longo do curso do artigo, você verá que eu prefiro tecnologia antiga e confiável.
Linguagens
- Python: Todo o código backend é escrito em Python. Os maiores benefícios do Python são seu rico ecossistema. A falta de tipos (muitas pessoas consideram isso uma desvantagem) torna-o extremamente rápido para escrever seu serviço web, o que, em uma startup, é um dos aspectos-chave a serem observados em uma linguagem de programação.
- Javascript: Oh não... Quem teria pensado nisso... Já em 2015 era impossível criar qualquer site sem Javascript. ;)
Python é minha linguagem favorita para serviços web. (Deixo de fora meus pensamentos sobre por que XY não é melhor do que Python. Isso preencheria outro artigo de blog.) Há apenas uma desvantagem que você precisa contornar, que é a possibilidade de enviar código com todas as dependências de forma confiável, o que é especialmente crucial se as pessoas instalarem seu software localmente e pedirem suporte se encontrarem problemas. (Em termos de velocidade, que outras pessoas podem adicionar aqui, isso não importa. Python é rápido o suficiente).
Frameworks
- Django: "É como um superpoder para desenvolvedores solo" (se posso citar Athony N. Simons aqui). Juntamente com o ecossistema, ele resolve quase todos os problemas que você pode encontrar. Autenticação, templates, email, migrações de banco de dados, totp, ... apenas para citar alguns.
- Django Rest Framework: Atualmente, está alimentando todas as APIs e fazendo um ótimo trabalho. As diferentes camadas (serialização, autenticação, permissões, visualizações) mantêm seu código extremamente limpo.
- React: Recentemente, migrei o cliente web regular para o React. O cliente web antigo (por favor, lembre-se de que foi iniciado em 2015) foi escrito em AngularJS e foi um grande empreendimento manter a compatibilidade com a versão anterior, por exemplo, todos os caminhos para o usuário não devem mudar, pois eles podem ter links favoritos para segredos em sua documentação ou usar os chamados compartilhamentos de link. Além disso, as pessoas usavam customização com seus próprios logotipos e assim por diante, onde os caminhos no sistema não deveriam mudar.
- webpack: Eu queria mencioná-lo aqui, pois atualmente é a única parte com a qual eu não estou satisfeito. É lento, tira os cabelos, difícil de aprender ... a única vantagem é que você nunca fica preso. Qualquer problema que você possa experimentar, já foi perguntado no Stackoverflow e você encontra uma solução.
- Gatsby: Alimentando nossos sites estáticos para a empresa e o produto. Antigamente, usava wordpress, mas o overhead de gerenciamento com atualizações e o constante medo de o site ser comprometido (e a publicidade negativa potencial) nos fez mudar para Gatsby. Até agora, nunca olhei para trás.
- Vuepress: O sistema de gerenciamento de documentação mais decente que pude encontrar. Ele compila para sites estáticos, parece moderno e atualmente alimenta a documentação do Psono.
- Material UI: Principal biblioteca que alimenta o frontend. É rica em recursos, funciona bem com React e parece bastante moderna, em contraste com temas mais antigos baseados em Bootstrap.
Certamente, há inúmeros outros que mereceriam ser mencionados aqui, mas estes são os "mais importantes" na minha opinião.
Bancos de Dados
Mesmo o Django suportando vários bancos de dados, eu rapidamente me deparei com a questão de se queria suportar todos os bancos de dados do Django ou apenas um em particular. A raiz dessa questão foi que eu estava armazenando estruturas de árvores aninhadas no banco de dados. Então árvores com múltiplas raízes e ramos compartilhados. Consultar isso de forma eficiente era crucial, então depois de explorar todas as opções disponíveis, decidi usar a extensão ltree do Postgre.
Se você está planejando desenvolver qualquer coisa e gerenciá-la solo, precisa rodar na nuvem de forma confiável, gerenciada pelo provedor de nuvem. Você provavelmente também não quer ficar preso a um fornecedor, então nada específico da nuvem, o que limita suas escolhas consideravelmente.
Minha decisão:
- Postgres: Existem dois bancos de dados de código aberto que você pode escolher. MariaDB ou Postgres. Eu sempre planejei usar o Maria (principalmente devido ao Cluster Galera do Maria DB, uma dessas histórias equivocadas de "desenvolvedor jovem precisa planejar para hiper-crescimento" ;D) mas devido à falta das extensões ltree minhas mãos foram forçadas. Hoje em dia, com todo o desenvolvimento que está acontecendo nas opções de sharding do Postgres, eu nunca me arrependi dessa decisão até agora.
- Redis: Planejado para ser usado como cache para instalações maiores. Também aqui você pode escolher entre Redis ou Memcache. Ambos são excelentes, mas principalmente devido ao protocolo Redis ser hoje em dia o padrão de fato para caching, eu optei pelo Redis. A única desvantagem que já experimentei com o Redis é ele ser single-threaded.
Infraestrutura
Apenas uma pequena visão geral da infraestrutura em que o Psono se baseia:
- Gitlab: O Gitlab está alimentando toda a automatização do Psono. Vale notar que tudo no Psono é automatizado, o que é um dos aspectos-chave de como eu consigo gerenciar lançamentos e manter todo o Ecossistema Psono. Em 2015, todo projeto de código aberto estava rodando no github, mas o Gitlab era (e ainda é) simplesmente tão poderoso e superior em termos de recursos (com exceção da funcionalidade de busca do github). O Gitlab alimenta builds, lançamentos, varreduras de vulnerabilidades de cada peça de software que usamos.
- Cloudflare: Provavelmente a empresa mais inovadora que conheço que me influenciou nos últimos 10 anos. É justo dizer que o Cloudflare está alimentando a internet hoje em dia. Ele me fornece servidores de nomes confiáveis, TLS, uma CDN decente e recursos avançados como o edge worker. A proteção contra DDoS e a funcionalidade WAF fornecem um bônus extra, que como um gerenciador de senhas é bastante importante. Eu adoraria usar o recurso SSL como um serviço para permitir que clientes SaaS configurem seus próprios domínios, mas o paywall do nível Enterprise do Cloudflare é simplesmente muito difícil. Ainda estou esperando que eles o lancem em algum lugar como um plugin independente que alguém possa comprar.
- namecheap: Minha solução preferida para domínios e certificados ssl.
- Google Cloud Run: Todos os servidores backend rodam no Google Cloud Run, que é extremamente eficiente em termos de custo e confiável quando você quer criar uma frota de serviços. Uma vez que você tem sua stack rodando, faz um trabalho muito bom. Sua integração API / cli de primeira linha é um absoluto positivo aqui. Há alguns pontos negativos, como a falta de suporte do Google ou a ameaça de que o Google possa decidir em algum momento que ser o nº 3 como provedor de serviços em nuvem pode não valer a pena e eles cancelarem o produto.
- Artifactory: Protege minha pipeline de build contra interrupções do npm e armazena meus artefatos de build (o que não estava incluído no Gitlab em 2015).
- Docker Hub: Armazena todos os containers docker e faz algumas análises de segurança adicionais e distribuição dos meus containers.
- Mailgun: Lida com todos os e-mails. Em contraste com a maioria dos provedores de soluções de e-mail, o Mailgun possui um registro e uma funcionalidade de análise decentes. Seu suporte é de primeira linha. O único problema é que seus e-mails às vezes são enviados para a caixa de spam (mesmo com SPF, DMARC e assim por diante, tudo configurado), mas além disso, estão fazendo um ótimo trabalho.
- Poeditor: Lida com todas as traduções. O bom é que os contribuintes podem solicitar acesso, o que é crucial se você quiser que externos ajudem a traduzir seu projeto. Seu suporte é incrível e você recebe respostas extremamente rápidas.
- Docker: Uma das melhores decisões para todo o projeto. Especialmente desde que estou usando Python e enviar código Python funcional com todas as dependências de bibliotecas Python / OS é difícil. Se as coisas devem rodar com um cliente local e a necessidade de que ele possa atualizar e manter o sistema, o Docker nos permite fazer tudo isso e me dá controle total dos pacotes instalados, o que resolve pelo menos 70% de todas as dúvidas de suporte (enquanto introduz 20% de novos problemas, pois as pessoas não estão acostumadas com o Docker ;D).
Monitoramento
Então, as coisas podem dar errado e você precisa saber quando isso acontece e obter algumas informações sobre o problema. É aí que essas ferramentas são úteis:
- Google Cloud logging: Se você está na Google Cloud, sua solução natural
- Sentry: Minha solução número um para relatórios de erros. Depois de experimentar, você nunca mais vai querer ficar sem. Ele me dá o insight necessário sobre todos os erros.
- Uptimerobot: Chama o healthcheck dos meus vários serviços e me alerta se algo cair. A página de status público do Psono, aliás, pode ser encontrada aqui https://stats.psono.com/, que é apenas uma pequena fração dos serviços que essa coisa monitora para mim, mas espero que demonstre um pouco a confiabilidade do sistema.
Infraestrutura de Desenvolvimento
Uma pequena visão geral de como minha stack de desenvolvimento local se parece:
- Windows com WSL: Provavelmente vou levar muitas críticas por isso, mas sim, estou rodando no Windows. Nos últimos anos, sempre tive uma VM Linux em algum lugar à qual me conectava para desenvolvimento, mas hoje em dia, está sendo alimentada pelo WSL. Estou obtendo o melhor dos dois mundos.
- Pycharm / Webstorm: Eu uso IDEs Jetbrain. A funcionalidade de desenvolvimento remoto é crucial para meu fluxo de trabalho de desenvolvimento e essa filosofia de "baterias incluídas" me cai bem. Às vezes, tenho cerca de 20 projetos abertos, o que requer um hardware decente com RAM suficiente. O VSCode parece ser uma boa alternativa hoje em dia, mas ao longo dos últimos anos me acostumei com o Jetbrains e aprender algo novo sempre requer um esforço mental que não estou disposto a investir nisso atualmente. Eu diria que todos devem usar aquilo com que estão acostumados.
Suporte
Existem certas ferramentas, é claro, necessárias para lidar com o suporte às pessoas que usam o produto:
- Freshdesk: Um típico software de tickets de e-mail. Ele me ajuda a acompanhar as várias solicitações de clientes. Nos primeiros tempos, oferecia uma camada gratuita decente, que especialmente na fase inicial de fundação é crucial.
- Discord: Algumas pessoas podem preferir chat ou precisar de uma conversa / ajuda mais direta. É aí que o discord é útil.
Outros
Existem outras ferramentas que queria mencionar que podem ser úteis para outros. Especialmente os bancos para pessoas que querem administrar seus negócios na Alemanha:
- Odoo: O melhor sistema ERP. Sua edição de código aberto é gratuita e pode ser facilmente estendida com conhecimento em Python e um pouco de XML. Suas opções de personalização e integração com APIs personalizadas são de primeira linha.
- Holvi: Nossa conta bancária principal. Na Alemanha, você precisa de um banco que permita configurar uma Conta de Fundadores, em alemão "Gründerkonto", uma conta bancária que está vinculada a uma empresa que ainda não está completamente registrada e onde você pode transferir o dinheiro inicial que é necessário para registrar a empresa. Um pouco de problema de "ovo e galinha". E os grandes bancos que permitem isso geralmente custam caro. O processo de registro também funcionou de forma bastante tranquila. A única desvantagem é a falta de suporte para pagamentos internacionais, mas é aí que o próximo serviço é útil.
- Wise: Nossa segunda conta bancária. Suas taxas são extremamente baixas (por exemplo, sem taxas mensais), o processo de configuração funciona perfeitamente, eles são bem conectados e permitem transferências bancárias internacionais e as transferências são realizadas rapidamente, então você não precisa esperar semanas ou algo assim.
Segurança
Acho que isso poderia ser uma postagem separada no blog sobre como estruturamos contas de usuário, infraestrutura, direitos de acesso. Como este é um dos aspectos mais cruciais para a segurança do Psono, não vou entrar em detalhes aqui e tentarei ser vago o suficiente. Estamos usando serviços do Google Cloud e Azure. Ambos com usuários e grupos completamente separados. Existem usuários dedicados para tarefas de administração e contas de usuário para o "trabalho diário". Existem diferentes sistemas físicos e virtuais que uso para acessar / suportar / gerenciar / administrar o Psono. As tarefas de administração são realizadas apenas em um dispositivo físico separado e especialmente protegido, usado exclusivamente para essas tarefas. Cada conta é protegida com tokens de hardware. Todos os sistemas são gerenciados centralmente e políticas de segurança estão em vigor para garantir que todos os dispositivos sigam os padrões de segurança que você normalmente encontraria em bancos.
Créditos
Este artigo foi fortemente inspirado pelo artigo de Anthony N. Simon sobre Panelbear.