12.5 Izvietošana mākonī un drošība

Tavs šīs stundas izaicinājums: Izvietot lietotni publiski un saprast pamata drošības principus produkcijas vidē.

SR 2.4.6. Plāno un dokumentē izstrādes procesu SR 3.1.1. Ergonomika un drošība SR 3.2.5. Drošības riski

Teorija: No localhost uz internetu

Lokālā lietotne, kas darbojas uz localhost:5000, nav pieejama citiem. Lai pasaule to redzētu, jāizvieto mākonī.

Bezmaksas mākoņi (2026):

Drošības pamati:

import os
from dotenv import load_dotenv
load_dotenv()  # nolasa .env failu

DATABASE_URL = os.getenv("DATABASE_URL")
SECRET_KEY = os.getenv("SECRET_KEY")

1. uzdevums: Sagatavošana izvietošanai

Sagatavo lietotni produkcijai.

Izpildes soļi:

  1. Izveido requirements.txt ar visām atkarībām: pip freeze > requirements.txt.
  2. Izveido Procfile ar saturu web: gunicorn app:app (instalē gunicorn).
  3. Pievieno .env failu ar SECRET_KEY=; pievieno to .gitignore.
  4. Pārveido kodu, lai lasa os.environ, nevis hard-coded vērtības.
  5. Push uz GitHub.

2. uzdevums: Izvietošana Render

Publicē projektu internetā.

Izpildes soļi:

  1. Reģistrējies render.com (ar GitHub).
  2. New → Web Service → Connect savu repo.
  3. Build command: pip install -r requirements.txt; Start command: gunicorn app:app.
  4. Pievieno vides mainīgo SECRET_KEY.
  5. Sagaidi, kamēr deploy pabeidzas, atver public URL.
  6. Pārbaudi, ka API strādā: curl https://tavs-app.onrender.com/api/rezultati.

3. uzdevums: PostgreSQL + drošība

Pievieno datubāzi mākonī un nostiprini.

Izpildes soļi:

  1. Render: New → PostgreSQL (bezmaksas tier).
  2. Pievieno DB URL kā DATABASE_URL vides mainīgo savai web servisam.
  3. Pielāgo Python kodu, lai lasa DATABASE_URL un savienojas ar psycopg2.connect(os.environ["DATABASE_URL"]).
  4. Sagatavo migrāciju skriptu migrate.py, kas izpilda schema.sql pēc deploy.
  5. Pievieno flask_limiter rate limit (max 100 pieprasījumu minūtē uz IP), lai pasargātu no DDoS.
  6. Pārbaudi visu galaprodukciju — pievieno datus, atver no cita datora.

Papildus uzdevums: Custom domēns un HTTPS

Pievieno savu domēnu ar HTTPS.

Izpildes soļi:

  1. Reģistrē domēnu (piem., "freenom.com" vai .tk bezmaksas).
  2. Render: Settings → Custom Domain → ievadi domēnu.
  3. DNS: pievieno CNAME ierakstu, kas norāda uz Render URL.
  4. Sagaidi DNS propagāciju (līdz 24h).

Biežākās kļūdas

Koda piemērs

# app.py — produkcijai gatavs
import os
from flask import Flask, jsonify, request
import psycopg2

app = Flask(__name__)

DATABASE_URL = os.environ.get("DATABASE_URL")
SECRET_KEY = os.environ.get("SECRET_KEY", "dev-only-key")

def get_db():
    return psycopg2.connect(DATABASE_URL, sslmode="require")

@app.route("/api/rezultati")
def saraksts():
    with get_db() as conn, conn.cursor() as cur:
        cur.execute("SELECT vards, punkti FROM rezultati ORDER BY punkti DESC LIMIT 10")
        return jsonify([dict(zip(["vards","punkti"], r)) for r in cur.fetchall()])

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=int(os.environ.get("PORT", 5000)))
Public URL: https://tavs-app.onrender.com
API atbild ar JSON;
Datu bāze pieslēgta.
⬅ Iepriekšējā stunda Nākamā stunda ➡