From febc807ad9d27a9038d538f88631dee7456ef720 Mon Sep 17 00:00:00 2001 From: Bxio Date: Sat, 10 Oct 2026 18:50:15 +0100 Subject: [PATCH] Reapply "Add Gitea image publishing workflow and Portainer runner stacks" This reverts commit 282ba08c818b057c65bb06849383fb3fc855aed8. --- .gitea/workflows/container.yaml | 44 ++++++++++++++++++++++++++++++ Dockerfile | 9 ++++++- README.md | 4 ++- deploy/README.md | 48 +++++++++++++++++++++++++++++++++ deploy/bot-stack.yaml | 25 +++++++++++++++++ deploy/runner-stack.yaml | 15 +++++++++++ 6 files changed, 143 insertions(+), 2 deletions(-) create mode 100644 .gitea/workflows/container.yaml create mode 100644 deploy/README.md create mode 100644 deploy/bot-stack.yaml create mode 100644 deploy/runner-stack.yaml diff --git a/.gitea/workflows/container.yaml b/.gitea/workflows/container.yaml new file mode 100644 index 0000000..5f2e6bb --- /dev/null +++ b/.gitea/workflows/container.yaml @@ -0,0 +1,44 @@ +name: Testar e publicar imagem Docker + +on: + push: + branches: [main] + workflow_dispatch: + +jobs: + publish: + runs-on: botflow-docker + env: + IMAGE: gitea.zol.oixb.run/oixb.run/ts6-botflow + steps: + - name: Preparar ferramentas + run: apk add --no-cache git nodejs ca-certificates + + - name: Obter codigo + uses: https://github.com/actions/checkout@v4 + with: + persist-credentials: false + + - name: Testar autenticacao + run: docker build --target test -t ts6-botflow-tests:${{ gitea.sha }} . + + - name: Construir imagem + run: | + docker build --pull --target runtime \ + --label org.opencontainers.image.source=https://gitea.zol.oixb.run/oixb.run/ts6-botflow \ + --label org.opencontainers.image.revision=${{ gitea.sha }} \ + -t "$IMAGE:${{ gitea.sha }}" -t "$IMAGE:latest" . + + - name: Publicar no registry Gitea + env: + REGISTRY_USER: ${{ secrets.REGISTRY_USER }} + REGISTRY_TOKEN: ${{ secrets.REGISTRY_TOKEN }} + run: | + set -eu + test -n "$REGISTRY_USER" || { echo 'Falta o secret REGISTRY_USER'; exit 1; } + test -n "$REGISTRY_TOKEN" || { echo 'Falta o secret REGISTRY_TOKEN'; exit 1; } + export DOCKER_CONFIG="$(mktemp -d)" + trap 'rm -rf "$DOCKER_CONFIG"' EXIT + printf '%s' "$REGISTRY_TOKEN" | docker login gitea.zol.oixb.run -u "$REGISTRY_USER" --password-stdin + docker push "$IMAGE:${{ gitea.sha }}" + docker push "$IMAGE:latest" diff --git a/Dockerfile b/Dockerfile index 4513c4c..89d9a9a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,15 @@ -FROM node:22-bookworm-slim +FROM node:22-bookworm-slim AS base WORKDIR /app COPY --chown=node:node package.json server.mjs ./ COPY --chown=node:node public ./public RUN mkdir /app/data && chown node:node /app/data + +FROM base AS test +COPY --chown=node:node auth.test.mjs ./ +USER node +RUN npm test + +FROM base AS runtime USER node ENV PORT=3080 DATA_DIR=/app/data EXPOSE 3080 diff --git a/README.md b/README.md index da095fc..e2e0fea 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,9 @@ O editor de flows e o motor de bots ainda não estão implementados nesta versã ## Docker / Portainer -Usar `compose.yaml` a partir deste repositório. O serviço é construído pelo Dockerfile, porta 3080, volume persistente `botflow-data`. +Para **Web editor com imagem construida no Gitea**, seguir [deploy/README.md](deploy/README.md). O workflow `.gitea/workflows/container.yaml` testa e publica a imagem a cada push em main. As stacks prontas estao em `deploy/runner-stack.yaml` e `deploy/bot-stack.yaml`. + +Para construcao local por Docker Compose, usar `compose.yaml` a partir deste repositório. O serviço é construído pelo Dockerfile, porta 3080, volume persistente `botflow-data`. Configurar as quatro variáveis nas Environment variables da stack (ou copiar `.env.example` para `.env` quando executado por Docker Compose): diff --git a/deploy/README.md b/deploy/README.md new file mode 100644 index 0000000..c320302 --- /dev/null +++ b/deploy/README.md @@ -0,0 +1,48 @@ +# Gitea Actions → imagem Docker → Portainer Web editor + +## 1. Ativar Actions no repositorio + +No repositorio ts6-botflow, Configuracoes → Unidades (ou Avancado), ativar Actions. Nao e preciso alterar o servidor Gitea se Actions ja estiver disponivel. + +## 2. Registar o runner + +No mesmo repositorio, Configuracoes → Actions → Runners → Criar novo runner. Copiar o token de registo do **repositorio**, para limitar este runner ao ts6-botflow. + +No Portainer, criar stack `ts6-botflow-runner` no Web editor e colar `runner-stack.yaml`. Adicionar variavel `RUNNER_TOKEN` com o token de registo. Fazer deploy. O runner deve aparecer Online no Gitea com a label `botflow-docker`. + +O runner usa o socket Docker para construir as imagens. Os workflows deste repositorio podem controlar o Docker dessa maquina; manter a escrita no repositorio limitada a pessoas de confianca. O runner nao precisa de portas publicadas. Se o Docker estiver num LXC sem permissoes para Docker-in-Docker, esta configuracao usa o daemon ja existente. + +## 3. Autorizar a publicacao da imagem + +Na conta Gitea com acesso de escrita aos packages de `oixb.run`, Definicoes → Aplicacoes → Gerar token. Permissao `write:package` (inclui leitura). Nao reutilizar o segredo Discord nem o token de registo do runner. + +No repositorio, Configuracoes → Actions → Secrets, criar: + +- `REGISTRY_USER`: nome de login da conta Gitea dona do token. Se `oixb.run` for uma organizacao, usar a conta membro com permissao de escrita aos seus packages. +- `REGISTRY_TOKEN`: token pessoal criado acima. + +Os tokens ficam nas configuracoes Gitea/Portainer, nunca no Git. + +## 4. Fazer o primeiro build + +Abrir Actions → Testar e publicar imagem Docker → Run workflow, branch main. Se nao aparecer o botao, enviar um novo commit para main ou repetir a execucao que ficou pendente apos o envio do workflow. + +O workflow instala as ferramentas no job, obtem o commit, executa os testes de autenticacao numa etapa Docker Node 22 e constroi/publica a imagem. O log so deve mostrar publicacao depois de os testes passarem. Sao criadas tags `latest` e o SHA completo do commit. + +Imagem: `gitea.zol.oixb.run/oixb.run/ts6-botflow:latest`. + +## 5. Arrancar o bot no Web editor + +Esperar pelo primeiro workflow verde. Se o package for privado, adicionar em Portainer → Registries → Add registry → Custom registry o dominio `gitea.zol.oixb.run`, com uma conta/token que tenha `read:package`. Dar acesso ao ambiente Docker se o Portainer o pedir. + +Criar stack `ts6-botflow`, colar `bot-stack.yaml` e adicionar `DISCORD_CLIENT_SECRET` nas variaveis de ambiente. Fazer deploy. Abrir http://192.168.88.99:3080. + +## Atualizacoes + +Cada push em main testa, constroi e publica uma imagem. A stack Web editor nao e atualizada apenas pelo push: no Portainer fazer Update the stack com a opcao de voltar a descarregar a imagem e recriar o container. `pull_policy: always` pede o download em cada deploy. Restart sozinho nao descarrega uma imagem nova. + +A automatizacao de deployment pode ser adicionada depois com webhook Portainer, se essa funcao estiver disponivel na edicao instalada. Esta versao automatiza o build e a publicacao, nao o deployment. O volume preserva os dados quando o container e recriado. + +## Validacao + +As stacks e o workflow sao verificados localmente. O build real e o login no registry so podem ser confirmados depois de registar o runner e configurar os secrets. As imagens Docker nao sao publicadas apenas por enviar este ficheiro. diff --git a/deploy/bot-stack.yaml b/deploy/bot-stack.yaml new file mode 100644 index 0000000..b94c5d1 --- /dev/null +++ b/deploy/bot-stack.yaml @@ -0,0 +1,25 @@ +services: + ts6-botflow: + image: gitea.zol.oixb.run/oixb.run/ts6-botflow:latest + pull_policy: always + container_name: ts6-botflow + ports: + - "3080:3080" + environment: + NODE_ENV: production + PORT: "3080" + DATA_DIR: /app/data + APP_URL: http://192.168.88.99:3080 + DISCORD_CLIENT_ID: "477999574804594708" + DISCORD_CLIENT_SECRET: ${DISCORD_CLIENT_SECRET:?Define DISCORD_CLIENT_SECRET} + OWNER_DISCORD_ID: "376768118535749633" + volumes: + - ts6_botflow_data:/app/data + restart: unless-stopped + healthcheck: + test: ["CMD", "node", "-e", "fetch('http://localhost:3080/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"] + interval: 30s + timeout: 5s + retries: 3 +volumes: + ts6_botflow_data: diff --git a/deploy/runner-stack.yaml b/deploy/runner-stack.yaml new file mode 100644 index 0000000..a1bb386 --- /dev/null +++ b/deploy/runner-stack.yaml @@ -0,0 +1,15 @@ +services: + gitea-runner: + image: gitea/runner:3 + container_name: ts6-botflow-runner + environment: + GITEA_INSTANCE_URL: https://gitea.zol.oixb.run + GITEA_RUNNER_REGISTRATION_TOKEN: ${RUNNER_TOKEN:?Define RUNNER_TOKEN do repositorio} + GITEA_RUNNER_NAME: ts6-botflow-runner + GITEA_RUNNER_LABELS: botflow-docker:docker://docker:27-cli + volumes: + - runner-data:/data + - /var/run/docker.sock:/var/run/docker.sock + restart: unless-stopped +volumes: + runner-data: