clash-up.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. # -*- coding: utf-8 -*-
  2. import subprocess
  3. import multiprocessing
  4. import os
  5. import json
  6. def load_config():
  7. with open("config.json", "r") as f:
  8. return json.load(f)
  9. config = load_config()
  10. PREFIX = "clash-multi-"
  11. START = 1
  12. END = config["total_container"]
  13. START_PORT = config["start_port"]
  14. START_API_PORT = config["start_api_port"]
  15. START_WEB_PORT = config["start_web_port"]
  16. def get_docker_run_command(container_id):
  17. container_name = f"{PREFIX}{container_id}"
  18. port = START_PORT + container_id
  19. api_port = START_API_PORT + container_id
  20. web_port = START_WEB_PORT + container_id
  21. script_dir = os.path.dirname(os.path.abspath(__file__))
  22. config_file_path = os.path.join(script_dir, "config", f"config{container_id}.yaml")
  23. return [
  24. "docker", "run", "-d",
  25. "--name", container_name,
  26. "--restart=always",
  27. "--log-opt", "max-size=1m",
  28. "-v", f"{config_file_path}:/root/.config/clash/config.yaml",
  29. "-p", f"{web_port}:8080",
  30. "-p", f"{port}:7890",
  31. "-p", f"{api_port}:9090",
  32. "laoyutang/clash-and-dashboard:latest"
  33. ]
  34. def start_container(container_id):
  35. container_name = f"{PREFIX}{container_id}"
  36. print(f"Starting container: {container_name}")
  37. try:
  38. cmd = get_docker_run_command(container_id)
  39. # print(f"Running Docker command: {' '.join(cmd)}")
  40. subprocess.run(cmd, check=True, stdout=subprocess.DEVNULL, stderr=subprocess.PIPE)
  41. print(f"Successfully started container: {container_name}")
  42. except subprocess.CalledProcessError as e:
  43. error_message = e.stderr.decode().strip() if e.stderr else "Unknown error"
  44. print(f"Error starting container {container_name}: {error_message}")
  45. def main():
  46. with multiprocessing.Pool(processes=os.cpu_count() or 8) as pool:
  47. pool.map(start_container, range(START, END + 1))
  48. if __name__ == "__main__":
  49. main()