Streamlit, Gemini Pro, Vertex AI ve BigQuery ile yapay zeka destekli bir diyet planlayıcı oluşturma ve dağıtma

1. Giriş

9370c0f92c692ebb.png

Bu codelab'de, yapay zeka destekli bir diyet planlayıcıyı nasıl oluşturup dağıtacağınızı öğreneceksiniz. Streamlit'in kullanıldığı kullanıcı arayüzü, Gemini Pro 2.5'in kullanıldığı LLM modeli, geliştirme amaçlı Agentic AI için Vertex AI'ın kullanıldığı Agentic AI Engine Orchestrator, verileri depolamak için BigQuery ve dağıtım için Cloud Run.

Bu codelab'de aşağıdaki gibi adım adım bir yaklaşım kullanacaksınız:

  1. Google Cloud projenizi hazırlayın ve gerekli tüm API'leri etkinleştirin.
  2. Streamlit, Vertex AI ve BigQuery kullanarak yapay zeka destekli bir diyet planlayıcı oluşturma
  3. Uygulamayı Cloud Run'a dağıtma

Mimariye Genel Bakış

84e3f3620dc4ed68.png

Ön koşul

  • Faturalandırmanın etkin olduğu bir Google Cloud Platform (GCP) projesi.
  • Temel Python bilgisi

Neler öğreneceksiniz?

  • Streamlit, Vertex AI ve BigQuery'de veri depolama kullanarak Agentic AI Diet Planner oluşturma
  • Uygulamayı Cloud Run'a dağıtma

Gerekenler

  • Chrome web tarayıcısı
  • Gmail hesabı
  • Faturalandırmanın etkin olduğu bir Cloud projesi

2. Temel kurulum ve şartlar

Kendi hızınızda ortam kurulumu

  1. Google Cloud Console'da oturum açın ve yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Henüz bir Gmail veya Google Workspace hesabınız yoksa oluşturmanız gerekir.

fbef9caa1602edd0.png

37d264871000675d.png

5e3ff691252acf41.png

  • Proje adı, bu projenin katılımcıları için görünen addır. Google API'leri tarafından kullanılmayan bir karakter dizesidir. Bu bilgiyi istediğiniz zaman güncelleyebilirsiniz.
  • Proje kimliği, tüm Google Cloud projelerinde benzersizdir ve sabittir (ayarlandıktan sonra değiştirilemez). Cloud Console, benzersiz bir dizeyi otomatik olarak oluşturur. Genellikle bu dizenin ne olduğuyla ilgilenmezsiniz. Çoğu codelab'de proje kimliğinize (genellikle PROJECT_ID olarak tanımlanır) başvurmanız gerekir. Oluşturulan kimliği beğenmezseniz başka bir rastgele kimlik oluşturabilirsiniz. Dilerseniz kendi adınızı deneyerek kullanılabilir olup olmadığını kontrol edebilirsiniz. Bu adım tamamlandıktan sonra değiştirilemez ve proje süresince geçerli kalır.
  • Bazı API'lerin kullandığı üçüncü bir değer olan Proje Numarası da vardır. Bu üç değer hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
  1. Ardından, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i tamamlamak neredeyse hiç maliyetli değildir. Bu eğitimin ötesinde faturalandırılmayı önlemek için kaynakları kapatmak üzere oluşturduğunuz kaynakları veya projeyi silebilirsiniz. Yeni Google Cloud kullanıcıları 300 ABD doları değerinde ücretsiz deneme programından yararlanabilir.

3. Başlamadan önce

Cloud Shell Düzenleyici'de Cloud Projesi Kurulumu

Bu codelab'de, faturalandırmanın etkin olduğu bir Google Cloud projenizin olduğu varsayılmaktadır. Henüz kullanmıyorsanız başlamak için aşağıdaki talimatları uygulayabilirsiniz.

  1. Google Cloud Console'daki proje seçici sayfasında bir Google Cloud projesi seçin veya oluşturun.
  2. Cloud projeniz için faturalandırmanın etkinleştirildiğinden emin olun. Faturalandırmanın bir projede etkin olup olmadığını kontrol etmeyi öğrenin .
  3. bq'nun önceden yüklendiği, Google Cloud'da çalışan bir komut satırı ortamı olan Cloud Shell'i kullanacaksınız. Google Cloud Console'un üst kısmından Cloud Shell'i etkinleştir'i tıklayın.

26f20e837ff06119.png

  1. Cloud Shell'e bağlandıktan sonra aşağıdaki komutu kullanarak kimliğinizin doğrulanıp doğrulanmadığını ve projenin proje kimliğinize ayarlanıp ayarlanmadığını kontrol edin:
gcloud auth list
  1. gcloud komutunun projeniz hakkında bilgi sahibi olduğunu doğrulamak için Cloud Shell'de aşağıdaki komutu çalıştırın.
gcloud config list project
  1. Projeniz ayarlanmamışsa ayarlamak için aşağıdaki komutu kullanın:
gcloud config set project <YOUR_PROJECT_ID>

Alternatif olarak, PROJECT_ID kimliğini konsolda da görebilirsiniz.

bb98435b79995b15.jpeg

Bu seçeneği tıkladığınızda sağ tarafta tüm projenizi ve proje kimliğini görürsünüz.

ffa73dee57de5307.jpeg

  1. Aşağıda gösterilen komutu kullanarak gerekli API'leri etkinleştirin. Bu işlem birkaç dakika sürebilir. Lütfen bekleyin.
gcloud services enable aiplatform.googleapis.com \
                           run.googleapis.com \
                           cloudbuild.googleapis.com \
                           cloudresourcemanager.googleapis.com \
                    bigquery.googleapis.com

Komut başarıyla yürütüldüğünde aşağıda gösterilene benzer bir mesaj görürsünüz:

Operation "operations/..." finished successfully.

Gcloud komutuna alternatif olarak, her ürünü arayarak veya bu bağlantıyı kullanarak konsolu kullanabilirsiniz.

Herhangi bir API atlanırsa uygulama sırasında istediğiniz zaman etkinleştirebilirsiniz.

gcloud komutları ve kullanımı için belgelere bakın.

Uygulama Çalışma Dizini Kurulumu

  1. Düzenleyiciyi aç düğmesini tıklayın. Bu işlemle Cloud Shell Düzenleyici açılır. Kodumuzu buraya yazabiliriz. 6f8e18e89d3198c0.png
  2. Cloud Code projesinin, aşağıdaki resimde vurgulandığı gibi Cloud Shell düzenleyicisinin sol alt köşesinde (durum çubuğu) ayarlandığından ve faturalandırmanın etkin olduğu etkin Google Cloud projesine ayarlandığından emin olun. İstenirse Yetkilendir'i seçin. Cloud Shell Düzenleyici'yi başlattıktan sonra Cloud Code - Sign In (Cloud Code - Oturum Aç) düğmesinin görünmesi biraz zaman alabilir. Lütfen bekleyin.

4e372d87c51afa30.png

Ardından, Python ortamımızı hazırlayacağız.

Ortam Kurulumu

Python Sanal Ortamını Hazırlama

Bir sonraki adım, geliştirme ortamını hazırlamaktır. Bu codelab'de Python 3.12'yi kullanacağız. Python sürümü ve sanal ortam oluşturma ve yönetme ihtiyacını basitleştirmek için Python virtualenv'i kullanacağız.

  1. Terminali henüz açmadıysanız Terminal -> Yeni Terminal'i tıklayarak açın veya Ctrl + Üst Karakter + C tuşlarını kullanın.

8635b60ae2f45bbc.jpeg

  1. Aşağıdaki komutu çalıştırarak yeni bir klasör oluşturun ve konumu bu klasör olarak değiştirin.
mkdir agent_diet_planner
cd agent_diet_planner
  1. Aşağıdaki komutu çalıştırarak yeni bir virtualenv oluşturun.
python -m venv .env
  1. Aşağıdaki komutla virtualenv'i etkinleştirin.
source .env/bin/activate
  1. Oluşturma requirements.txt Dosya → Yeni Metin Dosyası'nı tıklayın ve aşağıdaki içerikle doldurun. Ardından requirements.txt olarak kaydedin.
streamlit==1.33.0
google-cloud-aiplatform
google-cloud-bigquery
pandas==2.2.2
db-dtypes==1.2.0
pyarrow==16.1.0
  1. Ardından, aşağıdaki komutu çalıştırarak requirements.txt dosyasındaki tüm bağımlılıkları yükleyin.
pip install -r requirements.txt
  1. Tüm Python kitaplığı bağımlılıklarının yüklendiğini kontrol etmek için aşağıdaki komutu yazın.
pip list

Yapılandırma dosyalarını ayarlama

Şimdi bu proje için yapılandırma dosyaları oluşturmamız gerekiyor. Yapılandırma dosyaları, değişkenleri ve hizmet hesabı kimlik bilgilerini depolamak için kullanılır.

  1. İlk adım, bir hizmet hesabı oluşturmaktır. Arama alanına hizmet hesabı yazıp hizmet hesabını tıklayın. 18c210d5d1e2a666.png
  2. + Hizmet hesabı oluştur'u tıklayın. Hizmet hesabı adını girip oluştur ve devam et'i tıklayın. 67cad62d367e236a.png
  3. İzin bölümünde, rol olarak Hizmet Hesabı Kullanıcısı'nı seçin. + Başka bir rol ekle'yi tıklayın ve IAM rolü olarak BigQuery Admin, Cloud Run Admin, Cloud Run Invoker, Vertex AI Service Agent ve Vertex AI User'ı seçin, ardından Bitti'yi tıklayın be84afdc13678f6c.png
  4. Hizmet hesabı e-postasını, sekme tuşunu, anahtar ekle'yi ve ardından yeni anahtar oluştur'u tıklayın. 50989af3bb9e1538.png
  5. JSON'u seçip Oluştur'u tıklayın. Bu hizmet hesabı dosyasını, sonraki adım için yerel olarak kaydedin a4a119672da532da.png
  6. Aşağıdaki yapılandırmayla .streamlit adlı bir klasör oluşturun. Fareyi sağ tıklayın, Yeni Klasör'ü tıklayın ve klasör adını yazın .streamlit
  7. .streamlit klasörünü sağ tıklayın, ardından Yeni Dosya'yı tıklayın ve aşağıdaki değeri girin. Ardından secrets.toml olarak kaydedin.
# 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. Önceki adımda oluşturulan hizmet hesabınıza göre project_id, private_key_id, private_key, client_email , client_id , and auth_provider_x509_cert_url değerini güncelleyin.

BigQuery veri kümesini hazırlama

Sonraki adım, oluşturma sonuçlarını BigQuery'ye kaydetmek için bir BigQuery veri kümesi oluşturmaktır.

  1. Arama kutusuna BigQuery yazıp BigQuery'yi tıklayın.
  2. 2f2e87396859bc74.png simgesini ve ardından Veri Kümesi Oluştur'u tıklayın.
  3. Veri kümesi kimliğini diet_planner_data girin ve Veri kümesi oluştur'u 2055cda1ee0360bd.png tıklayın.

4. Ajan Diet Planner uygulamaları oluşturma

Aşağıdaki gibi görünen 4 girişli basit bir web arayüzü oluşturacağız.

43b20db2d5f94f38.png

Profilinize göre ağırlığı, boyu, yaşı ve cinsiyeti değiştirin, ardından oluştur'u tıklayın. Vertex AI kitaplığında Gemini Pro 2.5 adlı LLM modelini çağırır ve oluşturulan sonuçları BigQuery'de depolar.

Kodun çok uzun olmaması için 6 parçaya ayrılır.

Create function calculate bmi status (BMI durumunu hesaplayan işlev oluştur)

  1. agent_diet_planner klasörünü sağ tıklayın → Yeni Dosya'yı seçin → dosya adını girin bmi_calc.py ardından Enter tuşuna basın.
  2. Kodu aşağıdakilerle doldurma
# 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
   }

Temsilci diyet planlayıcı ana uygulamaları oluşturma

  1. agent_diet_planner klasörünü sağ tıklayın → Yeni Dosya'yı seçin → dosya adını girin app.py ve Enter tuşuna basın.
  2. Kodu aşağıdakilerle doldurma
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 değerini proje kimliğinizle değiştirin.

Create agent diet planner main apps - setup_bq_tables

Bu bölümde, setup_bq_table adlı bir işlev oluşturacağız. Bu işlevin 1 giriş parametresi (bq_client) olacak. Bu işlev, BigQuery tablosunda şemayı tanımlar ve tablo yoksa oluşturur.

app.py içinde önceki kodun altına aşağıdaki kodu girin.

# 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")

Create agent diet planner main apps - generate_diet_plan

Bu bölümde, 1 giriş parametresi olan generate_diet_plan adlı bir işlev oluşturacağız. Bu işlev, tanımlama istemiyle Gemini Pro 2.5 LLM modelini çağırır ve sonuçlar oluşturur.

app.py içinde önceki kodun altına aşağıdaki kodu girin.

# 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

Create agent diet planner main apps - save_to_bq

Bu bölümde, bq_client, user_id ve plan olmak üzere 3 giriş parametresi içeren save_to_bq adlı bir işlev oluşturacağız. Bu işlev, oluşturma sonucunu BigQuery tablosuna kaydeder.

app.py içinde önceki kodun altına aşağıdaki kodu girin.

# 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

Create agent diet planner main apps - main

Bu bölümde, giriş parametresi olmayan main adlı bir işlev oluşturacağız. Bu işlev, çoğunlukla Streamlit kullanıcı arayüzü komut dosyasını, oluşturulan sonucu görüntülemeyi, BigQuery tablosundan geçmişte oluşturulan sonucu görüntülemeyi ve verileri Markdown dosyasına indirmeyi işler.

app.py içinde önceki kodun altına aşağıdaki kodu girin.

# 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()

Kodu app.py adıyla kaydedin.

5. Uygulamaları Cloud Run'a dağıtmak için Cloud Build'i kullanma

Elbette bu harika uygulamayı diğer kullanıcılara da göstermek istiyoruz. Bunu yapmak için bu uygulamayı paketleyip başkalarının erişebileceği herkese açık bir hizmet olarak Cloud Run'a dağıtabiliriz. Bunu yapmak için mimariyi tekrar gözden geçirelim.

84e3f3620dc4ed68.png

Öncelikle Dockerfile'a ihtiyacımız var. Dosya > Yeni Metin Dosyası'nı tıklayın, aşağıdaki kodu kopyalayıp yapıştırın ve Dockerfile olarak kaydedin.

# 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"]

Ardından, uygulamaları Docker görüntüleri haline getirmek, Artifact Registry'ye aktarmak ve Cloud Run'a dağıtmak için cloudbuild.yaml dosyasını oluşturacağız.

Dosya->Yeni Metin Dosyası'nı tıklayın,aşağıdaki kodu kopyalayıp yapıştırın ve cloudbuild.yaml olarak kaydedin.

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'

Bu noktada, uygulamaları Docker görüntüleri haline getirmek, Artifact Registry'ye aktarmak ve Cloud Run'a dağıtmak için gereken tüm dosyalarımız var. Şimdi dağıtımı yapalım. Cloud Shell terminaline gidin ve mevcut projenin etkin projeniz olarak yapılandırıldığından emin olun. Aksi takdirde, proje kimliğini ayarlamak için gcloud configure komutunu kullanmanız gerekir:

gcloud config set project [PROJECT_ID]

Ardından, uygulamaları Docker görüntüleri haline getirmek, Artifact Registry'ye aktarmak ve Cloud Run'a dağıtmak için aşağıdaki komutu çalıştırın:

gcloud builds submit --config cloudbuild.yaml

Bu komut, daha önce sağladığımız Dockerfile'a göre Docker container'ını oluşturur ve Artifact Registry'ye aktarır. Ardından oluşturulan görüntüyü Cloud Run'a dağıtırız. Bu sürecin tamamı cloudbuild.yaml adımda tanımlanmıştır.

Bunun bir demo uygulaması olması nedeniyle burada kimliği doğrulanmamış erişime izin verildiğini unutmayın. Kurumsal ve üretim uygulamalarınız için uygun kimlik doğrulama yöntemini kullanmanız önerilir.

Dağıtım tamamlandıktan sonra Cloud Run sayfasında kontrol edebiliriz. Üstteki Cloud Console arama çubuğunda Cloud Run'ı arayıp Cloud Run ürününü tıklayın.

3c460765656fc072.png

Ardından, Cloud Run Hizmeti sayfasında listelenen dağıtılmış hizmeti inceleyebilirsiniz. Hizmet URL'sini almak için hizmeti tıklayın.

93dc975d3caeab0e.png

Hizmet URL'si üst çubukta yer alır.

9325464321c106f8.pngUygulamanızı gizli pencereden veya mobil cihazınızdan kullanmaya başlayabilirsiniz. Bu özellik şu anda kullanılabilir.

6. Temizleme

Bu codelab'de kullanılan kaynaklar için Google Cloud hesabınızın ücretlendirilmesini istemiyorsanız şu adımları uygulayın:

  1. Google Cloud Console'da Kaynakları yönetin sayfasına gidin.
  2. Proje listesinde silmek istediğiniz projeyi seçin ve Sil'i tıklayın.
  3. İletişim kutusunda proje kimliğini yazın ve projeyi silmek için Kapat'ı tıklayın.
  4. Alternatif olarak, konsolda Cloud Run'a gidebilir, yeni dağıttığınız hizmeti seçip silebilirsiniz.