DEPLOY GOLANG WITH DOCKER AND LOADBALANCING BY DOCKER NGINX
docker-setup.sh
Step 1: #!/bin/bash read -p "Enter work folder (ex: /srv): " SRV[ $SRV ] && [ -s $SRV ] && echo "Work folder: "$SRV || exitread -p "Enter PROJECT: " PROJECT[ -s $PROJECT ] && exit || echo "PROJECT "$PROJECTread -p "Enter IPSERVER: " IPSERVER[ -s $IPSERVER ] && exit || echo "IPSERVER "$IPSERVERread -p "Enter IPSERVER: " IPSERVER[ -s $IPSERVER ] && exit || echo "IPSERVER "$IPSERVERecho "--------------------BEGIN-----------------------" echo "BEGIN SETUP PROJECT "$PROJECTTMP=$SRV/tmp/ && echo "+ TMP "$TMPWWW=$SRV/www/ && echo "+ WWW "$WWWGIT=$SRV/git/ && echo "+ GIT "$GITENV=$SRV/env/ && echo "+ ENV "$ENVecho "------------------------------------------------" [ ! -d $TMP ] && sudo mkdir -p $TMP && echo $TMP" created" && sudo chgrp -R users $TMP && echo $TMP" chgrp users" && sudo chmod g+w $TMP && echo $TMP" chmod g+w" || echo $TMP" find"[ ! -d $WWW ] && sudo mkdir -p $WWW && echo $WWW" created" && sudo chgrp -R users $WWW && echo $WWW" chgrp users" && sudo chmod g+w $WWW && echo $WWW" chmod g+w" || echo $WWW" find"echo "------------------------------------------------" [ ! -d $GIT$PROJECT.git ] && sudo mkdir -p $GIT$PROJECT.git && echo $GIT$PROJECT.git" created" || echo $GIT$PROJECT.git" find"cd $GIT$PROJECT.git/ && echo "cd $GIT$PROJECT.git/"echo "------------------------------------------------" sudo git init --bare && echo "git init --bare"echo "------------------------------------------------" sudo chgrp -R users . && echo "chgrp -R users ."sudo chmod -R g+rwX . && echo "chmod -R g+rwX ."sudo find . -type d -exec chmod g+s '{}' + && echo "find . -type d -exec chmod g+s '{}' +"echo "------------------------------------------------" sudo git config core.sharedRepository group && echo "git config core.sharedRepository group"echo "------------------------------------------------" cd $GIT$PROJECT.git/hooks/ && echo "cd $GIT$PROJECT.git/hooks/"echo "------------------------------------------------" sudo rm $GIT$PROJECT.git/hooks/post-receive && echo "rm $GIT$PROJECT.git/hooks/post-receive"sudo echo '#!/bin/bash # The production directory WWW='$WWW$PROJECT' # A temporary directory for deployment TMP='$TMP$PROJECT' # The Git repo GIT='$GIT$PROJECT.git' # The Env repo ENV='$ENV$PROJECT' # Deploy the content to the temporary directory mkdir -p $TMPgit --work-tree=$TMP --git-dir=$GIT checkout -f # Copy the env variable to the temporary directory cp -a $ENV/. $TMP # Do stuffs, like npm install cd $TMP || exit # Replace the content of the production directory # with the temporary directory cd / || exitrm -rf $WWWmv $TMP $WWW # Do stuff like starting docker cd $WWW || exit# docker-compose up -d --build chmod 777 run$PWD/run' >> $GIT$PROJECT.git/hooks/post-receive && echo $GIT$PROJECT.git/hooks/post-receive" created" sudo touch $GIT$PROJECT.git/hooks/post-receive && echo "touch $GIT$PROJECT.git/hooks/post-receive"sudo chmod +x $GIT$PROJECT.git/hooks/post-receive && echo "chmod +x $GIT$PROJECT.git/hooks/post-receive" echo '---------------------------------------------'echo ''echo 'git remote add deploy ssh://root@'$IPSERVER$GIT$PROJECT'.git/'echo 'git add .'echo 'git commit -m "first commit"'echo 'git push deploy master'
Step 2:
sudo -i snap install dockerapt install docker-composer sh /path/to/docker-setup.sh
local-setup.sh
Step 3: #!/bin/bash read -p "Enter work folder server (ex: /srv): " SRV[ $SRV ] && [ -s $SRV ] && echo "Work folder: "$SRV || exitread -p "Enter PROJECT: " PROJECT[ -s $PROJECT ] && exit || echo "PROJECT "$PROJECTread -p "Enter ipv4 IPSERVER: " IPSERVER[ -s $IPSERVER ] && exit || echo "IPSERVER "$IPSERVERread -p "Enter GOLANG RUN PORT (ex: 8080): " PORT[ -s $PORT ] && exit || echo "GOLANG RUN PORT "$PORTecho "--------------------BEGIN-----------------------" go mod init $PROJECT rm run && echo "rm run"echo '#!/bin/bashsudo docker-compose downsudo docker image rm '$PROJECT'sudo docker-compose up --build -d' >> run && echo run" created" rm Dockerfile && echo "rm Dockerfile"echo 'FROM golang:alpine# app directoryWORKDIR /usr/goapp/'$PROJECT'COPY . .RUN ["go", "build", "."]EXPOSE '$PORT'CMD $PWD/'$PROJECT' # sudo docker build -t go-app .# sudo docker run -p 5001:'$PORT' go-app &# sudo docker run -p 5002:'$PORT' go-app &# sudo docker run -p 5003:'$PORT' go-app &' >> Dockerfile && echo Dockerfile" created" rm docker-compose.yml && echo "rm docker-compose.yml"echo 'version: "3"services: '$PROJECT'1: image: '$PROJECT' ports: - 5001:'$PORT' container_name: '$PROJECT'1 '$PROJECT'2: image: '$PROJECT' ports: - 5002:'$PORT' container_name: '$PROJECT'2 '$PROJECT'3: build: . image: '$PROJECT' ports: - 5003:'$PORT' container_name: '$PROJECT'3 nginxloadbalancing: image: nginx:alpine volumes: - ./conf.d:/etc/nginx/conf.d ports: - 5554:8000 - '$PORT':'$PORT' container_name: nginxloadbalancing' >> docker-compose.yml && echo docker-compose.yml" created" mkdir conf.d rm conf.d/go-loadbalancing.conf && echo "rm conf.d/go-loadbalancing.conf"echo 'upstream loadbalance { least_conn; server google.com; server bing.com; server websearch.com; server wikipedia.org;} server { listen 8000; listen [::]:8000; server_name _; location / { proxy_pass http://loadbalance; }} upstream goapi { least_conn; server '$IPSERVER':5001; server '$IPSERVER':5002; server '$IPSERVER':5003;} server { listen '$PORT'; listen [::]:'$PORT'; server_name _; location / { proxy_pass http://goapi; }}' >> conf.d/go-loadbalancing.conf && echo conf.d/go-loadbalancing.conf" created"
Step 4:
# LOCAL DEPLOY read -p "Enter work folder server (ex: /srv): " SRV && echo "SRV "$SRVread -p "Enter PROJECT: " PROJECT && echo "PROJECT "$PROJECTread -p "Enter ipv4 IPSERVER: " IPSERVER && echo "IPSERVER ipv4 "$IPSERVERread -p "Enter GOLANG RUN PORT (ex: 8080): " PORT && echo "GOLANG RUN PORT "$PORT cd /path/to/$PROJECTsh /path/to/local-setup.sh git initgit remote add deploy ssh://root@$IPSERVER$SRV/git/$PROJECT.git/ git add . git commit -m "<commit message>"git push deploy master # open browser http://$IPSERVER:$PORT/ # open browser http://$IPSERVER:5554/