Home > Colocar no ar
Delphi e Lazarus · Nível: intermediário
Em uma frase: como deixar o servidor rodando sozinho numa máquina (Windows ou
Linux) e acessível pela rede.
| Forma | Quando | Como |
|---|---|---|
| Programa com janela | testes, máquina de balcão | o de sempre; fecha quando alguém fecha |
| Serviço do Windows | servidor Windows, sobe com a máquina | abaixo |
| Daemon no Linux (systemd) | servidor Linux | abaixo |
| CGI | hospedagem que só aceita CGI (IIS, Apache, nginx) | assistente do RAL, opção CGI (Primeiro servidor) |
| Atrás do nginx | domínio público, HTTPS do Let's Encrypt, vários serviços na mesma porta | HTTPS na frente, com nginx |
File > New > Other > Delphi > Windows > Service Application. No serviço:
procedure TService1.ServiceStart(Sender: TService; var Started: Boolean);
begin
FServidor := TRALIndyServer.Create(nil);
FServidor.CreateRoute('ping', Ping); // Ping: um método do TService1
FServidor.Port := 8000;
FServidor.Active := True;
Started := True;
end;
procedure TService1.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
FServidor.Active := False;
FreeAndNil(FServidor);
Stopped := True;
end;
Instalar e iniciar (Prompt como administrador):
MeuServico.exe /install
sc start Service1
No Lazarus, o equivalente é o pacote LazDaemon (Project > New Project >
Daemon (service) application).
O programa console não pode terminar com ReadLn: sob o systemd não há teclado,
o ReadLn volta na hora e o servidor fecha. Troque o fim do programa por:
Servidor.Start;
while True do
Sleep(1000); // fica no ar até o systemd mandar parar
E crie /etc/systemd/system/meuservidor.service:
[Unit]
Description=Meu servidor RAL
After=network.target
[Service]
ExecStart=/opt/meuservidor/meuservidor
WorkingDirectory=/opt/meuservidor
Restart=always
User=meuservidor
[Install]
WantedBy=multi-user.target
:::bash
sudo systemctl enable --now meuservidor
sudo systemctl status meuservidor
No Lazarus/FPC para Linux, uses com cthreads em primeiro lugar (ver
Primeiro servidor), senão o programa para com
Runtime error 232 (sem suporte a threads) ao ligar o servidor.
Portas abaixo de 1024 (80, 443) precisam de root: prefira 8000 e um nginx na
frente.
netsh advfirewall firewall add rule name="Meu servidor RAL" dir=in action=allow protocol=TCP localport=8000
:::bash
sudo ufw allow 8000/tcp
QUIC (MsQuic) usa UDP: libere protocol=UDP / 8100/udp.
Ao lado do executável, conforme o que usa: DLLs do OpenSSL (HTTPS no Indy/fpHTTP),
libsagui, msquic.dll, brotli/zstd, o cliente do banco (fbclient.dll,
libpq.dll...). Lista em Como instalar as dependências.
1.2 🚧WriteLn('No ar em http://', Servidor.GetServerAddress, ':', Servidor.Port);
GetServerAddress(rimIPv6) dá o IPv6. Funciona com o servidor parado e em todos os
motores (no CGI, o endereço do servidor da frente).
Segurança para produção, e grave os erros no evento OnServerError.
Wiki: _Sidebar
Wiki: desempenho
Wiki: guia_dependencias
Wiki: https
Wiki: recursos
Wiki: seguranca