setup_deploy.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. import os
  2. import sys
  3. import getpass
  4. def clear_screen():
  5. os.system('cls' if os.name == 'nt' else 'clear')
  6. print("="*60)
  7. print(" Local Food AI - Distributed Deployment Configuration Tool")
  8. print("="*60)
  9. print("Select the role for this specific node in the network:")
  10. print("1. All-in-One (Runs everything, default)")
  11. print("2. Application Frontend (Runs Streamlit, Nginx, AI Services)")
  12. print("3. Database Node (Runs MySQL & Ingestion)")
  13. print("4. Monitoring Node (Runs Zabbix Server & UI)")
  14. choice = input("\nEnter choice (1-4) [1]: ").strip() or "1"
  15. # Environment Variables
  16. env_vars = {}
  17. if choice != "1":
  18. print("\n--- Network Configuration ---")
  19. if choice != "3":
  20. env_vars['DB_HOST'] = input("Enter the IP address of the Database Node: ").strip()
  21. else:
  22. env_vars['DB_HOST'] = "mysql"
  23. if choice != "4":
  24. env_vars['ZBX_SERVER_HOST'] = input("Enter the IP address of the Monitoring Node: ").strip()
  25. else:
  26. env_vars['ZBX_SERVER_HOST'] = "zabbix-server"
  27. else:
  28. env_vars['DB_HOST'] = "mysql"
  29. env_vars['ZBX_SERVER_HOST'] = "zabbix-server"
  30. print("\n--- Security Configuration ---")
  31. env_vars['MYSQL_ROOT_PASSWORD'] = getpass.getpass("Enter MySQL Root Password (will not echo): ")
  32. env_vars['DB_READER_PASS'] = getpass.getpass("Enter DB Reader Password: ")
  33. env_vars['DB_LOADER_PASS'] = getpass.getpass("Enter DB Loader Password: ")
  34. env_vars['DB_APP_AUTH_PASS'] = getpass.getpass("Enter App Auth Password: ")
  35. env_vars['MYSQL_ZABBIX_PASSWORD'] = getpass.getpass("Enter Zabbix DB Password: ")
  36. # Generate .env
  37. print("\n[+] Generating .env file...")
  38. with open(".env", "w") as f:
  39. for k, v in env_vars.items():
  40. f.write(f"{k}={v}\n")
  41. # Base compose dictionaries
  42. compose_services = {}
  43. mysql_service = """
  44. mysql:
  45. build:
  46. context: ./docker/mysql
  47. ports:
  48. - "3307:3306"
  49. volumes:
  50. - mysql_data:/var/lib/mysql
  51. - ./my.cnf:/etc/mysql/conf.d/custom_ai_app.cnf
  52. - ./init.sql:/docker-entrypoint-initdb.d/1-init.sql
  53. environment:
  54. - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
  55. healthcheck:
  56. test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
  57. interval: 10s
  58. timeout: 5s
  59. retries: 20
  60. restart: always
  61. """
  62. ingest_service = """
  63. ingest:
  64. build:
  65. context: .
  66. dockerfile: docker/ingest/Dockerfile
  67. environment:
  68. - DB_HOST=${DB_HOST}
  69. - DB_USER=food_loader
  70. - DB_PASS=${DB_LOADER_PASS}
  71. volumes:
  72. - ./:/app
  73. profiles:
  74. - manual
  75. """
  76. ai_services = """
  77. ollama:
  78. image: ollama/ollama:latest
  79. volumes:
  80. - ollama_data:/root/.ollama
  81. restart: always
  82. searxng:
  83. image: searxng/searxng:latest
  84. ports:
  85. - "8080:8080"
  86. volumes:
  87. - ./searxng:/etc/searxng
  88. environment:
  89. - SEARXNG_BASE_URL=http://localhost:8080/
  90. restart: always
  91. """
  92. app_service = """
  93. app:
  94. build:
  95. context: .
  96. dockerfile: docker/app/Dockerfile
  97. ports:
  98. - "8502:8501"
  99. environment:
  100. - DB_HOST=${DB_HOST}
  101. - DB_USER=food_reader
  102. - DB_PASS=${DB_READER_PASS}
  103. - APP_AUTH_USER=food_app_auth
  104. - APP_AUTH_PASS=${DB_APP_AUTH_PASS}
  105. - OLLAMA_HOST=http://ollama:11434
  106. - SEARXNG_HOST=http://searxng:8080
  107. restart: always
  108. nginx:
  109. image: nginx:latest
  110. ports:
  111. - "80:80"
  112. volumes:
  113. - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
  114. restart: always
  115. """
  116. monitoring_services = """
  117. zabbix-server:
  118. image: zabbix/zabbix-server-mysql:ubuntu-7.0-latest
  119. environment:
  120. - DB_SERVER_HOST=${DB_HOST}
  121. - MYSQL_USER=zabbix
  122. - MYSQL_PASSWORD=${MYSQL_ZABBIX_PASSWORD}
  123. - ZBX_SNMPTRAPPER=1
  124. restart: always
  125. ports:
  126. - "10051:10051"
  127. zabbix-web:
  128. image: zabbix/zabbix-web-nginx-mysql:ubuntu-7.0-latest
  129. ports:
  130. - "8081:8080"
  131. - "8444:8443"
  132. environment:
  133. - DB_SERVER_HOST=${DB_HOST}
  134. - MYSQL_USER=zabbix
  135. - MYSQL_PASSWORD=${MYSQL_ZABBIX_PASSWORD}
  136. - ZBX_SERVER_HOST=zabbix-server
  137. - PHP_TZ=Europe/Paris
  138. restart: always
  139. zabbix-agent:
  140. image: zabbix/zabbix-agent:ubuntu-7.0-latest
  141. environment:
  142. - ZBX_HOSTNAME=DistributedNode
  143. - ZBX_SERVER_HOST=${ZBX_SERVER_HOST}
  144. privileged: true
  145. pid: "host"
  146. volumes:
  147. - /var/run:/var/run
  148. restart: always
  149. """
  150. header = "services:\n"
  151. footer = """
  152. volumes:
  153. mysql_data:
  154. ollama_data:
  155. """
  156. compose_content = header
  157. if choice == "1":
  158. compose_content += mysql_service + ingest_service + ai_services + app_service + monitoring_services
  159. elif choice == "2":
  160. compose_content += ai_services + app_service
  161. footer = "volumes:\n ollama_data:\n"
  162. elif choice == "3":
  163. compose_content += mysql_service + ingest_service
  164. footer = "volumes:\n mysql_data:\n"
  165. elif choice == "4":
  166. compose_content += monitoring_services
  167. footer = ""
  168. print("[+] Generating docker-compose.yml for selected role...")
  169. with open("docker-compose.yml", "w") as f:
  170. f.write(compose_content + footer)
  171. print("\nDone! You can now run `docker compose up -d`.")