Criando uma hospedagem simples
Montando uma hospedagem web inteiramente com recursos free.
A mais complexa aventura da minha carreira e olhe que acabo de completar 68 anos, sendo os 30 últimos lidando com programação, servidores, etc.
Eu não quiz contratar uma revenda de hospedagem tradicional para isso, mas ao contrário quiz montar eu mesmo uma estrutura, partindo inteiramente de ferramentas gratuitas, da ajuda existente na internet e dos meus conhecimentos. Assim me sobra mais dinheiro para poder distribuir parte do espaço em um plano gratuito e a que eu cobrar possa ter um preço mais em conta. E não perder a diversão de "criar" algo que não existe ou que desconheço e ainda por cima poder compartilhar como fiz.
Eu quis desistir várias vezes, pois não conseguia efetuar alguma implementação. Como é um projeto meu e não uma imposição de um chefe/patrão, posso dessitir. Mas quando pensava que iria jogar fora tudo que fiz até aqui e que não iria oferecer uma boa hospedagem free, especialmente para os colegas iniciantes do laravel, então ganhei ânimo para tentar de outra forma, então rolou.
Cloud Panel
Experimentei vários bons paineis web free: aaPanel, CyberPanel, ISPConfig, CloudPanel e alguns outros. Minha escolha caiu no CloudPanel e o que me chamou muio a atenção nele foi seu foco em simplicidade. Tanto que nem traz um servidor de e-mail.
Então decidi usar o painel web CloudPanel (https://www.cloudpanel.io/), mas para o que pretendo falta:
- controle de quotas do espaço de cada usuário
- Acesso automático de usuários ao painel
Quotas
Pesquisei bastante mas nenhum tutorial que encontrei me possibilitou controlar as quotas de espaço em disco para cada user no servidor. Mas quando instalei o ISPConfig, em seu excelente tutorial vi que tava lá a instalação e configurações de quotas. Segui e foi beleza.
Acesso
Quando instalamos o CloudPanel, no primeiro acesso criamos um usuário, que será o administrador do painel. Somente este usuário terá acesso. Como pretendo montar uma revenda de hospedagem, então quero oferecer aos clientes a opção de se cadastrar online e automaticamente efetuar o acesso a sua área no painel, que tem users do tipo/role admin, manager e user. O tipo user é o que quero passar para os clientes, pois faz login no painel e somente acessa seu próprio site/aplicativo e conta. Também pode criar o banco de dados e um user para acesso ao servidor via SSH.
Descobri que existe como criar um user dos 3 tipos através da interface clpctl pela linha de comando do CloudPanel, mas isso somente pode ser feito no servidor e somente através do usuário root, nem com sudo vai.
Me deu trabalho encontrar uma forma de executar o comando com clpctl com root no servidor via PHP. Encontrei uma lib SSH2 para PHP que faz bem isso mas somente com PHP puro e Apache. Como estou usando laravel com Nginx no servidor, não consegui e juntando a um comentário sobre a insegurança da coisa e desisti. Tive uma brilhante ideia de com o cadastro em laravel, apenas criar um arquivo na pasta do aplicativo, contendo toda a sintaxe de criação do usuário com quer o clpctl. A grande sacada veio agora. Criei um script no servidor, na pasta do root e então por este script executo o script que está na pasta do aplicativo laravel e este cria o user que terá acesso ao painel. Quase dessito aqui novamente, pois criava o user mas ele não logava no painel. Entrei no painel com meu user e fui ver a senha do user criado, que ele não mostra. Logado com o admin tem um link para criar uma senha temporária "Generate new password". Peguei esta enorme senha temporária criada e salvei. Então com ela consegui acessar com o novo user. Resumindo, acabei percebendo que a senha deve ter mais de 12 dígitos, letras minúsculas e pelo menos uma maiúscula, algarismos de 0 a 9 e pelo menos um símbolo. Beleza, usei esta regra no cadastro do aplicativo, com regex no HTML5 e tudo rolou.
Para mmelhorar consultei a documentação oficial sobre o QueryBuilder e removi todos os registros tanto no método index quanto no store, antes que o atual seja adicionado. Assim o usuário não toma conhecimento dos dados dos anteriores e o aplicativo não armazena nada, é usado somente para gerar o script que é usado no servidor. No caso descobri que ele, o CloudPanel, grava em um banco com SQLite.
Mas falta a coisa ser automática. Para isso loguei no servidor e usei sudo -i para mudar para root.
crontab -e
# Rodar a cada minuto
* * * * * su -c "bash /root/host.sh" >> /root/host.log 2>&1
Inicialmente verificar o log era bem útil, mas acabei removendo
Então o user chega ao site do aplicativo, cria seu cadastro, com user e senha poderá acessar o painel tendo apenas que esperar em torno de um minuto para acessar o painel e ajustar sua conta, versão do PHP, efetuar ajustes no PHP, criar um banco de dados, criar um usuário para acessar seu site no servidor via SSH entre outros.
Grande aventura!!!