include .env export CERTBOT_CONF := $(PWD)/.generated/certbot/lib/conf CERTBOT_WWW := $(PWD)/.generated/certbot/lib/www CERTBOT_LOG := $(PWD)/.generated/certbot/log NGINX_LOG := $(PWD)/.generated/certbot/nginx/log .PHONY: provision clean \ jenkins-build jenkins-run jenkins-bash jenkins-init-pw jenkins-unprotected jenkins-protected jenkins-start jenkins-stop jenkins-rm jenkins-purge \ nginx-prepare nginx-proxy nginx-run nginx-start nginx-letsencrypt-init nginx-letsencrypt-timer nginx-restart nginx-stop \ jenkins-security ## lists all documented targets help: @awk '/^##/ {sub(/^## /, "", $$0); desc=$$0; next} /^[a-zA-Z0-9][^:]*:/ { \ print "\033[1m" $$1 "\033[0m"; \ print " " desc "\n" \ }' $(MAKEFILE_LIST) ## uploads to hs.hsadmin.ng/Jenkins/ on the server for testing purposes upload: scp -r * .env .gitignore tallyman@$(SERVER_NAME):hs.hsadmin.ng/Jenkins/ ## initially, run this once to provision te nginx provision: nginx-prepare nginx-letsencrypt-init nginx-letsencrypt-timer jenkins-build jenkins-run nginx-restart @echo "now you can start nginx: make nginx-start" ## removes all generated files clean: nginx-stop jenkins-rm rm -rf .generated/ ## builds the Jenkins image jenkins-build: docker build -t jenkins-docker . # initially runs the Jenkins container during provisioning, later use `make jenkins-start` jenkins-run: $(eval DOCKER_SOCKET_MOUNT := $(if $(DOCKER_SOCKET),$(DOCKER_SOCKET):/var/run/docker.sock,/dev/null:/var/run/docker.no-socket)) docker run --detach \ --dns 8.8.8.8 \ --network bridge \ --publish 8090:8080 --publish 50000:50000 \ --volume $(DOCKER_SOCKET_MOUNT) \ --volume $(JENKINS_VOLUME):/var/jenkins_home \ --volume $(PWD)/jenkins.yaml:/var/jenkins_home/jenkins.yaml \ --restart unless-stopped \ --env-file .env \ --name jenkins jenkins-docker ## manually starts the Jenkins container (again) jenkins-start: docker start jenkins ## opens a bash within the Jenkins container jenkins-bash: docker exec -it jenkins bash ## prints the Jenkins log jenkins-log: docker logs jenkins 2>&1 ## prints the initial password of a newly setup Jenkins jenkins-init-pw: docker exec -it jenkins sh -c '\ while [ ! -f /var/jenkins_home/secrets/initialAdminPassword ]; do \ sleep 1; \ done; \ cat /var/jenkins_home/secrets/initialAdminPassword \ ' ## disables security for the Jenkins => allows login to Jenkins without credentials jenkins-unprotected: docker exec -it jenkins sed -i 's|true|false|' /var/jenkins_home/config.xml docker exec -it jenkins grep useSecurity /var/jenkins_home/config.xml ## enables security for the Jenkins => Jenkins requires login with credentials jenkins-protected: docker exec -it jenkins sed -i 's|true|true|' /var/jenkins_home/config.xml docker exec -it jenkins grep useSecurity /var/jenkins_home/config.xml ## stops the Jenkins container jenkins-stop: docker stop jenkins || true ## removes the Jenkins container jenkins-rm: jenkins-stop docker rm jenkins || true ## purges the Jenkins volume (finally deletes the configuration) jenkins-purge: jenkins-rm docker volume rm $(JENKINS_VOLUME) || true # (internal) generates the files for nginx-proxy and certbot nginx-prepare: mkdir -p $(CERTBOT_WWW) $(CERTBOT_LOG) $(CERTBOT_CONF)/live/$(SERVER_NAME) $(NGINX_LOG) chmod 755 $(CERTBOT_WWW) $(CERTBOT_LOG) $(CERTBOT_CONF)/live/$(SERVER_NAME) $(NGINX_LOG) sed -e 's/%SERVER_NAME/$(SERVER_NAME)/g' .generated/nginx.conf cp nginx-proxy/options-ssl-nginx.conf $(CERTBOT_CONF)/options-ssl-nginx.conf chmod 644 $(CERTBOT_CONF)/options-ssl-nginx.conf test -f $(CERTBOT_CONF)/ssl-dhparams.pem || curl -o $(CERTBOT_CONF)/ssl-dhparams.pem \ https://raw.githubusercontent.com/certbot/certbot/master/certbot/certbot/ssl-dhparams.pem chmod 644 $(CERTBOT_CONF)/ssl-dhparams.pem ## opens a bash within the Nginx-proxy container nginx-bash: docker exec -it nginx bash # (internal) fetches an initial certificate from letsencrypt nginx-letsencrypt-init: nginx-run # delete the previous (dummy) config to avoid file creation with suffix -0001 etc. rm -rf $(CERTBOT_CONF)/etc/letsencrypt/live/$(SERVER_NAME) \ $(CERTBOT_CONF)/etc/letsencrypt/archive/$(SERVER_NAME) \ $(CERTBOT_CONF)/etc/letsencrypt/renewal/$(SERVER_NAME).conf # request the certificate via letsencrypt docker run --rm \ -v $(CERTBOT_CONF):/etc/letsencrypt \ -v $(CERTBOT_WWW):/var/www/certbot \ -v $(CERTBOT_LOG):/var/log/letsencrypt \ certbot/certbot \ certonly --webroot --webroot-path /var/www/certbot --cert-name $(SERVER_NAME) \ -d $(SERVER_NAME) --rsa-key-size 4096 \ --non-interactive --agree-tos --force-renewal $(CERTBOT_ENV) # from now on, start nginx including https sed -e 's/%SERVER_NAME/$(SERVER_NAME)/g' .generated/nginx.conf docker stop nginx || true ## opens a shell in the letsencrypt certbot nginx-letsencrypt-sh: docker run -it --rm \ -v $(CERTBOT_CONF):/etc/letsencrypt \ -v $(CERTBOT_WWW):/var/www/certbot \ -v $(CERTBOT_LOG):/var/log/letsencrypt \ --entrypoint /bin/sh \ certbot/certbot # (internal) installs the letsencrypt certbot timer for automatic renewal nginx-letsencrypt-timer: @mkdir -p $(HOME)/.config/systemd/user @cp nginx-proxy/nginx-letsencrypt-renew.timer $(HOME)/.config/systemd/user/nginx-letsencrypt-renew.timer @cp nginx-proxy/nginx-letsencrypt-renew.service $(HOME)/.config/systemd/user/nginx-letsencrypt-renew.service systemctl --user daemon-reload systemctl --user enable --now nginx-letsencrypt-renew.timer ## renews the cert, if already renewable - this is also called from the timer nginx-letsencrypt-renew: docker run --rm \ -v $(CERTBOT_CONF):/etc/letsencrypt \ -v $(CERTBOT_WWW):/var/www/certbot \ -v $(CERTBOT_LOG):/var/log/letsencrypt \ certbot/certbot renew -q ## initially runs the nginx proxy server nginx-run: nginx-stop docker run -d --name nginx \ --publish 8080:80 \ --publish 8443:443 \ --network bridge \ -v $(CERTBOT_CONF):/etc/letsencrypt \ -v $(CERTBOT_WWW):/var/www/certbot \ -v $(NGINX_LOG):/var/log/nginx \ -v $(PWD)/.generated/nginx.conf:/etc/nginx/nginx.conf \ --health-cmd="curl -kfs https://localhost:8443/ || exit 1" \ --health-interval=5s \ --health-timeout=3s \ --health-retries=3 \ nginx ## starts the nginx proxy server again nginx-start: docker start nginx ## restarts the nginx proxy server nginx-restart: nginx-stop nginx-start ## stops the nginx proxy server nginx-stop: docker stop nginx || true docker rm nginx || true ## remove the nginx container nginx-rm: nginx-stop docker rm nginx || true ## check security status jenkins-security: @curl --insecure -s -o /dev/null -w "%{http_code}\n" https://localhost:8443/script ## fix access rights in workspaces jenkins-fix: @docker run --rm -it -v $(JENKINS_VOLUME):/mnt alpine chown 1000:1000 -R /mnt/workspace