upgrade.sh 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. #!/bin/bash
  2. # This script will prepare NetBox to run after the code has been upgraded to
  3. # its most recent release.
  4. # This script will invoke Python with the value of the PYTHON environment
  5. # variable (if set), or fall back to "python3". Note that NetBox v3.2+ requires
  6. # Python 3.8 or later.
  7. cd "$(dirname "$0")"
  8. VIRTUALENV="$(pwd -P)/venv"
  9. PYTHON="${PYTHON:-python3}"
  10. # Validate the minimum required Python version
  11. COMMAND="${PYTHON} -c 'import sys; exit(1 if sys.version_info < (3, 8) else 0)'"
  12. PYTHON_VERSION=$(eval "${PYTHON} -V")
  13. eval $COMMAND || {
  14. echo "--------------------------------------------------------------------"
  15. echo "ERROR: Unsupported Python version: ${PYTHON_VERSION}. NetBox requires"
  16. echo "Python 3.8 or later. To specify an alternate Python executable, set"
  17. echo "the PYTHON environment variable. For example:"
  18. echo ""
  19. echo " sudo PYTHON=/usr/bin/python3.8 ./upgrade.sh"
  20. echo ""
  21. echo "To show your current Python version: ${PYTHON} -V"
  22. echo "--------------------------------------------------------------------"
  23. exit 1
  24. }
  25. echo "Using ${PYTHON_VERSION}"
  26. # Remove the existing virtual environment (if any)
  27. if [ -d "$VIRTUALENV" ]; then
  28. COMMAND="rm -rf ${VIRTUALENV}"
  29. echo "Removing old virtual environment..."
  30. eval $COMMAND
  31. else
  32. WARN_MISSING_VENV=1
  33. fi
  34. # Create a new virtual environment
  35. COMMAND="${PYTHON} -m venv ${VIRTUALENV}"
  36. echo "Creating a new virtual environment at ${VIRTUALENV}..."
  37. eval $COMMAND || {
  38. echo "--------------------------------------------------------------------"
  39. echo "ERROR: Failed to create the virtual environment. Check that you have"
  40. echo "the required system packages installed and the following path is"
  41. echo "writable: ${VIRTUALENV}"
  42. echo "--------------------------------------------------------------------"
  43. exit 1
  44. }
  45. # Activate the virtual environment
  46. source "${VIRTUALENV}/bin/activate"
  47. # Upgrade pip
  48. COMMAND="pip install --upgrade pip"
  49. echo "Updating pip ($COMMAND)..."
  50. eval $COMMAND || exit 1
  51. pip -V
  52. # Install necessary system packages
  53. COMMAND="pip install wheel"
  54. echo "Installing Python system packages ($COMMAND)..."
  55. eval $COMMAND || exit 1
  56. # Install required Python packages
  57. COMMAND="pip install -r requirements.txt"
  58. echo "Installing core dependencies ($COMMAND)..."
  59. eval $COMMAND || exit 1
  60. # Install optional packages (if any)
  61. if [ -s "local_requirements.txt" ]; then
  62. COMMAND="pip install -r local_requirements.txt"
  63. echo "Installing local dependencies ($COMMAND)..."
  64. eval $COMMAND || exit 1
  65. elif [ -f "local_requirements.txt" ]; then
  66. echo "Skipping local dependencies (local_requirements.txt is empty)"
  67. else
  68. echo "Skipping local dependencies (local_requirements.txt not found)"
  69. fi
  70. # Apply any database migrations
  71. COMMAND="python3 netbox/manage.py migrate"
  72. echo "Applying database migrations ($COMMAND)..."
  73. eval $COMMAND || exit 1
  74. # Trace any missing cable paths (not typically needed)
  75. COMMAND="python3 netbox/manage.py trace_paths --no-input"
  76. echo "Checking for missing cable paths ($COMMAND)..."
  77. eval $COMMAND || exit 1
  78. # Build the local documentation
  79. COMMAND="mkdocs build"
  80. echo "Building documentation ($COMMAND)..."
  81. eval $COMMAND || exit 1
  82. # Collect static files
  83. COMMAND="python3 netbox/manage.py collectstatic --no-input"
  84. echo "Collecting static files ($COMMAND)..."
  85. eval $COMMAND || exit 1
  86. # Delete any stale content types
  87. COMMAND="python3 netbox/manage.py remove_stale_contenttypes --no-input"
  88. echo "Removing stale content types ($COMMAND)..."
  89. eval $COMMAND || exit 1
  90. # Rebuild the search cache (lazily)
  91. COMMAND="python3 netbox/manage.py reindex --lazy"
  92. echo "Rebuilding search cache ($COMMAND)..."
  93. eval $COMMAND || exit 1
  94. # Delete any expired user sessions
  95. COMMAND="python3 netbox/manage.py clearsessions"
  96. echo "Removing expired user sessions ($COMMAND)..."
  97. eval $COMMAND || exit 1
  98. # Clear the cache
  99. COMMAND="python3 netbox/manage.py clearcache"
  100. echo "Clearing the cache ($COMMAND)..."
  101. eval $COMMAND || exit 1
  102. if [ -v WARN_MISSING_VENV ]; then
  103. echo "--------------------------------------------------------------------"
  104. echo "WARNING: No existing virtual environment was detected. A new one has"
  105. echo "been created. Update your systemd service files to reflect the new"
  106. echo "Python and gunicorn executables. (If this is a new installation,"
  107. echo "this warning can be ignored.)"
  108. echo ""
  109. echo "netbox.service ExecStart:"
  110. echo " ${VIRTUALENV}/bin/gunicorn"
  111. echo ""
  112. echo "netbox-rq.service ExecStart:"
  113. echo " ${VIRTUALENV}/bin/python"
  114. echo ""
  115. echo "After modifying these files, reload the systemctl daemon:"
  116. echo " > systemctl daemon-reload"
  117. echo "--------------------------------------------------------------------"
  118. fi
  119. echo "Upgrade complete! Don't forget to restart the NetBox services:"
  120. echo " > sudo systemctl restart netbox netbox-rq"