Example / template: virtual company network in a docker-compose structure with Traefik, Matrix, Kimai, Open Project, DokuWiki, Gogs, MatterMost, Minecraft

The below is a docker-compose file, in combination with a traefik configuration. I have been building it over the last months. I put it on the net, because I would have wished for something like this when I started a few months ago 🙂 .

For me it was especially difficult to understand how to “wire” the containers via Traefik to the outside and via Docker-Compose to the inside. I hope to give you a template with the file set to help you understand what you are looking for in the help files of Docker and Traefik.

Goal

  • Provision of modular add-on “apps” for a small company (project management, time recording, etc.)
  • Low administration effort
  • Provision of professional, Internet-accessible, company infrastructure
  • Allow fast testing of applications – I didn’t know what I needed, wanted to test it
  • Encrypt all communication with https

Solution

  • Description of servers and their networking as docker-compose-file. The simulated network consists of 9 virtual subnets and 12 virtually interconnected servers without having to pull a wire
  • One virtual server per app (example: op.my-company.de is answered by Docker-Container from OpenProject, kb.my-company.de is answered by Docker-Container from DokuWiki, etc.)

.

Targets / Non-targets of this post

I would like to give a set of files that “works” to people who have similar goals in Docker/Traefik etc. . Whoever wants to get acquainted should be able to see where you can/must go.

I can give small help with the below construction. But I can’t keep anyone from reading the documentation about Docker, Traefik and the other containers.

If you would like to commission my engineering office to set up a comparable infrastructure for your company, I would be happy to help you. The basic structure can be set up for other companies within 1-2 working days. I can recommend this in so far as it drastically shortens your training period. The conceptual part of the training, in which you have to get used to the functionality of the whole system, is omitted.

Implemented approaches

  • Simple ticket system, preferably with project management and time recording functions; here I played with OpenProject, but did not use its time recording afterwards. Instead, I used Kimai. A knowledge base is implemented wiki-based; here I tested Media-Wiki, found it too cumbersome and used DokuWiki.
  • An internal Team-Messaging-System; here I found Matrix/Synapse very interesting, which is used e.g. by the German Federal Armed Forces or the French State. For team messaging, I nowadays consider the Office365 solutions to be more suitable. So de facto the results of the matrix tests are only used for a protected chat environment in a private context.

    Reasons among others: Matrix is really technically great in many technical things. But the current state of the art of the GUI-technology in such systems is, in my opinion, that you can “collapse” answers to a post or that answers are displayed collapsed from the beginning. Matrix does not offer this.

    This causes that Matrix becomes quickly confusing. In my opinion it works only in a small scale. It is e.g. not possible to exchange messages on different topics in one channel. If someone comes back after a 3 day “matrix break” he finds an unsorted mess of text messages per channel, which are not sorted by threads. Matrix does not have message threads, although it has been desired for years. As technically beautiful as I find Matrix, they can’t be our messenger in the long run if it stays that way. Mattermost has it in the roadmap at the end of the year – if Matrix doesn’t have it then, we might jump over it. Zulip I will also check it out.
  • I have also tested – as an alternative to Matrix as the Team-Messaging-System – Mattermost. I liked it very much. It was surprisingly similar to Slack. But it was not so good that I would have migrated the participants of the running Matrix installation to a new system. Also Mattermost offers no function to separate threads in channels.
  • What Minecraft as game has to do with the row of company containers? I am a self-dependend father of several boys. I promote Minecraft as a computer game to the boys, because they become wonderfully creative. At the same time I want to prevent the boys from playing together with other adults. Besides, if a child’s house suddenly breaks in Minecraft, I want to know that it was one of our players so I can get it under control. Building Minecraft was easy. So the guys have their own “server”, play in their own world.

Implemented approaches

  • Simple ticket system, preferably with project management and time recording functions; here I played with OpenProject, but did not use its time recording afterwards. Instead, I used Kimai. A knowledge base is implemented wiki-based; here I tested Media-Wiki, found it too cumbersome and used DokuWiki.
  • An internal Team-Messaging-System; here I found Matrix/Synapse very interesting, which is used e.g. by the German Federal Armed Forces or the French State. For team messaging, I nowadays consider the Office365 solutions to be more suitable. So de facto the results of the matrix tests are only used for a protected chat environment in a private context.

    Reasons among others: Matrix is really technically great in many technical things. But the current state of the art of the GUI-technology in such systems is, in my opinion, that you can “collapse” answers to a post or that answers are displayed collapsed from the beginning. Matrix does not offer this.

    This causes that Matrix becomes quickly confusing. In my opinion it works only in a small scale. It is e.g. not possible to exchange messages on different topics in one channel. If someone comes back after a 3 day “matrix break” he finds an unsorted mess of text messages per channel, which are not sorted by threads. Matrix does not have message threads, although it has been desired for years. As technically beautiful as I find Matrix, they can’t be our messenger in the long run if it stays that way. Mattermost has it in the roadmap at the end of the year – if Matrix doesn’t have it then, we might jump over it. Zulip>/strong>I will also check it out.

  • I have also tested – as an alternative to Matrix as the Team-Messaging-System – Mattermost. I liked it very much. It was surprisingly similar to Slack. But it was not so good that I would have migrated the participants of the running Matrix installation to a new system. Also Mattermost offers no function to separate threads in channels.
  • What Minecraft as game has to do with the row of containers? I am an independent father of several boys. I promote Minecraft as a computer game to the boys, because they become wonderfully creative. At the same time I want to prevent the boys from playing together with other adults. Besides, if a child’s house suddenly breaks in Minecraft, I want to know that it was one of our players so I can get it under control. Building Minecraft was easy. So the guys have their own “server”, play in their own world.

    –> Adding Minecraft into it was easy. So the guys have their own “server”, play in their own world.

Dockerfile (/var/docker_data/composed/docker-compose.yml)

version: "3.7"
networks:
  private_network:
    ipam:
      driver: default
      config:
      - subnet: 192.168.200.0/24

  kimai_network:
    ipam:
      driver: default
      config:
      - subnet: 192.168.201.0/24

  mattermost_network:
    ipam:
      driver: default
      config:
      - subnet: 192.168.202.0/24

  op_network:
    ipam:
      driver: default
      config:
      - subnet: 192.168.203.0/24

  kb_network:
    ipam:
      driver: default
      config:
      - subnet: 192.168.204.0/24

  gogs_network:
    ipam:
      driver: default
      config:
      - subnet: 192.168.205.0/24

  synapse_network:
    ipam:
      driver: default
      config:
      - subnet: 192.168.206.0/24

  gitlab_network:
    ipam:
      driver: default
      config:
      - subnet: 192.168.207.0/24

  public_network:
    driver: bridge

services:

  traefik:

    image: traefik:latest

    container_name: traefik

    ports:
      - "80:80"
      - "8080:8080"
      - "443:443"

    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /var/docker_data/traefik:/etc/traefik

# block "labels" is not really needed and without function here
    labels:
      - "traefik.http.routers.traefik.rule=Host(`traefik.my-company.de`)"
      - "traefik.http.routers.traefik.entrypoints=https,http"
      - "traefik.http.routers.traefik.tls=true"
      - "traefik.http.routers.traefik.tls.certresolver=traefikresolver"

# let Traefik snif in all networks; target: recognize ports which are opened
# and must be forwarded from outside to the containers
    networks:
      - private_network
      - kimai_network
      - mattermost_network
      - op_network
      - kb_network
      - gogs_network
      - synapse_network
      - public_network

  myprivatechat:
    image: matrixdotorg/synapse
    restart: always
    volumes:
      - /var/docker_data/myprivatechat:/data
# "Ports" is not needed because Traefik does the routing from
# the virtual servers to the containers
#    ports:
#      - "80:80"
#      - "443:443"
    labels:
      - "traefik.http.routers.myprivatechat.rule=Host(`wir.myprivatechat.de`)"
      - "traefik.http.routers.myprivatechat.entrypoints=https,http"
      - "traefik.http.routers.myprivatechat.tls=true"
      - "traefik.http.routers.myprivatechat.tls.certresolver=myprivatechatresolver"
#      - "traefik.http.routers.matrix.port=8008"

    container_name: myprivatechat

    depends_on:
      - db

    networks:
      - synapse_network

  op:
    image: openproject/community:10
    restart: always

# "Ports" is not needed because Traefik does the routing from
# the virtual servers to the containers
#    ports:
#      - "80:80"
#      - "443:443"
    labels:
      - "traefik.http.routers.op.rule=Host(`op.my-company.de`)"
      - "traefik.http.routers.op.entrypoints=https,http"
      - "traefik.http.routers.op.tls=true"
      - "traefik.http.routers.op.tls.certresolver=opresolver"
#      - "traefik.http.routers.matrix.port=8008"

    environment:
      - SECRET_KEY_BASE=your_SECRET_KEY_BASE

    volumes:
      - /var/docker_data/op/pgdata:/var/openproject/pgdata
      - /var/docker_data/op/assets:/var/openproject/assets

    container_name: op

    networks:
      - op_network

  kb:
    image: 'docker.io/bitnami/dokuwiki:0.20180422.202005011246-debian-10-r67'
    restart: always

# "Ports" is not needed because Traefik does the routing from
# the virtual servers to the containers
#    ports:
#      - "80:80"
#      - "443:443"
    labels:
      - "traefik.http.routers.kb.rule=Host(`kb.my-company.de`)"
      - "traefik.http.routers.kb.entrypoints=https,http"
      - "traefik.http.routers.kb.tls=true"
      - "traefik.http.routers.kb.tls.certresolver=kbresolver"
#      - "traefik.http.routers.matrix.port=8008"

    volumes:
      - /var/docker_data/kb:/bitnami/dokuwiki

    container_name: kb

    networks:
      - kb_network

  gitlab:
    image: gitlab/gitlab-ce:latest
    restart: "no"
    hostname: gitlab.my-company.de

# gitlab did not work on strato v-servers
# the "container" is currently primarily an
# example for "commenting out" a container
# --> set start command for container to
# the directly exiting "true"
    command: "true"
    entrypoint: "true"

    environment:
      - GITLAB_OMNIBUS_CONFIG="external_url 'https://gitlab.my-company.de/'"

# "Ports" is not needed because Traefik does the routing from
# the virtual servers to the containers
#    ports:
#      - "2222:22"
#      - "443:443"
    labels:
      - "traefik.http.routers.gitlab.rule=Host(`gitlab.my-company.de`)"
      - "traefik.http.routers.gitlab.entrypoints=https,http"
      - "traefik.http.routers.gitlab.tls=true"
      - "traefik.http.routers.gitlab.tls.certresolver=gitlabresolver"
#      - "traefik.http.routers.matrix.port=8008"

    volumes:
      - /var/docker_data/gitlab/data:/var/opt/gitlab
      - /var/docker_data/gitlab/logs:/var/log/gitlab
      - /var/docker_data/config:/etc/gitlab

    container_name: gitlab

    networks:
      - gitlab_network

  db:
    image: postgres:alpine

    environment:
      - POSTGRES_USER=synapse
      - POSTGRES_PASSWORD=YOUR_MATRIX-DB_PW
      # ensure the database gets created correctly
      # https://github.com/matrix-org/synapse/blob/master/docs/postgres.md#set-up-database
      - POSTGRES_INITDB_ARGS=--encoding=UTF-8 --lc-collate=C --lc-ctype=C
#    ports:
#      - "127.0.0.1:5432:5432"
    volumes:
      # You may store the database tables in a local folder..
      - /var/docker_data/myprivatechatDB:/var/lib/postgresql/data
      # .. or store them on some high performance storage for better results
      # - /path/to/ssd/storage:/var/lib/postgresql/data

    networks:
      - synapse_network

  gogs:
    image: gogs/gogs
    container_name: gogs

    volumes:
      - /var/docker_data/gogs/repositories:/home/git/gogs-repositories
      - /var/docker_data/gogs/data:/data

# SSH port must be routed b the ports statement
# web port is done by Traefik (see below)
    ports:
#      - "443:3000"
      - "10022:22"

    networks:
      - gogs_network

    depends_on:
      - gogsdb

    labels:
      - "traefik.http.routers.gogs.rule=Host(`gogs.my-company.de`)"
      - "traefik.http.routers.gogs.entrypoints=https,http"
      - "traefik.http.routers.gogs.tls=true"
      - "traefik.http.routers.gogs.tls.certresolver=gogsresolver"
      - "traefik.http.routers.gogs.service=gogs@docker"
      - "traefik.http.services.gogs.loadbalancer.server.port=3000"

  gogsdb:
    image: mysql:5.7.16
    container_name: gogsdb
    environment:
#      - MYSQL_ALLOW_EMPTY_PASSWORD=yes
      - MYSQL_ROOT_PASSWORD=your-gogsPW
      - MYSQL_DATABASE=gogs
      - MYSQL_USER=gogs
      - MYSQL_PASSWORD=your-gogsPW

    volumes:
      - /var/docker_data/gogsdb:/var/lib/mysql

    expose:
      - "3306"

    networks:
      - gogs_network

    labels:
      - "traefik.enable=false"

  minecraft:
    image: itzg/minecraft-bedrock-server
    container_name: minecraft
    environment:
      - EULA=TRUE
      - VERSION=latest
      - GAMEMODE=creative
      - SERVER-NAME=your-minecraft-server-name
      - MOTD="Willkommen im xxxxxxx"
      - PUBLIC=false

    labels:
      - "traefik.enable=false"

    ports:
      - "19132:19132/udp"

    volumes:
      - /var/docker_data/minecraft:/data

  kimai_sqldb:
    image: mysql:5.7
    environment:
      - MYSQL_DATABASE=kimai
      - MYSQL_USER=kimaiuser
      - MYSQL_PASSWORD=your_kimaipassword
      - MYSQL_ROOT_PASSWORD=your_rootPassword
    volumes:
      - /var/docker_data/kimaidb/:/var/lib/mysql
    command: --default-storage-engine innodb
    restart: unless-stopped
    healthcheck:
      test: mysqladmin -pyour_kimaipassword ping -h localhost
      interval: 20s
      start_period: 10s
      timeout: 10s
      retries: 3

    networks:
      - kimai_network

    labels:
      - "traefik.enable=false"

  kimai:
    image: bkraul/kimai2:nginx-alpine
    environment:
      # web server
      - PHP_DATE_TIMEZONE=Europe/Berlin
      # kimai2
      - APP_ENV=prod
      - DATABASE_URL=mysql://kimaiuser:your_kimaipassword@kimai_sqldb/kimai
      - MAILER_FROM=kimai@mydomain.com
      - MAILER_URL=smtp://validsmtpurl
      - APP_SECRET=your_SuperSecret
      # initial admin user
      - APP_ADMIN_USER=master
      - APP_ADMIN_EMAIL=master@mydomain.com
      - APP_ADMIN_PASS=your_masterPassword
      - APP_LOG=0
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ./local.yaml:/app/config/packages/local.yaml
#    ports:
#      - '8001:80'
    restart: unless-stopped
    depends_on:
      - kimai_sqldb

    labels:
      - "traefik.http.routers.kimai.rule=Host(`kimai.my-company.de`)"
      - "traefik.http.routers.kimai.entrypoints=https,http"
      - "traefik.http.routers.kimai.tls=true"
      - "traefik.http.routers.kimai.tls.certresolver=kimairesolver"

    networks:
      - kimai_network

  kimai_postfix:
    image: catatnight/postfix:latest
    environment:
      - maildomain=kimai.local
      - smtp_user=kimai:kimai
    restart: unless-stopped

    networks:
      - kimai_network

    labels:
      - "traefik.enable=false"

Traefik ( /var/docker_data/traefik/traefik.toml )

Core functions of the following file:

  • Monitoring the port clearances of started Docker containers via the socket of the Docker service (see below, docker.sock).
  • Reroute all accesses to the virtual hosts (as defined as labels in docker-compose) to the containers.
  • Receive http requests; redirect http requests to https
  • For https accesses on-the-fly via Let’s-Encrypt certificates, store and manage them, handle encryption… forward unencrypted traffic to port 80 of the containers.
  • Cool here: Traefik does everything fully automatic. Hardly any explanation is needed.
  • It’s difficult: Traefik does everything fully automatic. Nobody explains, because it is so simple (????)…

    I am desperate when setting up the system, that the setting up of Traefik was apparently sooooooo simple, that it apparently did not need any explanation. I was sitting in front of a jumble of colorful help pages for Traefik and didn’t even know what the vocabulary of my problems in Traefik was, so I couldn’t search for the solutions.

    Find below a complete system consisting of Traefik configuration and a Docker-Compose-File.

logLevel = "DEBUG"

defaultEntryPoints = ["http", "https"]

[entryPoints]

  [entryPoints.http]
  address = ":80"

  [entryPoints.http.http]
    [entryPoints.http.http.redirections]
      [entryPoints.http.http.redirections.entryPoint]
        to = "https"
        scheme = "https"

  [entryPoints.https]
  address = ":443"

[api]
dashboard = true
insecure = false

[certificatesresolvers.traefikresolver.acme]
email = "post@your_private_hp.de"
storage = "/etc/traefik/traefik/acme.json"
[certificatesresolvers.traefikresolver.acme.httpChallenge]
entryPoint = "http"

#onHostRule = true
#acmeLogging =true

[acme.httpChallenge]
entryPoint = "http"

[certificatesresolvers.myprivatechatresolver.acme]
email = "post@your_private_hp.de"
storage = "/etc/traefik/myprivatechat/acme.json"
[certificatesresolvers.myprivatechatresolver.acme.httpChallenge]
entryPoint = "http"

[certificatesresolvers.mattermostnmresolver.acme]
email = "post@your_private_hp.de"
storage = "/etc/traefik/mattermostnm/acme.json"
[certificatesresolvers.mattermostnmresolver.acme.httpChallenge]
entryPoint = "http"

[certificatesresolvers.kimairesolver.acme]
email = "post@your_private_hp.de"
storage = "/etc/traefik/kimai/acme.json"
[certificatesresolvers.kimairesolver.acme.httpChallenge]
entryPoint = "http"

[certificatesresolvers.opresolver.acme]
email = "post@your_private_hp.de"
storage = "/etc/traefik/op/acme.json"
[certificatesresolvers.opresolver.acme.httpChallenge]
entryPoint = "http"

[certificatesresolvers.kbresolver.acme]
email = "post@your_private_hp.de"
storage = "/etc/traefik/kb/acme.json"
[certificatesresolvers.kbresolver.acme.httpChallenge]
entryPoint = "http"

[certificatesresolvers.gitlabresolver.acme]
email = "post@your_private_hp.de"
storage = "/etc/traefik/gitlab/acme.json"
[certificatesresolvers.gitlabresolver.acme.httpChallenge]
entryPoint = "http"

[certificatesresolvers.gogsresolver.acme]
email = "post@your_private_hp.de"
storage = "/etc/traefik/gogs/acme.json"
[certificatesresolvers.gogsresolver.acme.httpChallenge]
entryPoint = "http"

[providers.docker]
  endpoint = "unix:///var/run/docker.sock"
#  exposedByDefault = false

Posted in Uncategorized | Tagged , , , , , , , , , | Leave a comment

Some word about the Groundhog Days

The days of the week have all been the same since Corona. Monday, Tuesday, Saturday… whaMonday, Tuesday, Saturday, whatever.

It’s Groundhog Day. Adults work from dawn till dusk. Be it external (work) or internal (children).

Daily job for weeks: to make it better every day.

On the subject of how we tackle this (or not) this, I have summarized a few thoughts as Powerpoint (Link) 🙂 .

Posted in Uncategorized | Leave a comment

Many freelancers just keep on working – I wish other companies would copy from them

When I talk to employees of large corporations and small companies lately, I have the feeling of living in an ivory tower. Mona Haug, who coaches me, even even pointed out to be careful not to hurt the feelings of third parties. The reason: my working life has not really changed. My added value and that of the Brinkhaus GmbH continues as before.

In fact, an important customer is about to go into a shutdown and may question his budget afterwards. But apart from that, everything is running relatively normally.

Meanwhile, many companies are simply going into shutdown. The remaining staff’s working time is spent in relevant parts on collecting government funds and managing the shutdown.

I urgently appeal to the “Sense of Urgency”: yes, I know that some people find this a hackneyed word. But please forget thoughts of Corona being over in four weeks. Please also invest some work in how your company will continue to operate in a few weeks despite Corona.

Why do I really want that? Because I find it cruel how so many people are only working on the shutdown, with businesses and consumers worldwide pulling each other down.

Even in the days of my last major corporation employer (KOMET), I was “special” in my own way in that corporation. Among other things, I was the “digital native” among the chippers. But also someone who could continue working in the ICE, at home and in the office without interruption. At that time it was a silent thought that others should cut slices from this way of working.

In the meantime I see a general need to spread parts of this idea with verve – now.

So the question is: why do Jan Brinkhaus and similar parts of his professional environment simply continue to work?

I started again as a freelancer at the end of 2018. This professional group can work from any location. It “sees” conversation partners mostly via video conference. They only travel from time to time. There have well-established processes with customers that focus on telecollaboration. The freelancer himself is often the know-how carrier about how to work well with in this way. He brings this into his client companies, so that afterwards a visible state is created in which everyone works well together.

In my view, people or companies that are set up in this way often continue to work as before – so far. In my current experience, the ability of structures organized in this way to create value remains intact.

Excursus “Set up as a freelancer”:

Being a freelancer from the end of 2018 onwards meant that a desk exists at home. The house has an internet line (wired) of 100MBit in download and 12MBit in upload. Internet is distributed via Mesh-WLAN in such a way that there is a certain reliability: even via WLAN video conferences are possible.

There is a local server, as well as a nightly concept for backups to the cloud for reasons of data security. There is a vault. There is a good camera for video telephony. I have an ANC headset, which ensures that I can talk even when the environment would normally not be suitable for it.

I talk to fellow participants 2-3h daily via Skype / Circuit / Phone. I talk to my colleagues and customers mostly via Skype or telephone.

In order to keep my ability to travel as high as possible, I bought a set of 20 washable breathing masks for 8€/piece. Meanwhile I own a small disinfectant sprayer which fits into the inside pocket of my jacket.

Sounds strange to you? Maybe. But my employee and I just keep on working like before. And still make (?) full turnovers.

Because the structures are suitable. Maybe you can only take over a part of it. However, I would like to suggest the idea of a certain mental flexibility to you

Main thesis: one can organize many areas of a company so that they function in a distributed manner. Persons who contribute when traveling by train just continue working in the home office.

As a general manager in the KOMET Group, I have built up a development department in Bangalore. The headquarters of the KOMET group was in the south of Germany. My branch “KOMET Brinkhaus” was in the north of Germany. We provided our know-how for the rest of the group in the form of wikies, telephone support and service personnel travelling worldwide. Many people I contacted had most of their working contacts via video conference, telephone or mail. Our global travelers had special SIM cards that allowed them to answer emails in a taxi even in Shanghai.

Important here: with the appropriate mindset, a troop could be built up that did not necessarily have to see each other personally. Only 1/3 of the employees were in the office.

I was able to take over most of it seamlessly into my freelance life starting in 2019. So if, for example, a new monitoring system manufacturer for machine tools has been created in Germany within about 18 months, this is also due to the fact that I had no problem for the customer to lead an Indian in the Ruhr area, a German in Poland and a Bavarian (in Bavaria) as a development team. I took over a large part of the programming of the core software. At the same time I routinely took on a mixture of Scrum Master and Product Owner as a Scrum role. In the meantime the customer has successfully completed tests with machine manufacturers. Since a lot of things went into the product that reflect current customer wishes on the market, a market entry was successful despite Corona.

This is only threatened in the medium term by the shutdown of customers or their customers. This is also currently threatened by the higher proportion of working hours in the presence of children.

Here, too, the value-added capability of structures organised in this way remains largely intact even with Corona.

I have had (partly) single children in the house since the end of 2018. So I was adapted to it.

My partner works. Her children are 50% with us. I work. My children are about 2/3 with us. We have five boys between the ages of 3 and 8.

This required regular PDCO cycles 🙂 . We never got “finished” here either. Organizationally speaking: the PDCO cycles continue to run continuously 🙂 .

This part has changed suddenly. We were just better prepared than others, but not adequately prepared. Since the topic would go much too far here, I am placing it in a separate article. The core of this other article: try to keep working on solutions instead of organizing the shutdown because of problems!

What I would like to give you as a stimulation:

  • You currently have the great opportunity that your employees are more willing to change than average. Every employee wants to continue working. The companies have a need for value-added chains that can be run despite Corona.

    You have the great opportunity to have created more efficient, more location-independent, family-friendly company structures afterwards.
  • Let your employees keep distance instead of sending them home. Hang up posters for employees and visitors. For example, explain that people do not shake hands or hug each other. “Smiling is the new greeting.”
  • Ensure internal acceptance of videoconferencing instead of face-to-face meetings. Move meetings to video conferencing. Write guidelines for such conferences and stick to them yourself. Adjust the guidelines. Make sure that one person sits in front of each computer and that everyone has a headset so that everyone can communicate symmetrically and properly.
  • Build up networks with which you can work in structures where there is less direct contact. Both employees of suppliers and customers may not want to meet in person. But they want to continue working with you. If you do it well, everyone can have the added value in the end with less travel time than before.

    Support your suppliers in this. Make sure that obstructive aspects in their company are found and consistently changed. Let the customers and suppliers enter your company electronically.
  • Let external service technicians contribute their know-how by guiding your internal maintenance staff via Skype / AR glasses. Let external service providers selectively access areas of your company network via VPN wherever possible.
  • Divide offices in such a way that employees of one know-how group no longer sit together in one office. For example, if two controllers and engineers were previously sitting in one office with controllers and engineers respectively, you can temporarily mix the offices.

    If a controller/engineer then falls ill, you consequently send his office colleague home. In this case, one engineer is missing in addition to the controller. However, it would need the second – parallel occurring – case of illness at the earliest for you to no longer have a controller or engineer in the company.
  • Remove 50% of the chairs in the canteen. Specify that the employees may only sit diagonally from each other and keep a virtual seat free next to each other. Only serve packaged food in the canteen or take other measures to keep it open. Financially, this is better than sending everyone home.

    Buy your employees breathing masks from the non-medical sector. Organise to continue working with them. For example, this could involve buying 5-10 masks for each employee and giving them to the employees as a gift. Come to work with a mask yourself. And then you (all) continue working.

  • Development processes can to a large extent continue if one looks for solutions in the world of Scrum methodology, instead of accepting that Corona is presenting the company with too many problems. I know that it may seem strange sometimes when consultants carry Scrum elements like a bible in front of them. It does not have to be your bible! Think of it as a pool of ideas, but do what you think is helpful from that pool.
  • Likewise, many other processes can be redesigned to become more independent of where the work is done.

    Now is the time to adjust processes and use the organizational work that is necessary anyway as an opportunity.
  • There are a lot of people in Germany who have the right mindset to transfer your running processes to corona times in a functioning and ISO9001 compliant manner. Take advantage of this! Yes, then you may pay consultants. A shutdown is more expensive in comparison.

    Coach your employees to set up proper structures at home. Coach them to set themselves apart if necessary AND offer the children a nice home. Ensure that a certain seriousness and quality of work awareness is maintained through ideas such as “we don’t sit in our bathrobes at work”.

Additional measures will always be necessary. For me, the above is not about a complete list of measures for a company, but a mindset.

My main point: many freelancers can currently simply continue working. Find your ways to bring this mindset into your company. Under aspects of mental mobility and the possibilities of working without direct contact.

Especially if you would otherwise have to put work into shutting down the company, please put this work into how to continue, where possible.

Posted in Uncategorized | Leave a comment

Cookbook “Start in Tätigkeit als freier Ingenieur”

Anfang 2008 machte ich mich das erste Mal als freier Ingenieur selbstständig. Rückblickend erinnere ich mich daran, wie mir 2008 ein Kollege vom damaligen Arbeitgeber etwas empört sagte

“Du kannst doch nicht einfach eine Visitenkarte drucken und Dich Ingenieurbüro nennen”.

Kollege am IFW, 2008


An diesen Punkt möchte ich hier anknüpfen. Die Kurzantwort lautet nämlich “Doch!” – auch wenn ich heutzutage einige Dinge gründlicher angehe, als früher 🙂 .

Als ich nun zum 1.1.2019 – nach 10 Jahren Berufserfahrung im Firmenaufbau – wieder in den Status des freien Ingenieurs wollte, arbeitete ich das nötige Programm inzwischen routiniert ab 🙂 .

Für interessierte Personen, habe ich die Inhalte meiner letzten Wochenenden und Abende hier als “Cookbook” zur Selbstständigkeit aufgelistet 🙂  .

Erster Hinweis vorab: das Ingenieurswesen ist ein sogenannter freier Beruf. Es kann sich jede Person mit entsprechender Ausbildung selbstständig machen, indem sie es einfach “tut”. Es gibt keine weiteren rechtlichen Erfordernisse, wenn man die grundsätzlichen Spielregeln beachtet.

Zweiter Hinweis vorab: beginnt 4-8 Wochen vor Durchziehen des unteren Programms, Eure Fühler auszustrecken. Prüft, ob Eure Selbstständigkeit funktionieren kann. Im Regelfall identifiziert Ihr dabei mögliche Kunden und sprecht diese an. Ziel sollte sein, dass Ihr einen Teil Eurer Akquisearbeiten vorab beginnt, so dass die ersten Aufträge zeitnah zu den Kosten eingehen, die durch die unteren Tätigkeiten entstehen.

Cookbook “Selbstständigkeit als freier Ingenieur”

Aktion: bestellt bei Eurer Bank ein separates Konto. Auf dieses lasst Ihr die Kunden alle Geschäftseinnahmen überweisen. Von diesem tätigt Ihr alle Geschäftsausgaben. Von diesem überweist Ihr Euch alle “Gehälter” auf Euer Privatkonto.

Aktion: geht zum Steuerberater, mit dem Ziel, dass er Eure Buchhaltung führt.Später gebt Ihr ihm für alle Einzahlungen und Auszahlungen auf dem Konto je 1 Beleg. Überweist ein Kunde Geld, bekommt der Steuerberater die Rechnung, auf die der Kunde bezahlt hat. Lasst Ihr Euch Geld für eine Dienstreise (Bahnticket, Taxiquittung) auf das Privatkonto überweisen, gebt Ihr ihm die Quittungen. Ihr gebt demselben Steuerberater bei Jahresende den Auftrag, Eure Steuererklärung zu machen.

Aktion: 4-wöchiger Exkurs, unter Bedingung, dass eine GmbH erwünscht ist: gründet die GmbH. Als freier Ingenieur braucht Ihr dies normalerweise nicht.

Wichtigste Aspekte: es führt zu Beginn zur kurzfristigen Kapitalbindung von rund 25T€, kostet in der Gründung 8-16h  Stunden mehr Arbeit, verzögert viele Schritte um mehrere Wochen, erzwingt einen erhöhten Verwaltungsaufwand, verbessert Euren Außenauftritt, erschwert Geldentnahmen und erleichtert manche Steuertricks. Im Regelfall benötigt Ihr als freier Ingenieur keine GmbH und es ist verhältnismäßig, eine eventuelle GmbH später zu gründen.

Wenn dennoch gewünscht: sprecht den Steuerberater hierauf an. Er und ein Notar werden Euch gegen Entgelt gern durch die fehlenden Punkte führen.

Kurzfassung: Notar die GmbH anmelden und mit einer Satzung versehen lassen, Firmenkonto nicht auf Euch sondern für die GmbH einrichten,  25T€ einzahlen, mit Einzahlungsbeleg der 25T€ wieder zum Notar, Geschäftsführervertrag zwischen GmbH und sich selbst schließen. Zwischendurch dem Notar gut zuhören, beim Notar mitdenken, beim Notar Unterschriften leisten. Alle anfallenden Rechnungen von Notar und Amtsgericht bezahlen 🙂 (rund 1,5T€).

Aktion: kauft einen Arbeitslaptop oder bestimmt einen Privatlaptop zum Arbeitslaptop. Kauft ggf. zusätzliche Dinge (bei mir: gebrauchter Laptop, Dockingstation, zwei Monitore, Funkmaus, Tastatur).

Aktion: erstellt Euer Firmennetz. Kauft Euch dazu einen WLAN-Router, der zwischen Hausnetz und Gastnetz trennen kann. Wenn Haus/Wohnung zu groß sind, kauft WLAN-Router und WLAN-Repeater  mit Eigenschaft “Mesh-Fähig”, die ein zuverlässiges WLAN aufspannen (Ihr wollt arbeiten, wenn Ihr fertig seit). Ich kaufte 1x Fritzbox 6390 Cable, 3x Fritz Repeater 1750E.

Gebt Euch im Büro mit nichts unter einer 50MBit-Anbindung an Euren Server zufrieden (bei mir: Anbindung der Dockingstation mit Kabelverbindung zum nächsten Repeater). Kauft ein NAS  mit der Fähigkeit, durch Nutzung zweier Festplatten eine Ausfallsicherheit bei Ausfall einer Festplatte zu bieten (bei mir: Synology DS214). Kauft die nötigen Festplatten. Bindet das NAS per Kabel an den Router oder einen der Repeater an (bei mir: Router und NAS im Keller, verbunden per Kabel).

Ergebnis a) Ihr kommt mit dem genannten Aufbau – ohne Kabel zu verlegen – auf ein gutes Firmennetz. Im unteren Bild kann man z.B. sehen, dass der Teilnehmer “DESKTOP-4GTAC6K” per LAN an einem Fritz-Repeater hängt, der 526MBit als Verbindung zum Router abschätzt… an dem dann wieder per 1GBit-Leitung (direkt an der Fritzbox angeschlossen) das zentrale NAS “Brinkhaus” angeschlossen ist. –> >stabile 100MBit, ohne Kabel.
Ergebnis b) Ihr habt Euer Firmennetz von Gästen getrennt. Das Netz ist “Euers”. Hausgästen, die “mal eben ins Internet” möchten, gebt Ihr nämlich den WLAN-Code des Gastnetzes.

Aktion: richtet das NAS ein. Ihr benötigt insbesondere Dateifreigaben im Windows-Netzwerk, einen VPN-Server für Zugang von außen. Erstellt auf dem NAS direkt eine Ordnerstruktur, in die die ersten Dateien ihren Weg finden. Beispielordner: Präsentationen, Projekte, Verwaltung, Vorlagen.

Aktion: erstellt vom leeren Blatt Papier ein Firmenkonzept:

  1. Schreibt auf, was Ihr arbeiten möchtet, welche besonderen Fähigkeiten Ihr habt, an welchen Arbeiten Ihr Interesse habt.
  2. Überlegt Euch dann, was Eure Kunden sind.
  3. Überlegt Euch dann, was Eure Kunden lesen müssen, um Euch für die Arbeiten interessant zu finden, die ihr nach Punkt “1.” aufgelistet habt.
  4. Vergegenwärtigt Euch, dass Eure persönliche Interessenslage vermutlich in dem liegt, was unter Punkt “1.” steht, Ihr aber stattdessen kommunizieren müsst, was unter Punkt “3.” steht. Denn das interessiert Eure Kunden. Und die zahlen Euer Gehalt.
  5. Beginnt in Gedanken, die Punkte aus “3.” in einer Unterlage für Kunden zu verschriftlichen. Wie könnte eine Firmenpräsentation oder eine Webseite aussehen? Sucht im Internet nach Webseiten anderer Dienstleister, die ähnliches leisten. Sucht gewissermaßen Euch selbst.

Aktion: bucht auf Mietbasis die elektronische Firmeninfrastruktur. Bucht dazu eine Domain bei einem großen Anbieter (bei mir: Strato). Bucht hierbei ein Paket, welches die Installation von Content Management Systemen (CMS) ermöglicht. Installiert in Eurem Webspace ein CMS, das viele Menschen verwenden, so dass Ihr per Google schnell Hilfestellungen findet (bei mir: WordPress). Mietet beim Buchen ein Exchange-Postfach und eine Office-Lizenz dazu. Am Ende sollte herauskommen, dass Ihr einen Webspace und ein lauffähiges Office habt. Ich kaufte alles in einem Paket bei Strato. Man kann freilich auch bei einzelnen Anbietern Einzelmodule kaufen.

Aktion: bestellt Euch einen Drucker mit Scanfunktion, kauft einen Vorrat farbige und schwarze Tintenpatronen, Papier. Bindet den Drucker in Euer WLAN ein, druckt eine Testseite von Eurem Arbeitslaptop. Tipp: bestellt Drucker, Patronen usw. per Amazon. Das führt dazu dass Ihr bei späterem Bedarf an Tintenpatronen formlos aus der Amazon-Webseite heraus Patronen nachbestellen könnt (und nicht zum Saturn etc gehen müsst :-), nur weil Euch eine schwarze Tintenpatrone fehlt).

Aktion: installiert Euch Software für diverse Standardfälle Eurer Arbeit auf den Dienstlaptop. Bei mir waren dies Gimp (Bildverarbeitung), nach Einlesen in Fachartikel ein Python-Paket (IDE, Pakete, …) zum Durchsehen und Auswerten großer Datenmengen (Data Mining), Eclipse für spontane Dinge mit Java/C/C++, Acrobat Reader und Skype. Es geht in diesem Absatz nicht darum, die Pakete alle auf einmal zu benutzen. Es geht nur darum, dass Ihr sie herunterladet, installiert und mit einer Basisinbetriebnahme verseht, solange Ihr eine ordentliche Internetverbindung zuhause am Schreibtisch habt. Seid Ihr einmal unterwegs, können vermeintlich kleine Downloads ein Problem werden. Denkt einfach jetzt nach, was Ihr benötigt oder benötigen könntet, ladet es herunter/bezahlt es und installiert es 🙂 .

Aktion: erstellt ein Logo. Überlegt Euch dazu, welche Farben Ihr hauptsächlich nutzen wollt. Sucht dann im Internet nach Ideen für Logos. Zeichnet dieses Logo auf eine leere weiße Powerpoint-Folie. Kopiert es auf ein weißes und ein schwarzes Rechteck. Exportiert dann das unmodifizierte Logo, das auf schwarzem Grund und das auf weißen Grund in je eine PNG-Datei und legt diese in einem temporären Firmenordner auf Eurem Rechner ab. Ziel dieser Arbeiten: drei Dateien “Logo weißer Hintergrund” / “Logo schwarzer Hintergrund” / “Logo transparent” zur späteren Nutzung in Briefvorlagen, Webseiten, etc. . Zielbild wäre eine Ablage, die unterer ähnelt.

Aktion: sperrt Eure Webseite. Während Ihr Eure Webseite baut, muss keiner Zwischenergebnisse Eurer Webseite sehen. Sucht dazu per Google Möglichkeiten, die Sicht auf eine Webseite des von Euch gewählten CMS einzuschränken. Setzt dies um (bei mir: Plugin “Hide my Site” für WordPress).

Aktion: füllt Eure Webseite. Setzt Euch dazu mit Word, Zettel+Papier o.ä. hin und erstellt eine Baumstruktur des Menüs Eurer Webseite. Diese wiederum füllt Ihr nach und nach mit den Inhalten des Punkts “3.” und “5.” aus “Erstellt vom leeren Blatt Papier ein Firmenkonzept”. Ab da werdet Ihr erstmal beschäftigt sein. Das Befüllen der Webseite wird Euch aufzeigen, was Euch an Inhalten für Euren Geschäftsauftritt fehlt 🙂 .

Tipp: startet in der Anfangsphase eine Suche nach Bildern, die Euch für das Layout nützlich sein können. Nutzt die Google-Bilder-Suche (durch Wahl der entsprechenden Einstellungen), um Euch Bilder zu liefern, die zur kommerziellen Nutzung und zur Veränderung freigegeben sind.

Ende 2018 war hierzu in der Bildersuche auf “Tools” zu drücken, anschließend “Nutzungsrechte”. Ein Bildschirmfoto der nötigen Auswahl bei Google findet Ihr unten.

Spielt mit Suchbegriffen, bis Ihr Bildergruppen findet, die für Eure Webseite nützlich sind. Ladet 10-20 Stück herunter und speichert sie in ein Bildvorlagenverzeichnis (z.B. “Vorlagen\Freie Bilder”). Während Ihr Texte erstellt, dienen sie Euch anschließend zur optischen Auflockerung.

Tipp: prüft, welche Inhalte andere Personen mit ähnlichem Dienstleistungsangebot in ihre Web-Seiten eingefüllt haben. Erstellt aus Euren Eindrücken eigene Inhalte. Spielt mit den “Themes”, die das CMS bietet.

Aktion: ergänzt Eure Webseite um Google Analytics. Installiert Euch Google Analytics auf Eurem Smartphone. Sinn der Übung: Ihr bekommt – frei Haus ins Smartphone geliefert – einen Überblick über die Besucherzahlen Eurer Webseite.

Ein Beispielbild findet Ihr rechts. Es zeigt diese Webseite hier :-), in ihrer ersten Woche nach Freischaltung.

Aktion: erstellt Office-Vorlagen, insbesondere eine Powerpoint-Vorlage und eine Briefvorlage, speichert Sie auf Eurem NAS geeignet ab. Zum Beispiel in einem Ordner “Vorlagen”.

Aktion: erstellt Euch einen einfachen Liquiditätsforecast in Excel / Access. Dieser dient dazu, dass Ihr einen Forecast Eurer Einnahmen und der Liquidität habt. Die Einträge Eures Systems dienen Euch gleichzeitig dazu, eine Auftragsakquise und deren Folgen im Blick zu behalten.

Die Implementierung hängt von Eurem Geschäfts-Case und Euch ab. Sie muss zu Beginn ausdrücklich nicht hübsch sein. SIe muss Euch “nur” zeigen können, in welchem Monat welches Geld mit welcher Wahrscheilichkeit kommt. Bildet eine Saldo über diese Gelder.

Ein kurzer Eindruck meiner Implementierung: untere Abildung zeigt die Struktur einer Access-Datenbank, die ich zu diesem Zweck einrichtete.

Man erkennt im Bild zwei Tabellen “Buchungen” und “Projektbeschreibung”. Eingehende und ausgehende Gelder bilden jeweils eine Zeile in der Tabelle “Buchungen”. Einträge in “Buchungen” wiederum sind Einträgen der Tabelle “Projektbeschreibung” zugeordnet.

Projekte werden zuerst in “Projekte” als Zeile angelegt und mit einer Wahrscheinlichkeit versehen. In Buchungen bekommen dann Ein- und Ausgaben für dieses Projekt in sinnvollen Zeitabständen je einen Eintrag (Tabellenzeile). Ziel der Übung ist primär, aus all den Einträgen per Klick in Access eine Abfrage generieren zu können, welche mir meine Liquidität über die nächsten Monate erstellt 🙂 .

Aktion: richtet einen Spiegel Eures NAS auf Eurem Laptop ein. Es gibt diverse Software, welche die Funktion erfüllt, die Dateien eures Firmenservers (NAS) mit einem Spiegel auf der Festplatte Eures Laptops zu synchronisieren. Dies ermöglicht Euch insbesondere, an fast beliebigen Orten (z.B. im ICE, im Frühstücksbereich eines Restaurants, …) zu arbeiten. Dies hilft Euch, Euch auf Eure Arbeit zu konzentrieren, anstatt z.B. unterwegs Internetverbindungsprobleme zu lösen. Ich nutzte hierzu FreeFileSync. Einen Screenshot meiner Konfiguration seht Ihr unten.

Man erkennt, dass ich die für mich auf Reisen wichtigsten Ordner meines NAS (privater Briefverkehr, private Dateien aus 2018, alle Dateien des Ingenieurbüros) jeweils zwischen Server und Laptop synchronisieren lasse. Hauptvorteil: wenn der Laptop defekt ist, kann ich fast störungsfrei mit dem nächsten Rechner weiterarbeiten – weil schlicht alle Dateien synchron auf dem NAS liegen. Habe ich einen Wasserschaden im Haus, der mir das NAS zerstört, bestelle ich ein neues NAS, arbeite mit dem Laptop weiter… und spiele das Backup des NAS ein, für das ich Strato monatlich 10€ bezahle. Ihr müsst es nicht genauso machen – aber eine Umsetzung dieser Grundprinzipien ermöglicht entspanntes kontinuierliches Arbeiten 🙂 .

Aktion: bestellt einen ersten Stapel Visitenkarten. Da Euch ja inzwischen Rohdateien eines Logos und Eure Grundfarben vorliegen, ist dies eine Sache von 1-2h. Sucht Euch im Internet einen Anbieter für Visitenkarten und bestellt. Ich persönlich nahm den Anbieter “Overnights”. Ich nahm ferner nicht eines seiner vorgefertigten Layouts, sondern lud mir von ihm eine Word-Vorlage einer Visitenkarte herunter und befüllte sie mit einem von mir gewählten Layout.

Abschließende Worte

Wie Ihr hiernach weitermacht, ist weitestgehend Euch überlassen und hängt von Euren konkreten Fähigkeiten ab. Für eine gewisse Ernsthaftigkeit und Seriösität des Auftretens kann ich aber nur empfehlen, den Großteil des obigen erledigt zu haben 🙂 .

Ich freue mich über Eure Rückkopplungen!


Posted in Uncategorized | Tagged , , , , | Leave a comment

Here we go (again)

Mit Schreiben dieses ersten Beitrags vervollständige ich gerade meine neuen Webseiten.

Auf dem Weg des Wechsels zurück zur Arbeit als freier Ingenieur wirkten viele Impulse auf mich ein.

Insbesondere hatte ich in der vielfältigen und abwechselungsreichen Arbeit als Gründer eines Start-Ups und Geschäftsführer eines Unternehmens der KOMET-Gruppe viele Eindrücke gewonnen, die in anderen Kontexten anwendbar sind.

Im Sommer 2018 brachte das Privatleben dann “erhöhte Flexibilitätsbedarfe” mit sich, welche ihre Beachtung bekommen möchten und sollen 🙂 .

Die Integration der ehemaligen KOMET-Gruppe in die Ceratizit-Gruppe führte dann im Herbst 2018 zu erheblichen Umstrukturierungen meiner Firma in Hannover. Diese wiederum konnte man auf Basis beidseitig toller und vertrauensvoller Kommunikation dazu nutzen, beidseitig neue Wege anzugehen.

Ich freue mich zu sehen, wie sich – weit vor meinem offiziellen Start in die Funktion eines freien Beraters (1.1.2019) – immer mehr interessante Projekte und Aufgaben abzeichnen 🙂 . Ich freue mich auf die Zusammenarbeit!

(Jan Brinkhaus)


Posted in Uncategorized | Leave a comment