Categories

  • Development

Tags

  • homelab
  • development
  • hardware
  • programming
  • experimentation
  • colima
  • casaos
  • opensource

TL;DR: Só quer o resultado? Vai no perfil do Github.

Contexto

Uma tendência da qual não fazia idéia, os homelabs/homeservers parece ter entrado em alta na esteira do aumentode controle e da segurança de dados pessoais.

Visto os múltiplos vazamentos de dados, LGPD, GDPR, IA usando tudo e mais um pouco da vida de cada indivíduo da terra através de empresas que poucou ou nunca se importam pois são pautadas no lucro, é mais do que justificável que hajam cada vez mais pessoas tomando de volta o controle daquilo que elas são donas.

Isso tudo foi pensado depois que comecei a planejar alterações em um mac mini antigo que tenho comigo parado fazendo absolutamente nada. Eis que inicia o nascimento do servidor caseiro.

Ok, mas e ai?

Me organizei nas buscas e entendi que queria inicialmente facilitar para o meu lado, descobri o sistema open source CasaOS, um hub que pode ser instalado diretamente numa máquina Linux e transforma-lá num ponto de acesso para filmes, fotos, arquivos e mais.

O CasaOS é um programa de código aberto baseado na comunidade, focado em fornecer simplicidade na criação e administração de nuvem doméstica.

Ele faz bem mais queser uma nuvem doméstica pois permite a criação de extensões, aplicativos, que cuidam de tarefas e ações específicas flexibilizando a criação desse servidor pessoal.

CasaOS "loja" de apps

Exemplos:

  • 2FA;
  • Filtrador de Ads;
  • Sincronizador de arquivos;
  • Biblioteca de música;
  • Automação residencial;
  • Biblioteca de Fotos;

E no MacOS?

Não existe uma compilação que funcione diretamente no mac no momento em que esse artigo é escrito. Solução: VM.

E no objetivo de automatizar a configuração e controle dessa vm de forma mais fácil acabei encontrando esse post do Junian que indica o uso do Colima para essa tarefa.

Uma sequência claramente automatizável:

brew install colima
colima start --vm-type=vz --network-address
colima ssh
curl -fsSL https://get.casaos.io | sudo bash

Traduzindo: 1 - Instala o Colima usando Homebrew 2 - Inicia a configuraçao de um container (vm) com acesso a rede do host (o mac). O Colima cria um container de nome padrão “default” 3 - Acessa a vm com ssh 4 - Baixa o script de configuração do CasaOS e executa o mesmo com permissão de admin e bash

O resultado é acessar o CasaOS via IP apresentado ao fim da execução no terminal.

Imagem do CasaOS no mac mini

E a automatização?

Para essa parte foi necessário uma boa quantidade de aprendizado e experimentação.

Depois de testar tudo que era necessário e errar um número considerável de vezes o processo final ficou dividido em dois scripts: um bash e um python.

A escolha do Python foi pela familiaridade, pela vastidão de recursos de pesquisa online e por estar usualmente já instalado no mac. Uma boa alternativa seria utilizar o Rust.

Outra decisão foi dar ou não suporte para automatizar no Linux também, optei por fazê-lo.

Ainda na escolha eu decidi por utilizar o Homebrew pois considero uma solução confiável pra gerenciar as instalações no mac.

As outras duas ferramentas que são necessárias são o Docker e o próprio Colima.

Por último fica restando o CasaOS.

Python check no bash

O jarbas.sh cuida de verificar se o python se faz presente ou não.

Para isso bastou usar o comando command: if command -v python3 >/dev/null 2>&1; then

Logo em seguida basta usar o Homebrew ou apt-get, ou outra ferramenta para instalar o Python (nesse caso a v3).

$ brew install python3
$ sudo apt-get update
$ sudo apt-get install -y python3

Todo o resto é em Python

Dentro do script Jarbas.py está organizado toda a lógica de configuração e início. Além de ser possível remover o ambiente todo por aqui mesmo, para o caso de atualizações serem feitas na montagem/desmontagem do servidor caseiro.

Para as instalações bastou usar o subprocess e executar a ferramente de gerenciamento de instaláveis.

As exceções são o Homebrew e o CasaOS que tem seus próprios bash scripts.

Montagem do container/vm com Colima

Nesse ponto foram considerados os pontos a seguir:

1 - E se quiser rodar um container com outro nome? - Que no caso do Colima é chamado profile

2 - Como determinar as especifíções do ambiente para que já seja montado num padrão considerado adequado?

3 - Como saber se um container já existe e está rodando?

1 & 2

O profile é facilmente determinado com o parâmetro –profile.

As especificações foram explicitadas diretamente no comando usando os parâmetros:

  • –cpu
  • –memory
  • –disk
  • –network-address
  • –vm-type

Como alternativa o jarbas.py poderia chamar colima template que permite editar o arquivo default.yaml utilizado pelo Colima nas criações sem parâmetros no terminal.

3

A saída do comando colima list é o suficiente para determinar uma série de informações e uma simples quebra de string com loop resolve isso. Segue a saída do comando.

PROFILE STATUS ARCH CPUS MEMORY DISK RUNTIME ADDRESS
casaosenv Running x86_64 4 8GiB 10GiB docker 192.168.64.2
def colima_profile_exists(profile_name: str) -> bool:
	try:
		result = subprocess.check_output(['colima', 'list'], text=True)
		lines = result.strip().split('\n')
		# Skip header line
		for line in lines[1:]:
			columns = line.split()
			if columns and columns[0] == profile_name:
				return True
		return False
	except Exception as e:
		print(f"Error running colima list: {e}")
		return False

Finalizando com o CasaOS no Colima

Essa parte foi a mais difícil dentre todo o restante, o desafio? Rodar um comando ssh e dentro do container executar o bash script do CasaOS.

Muita leitura de documentação, tentativa e erro e o bom e velho “entra do fusca, sai do fusca”, consegui encontrar a solução.

subprocess.run(['colima','ssh','-p',env_name], 
input='curl -fsSL https://get.casaos.io | sudo bash', 
stdout=subprocess.PIPE, text=True, stderr=subprocess.PIPE)

Parece simples, o pulo do gato foi usar o parâmetro input da função run do subprocess.

E porque não isso não foi fácil? Porque a sessão do ssh é iniciada para que um humano interaja e não para que automações sejam feitas, e para usar um cliente de ssh do Python seriam necessários os parâmetros de segurança, usuário/senha/chave, sendo assim no fim foi possível simplificar e usar somente o subprocess evitando essa complexidade desnecessária para o caso em questão.

Extra

Uma vez que o ambiente é acessado via IP, adicionei a função get_colima_ip para fornecer como resultado o valor ao fim do processo todo, sabendo assim por onde o CasaOS responde.

Isto poderia ser feito novamente pelo comando colima list, no entanto utilizei regex no comando colima status "profile" para praticar um pouco mais.

def get_colima_ip(profile_name: str) -> str:
	try:
		result = subprocess.run(['colima', 'status', profile_name],
		 text=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE)        
		match = re.search(r'address:\s*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)',
		 result.stdout or result.stderr)
		if match:
			return match.group(1)
		else:
			print("IP address not found in output.")            
	except Exception as e:
		print(f"Error running colima status: {e}")
	return ""

Conclusão

Com os scripts do Jarbas pode-se experimentar livremente de dentro do container e até tornar o ambiente todo inutilizável. Basta rodar python3 jarbas.py -destroy e python3 jarbas.py -setup_casaos e um novo ambiente estará pronto para novos experimentos.

Acesse o resultado completo no meu perfil do Github

Próximos passos

Provisionamento do ambiente evitando perder bons resultados que precisam estar presentes após a montagem do CasaOS.

Referências