Como instalar o TicketZ no painel ICP

Este tutorial mostra como subir o TicketZ usando contêineres Docker de forma simples e organizada, ideal para iniciantes, para isso iremos usar o Painel ICP da Integrator Host.
Neste tutorial, você verá:
✔️ Criar o docker compose
✔️ Instalar o PostgreSQL
✔️ Instalar o Redis
✔️ Configurar um domínio com SSL para acessar o TicketZ (https://example.com).
✔️ Acesse o Administrador do TicketZ
📌 Passo 1: Vamos instalar o postgreSQL via painel ICP


📌 Passo 2: Vamos instalar o Redis


Agora que temos configurado os bancos de dados PostgreSQL e Redis, vamos criar o nosso banco para usar o TicketZ
📌 Passo 3: Criar o banco de dados PostgreSQL

Pronto temos o nosso banco PostgreSQL criado

Ao clicar em Informações de Conexão temos o Host, Porta, Usuário e Senha

📌 Passo 4: Agora vamos instalar algumas extensões em nosso postgreSQL necessário para rodar os migrations do Ticketz
Acesse o terminal SSH usando o painel ICP

Altere os dados de usuário, senha e host de acordo com o que foi criado no passo anterior.
# 0) Conferir search_path atual (só informativo)
docker exec -it ic-postgresql-HZe8 psql -U user_KiRSZ2 -d ticketz -c 'SHOW search_path;'
# 1) Extensões no schema public (idempotente)
docker exec -i ic-postgresql-HZe8 psql -U user_KiRSZ2 -d ticketz <<'SQL'
CREATE EXTENSION IF NOT EXISTS unaccent WITH SCHEMA public;
CREATE EXTENSION IF NOT EXISTS pg_trgm WITH SCHEMA public;
CREATE EXTENSION IF NOT EXISTS citext WITH SCHEMA public;
CREATE EXTENSION IF NOT EXISTS pgcrypto WITH SCHEMA public;
SQL
# 2) Função IMUTÁVEL (para índices), no public (idempotente)
docker exec -i ic-postgresql-HZe8 psql -U user_KiRSZ2 -d ticketz <<'SQL'
CREATE OR REPLACE FUNCTION public.immutable_unaccent(text)
RETURNS text
LANGUAGE sql
IMMUTABLE
PARALLEL SAFE
AS $$
SELECT public.unaccent('public.unaccent'::regdictionary, $1)
$$;
SQL
# 3) Garantir schema do usuário e search_path (criação vai para public; "$user" como fallback)
docker exec -i ic-postgresql-HZe8 psql -U user_KiRSZ2 -d ticketz <<'SQL'
CREATE SCHEMA IF NOT EXISTS "ticketz" AUTHORIZATION ticketz;
ALTER ROLE ticketz IN DATABASE ticketz SET search_path = public, "$user";
GRANT USAGE, CREATE ON SCHEMA public TO ticketz;
GRANT USAGE, CREATE ON SCHEMA "ticketz" TO ticketz;
SQL
# 4) Wrappers em pg_catalog (cliente pode chamar unaccent() sem schema)
docker exec -i ic-postgresql-HZe8 psql -U user_KiRSZ2 -d ticketz <<'SQL'
CREATE OR REPLACE FUNCTION pg_catalog.unaccent(text)
RETURNS text
LANGUAGE sql
STABLE
AS $$
SELECT public.unaccent('public.unaccent'::regdictionary, $1)
$$;
CREATE OR REPLACE FUNCTION pg_catalog.unaccent(regdictionary, text)
RETURNS text
LANGUAGE sql
STABLE
AS $$
SELECT public.unaccent($1, $2)
$$;
SQL
# 5) Sanity checks
docker exec -it ic-postgresql-HZe8 psql -U ticketz -d ticketz -c 'SHOW search_path;'
docker exec -it ic-postgresql-HZe8 psql -U user_KiRSZ2 -d ticketz -c '\dx'
docker exec -it ic-postgresql-HZe8 psql -U ticketz -d ticketz -c "SELECT unaccent('coração') AS sem_schema, public.unaccent('coração') AS qualificado, public.immutable_unaccent('coração') AS imutavel;"
📌 Passo 5: Enviar o Docker Compose personalizado para executar no ICP usando o Gerenciador de Arquivos:
ATENÇÃO: Usar a pasta /home para criar seus projetos
1) Crie duas pastas com os nome: private e public
2) Crie um arquivo chamado docker-compose.yml
3) Crie um arquivo em BRANCO chamado disable-mime.conf
Ficando como na imagem abaixo:

Ajuste o docker-compose alterando o seu domínio, e-mail, usuário e senha do PostgreSQL e Redis
services:
ticketz_backend:
image: ghcr.io/ticketz-oss/ticketz-backend:latest
ports:
- "3001:3000" # host:3001 -> container:3000
volumes:
- /home/ticketz-v2/public:/usr/src/app/public
- /home/ticketz-v2/private:/usr/src/app/private
environment:
- TZ=America/Sao_Paulo
- NODE_ENV=production
- PORT=3000
- JWT_SECRET=9l7LhX9Jk4oJ3vAz1yTbK8gWn2sQ4fUv9p3jX0c5mNl2rTs5dG8aH1eF6qV7yWz
# CORS / URLs externas
- FRONTEND_URL=https://ticketz.vps000.panel-icp.integrator.com.br
- BACKEND_URL=https://ticketzback.vps000.panel-icp.integrator.com.br
# Banco / Redis
- DB_DIALECT=postgres
- DB_HOST=ic-postgresql-KYte
- DB_PORT=5432
- DB_USER=ticketz
- DB_NAME=ticketz
- DB_PASS=SENHAdoPOST
- REDIS_URI=redis://:SENHA_REDIS@HOST:6379
- VERIFY_TOKEN=ticketz
networks:
icontainer-network:
aliases:
- backend
healthcheck:
test: ["CMD-SHELL", "wget -qO- http://localhost:3000/ || exit 1"]
interval: 20s
timeout: 5s
retries: 5
restart: unless-stopped
ticketz_frontend:
image: ghcr.io/ticketz-oss/ticketz-frontend:latest
depends_on:
- ticketz_backend
ports:
- "3000:80"
volumes:
- /home/ticketz-v2/public:/var/www/backend-public
- /home/ticketz-v2/disable-mime.conf:/etc/nginx/conf.d/mimetypes.conf:ro
environment:
- FRONTEND_HOST=ticketz.vps000.panel-icp.integrator.com.br
# >>> frontend chamará o back pelo domínio HTTPS dedicado
- BACKEND_PROTOCOL=https
- BACKEND_HOST=ticketzback.vps000.panel-icp.integrator.com.br
- BACKEND_PORT=443
- EMAIL_ADDRESS=admin@ticketz.host
networks:
- icontainer-network
healthcheck:
test: ["CMD-SHELL", "wget -qO- http://localhost/ || exit 1"]
interval: 20s
timeout: 5s
retries: 5
restart: unless-stopped
networks:
icontainer-network:
external: true
name: icontainer-network
📌 Passo 6: Subir o Docker Compose através do ICP:

Ao finalizar o processo teremos dois container criados o de Backend e de Frontend

📌 Passo 7: Vamos agora criar o nosso domínio para acesso do TICKETZ com SSL
Vamos criar o domínio para acessar o FRONTEND que roda na porta 3000

Vamos criar o domínio para acessar o BACKEND que roda na porta 3001

Adicione o SSL nos dois domínios criados


📌 Passo 8: Após subir o docker acesse o TICKETZ
Usuário: admin@ticketz.host
Senha: 123456

📌 Passo 9: Como atualizar para uma nova versão?
Acesse o seu Container como mostra na imagem abaixo, e clique em atualizar.
Com isso baixa a ultima versão do Ticketz, fazer o mesmo para Frontend e Backend


Se tiver duvidas pode contar com o nosso suporte via WHATAPP

Até a próxima =)