با Streamlit، Gemini Pro، Vertex AI و BigQuery یک برنامه ریز رژیم غذایی مبتنی بر هوش مصنوعی بسازید و استقرار دهید.

1. مقدمه

9370c0f92c692ebb.png

در این نرم افزار کد یاد خواهید گرفت که چگونه یک برنامه ریز رژیم غذایی عامل با هوش مصنوعی بسازید و به کار بگیرید. برای رابط کاربری با استفاده از Streamlit، مدل LLM با استفاده از Gemini Pro 2.5، Agentic AI Engine Orchestrator با استفاده از Vertex AI برای توسعه Agentic AI، BigQuery برای داده های ذخیره و Cloud Run برای استقرار.

از طریق کد لبه، شما یک رویکرد گام به گام را به شرح زیر به کار خواهید گرفت:

  1. پروژه Google Cloud خود را آماده کنید و تمام API مورد نیاز را روی آن فعال کنید
  2. با استفاده از streamlit، Vertex AI و BigQuery برنامه ریز رژیم غذایی هوش مصنوعی Agentic بسازید
  3. برنامه را در Cloud Run مستقر کنید

نمای کلی معماری

84e3f3620dc4ed68.png

پیش نیاز

  • یک پروژه Google Cloud Platform (GCP) با فعال کردن صورت‌حساب.
  • دانش پایه پایتون

چیزی که یاد خواهید گرفت

  • چگونه با استفاده از streamlit، Vertex AI و ذخیره داده‌ها در BigQuery برنامه‌ریزی غذایی مبتنی بر هوش مصنوعی بسازیم.
  • نحوه استقرار برنامه در Cloud Run

آنچه شما نیاز دارید

  • مرورگر وب کروم
  • یک اکانت جیمیل
  • یک پروژه Cloud با فعال کردن صورت‌حساب

2. راه اندازی اولیه و الزامات

تنظیم محیط خود به خود

  1. به Google Cloud Console وارد شوید و یک پروژه جدید ایجاد کنید یا از یک موجود استفاده مجدد کنید. اگر قبلاً یک حساب Gmail یا Google Workspace ندارید، باید یک حساب ایجاد کنید .

fbef9caa1602edd0.png

37d264871000675d.png

5e3ff691252acf41.png

  • نام پروژه نام نمایشی برای شرکت کنندگان این پروژه است. این یک رشته کاراکتری است که توسط API های Google استفاده نمی شود. همیشه می توانید آن را به روز کنید.
  • شناسه پروژه در تمام پروژه‌های Google Cloud منحصربه‌فرد است و تغییرناپذیر است (پس از تنظیم نمی‌توان آن را تغییر داد). Cloud Console به طور خودکار یک رشته منحصر به فرد تولید می کند. معمولاً برای شما مهم نیست که چیست. در اکثر کدها، باید شناسه پروژه خود را ارجاع دهید (معمولاً با نام PROJECT_ID شناخته می شود). اگر شناسه تولید شده را دوست ندارید، ممکن است یک شناسه تصادفی دیگر ایجاد کنید. از طرف دیگر، می‌توانید خودتان را امتحان کنید، و ببینید آیا در دسترس است یا خیر. پس از این مرحله نمی توان آن را تغییر داد و در طول مدت پروژه باقی می ماند.
  • برای اطلاع شما، مقدار سومی وجود دارد، Project Number که برخی از API ها از آن استفاده می کنند. در مورد هر سه این مقادیر در مستندات بیشتر بیاموزید.
  1. در مرحله بعد، برای استفاده از منابع Cloud/APIها باید صورتحساب را در کنسول Cloud فعال کنید . اجرا کردن از طریق این کد لبه هزینه زیادی نخواهد داشت. برای خاموش کردن منابع برای جلوگیری از تحمیل صورت‌حساب فراتر از این آموزش، می‌توانید منابعی را که ایجاد کرده‌اید حذف کنید یا پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان 300 دلاری هستند.

3. قبل از شروع

راه اندازی Cloud Project در Cloud Shell Editor

این کد لبه فرض می کند که شما قبلاً یک پروژه Google Cloud با فعال بودن صورتحساب دارید. اگر هنوز آن را ندارید، می توانید دستورالعمل های زیر را برای شروع دنبال کنید.

  1. در Google Cloud Console ، در صفحه انتخاب پروژه، یک پروژه Google Cloud را انتخاب یا ایجاد کنید.
  2. مطمئن شوید که صورتحساب برای پروژه Cloud شما فعال است. با نحوه بررسی فعال بودن صورت‌حساب در پروژه آشنا شوید.
  3. شما از Cloud Shell استفاده خواهید کرد، یک محیط خط فرمان در حال اجرا در Google Cloud که با bq از قبل بارگذاری شده است. روی Activate Cloud Shell در بالای کنسول Google Cloud کلیک کنید.

26f20e837ff06119.png

  1. پس از اتصال به Cloud Shell، با استفاده از دستور زیر بررسی می‌کنید که قبلاً احراز هویت شده‌اید و پروژه به ID پروژه شما تنظیم شده است:
gcloud auth list
  1. دستور زیر را در Cloud Shell اجرا کنید تا تأیید کنید که دستور gcloud از پروژه شما اطلاع دارد.
gcloud config list project
  1. اگر پروژه شما تنظیم نشده است، از دستور زیر برای تنظیم آن استفاده کنید:
gcloud config set project <YOUR_PROJECT_ID>

همچنین می‌توانید شناسه PROJECT_ID را در کنسول ببینید

bb98435b79995b15.jpeg

روی آن کلیک کنید و تمام پروژه و شناسه پروژه را در سمت راست خواهید دید

ffa73dee57de5307.jpeg

  1. API های مورد نیاز را از طریق دستور زیر فعال کنید. این ممکن است چند دقیقه طول بکشد، پس لطفا صبور باشید.
gcloud services enable aiplatform.googleapis.com \
                           run.googleapis.com \
                           cloudbuild.googleapis.com \
                           cloudresourcemanager.googleapis.com \
                    bigquery.googleapis.com

در اجرای موفقیت آمیز دستور، باید پیامی مشابه تصویر زیر مشاهده کنید:

Operation "operations/..." finished successfully.

جایگزین دستور gcloud از طریق کنسول با جستجوی هر محصول یا استفاده از این پیوند است.

اگر هر یک از API از دست رفته است، همیشه می توانید آن را در طول پیاده سازی فعال کنید.

برای دستورات و استفاده از gcloud به اسناد مراجعه کنید.

راه اندازی دایرکتوری کاری برنامه

  1. روی دکمه Open Editor کلیک کنید، با این کار یک Cloud Shell Editor باز می شود، ما می توانیم کد خود را اینجا بنویسیم 6f8e18e89d3198c0.png
  2. مطمئن شوید که پروژه Cloud Code در گوشه سمت چپ پایین (نوار وضعیت) ویرایشگر Cloud Shell تنظیم شده است، همانطور که در تصویر زیر مشخص شده است و روی پروژه فعال Google Cloud که در آن صورت‌حساب را فعال کرده‌اید، تنظیم شده است. در صورت درخواست مجوز دهید . ممکن است پس از مقداردهی اولیه ویرایشگر پوسته Cloud کمی طول بکشد تا دکمه Cloud Code - Sign In ظاهر شود، لطفا صبور باشید.

4e372d87c51afa30.png

در ادامه محیط پایتون خود را آماده می کنیم

راه اندازی محیط

محیط مجازی پایتون را آماده کنید

مرحله بعدی آماده سازی محیط توسعه است. ما از Python 3.12 در این Codelab استفاده خواهیم کرد و از python virtualenv برای ساده سازی نیاز به ایجاد و مدیریت نسخه پایتون و محیط مجازی استفاده خواهیم کرد.

  1. اگر هنوز ترمینال را باز نکرده‌اید، آن را با کلیک کردن روی Terminal -> New Terminal باز کنید یا از Ctrl + Shift + C استفاده کنید.

8635b60ae2f45bbc.jpeg

  1. پوشه جدیدی ایجاد کنید و با دستور زیر مکان را به این پوشه تغییر دهید
mkdir agent_diet_planner
cd agent_diet_planner
  1. با دستور زیر virtualenv جدید ایجاد کنید
python -m venv .env
  1. virtualenv را با دستور زیر فعال کنید
source .env/bin/activate
  1. requirements.txt را ایجاد کنید. روی File → New Text File کلیک کنید و محتوای زیر را پر کنید. سپس آن را به عنوان requirements.txt ذخیره کنید
streamlit==1.33.0
google-cloud-aiplatform
google-cloud-bigquery
pandas==2.2.2
db-dtypes==1.2.0
pyarrow==16.1.0
  1. سپس با اجرای دستور زیر تمامی وابستگی ها را از request.txt نصب کنید
pip install -r requirements.txt
  1. دستور زیر را تایپ کنید تا بررسی کنید که آیا تمام وابستگی های کتابخانه های پایتون نصب شده اند یا خیر
pip list

راه اندازی فایل های پیکربندی

اکنون باید فایل های پیکربندی این پروژه را تنظیم کنیم. فایل های پیکربندی برای ذخیره اعتبار حساب متغیر و سرویس استفاده می شود.

  1. اولین قدم این است که یک حساب کاربری ایجاد کنید. حساب سرویس را در جستجو تایپ کنید سپس روی حساب سرویس کلیک کنید. 18c210d5d1e2a666.png
  2. روی + ایجاد حساب سرویس کلیک کنید. نام حساب سرویس را وارد کنید سپس روی ایجاد و ادامه کلیک کنید. 67cad62d367e236a.png
  3. در مجوز، نقش کاربر حساب سرویس را انتخاب کنید. روی + افزودن نقش دیگری کلیک کنید و نقش IAM را انتخاب کنید: BigQuery Admin، Cloud Run Admin، Cloud Run Invoker، Vertex AI Service Agent و Vertex AI User سپس روی Done کلیک کنید. be84afdc13678f6c.png
  4. روی ایمیل حساب سرویس کلیک کنید، روی کلید تب کلیک کنید، کلید افزودن → ایجاد کلید جدید را کلیک کنید. 50989af3bb9e1538.png
  5. json را انتخاب کنید سپس روی Create کلیک کنید. این فایل حساب سرویس را برای مرحله بعدی در محلی ذخیره کنید a4a119672da532da.png
  6. پوشه ای به نام streamlit با پیکربندی زیر ایجاد کنید. ماوس کلیک راست کنید، روی New Folder کلیک کنید و نام پوشه .streamlit را تایپ کنید
  7. در پوشه .streamlit راست کلیک کنید سپس روی New File کلیک کنید و مقدار زیر را پر کنید. سپس آن را به عنوان secrets.toml ذخیره کنید
# secrets.toml (for Streamlit sharing)
# Store in .streamlit/secrets.toml

[gcp]
project_id = "your_gcp_project"
location = "us-central1"

[gcp_service_account]
type = "service_account"
project_id = "your-project-id"
private_key_id = "your-private-key-id"
private_key = '''-----BEGIN PRIVATE KEY-----
YOUR_PRIVATE_KEY_HERE
-----END PRIVATE KEY-----'''
client_email = "your-sa@project-id.iam.gserviceaccount.com"
client_id = "your-client-id"
auth_uri = "https://accounts.google.com/o/oauth2/auth"
token_uri = "https://oauth2.googleapis.com/token"
auth_provider_x509_cert_url = "https://www.googleapis.com/oauth2/v1/certs"
client_x509_cert_url = "https://www.googleapis.com/robot/v1/metadata/x509/your-sa%40project-id.iam.gserviceaccount.com"
  1. مقدار به‌روزرسانی project_id ، private_key_id ، private_key ، client_email ، client_id , and auth_provider_x509_cert_url بر اساس حساب سرویس شما که در مرحله قبل ایجاد شده است

مجموعه داده BigQuery را آماده کنید

مرحله بعدی ایجاد یک مجموعه داده BigQuery برای ذخیره نتایج تولید در BigQuery است.

  1. BigQuery را در جستجو تایپ کنید سپس روی BigQuery کلیک کنید.
  2. کلیک کنید 2f2e87396859bc74.png سپس روی Create Dataset کلیک کنید
  3. شناسه مجموعه داده diet_planner_data را وارد کنید سپس روی ایجاد مجموعه داده کلیک کنید 2055cda1ee0360bd.png

4. برنامه Agent Diet Planner بسازید

ما یک رابط وب ساده با 4 ورودی خواهیم ساخت که شبیه به این است

43b20db2d5f94f38.png

وزن، قد، سن و جنسیت را بر اساس نمایه خود تغییر دهید و سپس روی ایجاد کلیک کنید. مدل LLM Gemini Pro 2.5 را در کتابخانه Vertex AI فراخوانی می کند و نتایج تولید شده را در BigQuery ذخیره می کند.

کد به منظور طولانی نشدن 6 قسمت از هم جدا می شود.

ایجاد تابع محاسبه وضعیت bmi

  1. روی پوشه agent_diet_planner → New File .. → وارد کردن نام فایل bmi_calc.py کلیک راست کرده و enter را فشار دهید
  2. کد را با زیر پر کنید
# Add this function to calculate BMI and health status
def calculate_bmi_status(weight, height):
   """
   Calculate BMI and return status message
   """
   height_m = height / 100  # Convert cm to meters
   bmi = weight / (height_m ** 2)
  
   if bmi < 18.5:
       status = "underweight"
       message = "⚠️ Your BMI suggests you're underweight. Consider increasing calorie intake with nutrient-dense foods."
   elif 18.5 <= bmi < 25:
       status = "normal"
       message = "✅ Your BMI is in the healthy range. Let's maintain this balance!"
   elif 25 <= bmi < 30:
       status = "overweight"
       message = "⚠️ Your BMI suggests you're overweight. Focus on gradual weight loss through balanced nutrition."
   else:
       status = "obese"
       message = "❗ Your BMI indicates obesity. Please consult a healthcare provider for personalized guidance."
  
   return {
       "value": round(bmi, 1),
       "status": status,
       "message": message
   }

برنامه های اصلی برنامه ریز رژیم غذایی عامل ایجاد کنید

  1. روی پوشه agent_diet_planner → New File .. → input name file app.py کلیک راست کنید سپس enter را فشار دهید.
  2. کد را با زیر پر کنید
import os
from google.oauth2 import service_account
import streamlit as st
from google.cloud import bigquery
from vertexai.preview.generative_models import GenerativeModel
import vertexai
import datetime
import time
import pandas as pd
from bmi_calc import calculate_bmi_status

# Get configuration from environment
PROJECT_ID = os.environ.get("GCP_PROJECT_ID", "your_gcp_project_id")
LOCATION = os.environ.get("GCP_LOCATION", "us-central1")

#CONSTANTS Dataset and table in BigQuery
DATASET = "diet_planner_data"
TABLE = "user_plans"

# Initialize Vertex AI
vertexai.init(project=PROJECT_ID, location=LOCATION)

# Initialize BigQuery client
try:
   # For Cloud Run, use default credentials
   bq_client = bigquery.Client()
except:
   # For local development, use service account from secrets
   if "gcp_service_account" in st.secrets:
       service_account_info = dict(st.secrets["gcp_service_account"])
       credentials = service_account.Credentials.from_service_account_info(service_account_info)
       bq_client = bigquery.Client(credentials=credentials, project=PROJECT_ID)
   else:
       st.error("BigQuery client initialization failed")
       st.stop()

مقدار your_gcp_project_id را با شناسه پروژه خود تغییر دهید.

ایجاد برنامه های اصلی برنامه ریز رژیم غذایی - setup_bq_tables

در این بخش تابعی به نام setup_bq_table با 1 پارامتر ورودی bq_client ایجاد می کنیم. این تابع طرحواره را در جدول bigquery تعریف می کند و در صورت عدم وجود جدولی ایجاد می کند.

کد را با کد زیر زیر در app.py پر کنید

# Create BigQuery table if not exists
def setup_bq_table(bq_client):
   dataset_id = f"{st.secrets['gcp']['project_id']}.{DATASET}"
   table_id = f"{dataset_id}.{TABLE}"
  
   schema = [
       bigquery.SchemaField("user_id", "STRING", mode="REQUIRED"),
       bigquery.SchemaField("timestamp", "TIMESTAMP", mode="REQUIRED"),
       bigquery.SchemaField("weight", "FLOAT", mode="REQUIRED"),
       bigquery.SchemaField("height", "INTEGER", mode="REQUIRED"),
       bigquery.SchemaField("age", "INTEGER", mode="REQUIRED"),
       bigquery.SchemaField("gender", "STRING", mode="REQUIRED"),
       bigquery.SchemaField("diet_plan", "STRING", mode="REQUIRED")
   ]
  
   try:
       bq_client.get_table(table_id)
   except:
       table = bigquery.Table(table_id, schema=schema)
       bq_client.create_table(table)
       st.toast("BigQuery table created successfully")

برنامه های اصلی برنامه ریز رژیم غذایی عامل را ایجاد کنید - generate_diet_plan

در این قسمت تابعی با نام generate_diet_plan با 1 پارامتر ورودی ایجاد می کنیم. این تابع مدل LLM Gemini Pro 2.5 را با اعلان تعریف و ایجاد نتایج فراخوانی می کند.

کد را با کد زیر زیر در app.py پر کنید

# Generate diet plan using Gemini Pro
def generate_diet_plan(params):
   try:
       model = GenerativeModel("gemini-2.5-pro")
       prompt = f"""
       Create a personalized 7-day diet plan for:
       - {params['gender']}, {params['age']} years old
       - Weight: {params['weight']} kg
       - Height: {params['height']} cm
      
       Include:
       1. Daily calorie target
       2. Macronutrient breakdown (carbs, protein, fat)
       3. Meal timing and frequency
       4. Food recommendations
       5. Hydration guidance
      
       Make the plan:
       - Nutritionally balanced
       - Practical for daily use
       - Culturally adaptable
       - With portion size guidance
       """
      
       response = model.generate_content(prompt)
       return response.text
   except Exception as e:
       st.error(f"AI generation error: {str(e)}")
       return None

ایجاد برنامه های اصلی برنامه ریز رژیم غذایی - save_to_bq

در این بخش تابعی به نام save_to_bq با 3 پارامتر ورودی bq_client ، user_id و plan ایجاد می کنیم. این تابع نتیجه تولید را در جدول bigquery ذخیره می کند

کد را با کد زیر زیر در app.py پر کنید

# Save user data to BigQuery
def save_to_bq(bq_client, user_id, plan):
   try:
       dataset_id = f"{st.secrets['gcp']['project_id']}.{DATASET}"
       table_id = f"{dataset_id}.{TABLE}"
      
       row = {
           "user_id": user_id,
           "timestamp": datetime.datetime.utcnow().isoformat(),
           "weight": st.session_state.user_data["weight"],
           "height": st.session_state.user_data["height"],
           "age": st.session_state.user_data["age"],
           "gender": st.session_state.user_data["gender"],
           "diet_plan": plan
       }
      
       errors = bq_client.insert_rows_json(table_id, [row])
       if errors:
           st.error(f"BigQuery error: {errors}")
       else:
           return True
   except Exception as e:
       st.error(f"Data saving error: {str(e)}")
       return False

برنامه های اصلی برنامه ریز رژیم غذایی عامل را ایجاد کنید - اصلی

در این قسمت تابعی به نام main بدون پارامتر ورودی ایجاد می کنیم. این تابع بیشتر اسکریپت رابط کاربری ساده، نمایش نتیجه تولید شده، نمایش نتایج تولید شده تاریخی از جدول bigquery و برای دانلود داده ها در فایل علامت گذاری را کنترل می کند.

کد را با کد زیر زیر در app.py پر کنید

# Streamlit UI
def main():
   st.set_page_config(page_title="AI Diet Planner", page_icon="🍏", layout="wide")
  
   # Initialize session state
   if "user_data" not in st.session_state:
       st.session_state.user_data = None
   if "diet_plan" not in st.session_state:
       st.session_state.diet_plan = None
  
   # Initialize clients
   #bq_client = init_clients()
   setup_bq_table(bq_client)
  
   st.title("🍏 AI-Powered Diet Planner")
   st.markdown("""
   <style>
   .stProgress > div > div > div > div {
       background-color: #4CAF50;
   }
   [data-testid="stForm"] {
       background: #f0f5ff;
       padding: 20px;
       border-radius: 10px;
       border: 1px solid #e6e9ef;
   }
   </style>
   """, unsafe_allow_html=True)
  
   # User input form
   with st.form("user_profile", clear_on_submit=False):
       st.subheader("Your Profile")
       col1, col2 = st.columns(2)
      
       with col1:
           weight = st.number_input("Weight (kg)", min_value=30.0, max_value=200.0, value=70.0)
           height = st.number_input("Height (cm)", min_value=100, max_value=250, value=170)
          
       with col2:
           age = st.number_input("Age", min_value=18, max_value=100, value=30)
           gender = st.selectbox("Gender", ["Man", "Woman"])
      
       submitted = st.form_submit_button("Generate Diet Plan")
      
       if submitted:
           user_data = {
               "weight": weight,
               "height": height,
               "age": age,
               "gender": gender
           }

           st.session_state.user_data = user_data
           # Calculate BMI
           bmi_result = calculate_bmi_status(weight, height)

           # Display BMI results in a visually distinct box
           with st.container():
               st.subheader("📊 Your Health Assessment")
               col1, col2 = st.columns([1, 3])
      
               with col1:
                   st.metric("BMI", bmi_result["value"])
          
               with col2:
                   if bmi_result["status"] != "normal":
                       st.warning(bmi_result["message"])
                   else:
                       st.success(bmi_result["message"])
      
           # Add BMI scale visualization
           st.markdown(f"""
           <div style="background:#f0f2f6;padding:10px;border-radius:10px;margin-top:10px">
           <small>BMI Scale:</small><br>
           <div style="display:flex;height:20px;background:linear-gradient(90deg,
           #4e79a7 0%,
           #4e79a7 18.5%,
           #60bd68 18.5%,
           #60bd68 25%,
           #f28e2b 25%,
           #f28e2b 30%,
           #e15759 30%,
           #e15759 100%);position:relative">
           <div style="position:absolute;left:{min(100, max(0, (bmi_result["value"]/40)*100))}%;top:-5px">

           </div>
           </div>
           <div style="display:flex;justify-content:space-between">
           <span>Underweight (<18.5)</span>
           <span>Healthy (18.5-25)</span>
           <span>Overweight (25-30)</span>
           <span>Obese (30+)</span>
           </div>
           </div>
           """, unsafe_allow_html=True)

           # Store BMI in session state
           st.session_state.bmi = bmi_result         
  
   # Plan generation and display
   if submitted and st.session_state.user_data:
       with st.spinner("🧠 Generating your personalized diet plan using Gemini AI..."):
           #diet_plan = generate_diet_plan(st.session_state.user_data)
           diet_plan = generate_diet_plan({**st.session_state.user_data,"bmi": bmi_result["value"],
                                           "bmi_status": bmi_result["status"]
           })

           if diet_plan:
               st.session_state.diet_plan = diet_plan
              
               # Generate unique user ID
               user_id = f"user_{int(time.time())}"
              
               # Save to BigQuery
               if save_to_bq(bq_client, user_id, diet_plan):
                   st.toast("✅ Plan saved to database!")
  
   # Display generated plan
   if st.session_state.diet_plan:
       st.subheader("Your Personalized Diet Plan")
       st.markdown("---")
       st.markdown(st.session_state.diet_plan)
      
       # Download button
       st.download_button(
           label="Download Plan",
           data=st.session_state.diet_plan,
           file_name="my_diet_plan.md",
           mime="text/markdown"
       )
      
       # Show history
       st.subheader("Your Plan History")
       try:
           query = f"""
               SELECT timestamp, weight, height, age, gender
               FROM `{st.secrets['gcp']['project_id']}.{DATASET}.{TABLE}`
               WHERE user_id LIKE 'user_%'
               ORDER BY timestamp DESC
               LIMIT 5
           """
           history = bq_client.query(query).to_dataframe()
           if not history.empty:
               history["timestamp"] = pd.to_datetime(history["timestamp"])
               st.dataframe(history.style.format({
                   "weight": "{:.1f} kg",
                   "height": "{:.0f} cm"
               }))
           else:
               st.info("No previous plans found")
       except Exception as e:
           st.error(f"History load error: {str(e)}")

if __name__ == "__main__":
   main()

کد را با نام app.py ذخیره کنید.

5. استقرار برنامه‌ها از ساخت ابری برای اجرای Cloud استفاده می‌کنند

اکنون، البته ما می خواهیم این برنامه شگفت انگیز را به دیگران نشان دهیم. برای انجام این کار، می توانیم این برنامه را بسته بندی کنیم و آن را به عنوان یک سرویس عمومی که برای دیگران قابل دسترسی است، در Cloud Run مستقر کنیم. برای انجام این کار، بیایید معماری را دوباره مرور کنیم

84e3f3620dc4ed68.png

ابتدا به Dockerfile نیاز داریم، روی File->New Text File کلیک کنید و کد زیر را کپی کنید و سپس آن را به عنوان Dockerfile ذخیره کنید.

# Use official Python image
FROM python:3.12-slim

# Set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
ENV PORT 8080

# Install system dependencies
RUN apt-get update && \
   apt-get install -y --no-install-recommends \
   build-essential \
   libpq-dev \
   && rm -rf /var/lib/apt/lists/*

# Set working directory
WORKDIR /app

# Copy requirements
COPY requirements.txt .

# Install Python dependencies
RUN pip install --no-cache-dir -r requirements.txt

# Copy application files
COPY . .

# Expose port
EXPOSE $PORT

# Run the application
CMD ["streamlit", "run", "app.py", "--server.port", "8080", "--server.address", "0.0.0.0"]

در مرحله بعد، ما cloudbuid.yaml را برای ساخت برنامه‌ها ایجاد می‌کنیم تا به تصاویر داکر تبدیل شوند، به رجیستری مصنوع فشار وارد کنند و در اجرای ابری مستقر شوند.

روی File->New Text File کلیک کنید و کد زیر را کپی کنید و سپس آن را به عنوان cloudbuild.yaml ذخیره کنید.

steps:
 # Build Docker image
 - name: 'gcr.io/cloud-builders/docker'
   args: ['build', '-t', 'gcr.io/$PROJECT_ID/diet-planner:$BUILD_ID', '--no-cache',
        '--progress=plain',
        '.']
   id: 'Build'
   timeout: 1200s
   waitFor: ['-']
   dir: '.'
  # Push to Container Registry
 - name: 'gcr.io/cloud-builders/docker'
   args: ['push', 'gcr.io/$PROJECT_ID/diet-planner:$BUILD_ID']
   id: 'Push'
   waitFor: ['Build']
  # Deploy to Cloud Run
 - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
   entrypoint: gcloud
   args:
     - 'run'
     - 'deploy'
     - 'diet-planner-service'
     - '--image=gcr.io/$PROJECT_ID/diet-planner:$BUILD_ID'
     - '--port=8080'
     - '--region=us-central1'
     - '--platform=managed'
     - '--allow-unauthenticated'
     - '--set-env-vars=GCP_PROJECT_ID=$PROJECT_ID,GCP_LOCATION=us-central1'
     - '--cpu=1'
     - '--memory=1Gi'
     - '--timeout=300'
   waitFor: ['Push']

options:
 logging: CLOUD_LOGGING_ONLY
 machineType: 'E2_HIGHCPU_8'
 diskSizeGb: 100

images:
 - 'gcr.io/$PROJECT_ID/diet-planner:$BUILD_ID'

در این مرحله، ما در حال حاضر همه فایل‌های مورد نیاز برای ساخت برنامه‌ها را داریم تا به تصاویر docker تبدیل شوند، به رجیستری مصنوع فشار داده و آن را در Cloud Run مستقر کنیم، بیایید آن را مستقر کنیم. به ترمینال Cloud Shell بروید و مطمئن شوید که پروژه فعلی برای پروژه فعال شما پیکربندی شده است، در غیر این صورت از دستور gcloud configure برای تنظیم شناسه پروژه استفاده کرده اید:

gcloud config set project [PROJECT_ID]

سپس، دستور زیر را اجرا کنید تا برنامه هایی را بسازید تا به تصاویر داکر تبدیل شوند، به رجیستری مصنوع فشار دهید و آن را در Cloud Run اجرا کنید.

gcloud builds submit --config cloudbuild.yaml

کانتینر Docker را بر اساس Dockerfile که قبلاً ارائه کرده بودیم می‌سازد و آن را به رجیستری Artifact فشار می‌دهد. پس از آن تصویر ساخته شده را در Cloud Run مستقر خواهیم کرد. تمام این فرآیند در مراحل cloudbuild.yaml تعریف شده است.

توجه داشته باشید که ما در اینجا اجازه دسترسی بدون احراز هویت را می دهیم زیرا این یک برنامه آزمایشی است. توصیه این است که از احراز هویت مناسب برای برنامه های تجاری و تولیدی خود استفاده کنید.

پس از تکمیل استقرار، می‌توانیم آن را در صفحه Cloud Run بررسی کنیم، Cloud Run را در نوار جستجوی کنسول ابری بالای صفحه جستجو کنیم و روی محصول Cloud Run کلیک کنیم.

3c460765656fc072.png

پس از آن می توانید سرویس مستقر شده فهرست شده در صفحه سرویس Cloud Run را بررسی کنید، روی سرویس کلیک کنید تا بتوانیم URL سرویس را دریافت کنیم.

93dc975d3caeab0e.png

نشانی وب سرویس در نوار بالا قرار خواهد گرفت

9325464321c106f8.png ادامه دهید و از برنامه خود از پنجره ناشناس یا دستگاه تلفن همراه خود استفاده کنید. از قبل باید زنده باشد.

6. پاکسازی کنید

برای جلوگیری از تحمیل هزینه به حساب Google Cloud خود برای منابع مورد استفاده در این Codelab، این مراحل را دنبال کنید:

  1. در کنسول Google Cloud، به صفحه مدیریت منابع بروید.
  2. در لیست پروژه، پروژه ای را که می خواهید حذف کنید انتخاب کنید و سپس روی Delete کلیک کنید.
  3. در محاوره، شناسه پروژه را تایپ کنید و سپس روی Shut down کلیک کنید تا پروژه حذف شود.
  4. یا می‌توانید به Cloud Run در کنسول بروید، سرویسی را که به تازگی مستقر کرده‌اید انتخاب کرده و حذف کنید.