Como eu crio um cron job seguro e seguro para executar scripts PHP do meu site?
Estou criando um script de instalação do PHP para o Ubuntu 16.04.3 LTS Server. O script copia os arquivos do meu pacote de instalação para /var/www/mysite
e define as permissões de leitura / gravação apropriadas para a conta de usuário padrão do Apache, que é www-data
:
setfacl -R -m u:www-data:rX /var/www/mysite
setfacl -R -m u:www-data:rwX /var/www/mysite/storage /var/www/mysite/bootstrap/cache
setfacl -dR -m u:www-data:rwX /var/www/mysite/storage /var/www/mysite/bootstrap/cache
Agora, como a etapa final do meu script de instalação, eu preciso instalar trabalhos agendados que chamam comandos PHP no meu site, por exemplo, como este:
php /var/www/mysite/artisan notifications:send
Eu fiz algumas pesquisas e encontrei várias opções e possíveis complicações, por isso não sei qual seria a maneira mais correta e sem erros de criar uma tarefa cron na minha situação.
Pensamentos e perguntas específicas:
-
parece que o melhor local para instalar trabalhos agendados que não pertençam a um usuário específico, mas para serviços executados em segundo plano, seria /etc/cron.d
, certo? Também parece uma escolha segura para o processo de instalação automatizado, porque não terei que alterar nenhum arquivo de configuração do cron existente do meu script de instalação, mas apenas adicionar um novo arquivo, se ele ainda não existir.
-
Eu não quero executar meus trabalhos como root; Isso pode não ser uma boa ideia para sites, certo? Então, vou precisar de um usuário dedicado. No começo eu pensei - ei, eu já tenho www-data
usuário criado para o servidor Apache e com todas as permissões necessárias para o meu site, então eu poderia usar isso, certo? Mas eu li que www-data
user na verdade não tem permissões para executar comandos shell! Então, eu teria que alterar as permissões de www-data
(o que parece não ser uma boa ideia) ou eu deveria criar uma nova conta de usuário especificamente para minhas tarefas agendadas, como mysite-jobs
. Mas como posso verificar com segurança a existência desse usuário e, se ele não existir, crie o usuário a partir do meu script de instalação? E como especifico suas permissões para que o cron possa executar php /some/command
como este usuário, mas o próprio usuário não possui /home
nem senha e não consegue logar normalmente?
-
também, eu li que variáveis de ambiente não estão automaticamente disponíveis para trabalhos em cron.d
, então eu tenho que especificá-las no meu arquivo cron. Tecnicamente, pode parecer assim, né?
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
Meu palpite é que isso também pode corrigir automaticamente o problema de lançar comandos PHP no ponto anterior, mas não tenho certeza se não estou dando muitas permissões aqui - não quero que o usuário execute qualquer Comando shell ou qualquer comando desses diretórios bin e sbin, mas php /some/command
apenas. E isso também me faz pensar - se eu tiver que especificar variáveis SHELL e PATH para o cron usar somente para este trabalho, então talvez seja seguro usar www-data
afinal - essas variáveis de ambiente não vão vazar do cron job, certo? Mas não tenho certeza se eles serão eficazes para www-data
, considerando que é uma conta "especial".
- depois que eu criar um cron job em
/etc/cron.d
, ele será escolhido pelo cron imediatamente ou eu preciso de alguma forma notificar o cron sobre novo (ou possivelmente atualizado quando eu atualizar sites)?
Então, considerando todos os itens acima, como deve ser a aparência final do cron job e como eu especifico uma conta de usuário com permissões mínimas para executar meus comandos php?