main-new.sh 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. #!/bin/bash
  2. # conda init
  3. # conda activate central_controller
  4. if [ -z "$ZT_DB_HOST" ]; then
  5. echo '*** FAILED: ZT_DB_HOST environment variable not defined'
  6. exit 1
  7. fi
  8. if [ -z "$ZT_DB_PORT" ]; then
  9. echo '*** FAILED: ZT_DB_PORT environment variable not defined'
  10. exit 1
  11. fi
  12. if [ -z "$ZT_DB_NAME" ]; then
  13. echo '*** FAILED: ZT_DB_NAME environment variable not defined'
  14. exit 1
  15. fi
  16. if [ -z "$ZT_DB_USER" ]; then
  17. echo '*** FAILED: ZT_DB_USER environment variable not defined'
  18. exit 1
  19. fi
  20. if [ -z "$ZT_DB_PASSWORD" ]; then
  21. echo '*** FAILED: ZT_DB_PASSWORD environment variable not defined'
  22. exit 1
  23. fi
  24. REDIS=""
  25. if [ "$ZT_USE_REDIS" == "true" ]; then
  26. if [ -z "$ZT_REDIS_HOST" ]; then
  27. echo '*** FAILED: ZT_REDIS_HOST environment variable not defined'
  28. exit 1
  29. fi
  30. if [ -z "$ZT_REDIS_PORT" ]; then
  31. echo '*** FAILED: ZT_REDIS_PORT enivronment variable not defined'
  32. exit 1
  33. fi
  34. if [ -z "$ZT_REDIS_CLUSTER_MODE" ]; then
  35. echo '*** FAILED: ZT_REDIS_CLUSTER_MODE environment variable not defined'
  36. exit 1
  37. fi
  38. REDIS=", \"redis\": {
  39. \"hostname\": \"${ZT_REDIS_HOST}\",
  40. \"port\": ${ZT_REDIS_PORT},
  41. \"clusterMode\": ${ZT_REDIS_CLUSTER_MODE},
  42. \"password\": \"${ZT_REDIS_PASSWORD}\"
  43. }
  44. "
  45. else
  46. REDIS=", \"redis\": null"
  47. fi
  48. mkdir -p /var/lib/zerotier-one
  49. pushd /var/lib/zerotier-one
  50. if [ -d "$ZT_IDENTITY_PATH" ]; then
  51. echo '*** Using existing ZT identity from path $ZT_IDENTITY_PATH'
  52. ln -s $ZT_IDENTITY_PATH/identity.public identity.public
  53. ln -s $ZT_IDENTITY_PATH/identity.secret identity.secret
  54. if [ -L "$ZT_IDENTITY_PATH/authtoken.secret" ] && [ -e "$ZT_IDENTITY_PATH/authtoken.secret" ]; then
  55. ln -s $ZT_IDENTITY_PATH/authtoken.secret authtoken.secret
  56. ln -s $ZT_IDENTITY_PATH/authtoken.secret metricstoken.secret
  57. fi
  58. fi
  59. popd
  60. DEFAULT_PORT=9993
  61. DEFAULT_LB_MODE=false
  62. APP_NAME="controller-$(cat /var/lib/zerotier-one/identity.public | cut -d ':' -f 1)"
  63. BIGTABLE_CONF=""
  64. if [ "$ZT_USE_BIGTABLE" == "true" ]; then
  65. if [ -z "$ZT_BIGTABLE_PROJECT" ] || [ -z "$ZT_BIGTABLE_INSTANCE" ] || [ -z "$ZT_BIGTABLE_TABLE" ]; then
  66. echo '*** FAILED: ZT_BIGTABLE_PROJECT, ZT_BIGTABLE_INSTANCE, and ZT_BIGTABLE_TABLE environment variables must all be defined to use Bigtable as a controller backend'
  67. exit 1
  68. fi
  69. BIGTABLE_CONF=", \"bigtable\": {
  70. \"project_id\": \"${ZT_BIGTABLE_PROJECT}\",
  71. \"instance_id\": \"${ZT_BIGTABLE_INSTANCE}\",
  72. \"table_id\": \"${ZT_BIGTABLE_TABLE}\"
  73. }
  74. "
  75. fi
  76. PUBSUB_CONF=""
  77. if [ "$ZT_USE_PUBSUB" == "true" ]; then
  78. if [ -z "$ZT_PUBSUB_PROJECT" ]; then
  79. echo '*** FAILED: ZT_PUBSUB_PROJECT environment variable must be defined to use PubSub as a controller backend'
  80. exit 1
  81. fi
  82. if [ -z "$ZT_PUBSUB_MEMBER_CHANGE_RECV_TOPIC" ] || [ -z "$ZT_PUBSUB_MEMBER_CHANGE_SEND_TOPIC" ] || [ -z "$ZT_PUBSUB_NETWORK_CHANGE_RECV_TOPIC" ] || [ -z "$ZT_PUBSUB_NETWORK_CHANGE_SEND_TOPIC" ]; then
  83. echo '*** FAILED: ZT_PUBSUB_MEMBER_CHANGE_RECV_TOPIC, ZT_PUBSUB_MEMBER_CHANGE_SEND_TOPIC, ZT_PUBSUB_NETWORK_CHANGE_RECV_TOPIC, and ZT_PUBSUB_NETWORK_CHANGE_SEND_TOPIC environment variables must all be defined to use PubSub as a controller backend'
  84. exit 1
  85. fi
  86. PUBSUB_CONF=", \"pubsub\": {
  87. \"project_id\": \"${ZT_PUBSUB_PROJECT}\",
  88. \"member_change_recv_topic\": \"${ZT_PUBSUB_MEMBER_CHANGE_RECV_TOPIC}\",
  89. \"member_change_send_topic\": \"${ZT_PUBSUB_MEMBER_CHANGE_SEND_TOPIC}\",
  90. \"network_change_recv_topic\": \"${ZT_PUBSUB_NETWORK_CHANGE_RECV_TOPIC}\",
  91. \"network_change_send_topic\": \"${ZT_PUBSUB_NETWORK_CHANGE_SEND_TOPIC}\"
  92. }
  93. "
  94. fi
  95. echo "{
  96. \"settings\": {
  97. \"controllerDbPath\": \"postgres:host=${ZT_DB_HOST} port=${ZT_DB_PORT} dbname=${ZT_DB_NAME} user=${ZT_DB_USER} password=${ZT_DB_PASSWORD} application_name=${APP_NAME} sslmode=prefer sslcert=${DB_CLIENT_CERT} sslkey=${DB_CLIENT_KEY} sslrootcert=${DB_SERVER_CA}\",
  98. \"portMappingEnabled\": true,
  99. \"softwareUpdate\": \"disable\",
  100. \"interfacePrefixBlacklist\": [
  101. \"inot\",
  102. \"nat64\"
  103. ],
  104. \"lowBandwidthMode\": ${ZT_LB_MODE:-$DEFAULT_LB_MODE},
  105. \"ssoRedirectURL\": \"${ZT_SSO_REDIRECT_URL}\",
  106. \"allowManagementFrom\": [\"127.0.0.1\", \"::1\", \"10.0.0.0/8\"],
  107. \"otel\": {
  108. \"exporterEndpoint\": \"${ZT_EXPORTER_ENDPOINT}\",
  109. \"exporterSampleRate\": ${ZT_EXPORTER_SAMPLE_RATE:-0}
  110. }
  111. ${REDIS}
  112. },
  113. \"controller\": {
  114. \"listenMode\": \"${ZT_LISTEN_MODE:-pgsql}\",
  115. \"statusMode\": \"${ZT_STATUS_MODE:-pgsql}\"
  116. ${REDIS}
  117. ${BIGTABLE_CONF}
  118. ${PUBSUB_CONF}
  119. }
  120. }
  121. " > /var/lib/zerotier-one/local.conf
  122. if [ -n "$DB_SERVER_CA" ]; then
  123. echo "secret list"
  124. chmod 600 /secrets/db/*.pem
  125. ls -l /secrets/db/
  126. until pg_isready -h ${ZT_DB_HOST} -p ${ZT_DB_PORT} -d "sslmode=prefer sslcert=${DB_CLIENT_CERT} sslkey=${DB_CLIENT_KEY} sslrootcert=${DB_SERVER_CA}"; do
  127. echo "Waiting for PostgreSQL...";
  128. sleep 2;
  129. done
  130. else
  131. until pg_isready -h ${ZT_DB_HOST} -p ${ZT_DB_PORT}; do
  132. echo "Waiting for PostgreSQL...";
  133. sleep 2;
  134. done
  135. fi
  136. echo "Migrating database (if needed)..."
  137. if [ -n "$DB_SERVER_CA" ]; then
  138. /usr/local/bin/migrate -source file:///migrations -database "postgres://$ZT_DB_USER:$ZT_DB_PASSWORD@$ZT_DB_HOST:$ZT_DB_PORT/$ZT_DB_NAME?x-migrations-table=controller_migrations&sslmode=verify-full&sslrootcert=$DB_SERVER_CA&sslcert=$DB_CLIENT_CERT&sslkey=$DB_CLIENT_KEY" up
  139. else
  140. /usr/local/bin/migrate -source file:///migrations -database "postgres://$ZT_DB_USER:$ZT_DB_PASSWORD@$ZT_DB_HOST:$ZT_DB_PORT/$ZT_DB_NAME?x-migrations-table=controller_migrations&sslmode=disable" up
  141. fi
  142. if [ -n "$ZT_TEMPORAL_HOST" ] && [ -n "$ZT_TEMPORAL_PORT" ]; then
  143. echo "waiting for temporal..."
  144. while ! nc -z ${ZT_TEMPORAL_HOST} ${ZT_TEMPORAL_PORT}; do
  145. echo "waiting...";
  146. sleep 1;
  147. done
  148. echo "Temporal is up"
  149. fi
  150. cat /var/lib/zerotier-one/local.conf
  151. export GOOGLE_CLOUD_CPP_ENABLE_CLOG=yes
  152. export LIBC_FATAL_STDERR_=1
  153. export GLIBCXX_FORCE_NEW=1
  154. export GLIBCPP_FORCE_NEW=1
  155. export LD_PRELOAD="/opt/conda/envs/central_controller/lib/libjemalloc.so.2"
  156. exec /usr/local/bin/zerotier-one -p${ZT_CONTROLLER_PORT:-$DEFAULT_PORT} /var/lib/zerotier-one