| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- import os
- import sys
- import paramiko
- import dotenv
- import time
- sys.stdout.reconfigure(encoding='utf-8')
- sys.stderr.reconfigure(encoding='utf-8')
- repo_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
- dotenv.load_dotenv(dotenv_path=os.path.join(repo_root, ".env"))
- host = os.environ.get('SERVER_HOST')
- user = os.environ.get('SERVER_USER')
- password = os.environ.get('SERVER_PASS')
- if password == "your_db_password_here" or not password:
- password = None
- ssh = paramiko.SSHClient()
- ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
- try:
- ssh.connect(host, username=user, password=password, timeout=10)
- print("SSH Connected!")
-
- # 1. Kill any existing ingest-run container
- print("Killing any hung ingest containers...")
- ssh.exec_command("docker ps -a --filter name=food_project-ingest-run -q | xargs -r docker rm -f")
-
- # 2. Stop the Streamlit app container to guarantee no locks
- print("Stopping app container...")
- stdin, stdout, stderr = ssh.exec_command("cd food_project && docker-compose stop app")
- stdout.read()
-
- # 3. Restart MySQL to drop any orphaned connections or locks
- print("Restarting MySQL...")
- stdin, stdout, stderr = ssh.exec_command("cd food_project && docker-compose restart mysql")
- stdout.read()
-
- print("Waiting 10 seconds for MySQL to be healthy...")
- time.sleep(10)
-
- # 4. Run the ingestion pipeline
- print("Running database ingestion...")
- cmd = "cd food_project && docker-compose run --rm -e PYTHONIOENCODING=utf-8 ingest python -X utf8 /app/ingest_csv.py"
- stdin, stdout, stderr = ssh.exec_command(cmd)
-
- # Wait for completion and read output
- out_ing = stdout.read().decode('utf-8', errors='ignore')
- err_ing = stderr.read().decode('utf-8', errors='ignore')
-
- print("INGESTION STDOUT:\n", out_ing)
- print("INGESTION STDERR:\n", err_ing)
-
- # 5. Start Streamlit app container back up
- print("Starting app container back up...")
- stdin, stdout, stderr = ssh.exec_command("cd food_project && docker-compose start app")
- stdout.read()
-
- print("Ingestion flow completed successfully!")
-
- except Exception as e:
- print(f"Error: {e}")
- finally:
- ssh.close()
|