diff --git a/.gitea/workflows/container.yaml b/.gitea/workflows/container.yaml deleted file mode 100644 index 5f2e6bb..0000000 --- a/.gitea/workflows/container.yaml +++ /dev/null @@ -1,44 +0,0 @@ -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 89d9a9a..4513c4c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,15 +1,8 @@ -FROM node:22-bookworm-slim AS base +FROM node:22-bookworm-slim 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 e2e0fea..da095fc 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,7 @@ O editor de flows e o motor de bots ainda não estão implementados nesta versã ## Docker / Portainer -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`. +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 deleted file mode 100644 index c320302..0000000 --- a/deploy/README.md +++ /dev/null @@ -1,48 +0,0 @@ -# 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 deleted file mode 100644 index b94c5d1..0000000 --- a/deploy/bot-stack.yaml +++ /dev/null @@ -1,25 +0,0 @@ -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 deleted file mode 100644 index a1bb386..0000000 --- a/deploy/runner-stack.yaml +++ /dev/null @@ -1,15 +0,0 @@ -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: