Counter-Strike 1.6: engenharia, modding e deploy de um servidor clássico em produção
Jadiael Juvino
5 de julho de 2026
14 min de leitura
Counter-Strike 1.6
Docker
Docker Compose
Linux
Sysadmin
AMX Mod X
Pawn
ReHLDS
ReGameDLL
ReAPI
Metamod
PsychoStats
MariaDB
Nginx
Game Server
Do estudo das possibilidades ao deploy real: como transformei um servidor de Counter-Strike 1.6 em um projeto completo de infraestrutura, Docker, Linux, AMX Mod X, Pawn, ReHLDS, automação, plugins próprios e estatísticas web em produção.
Counter-Strike 1.6: engenharia, modding e deploy de um servidor clássico em produção
Este projeto nasceu de uma pergunta simples: até onde dá para levar um servidor de Counter-Strike 1.6 quando ele é tratado como um produto de software real?
A resposta virou um laboratório completo de engenharia: infraestrutura em Linux, imagem Docker reproduzível, configuração por ambiente, deploy em produção, programação de plugins, integração com banco de dados, página web de estatísticas, FastDL, automação operacional e ajustes finos de gameplay.
Antes de sair instalando ferramentas, eu fiz uma investigação técnica para entender quais caminhos existiam:
- servidor HLDS tradicional;
- stack modernizada com ReHLDS e ReGameDLL;
- Metamod como camada de plugins nativos;
- AMX Mod X como plataforma de plugins;
- ReAPI para acessar recursos avançados da stack ReHLDS;
- Reunion para compatibilidade do ecossistema do servidor;
- PsychoStats para transformar logs de partida em estatísticas web;
- Docker e Docker Compose para deixar o ambiente reproduzível.
- Servidor CS 1.6:
187.77.246.75:27015 - Estatísticas web: http://187.77.246.75
Para quem está com pressa
Este projeto demonstra, de forma prática, competências que vão além de simplesmente subir um jogo antigo em uma VPS.
Em um único ambiente eu trabalhei com:
- Docker para empacotar o servidor de forma reproduzível;
- Docker Compose para orquestrar build, portas, variáveis e política de restart;
- .env para separar configuração sensível e configuração de ambiente;
- Linux sysadmin para preparar dependências, permissões, serviços e processos;
- SteamCMD para baixar e validar o HLDS com Counter-Strike 1.6;
- Metamod e AMX Mod X para carregar e organizar plugins;
- Pawn para desenvolver e modificar plugins
.sma; - ReHLDS, ReGameDLL e ReAPI para uma base mais moderna, configurável e extensível;
- MariaDB, PHP, Perl e Nginx para disponibilizar PsychoStats na web;
- FastDL para entrega eficiente de assets personalizados;
- automação de build e deploy para reduzir trabalho manual e evitar inconsistências.
1) Pesquisa antes da implementação
O primeiro desafio não foi técnico, foi estratégico.
Counter-Strike 1.6 tem um ecossistema antigo, com muita informação espalhada em fóruns, repositórios, arquivos de configuração e plugins legados. Então a primeira etapa foi entender quais peças ainda faziam sentido em um servidor moderno.
Eu investiguei:
- como instalar o HLDS de forma limpa;
- quais binários seriam usados no Linux;
- como substituir a base tradicional por ReHLDS e ReGameDLL;
- como manter compatibilidade com Metamod, AMX Mod X e ReAPI;
- como compilar plugins
.smadentro do próprio ambiente; - como lidar com bots, mapas, modelos, sons e arquivos adicionais;
- como publicar estatísticas do servidor em uma página web;
- como preparar um deploy que pudesse ser reproduzido depois sem depender de memória manual.
2) Docker como base reproduzível
A imagem Docker concentra a montagem do servidor.
Ela parte de
ubuntu:22.04 e prepara um ambiente Linux com suporte a bibliotecas de 32 bits, dependências de rede, ferramentas de build, PHP, MariaDB, Perl, Nginx e utilitários necessários para o servidor e para a camada web.A escolha por Docker foi intencional:
- o servidor pode ser reconstruído do zero;
- as dependências ficam documentadas no próprio
Dockerfile; - a instalação deixa de depender de passos manuais soltos;
- os binários usados ficam explícitos;
- os plugins são copiados, compilados e ativados durante a build;
- a configuração base fica versionável e auditável.
3) Docker Compose e configuração por ambiente
O
compose.yml organiza a execução do container, define portas expostas, política de restart, argumentos de build e variáveis de ambiente.Algumas decisões importantes:
- porta
27015exposta em UDP e TCP para o servidor; - portas auxiliares para comunicação do servidor, FastDL e painel web;
restart: alwayspara manter o serviço disponível após falhas ou reinício da máquina;- uso de variáveis para nome do servidor, mapa inicial, máximo de jogadores, porta, senha RCON e configurações do PsychoStats;
.env entra como camada de parametrização. Assim, o mesmo projeto pode ser adaptado para outro ambiente sem reescrever o Dockerfile.Essa separação é uma prática importante de engenharia: código e configuração caminham juntos, mas não devem ser a mesma coisa.
4) SteamCMD e HLDS
A instalação do Counter-Strike 1.6 é feita com SteamCMD usando login anônimo e atualização do app do HLDS.
Durante a build, o processo valida arquivos essenciais como:
hlds_run;hlds_linux;engine_i486.so;- diretório
cstrike.
Também configurei bibliotecas compartilhadas da Steam em
~/.steam/sdk32, um detalhe necessário em muitos ambientes Linux para evitar erro de runtime ao iniciar servidores baseados em HLDS.5) Metamod, AMX Mod X e Pawn
A camada de modding foi montada com Metamod e AMX Mod X.
O Metamod funciona como uma ponte entre o motor do HLDS e extensões carregadas no servidor. O AMX Mod X entra como plataforma de plugins, permitindo criar regras, comandos, menus, automações e recursos de gameplay.
A parte de programação acontece em Pawn, por meio dos arquivos
.sma, que são compilados para .amxx usando o amxxpc.Esse ponto foi um dos mais interessantes do projeto porque mistura engenharia de software com entendimento do ciclo de vida do jogo:
- eventos de rodada;
- spawn de jogadores;
- menus em jogo;
- comandos de chat;
- permissões administrativas;
- times T e CT;
- armas e equipamentos;
- bots;
- placar, frags, morte, revive e votação.
6) ReHLDS, ReGameDLL e ReAPI
A stack foi modernizada com ReHLDS, ReGameDLL e ReAPI.
Essa escolha abriu espaço para configurações e integrações mais avançadas do que uma instalação tradicional.
No Dockerfile, o processo baixa versões específicas dos binários, copia os arquivos corretos para o HLDS e substitui a GameDLL do Counter-Strike pelo
cs.so do ReGameDLL.Depois disso, o
game.cfg é ajustado para o comportamento desejado do servidor:- sem balanceamento automático forçado;
- bots entrando mesmo sem jogador humano;
- delay controlado para entrada de bots;
- tempo de compra sem limite;
- limite de times removido;
- prefixo personalizado para bots;
- preferência de entrada dos bots no time CT.
7) Plugins: entre reaproveitamento, adaptação e desenvolvimento próprio
O servidor mistura três tipos de plugins:
- plugins públicos baixados e adaptados;
- plugins legados reaproveitados com ajustes;
- plugins desenvolvidos do zero para necessidades específicas do Jat-Strike.
- menu de armas;
- skins personalizadas para armas e jogadores;
- sistema de VIP;
- kit de desarme entregue apenas no fluxo correto;
- contador visual de frags;
- mensagens e HUDs administrativos;
- sons personalizados;
- paraquedas;
- reset de score;
- assistência de kill;
- votação para reiniciar round;
- votação para remover bots;
- votação para repor bots;
- reposição automática de bots quando o servidor esvazia;
- troca automática de times a cada 15 rounds;
- revive de companheiros;
- ajuste de tempo de cadáver;
- correções para evitar jogador travado ou bugado.
Uma das decisões mais importantes foi separar o que era configuração do que era código. Quando uma regra podia ser resolvida por
.cfg ou .ini, ela ficava fora do plugin. Quando precisava reagir a eventos do jogo, virava lógica em Pawn.8) Bots, gameplay e experiência do jogador
Um servidor vazio não convida ninguém a jogar. Por isso, os bots foram tratados como parte da experiência do produto.
Foram ajustados pontos como:
- quantidade máxima de bots;
- time preferencial dos bots;
- entrada automática ao iniciar o servidor;
- reposição quando o servidor fica vazio;
- remoção via votação;
- retorno via votação;
- dificuldade e perfis de bots;
- nomes personalizados;
- comportamento para evitar desequilíbrio entre times.
A solução foi tratar bots como parte da regra de negócio do servidor, não apenas como uma configuração solta.
9) Assets, FastDL e personalização visual
O servidor também ganhou uma camada visual própria.
Foram configurados:
- modelos de armas;
- modelos de jogadores;
- sons customizados;
- imagem de MOTD;
- arquivos de mapas;
- proteção para não servir arquivos sensíveis no FastDL.
Também houve cuidado com segurança operacional: nem tudo que está no servidor deve estar disponível para download público. Por isso, configs, scripts, plugins compilados e bibliotecas foram bloqueados na camada web do FastDL.
10) PsychoStats: estatísticas web em produção
Além do servidor de jogo, o projeto inclui uma página web de estatísticas em produção.
O PsychoStats foi integrado com:
- Nginx;
- PHP 7.4;
- MariaDB;
- scripts Perl;
- logs do HLDS;
- rotina automática de atualização.
Essa parte transforma o projeto em algo mais completo: não é apenas um servidor rodando, é um ambiente com observabilidade, ranking, histórico e presença web.
Página pública:
http://187.77.246.75
11) Sysadmin e produção
Colocar o servidor em produção exigiu decisões típicas de administração de sistemas:
- abertura correta de portas UDP e TCP;
- organização de serviços dentro do container;
- inicialização de MariaDB, PHP-FPM, Nginx, SSHD e HLDS;
- permissões entre usuário
steamewww-data; - isolamento de arquivos sensíveis;
- política de restart;
- logs persistentes o suficiente para estatísticas;
- scripts auxiliares para update do PsychoStats;
- análise de latência e rotas de rede;
- testes em Windows e Linux durante a evolução do projeto.
Esse tipo de trabalho é onde desenvolvimento e operação se encontram. O código precisa funcionar, mas o processo também precisa sobreviver ao mundo real.
12) O que esse projeto mostra sobre minha forma de trabalhar
Para recrutadores e leitores técnicos, este projeto mostra uma combinação que considero essencial:
- eu investigo antes de implementar;
- documento decisões no próprio ambiente;
- automatizo o que pode ser repetido;
- separo configuração de código;
- valido arquivos críticos durante a build;
- adapto código legado sem quebrar comportamento existente;
- desenvolvo plugins sob medida quando a solução pronta não atende;
- penso em UX mesmo em um servidor de jogo;
- levo projetos pessoais até produção real.
Ele foi empacotado, configurado, publicado, testado e disponibilizado para jogadores.
13) Principais aprendizados
Esse projeto reforçou alguns aprendizados importantes:
- sistemas antigos continuam ensinando fundamentos modernos;
- infraestrutura reproduzível reduz risco operacional;
- automação economiza tempo e evita erro humano;
- plugins pequenos podem ter grande impacto na experiência final;
- logs e estatísticas aumentam o valor do produto;
- modding é uma excelente escola de engenharia reversa leve, eventos, estado e compatibilidade;
- um bom projeto pessoal pode demonstrar habilidades reais de mercado.
No fim, o Jat-Strike virou mais do que um servidor de nostalgia. Virou uma vitrine prática de Docker, Linux, redes, backend, automação, banco de dados, modding e pensamento de produto.
J
Jadiael Juvino
Engenheiro de Software especializado em desenvolvimento backend e frontend, com experiência em C#, JavaScript, NestJS, PHP e bancos de dados. Apaixonado por compartilhar conhecimento e criar soluções inovadoras.