{"id":1477,"date":"2020-05-22T12:33:02","date_gmt":"2020-05-22T04:33:02","guid":{"rendered":"http:\/\/blog.ywdevops.cn\/?p=1477"},"modified":"2024-07-24T16:51:46","modified_gmt":"2024-07-24T08:51:46","slug":"codo","status":"publish","type":"post","link":"https:\/\/blog.ywdevops.cn\/index.php\/2020\/05\/22\/codo\/","title":{"rendered":"codo\u81ea\u52a8\u5316\u8fd0\u7ef4\u5e73\u53f0\u7684\u642d\u5efa"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">\u672c\u6559\u7a0b\u57fa\u4e8edocker\u7684\u5168\u5206\u5e03\u5f0f\u5f62\u5f0f\u642d\u5efa\uff0c\u91c7\u7528\u4e24\u53f0\u673a\u5668\u8fdb\u884c\u90e8\u7f72\uff0c\u6bcf\u4e2a\u673a\u5668\u90e8\u7f72\u51e0\u4e2a\u6a21\u5757\uff0c\u4e3a\u5fae\u670d\u52a1\u67b6\u6784\uff0c\u6bcf\u4e2a\u6a21\u5757\u53ef\u4ee5\u4f7f\u7528\u81ea\u5df1\u72ec\u7acb\u7684\u6570\u636e\u5e93\uff0c\u672c\u4f8b\u5b50\u4e2d\u6bcf\u53f0\u673a\u5668\u90fd\u6709\u4e00\u4e2a\u6570\u636e\u5e93(redis\u3001mq\u4e5f\u90fd\u4f7f\u7528\u672c\u673a\u7684)\uff0c\u673a\u5668\u4e0a\u7684\u51e0\u4e2a\u6a21\u5757\u5171\u7528\u4e00\u4e2a\u6570\u636e\u5e93\uff0c\u5177\u4f53\u6a21\u5757\u60c5\u51b5\u5982\u4e0b\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u673a\u5668A(192.168.170.128) \uff1a\u9879\u76ee\u524d\u7aef\u3001\u7ba1\u7406\u540e\u7aef\u3001\u57df\u540d\u7ba1\u7406\u3001\u4efb\u52a1\u7cfb\u7edf\u3001API\u7f51\u5173\u4ee5\u53ca\u57fa\u7840\u73af\u5883<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u673a\u5668B(192.168.170.129)\uff1a\u8d44\u4ea7\u7ba1\u7406\u3001\u5b9a\u65f6\u4efb\u52a1\u3001\u8fd0\u7ef4\u5de5\u5177\u3001\u914d\u7f6e\u4e2d\u5fc3\u4ee5\u53ca\u57fa\u7840\u73af\u5883<\/p>\n\n\n\n<p class=\"has-text-color has-text-align-center has-medium-font-size has-vivid-purple-color wp-block-paragraph\"><strong>\u73af\u5883\u51c6\u5907<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5efa\u8bae\u914d\u7f6e\uff1a(\u4e24\u53f0\u673a\u5668\u4e00\u6837)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">centos7\u30014\u68388G\u300150G\u78c1\u76d8\u7a7a\u95f4<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u73af\u5883\u8981\u6c42\uff1a Python3.6 \u3001 Redis3.2 \u3001 MySQl5.7 \u3001 RabbitMQ \u3001 Docker \u3001 Docker-compose<\/p>\n\n\n\n<p class=\"has-background has-pale-cyan-blue-background-color wp-block-paragraph\">\u6ce8\u610f\uff1a \u5982\u679c\u4f60\u7684\u7cfb\u7edf\u662f\u65b0\u7684\uff0c\u6211\u4eec\u5efa\u8bae\u4f60\u5148\u4f18\u5316\u4e0b\u7cfb\u7edf\uff0c\u540c\u6837\u6211\u4eec\u4e5f\u63d0\u4f9b\u4e86<a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/opendevops-cn\/opendevops\/tree\/master\/scripts\/system_init_v1.sh\" target=\"_blank\">\u4f18\u5316\u7cfb\u7edf\u811a\u672c<\/a> (\u5728\u6587\u672b\u53ef\u4e0b\u8f7d\u4f18\u5316\u811a\u672c)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">1\u3001\u9996\u5148\u6267\u884c\u4f18\u5316\u811a\u672c\u5bf9\u7cfb\u7edf\u8fdb\u884c\u4f18\u5316<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">2\u3001\u521b\u5efa\u9879\u76ee\u76ee\u5f55\uff0c<code>mkdir -p \/opt\/codo\/ &amp;&amp; cd \/opt\/codo\/<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728codo\u76ee\u5f55\u4e0b\u521b\u5efa\u73af\u5883\u53d8\u91cf\u811a\u672cenv.sh\uff0c\u5e76\u5199\u5165\u5185\u5bb9\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#\u90e8\u7f72\u7684IP\u5730\u5740\nexport LOCALHOST_IP=\"192.168.170.128\"\n#\u8bbe\u7f6e\u4f60\u7684MYSQL\u5bc6\u7801(\u81ea\u5b9a\u4e49)\nexport MYSQL_PASSWORD=\"m9uSFL7duAVXfeAwGUSG\"\n### \u8bbe\u7f6e\u4f60\u7684redis\u5bc6\u7801(\u81ea\u5b9a\u4e49)\nexport REDIS_PASSWORD=\"cWCVKJ7ZHUK12mVbivUf\"\n\n### RabbitMQ\u7528\u6237\u5bc6\u7801\u4fe1\u606f(\u81ea\u5b9a\u4e49)\nexport MQ_USER=\"ss\"\nexport MQ_PASSWORD=\"5Q2ajBHRT2lFJjnvaU0g\"\n\n\n#codo-admin\u7528\u5230\u7684cookie\u548ctoken(\u81ea\u5b9a\u4e49\u4fee\u6539)\nexport cookie_secret=\"nJ2oZis0V\/xlArY2rzpIE6ioC9\/KlqR2fd59sD=UXZJ=3OeROB\"\n# \u8fd9\u91cccodo-admin\u548cgw\u7f51\u5173\u90fd\u4f1a\u7528\u5230\uff0c\u4e00\u5b9a\u8981\u4fee\u6539\u3002\u53ef\u751f\u6210\u968f\u610f\u5b57\u7b26\nexport token_secret=\"pXFb4i%*834gfdh963df718iodGq4dsafsdadg7yI6ImF1999aaG7\"\n\n\n##\u5982\u679c\u8981\u8fdb\u884c\u8bfb\u5199\u5206\u79bb\uff0cMaster-slave\u4e3b\u4ece\u8bf7\u81ea\u884c\u5efa\u7acb\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u90fd\u662f\u53ea\u7528\u4e00\u4e2a\u6570\u636e\u5e93\u5c31\u53ef\u4ee5\u4e86\n# \u5199\u6570\u636e\u5e93\nexport DEFAULT_DB_DBHOST=\"192.168.170.128\"\nexport DEFAULT_DB_DBPORT='3306'\nexport DEFAULT_DB_DBUSER='root'\nexport DEFAULT_DB_DBPWD=${MYSQL_PASSWORD}\n#export DEFAULT_DB_DBNAME=${mysql_database}\n\n# \u8bfb\u6570\u636e\u5e93\nexport READONLY_DB_DBHOST='192.168.170.128'\nexport READONLY_DB_DBPORT='3306'\nexport READONLY_DB_DBUSER='root'\nexport READONLY_DB_DBPWD=${MYSQL_PASSWORD}\n#export READONLY_DB_DBNAME=${mysql_database}\n\n# \u6d88\u606f\u961f\u5217\nexport DEFAULT_MQ_ADDR='192.168.170.128'\nexport DEFAULT_MQ_USER=${MQ_USER}\nexport DEFAULT_MQ_PWD=${MQ_PASSWORD}\n\n# \u7f13\u5b58\nexport DEFAULT_REDIS_HOST='192.168.170.128'\nexport DEFAULT_REDIS_PORT=6379\nexport DEFAULT_REDIS_PASSWORD=${REDIS_PASSWORD}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u6839\u636e\u81ea\u5df1\u7684\u5b9e\u9645\u60c5\u51b5\uff0c\u8bbe\u7f6eIP\u5730\u5740\u4ee5\u53ca\u76f8\u5173\u5bc6\u7801\uff0c\u5206\u5e03\u5f0f\u642d\u5efa\u4e24\u53f0\u673a\u5668\u9700\u8981\u914d\u7f6emysql\u3001redis\u3001mq\u7b49\u57fa\u7840\u73af\u5883\uff0c\u56e0\u6b64\u5730\u5740\u90fd\u5199\u672c\u673aIP\u5373\u53ef\uff0c\u7f16\u5199\u5b8c\u6210\u540e\u6267\u884csource    env.sh<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">3\u3001\u5173\u95edselinux\uff0c\u5982\u679c\u5173\u95ed\u8bf7\u5ffd\u7565\u6b64\u6b65\u9aa4<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">4\u3001\u6e05\u7a7a\u9632\u706b\u5899\u89c4\u5219\uff0c\u6267\u884c\u547d\u4ee4iptables -F<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">5\u3001\u5b89\u88c5python3\uff0c\u5efa\u8bae\u4f7f\u7528Python36\uff0c\u82e5\u5df2\u7ecf\u5b58\u5728\u8bf7\u5ffd\u7565\u6b64\u6b65\u9aa4<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>yum update -y\nyum groupinstall Development tools -y\nyum -y install zlib-devel\nyum install -y openssl-devel libxslt-devel libxml2-devel libcurl-devel\nyum install python3 -y <\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">6\u3001 \u5b89\u88c5docker \uff0c\u5982\u679c\u5df2\u7ecf\u5b89\u88c5\u8bf7\u5ffd\u7565<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>yum install -y yum-utils device-mapper-persistent-data lvm2\nyum-config-manager --add-repo https:\/\/download.docker.com\/linux\/centos\/docker-ce.repo\nyum-config-manager --enable docker-ce-edge\nyum install -y docker-ce\n#\u542f\u52a8\u548c\u5f00\u673a\u81ea\u542f\nsystemctl start docker.service\n\nsystemctl enable docker.service<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">7\u3001 \u5b89\u88c5docker-compose\u7f16\u6392\u5de5\u5177\uff0c\u5982\u5df2\u5b89\u88c5\u8bf7\u5ffd\u7565<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#curl https:\/\/bootstrap.pypa.io\/get-pip.py -o get-pip.py &amp;&amp; python3 get-pip.py \u5982\u679c\u6ca1\u6709pip3 \u8bf7\u5b89\u88c5\npip3 install docker-compose<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">8\u3001 \u5b89\u88c5MySQL \uff0c \u5982\u5df2\u5b89\u88c5\u8bf7\u5ffd\u7565<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e00\u822c\u6765\u8bf4\u4e00\u4e2aMySQL\u5b9e\u4f8b\u5373\u53ef\uff0c\u5982\u679c\u6709\u9700\u6c42\u53ef\u4ee5\u81ea\u884c\u642d\u5efa\u4e3b\u4ece\uff0c\u5fae\u670d\u52a1\u6bcf\u4e2a\u670d\u52a1\u90fd\u53ef\u4ee5\u6709\u81ea\u5df1\u7684\u6570\u636e\u5e93\uff0c \u6211\u4eec\u8fd9\u91cc\u793a\u4f8b\u662f\u7528Docker\u90e8\u7f72\u7684MySQL\uff0c\u5982\u679c\u4f60\u8981\u7528\u5df2\u6709\u7684\u6570\u636e\u5e93\u8bf7\u4fee\u6539<code>\/opt\/codo\/env.sh<\/code> <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>source \/opt\/codo\/env.sh\nmkdir -p \/var\/codo\/codo-mysql&amp;&amp; cd \/var\/codo\/codo-mysql\n#\u521b\u5efa docker-compose.yml\ncat >docker-compose.yml &lt;&lt;EOF\nmysql:\n  restart: unless-stopped\n  image: registry.cn-shanghai.aliyuncs.com\/ss1917\/mysql:5.7\n  volumes:\n    - \/data\/mysql:\/var\/lib\/mysql\n    - \/data\/mysql_conf:\/etc\/mysql\/conf.d\n  ports:\n    - \"3306:3306\"\n  environment:\n    - MYSQL_ROOT_PASSWORD=${MYSQL_PASSWORD}\nEOF\n#\u4e0a\u9762\u7f16\u5199compose\u6587\u4ef6\u7684\u65f6\u5019\uff0c\u6307\u5b9a\u7684\u955c\u50cfmysql:5.7\u662f\u4ece\u963f\u91cc\u4e91\u955c\u50cf\u4ed3\u5e93\u83b7\u53d6\uff0c\u5982\u679c\u81ea\u5df1\u672c\u5730\u5b58\u5728\u955c\u50cf\uff0c\u53ef\u76f4\u63a5\u6307\u5b9a\uff0c\u65e0\u9700\u4ece\u8fdc\u7a0b\u4ed3\u5e93\u62c9\u53d6\n#\u542f\u52a8 \ndocker-compose up -d\n# \u5b89\u88c5MySQL\u5ba2\u6237\u7aef\nyum install mysql -y\n\n#\u9a8c\u8bc1\u662f\u5426\u5b89\u88c5\u6210\u529f\nif [ $? == 0 ];then\n    echo -e \"\\033[32m [INFO]: mysql install success. \\033[0m\"\n    echo -e \"\\033[32m [INFO]: \u6700\u597d\u63d0\u9ad8\u4e0bMySQL\u7684\u6700\u5927\u94fe\u63a5\u6570. \\033[0m\"\n    echo -e \"\\033[32m [INFO]: mysql -h127.0.0.1 -uroot -p${MYSQL_PASSWORD} \\033[0m\"\nelse\n    echo -e \"\\033[31m [ERROR]: mysql57 install faild \\033[0m\"\n    exit -3\nfi\n#\u6d4b\u8bd5\u662f\u5426\u53ef\u4ee5\u8fde\u63a5\nmysql -h127.0.0.1 -uroot -p${MYSQL_PASSWORD}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">9\u3001\u5b89\u88c5redis<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>source \/opt\/codo\/env.sh\nmkdir -p \/opt\/codo\/codo-redis &amp;&amp; cd \/opt\/codo\/codo-redis\ncat >docker-compose.yml &lt;&lt;EOF\nredis:\n    image: registry.cn-shanghai.aliyuncs.com\/ss1917\/redis:4\n    ports:\n      - 6379:6379\n    restart: unless-stopped\n    command: redis-server --requirepass ${REDIS_PASSWORD}\nEOF\n\n#\u542f\u52a8\ndocker-compose up -d\n#\u4e0a\u9762\u7f16\u5199compose\u6587\u4ef6\u7684\u65f6\u5019\uff0c\u6307\u5b9a\u7684\u955c\u50cfredis:4\u662f\u4ece\u963f\u91cc\u4e91\u955c\u50cf\u4ed3\u5e93\u83b7\u53d6\uff0c\u5982\u679c\u81ea\u5df1\u672c\u5730\u5b58\u5728\u955c\u50cf\uff0c\u53ef\u76f4\u63a5\u6307\u5b9a\uff0c\u65e0\u9700\u4ece\u8fdc\u7a0b\u4ed3\u5e93\u62c9\u53d6\n#\u6d4b\u8bd5\u662f\u5426\u53ef\u4ee5\u6b63\u5e38\u8fde\u63a5\nredis-cli -h 127.0.0.1 -p 6379 -a ${REDIS_PASSWORD}\n#\u5982\u679c\u63d0\u793a\u6ca1\u6709cli\uff0c\u53ef\u6267\u884cyum -y install redis<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">10\u3001 \u5b89\u88c5RabbitMQ <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>source \/opt\/codo\/env.sh\nmkdir -p \/opt\/codo\/codo-mq &amp;&amp; cd \/opt\/codo\/codo-mq \ncat >docker-compose.yml &lt;&lt;EOF\nrabbitmq:\n    restart: unless-stopped\n    image: registry.cn-shanghai.aliyuncs.com\/ss1917\/rabbitmq:3-management\n    environment:\n      - RABBITMQ_DEFAULT_USER=${MQ_USER}\n      - RABBITMQ_DEFAULT_PASS=${MQ_PASSWORD}\n    ports:\n      - \"15672:15672\"\n      - \"5672:5672\"\nEOF\n\n#\u542f\u52a8\ndocker-compose up -d\n#\u4e0a\u9762\u7f16\u5199compose\u6587\u4ef6\u7684\u65f6\u5019\uff0c\u6307\u5b9a\u7684\u955c\u50cfrabbitmq:3-management\u662f\u4ece\u963f\u91cc\u4e91\u955c\u50cf\u4ed3\u5e93\u83b7\u53d6\uff0c\u5982\u679c\u81ea\u5df1\u672c\u5730\u5b58\u5728\u955c\u50cf\uff0c\u53ef\u76f4\u63a5\u6307\u5b9a\uff0c\u65e0\u9700\u4ece\u8fdc\u7a0b\u4ed3\u5e93\u62c9\u53d6<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">11\u3001 \u5b89\u88c5DNS(\u673a\u5668A\u9700\u8981\u914d\u7f6e,\u53e6\u4e00\u53f0\u4e0d\u9700\u8981\u914d\u7f6e)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"> \u6ce8\u610f\uff0c\u8fd9\u91cc\u5982\u679c\u4f60\u5185\u90e8\u6709\u81ea\u5df1DNS\uff0c\u4f60\u4e5f\u53ef\u4ee5\u9009\u62e9\u4f7f\u7528\u4f60\u81ea\u5df1\u7684 \uff0c \u90e8\u7f72\u5185\u90e8DNS dnsmasq \u7528\u4e8e\u670d\u52a1\u95f4\u5185\u90e8\u901a\u4fe1\uff0cAPI\u7f51\u5173\u9700\u8981\u914d\u7f6e\uff0c\u5207\u8bb0<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>yum install dnsmasq -y\n\n# \u8bbe\u7f6e\u4e0a\u6e38DNS\uff0c\u6bd5\u7adf\u4f60\u7684Dns\u53ea\u662f\u4e2a\u4ee3\u7406(\u4e00\u5b9a\u8981\u914d\u7f6e\u5bf9\uff0c\u5426\u5219\u767b\u5f55\u63d0\u793a502\u9519\u8bef)\ncat >\/etc\/resolv.dnsmasq &lt;&lt;EOF\nnameserver 114.114.114.114\nnameserver 8.8.8.8\nEOF\n\n# \u8bbe\u7f6ehost\u89e3\u6790\n#\u56e0\u4e3a\u662f\u5206\u5e03\u5f0f\u90e8\u7f72\u7684\uff0c\u6240\u4ee5\u6bcf\u4e2a\u6a21\u5757\u5bf9\u5e94\u7684\u673a\u5668IP\u4e00\u5b9a\u4e0d\u8981\u641e\u9519\uff0c\u8fd9\u4e2a\u5f88\u91cd\u8981\uff0c\u540e\u9762\u7f51\u5173\u4e5f\u8981\u4f9d\u8d56\u6b64DNS\u53bb\u89e3\u6790\u4f60\u7684\u57df\u540d\uff0c\u5e2e\u4f60\u505a\u670d\u52a1\u8f6c\u53d1\u7684\uff0c\u5207\u8bb0\uff01\uff01\uff01\uff01\ncat >\/etc\/dnsmasqhosts &lt;&lt;EOF\n$LOCALHOST_IP demo-init.opendevops.cn\n$LOCALHOST_IP mg.opendevops.cn\n$LOCALHOST_IP task.opendevops.cn\n$LOCALHOST_IP gw.opendevops.cn\n$LOCALHOST_IP cmdb2.opendevops.cn\n$LOCALHOST_IP kerrigan.opendevops.cn\n$LOCALHOST_IP tools.opendevops.cn\n$LOCALHOST_IP cron.opendevops.cn\n$LOCALHOST_IP dns.opendevops.cn\nEOF\n\n# \u6dfb\u52a0\u914d\u7f6e\necho -e \"\\033&#91;32m &#91;INFO]: \u521a\u88c5\u5b8cDNS\u53ef\u4ee5\u5148\u4e0d\u7528\u6539\u672c\u673a\u7684DNS\uff0c\u6709\u4e00\u90e8\u5206\u4eba\u53cd\u5e94Docker Build\u65f6\u5019\u4f1a\u62a5\u8fde\u4e0d\u4e0amirrors\uff0c\u88c5\u4e0d\u4e86\u4f9d\u8d56\u3002\u90e8\u7f72\u5230API\u7f51\u5173\u7684\u65f6\u5019\uff0c\u9700\u8981\u5c06\u672c\u673aDNS\u6539\u6210\u81ea\u5df1\uff0c\u4e0d\u7136\u6ca1\u529e\u6cd5\u8bbf\u95ee\u4ee5\u4e0amg\uff0ccron\uff0ccmdb\u7b49\u5185\u7f51\u57df\u540d\n\\033&#91;0m\"\n\n# \u6ce8\u610f\u4e0b\u4e00\u6b65\u662f\u8986\u76d6\u4f60\u672c\u673a\u7684DNS\uff0c\u5efa\u8bae\u628a\u4f60\u7684DNS\u5730\u5740\u52a0\u5728\/etc\/resolv.dnsmasq \u91cc\u9762 \ncp -rp \/etc\/resolv.conf \/etc\/resolv.conf-`date +%F`\n# echo \"nameserver $LOCALHOST_IP\" > \/etc\/resolv.conf  \nsed \"1i\\nameserver ${LOCALHOST_IP}\" \/etc\/resolv.conf -i \n###\u6ce8\u610f\u6ce8\u610f\uff0c \u8fd9\u91cc\u4fee\u6539\u5b8c\u540e\uff0c\u8bf7\u4f60\u4e00\u5b9a\u8981\u786e\u5b9a\u4f60nameserver ${LOCALHOST_IP} \u5185\u90e8DNS\u5728\u7b2c\u4e00\u6761\u3001\u7b2c\u4e00\u6761\u3001\u7b2c\u4e00\u6761\uff0c\u653e\u5728\u4e0b\u9762\u662f\u4e0d\u80fd\u6b63\u5e38\u89e3\u6790\u7684.\n\necho \"resolv-file=\/etc\/resolv.dnsmasq\" >> \/etc\/dnsmasq.conf\necho \"addn-hosts=\/etc\/dnsmasqhosts\" >> \/etc\/dnsmasq.conf\n\n## \u542f\u52a8\nsystemctl enable dnsmasq.service\nsystemctl start dnsmasq.service\nsystemctl status dnsmasq\nif &#91; $? == 0 ];then\n    echo -e \"\\033&#91;32m &#91;INFO]: dnsmasq install success. \\033&#91;0m\"\nelse\n    echo -e \"\\033&#91;31m &#91;ERROR]: dnsmasq install faild \\033&#91;0m\"\n    exit -6\nfi<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">  <strong>\u57fa\u7840\u4f9d\u8d56\u90e8\u7f72\u5b8c\u6bd5<\/strong> <\/p>\n\n\n\n<p class=\"has-background has-vivid-purple-background-color wp-block-paragraph\">\u6ce8\u610f\uff1a\u4e0a\u6e38dns\u4e00\u6837\u8981\u8bbe\u7f6e(\/etc\/resolv.dnsmasq),\u5982\u679c\u7535\u8111\u53ef\u4ee5\u4e0a\u5916\u7f51\u5c31\u6309\u7167\u4e0a\u9762\u8bbe\u7f6e\u5373\u53ef\uff0c\u5982\u679c\u662f\u5185\u90e8\u5c40\u57df\u7f51\uff0c\u5c31\u8bbe\u7f6e\u6210\u516c\u53f8\u6307\u5b9a\u7684DNS\u670d\u52a1\u5668<\/p>\n\n\n\n<p class=\"has-background has-luminous-vivid-orange-background-color wp-block-paragraph\">\u6ce8\u610f\uff1a\u9664\u4e86DNS\u662f\u673a\u5668A\u5b89\u88c5\u5916\uff0c\u5176\u4f59\u4f9d\u8d56\u73af\u5883\u4e24\u53f0\u673a\u5668\u4e00\u6a21\u4e00\u6837<\/p>\n\n\n\n<p class=\"has-text-color has-text-align-center has-medium-font-size has-vivid-purple-color wp-block-paragraph\"><strong>\u673a\u5668A\u5b89\u88c5<\/strong><\/p>\n\n\n\n<p class=\"has-text-color has-very-dark-gray-color wp-block-paragraph\">\u4e00\u3001<strong>\u9879\u76ee\u524d\u7aef\uff1a<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>[ ! -d \/opt\/codo\/codo\/ ] &amp;&amp; mkdir -p \/opt\/codo\/codo\/ &amp;&amp; cd \/opt\/codo\/codo\/<\/code>     \u5982\u679c\u4e0d\u5b58\u5728\u521b\u5efa\u76ee\u5f55<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">1\u3001\u4fee\u6539\u57df\u540d\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e0b\u5217\u4e3a\u9ed8\u8ba4\u57df\u540d\uff0c\u5982\u679c\u8981\u4fee\u6539\u8bbf\u95ee\u5165\u53e3\u5730\u5740\u8bf7\u4fee\u6539<code>server_name<\/code>\u5bf9\u5e94\u7684<code>demo-init.opendevops.cn<\/code>\uff0c\u786e\u4fdd\u80fdDNS\u89e3\u6790\u5230\u6b64\u57df\u540d\uff0c\u6216\u8005\u81ea\u5df1\u7ed1\u5b9ahosts\u6765\u6d4b\u8bd5\u4e00\u4e0b <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat >codo_frontend.conf &lt;&lt;\\EOF\nserver {\n        listen       80;\n        server_name demo-init.opendevops.cn;\n        access_log \/var\/log\/nginx\/codo-access.log;\n        error_log  \/var\/log\/nginx\/codo-error.log;\n\n        location \/ {\n                    root \/var\/www\/codo;\n                    index index.html index.htm;\n                    try_files $uri $uri\/ \/index.html;\n        }\n        location \/api {\n                proxy_http_version 1.1;\n                proxy_set_header Upgrade $http_upgrade;\n                proxy_set_header Connection \"upgrade\";\n                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n\n                add_header 'Access-Control-Allow-Origin' '*';\n                proxy_pass http:\/\/gw.opendevops.cn:8888;\n        }\n\n        location ~ \/(.svn|.git|admin|manage|.sh|.bash)$ {\n            return 403;\n        }\n}\nEOF<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"> 2\u3001<strong>\u521b\u5efaDockerfile<\/strong>\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat >Dockerfile &lt;&lt;EOF\nFROM registry.cn-shanghai.aliyuncs.com\/ss1917\/codo\n#\u6ce8\u610f\uff1a\u5982\u679c\u662f\u5185\u90e8\u65e0\u7f51\u8def\u673a\u5668\uff0c\u53ef\u5148\u901a\u8fc7docker load -i \u5bfc\u5165\u955c\u50cf\n#\u4fee\u6539nginx\u914d\u7f6e\n#ADD nginx.conf \/etc\/nginx\/nginx.conf\nADD codo_frontend.conf \/etc\/nginx\/conf.d\/codo_frontend.conf\n\nEXPOSE 80\nEXPOSE 443\n\nSTOPSIGNAL SIGTERM\nCMD &#91;\"nginx\", \"-g\", \"daemon off;\"]\nEOF<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">3\u3001 <strong>\u521b\u5efa docker-compose.yml<\/strong> <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat >docker-compose.yml &lt;&lt;EOF\ncodo:\n  restart: unless-stopped\n  image: codo_image\n  volumes:\n    - \/var\/log\/nginx\/:\/var\/log\/nginx\/\n    - \/sys\/fs\/cgroup:\/sys\/fs\/cgroup\n  ports:\n    - \"80:80\"\n    - \"443:443\"\nEOF<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">4\u3001\u7f16\u8bd1\u542f\u52a8<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker build . -t codo_image\ndocker-compose up -d<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">5\u3001\u6d4b\u8bd5<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl  0.0.0.0:80\ntailf  \/var\/log\/nginx\/codo-access.log<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e8c\u3001<strong>\u7ba1\u7406\u540e\u7aef\uff1a<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>codo-admin<\/code>\u662f\u57fa\u4e8etornado\u6846\u67b6 restful\u98ce\u683c\u7684API \u5b9e\u73b0\u540e\u53f0\u7ba1\u7406,<a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/opendevops-cn\/codo-admin\" target=\"_blank\">codo\u8be6\u7ec6\u53c2\u8003<\/a>,\u642d\u914d\u4f7f\u7528<code>codo<\/code>\u524d\u7aef(iView+ vue)\u7ec4\u6210\u7684\u4e00\u5957\u540e\u53f0\u7528\u6237 \u6743\u9650\u4ee5\u53ca\u7cfb\u7edf\u7ba1\u7406\u7684\u89e3\u51b3\u65b9\u6848\uff08\u63d0\u4f9b\u767b\u5f55\uff0c\u6ce8\u518c \u5bc6\u7801\u4fee\u6539 \u9274\u6743 \u7528\u6237\u7ba1\u7406 \u89d2\u8272\u7ba1\u7406 \u6743\u9650\u7ba1\u7406 \u524d\u7aef\u7ec4\u4ef6\u7ba1\u7406 \u524d\u7aef\u8def\u7531\u7ba1\u7406 \u901a\u77e5\u670d\u52a1API \u7cfb\u7edf\u57fa\u7840\u4fe1\u606f\u63a5\u53e3\uff09 <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">1\u3001\u83b7\u53d6\u4ee3\u7801\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if ! which wget &amp;>\/dev\/null; then yum install -y wget >\/dev\/null 2>&amp;1;fi\nif ! which git &amp;>\/dev\/null; then yum install -y git >\/dev\/null 2>&amp;1;fi\n&#91; ! -d \/opt\/codo\/ ] &amp;&amp; mkdir -p \/opt\/codo\ncd \/opt\/codo &amp;&amp; git clone https:\/\/github.com\/opendevops-cn\/codo-admin.git &amp;&amp; cd codo-admin\n#\u5982\u679c\u5df2\u7ecf\u672c\u5730\u5df2\u7ecf\u4e0b\u8f7d\u4e86git\u5305\uff0c\u53ef\u4ee5\u4e0a\u4f20\u4f7f\u7528\u5373\u53ef<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">2\u3001\u4fee\u6539settings.py\u914d\u7f6e<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6ce8\u610f\uff1a\u8fd9\u91cc\u7684<code>cookie_secret<\/code>\u548c<code>token_secret<\/code>\u5fc5\u987b\u548c\u4f60\u7684env.sh\u91cc\u9762\u7684\u4fdd\u6301\u4e00\u81f4\uff0c\u540e\u7eed\u7f51\u5173\u4e5f\u8981\u7528\u5230\u8fd9\u4e2a\u3002\u82e5\u4e0d\u4fdd\u6301\u4e00\u76f4\u767b\u9646\u540e\u6821\u9a8c\u4e0d\u901a\u8fc7\u56de\u88ab\u81ea\u52a8\u8e22\u56de\uff0c\u4f1a\u5bfc\u81f4\u9875\u9762\u4e00\u76f4\u4e0d\u505c\u7684\u5237\u65b0\uff0c \u8fd9\u91cc\u7684token_secret\u5fc5\u987b\u8981\u548c\u4f60\u7684\u7f51\u5173\u4fdd\u6301\u4e00\u81f4\uff0c\u8fd9\u4e2a\u503c\u662f\u4eceenv.sh\u62ff\u6765\u7684\uff0c\u4e00\u5b9a\u8981\u505a\u4fee\u6539\uff0c\u9632\u6b62\u7f51\u7ad9\u88ab\u653b\u51fb\uff0c\u5982\u679csecret\u5305\u542b\u6b63\u5219\u7b26\u53f7\u4f1a\u5bfc\u81f4sed\u5931\u8d25\uff0c\u8bf7\u4ed4\u7ec6\u68c0\u67e5 <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#\u5bfc\u5165\u73af\u5883\u53d8\u91cf\u6587\u4ef6\uff0c\u6700\u5f00\u59cb\u51c6\u5907\u7684\u73af\u5883\u53d8\u91cf\u6587\u4ef6\nsource \/opt\/codo\/env.sh\n#\u5982\u679c\u63d0\u793a#\u5206\u9694\u7b26\u5f02\u5e38\uff0c\u53ef\u4ee5\u4f7f\u7528@\u66ff\u6362#\u5373\u53ef(\u53ef\u5199\u6210\u811a\u672c\u7684\u5f62\u5f0f\u6267\u884c)\nsed -i \"s#cookie_secret = .*#cookie_secret = '${cookie_secret}'#g\" settings.py  \nsed -i \"s#token_secret = .*#token_secret = '${token_secret}'#g\" settings.py     \n\n\n#mysql\u914d\u7f6e\u4fe1\u606f\n##\u6211\u4eec\u9879\u76ee\u652f\u6301\u53d6env\u73af\u5883\u53d8\u91cf\uff0c\u4f46\u662f\u8fd8\u662f\u5efa\u8bae\u4fee\u6539\u4e0b\u3002\nDEFAULT_DB_DBNAME='codo_admin'\nsed -i \"s#DEFAULT_DB_DBHOST = .*#DEFAULT_DB_DBHOST = os.getenv('DEFAULT_DB_DBHOST', '${DEFAULT_DB_DBHOST}')#g\" settings.py\nsed -i \"s#DEFAULT_DB_DBPORT = .*#DEFAULT_DB_DBPORT = os.getenv('DEFAULT_DB_DBPORT', '${DEFAULT_DB_DBPORT}')#g\" settings.py\nsed -i \"s#DEFAULT_DB_DBUSER = .*#DEFAULT_DB_DBUSER = os.getenv('DEFAULT_DB_DBUSER', '${DEFAULT_DB_DBUSER}')#g\" settings.py\nsed -i \"s#DEFAULT_DB_DBPWD = .*#DEFAULT_DB_DBPWD = os.getenv('DEFAULT_DB_DBPWD', '${DEFAULT_DB_DBPWD}')#g\" settings.py\nsed -i \"s#DEFAULT_DB_DBNAME = .*#DEFAULT_DB_DBNAME = os.getenv('DEFAULT_DB_DBNAME', '${DEFAULT_DB_DBNAME}')#g\" settings.py\n\n#\u53ea\u8bfbMySQL\u914d\u7f6e\uff0c\u82e5\u662f\u5355\u53f0\u4e5f\u76f4\u63a5\u5199\u6210Master\u5730\u5740\u5373\u53ef\nsed -i \"s#READONLY_DB_DBHOST = .*#READONLY_DB_DBHOST = os.getenv('READONLY_DB_DBHOST', '${READONLY_DB_DBHOST}')#g\" settings.py\nsed -i \"s#READONLY_DB_DBPORT = .*#READONLY_DB_DBPORT = os.getenv('READONLY_DB_DBPORT', '${READONLY_DB_DBPORT}')#g\" settings.py\nsed -i \"s#READONLY_DB_DBUSER = .*#READONLY_DB_DBUSER = os.getenv('READONLY_DB_DBUSER', '${READONLY_DB_DBUSER}')#g\" settings.py\nsed -i \"s#READONLY_DB_DBPWD = .*#READONLY_DB_DBPWD = os.getenv('READONLY_DB_DBPWD', '${READONLY_DB_DBPWD}')#g\" settings.py\nsed -i \"s#READONLY_DB_DBNAME = .*#READONLY_DB_DBNAME = os.getenv('READONLY_DB_DBNAME', '${DEFAULT_DB_DBNAME}')#g\" settings.py\n\n\n#redis\u914d\u7f6e\nsed -i \"s#DEFAULT_REDIS_HOST = .*#DEFAULT_REDIS_HOST = os.getenv('DEFAULT_REDIS_HOST', '${DEFAULT_REDIS_HOST}')#g\" settings.py\nsed -i \"s#DEFAULT_REDIS_PORT = .*#DEFAULT_REDIS_PORT = os.getenv('DEFAULT_REDIS_PORT', '${DEFAULT_REDIS_PORT}')#g\" settings.py\nsed -i \"s#DEFAULT_REDIS_PASSWORD = .*#DEFAULT_REDIS_PASSWORD = os.getenv('DEFAULT_REDIS_PASSWORD', '${DEFAULT_REDIS_PASSWORD}')#g\" settings.py<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">3\u3001 <strong>\u4fee\u6539Dockerfile<\/strong> <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f7f\u7528\u81ea\u52a8\u6784\u5efa\u7684\u955c\u50cf\uff0c\u9ed8\u8ba4\u4f7f\u7528\u6700\u65b0\u7248\u672c\uff0c\u8fd9\u4e00\u6b65\u7684\u76ee\u7684\u662f\u628a\u4fee\u6539\u540e\u7684\u914d\u7f6e\u8986\u76d6\u8fdb\u53bb<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat >Dockerfile &lt;&lt;EOF\nFROM registry.cn-shanghai.aliyuncs.com\/ss1917\/codo-admin\n#\u6ce8\u610f\uff0c\u5982\u679c\u672c\u5730\u6709\u955c\u50cf\uff0c\u53ef\u76f4\u63a5docker load -i \u5bfc\u5165\u5373\u53ef\u4f7f\u7528\nADD settings.py \/var\/www\/codo-admin\/\n\n# COPY doc\/nginx_ops.conf \/etc\/nginx\/conf.d\/default.conf\n# COPY doc\/supervisor_ops.conf  \/etc\/supervisord.conf\n\nEXPOSE 80\nCMD &#91;\"\/usr\/bin\/supervisord\"]\nEOF<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"> 4\u3001\u7f16\u8bd1\u3001\u542f\u52a8<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#bulid \u955c\u50cf\ndocker build . -t do_mg_image\n#\u542f\u52a8\ndocker-compose up -d<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">5\u3001 <strong>\u521b\u5efa\u6570\u636e\u5e93<\/strong> <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>mysql -h127.0.0.1 -uroot -p${MYSQL_PASSWORD} -e 'create database codo_admin default character set utf8mb4 collate utf8mb4_unicode_ci;'<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">6\u3001 <strong>\u521d\u59cb\u5316\u8868\u7ed3\u6784<\/strong> <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>docker exec -ti codo-admin_do_mg_1  \/usr\/local\/bin\/python3 \/var\/www\/codo-admin\/db_sync.py<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">7\u3001 <strong>\u5bfc\u5165\u6570\u636e<\/strong>  \u4e3b\u8981\u662f\u83dc\u5355\uff0c\u7ec4\u4ef6\uff0c\u6743\u9650\u5217\u8868\uff0c\u5185\u7f6e\u7684\u7528\u6237\u7b49 <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#\u5bfc\u5165\u6570\u636e\nmysql -h127.0.0.1 -uroot -p${MYSQL_PASSWORD} codo_admin &lt; .\/doc\/codo_admin_beta0.3.sql<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">8\u3001 <strong>\u6d4b\u8bd5codo-admin<\/strong> <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>tailf  \/var\/log\/supervisor\/mg.log  #\u786e\u8ba4\u6ca1\u6709\u62a5\u9519<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e09\u3001<strong>\u57df\u540d\u7ba1\u7406\uff1a<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"> CODO\u57df\u540d\u7ba1\u7406\u6a21\u5757\uff0c\u7ba1\u7406BIND \u652f\u6301\u667a\u80fd\u89e3\u6790\uff0c\u591a\u57df\u540d\uff0c\u591a\u4e3b<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">1\u3001\u83b7\u53d6\u4ee3\u7801\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if ! which wget &amp;>\/dev\/null; then yum install -y wget >\/dev\/null 2>&amp;1;fi\nif ! which git &amp;>\/dev\/null; then yum install -y git >\/dev\/null 2>&amp;1;fi\n&#91; ! -d \/opt\/codo\/ ] &amp;&amp; mkdir -p \/opt\/codo\ncd \/opt\/codo &amp;&amp; git clone https:\/\/github.com\/opendevops-cn\/codo-dns.git\ncd codo-dns\n#\u6ce8\u610f\uff1a\u5982\u679c\u672c\u5730\u6709git\u5305\uff0c\u76f4\u63a5\u4e0a\u4f20\u4f7f\u7528\u5373\u53ef<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">2\u3001\u4fee\u6539\u914d\u7f6e\u6587\u4ef6settings.py<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#\u5bfc\u5165\u73af\u5883\u53d8\u91cf\u6587\u4ef6\uff0c\u6700\u5f00\u59cb\u51c6\u5907\u7684\u73af\u5883\u53d8\u91cf\u6587\u4ef6\nsource \/opt\/codo\/env.sh\n#\u540e\u7aef\u6570\u636e\u5e93\u540d\u79f0\nCRON_DB_DBNAME='codo_dns' \n\nsed -i \"s#cookie_secret = .*#cookie_secret = '${cookie_secret}'#g\" settings.py\n\n#mysql\u914d\u7f6e\nsed -i \"s#DEFAULT_DB_DBHOST = .*#DEFAULT_DB_DBHOST = os.getenv('DEFAULT_DB_DBHOST', '${DEFAULT_DB_DBHOST}')#g\" settings.py\nsed -i \"s#DEFAULT_DB_DBPORT = .*#DEFAULT_DB_DBPORT = os.getenv('DEFAULT_DB_DBPORT', '${DEFAULT_DB_DBPORT}')#g\" settings.py\nsed -i \"s#DEFAULT_DB_DBUSER = .*#DEFAULT_DB_DBUSER = os.getenv('DEFAULT_DB_DBUSER', '${DEFAULT_DB_DBUSER}')#g\" settings.py\nsed -i \"s#DEFAULT_DB_DBPWD = .*#DEFAULT_DB_DBPWD = os.getenv('DEFAULT_DB_DBPWD', '${DEFAULT_DB_DBPWD}')#g\" settings.py\nsed -i \"s#DEFAULT_DB_DBNAME = .*#DEFAULT_DB_DBNAME = os.getenv('DEFAULT_DB_DBNAME', '${CRON_DB_DBNAME}')#g\" settings.py\n\n#\u53ea\u8bfbMySQL\u914d\u7f6e\nsed -i \"s#READONLY_DB_DBHOST = .*#READONLY_DB_DBHOST = os.getenv('READONLY_DB_DBHOST', '${READONLY_DB_DBHOST}')#g\" settings.py\nsed -i \"s#READONLY_DB_DBPORT = .*#READONLY_DB_DBPORT = os.getenv('READONLY_DB_DBPORT', '${READONLY_DB_DBPORT}')#g\" settings.py\nsed -i \"s#READONLY_DB_DBUSER = .*#READONLY_DB_DBUSER = os.getenv('READONLY_DB_DBUSER', '${READONLY_DB_DBUSER}')#g\" settings.py\nsed -i \"s#READONLY_DB_DBPWD = .*#READONLY_DB_DBPWD = os.getenv('READONLY_DB_DBPWD', '${READONLY_DB_DBPWD}')#g\" settings.py\nsed -i \"s#READONLY_DB_DBNAME = .*#READONLY_DB_DBNAME = os.getenv('READONLY_DB_DBNAME', '${CRON_DB_DBNAME}')#g\" settings.py\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">3\u3001 <strong>\u4fee\u6539Dockerfile<\/strong> <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f7f\u7528\u81ea\u52a8\u6784\u5efa\u7684\u955c\u50cf\uff0c\u9ed8\u8ba4\u4f7f\u7528\u6700\u65b0\u7248\u672c\uff0c\u8fd9\u4e00\u6b65\u7684\u76ee\u7684\u662f\u628a\u4fee\u6539\u540e\u7684\u914d\u7f6e\u8986\u76d6\u8fdb\u53bb <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat >Dockerfile &lt;&lt;EOF\nFROM registry.cn-shanghai.aliyuncs.com\/ss1917\/codo-dns\n#\u6ce8\u610f\uff0c\u5982\u679c\u672c\u5730\u6709\u955c\u50cf\u5305\uff0c\u76f4\u63a5docker load -i \u5bfc\u5165\u5373\u53ef\n#\u4fee\u6539\u5e94\u7528\u914d\u7f6e\nADD settings.py \/var\/www\/codo-dns\/\n\n#\u4fee\u6539nginx\u914d\u7f6e\u548c\u5b88\u62a4\u914d\u7f6e\n#COPY doc\/nginx_ops.conf \/etc\/nginx\/conf.d\/default.conf\n#COPY doc\/supervisor_ops.conf  \/etc\/supervisord.conf\n\nEXPOSE 80\nCMD &#91;\"\/usr\/bin\/supervisord\"]\nEOF<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">4\u3001\u7f16\u8bd1\u3001\u542f\u52a8<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#\u7f16\u8bd1\u955c\u50cf\ndocker build . -t codo_dns_image\n#\u542f\u52a8\ndocker-compose up -d<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">5\u3001 <strong>\u521b\u5efa\u6570\u636e\u5e93<\/strong> <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>mysql -h127.0.0.1 -uroot -p${MYSQL_PASSWORD} -e 'create database `codo_dns` default character set utf8mb4 collate utf8mb4_unicode_ci;'<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">6\u3001 <strong>\u521d\u59cb\u5316\u8868\u7ed3\u6784<\/strong> <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>docker exec -ti codo-dns_codo-dns_1  \/usr\/local\/bin\/python3 \/var\/www\/codo-dns\/db_sync.py<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"> <strong>7\u3001\u91cd\u542f<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>docker-compose  restart<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">8\u3001 <strong>\u6d4b\u8bd5<\/strong>  \u65e5\u5fd7\u6587\u4ef6\u4f4d\u7f6e\u7edf\u4e00\uff1a\/var\/log\/supervisor\/ <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>tailf \/var\/log\/supervisor\/codo_dns.log   #\u786e\u8ba4\u6ca1\u62a5\u9519<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"> <strong>\u56db\u3001\u4efb\u52a1\u7cfb\u7edf<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"> CODO\u4efb\u52a1\u7cfb\u7edf\uff0c\u8d1f\u8d23\u6574\u4e2a\u7cfb\u7edf\u4e2d\u4efb\u52a1\u8c03\u5ea6\uff0c\u6b64\u529f\u80fd\u662f\u5fc5\u987b\u8981\u5b89\u88c5\u7684 <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">1\u3001\u83b7\u53d6\u4ee3\u7801\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if ! which wget &amp;>\/dev\/null; then yum install -y wget >\/dev\/null 2>&1;fi\nif ! which git &amp;>\/dev\/null; then yum install -y git >\/dev\/null 2>&1;fi\n[ ! -d \/opt\/codo\/ ] &amp;&amp; mkdir -p \/opt\/codo\ncd \/opt\/codo &amp;&amp; git clone https:\/\/github.com\/opendevops-cn\/codo-task.git\ncd codo-task<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">2\u3001\u4fee\u6539\u914d\u7f6e\u6587\u4ef6settings.py<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"> \u540c\u6837\uff0c\u8fd9\u91cccodo-task\u4e5f\u652f\u6301\u53d6env\u73af\u5883\u53d8\u91cf\uff0c\u5efa\u8bae\u8fd8\u662f\u4fee\u6539\u4e0b\u9ed8\u8ba4\u914d\u7f6e <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#\u5bfc\u5165\u73af\u5883\u53d8\u91cf\u6587\u4ef6\uff0c\u6700\u5f00\u59cb\u51c6\u5907\u7684\u73af\u5883\u53d8\u91cf\u6587\u4ef6\nsource \/opt\/codo\/env.sh\n\n#\u4fee\u6539\u914d\u7f6e\nTASK_DB_DBNAME='codo_task' \n\n#\u4efb\u52a1\u7cfb\u7edf\u7684\u57df\u540d\nsed -i \"s#cookie_secret = .*#cookie_secret = '${cookie_secret}'#g\" settings.py\n\n#mysql\u914d\u7f6e\nsed -i \"s#DEFAULT_DB_DBHOST = .*#DEFAULT_DB_DBHOST = os.getenv('DEFAULT_DB_DBHOST', '${DEFAULT_DB_DBHOST}')#g\" settings.py\nsed -i \"s#DEFAULT_DB_DBPORT = .*#DEFAULT_DB_DBPORT = os.getenv('DEFAULT_DB_DBPORT', '${DEFAULT_DB_DBPORT}')#g\" settings.py\nsed -i \"s#DEFAULT_DB_DBUSER = .*#DEFAULT_DB_DBUSER = os.getenv('DEFAULT_DB_DBUSER', '${DEFAULT_DB_DBUSER}')#g\" settings.py\nsed -i \"s#DEFAULT_DB_DBPWD = .*#DEFAULT_DB_DBPWD = os.getenv('DEFAULT_DB_DBPWD', '${DEFAULT_DB_DBPWD}')#g\" settings.py\nsed -i \"s#DEFAULT_DB_DBNAME = .*#DEFAULT_DB_DBNAME = os.getenv('DEFAULT_DB_DBNAME', '${TASK_DB_DBNAME}')#g\" settings.py\n\n#\u53ea\u8bfbMySQL\u914d\u7f6e\nsed -i \"s#READONLY_DB_DBHOST = .*#READONLY_DB_DBHOST = os.getenv('READONLY_DB_DBHOST', '${READONLY_DB_DBHOST}')#g\" settings.py\nsed -i \"s#READONLY_DB_DBPORT = .*#READONLY_DB_DBPORT = os.getenv('READONLY_DB_DBPORT', '${READONLY_DB_DBPORT}')#g\" settings.py\nsed -i \"s#READONLY_DB_DBUSER = .*#READONLY_DB_DBUSER = os.getenv('READONLY_DB_DBUSER', '${READONLY_DB_DBUSER}')#g\" settings.py\nsed -i \"s#READONLY_DB_DBPWD = .*#READONLY_DB_DBPWD = os.getenv('READONLY_DB_DBPWD', '${READONLY_DB_DBPWD}')#g\" settings.py\nsed -i \"s#READONLY_DB_DBNAME = .*#READONLY_DB_DBNAME = os.getenv('READONLY_DB_DBNAME', '${TASK_DB_DBNAME}')#g\" settings.py\n\n#redis\u914d\u7f6e\nsed -i \"s#DEFAULT_REDIS_HOST = .*#DEFAULT_REDIS_HOST = os.getenv('DEFAULT_REDIS_HOST', '${DEFAULT_REDIS_HOST}')#g\" settings.py\nsed -i \"s#DEFAULT_REDIS_PORT = .*#DEFAULT_REDIS_PORT = os.getenv('DEFAULT_REDIS_PORT', '${DEFAULT_REDIS_PORT}')#g\" settings.py\nsed -i \"s#DEFAULT_REDIS_PASSWORD = .*#DEFAULT_REDIS_PASSWORD = os.getenv('DEFAULT_REDIS_PASSWORD', '${DEFAULT_REDIS_PASSWORD}')#g\" settings.py\n\n#MQ\u914d\u7f6e\nsed -i \"s#DEFAULT_MQ_ADDR = .*#DEFAULT_MQ_ADDR = os.getenv('DEFAULT_MQ_ADDR', '${DEFAULT_MQ_ADDR}')#g\" settings.py\nsed -i \"s#DEFAULT_MQ_USER = .*#DEFAULT_MQ_USER = os.getenv('DEFAULT_MQ_USER', '${DEFAULT_MQ_USER}')#g\" settings.py\nsed -i \"s#DEFAULT_MQ_PWD = .*#DEFAULT_MQ_PWD = os.getenv('DEFAULT_MQ_PWD', '${DEFAULT_MQ_PWD}')#g\" settings.py\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">3\u3001 <strong>\u4fee\u6539Dockerfile<\/strong> <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f7f\u7528\u81ea\u52a8\u6784\u5efa\u7684\u955c\u50cf\uff0c\u9ed8\u8ba4\u4f7f\u7528\u6700\u65b0\u7248\u672c\uff0c\u8fd9\u4e00\u6b65\u7684\u76ee\u7684\u662f\u628a\u4fee\u6539\u540e\u7684\u914d\u7f6e\u8986\u76d6\u8fdb\u53bb <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat >Dockerfile &lt;&lt;EOF\nFROM registry.cn-shanghai.aliyuncs.com\/ss1917\/codo-task\n#\u5982\u679c\u672c\u5730\u6709\u955c\u50cf\u53ef\u76f4\u63a5\u901a\u8fc7docker load -i\u5bfc\u5165\u5373\u53ef\u4f7f\u7528\n#\u4fee\u6539\u5e94\u7528\u914d\u7f6e\nADD settings.py \/var\/www\/codo-task\/\n\n#\u4fee\u6539nginx\u914d\u7f6e\u548c\u5b88\u62a4\u914d\u7f6e\n#COPY doc\/nginx_ops.conf \/etc\/nginx\/conf.d\/default.conf\n#COPY doc\/supervisor_ops.conf  \/etc\/supervisord.conf\n\nEXPOSE 80\nCMD &#91;\"\/usr\/bin\/supervisord\"]\nEOF<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">4\u3001\u7f16\u8bd1\u3001\u542f\u52a8<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#\u7f16\u8bd1\u955c\u50cf\ndocker build . -t codo_task_image\n#\u542f\u52a8\ndocker-compose up -d<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">5\u3001 <strong>\u521b\u5efa\u6570\u636e\u5e93<\/strong> <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>mysql -h127.0.0.1 -uroot -p${MYSQL_PASSWORD} -e 'create database `codo_task` default character set utf8mb4 collate utf8mb4_unicode_ci;'<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">6\u3001 <strong>\u521d\u59cb\u5316\u8868\u7ed3\u6784<\/strong> <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>docker exec -ti codo-task_codo_task_1  \/usr\/local\/bin\/python3 \/var\/www\/codo-task\/db_sync.py<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">7\u3001 <strong>\u91cd\u542f<\/strong> <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>docker-compose  restart <\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">8\u3001\u6d4b\u8bd5  \u65e5\u5fd7\u6587\u4ef6\u4f4d\u7f6e\u7edf\u4e00\uff1a\/var\/log\/supervisor\/ <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>01. \u67e5\u770b\u65e5\u5fd7\ntailf \/var\/log\/supervisor\/task_scheduler.log  #\u786e\u8ba4\u6ca1\u62a5\u9519\ntailf \/var\/log\/supervisor\/exec_task.log   #\u6267\u884c\u4efb\u52a1\u7684\u65e5\u5fd7<\/code><\/pre>\n\n\n\n<p class=\"has-text-color has-text-align-center has-medium-font-size has-vivid-purple-color wp-block-paragraph\"><strong>\u673a\u5668B\u5b89\u88c5<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e00\u3001<strong>\u8d44\u4ea7\u7ba1\u7406<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">1\u3001\u83b7\u53d6\u4ee3\u7801\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if ! which wget &amp;>\/dev\/null; then yum install -y wget >\/dev\/null 2>&1;fi\nif ! which git &amp;>\/dev\/null; then yum install -y git >\/dev\/null 2>&1;fi\n[ ! -d \/opt\/codo\/ ] &amp;&amp; mkdir -p \/opt\/codo\ncd \/opt\/codo &amp;&amp; git clone https:\/\/github.com\/opendevops-cn\/codo-cmdb.git\ncd codo-cmdb<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">2\u3001\u4fee\u6539\u914d\u7f6e\u6587\u4ef6settings.py<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#\u5bfc\u5165\u73af\u5883\u53d8\u91cf\u6587\u4ef6\uff0c\u6700\u5f00\u59cb\u51c6\u5907\u7684\u73af\u5883\u53d8\u91cf\u6587\u4ef6\nsource \/opt\/codo\/env.sh\n\n#\u4fee\u6539\u914d\u7f6e\n#\u540e\u7aef\u6570\u636e\u5e93\u540d\u79f0,\u5efa\u8bae\u4e0d\u8981\u4fee\u6539\uff0c\u521d\u59cb\u5316data.sql\u5df2\u7ecf\u6307\u5b9a\u4e86\u6570\u636e\u5e93\u540d\u5b57\uff0c\u82e5\u9700\u6539\u8bf7\u4e00\u5757\u4fee\u6539\nCMDB_DB_DBNAME='codo_cmdb' \n\n#\u4efb\u52a1\u7cfb\u7edf\u7684\u57df\u540d\nsed -i \"s#cookie_secret = .*#cookie_secret = '${cookie_secret}'#g\" settings.py\n\n#mysql\u914d\u7f6e\nsed -i \"s#DEFAULT_DB_DBHOST = .*#DEFAULT_DB_DBHOST = os.getenv('DEFAULT_DB_DBHOST', '${DEFAULT_DB_DBHOST}')#g\" settings.py\nsed -i \"s#DEFAULT_DB_DBPORT = .*#DEFAULT_DB_DBPORT = os.getenv('DEFAULT_DB_DBPORT', '${DEFAULT_DB_DBPORT}')#g\" settings.py\nsed -i \"s#DEFAULT_DB_DBUSER = .*#DEFAULT_DB_DBUSER = os.getenv('DEFAULT_DB_DBUSER', '${DEFAULT_DB_DBUSER}')#g\" settings.py\nsed -i \"s#DEFAULT_DB_DBPWD = .*#DEFAULT_DB_DBPWD = os.getenv('DEFAULT_DB_DBPWD', '${DEFAULT_DB_DBPWD}')#g\" settings.py\nsed -i \"s#DEFAULT_DB_DBNAME = .*#DEFAULT_DB_DBNAME = os.getenv('DEFAULT_DB_DBNAME', '${CMDB_DB_DBNAME}')#g\" settings.py\n\n#\u53ea\u8bfbMySQL\u914d\u7f6e\nsed -i \"s#READONLY_DB_DBHOST = .*#READONLY_DB_DBHOST = os.getenv('READONLY_DB_DBHOST', '${READONLY_DB_DBHOST}')#g\" settings.py\nsed -i \"s#READONLY_DB_DBPORT = .*#READONLY_DB_DBPORT = os.getenv('READONLY_DB_DBPORT', '${READONLY_DB_DBPORT}')#g\" settings.py\nsed -i \"s#READONLY_DB_DBUSER = .*#READONLY_DB_DBUSER = os.getenv('READONLY_DB_DBUSER', '${READONLY_DB_DBUSER}')#g\" settings.py\nsed -i \"s#READONLY_DB_DBPWD = .*#READONLY_DB_DBPWD = os.getenv('READONLY_DB_DBPWD', '${READONLY_DB_DBPWD}')#g\" settings.py\nsed -i \"s#READONLY_DB_DBNAME = .*#READONLY_DB_DBNAME = os.getenv('READONLY_DB_DBNAME', '${CMDB_DB_DBNAME}')#g\" settings.py\n\n#redis\u914d\u7f6e\nsed -i \"s#DEFAULT_REDIS_HOST = .*#DEFAULT_REDIS_HOST = os.getenv('DEFAULT_REDIS_HOST', '${DEFAULT_REDIS_HOST}')#g\" settings.py\nsed -i \"s#DEFAULT_REDIS_PORT = .*#DEFAULT_REDIS_PORT = os.getenv('DEFAULT_REDIS_PORT', '${DEFAULT_REDIS_PORT}')#g\" settings.py\nsed -i \"s#DEFAULT_REDIS_PASSWORD = .*#DEFAULT_REDIS_PASSWORD = os.getenv('DEFAULT_REDIS_PASSWORD', '${DEFAULT_REDIS_PASSWORD}')#g\" settings.py\n\n#\u8fd9\u91cc\u5982\u679c\u914d\u7f6ecodo-task\u7684\u6570\u636e\u5e93\u5730\u5740\uff0c\u5219\u5c06\u6570\u636e\u540c\u6b65\u5230\u4f5c\u4e1a\u914d\u7f6e\n\nTASK_DB_DBNAME='codo_task' \nsed -i \"s#CODO_TASK_DB_HOST = .*#CODO_TASK_DB_HOST = os.getenv('CODO_TASK_DB_HOST', '${DEFAULT_DB_DBHOST}')#g\" settings.py\nsed -i \"s#CODO_TASK_DB_PORT = .*#CODO_TASK_DB_PORT = os.getenv('CODO_TASK_DB_PORT', '${DEFAULT_DB_DBPORT}')#g\" settings.py\nsed -i \"s#CODO_TASK_DB_USER = .*#CODO_TASK_DB_USER = os.getenv('CODO_TASK_DB_USER', '${DEFAULT_DB_DBUSER}')#g\" settings.py\nsed -i \"s#CODO_TASK_DB_PWD = .*#CODO_TASK_DB_PWD = os.getenv('CODO_TASK_DB_PWD', '${DEFAULT_DB_DBPWD}')#g\" settings.py\nsed -i \"s#CODO_TASK_DB_DBNAME = .*#CODO_TASK_DB_DBNAME = os.getenv('CODO_TASK_DB_DBNAME', '${TASK_DB_DBNAME}')#g\" settings.py<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">3\u3001 AWS\u4e8b\u4ef6\u548cWebTerminnal\u914d\u7f6e <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"> \u9996\u5148\u5c06webterminal\u90e8\u7f72\u4e0a\u53bb <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker pull webterminal\/webterminallte\ndocker run -itd -p 8080:80 webterminal\/webterminallte<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"> \u4fee\u6539settings.py\u6587\u4ef6 <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Aws Events \u4e8b\u4ef6\u90ae\u4ef6\u901a\u77e5\u4eba\nAWS_EVENT_TO_EMAIL = '1111@qq.com,2222@gmail.com'\n\n#Web Terminal \u5730\u5740\uff0c\u8bf7\u586b\u5199\u4f60\u90e8\u7f72\u7684webterminal\u5730\u5740\n#\u6ce8\u610f\u8fd9\u91cc\u662f\u586b\u5199\u4f60\u4e0a\u9762docker run\u7684\u673a\u5668\u5916\u7f51IP\nWEB_TERMINAL = 'http:\/\/1.1.1.1:8080'<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">4\u3001 <strong>\u4fee\u6539Dockerfile<\/strong> <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f7f\u7528\u81ea\u52a8\u6784\u5efa\u7684\u955c\u50cf\uff0c\u9ed8\u8ba4\u4f7f\u7528\u6700\u65b0\u7248\u672c\uff0c\u8fd9\u4e00\u6b65\u7684\u76ee\u7684\u662f\u628a\u4fee\u6539\u540e\u7684\u914d\u7f6e\u8986\u76d6\u8fdb\u53bb <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat >Dockerfile &lt;&lt;EOF\nFROM registry.cn-shanghai.aliyuncs.com\/ss1917\/codo-cmdb\n\n#\u4fee\u6539\u5e94\u7528\u914d\u7f6e\nADD settings.py \/var\/www\/codo-cmdb\/\n\n#\u4fee\u6539nginx\u914d\u7f6e\u548c\u5b88\u62a4\u914d\u7f6e\n#COPY doc\/nginx_ops.conf \/etc\/nginx\/conf.d\/default.conf\n#COPY doc\/supervisor_ops.conf  \/etc\/supervisord.conf\n\nEXPOSE 80\nCMD [\"\/usr\/bin\/supervisord\"]\nEOF<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">5\u3001\u7f16\u8bd1\u3001\u542f\u52a8<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#bulid \u955c\u50cf\ndocker build . -t codo_cmdb\n#\u542f\u52a8\ndocker-compose up -d<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">6\u3001<strong>\u521b\u5efa\u6570\u636e\u5e93<\/strong> <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>mysql -h127.0.0.1 -uroot -p${MYSQL_PASSWORD} -e 'create database `codo_cmdb` default character set utf8mb4 collate utf8mb4_unicode_ci;'<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">7\u3001 <strong>\u521d\u59cb\u5316\u8868\u7ed3\u6784<\/strong> <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>docker exec -ti codo-cmdb_codo_cmdb_1 \/usr\/local\/bin\/python3 \/var\/www\/codo-cmdb\/db_sync.py<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"> <strong>8\u3001\u91cd\u542f<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>docker-compose  restart <\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">9\u3001\u6d4b\u8bd5\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>\u670d\u52a1\u65e5\u5fd7\uff1a<code>\/var\/log\/supervisor\/cmdb.log<\/code>&nbsp;#\u4e3b\u7a0b\u5e8f\u65e5\u5fd7<\/li><li>\u5b9a\u65f6\u65e5\u5fd7\uff1a<code>\/var\/log\/supervisor\/cmdb_cron.log<\/code>&nbsp;#\u4e00\u4e9b\u540e\u7aef\u5b88\u62a4\u81ea\u52a8\u8fd0\u884c\u7684\u65e5\u5fd7<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>tailf \/var\/log\/supervisor\/cmdb.log\ntailf \/var\/log\/supervisor\/cmdb_cron.log <\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e8c\u3001<strong>\u5b9a\u65f6\u4efb\u52a1\uff1a<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"> CODO\u9879\u76ee\u5b9a\u65f6\u4efb\u52a1\u6a21\u5757\uff0c\u5b9a\u65f6\u4efb\u52a1\u5b8c\u5168\u517c\u5bb9crontab\uff0c\u652f\u6301\u5230\u79d2\u7ea7 \uff0c Docker\u90e8\u7f72\u9700\u8981\u5c06\u4f60\u7684\u811a\u672c\u76ee\u5f55\u5355\u72ec\u6302\u8f7d\u51fa\u6765 <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">1\u3001\u83b7\u53d6\u4ee3\u7801\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if ! which wget &amp;>\/dev\/null; then yum install -y wget >\/dev\/null 2>&1;fi\nif ! which git &amp;>\/dev\/null; then yum install -y git >\/dev\/null 2>&1;fi\n[ ! -d \/opt\/codo\/ ] &amp;&amp; mkdir -p \/opt\/codo\ncd \/opt\/codo &amp;&amp; git clone https:\/\/github.com\/opendevops-cn\/codo-cron.git\ncd codo-cron<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">2\u3001\u4fee\u6539\u914d\u7f6e\u6587\u4ef6settings.py<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#\u5bfc\u5165\u73af\u5883\u53d8\u91cf\u6587\u4ef6\uff0c\u6700\u5f00\u59cb\u51c6\u5907\u7684\u73af\u5883\u53d8\u91cf\u6587\u4ef6\nsource \/opt\/codo\/env.sh\n#\u540e\u7aef\u6570\u636e\u5e93\u540d\u79f0,\u5efa\u8bae\u4e0d\u8981\u4fee\u6539\uff0c\u521d\u59cb\u5316data.sql\u5df2\u7ecf\u6307\u5b9a\u4e86\u6570\u636e\u5e93\u540d\u5b57\uff0c\u82e5\u9700\u6539\u8bf7\u4e00\u5757\u4fee\u6539\nCRON_DB_DBNAME='codo_cron' \n\nsed -i \"s#cookie_secret = .*#cookie_secret = '${cookie_secret}'#g\" settings.py\n\n#mysql\u914d\u7f6e\nsed -i \"s#DEFAULT_DB_DBHOST = .*#DEFAULT_DB_DBHOST = os.getenv('DEFAULT_DB_DBHOST', '${DEFAULT_DB_DBHOST}')#g\" settings.py\nsed -i \"s#DEFAULT_DB_DBPORT = .*#DEFAULT_DB_DBPORT = os.getenv('DEFAULT_DB_DBPORT', '${DEFAULT_DB_DBPORT}')#g\" settings.py\nsed -i \"s#DEFAULT_DB_DBUSER = .*#DEFAULT_DB_DBUSER = os.getenv('DEFAULT_DB_DBUSER', '${DEFAULT_DB_DBUSER}')#g\" settings.py\nsed -i \"s#DEFAULT_DB_DBPWD = .*#DEFAULT_DB_DBPWD = os.getenv('DEFAULT_DB_DBPWD', '${DEFAULT_DB_DBPWD}')#g\" settings.py\nsed -i \"s#DEFAULT_DB_DBNAME = .*#DEFAULT_DB_DBNAME = os.getenv('DEFAULT_DB_DBNAME', '${CRON_DB_DBNAME}')#g\" settings.py\n\n#\u53ea\u8bfbMySQL\u914d\u7f6e\nsed -i \"s#READONLY_DB_DBHOST = .*#READONLY_DB_DBHOST = os.getenv('READONLY_DB_DBHOST', '${READONLY_DB_DBHOST}')#g\" settings.py\nsed -i \"s#READONLY_DB_DBPORT = .*#READONLY_DB_DBPORT = os.getenv('READONLY_DB_DBPORT', '${READONLY_DB_DBPORT}')#g\" settings.py\nsed -i \"s#READONLY_DB_DBUSER = .*#READONLY_DB_DBUSER = os.getenv('READONLY_DB_DBUSER', '${READONLY_DB_DBUSER}')#g\" settings.py\nsed -i \"s#READONLY_DB_DBPWD = .*#READONLY_DB_DBPWD = os.getenv('READONLY_DB_DBPWD', '${READONLY_DB_DBPWD}')#g\" settings.py\nsed -i \"s#READONLY_DB_DBNAME = .*#READONLY_DB_DBNAME = os.getenv('READONLY_DB_DBNAME', '${CRON_DB_DBNAME}')#g\" settings.py<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">3\u3001 <strong>\u4fee\u6539Dockerfile<\/strong> <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"> \u4f7f\u7528\u81ea\u52a8\u6784\u5efa\u7684\u955c\u50cf\uff0c\u9ed8\u8ba4\u4f7f\u7528\u6700\u65b0\u7248\u672c\uff0c\u8fd9\u4e00\u6b65\u7684\u76ee\u7684\u662f\u628a\u4fee\u6539\u540e\u7684\u914d\u7f6e\u8986\u76d6\u8fdb\u53bb <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat >Dockerfile &lt;&lt;EOF\nFROM registry.cn-shanghai.aliyuncs.com\/ss1917\/codo-cron\n\n#\u4fee\u6539\u5e94\u7528\u914d\u7f6e\nADD settings.py \/var\/www\/codo-cron\/\n\nEXPOSE 80\nCMD [\"\/usr\/bin\/supervisord\"]\nEOF<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">4\u3001 <strong>\u7f16\u8bd1\uff0c\u542f\u52a8<\/strong> <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#\u7f16\u8bd1\u955c\u50cf\ndocker build . -t codo_cron_image\n#\u542f\u52a8\ndocker-compose up -d<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">5\u3001 <strong>\u521b\u5efa\u6570\u636e\u5e93<\/strong> <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>mysql -h127.0.0.1 -uroot -p${MYSQL_PASSWORD} -e 'create database `codo_cron` default character set utf8mb4 collate utf8mb4_unicode_ci;'<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"> <strong>6\u3001\u521d\u59cb\u5316\u8868\u7ed3\u6784<\/strong> <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>docker exec -ti codo-cron_codo_cron_1  \/usr\/local\/bin\/python3 \/var\/www\/codo-cron\/db_sync.py<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">7\u3001 <strong>\u91cd\u542f<\/strong> <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>docker-compose  restart <\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">8\u3001 \u65e5\u5fd7\u6587\u4ef6\u4f4d\u7f6e\u7edf\u4e00\uff1a\/var\/log\/supervisor\/ <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>tailf \/var\/log\/supervisor\/cron.log   #\u786e\u8ba4\u6ca1\u62a5\u9519<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e09\u3001<strong>\u8fd0\u7ef4\u5de5\u5177<\/strong>\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">CODO\u8fd0\u7ef4\u5de5\u5177\u652f\u6301\uff1a\u544a\u8b66\u7ba1\u7406\u3001\u9879\u76ee\u7ba1\u7406\u3001\u4e8b\u4ef6\u7ba1\u7406\u3001\u52a0\u5bc6\u89e3\u5bc6\u3001\u968f\u673a\u5bc6\u7801\u3001\u63d0\u9192\u7ba1\u7406\u7b49 <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">1\u3001\u83b7\u53d6\u4ee3\u7801\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if ! which wget &amp;>\/dev\/null; then yum install -y wget >\/dev\/null 2>&1;fi\nif ! which git &amp;>\/dev\/null; then yum install -y git >\/dev\/null 2>&1;fi\n[ ! -d \/opt\/codo\/ ] &amp;&amp; mkdir -p \/opt\/codo\ncd \/opt\/codo &amp;&amp; git clone https:\/\/github.com\/opendevops-cn\/codo-tools.git &amp;&amp; cd codo-tools<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">2\u3001\u4fee\u6539settings.py\u914d\u7f6e\u6587\u4ef6<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#\u5bfc\u5165\u73af\u5883\u53d8\u91cf\u6587\u4ef6\uff0c\u6700\u5f00\u59cb\u51c6\u5907\u7684\u73af\u5883\u53d8\u91cf\u6587\u4ef6\nsource \/opt\/codo\/env.sh\n\nsed -i \"s#cookie_secret = .*#cookie_secret = '${cookie_secret}'#g\" settings.py \n\n#mysql\u914d\u7f6e\u4fe1\u606f\n##\u6211\u4eec\u9879\u76ee\u652f\u6301\u53d6env\u73af\u5883\u53d8\u91cf\uff0c\u4f46\u662f\u8fd8\u662f\u5efa\u8bae\u4fee\u6539\u4e0b\u3002\nDEFAULT_DB_DBNAME='codo_tools'\nsed -i \"s#DEFAULT_DB_DBHOST = .*#DEFAULT_DB_DBHOST = os.getenv('DEFAULT_DB_DBHOST', '${DEFAULT_DB_DBHOST}')#g\" settings.py\nsed -i \"s#DEFAULT_DB_DBPORT = .*#DEFAULT_DB_DBPORT = os.getenv('DEFAULT_DB_DBPORT', '${DEFAULT_DB_DBPORT}')#g\" settings.py\nsed -i \"s#DEFAULT_DB_DBUSER = .*#DEFAULT_DB_DBUSER = os.getenv('DEFAULT_DB_DBUSER', '${DEFAULT_DB_DBUSER}')#g\" settings.py\nsed -i \"s#DEFAULT_DB_DBPWD = .*#DEFAULT_DB_DBPWD = os.getenv('DEFAULT_DB_DBPWD', '${DEFAULT_DB_DBPWD}')#g\" settings.py\nsed -i \"s#DEFAULT_DB_DBNAME = .*#DEFAULT_DB_DBNAME = os.getenv('DEFAULT_DB_DBNAME', '${DEFAULT_DB_DBNAME}')#g\" settings.py\n\n#redis\u914d\u7f6e\nsed -i \"s#DEFAULT_REDIS_HOST = .*#DEFAULT_REDIS_HOST = os.getenv('DEFAULT_REDIS_HOST', '${DEFAULT_REDIS_HOST}')#g\" settings.py\nsed -i \"s#DEFAULT_REDIS_PORT = .*#DEFAULT_REDIS_PORT = os.getenv('DEFAULT_REDIS_PORT', '${DEFAULT_REDIS_PORT}')#g\" settings.py\nsed -i \"s#DEFAULT_REDIS_PASSWORD = .*#DEFAULT_REDIS_PASSWORD = os.getenv('DEFAULT_REDIS_PASSWORD', '${DEFAULT_REDIS_PASSWORD}')#g\" settings.py<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">3\u3001 <strong>\u4fee\u6539Dockerfile<\/strong> <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"> \u4f7f\u7528\u81ea\u52a8\u6784\u5efa\u7684\u955c\u50cf\uff0c\u9ed8\u8ba4\u4f7f\u7528\u6700\u65b0\u7248\u672c\uff0c\u8fd9\u4e00\u6b65\u7684\u76ee\u7684\u662f\u628a\u4fee\u6539\u540e\u7684\u914d\u7f6e\u8986\u76d6\u8fdb\u53bb <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat >Dockerfile &lt;&lt;EOF\nFROM registry.cn-shanghai.aliyuncs.com\/ss1917\/codo-tools\n#\u5982\u679c\u672c\u5730\u6709\u955c\u50cf\u53ef\u76f4\u63a5\u4f7f\u7528docker load -i \u5bfc\u5165\n#\u4fee\u6539\u5e94\u7528\u914d\u7f6e\nADD settings.py \/var\/www\/codo-tools\/\n\n#\u4fee\u6539nginx\u914d\u7f6e\u548c\u5b88\u62a4\u914d\u7f6e\n#COPY doc\/nginx_ops.conf \/etc\/nginx\/conf.d\/default.conf\n#COPY doc\/supervisor_ops.conf  \/etc\/supervisord.conf\n\nEXPOSE 80\nCMD &#91;\"\/usr\/bin\/supervisord\"]\nEOF<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">4\u3001<strong>\u7f16\u8bd1\u3001\u542f\u52a8<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#\u7f16\u8bd1\u955c\u50cf\ndocker build . -t codo_cron_image\n#\u542f\u52a8\ndocker-compose up -d<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">5\u3001 <strong>\u521b\u5efa\u6570\u636e\u5e93<\/strong> <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>mysql -h127.0.0.1 -uroot -p${MYSQL_PASSWORD} -e 'create database `codo_tools` default character set utf8mb4 collate utf8mb4_unicode_ci;'<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">6\u3001 <strong>\u521d\u59cb\u5316\u8868\u7ed3\u6784<\/strong> <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>docker exec -ti  codo-tools_codo_tools_1  \/usr\/local\/bin\/python3 \/var\/www\/codo-tools\/db_sync.py <\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">7\u3001\u91cd\u542f<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>docker-compose  restart <\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">8\u3001 <strong>\u6d4b\u8bd5codo-tools<\/strong> <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>tailf \/var\/log\/supervisor\/tools.log  #\u670d\u52a1\u65e5\u5fd7\uff0c\u786e\u8ba4\u6ca1\u6709\u62a5\u9519\ntailf \/var\/log\/supervisor\/cron_jobs.log  #\u5b9a\u65f6\u63d0\u9192\u65e5\u5fd7<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u56db\u3001<strong>\u914d\u7f6e\u4e2d\u5fc3<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">1\u3001\u83b7\u53d6\u4ee3\u7801<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if ! which wget &amp;>\/dev\/null; then yum install -y wget >\/dev\/null 2>&1;fi\nif ! which git &amp;>\/dev\/null; then yum install -y git >\/dev\/null 2>&1;fi\n[ ! -d \/opt\/codo\/ ] &amp;&amp; mkdir -p \/opt\/codo\ncd \/opt\/codo &amp;&amp; git clone https:\/\/github.com\/opendevops-cn\/kerrigan.git &amp;&amp; cd kerrigan<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">2\u3001\u4fee\u6539\u914d\u7f6e\u6587\u4ef6settings.py<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#\u5bfc\u5165\u73af\u5883\u53d8\u91cf\u6587\u4ef6\uff0c\u6700\u5f00\u59cb\u51c6\u5907\u7684\u73af\u5883\u53d8\u91cf\u6587\u4ef6\nsource \/opt\/codo\/env.sh\n#\u4fee\u6539\u7ba1\u7406\u540e\u7aef\u57df\u540d\nsed -i \"s#cookie_secret = .*#cookie_secret = '${cookie_secret}'#g\" settings.py \n\n#mysql\u914d\u7f6e\u4fe1\u606f\n##\u6211\u4eec\u9879\u76ee\u652f\u6301\u53d6env\u73af\u5883\u53d8\u91cf\uff0c\u4f46\u662f\u8fd8\u662f\u5efa\u8bae\u4fee\u6539\u4e0b\u3002\nDEFAULT_DB_DBNAME='codo_kerrigan'\nsed -i \"s#DEFAULT_DB_DBHOST = .*#DEFAULT_DB_DBHOST = os.getenv('DEFAULT_DB_DBHOST', '${DEFAULT_DB_DBHOST}')#g\" settings.py\nsed -i \"s#DEFAULT_DB_DBPORT = .*#DEFAULT_DB_DBPORT = os.getenv('DEFAULT_DB_DBPORT', '${DEFAULT_DB_DBPORT}')#g\" settings.py\nsed -i \"s#DEFAULT_DB_DBUSER = .*#DEFAULT_DB_DBUSER = os.getenv('DEFAULT_DB_DBUSER', '${DEFAULT_DB_DBUSER}')#g\" settings.py\nsed -i \"s#DEFAULT_DB_DBPWD = .*#DEFAULT_DB_DBPWD = os.getenv('DEFAULT_DB_DBPWD', '${DEFAULT_DB_DBPWD}')#g\" settings.py\nsed -i \"s#DEFAULT_DB_DBNAME = .*#DEFAULT_DB_DBNAME = os.getenv('DEFAULT_DB_DBNAME', '${DEFAULT_DB_DBNAME}')#g\" settings.py\n\n#\u53ea\u8bfbMySQL\u914d\u7f6e\uff0c\u82e5\u662f\u5355\u53f0\u4e5f\u76f4\u63a5\u5199\u6210Master\u5730\u5740\u5373\u53ef\nsed -i \"s#READONLY_DB_DBHOST = .*#READONLY_DB_DBHOST = os.getenv('READONLY_DB_DBHOST', '${READONLY_DB_DBHOST}')#g\" settings.py\nsed -i \"s#READONLY_DB_DBPORT = .*#READONLY_DB_DBPORT = os.getenv('READONLY_DB_DBPORT', '${READONLY_DB_DBPORT}')#g\" settings.py\nsed -i \"s#READONLY_DB_DBUSER = .*#READONLY_DB_DBUSER = os.getenv('READONLY_DB_DBUSER', '${READONLY_DB_DBUSER}')#g\" settings.py\nsed -i \"s#READONLY_DB_DBPWD = .*#READONLY_DB_DBPWD = os.getenv('READONLY_DB_DBPWD', '${READONLY_DB_DBPWD}')#g\" settings.py\nsed -i \"s#READONLY_DB_DBNAME = .*#READONLY_DB_DBNAME = os.getenv('READONLY_DB_DBNAME', '${DEFAULT_DB_DBNAME}')#g\" settings.py\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">3\u3001 <strong>\u4fee\u6539Dockerfile<\/strong> <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"> \u4f7f\u7528\u81ea\u52a8\u6784\u5efa\u7684\u955c\u50cf\uff0c\u9ed8\u8ba4\u4f7f\u7528\u6700\u65b0\u7248\u672c\uff0c\u8fd9\u4e00\u6b65\u7684\u76ee\u7684\u662f\u628a\u4fee\u6539\u540e\u7684\u914d\u7f6e\u8986\u76d6\u8fdb\u53bb <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat >Dockerfile &lt;&lt;EOF\nFROM registry.cn-shanghai.aliyuncs.com\/ss1917\/codo-kerrigan\n\n#\u4fee\u6539\u5e94\u7528\u914d\u7f6e\nADD settings.py \/var\/www\/kerrigan\/\n\n#\u4fee\u6539nginx\u914d\u7f6e\u548c\u5b88\u62a4\u914d\u7f6e\n#COPY doc\/nginx_ops.conf \/etc\/nginx\/conf.d\/default.conf\n#COPY doc\/supervisor_ops.conf  \/etc\/supervisord.conf\n\nEXPOSE 80\nCMD [\"\/usr\/bin\/supervisord\"]\nEOF<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">4\u3001 <strong>\u7f16\u8bd1\uff0c\u542f\u52a8<\/strong> <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#\u7f16\u8bd1\u955c\u50cf\ndocker build . -t kerrigan_image\n#\u542f\u52a8\ndocker-compose up -d<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">5\u3001 <strong>\u521b\u5efa\u6570\u636e\u5e93<\/strong> <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>mysql -h127.0.0.1 -uroot -p${MYSQL_PASSWORD} -e 'create database `codo_kerrigan` default character set utf8mb4 collate utf8mb4_unicode_ci;'<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">6\u3001 <strong>\u521d\u59cb\u5316\u8868\u7ed3\u6784<\/strong> <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>docker exec -ti  kerrigan_codo-kerrigan_1  \/usr\/local\/bin\/python3 \/var\/www\/kerrigan\/db_sync.py<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">7\u3001 <strong>\u91cd\u542f<\/strong> <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>docker-compose  restart <\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">8\u3001 <strong>\u6d4b\u8bd5kerrigan<\/strong> <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>tailf \/var\/log\/supervisor\/kerrigan.log  #\u786e\u8ba4\u6ca1\u6709\u62a5\u9519<\/code><\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\"><strong>\u6700\u540e\u6765\u914d\u7f6eAPI\u7f51\u5173(\u6700\u5bb9\u6613\u51fa\u9519\u7684\u5730\u65b9)<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>API\u7f51\u5173\u914d\u7f6e\uff1a<\/strong>(\u90e8\u7f72\u5728\u673a\u5668A\u4e0a)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u91cd\u70b9\u90e8\u5206\uff0c\u8bf7\u4ed4\u7ec6\u9605\u8bfb \u7531\u4e8e\u6b64\u9879\u76ee\u662f\u6a21\u5757\u5316\u3001\u5fae\u670d\u52a1\u5316\uff0c\u56e0\u6b64\u9700\u8981\u5728\u501f\u52a9API\u7f51\u5173\uff0c\u9700\u8981\u5728API\u7f51\u5173\u6ce8\u518c\uff0c\u6b64\u6b65\u9aa4\u662f\u5fc5\u987b\u7684\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"> \u5f00\u59cb\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u786e\u8ba4\u4ee5\u4e0b2\u4e2a\u4e8b\u60c5\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li> DNS\u670d\u52a1\u662f\u5426\u6b63\u5e38\uff0c\u57df\u540d\u80fd\u5426\u6b63\u5e38\u89e3\u6790 <\/li><li> \u5fae\u670d\u52a1\u7684\u6a21\u5757\u90e8\u7f72\u662f\u5426\u6b63\u5e38\uff0c\u8fdb\u884c\u68c0\u6d4b  <\/li><\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"> <strong>\u68c0\u67e5DNS\u601d\u8def<\/strong> <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>1. \u786e\u4fdd\u4f60\u7684dnsmasql\u670d\u52a1\u662f\u542f\u52a8\u7684\uff0c\u670d\u52a1\u6ca1\u6709\u62a5\u9519\n2. \u786e\u4fdd\/etc\/dnsmasqhosts\u6587\u4ef6\u6709\u89e3\u6790\u7684IP\n3. \u786e\u4fdd\u4f60\u7f51\u5173\u7684\u8fd9\u53f0\u673a\u5668\/etc\/resolv.conf DNS\u6267\u884c\u4f60\u521a\u90e8\u7f72\u7684dnsmasq\u670d\u52a1IP\n4. \u786e\u4fdd\u4f60\u7f51\u5173\u6240\u5728\u7684\u673a\u5668\u90fd\u80fd\u6b63\u5e38ping\u901a\u6240\u6709\u7684\u670d\u52a1\uff0c\u6bd4\u5982\uff1aping cmdb2.opendevops.cn\n5. \u786e\u4fdd\u4f60\u7684\u9632\u706b\u5899\u89c4\u5219\u662f\u6e05\u7a7a\u7684`iptables -F`\n6. \u786e\u4fdd\u4f60\u7684SELINUX\u662f\u5173\u95ed\u7684`setenforce 0`<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"> <strong>\u670d\u52a1\u5065\u5eb7\u68c0\u6d4b<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># \u8fdb\u884c\u6240\u6709\u670d\u52a1\u8fdb\u884c\u68c0\u6d4b\uff0c\u8fd4\u56de200\u5219\u6b63\u5e38\ncurl -I -X GET -m 10 -o \/dev\/null -s -w %{http_code} http:\/\/mg.opendevops.cn:8010\/are_you_ok\/\ncurl -I -X GET -m 10 -o \/dev\/null -s -w %{http_code} http:\/\/task.opendevops.cn:8020\/are_you_ok\/\ncurl -I -X GET -m 10 -o \/dev\/null -s -w %{http_code} http:\/\/cmdb2.opendevops.cn:8050\/are_you_ok\/\ncurl -I -X GET -m 10 -o \/dev\/null -s -w %{http_code} http:\/\/kerrigan.opendevops.cn:8030\/are_you_ok\/\ncurl -I -X GET -m 10 -o \/dev\/null -s -w %{http_code} http:\/\/cron.opendevops.cn:9900\/are_you_ok\/\ncurl -I -X GET -m 10 -o \/dev\/null -s -w %{http_code} http:\/\/tools.opendevops.cn:8040\/are_you_ok\/\ncurl -I -X GET -m 10 -o \/dev\/null -s -w %{http_code} http:\/\/dns.opendevops.cn:8060\/are_you_ok\/\ncurl -I -X GET -m 10 -o \/dev\/null -s -w %{http_code} http:\/\/0.0.0.0:80<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">1\u3001\u4e0b\u8f7d\u7f51\u5173\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>cd \/opt\/codo\/ &amp;&amp; git clone https:\/\/github.com\/ss1917\/api-gateway.git &amp;&amp; cd \/opt\/codo\/api-gateway<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">2\u3001\u4fee\u6539\u914d\u7f6e( \u4e3b\u8981\u4fee\u6539<code>nginx.conf<\/code>\u914d\u7f6e\u4fe1\u606f\u548c<code>config.lua<\/code>\u914d\u7f6e )<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"> \u8fd9\u91cc\u4e3b\u8981\u4fee\u6539resolver \u5185\u90e8DNS\u670d\u52a1\u5668\u5730\u5740<code>conf\/nginx.conf<\/code>\u00a0,\u56e0\u4e3adnsmasq\u662f\u642d\u5efa\u5728\u673a\u5668A \u4e0a\u9762\uff0c\u56e0\u6b64\u914d\u7f6e\u4e2d\u7684resolver\u5199\u673a\u5668A\u7684\u5730\u5740<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>user root;\nworker_processes auto;\nworker_rlimit_nofile 51200;\nerror_log logs\/error.log;\nevents {\n    use epoll;\n    worker_connections 51024;\n}\nhttp {\n    #\u8bbe\u7f6e\u9ed8\u8ba4lua\u641c\u7d22\u8def\u5f84\n    lua_package_path '$prefix\/lua\/?.lua;\/blah\/?.lua;;';\n    lua_code_cache on;      #\u7ebf\u4e0a\u73af\u5883\u8bbe\u7f6e\u4e3aon, off\u65f6\u53ef\u4ee5\u70ed\u52a0\u8f7dlua\u6587\u4ef6\n    lua_shared_dict user_info 1m;\n    lua_shared_dict my_limit_conn_store 100m;   #100M\u53ef\u4ee5\u653e1.6M\u4e2a\u952e\u503c\u5bf9\n    include             mime.types;    #\u4ee3\u7406\u9759\u6001\u6587\u4ef6\n\n    client_header_buffer_size 64k;\n    large_client_header_buffers 4 64k;\n\n    init_by_lua_file lua\/init_by_lua.lua;       # nginx\u542f\u52a8\u65f6\u5c31\u4f1a\u6267\u884c\n    include .\/conf.d\/*.conf;                    # lua\u751f\u6210upstream\n    resolver 192.168.170.128;                       # \u5185\u90e8DNS\u670d\u52a1\u5668\u5730\u5740 \u4e00\u5b9a\u8981\u4fee\u6539 \u5bf9\u5e94\u8d77\u6765\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">3<strong>\u3001\u7f51\u5173\u914d\u7f6e<\/strong>\u00a0<code>conf\/conf.d\/gw.conf<\/code> <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>server {\n    listen 80;\n    server_name gw.opendevops.cn;\n    lua_need_request_body on;           # \u5f00\u542f\u83b7\u53d6body\u6570\u636e\u8bb0\u5f55\u65e5\u5fd7\n\n    location \/ {\n        ### ws \u652f\u6301\n        proxy_http_version 1.1;\n        proxy_set_header Upgrade $http_upgrade;\n        proxy_set_header Connection \"upgrade\";\n\n        ### \u83b7\u53d6\u771f\u5b9eIP\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n\n        access_by_lua_file lua\/access_check.lua;\n        set $my_upstream $my_upstream;\n        proxy_pass http:\/\/$my_upstream;\n\n        ### \u8de8\u57df\n        add_header Access-Control-Allow-Methods *;\n        add_header Access-Control-Max-Age 3600;\n        add_header Access-Control-Allow-Credentials true;\n        add_header Access-Control-Allow-Origin $http_origin;\n        add_header Access-Control-Allow-Headers $http_access_control_request_headers;\n        if ($request_method = OPTIONS){\n            return 204;}\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">4\u3001<strong>\u6ce8\u518cAPI\u7f51\u5173<\/strong>( \u8bf7\u4ed4\u7ec6\u9605\u8bfb\u4e0b\u9762\u9700\u8981\u4fee\u6539\u914d\u7f6e\u7684\u5730\u65b9<code>vim lua\/configs.lua<\/code>\u00a0==\u8fd9\u4e2a\u914d\u7f6e\u57fa\u672c\u4e0a\u90fd\u8981\u4fee\u6539\uff0c\u8bf7\u52a1\u5fc5\u4ed4\u7ec6== )<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>json = require(\"cjson\")\n\n\n-- redis\u914d\u7f6e\uff0c\u4e00\u5b9a\u8981\u4fee\u6539\uff0c\u5e76\u4e14\u548ccodo-admin\u4fdd\u6301\u4e00\u81f4\uff0cadmin\u4f1a\u628a\u6743\u9650\u5199\u8fdb\u53bb\u63d0\u4f9b\u7f51\u5173\u4f7f\u7528\nredis_config = {\n    host = '192.168.170.128',\n    port = 6379,\n    auth_pwd = 'cWCVKJ7ZHUK12mVbivUf',\n    db = 8,\n    alive_time = 3600 * 24 * 7,\n    channel = 'gw'\n}\n\n\n-- \u6ce8\u610f\uff1a\u8fd9\u91cc\u7684token_secret\u5fc5\u987b\u8981\u548ccodo-admin\u91cc\u9762\u7684token_secret\u4fdd\u6301\u4e00\u81f4\ntoken_secret = \"pXFb4i%*834gfdh96(3df&amp;%18iodGq4ODQyMzc4lz7yI6ImF1dG\"\nlogs_file = '\/var\/log\/gw.log'\n\n--\u5237\u65b0\u6743\u9650\u5230redis\u63a5\u53e3\nrewrite_cache_url = 'http:\/\/mg.opendevops.cn:8010\/v2\/accounts\/verify\/'\n\n-- \u6ce8\u610f\uff1arewrite_cache_token\u8981\u548ccodo-admin\u91cc\u9762\u7684secret_key = '8b888a62-3edb-4920-b446-697a472b4001'\u4fdd\u6301\u4e00\u81f4\nrewrite_cache_token = '8b888a62-3edb-4920-b446-697a472b4001'  \n\n\n--\u5e76\u53d1\u9650\u6d41\u914d\u7f6e\nlimit_conf = {\n    rate = 10, --\u9650\u5236ip\u6bcf\u5206\u949f\u53ea\u80fd\u8c03\u7528n*60\u6b21\u63a5\u53e3\n    burst = 10, --\u6876\u5bb9\u91cf,\u7528\u4e8e\u5e73\u6ed1\u5904\u7406,\u6700\u5927\u63a5\u6536\u8bf7\u6c42\u6b21\u6570\n}\n\n--upstream\u5339\u914d\u89c4\u5219,API\u7f51\u5173\u57df\u540d\ngw_domain_name = 'gw.opendevops.cn' \n\n--\u4e0b\u9762\u7684\u8f6c\u53d1\u4e00\u5b9a\u8981\u4fee\u6539\uff0c\u6839\u636e\u81ea\u5df1\u5b9e\u9645\u6570\u636e\u4fee\u6539\nrewrite_conf = {\n    &#91;gw_domain_name] = {\n        rewrite_urls = {\n            {\n                uri = \"\/dns\",\n                rewrite_upstream = \"dns.opendevops.cn:8060\"\n            },\n            {\n                uri = \"\/cmdb2\",\n                rewrite_upstream = \"cmdb2.opendevops.cn:8050\"\n            },\n            {\n                uri = \"\/tools\",\n                rewrite_upstream = \"tools.opendevops.cn:8040\"\n            },\n            {\n                uri = \"\/kerrigan\",\n                rewrite_upstream = \"kerrigan.opendevops.cn:8030\"\n            },\n            {\n                uri = \"\/cmdb\",\n                rewrite_upstream = \"cmdb.opendevops.cn:8002\"\n            },\n            {\n                uri = \"\/k8s\",\n                rewrite_upstream = \"k8s.opendevops.cn:8001\"\n            },\n            {\n                uri = \"\/task\",\n                rewrite_upstream = \"task.opendevops.cn:8020\"\n            },\n            {\n                uri = \"\/cron\",\n                rewrite_upstream = \"cron.opendevops.cn:9900\"\n            },\n            {\n                uri = \"\/mg\",\n                rewrite_upstream = \"mg.opendevops.cn:8010\"\n            },\n            {\n                uri = \"\/accounts\",\n                rewrite_upstream = \"mg.opendevops.cn:8010\"\n            },\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">5\u3001<strong>\u4fee\u6539Dockerfile<\/strong> <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"> \u4f7f\u7528\u81ea\u52a8\u6784\u5efa\u7684\u955c\u50cf\uff0c\u9ed8\u8ba4\u4f7f\u7528\u6700\u65b0\u7248\u672c\uff0c\u8fd9\u4e00\u6b65\u7684\u76ee\u7684\u662f\u628a\u4fee\u6539\u540e\u7684\u914d\u7f6e\u8986\u76d6\u8fdb\u53bb <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat >Dockerfile &lt;&lt;EOF\nFROM registry.cn-shanghai.aliyuncs.com\/ss1917\/api-gateway\n\n#\u4fee\u6539\u914d\u7f6e\nADD . \/usr\/local\/openresty\/nginx\/\n\nEXPOSE 80\nCMD [\"\/usr\/bin\/openresty\", \"-g\", \"daemon off;\"]\nEOF<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">6\u3001 <strong>\u7f16\u8bd1\uff0c\u542f\u52a8<\/strong> <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#\u7f16\u8bd1\u955c\u50cf\ndocker build . -t gateway_image\n#\u542f\u52a8\ndocker-compose up -d<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u542f\u52a8\u540e\u5730\u5740\u4e3a<code>http:\/\/gw.opendevops.cn:8888<\/code>\uff0c\u8fd9\u91cc\u662f\u548c\u524d\u7aef\u7684\u5730\u5740\u6709\u5bf9\u5e94\uff0c\u8bf7\u52ff\u4fee\u6539 <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">7\u3001\u6d4b\u8bd5<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>curl -I -X GET -m 10 -o \/dev\/null -s -w %{http_code} http:\/\/gw.opendevops.cn:8888\/api\/accounts\/are_you_ok\/<\/code><\/p>\n\n\n\n<p class=\"has-background has-vivid-purple-background-color wp-block-paragraph\"> \u6ce8\u610f\uff1aopenresty\u670d\u52a1\u5668DNS\u5fc5\u987b\u6307\u5411&#8212;>\u6700\u8d77\u521d\u90e8\u7f72\u7684DNS\u670d\u52a1\u5668\u5730\u5740,\u53e6\u5916\u82e5\u4f60\u672c\u673aping\u4ee5\u4e0a\u968f\u4fbf\u4e00\u4e2a\u57df\u540d\u90fd\u4e0d\u901a\u7684\u8bdd\uff0c\u90a3\u4f60\u8981\u786e\u8ba4\u4e0b\u4f60\u672c\u673aDNS\u6307\u5411\u4f60\u6700\u521d\u90e8\u7f72\u4e86DNS\u670d\u52a1\u5668\u4e86\uff1f \u4fee\u6539vim \/etc\/resolv.conf <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>\u6ce8\u610f\uff1a demo-init.opendevops.cn \u5efa\u8bae\u4fee\u6539\u6210\u81ea\u5df1\u7684\u57df\u540d\uff0c\u4e5f\u53ef\u4ee5\u7ed1\u5b9ahosts\u6765\u6d4b\u8bd5\u4e00\u4e0b<\/code>\u00a0\u53ef\u4ee5\u518d\u90e8\u7f72\u524d\u7aef\u7684\u65f6\u5019\u4fee\u6539 <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>8\u3001\u8bbf\u95ee\uff1a<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>\u5730\u5740\uff1ademo-init.opendevops.cn(\u4e5f\u53ef\u4ee5\u901a\u8fc7ip\u8bbf\u95ee)<\/li><li>\u7528\u6237\uff1aadmin<\/li><li>\u5bc6\u7801\uff1aadmin@opendevops<\/li><\/ul>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\"><strong>\u62a5\u9519\uff1a<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">1\u3001\u5982\u679c\u5728\u670d\u52a1\u5065\u5eb7\u68c0\u6d4b\u65f6curl\u63d0\u793a000\uff0c\u6b64\u65f6\u8981\u68c0\u67e5DNS\u914d\u7f6e\uff0c\u4e5f\u5c31\u662f\u90e8\u7f72DNS\u7684\u670d\u52a1\u5668\u7684\/etc\/resolv.conf\uff0c\u6b64\u6587\u4ef6\u4e2d\u8981\u5199\u5165\u672c\u673a\u7684IP\u5730\u5740\u4f5c\u4e3aDNS\u5730\u5740\uff0c\u4f8b\u5982\u673a\u5668A \u7684\u5730\u5740\u4e3a192.168.170.128\uff0c\u90a3\u4e48resolv.conf\u5c31\u5199\u6b64\u5730\u5740\uff0c\u901a\u8fc7\u673a\u5668B\u7684resolv.conf \u4e5f\u8981\u6307\u5b9a\u8fd9\u4e2a\u5730\u5740(\u673a\u5668A \u7684\u5730\u5740)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">2\u3001\u5982\u679c\u521d\u59cb\u5316\u8868\u7ed3\u6784\u7684\u65f6\u5019\u63d0\u793a\u9519\u8bef\uff0c\u8981\u6ce8\u610f\u67e5\u770b\u662f\u5426\u5173\u95ed\u4e86\u9632\u706b\u5899\u3001selinux\u3001\u4ee5\u53ca\u89c4\u5219\u662f\u5426\u6e05\u7a7a\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">3\u3001\u5728\u767b\u5f55\u754c\u9762\u8f93\u5165\u8d26\u53f7\u5bc6\u7801\u540e\uff0c\u70b9\u51fb\u767b\u5f55\u63d0\u793a502\u7f51\u5173\u9519\u8bef\uff0c\u6b64\u65f6\u8981\u68c0\u67e5\u4e0a\u6e38DNS\uff0c\u4e5f\u5c31\u662f\u90e8\u7f72\u4e86DNS\u7684\u673a\u5668(\u673a\u5668A)\u4e2d\u7684\/etc\/resolv.dnsmasq\u6587\u4ef6\uff0c\u5982\u679c\u673a\u5668\u53ef\u4ee5\u8bbf\u95ee\u5916\u90e8\u7f51\u7edc\uff0c\u90a3\u4e48\u914d\u7f6e\u5916\u90e8\u7684DNS\u5373\u53ef(114.114.114.114\/8.8.8.8),\u5982\u679c\u65f6\u5185\u90e8\u673a\u5668\uff0c\u90a3\u4e48\u586b\u5199\u516c\u53f8\u5185\u90e8\u7684DNS\u670d\u52a1\u5668\u5730\u5740\u5373\u53ef<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">4\u3001\u91cd\u542f\u540e\/etc\/resolv.conf\u6587\u4ef6\u9ed8\u8ba4\u4f1a\u6e05\u7a7a\uff0c\u5982\u679c\u8981\u4fdd\u7559\u539f\u6765\u914d\u7f6e\u53ef\u4ee5\u5c06dns\u4fe1\u606f\u5199\u5165\u7f51\u5361\u4e2d\u5373\u53ef<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">5\u3001\u6ce8\u610f\u5728\u5b89\u88c5dnsmasq\u540e\uff0c\u914d\u7f6e\u6587\u4ef6\/etc\/dnsmasqhosts\u4e2d\u7684IP\u5730\u5740\u548c\u57df\u540d\u4e00\u5b9a\u8981\u914d\u7f6e\u6b63\u786e\uff0c\u5426\u5219\u5c06\u4f1a\u89e3\u6790\u9519\u8bef<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u672c\u6559\u7a0b\u57fa\u4e8edocker\u7684\u5168\u5206\u5e03\u5f0f\u5f62\u5f0f\u642d\u5efa\uff0c\u91c7\u7528\u4e24\u53f0\u673a\u5668\u8fdb\u884c\u90e8\u7f72\uff0c\u6bcf\u4e2a\u673a\u5668\u90e8\u7f72\u51e0\u4e2a\u6a21\u5757\uff0c\u4e3a\u5fae\u670d\u52a1\u67b6\u6784\uff0c\u6bcf\u4e2a\u6a21\u5757\u53ef [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":1493,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[34,29],"tags":[46],"class_list":["post-1477","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-linux","category-yunwei","tag-codo"],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":8}},"_links":{"self":[{"href":"https:\/\/blog.ywdevops.cn\/index.php\/wp-json\/wp\/v2\/posts\/1477","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.ywdevops.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.ywdevops.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.ywdevops.cn\/index.php\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.ywdevops.cn\/index.php\/wp-json\/wp\/v2\/comments?post=1477"}],"version-history":[{"count":16,"href":"https:\/\/blog.ywdevops.cn\/index.php\/wp-json\/wp\/v2\/posts\/1477\/revisions"}],"predecessor-version":[{"id":1495,"href":"https:\/\/blog.ywdevops.cn\/index.php\/wp-json\/wp\/v2\/posts\/1477\/revisions\/1495"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.ywdevops.cn\/index.php\/wp-json\/wp\/v2\/media\/1493"}],"wp:attachment":[{"href":"https:\/\/blog.ywdevops.cn\/index.php\/wp-json\/wp\/v2\/media?parent=1477"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.ywdevops.cn\/index.php\/wp-json\/wp\/v2\/categories?post=1477"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.ywdevops.cn\/index.php\/wp-json\/wp\/v2\/tags?post=1477"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}