#!/bin/bash set -e GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' echo -e "${YELLOW}=== Preparando Infraestrutura de Deployment Sittax ===${NC}\n" # 1. Elevação de privilégio if [ "$EUID" -ne 0 ]; then SUDO="sudo" else SUDO="" fi # 2. Instala dependências básicas $SUDO apt-get update $SUDO apt-get install -y ca-certificates curl gnupg lsb-release jq git unzip wget apt-transport-https # 3. Instala o Docker Engine e Compose se não tiver if ! command -v docker &> /dev/null then echo -e "${YELLOW}Instalando Docker Engine e Compose Plugin...${NC}" $SUDO install -m 0755 -d /etc/apt/keyrings $SUDO curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc $SUDO chmod a+r /etc/apt/keyrings/docker.asc echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ $SUDO tee /etc/apt/sources.list.d/docker.list > /dev/null $SUDO apt-get update $SUDO apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin $SUDO systemctl enable docker $SUDO systemctl start docker else echo -e "${GREEN}Docker já está instalado.${NC}" fi # 4. Habilita Swarm se não estiver habilitado if ! $SUDO docker info | grep -q "Swarm: active"; then echo -e "${YELLOW}Iniciando Docker Swarm (Manager)...${NC}" $SUDO docker swarm init || echo -e "${YELLOW}Swarm já pode estar inicializado.${NC}" fi WORK_DIR="/opt/sittax/deployment" $SUDO mkdir -p "$WORK_DIR/traefik/dynamic" $SUDO mkdir -p "$WORK_DIR/portainer" cd "$WORK_DIR" # 5. Configuração da Rede (Opcional Externa) read -p "Deseja conectar a uma rede externa existente (ex: stx)? (s/n) [default: n]: " USE_EXT_NET /dev/null http: middlewares: inject-connection-ip: headers: customRequestHeaders: X-Connection-IP: \"{client.ip}\" EOF " $SUDO touch traefik/acme.json $SUDO chmod 600 traefik/acme.json $SUDO bash -c "cat << EOF | tee traefik/docker-compose.yml > /dev/null services: traefik: image: \"traefik:latest\" command: - --providers.file.directory=/etc/traefik/dynamic - --providers.file.watch=true - --experimental.plugins.crowdsec.modulename=github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin - --experimental.plugins.crowdsec.version=v1.3.3 - --accesslog=true - --accesslog.filepath=/var/log/traefik/access.log - --entrypoints.web.http.middlewares=inject-connection-ip@file,crowdsec-bouncer@docker - --entrypoints.websecure.http.middlewares=inject-connection-ip@file,crowdsec-bouncer@docker - --entrypoints.web.address=:80 - --entrypoints.websecure.address=:443 - --api - --api.dashboard=true - --providers.docker - --providers.swarm=true - --providers.docker.exposedbydefault=false - --log.level=ERROR - --certificatesresolvers.leresolver.acme.httpchallenge=true - --certificatesresolvers.leresolver.acme.email=${SSL_EMAIL} - --certificatesresolvers.leresolver.acme.storage=./acme.json - --certificatesresolvers.leresolver.acme.httpchallenge.entrypoint=web - --providers.docker.network=${APP_NETWORK} ports: - \"80:80\" - \"443:443\" networks: - ${APP_NETWORK} volumes: - \"/var/run/docker.sock:/var/run/docker.sock:ro\" - \"./acme.json:/acme.json\" - \"./dynamic:/etc/traefik/dynamic:ro\" - \"traefik-logs:/var/log/traefik\" deploy: mode: replicated replicas: 1 update_config: parallelism: 1 placement: constraints: - node.role == manager labels: - \"traefik.enable=true\" - \"traefik.http.routers.http-catchall.rule=hostregexp(\`{host:.+}\`)\" - \"traefik.http.routers.http-catchall.entrypoints=web\" - \"traefik.http.routers.http-catchall.middlewares=redirect-to-https\" - \"traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https\" - \"traefik.http.routers.traefik-dashboard.rule=Host(\`${TRAEFIK_HOST}\`)\" - \"traefik.http.services.traefik.loadbalancer.server.port=8080\" - \"traefik.http.routers.traefik-dashboard.entrypoints=websecure\" - \"traefik.http.routers.traefik-dashboard.service=api@internal\" - \"traefik.http.routers.traefik-dashboard.tls.certresolver=leresolver\" - \"traefik.http.middlewares.traefik-auth.basicauth.users=sittax:\$\$2y\$\$05\$\$TZByLIKsOHkYhzJLfkJYv.k.wce0ytyS3FoIwj/ItTcdledkRhoKC\" - \"traefik.http.routers.traefik-dashboard.middlewares=traefik-auth\" - \"traefik.http.middlewares.crowdsec-bouncer.plugin.crowdsec.enabled=true\" - \"traefik.http.middlewares.crowdsec-bouncer.plugin.crowdsec.lapiurl=http://crowdsec:8080\" - \"traefik.http.middlewares.crowdsec-bouncer.plugin.crowdsec.lapikey=${LAPI_KEY}\" crowdsec: image: crowdsecurity/crowdsec:latest environment: - COLLECTIONS=crowdsecurity/traefik crowdsecurity/http-cve crowdsecurity/whitelist-good-actors networks: - ${APP_NETWORK} volumes: - crowdsec-config:/etc/crowdsec - crowdsec-data:/var/lib/crowdsec/data - traefik-logs:/var/log/traefik:ro deploy: mode: replicated replicas: 1 update_config: parallelism: 1 placement: constraints: - node.role == manager labels: - \"traefik.enable=true\" - \"traefik.http.routers.crowdsec-api.rule=Host(\`crowdsecservice.sittax.com.br\`)\" - \"traefik.http.routers.crowdsec-api.entrypoints=websecure\" - \"traefik.http.routers.crowdsec-api.tls.certresolver=leresolver\" - \"traefik.http.services.crowdsec-api.loadbalancer.server.port=8080\" - \"traefik.http.routers.crowdsec-api.middlewares=traefik-auth\" volumes: traefik-logs: crowdsec-config: crowdsec-data: networks: $NET_CONFIG EOF " echo -e "${YELLOW}Iniciando Traefik e CrowdSec ($TRAEFIK_STACK)...${NC}" cd traefik && $SUDO docker stack deploy -c docker-compose.yml $TRAEFIK_STACK && cd .. fi # ========================================== # PORTAINER # ========================================== if [[ "$USE_PORTAINER" =~ ^[SsYy]$ ]]; then echo -e "\n${YELLOW}--- Configuração Portainer ---${NC}" read -p "Nome da Stack para Portainer [default: portainer]: " PORTAINER_STACK /dev/null services: portainer: image: portainer/portainer-ce:latest command: -H unix:///var/run/docker.sock volumes: - /var/run/docker.sock:/var/run/docker.sock - portainer_data:/data networks: - ${APP_NETWORK} deploy: mode: replicated replicas: 1 update_config: parallelism: 1 resources: limits: memory: 1G labels: - \"traefik.enable=true\" - \"traefik.http.routers.portainer.rule=Host(\`${PORTAINER_HOST}\`)\" - \"traefik.http.routers.portainer.entrypoints=websecure\" - \"traefik.http.services.portainer.loadbalancer.server.port=9000\" - \"traefik.http.routers.portainer.service=portainer\" - \"traefik.http.routers.portainer.tls.certresolver=leresolver\" - \"traefik.http.routers.edge.rule=Host(\`edgeservice.sittax.com.br\`)\" - \"traefik.http.routers.edge.entrypoints=websecure\" - \"traefik.http.services.edge.loadbalancer.server.port=8000\" - \"traefik.http.routers.edge.service=edge\" - \"traefik.http.routers.edge.tls.certresolver=leresolver\" volumes: portainer_data: networks: $NET_CONFIG EOF " echo -e "${YELLOW}Iniciando Portainer ($PORTAINER_STACK)...${NC}" cd portainer && $SUDO docker stack deploy -c docker-compose.yml $PORTAINER_STACK && cd .. fi # ========================================== # AZURE DEVOPS AGENT # ========================================== if [[ "$USE_AZURE" =~ ^[SsYy]$ ]]; then echo -e "\n${YELLOW}--- Configuração Azure DevOps Agent ---${NC}" read -p "URL da Organização [default: https://dev.azure.com/Sittax/]: " AZ_URL