Skip to content

Commit 44d4841

Browse files
committed
fix: github workflow
1 parent bd3d1ac commit 44d4841

File tree

5 files changed

+109
-131
lines changed

5 files changed

+109
-131
lines changed
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
name: Deploy to Google Cloud Run
2+
3+
on:
4+
push:
5+
branches:
6+
- main
7+
workflow_dispatch:
8+
9+
env:
10+
PROJECT_ID: cheatcode-backend
11+
SERVICE_API: cheatcode-api
12+
SERVICE_WORKER: cheatcode-worker
13+
REGION: asia-south1
14+
IMAGE_NAME: gcr.io/cheatcode-backend/backend-api
15+
16+
jobs:
17+
deploy:
18+
runs-on: ubuntu-latest
19+
steps:
20+
- name: Checkout code
21+
uses: actions/checkout@v4
22+
23+
- name: Set up Docker Buildx
24+
uses: docker/setup-buildx-action@v3
25+
26+
- name: Authenticate to Google Cloud
27+
uses: google-github-actions/auth@v2
28+
with:
29+
credentials_json: ${{ secrets.GCP_SA_KEY }}
30+
31+
- name: Set up Cloud SDK
32+
uses: google-github-actions/setup-gcloud@v2
33+
34+
- name: Configure Docker for GCR
35+
run: gcloud auth configure-docker
36+
37+
- name: Set image tag
38+
id: image_tag
39+
run: |
40+
echo "tag=latest" >> $GITHUB_OUTPUT
41+
42+
- name: Build Docker image
43+
run: |
44+
docker build -t ${{ env.IMAGE_NAME }}:${{ steps.image_tag.outputs.tag }} ./backend
45+
46+
- name: Push Docker image
47+
run: |
48+
docker push ${{ env.IMAGE_NAME }}:${{ steps.image_tag.outputs.tag }}
49+
50+
- name: Deploy API service to Cloud Run
51+
run: |
52+
gcloud run deploy ${{ env.SERVICE_API }} \
53+
--image ${{ env.IMAGE_NAME }}:${{ steps.image_tag.outputs.tag }} \
54+
--platform managed \
55+
--region ${{ env.REGION }} \
56+
--allow-unauthenticated \
57+
--port 8000 \
58+
--set-secrets "ENV_MODE=ENV_MODE:latest,REDIS_URL=REDIS_URL:latest,SUPABASE_URL=SUPABASE_URL:latest,SUPABASE_ANON_KEY=SUPABASE_ANON_KEY:latest,SUPABASE_SERVICE_ROLE_KEY=SUPABASE_SERVICE_ROLE_KEY:latest,ANTHROPIC_API_KEY=ANTHROPIC_API_KEY:latest,OPENAI_API_KEY=OPENAI_API_KEY:latest,OPENROUTER_API_KEY=OPENROUTER_API_KEY:latest,MORPH_API_KEY=MORPH_API_KEY:latest,MODEL_TO_USE=MODEL_TO_USE:latest,CLERK_SECRET_KEY=CLERK_SECRET_KEY:latest,CLERK_DOMAIN=CLERK_DOMAIN:latest,DODO_PAYMENTS_API_KEY=DODO_PAYMENTS_API_KEY:latest,DODO_PAYMENTS_WEBHOOK_SECRET=DODO_PAYMENTS_WEBHOOK_SECRET:latest,TAVILY_API_KEY=TAVILY_API_KEY:latest,FIRECRAWL_API_KEY=FIRECRAWL_API_KEY:latest,FIRECRAWL_URL=FIRECRAWL_URL:latest,DAYTONA_API_KEY=DAYTONA_API_KEY:latest,DAYTONA_SERVER_URL=DAYTONA_SERVER_URL:latest,DAYTONA_TARGET=DAYTONA_TARGET:latest,LANGFUSE_PUBLIC_KEY=LANGFUSE_PUBLIC_KEY:latest,LANGFUSE_SECRET_KEY=LANGFUSE_SECRET_KEY:latest,LANGFUSE_HOST=LANGFUSE_HOST:latest,FREESTYLE_API_KEY=FREESTYLE_API_KEY:latest,FEATURE_FLAGS_ENABLED=FEATURE_FLAGS_ENABLED:latest,PIPEDREAM_CLIENT_ID=PIPEDREAM_CLIENT_ID:latest,PIPEDREAM_CLIENT_SECRET=PIPEDREAM_CLIENT_SECRET:latest,PIPEDREAM_PROJECT_ID=PIPEDREAM_PROJECT_ID:latest,PIPEDREAM_X_PD_ENVIRONMENT=PIPEDREAM_X_PD_ENVIRONMENT:latest,SMITHERY_API_KEY=SMITHERY_API_KEY:latest,MCP_CREDENTIAL_ENCRYPTION_KEY=MCP_CREDENTIAL_ENCRYPTION_KEY:latest,GOOGLE_API_KEY=GOOGLE_API_KEY:latest,NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY:latest,NEXT_PUBLIC_URL=NEXT_PUBLIC_URL:latest" \
59+
--memory 4Gi \
60+
--cpu 2 \
61+
--concurrency 160 \
62+
--max-instances 3 \
63+
--min-instances 1 \
64+
--no-cpu-throttling \
65+
--timeout 900
66+
67+
- name: Deploy Worker service to Cloud Run
68+
run: |
69+
gcloud run deploy ${{ env.SERVICE_WORKER }} \
70+
--image ${{ env.IMAGE_NAME }}:${{ steps.image_tag.outputs.tag }} \
71+
--platform managed \
72+
--region ${{ env.REGION }} \
73+
--allow-unauthenticated \
74+
--port 8000 \
75+
--set-secrets "ENV_MODE=ENV_MODE:latest,REDIS_URL=REDIS_URL:latest,SUPABASE_URL=SUPABASE_URL:latest,SUPABASE_ANON_KEY=SUPABASE_ANON_KEY:latest,SUPABASE_SERVICE_ROLE_KEY=SUPABASE_SERVICE_ROLE_KEY:latest,ANTHROPIC_API_KEY=ANTHROPIC_API_KEY:latest,OPENAI_API_KEY=OPENAI_API_KEY:latest,OPENROUTER_API_KEY=OPENROUTER_API_KEY:latest,MORPH_API_KEY=MORPH_API_KEY:latest,MODEL_TO_USE=MODEL_TO_USE:latest,CLERK_SECRET_KEY=CLERK_SECRET_KEY:latest,CLERK_DOMAIN=CLERK_DOMAIN:latest,DODO_PAYMENTS_API_KEY=DODO_PAYMENTS_API_KEY:latest,DODO_PAYMENTS_WEBHOOK_SECRET=DODO_PAYMENTS_WEBHOOK_SECRET:latest,TAVILY_API_KEY=TAVILY_API_KEY:latest,FIRECRAWL_API_KEY=FIRECRAWL_API_KEY:latest,FIRECRAWL_URL=FIRECRAWL_URL:latest,DAYTONA_API_KEY=DAYTONA_API_KEY:latest,DAYTONA_SERVER_URL=DAYTONA_SERVER_URL:latest,DAYTONA_TARGET=DAYTONA_TARGET:latest,LANGFUSE_PUBLIC_KEY=LANGFUSE_PUBLIC_KEY:latest,LANGFUSE_SECRET_KEY=LANGFUSE_SECRET_KEY:latest,LANGFUSE_HOST=LANGFUSE_HOST:latest,FREESTYLE_API_KEY=FREESTYLE_API_KEY:latest,FEATURE_FLAGS_ENABLED=FEATURE_FLAGS_ENABLED:latest,PIPEDREAM_CLIENT_ID=PIPEDREAM_CLIENT_ID:latest,PIPEDREAM_CLIENT_SECRET=PIPEDREAM_CLIENT_SECRET:latest,PIPEDREAM_PROJECT_ID=PIPEDREAM_PROJECT_ID:latest,PIPEDREAM_X_PD_ENVIRONMENT=PIPEDREAM_X_PD_ENVIRONMENT:latest,SMITHERY_API_KEY=SMITHERY_API_KEY:latest,MCP_CREDENTIAL_ENCRYPTION_KEY=MCP_CREDENTIAL_ENCRYPTION_KEY:latest,GOOGLE_API_KEY=GOOGLE_API_KEY:latest,NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY:latest,NEXT_PUBLIC_URL=NEXT_PUBLIC_URL:latest" \
76+
--memory 4Gi \
77+
--cpu 2 \
78+
--concurrency 80 \
79+
--max-instances 2 \
80+
--min-instances 1 \
81+
--no-cpu-throttling \
82+
--timeout 900 \
83+
--command="uv" \
84+
--args="run,python,worker_service.py"
85+
86+
- name: Output deployment URLs
87+
run: |
88+
echo "API Service URL: $(gcloud run services describe ${{ env.SERVICE_API }} --region=${{ env.REGION }} --format='value(status.url)')"
89+
echo "Worker Service URL: $(gcloud run services describe ${{ env.SERVICE_WORKER }} --region=${{ env.REGION }} --format='value(status.url)')"

.github/workflows/docker-build.yml

Lines changed: 0 additions & 90 deletions
This file was deleted.

.github/workflows/update-PROD.yml

Lines changed: 0 additions & 25 deletions
This file was deleted.

README.md

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ Build, run, and ship full-stack applications with an agent that codes, executes,
3535

3636
Cheatcode is a full-stack application that pairs a Next.js dashboard with a FastAPI backend to provide an AI agent capable of:
3737

38-
- Creating and modifying projects and threads with a collaborative chat interface
39-
- Executing actions inside isolated sandboxes using Daytona for code execution and app previews
38+
- Creating and modifying projects and threads with a collaborative chat interface
39+
- Executing all code operations in isolated sandboxes using Daytona (required for file operations, shell commands, and app previews)
4040
- Integrating with multiple LLM providers including OpenAI, Anthropic, OpenRouter, and Groq via LiteLLM
4141
- Managing authentication and data through Supabase with Redis for queues and caching
4242
- Supporting web browsing and crawling via external APIs with optional billing and usage tracking
@@ -121,11 +121,11 @@ graph TD
121121

122122
- **Supabase project** with URL, anon key, and service role key
123123
- **Clerk application** with publishable key and secret key
124+
- **Daytona account** with API key, server URL, and target for sandbox code execution and app previews
124125
- **At least one LLM provider**: OpenAI, Anthropic, OpenRouter, or Groq API key
125126

126127
### Optional Integrations
127128

128-
- **Daytona account** for sandbox code execution and app previews
129129
- **Sentry** for error monitoring
130130
- **Langfuse** for LLM observability
131131

@@ -155,16 +155,16 @@ CLERK_SECRET_KEY=YOUR_CLERK_SECRET_KEY
155155
# Redis (Docker Compose uses service name 'redis')
156156
REDIS_URL=redis://redis:6379
157157
158+
# Sandbox Integration (Required)
159+
DAYTONA_API_KEY=YOUR_DAYTONA_API_KEY
160+
DAYTONA_SERVER_URL=YOUR_DAYTONA_SERVER_URL
161+
DAYTONA_TARGET=YOUR_DAYTONA_TARGET
162+
158163
# LLM Providers (choose at least one)
159164
OPENAI_API_KEY=YOUR_OPENAI_API_KEY
160165
ANTHROPIC_API_KEY=YOUR_ANTHROPIC_API_KEY
161166
OPENROUTER_API_KEY=YOUR_OPENROUTER_API_KEY
162167
163-
# Optional: Sandbox Integration
164-
DAYTONA_API_KEY=YOUR_DAYTONA_API_KEY
165-
DAYTONA_SERVER_URL=YOUR_DAYTONA_SERVER_URL
166-
DAYTONA_TARGET=YOUR_DAYTONA_TARGET
167-
168168
# Optional: External Services
169169
TAVILY_API_KEY=YOUR_TAVILY_API_KEY
170170
FIRECRAWL_API_KEY=YOUR_FIRECRAWL_API_KEY
@@ -214,6 +214,7 @@ docker compose up --build
214214
2. **Frontend Access**: Visit http://localhost:3000 and sign in with Clerk
215215
3. **Create Project**: Create a new project and thread
216216
4. **Test Agent**: Send a message and start the agent
217+
5. **Verify Sandbox**: Ensure Daytona credentials are working - the agent cannot execute code without a properly configured Daytona sandbox environment
217218

218219
## Local Development
219220

@@ -272,9 +273,9 @@ npm run dev
272273
| `ANTHROPIC_API_KEY` | * | Anthropic API key |
273274
| `OPENROUTER_API_KEY` | * | OpenRouter API key |
274275
| `GROQ_API_KEY` | * | Groq API key |
275-
| `DAYTONA_API_KEY` | No | Daytona API key for sandboxes |
276-
| `DAYTONA_SERVER_URL` | No | Daytona server URL |
277-
| `DAYTONA_TARGET` | No | Daytona target environment |
276+
| `DAYTONA_API_KEY` | Yes | Daytona API key for sandbox code execution |
277+
| `DAYTONA_SERVER_URL` | Yes | Daytona server URL |
278+
| `DAYTONA_TARGET` | Yes | Daytona target environment |
278279
| `TAVILY_API_KEY` | No | Tavily API key for web search |
279280
| `FIRECRAWL_API_KEY` | No | Firecrawl API key for web scraping |
280281
| `LANGFUSE_PUBLIC_KEY` | No | Langfuse public key for LLM observability |
@@ -527,10 +528,11 @@ sudo usermod -aG docker $USER
527528
- Check rate limits and usage quotas
528529
- Review backend logs for LLM errors
529530

530-
3. **Sandbox Issues**
531-
- Ensure Daytona credentials are configured
531+
3. **Sandbox Issues** (Required for core functionality)
532+
- Ensure Daytona credentials are configured (required for code execution)
532533
- Check Daytona service status
533534
- Verify network connectivity to Daytona servers
535+
- Note: The agent cannot execute code or create files without working Daytona integration
534536

535537
### Getting Help
536538

backend/Dockerfile

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,19 @@ COPY --chown=app:app . .
2323
USER app
2424

2525
ENV PYTHONPATH=/app
26-
EXPOSE 8000
26+
# Support both local development and Cloud Run PORT env var
27+
ENV PORT=8000
28+
EXPOSE $PORT
2729

2830
# Container health-check
29-
HEALTHCHECK --interval=30s --timeout=10s --retries=3 CMD curl -f http://localhost:8000/api/health || exit 1
31+
HEALTHCHECK --interval=30s --timeout=10s --retries=3 CMD curl -f http://localhost:${PORT}/api/health || exit 1
3032

3133
# Gunicorn – compute optimal workers (2×CPU+1) at runtime
3234
CMD ["sh", "-c", "CPU=$(getconf _NPROCESSORS_ONLN); WORKERS=$((2*CPU+1)); exec \
3335
uv run gunicorn main:app \
3436
--workers ${WORKERS} \
3537
--worker-class uvicorn.workers.UvicornWorker \
36-
--bind 0.0.0.0:8000 \
38+
--bind 0.0.0.0:${PORT} \
3739
--timeout 1800 \
3840
--graceful-timeout 600 \
3941
--keep-alive 1800 \

0 commit comments

Comments
 (0)