Menu ▾ ▴

producao

Mobius One

Home > Colocar no ar

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.

Escolha a forma

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

Serviço do Windows (Delphi)

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).

Daemon no Linux (systemd)

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.

Liberar a porta no firewall

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.

Levar junto

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.

Saber o IP do servidor 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).

Antes de abrir para a internet

Segurança para produção, e grave os erros no evento OnServerError.

Veja também


Related

Wiki: _Sidebar
Wiki: desempenho
Wiki: guia_dependencias
Wiki: https
Wiki: recursos
Wiki: seguranca