#!/bin/bash
apt-get update
apt-get install -y wget curl git vim
if ! which docker ; then
   curl -s -o getdocker.sh https://get.docker.com
   bash getdocker.sh
   gpasswd -a vagrant docker
fi
mkdir -p gitea && cd gitea
wget -O mkcert https://github.com/FiloSottile/mkcert/releases/download/v1.4.4/mkcert-v1.4.4-linux-amd64
chmod +x mkcert
mv mkcert /usr/local/bin
sudo apt-get install -y libnss3-tools
mkdir certs config
mkcert -install
mkcert -cert-file certs/local-cert.pem -key-file certs/local-key.pem "gitea.local" "*.gitea.local"
cat > traefik.yml  <<EOT
version: '3'

networks:
  proxy:
    external: true

services:
  reverse-proxy:
    # The official v2 Traefik docker image
    image: traefik:latest
    container_name: traefik
    # Enables the web UI and tells Traefik to listen to docker
    command: --api.insecure=true --providers.docker
    ports:
      # The HTTP port
      - "80:80"
      - "443:443"
      # The Web UI (enabled by --api.insecure=true)
      - "8080:8080"
    volumes:
      # So that Traefik can listen to the Docker events
      - /var/run/docker.sock:/var/run/docker.sock:ro
      # Map the static configuration into the container
      - ./config/static.yml:/etc/traefik/traefik.yml:ro
      # Map the dynamic configuration into the container
      - ./config/dynamic.yml:/etc/traefik/dynamic.yml:ro
      # Map the certificats into the container
      - ./certs:/etc/certs:ro
    networks:
      - proxy
EOT

cat > ./config/static.yml <<EOT
global:
  sendAnonymousUsage: false
api:
  dashboard: true
  insecure: true
providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    watch: true
    exposedByDefault: false
  file:
    filename: /etc/traefik/dynamic.yml
    watch: true

log:
  level: INFO
  format: common

entryPoints:
  http:
    address: ":80"
    http:
      redirections:
        entryPoint:
          to: https
          scheme: https
  https:
    address: ":443"
EOT

cat > ./config/dynamic.yml <<EOT
http:
  routers:
    traefik:
#      rule: "Host(`traefik.docker.localhost`)"
      rule: "Host(`gitea.local`)"
      service: "api@internal"
      tls:
        domains:
          - main: "docker.localhost"
            sans:
              - "*.docker.localhost"
          - main: "gitea.local"
            sans:
              - "*.gitea.local"

tls:
  certificates:
    - certFile: "/etc/certs/local-cert.pem"
      keyFile: "/etc/certs/local-key.pem"
EOT


cat > gitea.yml <<-'EOT'
version: '2'

volumes:
  gitea:
  db:

networks:
  proxy:
    external: true
  app:
    external: false

services:
  db:
    image: mariadb
    container_name: db
    restart: always
#    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
    volumes:
      - db:/var/lib/mysql
    networks:
      - gitea
    environment:
      - MYSQL_ROOT_PASSWORD=Azerty1+
      - MYSQL_PASSWORD=Azerty1+
      - MYSQL_DATABASE=gitea
      - MYSQL_USER=gitea

  app:
    image: gitea/gitea
    container_name: app
    restart: always
      #    ports:
      #      - 8081:80
    #links:
    depends_on:
      - db
    volumes:
      - gitea:/var/www/html
    networks:
      - proxy
      - app
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.app.rule=Host(`gitea.local`)"
      - "traefik.http.routers.app.tls=true"
      - "traefik.http.services.app.loadbalancer.server.port=3000"

    environment:
      - MYSQL_PASSWORD=Azerty1+
      - MYSQL_DATABASE=gitea
      - MYSQL_USER=gitea
      - MYSQL_HOST=db:3006
EOT

docker network create proxy
docker compose -f traefik.yml up -d 
docker compose -f gitea.yml up -d 
ip -br a