Python na VPS: como rodar seu script com venv e systemd
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

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 recomendaon-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 comchmod 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-venvinstalado (sudo apt install python3-venv). - Ambiente criado com
python3 -m venv .venvna pasta do projeto. - Dependências instaladas com
pip install -r requirements.txte o ambiente ativo. - Script testado à mão com o caminho completo do interpretador do venv.
- Arquivo em
/etc/systemd/system/meuscript.servicecomExecStartabsoluto,User,Restart=on-failureeWantedBy=multi-user.target. - Variáveis secretas em arquivo separado (
EnvironmentFile=) comchmod 600. sudo systemctl daemon-reloaddepois de criar ou editar o arquivo.sudo systemctl enable --now meuscript, seguido desystemctl status meuscriptejournalctl -u meuscript.sudo systemctl restart meuscriptdepois 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.