Estou no nixos, mas isso não deve ser relevante para este problema.
Criei um serviço systemd que inicia um contêiner docker (open-webui). Mesmo antes do login, o contêiner é iniciado e a interface da web funciona perfeitamente, mas de acordo com os logs deste serviço systemd, este não deveria ser o caso:
$ journalctl -b 0 -u open-webui-custom.service
Aug 22 11:51:13 <pc-name> systemd[1]: Starting Start up Open WebUI Server...
Aug 22 11:51:13 <pc-name> systemd[1]: Started Start up Open WebUI Server.
Aug 22 11:51:13 <pc-name> open-webui-custom-start[3036]: /nix/store/igwwyxj9qznw0bcylwf5f5f1pyrgl2w1-unit-script-open-webui-custom-start/bin/open-webui-custom-start: line 3: docker: command not found
Aug 22 11:51:13 <pc-name> systemd[1]: open-webui-custom.service: Main process exited, code=exited, status=127/n/a
Aug 22 11:51:13 <pc-name> systemd[1]: open-webui-custom.service: Failed with result 'exit-code'.
O arquivo .service gerado:
[Unit]
After=docker.service docker.socket
Description=Start up Open WebUI Server
[Service]
Environment="LOCALE_ARCHIVE=/nix/store/..."
Environment="PATH=/nix/store/w1iq3315z63558j04gnlzdd2yk1v1hfz-coreutils-9.5/bin:/nix/store/ajymwgc23snyw48wvkapw4qjggsi2vbw-findutils-4.10.0/bin:/nix/store/7adzfq6lz76h928gmws5sn6nkli14ml6-gnugrep-3.11/bin:/nix/store/d58flzaagmfb5pyvmknly4cnws45nc80-gnused-4.9/bin:/nix/store/mhq3m0gm80w8xxkbbkhds2gcm2k7y4fd-systemd-256.4/bin:/nix/store/w1iq3315z63558j04gnlzdd2yk1v1hfz-coreutils-9.5/sbin:/nix/store/ajymwgc23snyw48wvkapw4qjggsi2vbw-findutils-4.10.0/sbin:/nix/store/7adzfq6lz76h928gmws5sn6nkli14ml6-gnugrep-3.11/sbin:/nix/store/d58flzaagmfb5pyvmknly4cnws45nc80-gnused-4.9/sbin:/nix/store/mhq3m0gm80w8xxkbbkhds2gcm2k7y4fd-systemd-256.4/sbin"
Environment="TZDIR=/nix/store/g3nif4n7a4gmrng4xgihkd4l8q04hh3p-tzdata-2024a/share/zoneinfo"
ExecStart=/nix/store/igwwyxj9qznw0bcylwf5f5f1pyrgl2w1-unit-script-open-webui-custom-start/bin/open-webui-custom-start
Group=root
Type=exec
User=root
[Install]
WantedBy=multi-user.target
E o script executado por este serviço:
#!/nix/store/4bj2kxdm1462fzcc2i2s4dn33g2angcc-bash-5.2p32/bin/bash
set -e
docker container rm open-webui && docker run -p 8080:8080 -v /mnt/860Evo/open-webui:/app/backend/data -e OLLAMA_BASE_URL=http://192.168.178.184:11434 --name open-webui --restart always ghcr.io/open-webui/open-webui:main
De acordo com meu entendimento, os serviços do systemd After
devem garantir que o comando docker esteja acessível. Tenho certeza que o systemd não tenta iniciar meu serviço antes docker.service
e docker.socket
porque estes também usamWantedBy=multi-user.target
Minha próxima ideia foi que o root não está no grupo docker. Mas usar User=root
Group=docker
leva ao mesmo resultado. Mesmo mudar User
para executar o serviço como meu próprio usuário - que definitivamente tem acesso ao comando docker - não funciona.
Suponho que este serviço ainda seja chamado antes que o daemon do docker esteja pronto para uso. O que eu faço para resolver esse problema?
Eu sei que existe services.open-webui
para nixos, mas quero mais controle sobre como o contêiner do docker é executado e quais permissões ele possui + quero mudar para o docker sem root no futuro.
Graças à resposta mais recente de muru, dei uma olhada no
docker run
comando e percebi que meu comando copiado e colado cegamentedocker run -p 8080:8080 -v /mnt/860Evo/open-webui:/app/backend/data -e OLLAMA_BASE_URL=http://192.168.178.184:11434 --name open-webui --restart always ghcr.io/open-webui/open-webui:main
registraria o contêiner para iniciar automaticamente a cada inicialização. É por isso que o servidor web estava funcionando apesar da falha do serviço systemd.No serviço systemd, adicionei
Requires=docker.service
o caminho para o binário do docker e removidocker.socket
do arquivoAfter
. Em vez de usardocker run
mudei paradocker start
- agora está tudo funcionando :DObrigada muru 👍