Going Selfhosted: Breaking the prison of Surveillance Capitalism

Wait, what is surveillance captialism

  • Coined by Shoshana Zuboff
  • Capitalism: An economic and political system in which a country's trade and industry are controlled by private owners for profit
  • Surveillance Capitalism: When the said system's profit is made by monetizing the data obtained by surveilling the customers

Not really sure how this will effect you ?

Well, Google, Amazon and Facebook are exploiting you

Google spys on you 24/7

New York Times published an article about how a criminal was caught using phone's location data

Google spys on you 24/7

Google actively coordinates with Law Enforcement, these dots are you. They know where you were at what time

Google spys on you 24/7

And this is a representation of the route you traveled in a given time-frame

Their devices are designed to snoop

Their devices are designed to snoop

They just don't have a limit

How low can you stoop

Ok, I'm a bit worried, but does it actually pose any danger ?

  • China is already doing it (not surveillance capitalism, but more of a mass surveillance program)
  • All public places are covered by CCTVs
  • Footage is scanned real-time for people with criminal records ranging from drug dealers to jaywalkers
  • On their way to introduce a social credit system
  • Facial recognition and cell phone pinging were used in the recent Hong Kong protests to identify the protestors
  • Governments are already making deals, Oregon police and Amazon have teamed up to use facial recognition technology

Umm, but I do not do any illegal things

Arguing that you don't care about the right to privacy because you have nothing to hide is no different than saying you don't care about free speech because you have nothing to say.

- Edward Snowden

Umm, but I do not do any illegal things

When you say, ‘I have nothing to hide,’ you’re saying, ‘I don’t care about this right.’

 

You’re saying, ‘I don’t have this right, because I’ve got to the point where I have to justify it.’

 

The way rights work is, the government has to justify its intrusion into your rights

- Daniel J. Solove

Fine, I don't want to live in an Orwellian future. What can I do ?

Go Selfhosted

What all can be selfhosted ?

Git

Analytics

File storage

Calendar

Contacts

Blog

and much more ...

Software I used/replaced

Cloud Storage (GDrive/Dropbox) Nextcloud/Seafile
Google Analytics Fathom/Matomo
Google Docs Onlyoffice/LibreOffice Online
Evernote, OneNote, GKeep Standard Notes
Media (Movies + Music) Emby
Calendar + Contacts Nextcloud
Google Photos Piwigo/Photoprism
Git Gitea

How a self-hosted setup looks
[Demo Time]

How to setup your own ecosystem

Ansible role example for Portainer

 

- name: Run portainer container
  docker_container:
    name: portainer
    image: portainer/portainer
    restart_policy: always
    labels:
      traefik.frontend.rule: "Host:{{ portainer_domain }}"
      traefik.port: "{{ portainer_port }}"
      traefik.backend: portainer
      traefik.docker.network: "{{ traefik_proxy_network }}"
    networks:
      - name: "{{ traefik_proxy_network }}"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    ports:
      - "{{ portainer_port }}:9980"
    state: started

Ansible role example for Nextcloud

 

- name: Setup nextcloud
  file:
    path: "{{ nextcloud_dir }}"
    state: directory
    mode: 0755

- name: Copy docker-compose
  template:
    src: templates/docker-compose.yml.j2
    dest: "{{ nextcloud_dir }}/docker-compose.yml"

- name: Start nextcloud and mariadb
  shell: "docker-compose up -d"
  args:
    chdir: "{{ nextcloud_dir }}"

Docker-compose for Nextcloud (Database)

 

version: '3.5'

volumes:
  nextcloud:
  db:

services:
  db:
    image: mariadb
    restart: always
    volumes:
      - db:/var/lib/mysql
    environment:
      MYSQL_DATABASE: {{ nextcloud_mysql_database }}
      MYSQL_USER: {{ nextcloud_mysql_user }}
      MYSQL_PASSWORD: {{ nextcloud_mysql_password }}
      MYSQL_ROOT_PASSWORD: {{ nextcloud_mysql_password }}
    labels:
      traefik.enable: false
    networks:
      - nextcloud

Docker-compose for Nextcloud (Server)

 

  app:  
    image: nextcloud
    ports:
      - {{ nextcloud_port }}:80
    depends_on:
      - db
    volumes:
      - nextcloud:/var/www/html
    restart: always
    environment:
      NEXTCLOUD_TRUSTED_DOMAINS: "{{ nextcloud_domain }}"
      NEXTCLOUD_ADMIN_USER: {{ nextcloud_admin_user }}
      NEXTCLOUD_ADMIN_PASSWORD: {{ nextcloud_admin_password }}
      MYSQL_HOST: db
      MYSQL_DATABASE: {{ nextcloud_mysql_database }}
      MYSQL_USER: {{ nextcloud_mysql_user }}
      MYSQL_PASSWORD: {{ nextcloud_mysql_password }}
    labels:
      traefik.frontend.rule: "Host:{{ nextcloud_domain }}"
      traefik.port: 80
      traefik.backend: nextcloud
      traefik.docker.network: "{{ traefik_proxy_network }}"

    networks:
      - {{ traefik_proxy_network }}
      - nextcloud

Docker-compose for Nextcloud (Document Server)

 

  documentserver:
    image: onlyoffice/documentserver
    restart: always
    networks:
      - {{ traefik_proxy_network }}
      - nextcloud
    environment:
      - "TZ=UTC"
    labels:
      - "traefik.enable=true"
      - "traefik.port=80"
      - "traefik.backend=documentserver"
      - "traefik.docker.network=traefik_proxy"
      - "traefik.frontend.rule=Host:{{ onlyoffice_domain}}"

networks:
  {{ traefik_proxy_network }}:
    external: true
  nextcloud:
    name: nextcloud

Traefik's Labels

 

  • traefik.enable=true (Enable/Disable the container in Traefik)
  • traefik.port=80 (Registers this port. Useful when the container exposes multiples ports)
  • traefik.backend=documentserver (Name Traefik uses to identify the backend)
  • traefik.docker.network=traefik_proxy (the docker network to use for connections to the container)
  • traefik.frontend.rule=Host:{{ onlyoffice_domain}} (Add host header for domain)

Running containers

 

DNS and Networking configuration

Ansible role example for Traefik

 

- name: Create traefik proxy network
  docker_network:
    name: "{{ traefik_proxy_network }}"

- name: Run docker container
  docker_container:
    name: traefik
    image: traefik
    command:
      - --docker
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
      - "{{ traefik_dir }}/traefik.toml:/traefik.toml"
      - "{{ traefik_dir }}/acme.json:/acme.json"
    networks:
      - name: "{{ traefik_proxy_network }}"
    restart_policy: always
    labels:
      traefik.frontend.rule: "Host:{{ traefik_monitor_domain }}"
      traefik.port: "8080"
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"
    state: started

How traefik helps

 

  • Traefik listens to your service registry/orchestrator API and instantly generates the routes so your microservices are connected to the outside world -- without further intervention from your part.
  • In this case, to use traefik, you just need to add labels to your docker container
  • Provides a UI Dashboard out of box

DNS Config

 

  • We now need a way to access those services from the internet
  • It is advisable to use a domain
  • The host header defined in Traefik should match the subdomain
  • You can use terraform or the cloud provider's API as well
  • I chose terraform because it was the fastest way to get the desired results

DNS Config in DigitalOcean

 

DNS Config using Terraform

 

provider "digitalocean" {
  token = "${var.do_token}"
}

resource "digitalocean_record" "cloud" {
  domain = "${var.domain}"
  type   = "A"
  name   = "cloud"
  value  = "${var.target_ip}"
}

resource "digitalocean_record" "portainer" {
  domain = "${var.domain}"
  type   = "A"
  name   = "portainer"
  value  = "${var.target_ip}"
}

resource "digitalocean_record" "onlyoffice" {
  domain = "${var.domain}"
  type   = "A"
  name   = "onlyoffice"
  value  = "${var.target_ip}"
}

resource "digitalocean_record" "traefik" {
  domain = "${var.domain}"
  type   = "A"
  name   = "traefik"
  value  = "${var.target_ip}"
}

Checklist

  • Have an automated backup and restore mechanism
  • Everything should be as code
  • Destroying and creating a new self-hosted cloud should be a one-step command
  • Don't have a single point of failure

Managed vs Self Hosting

Managed Self
Software Depends upon the provider You are in full control
Reliability More reliable Depends on how you manage it
Privacy Data is stored on their servers Data is stored on your servers
Robustness More robust as they have business targets Depends on the software you are using
Convenient Yes No

The future of self-hosted apps

Thank You

Going Selfhosted: Breaking the prison of Surveillance Capitalism

By Yash Mehrotra

Going Selfhosted: Breaking the prison of Surveillance Capitalism

  • 738