@wenathlan/saddle 1.8.2 → 1.8.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -9
- package/browser/playwright.js +22 -0
- package/docs/.gitkeep +0 -0
- package/docs/gapmatrix.md +3 -3
- package/docs/libraryapi.md +1 -0
- package/docs/logs/.gitkeep +0 -0
- package/docs/packageaudit185.md +23 -0
- package/docs/plans/00.index.md +50 -0
- package/docs/plans/01.architecture.md +86 -0
- package/docs/plans/02.research.computer.use.md +58 -0
- package/docs/plans/03.research.captcha.bypass.md +68 -0
- package/docs/plans/04.research.sandbox.ai.md +52 -0
- package/docs/plans/05.capture.platform.md +57 -0
- package/docs/plans/06.dependencies.md +97 -0
- package/docs/plans/07.captcha.test.page.md +41 -0
- package/docs/plans/08.production.infra.md +70 -0
- package/docs/plans/09.database.schema.md +121 -0
- package/docs/plans/10.cloudinary.storage.md +57 -0
- package/docs/plans/11.movement.logs.json.md +72 -0
- package/docs/plans/12.research.atlas.agent.browser.md +79 -0
- package/docs/plans/13.research.anti.detection.md +898 -0
- package/docs/plans/14.research.proxy.md +1495 -0
- package/docs/plans/15.research.retry.rate.limit.md +1958 -0
- package/docs/plans/16.research.crawling.md +1417 -0
- package/docs/plans/17.research.caching.md +1610 -0
- package/docs/plans/18.research.content.extraction.md +1952 -0
- package/docs/plans/19.research.errors.events.md +1523 -0
- package/docs/plans/20.research.zod.validation.md +1350 -0
- package/docs/plans/21.research.batch.concurrency.md +1888 -0
- package/docs/plans/22.research.universal.runtime.md +944 -0
- package/docs/plans/23.research.ai.integration.md +1465 -0
- package/docs/plans/24.research.memory.persistence.md +1979 -0
- package/docs/plans/25.research.server.api.md +342 -0
- package/docs/plans/26.research.compilation.md +249 -0
- package/docs/plans/27.research.html.parsing.md +251 -0
- package/docs/plans/28.action.plan.md +50 -0
- package/docs/plans/29.api.reference.md +174 -0
- package/docs/plans/30.architecture.plan.md +94 -0
- package/docs/plans/31.auditoria.dados.md +163 -0
- package/docs/plans/32.bots.automacao.computacional.md +214 -0
- package/docs/plans/33.bots.codigo.revisao.md +220 -0
- package/docs/plans/34.bots.seguranca.cicd.md +366 -0
- package/docs/plans/35.comparativo.concorrencia.md +464 -0
- package/docs/plans/36.computational.memory.md +340 -0
- package/docs/plans/37.deploystrategy.md +394 -0
- package/docs/plans/38.flow.md +155 -0
- package/docs/plans/39.multi.platform.bot.md +252 -0
- package/docs/plans/40.npm.publish.md +250 -0
- package/docs/plans/41.o.que.falta.md +407 -0
- package/docs/plans/42.pesquisa.concorrencia.md +721 -0
- package/docs/plans/43.plan.universal.architecture.md +496 -0
- package/docs/plans/44.reference.md +100 -0
- package/docs/plans/45.robotarchitecture.md +237 -0
- package/docs/plans/46.scdnintegration.md +284 -0
- package/docs/plans/47.multiforge.readme.md +129 -0
- package/docs/plans/48.theory.v4.repo.os.md +152 -0
- package/docs/plans/49.third.party.infra.md +12 -0
- package/docs/plans/50.file.as.compute.md +39 -0
- package/docs/plans/51.architecture.virtual.processor.md +80 -0
- package/docs/plans/52.manifesto.v8.md +11 -0
- package/docs/plans/58.cdn.list.md +23 -0
- package/docs/plans/59.sql.frameworks.md +33 -0
- package/docs/plans/60.sql.thirdparty.md +26 -0
- package/docs/plans/61.objective.multiforge.md +63 -0
- package/docs/plans/62.huggingface.upload.md +26 -0
- package/docs/plans/63.kaggle.upload.md +24 -0
- package/docs/plans/64.npm.storage.md +30 -0
- package/docs/plans/65.rclone.terabox.md +32 -0
- package/docs/plans/66.buckets.and.models.todo.md +14 -0
- package/docs/plans/67.database.todo.md +13 -0
- package/docs/plans/68.deploy.packages.todo.md +12 -0
- package/docs/plans/69.report.human.operator.md +133 -0
- package/docs/plans/70.report.brain2qwerty.ems.md +135 -0
- package/docs/plans/71.report.hd.infinito.vram.md +155 -0
- package/docs/plans/72.plan.hd.infinito.node.md +146 -0
- package/docs/plans/73.plan.scifi.repos.md +125 -0
- package/docs/plans/74.000.manifesto.v8.flat.2..md +11 -0
- package/docs/plans/README.md +489 -0
- package/docs/plans/aggregate_platforms.mjs +146 -0
- package/docs/plans/examplesession.json +36 -0
- package/docs/plans/missing-facts.md +192 -0
- package/docs/plans/models.md +64 -0
- package/docs/plans/organize.cjs +270 -0
- package/docs/plans/platforms.md +2887 -0
- package/docs/plans/sites.md +31322 -0
- package/docs/platformpipelineaudit.md +18 -0
- package/docs/platformpipelines.md +13 -0
- package/docs/registryresearch.md +4 -0
- package/docs/release.md +4 -4
- package/docs/release182notes.md +2 -0
- package/docs/release184notes.md +7 -0
- package/docs/release185notes.md +7 -0
- package/docs/sources/farm.py +117 -0
- package/docs/sources/html/saddle1.html +132 -0
- package/docs/sources/html/saddle2.html +157 -0
- package/docs/sources/html/saddle3.html +119 -0
- package/docs/sources/html/saddle4.html +144 -0
- package/docs/sources/html/saddle5.html +72 -0
- package/docs/sources/html/saddle6.html +171 -0
- package/docs/sources/html/saddle7.html +236 -0
- package/docs/sources/saddle.ts +74 -0
- package/docs/sources/schema.prisma +88 -0
- package/docs/sources/script.sh +64 -0
- package/docs/sources/workflows.yml +458 -0
- package/docs/talks1/_body.txt +14 -0
- package/docs/talks1/_index.md +15 -0
- package/docs/talks1/_screenshot.png +0 -0
- package/docs/talks1/assistant-01.md +5 -0
- package/docs/talks1/assistant-02.md +5 -0
- package/docs/talks1/assistant-03.md +531 -0
- package/docs/talks1/assistant-04.md +26 -0
- package/docs/talks1/assistant-05.md +774 -0
- package/docs/talks1/assistant-06.md +1718 -0
- package/docs/talks1/scrape-share.cjs +185 -0
- package/docs/talks1/scrape-share.ts +183 -0
- package/docs/talks1/user-01.md +3 -0
- package/docs/talks1/user-02.md +3 -0
- package/docs/talks1/user-03.md +88 -0
- package/docs/talks1/user-04.md +3 -0
- package/docs/talks1/user-05.md +3 -0
- package/docs/talks1/user-06.md +88 -0
- package/docs/talks1/user-07.md +88 -0
- package/docs/talks2/_body.txt +14 -0
- package/docs/talks2/_index.md +16 -0
- package/docs/talks2/_screenshot.png +0 -0
- package/docs/talks2/assistant-01.md +5 -0
- package/docs/talks2/assistant-02.md +5 -0
- package/docs/talks2/assistant-03.md +424 -0
- package/docs/talks2/assistant-04.md +598 -0
- package/docs/talks2/assistant-05.md +1280 -0
- package/docs/talks2/assistant-06.md +1227 -0
- package/docs/talks2/assistant-07.md +1252 -0
- package/docs/talks2/user-01.md +3 -0
- package/docs/talks2/user-02.md +3 -0
- package/docs/talks2/user-03.md +88 -0
- package/docs/talks2/user-04.md +88 -0
- package/docs/talks2/user-05.md +88 -0
- package/docs/talks2/user-06.md +88 -0
- package/docs/talks2/user-07.md +3 -0
- package/docs/talks3/_body.txt +467 -0
- package/docs/talks3/_index.md +10 -0
- package/docs/talks3/_screenshot.png +0 -0
- package/docs/talks3/assistant-01.md +417 -0
- package/docs/talks3/assistant-02.md +417 -0
- package/docs/talks3/assistant-03.md +29 -0
- package/docs/talks3/assistant-04.md +727 -0
- package/docs/talks3/user-01.md +88 -0
- package/docs/talks3/user-02.md +88 -0
- package/docs/talks3/user-03.md +3 -0
- package/docs/talks3/user-04.md +3 -0
- package/docs/talks4/_body.txt +14 -0
- package/docs/talks4/_index.md +12 -0
- package/docs/talks4/_screenshot.png +0 -0
- package/docs/talks4/assistant-01.md +5 -0
- package/docs/talks4/assistant-02.md +5 -0
- package/docs/talks4/assistant-03.md +35 -0
- package/docs/talks4/assistant-04.md +512 -0
- package/docs/talks4/assistant-05.md +599 -0
- package/docs/talks4/user-01.md +3 -0
- package/docs/talks4/user-02.md +3 -0
- package/docs/talks4/user-03.md +88 -0
- package/docs/talks4/user-04.md +88 -0
- package/docs/talks4/user-05.md +7 -0
- package/docs/talks5/_body.txt +14 -0
- package/docs/talks5/_index.md +13 -0
- package/docs/talks5/_screenshot.png +0 -0
- package/docs/talks5/assistant-01.md +5 -0
- package/docs/talks5/assistant-02.md +5 -0
- package/docs/talks5/assistant-03.md +690 -0
- package/docs/talks5/assistant-04.md +758 -0
- package/docs/talks5/assistant-05.md +974 -0
- package/docs/talks5/user-01.md +3 -0
- package/docs/talks5/user-02.md +3 -0
- package/docs/talks5/user-03.md +105 -0
- package/docs/talks5/user-04.md +105 -0
- package/docs/talks5/user-05.md +63 -0
- package/docs/talks5/user-06.md +105 -0
- package/docs/talks6/_body.txt +14 -0
- package/docs/talks6/_index.md +9 -0
- package/docs/talks6/_screenshot.png +0 -0
- package/docs/talks6/assistant-01.md +5 -0
- package/docs/talks6/assistant-02.md +5 -0
- package/docs/talks6/assistant-03.md +1499 -0
- package/docs/talks6/user-01.md +3 -0
- package/docs/talks6/user-02.md +3 -0
- package/docs/talks6/user-03.md +88 -0
- package/docs/talks6/user-04.md +88 -0
- package/docs/talks7/_body.txt +14 -0
- package/docs/talks7/_index.md +10 -0
- package/docs/talks7/_screenshot.png +0 -0
- package/docs/talks7/assistant-01.md +5 -0
- package/docs/talks7/assistant-02.md +5 -0
- package/docs/talks7/assistant-03.md +523 -0
- package/docs/talks7/assistant-04.md +617 -0
- package/docs/talks7/user-01.md +3 -0
- package/docs/talks7/user-02.md +3 -0
- package/docs/talks7/user-03.md +105 -0
- package/docs/talks7/user-04.md +67 -0
- package/docs/talks8/conversa1.txt +1322 -0
- package/docs/talks8/conversa2.txt +237 -0
- package/docs/talks9/Beyond the Obvious_ 50 Plataformas Auto-Hospedadas de Forja de C/303/263digo para Al/303/251m de Gitea e GitLab.md" +174 -0
- package/docs/talks9/De NPM a Multi-Linguagem_ Uma Arquitetura T/303/251cnica para a Execu/303/247/303/243o Integrada de C/303/263digo no Ecossistema Node.js.md" +59 -0
- package/docs/talks9/De NPM a VMs Virtuais_ Uma An/303/241lise Arquitet/303/264nica para a Realiza/303/247/303/243o do Ciclo de Vida do Projeto SADDLE.md" +91 -0
- package/docs/talks9/Mapeamento da Engrenagem Computacional_ Uma Arquitetura para Execu/303/247/303/243o Isolada e Persist/303/252ncia em Ambientes Distribu/303/255dos.md" +116 -0
- package/docs/talks9/O Cen/303/241rio Pr/303/241tico do SADDLE_ Uma An/303/241lise de Viabilidade e Modelo de Ciclo de Vida Integrado.md" +128 -0
- package/docs/talks9/README (2).md +489 -0
- package/docs/talks9/README.md +198 -0
- package/docs/talks9/Viabilidade do Saddle_ Uma An/303/241lise T/303/251cnica da Transforma/303/247/303/243o de Armazenamento Remoto em Mem/303/263ria Computacional.md" +80 -0
- package/docs/talks9/conversa.txt +544 -0
- package/docs/talks9/other (2).md +39 -0
- package/docs/talks9/other.md +57 -0
- package/docs/talks9/outro.txt +24 -0
- package/extension/README.md +3 -3
- package/extension/serviceworker.js +63 -4
- package/extension/worker.js +3 -1
- package/package.json +12 -2
- package/packager/manifest.js +1 -1
- package/scrape/agent.ts +122 -0
- package/scrape/batch.ts +79 -0
- package/scrape/biome.json +76 -0
- package/scrape/browser.ts +222 -0
- package/scrape/cache.ts +84 -0
- package/scrape/chunking.ts +193 -0
- package/scrape/cli.ts +105 -0
- package/scrape/crawler.ts +115 -0
- package/scrape/dev-server.ts +94 -0
- package/scrape/errors.ts +132 -0
- package/scrape/events.ts +26 -0
- package/scrape/extract.ts +165 -0
- package/scrape/fetch.ts +105 -0
- package/scrape/formats.ts +85 -0
- package/scrape/headers.ts +71 -0
- package/scrape/index.ts +92 -0
- package/scrape/jsdom.d.ts +6 -0
- package/scrape/llms-txt.ts +84 -0
- package/scrape/middleware.ts +90 -0
- package/scrape/package-lock.json +9397 -0
- package/scrape/package.json +1420 -0
- package/scrape/pool.ts +95 -0
- package/scrape/port.ts +18 -0
- package/scrape/proxy.ts +103 -0
- package/scrape/rate-limiter.ts +95 -0
- package/scrape/renderer.ts +194 -0
- package/scrape/retry.ts +64 -0
- package/scrape/robots.ts +137 -0
- package/scrape/scrape.ts +123 -0
- package/scrape/serialize.ts +310 -0
- package/scrape/server.ts +137 -0
- package/scrape/session.ts +109 -0
- package/scrape/sitemap.ts +131 -0
- package/scrape/tokens.ts +45 -0
- package/scrape/tsconfig.json +28 -0
- package/scrape/types.ts +214 -0
- package/scrape/utils.ts +77 -0
- package/scrape/vite.config.ts +55 -0
- package/scrape/vitest.config.ts +17 -0
- package/workflow/templates.js +4 -4
|
@@ -0,0 +1,598 @@
|
|
|
1
|
+
# assistant
|
|
2
|
+
|
|
3
|
+
[Thinking] The user is asking me to provide a step-by-step guide with scripts, pipelines, and implementations for creating a sandbox platform using free infrastructure from GitHub, GitLab, Forgejo, Gitea, Codeberg, etc. They want to understand how to:
|
|
4
|
+
|
|
5
|
+
Use storage as RAM (zram, tmpfs, etc.)
|
|
6
|
+
Create sandbox environments using CI/CD pipelines
|
|
7
|
+
Use the free tiers of these platforms
|
|
8
|
+
Implement this with various tools (Docker, Node.js, Python, Rust, etc.)
|
|
9
|
+
|
|
10
|
+
They also mention wanting to download the init-fullstack.sh script and run it, but since this is a plan mode, I need to provide a comprehensive plan without actually executing anything.
|
|
11
|
+
Let me create a detailed plan covering:
|
|
12
|
+
|
|
13
|
+
Architecture overview
|
|
14
|
+
Infrastructure setup on each platform
|
|
15
|
+
Memory/storage conversion techniques
|
|
16
|
+
Pipeline implementations
|
|
17
|
+
Scripts and configurationsI should search for more specific information about implementing this.
|
|
18
|
+
|
|
19
|
+
[Thinking] Now I have enough information to create a comprehensive step-by-step plan. Let me organize this into a clear, actionable guide.
|
|
20
|
+
|
|
21
|
+
[Thinking] Now let me create a comprehensive plan. I need to be thorough but also concise.
|
|
22
|
+
|
|
23
|
+
[Thinking] I've provided a comprehensive plan. Let me now ask if the user wants me to implement any specific part of this plan.
|
|
24
|
+
|
|
25
|
+
PLANO COMPLETO: Plataforma Sandbox com Infraestrutura Gratuita
|
|
26
|
+
|
|
27
|
+
VISÃO GERAL DA ARQUITETURA
|
|
28
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
29
|
+
│ SEU SISTEMA (Cloudflare Workers/Node) │
|
|
30
|
+
│ ┌─────────┐ ┌──────────┐ ┌─────────┐ ┌──────────────┐ │
|
|
31
|
+
│ │ API │ │ Auth │ │ Cron │ │ Monitor │ │
|
|
32
|
+
│ │ REST │ │ JWT/OAuth│ │ Jobs │ │ Dashboard │ │
|
|
33
|
+
│ └────┬─────┘ └────┬─────┘ └────┬────┘ └──────┬───────┘ │
|
|
34
|
+
│ └──────────────┴─────────────┴──────────────┘ │
|
|
35
|
+
└───────────────────────────┬─────────────────────────────────┘
|
|
36
|
+
│
|
|
37
|
+
┌───────────────────┼───────────────────┐
|
|
38
|
+
▼ ▼ ▼
|
|
39
|
+
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
|
|
40
|
+
│ GitHub Actions│ │ GitLab CI │ │ Forgejo/Gitea │
|
|
41
|
+
│ (público: │ │ (400 min/mês) │ │ (self-hosted) │
|
|
42
|
+
│ ilimitado) │ │ │ │ │
|
|
43
|
+
│ 16GB RAM │ │ 8-128GB RAM │ │ RAM ilimitada │
|
|
44
|
+
└───────┬───────┘ └───────┬───────┘ └───────┬───────┘
|
|
45
|
+
│ │ │
|
|
46
|
+
▼ ▼ ▼
|
|
47
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
48
|
+
│ RUNNER EFÊMERO (Docker/VM) │
|
|
49
|
+
│ ┌─────────┐ ┌──────────┐ ┌─────────┐ ┌──────────────┐ │
|
|
50
|
+
│ │ zram │ │ tmpfs │ │ overlay │ │ cgroup │ │
|
|
51
|
+
│ │ swap │ │ /tmp │ │ fs │ │ limits │ │
|
|
52
|
+
│ │ compr. │ │ em RAM │ │ CoW │ │ --memory │ │
|
|
53
|
+
│ └─────────┘ └──────────┘ └─────────┘ └──────────────┘ │
|
|
54
|
+
└─────────────────────────────────────────────────────────────┘
|
|
55
|
+
|
|
56
|
+
PASSO 1: Infraestrutura Gratuita por Plataforma
|
|
57
|
+
GitHub Actions (Repositórios Públicos)
|
|
58
|
+
# .github/workflows/sandbox.yml
|
|
59
|
+
name: Sandbox Runner
|
|
60
|
+
|
|
61
|
+
on:
|
|
62
|
+
repository_dispatch:
|
|
63
|
+
types: [create-sandbox]
|
|
64
|
+
workflow_dispatch:
|
|
65
|
+
inputs:
|
|
66
|
+
sandbox_id:
|
|
67
|
+
description: 'ID da sandbox'
|
|
68
|
+
required: true
|
|
69
|
+
ram_limit:
|
|
70
|
+
description: 'Limite RAM (ex: 8G)'
|
|
71
|
+
default: '8G'
|
|
72
|
+
cpu_limit:
|
|
73
|
+
description: 'Limite CPU'
|
|
74
|
+
default: '4'
|
|
75
|
+
packages:
|
|
76
|
+
description: 'Pacotes para instalar'
|
|
77
|
+
default: 'nodejs python3'
|
|
78
|
+
|
|
79
|
+
jobs:
|
|
80
|
+
sandbox:
|
|
81
|
+
runs-on: ubuntu-latest # 4 vCPU, 16 GB RAM grátis
|
|
82
|
+
|
|
83
|
+
container:
|
|
84
|
+
image: ubuntu:22.04
|
|
85
|
+
options: >-
|
|
86
|
+
--memory ${{ github.event.inputs.ram_limit || '8G' }}
|
|
87
|
+
--cpus ${{ github.event.inputs.cpu_limit || '4' }}
|
|
88
|
+
--tmpfs /tmp:size=4G
|
|
89
|
+
--tmpfs /run:size=2G
|
|
90
|
+
|
|
91
|
+
steps:
|
|
92
|
+
- name: Setup zram
|
|
93
|
+
run: |
|
|
94
|
+
modprobe zram
|
|
95
|
+
echo lz4 > /sys/block/zram0/comp_algorithm
|
|
96
|
+
echo 8G > /sys/block/zram0/disksize
|
|
97
|
+
mkswap /dev/zram0
|
|
98
|
+
swapon /dev/zram0
|
|
99
|
+
echo "zram configurado:"
|
|
100
|
+
zramctl
|
|
101
|
+
|
|
102
|
+
- name: Setup tmpfs
|
|
103
|
+
run: |
|
|
104
|
+
mount -t tmpfs -o size=4G tmpfs /workspace
|
|
105
|
+
echo "tmpfs configurado:"
|
|
106
|
+
df -h /workspace
|
|
107
|
+
|
|
108
|
+
- name: Instalar pacotes
|
|
109
|
+
run: |
|
|
110
|
+
apt-get update
|
|
111
|
+
apt-get install -y ${{ github.event.inputs.packages || 'nodejs python3' }}
|
|
112
|
+
|
|
113
|
+
- name: Clone repositório
|
|
114
|
+
uses: actions/checkout@v4
|
|
115
|
+
with:
|
|
116
|
+
path: /workspace
|
|
117
|
+
|
|
118
|
+
- name: Verificar recursos
|
|
119
|
+
run: |
|
|
120
|
+
echo "=== RAM ==="
|
|
121
|
+
free -h
|
|
122
|
+
echo "=== Disco ==="
|
|
123
|
+
df -h
|
|
124
|
+
echo "=== CPU ==="
|
|
125
|
+
nproc
|
|
126
|
+
|
|
127
|
+
- name: Executar sandbox
|
|
128
|
+
working-directory: /workspace
|
|
129
|
+
run: |
|
|
130
|
+
# Aqui roda o código do usuário
|
|
131
|
+
ls -la
|
|
132
|
+
# node app.js ou python main.py
|
|
133
|
+
GitLab CI
|
|
134
|
+
# .gitlab-ci.yml
|
|
135
|
+
stages:
|
|
136
|
+
- sandbox
|
|
137
|
+
|
|
138
|
+
sandbox:
|
|
139
|
+
stage: sandbox
|
|
140
|
+
tags:
|
|
141
|
+
- saas-linux-small-amd64 # 2 vCPU, 8 GB RAM
|
|
142
|
+
image: ubuntu:22.04
|
|
143
|
+
variables:
|
|
144
|
+
MEMORY_LIMIT: "7G"
|
|
145
|
+
CPU_LIMIT: "2"
|
|
146
|
+
before_script:
|
|
147
|
+
- apt-get update && apt-get install -y zram-tools
|
|
148
|
+
- zramctl /dev/zram0 --algorithm lz4 --size 4G --type swap
|
|
149
|
+
script:
|
|
150
|
+
- free -h
|
|
151
|
+
- df -h
|
|
152
|
+
- # Código do usuário
|
|
153
|
+
rules:
|
|
154
|
+
- if: $CI_PIPELINE_SOURCE == "web"
|
|
155
|
+
- if: $CI_PIPELINE_SOURCE == "api"
|
|
156
|
+
Forgejo/Gitea (Self-hosted)
|
|
157
|
+
# .forgejo/workflows/sandbox.yml
|
|
158
|
+
name: Self-hosted Sandbox
|
|
159
|
+
|
|
160
|
+
on:
|
|
161
|
+
push:
|
|
162
|
+
branches: [main]
|
|
163
|
+
|
|
164
|
+
jobs:
|
|
165
|
+
sandbox:
|
|
166
|
+
runs-on: self-hosted
|
|
167
|
+
container:
|
|
168
|
+
image: catthehacker/ubuntu:act-latest
|
|
169
|
+
options: >-
|
|
170
|
+
--memory 8G
|
|
171
|
+
--cpus 4
|
|
172
|
+
--tmpfs /tmp:size=4G
|
|
173
|
+
|
|
174
|
+
steps:
|
|
175
|
+
- name: Setup
|
|
176
|
+
run: |
|
|
177
|
+
if modprobe zram 2>/dev/null; then
|
|
178
|
+
echo lz4 > /sys/block/zram0/comp_algorithm
|
|
179
|
+
echo 8G > /sys/block/zram0/disksize
|
|
180
|
+
mkswap /dev/zram0 && swapon /dev/zram0
|
|
181
|
+
fi
|
|
182
|
+
|
|
183
|
+
- uses: actions/checkout@v4
|
|
184
|
+
- run: npm install && npm test
|
|
185
|
+
|
|
186
|
+
PASSO 2: Conversão Storage → RAM
|
|
187
|
+
Script de Setup de Memória
|
|
188
|
+
#!/bin/bash
|
|
189
|
+
# setup-memory.sh - Converte storage em RAM
|
|
190
|
+
|
|
191
|
+
setup_zram() {
|
|
192
|
+
local size="${1:-4G}"
|
|
193
|
+
local algo="${2:-lz4}"
|
|
194
|
+
|
|
195
|
+
modprobe zram
|
|
196
|
+
echo $algo > /sys/block/zram0/comp_algorithm
|
|
197
|
+
echo $size > /sys/block/zram0/disksize
|
|
198
|
+
mkswap /dev/zram0
|
|
199
|
+
swapon /dev/zram0
|
|
200
|
+
|
|
201
|
+
echo "zram configurado: $size com $algo"
|
|
202
|
+
zramctl
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
setup_tmpfs() {
|
|
206
|
+
local mount_point="${1:-/workspace}"
|
|
207
|
+
local size="${2:-4G}"
|
|
208
|
+
|
|
209
|
+
mkdir -p $mount_point
|
|
210
|
+
mount -t tmpfs -o size=$size tmpfs $mount_point
|
|
211
|
+
|
|
212
|
+
echo "tmpfs configurado em $mount_point: $size"
|
|
213
|
+
df -h $mount_point
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
setup_overlay() {
|
|
217
|
+
local upper="${1:-/tmp/overlay-upper}"
|
|
218
|
+
local work="${2:-/tmp/overlay-work}"
|
|
219
|
+
local merged="${3:-/merged}"
|
|
220
|
+
|
|
221
|
+
mkdir -p $upper $work $merged
|
|
222
|
+
mount -t overlay overlay \
|
|
223
|
+
-o lowerdir=/lower,upperdir=$upper,workdir=$work \
|
|
224
|
+
$merged
|
|
225
|
+
|
|
226
|
+
echo "overlay configurado em $merged"
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
# Executar setup
|
|
230
|
+
setup_zram "8G"
|
|
231
|
+
setup_tmpfs "/workspace" "4G"
|
|
232
|
+
setup_tmpfs "/tmp" "2G"
|
|
233
|
+
Docker Compose com Limits
|
|
234
|
+
# docker-compose.sandbox.yml
|
|
235
|
+
version: '3.8'
|
|
236
|
+
|
|
237
|
+
services:
|
|
238
|
+
sandbox:
|
|
239
|
+
image: ubuntu:22.04
|
|
240
|
+
deploy:
|
|
241
|
+
resources:
|
|
242
|
+
limits:
|
|
243
|
+
cpus: '4'
|
|
244
|
+
memory: 8G
|
|
245
|
+
reservations:
|
|
246
|
+
memory: 2G
|
|
247
|
+
volumes:
|
|
248
|
+
- workspace:/workspace
|
|
249
|
+
- tmpfs:/tmp
|
|
250
|
+
tmpfs:
|
|
251
|
+
- /tmp:size=4G
|
|
252
|
+
- /run:size=2G
|
|
253
|
+
command: >
|
|
254
|
+
bash -c "
|
|
255
|
+
modprobe zram &&
|
|
256
|
+
echo lz4 > /sys/block/zram0/comp_algorithm &&
|
|
257
|
+
echo 8G > /sys/block/zram0/disksize &&
|
|
258
|
+
mkswap /dev/zram0 &&
|
|
259
|
+
swapon /dev/zram0 &&
|
|
260
|
+
free -h &&
|
|
261
|
+
df -h &&
|
|
262
|
+
sleep infinity
|
|
263
|
+
"
|
|
264
|
+
|
|
265
|
+
volumes:
|
|
266
|
+
workspace:
|
|
267
|
+
tmpfs:
|
|
268
|
+
|
|
269
|
+
PASSO 3: Projetos Open Source para Sandboxing
|
|
270
|
+
Para microVMs (mais isolamento):
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
Projeto
|
|
275
|
+
Comando
|
|
276
|
+
RAM por fork
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
kern
|
|
281
|
+
kern box --image alpine --memory 512M -it -- sh
|
|
282
|
+
~1.5 MB
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
exec-sandbox
|
|
286
|
+
exec-sandbox run --memory 192 -- python code.py
|
|
287
|
+
192 MB
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
mitos
|
|
291
|
+
mitos sandbox create --from-sandbox <id>
|
|
292
|
+
~3 MiB
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
rust-nano-vm
|
|
296
|
+
nanovm create --memory 256
|
|
297
|
+
~0.5 MiB
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
Para containers Docker:
|
|
301
|
+
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
Projeto
|
|
305
|
+
Comando
|
|
306
|
+
RAM por fork
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
ez-gh-actions
|
|
311
|
+
ezgha start --memory 4096 --cpus 2
|
|
312
|
+
Configurável
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
outrunner
|
|
316
|
+
outrunner run --memory 4G --image ubuntu
|
|
317
|
+
Configurável
|
|
318
|
+
|
|
319
|
+
|
|
320
|
+
ephemerd
|
|
321
|
+
ephemerd serve --memory 8192
|
|
322
|
+
Configurável
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
Para storage→RAM:
|
|
326
|
+
|
|
327
|
+
|
|
328
|
+
|
|
329
|
+
Projeto
|
|
330
|
+
Comando
|
|
331
|
+
Uso
|
|
332
|
+
|
|
333
|
+
|
|
334
|
+
|
|
335
|
+
zram-config
|
|
336
|
+
zram-config start
|
|
337
|
+
Swap comprimido
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
MAVFS
|
|
341
|
+
python run_mafs.py shell --ram redis
|
|
342
|
+
Filesystem virtual
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
DiskLLM
|
|
346
|
+
diskllm run --kv-backend ssd
|
|
347
|
+
Cache em SSD
|
|
348
|
+
|
|
349
|
+
|
|
350
|
+
storage.llm
|
|
351
|
+
./storagellm-server --model ./model
|
|
352
|
+
Offload storage→VRAM
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
PASSO 4: Orquestrador com Cloudflare Workers
|
|
357
|
+
// src/index.js
|
|
358
|
+
export default {
|
|
359
|
+
async scheduled(event, env, ctx) {
|
|
360
|
+
// Cron job para limpar sandboxes antigas
|
|
361
|
+
await cleanupOldSandboxes(env);
|
|
362
|
+
},
|
|
363
|
+
|
|
364
|
+
async fetch(request, env, ctx) {
|
|
365
|
+
const url = new URL(request.url);
|
|
366
|
+
|
|
367
|
+
if (url.pathname === '/api/sandbox/create') {
|
|
368
|
+
return await createSandbox(request, env);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
if (url.pathname === '/api/sandbox/destroy') {
|
|
372
|
+
return await destroySandbox(request, env);
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
return new Response('Sandbox Platform API');
|
|
376
|
+
}
|
|
377
|
+
};
|
|
378
|
+
|
|
379
|
+
async function createSandbox(request, env) {
|
|
380
|
+
const { userId, ramLimit, cpuLimit, packages } = await request.json();
|
|
381
|
+
|
|
382
|
+
// Escolher plataforma baseado na carga
|
|
383
|
+
let platform = 'github'; // padrão: gratuito para públicos
|
|
384
|
+
|
|
385
|
+
if (ramLimit > 16) {
|
|
386
|
+
platform = 'gitlab'; // até 128 GB no premium
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
// Criar repositório e disparar workflow
|
|
390
|
+
const repoName = `sandbox-${userId}-${Date.now()}`;
|
|
391
|
+
|
|
392
|
+
if (platform === 'github') {
|
|
393
|
+
await createGitHubRepo(repoName, env);
|
|
394
|
+
await triggerGitHubWorkflow(repoName, { ramLimit, cpuLimit, packages }, env);
|
|
395
|
+
} else if (platform === 'gitlab') {
|
|
396
|
+
await createGitLabProject(repoName, env);
|
|
397
|
+
await triggerGitLabPipeline(repoName, { ramLimit, cpuLimit, packages }, env);
|
|
398
|
+
} else if (platform === 'forgejo') {
|
|
399
|
+
await createForgejoRepo(repoName, env);
|
|
400
|
+
await triggerForgejoWorkflow(repoName, { ramLimit, cpuLimit, packages }, env);
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
return Response.json({
|
|
404
|
+
sandboxId: repoName,
|
|
405
|
+
platform,
|
|
406
|
+
status: 'creating',
|
|
407
|
+
estimatedReady: '30s'
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
async function triggerGitHubWorkflow(repoName, config, env) {
|
|
412
|
+
const workflow = `
|
|
413
|
+
name: Sandbox
|
|
414
|
+
on:
|
|
415
|
+
workflow_dispatch:
|
|
416
|
+
inputs:
|
|
417
|
+
ram_limit:
|
|
418
|
+
default: '${config.ramLimit}'
|
|
419
|
+
cpu_limit:
|
|
420
|
+
default: '${config.cpuLimit}'
|
|
421
|
+
packages:
|
|
422
|
+
default: '${config.packages}'
|
|
423
|
+
|
|
424
|
+
jobs:
|
|
425
|
+
run:
|
|
426
|
+
runs-on: ubuntu-latest
|
|
427
|
+
container:
|
|
428
|
+
image: ubuntu:22.04
|
|
429
|
+
options: --memory \${{ github.event.inputs.ram_limit }} --cpus \${{ github.event.inputs.cpu_limit }}
|
|
430
|
+
steps:
|
|
431
|
+
- run: apt-get update && apt-get install -y \${{ github.event.inputs.packages }}
|
|
432
|
+
- run: free -h && df -h
|
|
433
|
+
`;
|
|
434
|
+
|
|
435
|
+
// Criar arquivo .github/workflows/sandbox.yml
|
|
436
|
+
await fetch(`https://api.github.com/repos/${env.GITHUB_ORG}/${repoName}/contents/.github/workflows/sandbox.yml`, {
|
|
437
|
+
method: 'PUT',
|
|
438
|
+
headers: {
|
|
439
|
+
'Authorization': `token ${env.GITHUB_TOKEN}`,
|
|
440
|
+
'Content-Type': 'application/json'
|
|
441
|
+
},
|
|
442
|
+
body: JSON.stringify({
|
|
443
|
+
message: 'Create sandbox workflow',
|
|
444
|
+
content: btoa(workflow)
|
|
445
|
+
})
|
|
446
|
+
});
|
|
447
|
+
|
|
448
|
+
// Disparar workflow
|
|
449
|
+
await fetch(`https://api.github.com/repos/${env.GITHUB_ORG}/${repoName}/actions/workflows/sandbox.yml/dispatches`, {
|
|
450
|
+
method: 'POST',
|
|
451
|
+
headers: {
|
|
452
|
+
'Authorization': `token ${env.GITHUB_TOKEN}`,
|
|
453
|
+
'Content-Type': 'application/json'
|
|
454
|
+
},
|
|
455
|
+
body: JSON.stringify({
|
|
456
|
+
ref: 'main',
|
|
457
|
+
inputs: {
|
|
458
|
+
ram_limit: config.ramLimit,
|
|
459
|
+
cpu_limit: config.cpuLimit,
|
|
460
|
+
packages: config.packages
|
|
461
|
+
}
|
|
462
|
+
})
|
|
463
|
+
});
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
PASSO 5: Monitoramento e Limpeza
|
|
467
|
+
// src/monitor.js
|
|
468
|
+
export async function cleanupOldSandboxes(env) {
|
|
469
|
+
const sandboxes = await env.DB.prepare(
|
|
470
|
+
'SELECT * FROM sandboxes WHERE created_at < datetime("now", "-1 hour")'
|
|
471
|
+
).all();
|
|
472
|
+
|
|
473
|
+
for (const sandbox of sandboxes.results) {
|
|
474
|
+
// Destruir repositório e resources
|
|
475
|
+
await destroySandbox(sandbox.id, sandbox.platform, env);
|
|
476
|
+
|
|
477
|
+
// Remover do banco
|
|
478
|
+
await env.DB.prepare('DELETE FROM sandboxes WHERE id = ?').bind(sandbox.id).run();
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
export async function getMetrics(sandboxId, env) {
|
|
483
|
+
// Buscar métricas do runner
|
|
484
|
+
const metrics = await fetch(`https://api.github.com/repos/${env.GITHUB_ORG}/${sandboxId}/actions/runs`, {
|
|
485
|
+
headers: {
|
|
486
|
+
'Authorization': `token ${env.GITHUB_TOKEN}`
|
|
487
|
+
}
|
|
488
|
+
});
|
|
489
|
+
|
|
490
|
+
return {
|
|
491
|
+
status: metrics.workflow_runs[0]?.status,
|
|
492
|
+
conclusion: metrics.workflow_runs[0]?.conclusion,
|
|
493
|
+
duration: metrics.workflow_runs[0]?.run_started_at,
|
|
494
|
+
logs: await getRunLogs(sandboxId, env)
|
|
495
|
+
};
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
PASSO 6: Script de Setup Local (Windows/Mac/Linux)
|
|
499
|
+
#!/bin/bash
|
|
500
|
+
# setup-sandbox-platform.sh
|
|
501
|
+
|
|
502
|
+
echo "=== Configurando Plataforma Sandbox ==="
|
|
503
|
+
|
|
504
|
+
# 1. Instalar dependências
|
|
505
|
+
echo "Instalando dependências..."
|
|
506
|
+
npm install -g wrangler # Cloudflare Workers CLI
|
|
507
|
+
npm install -g @cloudflare/workers-types
|
|
508
|
+
|
|
509
|
+
# 2. Criar projeto
|
|
510
|
+
echo "Criando projeto..."
|
|
511
|
+
mkdir sandbox-platform && cd sandbox-platform
|
|
512
|
+
npm init -y
|
|
513
|
+
npm install @cloudflare/workers-types typescript
|
|
514
|
+
|
|
515
|
+
# 3. Configurar Cloudflare
|
|
516
|
+
echo "Configurando Cloudflare..."
|
|
517
|
+
wrangler login
|
|
518
|
+
wrangler secret put GITHUB_TOKEN
|
|
519
|
+
wrangler secret put GITLAB_TOKEN
|
|
520
|
+
wrangler secret put FORGEJO_TOKEN
|
|
521
|
+
|
|
522
|
+
# 4. Criar banco de dados
|
|
523
|
+
echo "Criando banco de dados..."
|
|
524
|
+
wrangler d1 create sandboxes-db
|
|
525
|
+
|
|
526
|
+
# 5. Deploy
|
|
527
|
+
echo "Fazendo deploy..."
|
|
528
|
+
wrangler deploy
|
|
529
|
+
|
|
530
|
+
echo "=== Plataforma configurada! ==="
|
|
531
|
+
echo "API URL: https://sandbox-platform.your-subdomain.workers.dev"
|
|
532
|
+
|
|
533
|
+
RESUMO DOS RECURSOS GRATUITOS
|
|
534
|
+
|
|
535
|
+
|
|
536
|
+
|
|
537
|
+
Plataforma
|
|
538
|
+
RAM
|
|
539
|
+
CPU
|
|
540
|
+
Storage
|
|
541
|
+
Minutos/mês
|
|
542
|
+
|
|
543
|
+
|
|
544
|
+
|
|
545
|
+
GitHub (público)
|
|
546
|
+
16 GB
|
|
547
|
+
4 vCPU
|
|
548
|
+
14 GB
|
|
549
|
+
Ilimitado
|
|
550
|
+
|
|
551
|
+
|
|
552
|
+
GitHub (privado)
|
|
553
|
+
16 GB
|
|
554
|
+
4 vCPU
|
|
555
|
+
14 GB
|
|
556
|
+
2.000
|
|
557
|
+
|
|
558
|
+
|
|
559
|
+
GitLab Free
|
|
560
|
+
8 GB
|
|
561
|
+
2 vCPU
|
|
562
|
+
30 GB
|
|
563
|
+
400
|
|
564
|
+
|
|
565
|
+
|
|
566
|
+
Codeberg
|
|
567
|
+
8 GB
|
|
568
|
+
4 vCPU
|
|
569
|
+
-
|
|
570
|
+
-
|
|
571
|
+
|
|
572
|
+
|
|
573
|
+
Forgejo self-hosted
|
|
574
|
+
Ilimitado
|
|
575
|
+
Ilimitado
|
|
576
|
+
Ilimitado
|
|
577
|
+
Ilimitado
|
|
578
|
+
|
|
579
|
+
|
|
580
|
+
|
|
581
|
+
MACETES PRINCIPAIS
|
|
582
|
+
|
|
583
|
+
Repositórios públicos no GitHub = ilimitado (16 GB RAM grátis)
|
|
584
|
+
zram converte 4 GB storage em ~12 GB RAM comprimida
|
|
585
|
+
tmpfs coloca arquivos direto em RAM (zero I/O disco)
|
|
586
|
+
Docker --memory isola cada sandbox sem afetar outras
|
|
587
|
+
Cloudflare Workers free tier orquestra tudo
|
|
588
|
+
Cron jobs mantêm sandboxes limpas automaticamente
|
|
589
|
+
|
|
590
|
+
Quer que eu implemente alguma parte específica? Posso:
|
|
591
|
+
|
|
592
|
+
Criar o projeto completo com Cloudflare Workers + GitHub/GitLab/Forgejo
|
|
593
|
+
Criar os scripts de setup de zram/tmpfs/overlay
|
|
594
|
+
Configurar o Forgejo self-hosted no seu servidor
|
|
595
|
+
Criar o orchestador com cron jobs e monitoramento
|
|
596
|
+
Integrar com o script init-fullstack.sh do Z.ai
|
|
597
|
+
|
|
598
|
+
Qual parte quer começar?
|