Homelab

Services instellen

Ik wilde eerst docker swarm gebruiken, maar eigenlijk heb ik dat helemaal niet nodig. Ik heb maar een paar services en ik hoef geen dubbele te hebben o.i.d. Daarom gebruik ik docker compose met restart: unless-stopped of restart: always. De wachtwoorden e.d. versleutel ik met ansible vault.

Ik wil op alle plekken dezelfde postgres versie gebruiken. Dus daar wilde ik de compose bestanden op aanpassen, maar dat werkt niet overal. Dus dat is nog niet gelukt.

Voor labca, taiga, gitea enz. moeten het domein/IP-adres ingesteld worden.

Ik wou de compose bestanden aanpassen zodat ze versienummer gebruiken i.p.v. latest. Volgens mij had ik van alles de laatste versie gepakt, maar het werkte toch niet. Ik snap niet goed waarom.

Labca

Voor de CA gebruik ik Hakwerk Labca. Dit gebruikt de CA software van Let's Encrypt (boulder), dus het werkt alleen maar met ACME. Dat is eigenlijk wat ik wil dus dat is prima. Om het op te starten doe je het volgende (met het juiste domein):


    git clone https://github.com/hakwerk/labca.git
    cd labca/build
    export LABCA_FQDN=labca.example.com
    docker compose up -d
        

Taiga compose-bestand

Voor het opzetten van taiga clone je deze repo. Je heb eigenlijk alleen maar de taiga-gateway/taiga.conf, docker-compose.yml, docker-compose-inits.yml en .env bestanden nodig. taiga-launch.sh en taiga-manage.sh maken het wel makkelijker maar zijn eigenlijk gewoon aliassen voor docker compose en dan een command.

Nadat de services draaien, moet je nog een superuser maken. Dat kan met manage.py in de taiga-back container.

Het compose-bestand:


    x-environment:
    &default-back-environment
    # These environment variables will be used by taiga-back and taiga-async.
    # Database settings
    POSTGRES_DB: "taiga"
    POSTGRES_USER: "${POSTGRES_USER}"
    POSTGRES_PASSWORD: "${POSTGRES_PASSWORD}"
    POSTGRES_HOST: "taiga-db"
    # Taiga settings
    TAIGA_SECRET_KEY: "${SECRET_KEY}"
    TAIGA_SITES_SCHEME: "${TAIGA_SCHEME}"
    TAIGA_SITES_DOMAIN: "${TAIGA_DOMAIN}"
    TAIGA_SUBPATH: "${SUBPATH}"
    # Email settings.
    EMAIL_BACKEND: "django.core.mail.backends.${EMAIL_BACKEND}.EmailBackend"
    DEFAULT_FROM_EMAIL: "${EMAIL_DEFAULT_FROM}"
    EMAIL_USE_TLS: "${EMAIL_USE_TLS}"
    EMAIL_USE_SSL: "${EMAIL_USE_SSL}"
    EMAIL_HOST: "${EMAIL_HOST}"
    EMAIL_PORT: "${EMAIL_PORT}"
    EMAIL_HOST_USER: "${EMAIL_HOST_USER}"
    EMAIL_HOST_PASSWORD: "${EMAIL_HOST_PASSWORD}"
    # Rabbitmq settings
    RABBITMQ_USER: "${RABBITMQ_USER}"
    RABBITMQ_PASS: "${RABBITMQ_PASS}"
    # Telemetry settings
    ENABLE_TELEMETRY: "${ENABLE_TELEMETRY}"
    # ...your customizations go here
    
    x-volumes:
    &default-back-volumes
    # These volumens will be used by taiga-back and taiga-async.
    - taiga-static-data:/taiga-back/static
    - taiga-media-data:/taiga-back/media
    # - ./config.py:/taiga-back/settings/config.py
    
    services:
    taiga-db:
    image: postgres:12.3
    environment:
    POSTGRES_DB: "taiga"
    POSTGRES_USER: "${POSTGRES_USER}"
    POSTGRES_PASSWORD: "${POSTGRES_PASSWORD}"
    healthcheck:
    test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"]
    interval: 2s
    timeout: 15s
    retries: 5
    start_period: 3s
    volumes:
    - taiga-db-data:/var/lib/postgresql/data
    networks:
    - taiga
    restart: unless-stopped
    
    taiga-back:
    image: taigaio/taiga-back:latest
    environment: *default-back-environment
    volumes: *default-back-volumes
    networks:
    - taiga
    depends_on:
    taiga-db:
    condition: service_healthy
    taiga-events-rabbitmq:
    condition: service_started
    taiga-async-rabbitmq:
    condition: service_started
    restart: unless-stopped
    
    taiga-async:
    image: taigaio/taiga-back:latest
    entrypoint: ["/taiga-back/docker/async_entrypoint.sh"]
    environment: *default-back-environment
    volumes: *default-back-volumes
    networks:
    - taiga
    depends_on:
    taiga-db:
    condition: service_healthy
    taiga-events-rabbitmq:
    condition: service_started
    taiga-async-rabbitmq:
    condition: service_started
    restart: unless-stopped
    
    taiga-async-rabbitmq:
    image: rabbitmq:3.8-management-alpine
    environment:
    RABBITMQ_ERLANG_COOKIE: "${RABBITMQ_ERLANG_COOKIE}"
    RABBITMQ_DEFAULT_USER: "${RABBITMQ_USER}"
    RABBITMQ_DEFAULT_PASS: "${RABBITMQ_PASS}"
    RABBITMQ_DEFAULT_VHOST: "${RABBITMQ_VHOST}"
    hostname: "taiga-async-rabbitmq"
    volumes:
    - taiga-async-rabbitmq-data:/var/lib/rabbitmq
    networks:
    - taiga
    restart: unless-stopped
    
    taiga-front:
    image: taigaio/taiga-front:latest
    environment:
    TAIGA_URL: "${TAIGA_SCHEME}://${TAIGA_DOMAIN}"
    TAIGA_WEBSOCKETS_URL: "${WEBSOCKETS_SCHEME}://${TAIGA_DOMAIN}"
    TAIGA_SUBPATH: "${SUBPATH}"
    # ...your customizations go here
    networks:
    - taiga
    # volumes:
    # - ./conf.json:/usr/share/nginx/html/conf.json
    restart: unless-stopped
    
    taiga-events:
    image: taigaio/taiga-events:latest
    environment:
    RABBITMQ_USER: "${RABBITMQ_USER}"
    RABBITMQ_PASS: "${RABBITMQ_PASS}"
    TAIGA_SECRET_KEY: "${SECRET_KEY}"
    networks:
    - taiga
    depends_on:
    taiga-events-rabbitmq:
    condition: service_started
    restart: unless-stopped
    
    taiga-events-rabbitmq:
    image: rabbitmq:3.8-management-alpine
    environment:
    RABBITMQ_ERLANG_COOKIE: "${RABBITMQ_ERLANG_COOKIE}"
    RABBITMQ_DEFAULT_USER: "${RABBITMQ_USER}"
    RABBITMQ_DEFAULT_PASS: "${RABBITMQ_PASS}"
    RABBITMQ_DEFAULT_VHOST: "${RABBITMQ_VHOST}"
    hostname: "taiga-events-rabbitmq"
    volumes:
    - taiga-events-rabbitmq-data:/var/lib/rabbitmq
    networks:
    - taiga
    restart: unless-stopped
    
    taiga-protected:
    image: taigaio/taiga-protected:latest
    environment:
    MAX_AGE: "${ATTACHMENTS_MAX_AGE}"
    SECRET_KEY: "${SECRET_KEY}"
    networks:
    - taiga
    restart: unless-stopped
    
    taiga-gateway:
    image: nginx:1.19-alpine
    ports:
    - "192.168.1.1:9000:80"
    volumes:
    - ./taiga-gateway/taiga.conf:/etc/nginx/conf.d/default.conf
    - taiga-static-data:/taiga/static
    - taiga-media-data:/taiga/media
    networks:
    - taiga
    depends_on:
    - taiga-front
    - taiga-back
    - taiga-events
    restart: unless-stopped
    
    volumes:
    taiga-static-data:
    taiga-media-data:
    taiga-db-data:
    taiga-async-rabbitmq-data:
    taiga-events-rabbitmq-data:
    
    networks:
    taiga:
            

Gitea/Gitlab compose-bestand

Ik weet nog niet of ik gitea of gitlab wil gebruiken, dus maar even testen. Volgens gitea gebruikt het minder resources dan gitlab, maar verder is er niet veel verschil. Gitlab vraagt om een FQDN die je moet instellen in een gitlab.rb bestand. Daarna moet je iets goed instellen met de AAAA records. Het wil namelijk let's encrypt gebruiken om een certificaat in te stellen. Om dit uit te zetten moet je in gitlab.rb "https" veranderen in http".

Gitlab is te zwaar (gebruikt te veel geheugen) voor mijn huidige setup. Ik heb de VM 6GB gegeven, alleen gitlab wil al 4GB hebben. Ik ga dus Gitea gebruiken, aangezien dat minder hulpbronnen vraagt. Ik kan dan niet makkelijk pages draaien (misschien wel m.b.v. deze repo), maar de website met deze docs draait al via mijn publieke gitlab repo.

Het gitea compose-bestand staat hieronder:


    networks:
    gitea:
    
    services:
    server:
    image: gitea/gitea:latest
    restart: unless-stopped
    environment:
    - USER_UID=1000
    - USER_GID=1000
    - GITEA__database__DB_TYPE=postgres
    - GITEA__database__HOST=db:5432
    - GITEA__database__NAME=gitea
    - GITEA__database__USER=gitea
    - GITEA__database__PASSWD=/run/secrets/gitea_postgres_password
    secrets:
    - gitea_postgres_password
    networks:
    - gitea
    volumes:
    - gitea_gitea-server:/data
    ports:
    - "192.168.1.1:4300:3000"
    - "192.168.1.1:4322:22"
    depends_on:
    - db
    
    db:
    image: postgres:14
    restart: unless-stopped
    environment:
    - POSTGRES_USER=gitea
    - POSTGRES_PASSWORD=/run/secrets/gitea_postgres_password
    - POSTGRES_DB=gitea
    secrets:
    - gitea_postgres_password
    networks:
    - gitea
    volumes:
    - gitea_gitea-postgres:/var/lib/postgresql/data
    
    volumes:
    gitea_gitea-server:
    external: true
    gitea_gitea-postgres:
    external: true
    
    secrets:
    gitea_postgres_password:
    file: ./gitea_postgres_password.txt
            

Wiki

Ik had eerst docusaurus gebruikt, daar bestaat geen (officiele) docker image van. Het is gewoon een npm app, dus je kan het wel zelf maken met een dockerfile enz. Voor een docusaurus voorbeeld zie deze gitlab repo.

Ik ben gemigreerd van docusaures naar handmatige HTML, CSS en JS. Deze notities staan ook online op www.gabbersaurewes.nl.

Nginx Proxy Manager of Caddy

Om de verschillende services achter *.gabbersaurewes.nl te zetten heb ik eerst nginx proxy manager geprobeerd. De DNS-records heb ik eerst geprobeerd in te stellen met BIND DNS op de server, maar dat werkt niet stabiel. Ik heb de serverkast namelijk niet constant aanstaan en dan wordt de ingestelde DNS-server vergeten. Daarom heb ik de DNS records op de router ingesteld. Nginx Proxy Manager en Caddy werkten niet bij alle services, dus ga ik Nginx handmatig instellen. Dat doe ik in de server VM zelf, niet in een docker container. Dan is de integratie met cerbot namelijk makkelijker.

IdP: Zitadel of Authentik

Het zou mooi zijn als ik Zitadel of Authentik kan gebruiken als SSO-oplossing. Er staat info hier of hier .