Base de Conhecimento

Python na VPS: como rodar seu script com venv e systemd

  • python, venv, systemd, vps, serviço
  • Usuários acharam útil: 0

Aprenda a rodar um script Python na VPS: criar o ambiente virtual, instalar as dependências, montar o serviço do systemd, ver os logs e reiniciar após atualizar.

Por Redação Eleven Host · @robson.direitodigital · 30 de outubro de 2026 · 8 min de leitura

Arte da Eleven Host: janela de terminal com o título: Python na VPS: como rodar seu script com venv e systemd

Capa da Redação Eleven Host para o guia: Python na VPS: como rodar seu script com venv e systemd Arte: Eleven Host

Para rodar Python na VPS, crie um ambiente virtual com venv, instale as dependências dentro dele e registre o script como serviço do systemd. Assim ele continua depois que você sai do terminal e, com a opção Restart=on-failure, é reiniciado se o processo falhar.

Antes de começar

Este guia parte de uma VPS que você acessa por SSH. Os exemplos usam o usuário usuario, o servidor 203.0.113.10 e a pasta /home/usuario/app, com um script chamado script.py. Troque pelos seus valores. Se a sua VPS usa Ubuntu, os comandos abaixo seguem como estão.

Prefira rodar o seu programa com um usuário comum, e não com o administrador do servidor. Se você ainda não tem um usuário com permissão de sudo, o guia Criar usuário sudo na VPS Ubuntu: passo a passo mostra como criar. Para entrar na máquina:

ssh usuario@203.0.113.10

Você também vai precisar do seu projeto na VPS, com o script e, se existir, o arquivo requirements.txt. Esse arquivo é um texto com a lista dos pacotes que o programa usa.

Instalar o venv

O venv é o módulo do Python que cria ambientes virtuais: uma pasta própria para os pacotes do seu projeto, separada do resto do sistema. No Ubuntu e no Debian, instale o pacote python3-venv. A descrição dele na página do Debian é "venv module for python3".

sudo apt update

sudo apt install python3-venv

Nos exemplos abaixo o comando é python3. A documentação do Python escreve python nos exemplos dela.

Criar o ambiente e instalar as dependências

Entre na pasta do projeto e crie o ambiente. Segundo a documentação do Python, por convenção a pasta do ambiente se chama .venv ou venv, dentro do projeto. Este guia usa .venv:

cd /home/usuario/app

python3 -m venv .venv

Para instalar pacotes dentro dele, ative o ambiente. No bash, o comando é:

source .venv/bin/activate

Com o ambiente ativo, instale as dependências listadas no requirements.txt:

pip install -r requirements.txt

A documentação do pip mostra também a forma python -m pip install -r requirements.txt, com o mesmo resultado. Para sair do ambiente, digite:

deactivate

Guarde este detalhe para a etapa do serviço: segundo a documentação do Python, você não precisa ativar o ambiente virtual, porque dá para chamar direto o caminho completo do interpretador dele. É isso que o systemd vai fazer, usando /home/usuario/app/.venv/bin/python.

Testar o script à mão

Antes de criar o serviço, rode o script na linha de comando e veja se ele funciona. Use o mesmo caminho completo que irá para o arquivo do serviço, assim você confere o caminho do interpretador e do script de uma vez:

/home/usuario/app/.venv/bin/python /home/usuario/app/script.py

Se o programa fica rodando, pare com Ctrl+C depois de ver que ele iniciou. Se aparecer um erro de pacote que não foi encontrado, volte ao passo anterior e confira se o pip install terminou sem erro com o ambiente ativo. Corrija nessa etapa, antes de criar o serviço.

Quer um servidor próprio para o seu script Python? VPS a partir de R$ 17,00/mês no Plano Bronze; confira na loja o que cada plano inclui. Ver planos de VPS

Transformar o script em serviço do systemd

O systemd é quem inicia e controla os serviços da máquina. Para ele cuidar do seu script, crie um arquivo de unit em /etc/systemd/system, pasta que a documentação descreve como a das units criadas pelo administrador. O nome termina em .service:

sudo nano /etc/systemd/system/meuscript.service

Cole o conteúdo abaixo, ajustando os caminhos e o usuário:

[Unit]

Description=Meu script Python

[Service]

ExecStart=/home/usuario/app/.venv/bin/python /home/usuario/app/script.py

WorkingDirectory=/home/usuario/app

User=usuario

Restart=on-failure

RestartSec=5

EnvironmentFile=-/home/usuario/app/.env

[Install]

WantedBy=multi-user.target

Linha a linha:

  • Description=: um texto curto que identifica o serviço para quem lê.
  • ExecStart=: o comando que o systemd executa. O primeiro item precisa ser um caminho absoluto, por isso o interpretador do venv entra com o caminho completo, seguido do caminho do script.
  • WorkingDirectory=: a pasta onde o processo roda.
  • User=: o usuário que executa o processo. Sem essa linha, o serviço de sistema roda como root, e por isso o exemplo indica o usuário comum.
  • Restart=on-failure: reinicia o serviço quando o processo termina com código de saída diferente de zero e também em caso de sinal, tempo esgotado ou watchdog. O padrão do systemd é no, sem reinício. Para serviços de longa duração, a documentação recomenda on-failure.
  • RestartSec=5: espera 5 segundos antes de reiniciar. O padrão é 100 milissegundos.
  • EnvironmentFile=: lê variáveis de um arquivo, com uma atribuição por linha. O caminho precisa ser absoluto, e o hífen no começo torna o arquivo opcional. É um bom lugar para tokens e senhas, fora do código. Como boa prática, deixe esse arquivo legível só para o dono com chmod 600. Se o seu script não usa variáveis, apague a linha.
  • WantedBy=multi-user.target: a seção [Install] diz onde o serviço se encaixa quando você o habilita. É o valor que aparece no exemplo da documentação do systemd.

Se um valor de Environment= tiver espaço, coloque a atribuição inteira entre aspas, como Environment="VAR1=word1 word2". No arquivo indicado em EnvironmentFile=, as linhas que começam com # ou ; são ignoradas.

Ligar o serviço, ver o status e os logs

Depois de criar ou editar um arquivo .service, peça ao systemd que releia a configuração. Em seguida, habilite e inicie o serviço. Sozinho, o enable não inicia o serviço, e a opção --now faz as duas coisas:

sudo systemctl daemon-reload

sudo systemctl enable --now meuscript

Confira o estado:

systemctl status meuscript

Olhe o status mesmo quando o comando anterior não mostrar erro. A documentação avisa que, no tipo padrão (Type=simple), o systemctl start pode informar sucesso mesmo que o programa não exista, e o erro só aparece depois. Por isso o status e os logs fazem parte do passo.

Para ver os logs do serviço, use o journalctl. O guia journalctl: como ver os logs do sistema na VPS detalha as opções. As opções úteis aqui:

journalctl -u meuscript

journalctl -u meuscript -f

journalctl -u meuscript -n 50

A primeira linha mostra os logs da unit. A opção -f segue as novas entradas ao vivo (Ctrl+C para sair), e -n 50 mostra as últimas 50 linhas. Sem o número, o padrão do -n é 10.

O Restart=on-failure reinicia o serviço quando o processo falha. Ele não corrige a causa da falha, por isso olhe os logs quando o serviço reiniciar.

Atualizar o código e reiniciar

Depois de mudar o script, copie os arquivos novos para a pasta do projeto e reinicie o serviço:

sudo systemctl restart meuscript

O restart faz um stop e depois um start. Depois confira de novo com systemctl status meuscript e com journalctl -u meuscript -n 50.

Se a mudança incluir pacotes novos no requirements.txt, ative o ambiente e instale antes de reiniciar:

cd /home/usuario/app

source .venv/bin/activate

pip install -r requirements.txt

deactivate

sudo systemctl restart meuscript

Se você editar o arquivo .service em vez do script, rode sudo systemctl daemon-reload antes do restart.

Acompanhar a memória da VPS

Quando o script começa a ficar mais pesado, acompanhe o consumo de memória da VPS. O guia Ver uso de memória no Linux: free, top e htop na VPS mostra os comandos.

Checklist do serviço Python

  • Pacote python3-venv instalado (sudo apt install python3-venv).
  • Ambiente criado com python3 -m venv .venv na pasta do projeto.
  • Dependências instaladas com pip install -r requirements.txt e o ambiente ativo.
  • Script testado à mão com o caminho completo do interpretador do venv.
  • Arquivo em /etc/systemd/system/meuscript.service com ExecStart absoluto, User, Restart=on-failure e WantedBy=multi-user.target.
  • Variáveis secretas em arquivo separado (EnvironmentFile=) com chmod 600.
  • sudo systemctl daemon-reload depois de criar ou editar o arquivo.
  • sudo systemctl enable --now meuscript, seguido de systemctl status meuscript e journalctl -u meuscript.
  • sudo systemctl restart meuscript depois de atualizar o código.

Quer um servidor próprio para os seus projetos em Python? VPS a partir de R$ 17,00/mês no Plano Bronze; confira na loja o que cada plano inclui. Conhecer os planos

Perguntas frequentes

Preciso ativar o venv para o systemd usar?

Não. Segundo a documentação do Python, dá para indicar o caminho completo do interpretador do ambiente, como /home/usuario/app/.venv/bin/python, sem ativar nada.

O que faz o Restart=on-failure?

Reinicia o serviço quando o processo termina com código de saída diferente de zero, e também em caso de sinal, tempo esgotado ou watchdog. O padrão do systemd é não reiniciar.

Preciso rodar o daemon-reload?

Sim, depois de criar ou editar o arquivo .service, para o systemd reler a configuração.

Como ver o que o meu serviço registrou?

Use journalctl -u meuscript. Para acompanhar ao vivo, acrescente -f.

Onde guardar tokens e senhas do script?

Em um arquivo separado, lido pela linha EnvironmentFile=, fora do código. Como boa prática, limite o acesso a ele com chmod 600.

Esta resposta lhe foi útil?

Artigos Relacionados