sábado, 11 de outubro de 2025

Instalar o Ollama e Open Web UI

Instação do podman

O Docker poderia ser usado mas vou dar preferencia para o podman. Com isso podemos levantar as 2 aplicações de forma mais isolada do sistema base.

IMPORTANTE! Portainer não sobe o stack tem que ser por linha de comando. Docker da problema parece que estamos vivendo uma migração do modo OCI de trabalhar para o CDI. Não sei entedi certo.

sudo apt update
sudo apt-get -y install podman podman-compose
sudo systemctl enable --now podman.socket

Para usar placa NVIDIA alguns passos são necessários

Infelizmente isso tem que ser feito na maquina base do docker. Se ela for virtual os Drivers também devem ser instalados no Host também.

instalação básica do drives da NVIDIA

sudo apt update
sudo apt install nvidia-driver linux-headers-$(uname -r)

Instalar nvidia container toolkit

Fonte: https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html#installation

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \
    | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \
    | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \
    | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update
export NVIDIA_CONTAINER_TOOLKIT_VERSION=1.17.8-1
    sudo apt-get install -y \
      nvidia-container-toolkit=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
      nvidia-container-toolkit-base=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
      libnvidia-container-tools=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
      libnvidia-container1=${NVIDIA_CONTAINER_TOOLKIT_VERSION}

Instalar e ativar o Container Device Interface (CDI)

Fontes:

https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/cdi-support.html

https://docs.docker.com/reference/cli/docker/container/run/#cdi-devices
https://docs.docker.com/build/building/cdi/

https://docs.docker.com/reference/cli/docker/container/run/#gpus
https://docs.docker.com/compose/how-tos/gpu-support/

sudo nvidia-ctk cdi generate --output=/etc/cdi/nvidia.yaml

Testando o container

Fonte: https://docs.podman.io/en/v4.6.0/markdown/options/security-opt.html

Esse é o modo CDI

podman run --rm \
    --device nvidia.com/gpu=0 \
    --security-opt=label=disable \
    ubuntu nvidia-smi -L

services:
  test:
    image: docker.io/nvidia/cuda:12.3.1-base-ubuntu20.04
	runtime: nvidia
    command: nvidia-smi
    devices:
      - nvidia.com/gpu=all

Esse é o modo nvidia-container-toolkit

podman run --rm \
    --gpus=all \
    ubuntu nvidia-smi -L

services:
  test:
    image: docker.io/nvidia/cuda:12.3.1-base-ubuntu20.04
	runtime: nvidia
    command: nvidia-smi
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]

Instalar Ollama

podman run -d -v ollama:/root/.ollama \
    --gpus=all \
    --security-opt=label=disable \
    -p 11434:11434 \
    --name ollama \
    --security-opt=label=disable \
    ollama/ollama
podman run -d -v ollama:/root/.ollama \
    --device nvidia.com/gpu=0 \
    --security-opt=label=disable \
    -p 11434:11434 \
    --restart always \
    --name ollama \
    docker.io/ollama/ollama

Instalar Open WebUI

podman run -d -v open-webui:/app/backend/data \
    -p 3000:8080 \
    -e OLLAMA_BASE_URL=http://ollama:11434 \
    --name open-webui \
    --restart always \
    ghcr.io/open-webui/open-webui:main

Docker Compose


version: '3.8'

services:
  ollama:
    # O serviço principal Ollama para rodar modelos de linguagem
    image: docker.io/ollama/ollama
    container_name: ollama
    # Removemos a opção --restart=always do comando original, mas 
    # é altamente recomendado mantê-la para produção.
    # restart: always 
    
    # Mapeamento de portas para que o Ollama seja acessível fora do Podman
    # Você usará esta porta para acessar a interface da web (via proxy interno)
    # ou para rodar modelos diretamente.
    ports:
      - "11434:11434"
      
    # Configuração de recursos de GPU
    deploy:
      resources:
        reservations:
          devices:
            # Especifica a GPU a ser usada (dispositivo 0 neste caso)
            - driver: nvidia
              device_ids: ['0']
              capabilities: [gpu]
              
    # Desabilita o rótulo de segurança (necessário para rodar o Ollama com GPU em certos setups Linux)
    security_opt:
      - label=disable
      
    # Mapeia o volume para persistir os modelos baixados e as configurações
    volumes:
      - ollama_data:/root/.ollama
      
  open-webui:
    # A interface de usuário baseada na web para interagir com o Ollama
    image: ghcr.io/open-webui/open-webui:main
    container_name: open-webui
    restart: always 
    
    # Mapeamento de portas para acessar a interface web no host (porta 3000)
    ports:
      - "3000:8080" # Host:3000 -> Container:8080
      
    # Variável de ambiente para que o Open WebUI saiba onde encontrar o Ollama.
    # Usamos o nome do serviço 'ollama' + a porta interna (11434)
    environment:
      - OLLAMA_BASE_URL=http://ollama:11434
      
    # Volume para persistir os dados do usuário, sessões e configurações do Open WebUI
    volumes:
      - open_webui_data:/app/backend/data

# Definição dos volumes nomeados
volumes:
  ollama_data:
    driver: local
  open_webui_data:
    driver: local

networks:
  default:
    enable_ipv6: true

quarta-feira, 1 de outubro de 2025

Programar em Python no EV3 por Bluetooth no Debian 13

 
Crie o SDCard
https://www.ev3dev.org/downloads/
https://education.lego.com/en-us/product-resources/mindstorms-ev3/teacher-resources/python-for-ev3/

Documentação
https://docs.pybricks.com/en/v2.0/index.html

IDE
https://vscodium.com/

Extensão
https://open-vsx.org/vscode/item?itemName=ev3dev.ev3dev-browser

Com isso vc consegue usar seu ev3 pelo cabo USB.

Agora vamos preparar o pc para usar pelo Bluetooth

Instale no Debian 13:
sudo apt install bluez

Wireless and Networks >
Bluetooth >
Powered [x]
Visible [x]

Escaneie no PC e confirme no EV3

Wireless and Networks >
Tethering>
Bluetooth [x]

Inicie a conexão e aceite no EV3:
Authorize service BNEP? Accept

Código main.py de exemplo:
#!/usr/bin/env pybricks-micropython

## exemplo
# fonte: https://docs.pybricks.com/en/v2.0/start_ev3.html
from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor
from pybricks.parameters import Port

# Create your objects here

# Initialize the EV3 Brick.
ev3 = EV3Brick()

# Initialize a motor at port B.
#test_motor = Motor(Port.B)

# Write your program here

# Play a sound.
ev3.speaker.beep()

# Escrever na tela
ev3.screen.clear()
ev3.screen.print("Ola Mundo!")

# Falar
ev3.speaker.set_speech_options("pt-br")
ev3.speaker.say("Ola Mundo")

# Run the motor up to 500 degrees per second. To a target angle of 90 degrees.
#test_motor.run_target(500, 90)

# Play another beep sound.
ev3.speaker.beep(frequency=1000, duration=500)

PROXMOX passthrough GPU

No Servidor Proxmox

nano /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet iommu=pt"

update-grub

nano /etc/modules-load.d/vfio.conf
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

update-initramfs -u -k all

reboot

Para conferir: 

lsmod | grep vfio
dmesg | grep -e DMAR -e IOMMU -e AMD-Vi
pvesh get /nodes/$(hostname)/hardware/pci --pci-class-blacklist ""

Na VM
Configure os repositorios adicionais:
vi /etc/apt/sources.list
contrib non-free non-free-firmware

apt update
apt install nvidia-driver
apt install linux-headers-$(uname -r)


Problemas encontrados sem uma explicação:

- Não use EFI em vez disso use:
bios: seabios

- Especifique o Display como Standard VGA (std), normalmente uso vga: serial0
vga: std

quinta-feira, 25 de setembro de 2025

Virt-Manager

 O site do Virt-Manager mostra que para instalar ele é simples basta digitar:
apt-get install virt-manager

Mas você precisa digitar a senha para fazer sudo cada vez que abre ao menos que coloque seus usuários no grupo libvirt:
sudo usermod -aG libvirt aluno
sudo usermod -aG libvirt emazolini

Se quiser acessar remoto vai precisar de um netcat com opção -U:
sudo apt install netcat-openbsd

Por fim você vai ficar feliz até voltar no outro dia e perceber que sua maquina não sobe mais por um erro de rede.
Pra resolver isso ative a rede default:

$ sudo virsh net-list --all
 Nome      Estado    Auto-iniciar   Persistente
-------------------------------------------------
 default   inativo   não            sim

$ sudo virsh net-start default
Rede default iniciada

$ sudo virsh net-autostart default
A rede default foi marcada como auto-iniciada

$ sudo virsh net-list --all
 Nome      Estado   Auto-iniciar   Persistente
------------------------------------------------
 default   ativo    sim            sim

segunda-feira, 22 de setembro de 2025

ipv6 nginx proxy manager para Docker < 27

Eu preciso encaminhar acesso ipv6 para alguns servidores.

Depois de atribuir o ip ao servidor host o encaminhamento de porta do ipv6 não funcionava.

Pode ser que vc queira extender a rede ipv6 até o seus container não é o meu caso eu preciso que o Docker faça o NAT e encaminhe a porta para o container. Mas se vc tiver ipv6 pra estender a rede só de declarar o ipv6 não ULA ele ira funcionar se vc habilitar o roteamento ipv6 no linux.

BUG o Docker não é inteligente para criar varias redes só com uma declaração de range base /48 com size /64, percebi isso quando fui criar a segunda rede. Então vc tem que criar varias entradas, espero que isso mude logo.

O parâmetro ip6tables, que faz o nat, só funciona com experimental.

Isso tudo eu estava usando versão:

# docker --version
Docker version 26.1.2, build 211e74b

# docker --version
Docker version 24.0.4, build 3713ee1


Para versão maior que v28

{
  "ipv6": true,
  "ip6tables": true
}

Atenção pq algumas portas como a 80 funcionam sem o ip6tables true, o que me fez perder 2 dias procurando um firewall na port 443 que não existia. Se funciona para 80 pq não funcionaria para 443? Pois é! Só sei que foi assim.


Então minha solução foi criar o arquivo /etc/docker/daemon.json para versões anteriores:

{
  "ipv6": true,
  "fixed-cidr-v6": "fd00:2705:0001::/64",
  "experimental": true,
  "ip6tables": true,
  "default-address-pools": [
    {
      "base": "172.20.0.0/16",
      "size": 24
    },
    {
      "base": "fd00:2705:0002::/48",
      "size": 64
    },
    {
      "base": "fd00:2705:0003::/48",
      "size": 64
    },
    {
      "base": "fd00:2705:0004::/48",
      "size": 64
    },
    {
      "base": "fd00:2705:0005::/48",
      "size": 64
    },
    {
      "base": "fd00:2705:0006::/48",
      "size": 64
    },
    {
      "base": "fd00:2705:0007::/48",
      "size": 64
    },
    {
      "base": "fd00:2705:0008::/48",
      "size": 64
    },
    {
      "base": "fd00:2705:0009::/48",
      "size": 64
    },

    {
      "base": "fd00:2705:0010::/48",
      "size": 64
    }, 
   {
      "base": "fd00:2705:0011::/48",
      "size": 64
    },
    {
      "base": "fd00:2705:0012::/48",
      "size": 64
    },
    {
      "base": "fd00:2705:0013::/48",
      "size": 64
    },
    {
      "base": "fd00:2705:0014::/48",
      "size": 64
    },
    {
      "base": "fd00:2705:0015::/48",
      "size": 64
    },
    {
      "base": "fd00:2705:0016::/48",
      "size": 64
    }
  ]
}

segunda-feira, 8 de setembro de 2025

Broadcom Raid

 Tenho 2 servidores DELL e preciso olhar como esta a saúde do RAID e dos discos.

Baixei o STORCLI_SAS3.5_P36 de https://www.broadcom.com/support/download-search?dk=storcli

wget https://docs.broadcom.com/docs-and-downloads/host-bus-adapters/host-bus-adapters-common-files/sas_sata_nvme_12g_p36/STORCLI_SAS3.5_P36.zip


descompactei e na pasta ubuntu tem um .deb

unzip STORCLI_SAS3.5_P36.zip

cd STORCLI_SAS3.5_P36/univ_viva_cli_rel/Unified_storcli_all_os/Ubuntu/

dpkg -i storcli_007.3503.0000.0000_all.deb


Foi necessário criar um link simbolico para executar o comando de forma mais comoda.

ln -s /opt/MegaRAID/storcli/storcli64 /usr/local/bin/storcli


Alguns comandos uteis:

storcli show
storcli /c0/vall show
storcli /c0/eall/sall show
storcli /c0 show all

Para saber o nome do seu servidor também tem um comando interessante:

dmidecode -s system-product-name


Para saber detalhes dos discos físicos:

smartctl -a /dev/sda -d megaraid,0
smartctl -a /dev/sda -d megaraid,1
smartctl -a /dev/sda -d megaraid,2
smartctl -a /dev/sda -d megaraid,3

terça-feira, 2 de setembro de 2025

DNS Seguro e Safe-Search - Restringindo a internet de forma simples

Controles de DNS na Ludicando

Na Ludicando alguns controles eu faço no Mikrotik usando DNS restritivo e alterando alguns domínios para não responder e outros para tratarem o conteúdo para ser seguro para crianças.

Abaixo o link para o script (com comentários citando as fontes de cada produto):
https://gist.github.com/eduardomazolini/77466da39e7940b7d652b2bb5af6ef55

Serviços de DNS confiáveis/populares

OpenDNS

IPv4
208.67.222.222
208.67.220.220

IPv6
2620:119:35::35
2620:119:53::53

DoH
https://doh.opendns.com/dns-query

OpenDNS — Family Shield

IPv4
208.67.222.123
208.67.220.123

DoH
https://doh.familyshield.opendns.com/dns-query

Cloudflare

IPv4
1.1.1.1
1.0.0.1

IPv6
2606:4700:4700::1111
2606:4700:4700::1001

DoH
https://cloudflare-dns.com/dns-query

Cloudflare — Block malware

IPv4
1.1.1.2
1.0.0.2

IPv6
2606:4700:4700::1112
2606:4700:4700::1002

DoH
https://security.cloudflare-dns.com

Cloudflare — Block malware and adult content

IPv4
1.1.1.3
1.0.0.3

IPv6
2606:4700:4700::1113
2606:4700:4700::1003

DoH
https://family.cloudflare-dns.com
https://one.one.one.one/dns-query?name=cloudflare.com

Docs
https://developers.cloudflare.com/1.1.1.1/encryption/

Google Public DNS

IPv4
8.8.8.8
8.8.4.4

IPv6
2001:4860:4860::8888
2001:4860:4860::8844

DoH
https://dns.google/dns-query  (RFC 8484 - GET e POST)
https://dns.google/resolve?    (API JSON - GET)

Docs
https://developers.google.com/speed/public-dns/docs/doh?hl=pt-br

AdGuard DNS — Servidores padrão

AdGuard DNS bloqueará anúncios e rastreadores.

IPv4
94.140.14.14
94.140.15.15

IPv6
2a10:50c0::ad1:ff
2a10:50c0::ad2:ff

DoH
https://dns.adguard-dns.com/dns-query

Página
https://adguard-dns.io/pt_br/public-dns.html

AdGuard DNS — Servidores sem filtragem

IPv4
94.140.14.140
94.140.14.141

IPv6
2a10:50c0::1:ff
2a10:50c0::2:ff

DoH
https://unfiltered.adguard-dns.com/dns-query

AdGuard DNS — Proteção familiar

Bloqueia anúncios, rastreadores, conteúdo adulto e ativa a Pesquisa Segura / Modo seguro quando possível.

IPv4
94.140.14.15
94.140.15.16

IPv6
2a10:50c0::bad1:ff
2a10:50c0::bad2:ff

DoH
https://family.adguard-dns.com/dns-query

Referência adicional

Admin Console Google Workspace (suporte)
https://support.google.com/a/answer/6214622

Wake on Lan - Debian

Para ativar os PCs que suspenderam por tempo e ter acesso remoto.

1) Instalar o ethtool

sudo apt update
sudo apt install ethtool

2) listar as interfaces

ip addr

No meu caso identifiquei enp2s0

3) Crie o arquivo de serviço como root

sudo nano /etc/systemd/system/wol@.service

4) coloque o conteúdo

[Unit]
Description=Wake-on-LAN para %i
After=network.target suspend.target hibernate.target

[Service]
Type=oneshot
ExecStart=/sbin/ethtool -s %i wol g

[Install]
WantedBy=multi-user.target suspend.target hibernate.target

5) Ative o serviço e desta vez observe que o nome do serviço contém a interface

sudo systemctl enable wol@enp2s0.service

sexta-feira, 29 de agosto de 2025

Epson L1800 - CUPS Linux

Infelizmente a Epson não tem drive para ARM nem para sistema de 32bits i386. Pq eu queria usar minha OrangePi ou RapsbarryPi como servidor de impressão. Também tentei deixar um netbook Atom antigo que é 32Bits.

No fim tive que deixar um notebook Positivo de 32G de disco e 1Gb de RAM.

wget https://download3.ebz.epson.net/dsc/f/03/00/15/64/76/69bb3d019d2d4a6b1eeab2fbe4db5c081d2b6b86/epson-inkjet-printer-201312w_1.0.1-1_amd64.deb

apt install cups

apt install printer-driver-gutenprint printer-driver-foo2zjs printer-driver-ptouch ghostscript cups-filters libcupsimage2

apt install ./epson-inkjet-printer-201312w_1.0.1-1_amd64.deb


Esses pacotes acima resolvem erros como:

Filter failed


EPSON_L1800_Series: error while loading shared libraries: libcupsimage.so.2: cannot open shared object file: No such file or directory

PID 0000 (/usr/lib/cups/filter/gstoraster) exited with no errors.


Para acessar remotamente edite:
 

/etc/cups/cupsd.conf

Comente:

#Listen localhost:631

adicione:
Port 631


Procure os blocos <Location />, <Location /admin>, e <Location /admin/conf> e adicione as linhas abaixo dentro de cada bloco:

Allow @LOCAL


Ative o serviço:

sudo systemctl enable cups
sudo systemctl start cups


Se precisar reinicie o serviço:

sudo systemctl restart cups

 

Adicione seu usuário como autorizado:
 

sudo usermod -aG lpadmin $(whoami)

FONTE: https://download.ebz.epson.net/dsc/search/01/search/

O site da Epson em português não tem drive para Linux.

sábado, 16 de agosto de 2025

PIX com TAG NFC

Fazer um pix parece muito fácil não é?

  1. Destravar o celular com Biometria
  2. Tem que achar o app do banco
  3. Logar no app com senha do app
  4. Ir na área de pix
  5. Escolher pagar pix com QR-Code
  6. Mirar a câmera no QR-Code
  7. Aguardar o foco da câmera funcionar
  8. Fazer alguns passos de confirmação
  9. Digitar sua senha de pagamento

Nesse processo você digitou no meio da rua 2 senhas do seu banco.

Eu prefiro pagar com débito:

  1. Destravar o celular com Biometria
  2. Encostar o celular

Mas se der para fazer PIX por aproximação?

  1. Destravar o celular com Biometria
  2. Encostar o celular
  3. Digitar o valor
  4. Confirmar com Biometria

Não é tão fácil como débito, mas dá para pagar dando algum benefício para o vendedor.

Primeiro compre uma TAG adesiva ou um cartão NFC.

Baixe o app NFC Tool: https://play.google.com/store/apps/details?id=com.wakdev.wdnfc

Usando o app do seu banco crie um pagamento PIX com ou sem valor, com identificação se preferir. Copie o PIX "PIX Copia e Cola".

No site https://www.urlencoder.org/pt/ você pode codificar o seu PIX no formato "URL Encoder". Isso vai remover espaços e substituir por "%20" e modificar algum caráter especial se existir.

Agora, no NFC Tool, você vai gravar no cartão uma URL Personalizada. Digite:

pix://localhost?qr=

Cole seu PIX codificado, vai ficar algo assim:

pix://localhost?qr=00020126650014br.gov.bcb.pix01.....B9rp6304E416

Escolha gravar no cartão e pronto.

Proteja seu cartão com senha para nenhum engraçadinho trocar o PIX do seu cartão e direcionar seus pagamentos para ele.

 

FONTE: https://www.bcb.gov.br/content/estabilidadefinanceira/pix/especificacoes_pix_aproximacao_android.pdf