mirror of
https://github.com/andwati/blog-nest.git
synced 2026-10-18 05:32:53 +00:00
123 lines
3.6 KiB
Makefile
123 lines
3.6 KiB
Makefile
SHELL := /bin/bash
|
|
|
|
ROOT_DIR := $(shell pwd)
|
|
COMPOSE_DEV := docker compose -f infra/docker-compose.yml
|
|
COMPOSE_PROD := docker compose -f infra/docker-compose.prod.yml
|
|
|
|
DOMAIN ?=
|
|
EMAIL ?=
|
|
|
|
.PHONY: help \
|
|
dev-up dev-down dev-logs dev-ps dev-restart \
|
|
prod-build prod-up prod-down prod-logs prod-ps prod-restart \
|
|
deploy deploy-rebuild health \
|
|
ssl-selfsigned ssl-certbot ssl-install ssl-renew-test
|
|
|
|
help:
|
|
@echo "Available targets:"
|
|
@echo " make dev-up # Start development stack"
|
|
@echo " make dev-down # Stop development stack"
|
|
@echo " make dev-logs # Follow development logs"
|
|
@echo " make dev-ps # Show development service status"
|
|
@echo " make dev-restart # Restart development stack"
|
|
@echo ""
|
|
@echo " make prod-build # Build production images"
|
|
@echo " make prod-up # Start production stack"
|
|
@echo " make prod-down # Stop production stack"
|
|
@echo " make prod-logs # Follow production logs"
|
|
@echo " make prod-ps # Show production service status"
|
|
@echo " make prod-restart # Restart production stack"
|
|
@echo ""
|
|
@echo " make deploy # Build + start production stack"
|
|
@echo " make deploy-rebuild # Down + build(no-cache) + up"
|
|
@echo " make health # Check HTTP/HTTPS + compose status"
|
|
@echo ""
|
|
@echo " make ssl-selfsigned # Generate local self-signed certs in infra/ssl"
|
|
@echo " make ssl-certbot DOMAIN=example.com [email protected]"
|
|
@echo " # Request Let's Encrypt cert (standalone)"
|
|
@echo " make ssl-install DOMAIN=example.com"
|
|
@echo " # Copy LE certs into infra/ssl and restart nginx"
|
|
@echo " make ssl-renew-test # Dry-run certbot renew"
|
|
|
|
dev-up:
|
|
$(COMPOSE_DEV) up
|
|
|
|
dev-down:
|
|
$(COMPOSE_DEV) down
|
|
|
|
dev-logs:
|
|
$(COMPOSE_DEV) logs -f
|
|
|
|
dev-ps:
|
|
$(COMPOSE_DEV) ps
|
|
|
|
dev-restart:
|
|
$(COMPOSE_DEV) down
|
|
$(COMPOSE_DEV) up -d
|
|
|
|
prod-build:
|
|
$(COMPOSE_PROD) build
|
|
|
|
prod-up:
|
|
$(COMPOSE_PROD) up -d
|
|
|
|
prod-down:
|
|
$(COMPOSE_PROD) down
|
|
|
|
prod-logs:
|
|
$(COMPOSE_PROD) logs -f
|
|
|
|
prod-ps:
|
|
$(COMPOSE_PROD) ps
|
|
|
|
prod-restart:
|
|
$(COMPOSE_PROD) down
|
|
$(COMPOSE_PROD) up -d
|
|
|
|
deploy:
|
|
$(COMPOSE_PROD) build
|
|
$(COMPOSE_PROD) up -d
|
|
|
|
deploy-rebuild:
|
|
$(COMPOSE_PROD) down
|
|
$(COMPOSE_PROD) build --no-cache
|
|
$(COMPOSE_PROD) up -d
|
|
|
|
health:
|
|
@echo "== Compose status =="
|
|
$(COMPOSE_PROD) ps
|
|
@echo ""
|
|
@echo "== HTTP check (expect 301) =="
|
|
@curl -sS -I http://localhost:80 | head -1
|
|
@echo "== HTTPS check (expect 200) =="
|
|
@curl -k -sS -o /dev/null -w "%{http_code}\n" https://localhost:443
|
|
|
|
ssl-selfsigned:
|
|
mkdir -p infra/ssl
|
|
docker run --rm -v $(ROOT_DIR)/infra/ssl:/out alpine:3.21 sh -lc "apk add --no-cache openssl >/dev/null && openssl req -x509 -nodes -newkey rsa:2048 -keyout /out/key.pem -out /out/cert.pem -days 365 -subj '/CN=localhost'"
|
|
chmod 600 infra/ssl/key.pem
|
|
@echo "Self-signed certs created at infra/ssl/cert.pem and infra/ssl/key.pem"
|
|
|
|
ssl-certbot:
|
|
@if [ -z "$(DOMAIN)" ] || [ -z "$(EMAIL)" ]; then \
|
|
echo "Usage: make ssl-certbot DOMAIN=example.com [email protected]"; \
|
|
exit 1; \
|
|
fi
|
|
sudo certbot certonly --standalone -d $(DOMAIN) --email $(EMAIL) --agree-tos --no-eff-email
|
|
|
|
ssl-install:
|
|
@if [ -z "$(DOMAIN)" ]; then \
|
|
echo "Usage: make ssl-install DOMAIN=example.com"; \
|
|
exit 1; \
|
|
fi
|
|
mkdir -p infra/ssl
|
|
sudo cp /etc/letsencrypt/live/$(DOMAIN)/fullchain.pem infra/ssl/cert.pem
|
|
sudo cp /etc/letsencrypt/live/$(DOMAIN)/privkey.pem infra/ssl/key.pem
|
|
sudo chown $(USER):$(USER) infra/ssl/cert.pem infra/ssl/key.pem
|
|
chmod 600 infra/ssl/key.pem
|
|
$(COMPOSE_PROD) restart nginx
|
|
@echo "Installed Let's Encrypt certs for $(DOMAIN) and restarted nginx"
|
|
|
|
ssl-renew-test:
|
|
sudo certbot renew --dry-run
|