powershell -ExecutionPolicy Bypass -File C:\laragon\www\oxini\zipar_para_vps.ps1
database/database.sqlite)
e o logo da empresa (storage/app/public/logos/).
A pasta vendor/ é excluída (será reinstalada via Composer na VPS).
O arquivo gerado será: C:\laragon\www\oxini_vps.zip
| Componente | Versão | Observação | Status |
|---|---|---|---|
| Ubuntu Server | 22.04 ou 24.04 LTS | Debian 12 também funciona | Já na VPS |
| PHP | 8.2 ou 8.3 | + extensões necessárias | Instalar |
| Nginx | Qualquer versão atual | Servidor web | Instalar |
| Composer | 2.x | Gerenciador de pacotes PHP | Instalar |
| unzip | — | Para extrair o ZIP enviado | Instalar |
| Acesso SSH | — | root ou usuário com sudo | Necessário |
# Atualizar os pacotes do sistema sudo apt update && sudo apt upgrade -y # Adicionar o repositório do PHP (Ondřej) sudo apt install -y software-properties-common sudo add-apt-repository ppa:ondrej/php -y sudo apt update # Instalar PHP 8.2 com todas as extensões necessárias sudo apt install -y php8.2-fpm php8.2-cli php8.2-sqlite3 \ php8.2-mbstring php8.2-xml php8.2-curl php8.2-zip \ php8.2-bcmath php8.2-gd php8.2-intl php8.2-tokenizer \ php8.2-dom php8.2-fileinfo unzip nginx # Confirmar a instalação php8.2 --version
# Baixar e instalar o Composer globalmente curl -sS https://getcomposer.org/installer | php8.2 sudo mv composer.phar /usr/local/bin/composer sudo chmod +x /usr/local/bin/composer # Verificar a instalação composer --version # Deve exibir: Composer version 2.x.x
No seu computador Windows, use um cliente SFTP (como WinSCP ou FileZilla) ou o comando abaixo no PowerShell para enviar o ZIP:
# No Windows — enviar o ZIP via SCP (substitua pelo IP e usuário da sua VPS) scp C:\laragon\www\oxini_vps.zip usuario@IP_DA_VPS:/var/www/
De volta ao terminal SSH da VPS:
# Ir para o diretório de sites cd /var/www # Extrair o ZIP sudo unzip oxini_vps.zip # A pasta extraída se chama 'oxini' — confirme: ls /var/www/oxini # Ajustar o dono dos arquivos para o Nginx/PHP-FPM sudo chown -R www-data:www-data /var/www/oxini # Permissões corretas para storage e bootstrap/cache sudo chmod -R 775 /var/www/oxini/storage sudo chmod -R 775 /var/www/oxini/bootstrap/cache # Permissão de escrita no banco SQLite (muito importante!) sudo chmod 664 /var/www/oxini/database/database.sqlite
# Criar o .env a partir do exemplo cd /var/www/oxini sudo cp .env.example .env sudo nano .env
Edite as seguintes linhas no .env:
APP_NAME="Oxinil Acabamentos" APP_ENV=production APP_KEY= ← deixe vazio, será gerada no próximo passo APP_DEBUG=false APP_URL=https://seudominio.com.br ← coloque o domínio ou IP da VPS APP_LOCALE=pt_BR APP_FALLBACK_LOCALE=pt_BR DB_CONNECTION=sqlite # As linhas DB_HOST, DB_PORT etc. podem ficar comentadas (não são usadas) SESSION_DRIVER=database CACHE_STORE=database QUEUE_CONNECTION=database LOG_CHANNEL=stack LOG_LEVEL=error
Salvar no nano: Ctrl+O → Enter → Ctrl+X
cd /var/www/oxini # Instalar as dependências PHP (sem pacotes de desenvolvimento) composer install --optimize-autoloader --no-dev # Gerar a chave de segurança da aplicação php artisan key:generate # Criar o link simbólico de storage (para logos e arquivos) php artisan storage:link # Rodar migrations pendentes (não apaga dados existentes) php artisan migrate --force # Limpar e recriar os caches de configuração para produção php artisan config:cache php artisan route:cache php artisan view:cache # Garantir permissões corretas após o composer install sudo chown -R www-data:www-data /var/www/oxini/storage /var/www/oxini/bootstrap/cache
php artisan migrate --force aplica apenas as migrations que ainda não foram executadas no banco de dados. Como o arquivo database.sqlite veio do seu ambiente local com todas as migrations já aplicadas, nenhum dado é apagado ou alterado.
# Criar o arquivo de configuração do site sudo nano /etc/nginx/sites-available/oxini
Cole o conteúdo abaixo (ajuste seudominio.com.br):
server { listen 80; server_name seudominio.com.br www.seudominio.com.br; root /var/www/oxini/public; index index.php index.html; charset utf-8; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php8.2-fpm.sock; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; include fastcgi_params; } location ~ /\.(?!well-known).* { deny all; } client_max_body_size 20M; access_log /var/log/nginx/oxini_access.log; error_log /var/log/nginx/oxini_error.log; }
# Ativar o site e remover o site padrão sudo ln -s /etc/nginx/sites-available/oxini /etc/nginx/sites-enabled/ sudo rm -f /etc/nginx/sites-enabled/default # Testar a configuração sudo nginx -t # Deve exibir: syntax is ok / test is successful # Reiniciar o Nginx e o PHP-FPM sudo systemctl restart nginx sudo systemctl restart php8.2-fpm # Garantir que iniciam automaticamente com o servidor sudo systemctl enable nginx sudo systemctl enable php8.2-fpm
# Instalar o Certbot sudo apt install -y certbot python3-certbot-nginx # Emitir o certificado (substitua pelo seu domínio) sudo certbot --nginx -d seudominio.com.br -d www.seudominio.com.br # O Certbot modifica o Nginx automaticamente para HTTPS # Renovação automática já fica ativa (via systemd timer) # Teste com: sudo certbot renew --dry-run
Após o SSL, atualize no .env para: APP_URL=https://seudominio.com.br e reexecute php artisan config:cache.
php artisan storage:linksudo tail -50 /var/log/nginx/oxini_error.log e sudo tail -50 /var/www/oxini/storage/logs/laravel.log para ver a causa do erro.
Os problemas mais comuns são: permissão errada no storage/ ou database.sqlite, ou APP_KEY não gerada.
| # | Ação | Resultado Esperado | OK? |
|---|---|---|---|
| 1 | ZIP gerado no Windows com o script | Arquivo oxini_vps.zip criado | ☐ |
| 2 | PHP 8.2 + extensões instalados na VPS | php8.2 --version retorna versão | ☐ |
| 3 | Extensão php8.2-sqlite3 instalada | php8.2 -m | grep sqlite retorna sqlite3 | ☐ |
| 4 | Composer instalado | composer --version funciona | ☐ |
| 5 | ZIP extraído em /var/www/oxini | Pasta com arquivos do projeto | ☐ |
| 6 | Permissões ajustadas (www-data) | chown e chmod executados | ☐ |
| 7 | Arquivo .env configurado | APP_ENV=production, APP_DEBUG=false | ☐ |
| 8 | composer install executado | Pasta vendor/ criada | ☐ |
| 9 | php artisan key:generate | APP_KEY preenchida no .env | ☐ |
| 10 | php artisan storage:link | Link criado em public/storage | ☐ |
| 11 | php artisan migrate --force | Nenhum erro retornado | ☐ |
| 12 | Nginx configurado e reiniciado | nginx -t retorna ok | ☐ |
| 13 | SSL configurado (Certbot) | Site abre com https:// | ☐ |
| 14 | Login com credenciais existentes | Dashboard carrega normalmente | ☐ |
| 15 | OS e Clientes presentes no sistema | Dados migrados confirmados | ☐ |
| 16 | Logo da empresa aparece nos PDFs | PDF gerado com logo correto | ☐ |
/var/www/oxini/database/database.sqlite.
Backup rápido do banco de dados (salva uma cópia datada):
cp /var/www/oxini/database/database.sqlite \
/var/www/oxini/database/database_backup_$(date +%Y%m%d_%H%M).sqlite