O autor selecionou a Software in the Public Interest para receber uma doação como parte do programa Write for DOnations.
O ERPNext é uma suíte de Planejamento de Recursos Empresariais (ERP) que aproveita o poder e a flexibilidade das tecnologias de código aberto. Ele se destaca no gerenciamento de processos de negócio fundamentais, como finanças, vendas, recursos humanos, fabricação, compras, serviços, necessidades de assistência técnica e muito mais. Entre os benefícios da implementação de um sistema como o ERPNext estão:
O ERPNext é baseado no Frappe, um framework Web full-stack de aplicativos escrito em Python que aproveita ao máximo o ambiente de tempo de execução Node/JavaScript e usa o MariaDB como seu banco de dados de back-end. Uma das muitas vantagens dos aplicativos baseados no Frappe, como o ERPNext, é o utilitário de linha de comando bench. O CLI do bench economiza tempo dos administradores automatizando tarefas como instalar, atualizar, configurar e gerenciar vários sites do Frappe/ERPNext.
Neste tutorial, você irá instalar e configurar uma pilha ERPNext em um servidor executando o Ubuntu 20.04. Isso permitirá que você configure sua pilha para vários ambientes de desenvolvimento ou produção dependendo das suas necessidades. Além disso, isso irá prepará-lo para construir uma arquitetura mais complexa e tolerante a falhas.
sudo
não root. Você pode configurar seu servidor e usuário seguindo nosso guia de configuração inicial do servidor com o Ubuntu 20.04.Nota: ao escolher as especificações do seu servidor, tenha em mente que os sistemas ERP consomem muitos recursos. Este guia exige um servidor com 4 GB de RAM, que é suficiente para casos de uso básico. No entanto, os requisitos específicos de hardware podem variar dependendo do número de usuários e do tamanho do seu negócio.
your_domain
durante todo o processo.Embora configurar um firewall para o desenvolvimento seja opcional, para a produção, isso é uma prática de segurança obrigatória.
Você precisará abrir as seguintes portas em seu servidor ERPNext:
80/tcp
e 443/tcp
para o HTTP e HTTPS respectivamente3306/tcp
para a conexão do MariaDB (recomendado apenas se precisar de acesso remoto ao banco de dados)143/tcp
e 25/tcp
para o IMAP e STMP respectivamente22/tcp
para o SSH (se você ainda não tiver ativado o OpenSSH
nas configurações do seu UFW)8000/tcp
para testar sua plataforma antes de implantá-la para a produçãoPara abrir várias portas ao mesmo tempo, utilize o seguinte comando:
De maneira alternativa, você pode permitir conexões vindas de endereços IP específicos em portas específicas usando este comando:
Depois de abrir todas as portas necessárias,o ative o firewall:
Agora, verifique o status do seu firewall:
O UFW irá exibir uma lista das suas regras habilitadas. Certifique-se de que as portas necessárias do ERPNext estejam abertas:
OutputStatus: active
To Action From
-- ------ ----
22,25,80,143,443,3306,8000/tcp ALLOW Anywhere
22,25,80,143,443,3306,8000/tcp (v6) ALLOW Anywhere (v6)
Para obter mais informações sobre a configuração do UFW, consulte nosso guia sobre como configurar um firewall com o UFW no Ubuntu 20.04.
Configurar um firewall adequado é o primeiro dos dois passos preliminares. Agora, você irá configurar o mapeamento de teclado e a codificação de caracteres no seu servidor.
É altamente recomendado que você configure o mapeamento de teclado para o console, bem como a linguagem e a codificação de caracteres no seu host. Isso é necessário para evitar possíveis problemas durante o processo de instalação do ERPNext 12. Observe que essa configuração não tem nada a ver com a linguagem UI na sua plataforma ERPNext em si, mas com a configuração de localidades do sistema.
Primeiro, atualize seu servidor:
Agora, configure o keymap, a linguagem e a codificação de caracteres:
O utilitário localectl
é usado pelo Ubuntu 20.04 e outras distribuições do Linux para controlar e alterar as configurações de localidade e de layout de teclado em todo o sistema antes do login do usuário, o que é exatamente o que o ERPNext 12 necessita.
Você também precisará adicionar as seguintes linhas ao seu arquivo /etc/environment
. Use o nano
ou seu editor de texto preferido para abrir o arquivo:
Agora, adicione o conteúdo a seguir:
Salve e feche o arquivo.
Reinicialize seu servidor para aplicar todas as alterações:
Espere alguns minutos para que seu servidor seja reinicializado e então use o ssh
para entrar novamente em sua instância. Agora, você está pronto para instalar seu banco de dados.
Agora, você irá adicionar o MariaDB à sua pilha de servidor. O ERPNext 12 requer o MariaDB 10.2+ para um funcionamento adequado. Como o Ubuntu 20.04 inclui o MariaDB 10.3 em seus repositórios oficiais, você pode instalar esta versão usando o comando apt
:
De maneira alternativa, se preferir uma versão mais recente do MariaDB, siga o Passo 3 do nosso guia sobre como instalar uma pilha ERPNext no Ubuntu 18.04. Isso irá guiá-lo através do assistente de repositório online do MariaDB, que o ajudará a instalar a versão mais recente — MariaDB 10.5.
Depois de instalar o mariadb-server
, instale os seguintes pacotes:
O ERPNext 12 é um aplicativo Python e, portanto, requer a biblioteca python3-mysqldb
para o gerenciamento de banco de dados. O libmysqlclient-dev
é necessário para acessar certas funcionalidades de desenvolvedor do MariaDB.
Em seguida, adicione uma camada extra de segurança ao servidor MariaDB executando o script mysql_secure_installation
:
O script mysql_secure_installation
solicitará que você responda a várias perguntas:
ENTER
.N
. Usar a senha padrão juntamente com a autenticação do Unix é a configuração recomendada para sistemas baseados no Ubuntu, pois a conta root está intimamente relacionada com tarefas de manutenção automatizadas do sistema.Y
a todas essas perguntas.Depois de completar o script mysql_secure_installation
, o MariaDB será iniciado usando sua configuração padrão. A instalação padrão do ERPNext usa o usuário root do MariaDB’s para todas as operações de banco de dados. Embora essa abordagem possa ser conveniente em configurações com um único servidor, ela não é considerada uma boa prática de segurança. Dessa forma,na próxima seção, você irá aprender como evitar este problema criando um novo usuário com privilégios especiais.
O ERPNext espera usar o usuário root do MariaDB para o gerenciamento de conexões de banco de dados, mas isso nem sempre é ideal. Para superar essa limitação e deixar um usuário não root gerenciar o MariaDB, você criará manualmente um banco de dados com o nome do usuário. Depois disso, será capaz de atribuir privilégios especiais ao novo usuário para que ele conduza as operações de banco de dados do ERPNext.
Abra o prompt do MariaDB:
Agora, crie um novo banco de dados com o nome do usuário que você deseja atribuir para as conexões do MariaDB. Este tutorial irá usar sammy
, mas sinta-se à vontade para escolher um nome diferente:
Confirme se o banco de dados foi criado usando esta declaração SQL:
Você verá um resultado parecido com este:
Output+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sammy |
+--------------------+
Agora, crie o usuário sammy
do MariaDB com privilégios semelhantes ao root e então dê a ele uma senha forte da sua escolha. Mantenha a senha em um lugar seguro; você precisará dela mais tarde:
Agora, confirme tanto a criação do usuário quanto dos privilégios do novo usuário:
Você verá uma saída como esta:
Output+-----------+-------+------------+
| Host | User | Super_priv |
+-----------+-------+------------+
| localhost | root | Y |
| localhost | mysql | Y |
| % | sammy| Y |
+-----------+-------+------------+
3 rows in set (0.001 sec)
Em seguida, libere os privilégios para aplicar todas as alterações:
Depois de terminar, saia da sessão:
Agora que você criou um usuário do banco de dados, precisa apenas ajustar o MariaDB para garantir uma operação adequada do ERPNext 12. Felizmente, a equipe do ERPNext fornece um excelente modelo de configuração que será usado como um ponto de partida para sua implementação. Na próxima seção, você irá aprender como configurar corretamente o banco de dados do MariaDB usando esse modelo.
Com o MariaDB instalado e protegido, é hora de ajustá-lo para as conexões do ERPNext.
Primeiro, interrompa o mariadb.service
:
Agora, use o nano
ou seu editor de texto favorito para criar um arquivo de configuração do MariaDB chamado mariadb.cnf
:
Em seguida, adicione o modelo oficial de configuração do ERPNext:
Salve e feche o arquivo. Para obter informações mais detalhadas sobre essas configurações, revise este arquivo modelo no repositório Github do ERPNext. Ele é um ponto de partida útil para explorar essas opções.
O arquivo de configuração /etc/mysql/mariadb.conf.d/mariadb.cnf
complementa e também substitui alguns valores incluídos na configuração padrão do MariaDB localizada em /etc/mysql/my.cnf
. Este arquivo oferece um modelo curado que melhora muito o desempenho de banco de dados para o ERPNext. No entanto, tenha em mente que, embora esse modelo seja um ótimo ponto de partida, nada impede que você melhore o desempenho do MariaDB ainda mais ajustando esses parâmetros para atender às suas necessidades.
Como o ERPNext depende da conexão de banco de dados para quase todas as suas operações internas, é uma boa ideia testar a conexão antes de continuar.
Inicie o mariadb.service
:
Para testar a conexão, use o seguinte comando. Lembre-se de substituir sammy
e mariadb_password
por suas credenciais:
Você verá um resultado mostrando o conteúdo básico de ajuda do MariaDB, bem como diversos parâmetros. Isso significa que sua conexão foi bem sucedida:
Outputmysql Ver 15.1 Distrib 10.4.13-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Usage: mysql [OPTIONS] [database]
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf
...
--ssl-verify-server-cert
Verify server's "Common Name" in its cert against
hostname used when connecting. This option is disabled by
default.
-t, --table Output in table format.
--tee=name Append everything into outfile. See interactive help (\h)
also. Does not work in batch mode. Disable with
--disable-tee. This option is disabled by default.
-u, --user=name User for login if not current user.
-U, --safe-updates Only allow UPDATE and DELETE that uses keys.
-U, --i-am-a-dummy Synonym for option --safe-updates, -U.
-v, --verbose Write more. (-v -v -v gives the table output format).
...
max-join-size 1000000
secure-auth FALSE
show-warnings FALSE
plugin-dir (No default value)
default-auth (No default value)
binary-mode FALSE
connect-expired-password FALSE
Se precisar fazer qualquer ajuste nas configurações do MariaDB, ou corrigir qualquer erro, lembre-se de recarregar o serviço usando o seguinte comando:
Depois de terminar, ative o MariaDB:
Agora que você testou a conexão do banco de dados, continue com a instalação do seu aplicativo ERPNext.
Agora que o banco de dados está pronto, continue configurando seu aplicativo Web ERPNext. Nesta seção, você irá aprender como instalar e configurar todos os componentes necessários pelo ERPNext 12 e então instalar o próprio aplicativo.
Comece preparando o servidor com todos os pacotes de sistema exigidos pelo ERPNext 12. Instale as dependências do sistema usando o seguinte comando:
A variável DEBIAN_FRONTEND=noninteractive
foi passada para o comando de instalação para evitar os prompts do Postfix. Para informações detalhadas sobre a configuração do Postfix, leia nosso guia sobre Como instalar e configurar o Postfix no Ubuntu 20.04.
Em seguida, atualize o pip3
, que é o gerenciador padrão de pacotes do Python e depois instale as últimas versões de três módulos adicionais do Python:
O setuptools
facilita a instalação e atualização dos pacotes do Python, o cryptography
adiciona capacidades de criptografia à sua pilha e o psutil
auxilia com o monitoramento do sistema. Agora que você instalou todas as dependências globais necessárias, irá instalar todos os serviços e bibliotecas exigidos pelo ERPNext 12.
O ERPNext 12 pode trabalhar com a versão 8+ do ambiente de servidor Node.js. Na verdade, no momento em que este artigo está sendo escrito, o script oficial easy_install
do ERPNext usa o Node 8. No entanto, do ponto de vista da segurança, é aconselhável instalar uma versão mais recente porque o Node 8 atingiu seu End Of Life (EOL) em 2020 e, portanto, não receberá mais nenhum patch de segurança. No momento da publicação deste artigo, o Ubuntu 20.04 contém a versão 10.19 do Node.js. Embora esta versão ainda seja mantida, por razões semelhantes (EOL em menos de um ano), é altamente aconselhável evitar seu uso. Para este guia, o Node.js versão 12 LTS será instalado juntamente com os gerenciadores de pacotes npm
e yarn
correspondentes. Note que o framework Frappe usa o yarn
para instalar dependências. Se você decidir usar um método alternativo de instalação, certifique-se de que você tenha a versão 1.12+ do yarn
em execução no seu sistema.
Adicione o repositório NodeSource ao seu sistema:
Agora, você pode inspecionar o conteúdo do script baixado:
Assim que estiver satisfeito com o conteúdo do script, execute-o:
Esse script irá atualizar automaticamente a lista apt
. Agora, instale o nodejs
em seu servidor:
Em seguida, instale o yarn
globalmente usando o gerenciador de pacotes npm
:
Agora que você instalou o Node, siga adiante para configurar o wkhtmltopdf
para sua plataforma.
O ERPNext usa a ferramenta wkhtmltopdf
de código aberto para converter conteúdo HTML em PDF usando o mecanismo de renderização Qt WebKit. Esse recurso é usado principalmente para imprimir faturas, cotações e outros relatórios. No caso do ERPNext 12, uma versão específica do wkhtmltopdf
é necessária, a 0.12.5
com o Qt implementado.
Para instalar o wkhtmltopdf
, comece indo para um diretório adequado para baixar o pacote. Neste caso, o /tmp
:
Baixe a versão e o pacote apropriados do wkhtmltopdf
para o Ubuntu 20.04 da página do projeto:
Agora, instale o pacote usando a ferramenta dpkg
:
Em seguida, copie todos os executáveis relevantes para seu diretório /usr/bin/
:
Assim que os arquivos estiverem no lugar, mude suas permissões para torná-los executáveis:
Agora que o wkhtmltopdf
está instalado corretamente, adicionaremos o Redis à pilha do nosso banco de dados.
O ERPNext 12 usa o Redis para melhorar o desempenho do MariaDB. Mais especificamente, o Redis auxilia com o cache.
Primeiro, instale o Redis a partir do repositório oficial do Ubuntu 20.04:
Em seguida, ative o Redis na inicialização:
Agora que você adicionou o Redis à sua pilha, vamos dedicar um momento para resumir o que você fez até agora. Até este ponto, você instalou todos os componentes principais exigidos pelo ERPNext 12, que incluem:
wkhtmltopdf
Se você estiver instalando o sistema ERP para o desenvolvimento ou para a produção, agora está pronto para o próximo passo, que é a instalação do framework full-stack Frappe e o aplicativo Web ERPNext 12 em si.
Agora que você instalou todos os requisitos de pilha do ERPNext, libere a flexibilidade do utilitário de linha de comando bench
do Frappe. O bench
CLI foi projetado com o propósito de ajudar os usuários no processo de instalar, configurar e gerenciar aplicativos como o ERPNext que são baseados no Frappe Framework. Nas próximas seções, você irá instalar o CLI bench
e então usá-lo para completar o processo de configuração do ERPNext 12.
Certifique-se de que o usuário do Frappe (neste caso sammy
) tenha os direitos adequados em seu diretório home
:
Agora, clone o repositório frappe/bench
para seu diretório home. Lembre-se de substituir sammy
pelo nome de usuário do seu sistema:
Instale o bench
CLI:
Este guia assume que você esteja instalando o ERPNext 12 para cenários de teste/produção e, consequentemente,que você esteja usando a ramificação master
. Mas se a sua intenção for desenvolver aplicativos ou módulos do ERPNext personalizados, a ramificação develop
pode ser uma opção mais adequada. Para ambos os casos, você está agora preparado para instalar o Frappe Framework. Esse será o passo final antes de instalar o próprio ERPNext.
Nesta seção, você irá criar um ambiente do Frappe usando o bench
CLI.
Durante a instalação do Frappe, você pode exceder o limite de inspeção de arquivos do Ubuntu, que por padrão é definido como 8192. Para evitar este problema, defina um limite superior usando o seguinte comando:
O comando tee
irá anexar o conteúdo do seu comando echo
ao arquivo chamado ao mesmo tempo em que também imprime o resultado em seu console.
Em seguida, inicialize o Frappe Framework 12. Substitua Sammy pelo nome de usuário do seu sistema:
Durante a execução, um erro sobre seu caminho pode aparecer, juntamente com vários avisos. Deixe o processo continuar até o fim. Depois que ele for finalizado, você verá um resultado semelhante ao seguinte, indicando que seu ambiente foi criado com sucesso:
Output...
Done in 82.23s.
INFO:bench.utils:setting up backups
no crontab for sammy
SUCCESS: Bench /home/sammy/frappe-bench initialized
Nota: o processo bench init
pode ser interrompido se um erro spawn ENOMEM
for encontrado. Esse erro é causado quando seu sistema fica sem memória. Você deve corrigir o problema antes de continuar, seja instalando mais memória física ou alocando um espaço SWAP.
Vamos dar uma olhada no comando usado para criar o ambiente:
/home/sammy/frappe-bench
é o caminho onde o Frappe Framework, os sites e aplicativos associados serão instalados. Um novo diretório, chamado frappe-bench
neste exemplo, será criado para acomodar todos os arquivos necessários.--frappe-path
aponta para o repositório do Frappe, que neste caso é o repositório oficial do Github.--frappe-branch
é a versão do Frappe a ser instalada. Como você quer instalar o ERPNext 12, a versão escolhida é o Frappe 12.--python
é a versão do Python que será usada. O ERPNext 12 requer o Python 3.6+. No entanto, as versões anteriores ainda usam o Python 2.7.Para obter mais informações sobre comandos bench
CLI, consulte o Manual dos comandos bench.
A flexibilidade oferecida pelo Frappe Framework vai muito além do uso de ambientes isolados. Você também pode criar sites diferentes e instalar aplicativos neles.
Nesta seção, você irá construir um site baseado no Frappe, e então instalar o aplicativo ERPNext 12 nele.
Vá para o diretório onde o Frappe foi inicializado.
Antes de continuar, será necessário instalar versões específicas das bibliotecas numpy
e pandas
do Python no ambiente virtual do Frappe. Instale esses pacotes usando o seguinte comando:
Neste momento, a instalação pode parar por cerca de 10 a 20 minutos enquanto exibe esta mensagem:
Output...
Building wheel for pandas (setup.py) ... -
Isso tem a ver com um bug relacionado ao pandas
e o Ubuntu 20.04, que, no momento em que este tutorial está sendo escrito, ainda é relativamente novo. No entanto, os pacotes serão compilados e, assim que forem concluídos, você verá um resultado como este:
Output...
Successfully built pandas
Installing collected packages: pandas
Successfully installed pandas-0.24.2
Agora, continue a instalação. Faça o download do ERPNext 12 do seu repositório usando o bench
CLI:
Em seguida, crie o novo site, substituindo your_domain
pelo domínio que você associou ao IP deste servidor:
Vamos reservar um momento para revisar as opções usadas no comando acima:
bench new-site
cria um novo site baseado no Frappe Framework.your_domain
é o nome para o novo site. Certifique-se de que o DNS do seu domínio tenha um registro A apontando para o IP do seu servidor.erpnext_admin_password
é a senha desejada para o usuário Administrator do ERPNext. Mantenha essa senha em um lugar seguro — você precisará dela em breve.mariadb_password
é a senha que você criou no início do guia para o usuário sammy
do MariaDB.Depois disso, instale o aplicativo ERPNext no site:
Assim que a instalação for concluída, você terá um aplicativo ERPNext 12 em funcionamento. Agora, vamos testá-lo usando um comando bench
:
O comando acima irá iniciar um console de monitoramento em tempo real mostrando várias mensagens sobre o servidor Web e outros serviços. Abra um navegador Web e vá até localhost:8000
(para instalações locais) ou your_domain:8000
(se você estiver usando um servidor remoto). Você verá a tela de login do ERPNext (abordaremos o login e a configuração em um passo posterior, assim que fizermos nosso site ficar pronto para a produção).
Depois de visitar sua implantação teste, retorne ao seu terminal e pressione CTRL+C
. Isso irá parar o ERPNext e sair do console de monitoramento.
Se seu objetivo principal for criar módulos ou modificar o ERPNext 12, então pode parar aqui. Não há mais componentes necessários para fins de desenvolvimento. No entanto, se o que você precisa é um sistema pronto para a produção que não requer uma inicialização manual, então será necessário instalar e configurar alguns componentes adicionais. Esse é o seu próximo passo.
Embora seu aplicativo ERPNext 12 esteja pronto, o sistema como um todo não está preparado para a produção. Para garantir a confiabilidade e segurança do ERPNext, será necessário habilitar alguns serviços adicionais:
8000
para a porta 80
(HTTP) ou porta 443
(HTTPS)Até este ponto, você instalou e configurou o ERPNext 12 manualmente, o que lhe permitiu personalizar o processo para funcionar em qualquer caso de uso particular. No entanto, para o resto da configuração de produção, aproveite a conveniência do bench
CLI e deixe-o automatizar a instalação e configuração desses serviços restantes.
Certifique-se de estar no diretório de trabalho do Frappe:
Agora, use o seguinte comando para terminar a configuração do ERPNext 12 para produção:
O comando acima irá instalar e configurar o Nginx, Supervisor e Fail2Ban e definir sammy
como proprietário do ambiente de produção.
Os arquivos de configuração criados pelo comando bench
são:
/etc/nginx/nginx.conf
e /etc/nginx/conf.d/frappe-bench.conf
/etc/fail2ban/jail.d/nginx-proxy.conf
e um filtro localizado em /etc/fail2ban/filter.d/nginx-proxy.conf
Essas configurações padrão serão suficientes para este tutorial, mas sinta-se livre para explorar e ajustar esses arquivos para atender às suas necessidades. Pare todos os serviços executando:
Assim que tudo estiver pronto, reinicie seus serviços:
Agora, você está pronto para testar sua instalação.
Em primeiro lugar, verifique se os serviços de produção chave estão em execução. Use o seguinte comando systemctl
e então canalize-o para o grep
:
Você verá uma saída como esta:
Outputfail2ban.service enabled
nginx.service enabled
supervisor.service enabled
Depois de confirmar que tudo está funcionando como esperado, você pode testar o ERPNext 12 ao vivo em seu servidor. Abra seu navegador favorito e vá até your_domain, ou onde quer que você esteja hospedando seu aplicativo ERPNext 12.
Depois de alguns segundos, a tela de login do ERPNext 12 deve aparecer. Use Administrator para o nome de usuário (e-mail) e a senha erpnext_admin_password
que você criou anteriormente para a senha.
Na próxima tela, você verá um menu suspenso onde pode selecionar o idioma da interface do usuário para o aplicativo:
Após a seleção de idiomas, o ERPNext irá questioná-lo sobre seu país, fuso horário e moeda:
Depois de completar as informações sobre a sua região, você será capaz de criar seu primeiro usuário do ERPNext. As informações que você fornecer serão usadas como as credenciais de login do usuário.
Na próxima tela, você será questionado sobre o que o ERPNext chama de Domains (domínios). Se não tiver certeza sobre qual é o seu domínio, selecione Distribution e clique no botão Next.
Em seguida, será necessário fornecer um nome e abreviação da empresa.
Na última tela, o ERPNext irá perguntar o que sua empresa faz, o nome do seu banco, o tipo de gráficos de contas e o período do ano fiscal. Você será capaz de inserir bancos adicionais mais tarde. Por enquanto, preencha todos os campos como quiser e clique no botão Complete Setup.
Em seguida, você verá uma barra de progresso.
Assim que o processo de configuração for concluído, o painel principal do ERPNext 12 será exibido.
Agora, você terminou de instalar e configurar totalmente um aplicativo ERPNext 12.
Agora que você instalou corretamente seu aplicativo ERPNext 12, pode ser desejável iniciar a implementação do sistema para as necessidades do seu negócio. Um bom ponto de partida é clicando no botão Getting Started no painel do ERPNext. O ERPNext irá então ajudá-lo a configurar a plataforma para todas as suas necessidades de negócios e e-commerce.
Pode ser que você também queira aumentar a velocidade do ERPNext. Se esse for o caso, então leia sobre o ajuste de desempenho do ERPNext, que irá guiá-lo pelas práticas recomendadas e como depurar problemas relacionados ao desempenho.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!