Post

How Do You Securely Expose Your Self-Hosted Services Eg Plexjellyfinnextcloud To The Internet

Welcome to this comprehensive guide on securing your self-hosted services such as Plex, Jellyfin, Nextcloud, and others in your personal homelab infrastructure. This article will focus on implementing secure exposure.

# Securing Self-Hosted Services: A Practical Guide for Your Homelab Infrastructure

Welcome to this comprehensive guide on securing your self-hosted services such as Plex, Jellyfin, Nextcloud, and others in your personal homelab infrastructure. This article will focus on implementing secure exposure strategies while maintaining optimal performance.

Prerequisites:

  1. Operating System: Ubuntu Server 20.04 LTS or higher
  2. Docker CE Version: 5.0.8 or later
  3. Docker Compose Version: 1.29.2 or later

Step-by-Step Solution

1. Install Docker and Docker Compose

1
2
3
4
5
curl -fsSL https://get.docker.com/ | sh
sudo usermod -aG docker ${USER}
systemctl enable --now docker
wget https://github.com/docker/compose/releases/download/1.29.2/docker-compose-Linux-x86_64 -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

2. Create a Docker Compose File (e.g., docker-compose.yml)

In this example, we will create a basic Nextcloud configuration. Replace nextcloud, username, and password with your desired service name and credentials. Adjust the configurations according to your specific self-hosted services.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
version: '3'
services:
  nextcloud:
    image: nextcloud
    container_name: nextcloud
    restart: always
    environment:
      MYSQL_DATABASE: nextcloud
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      MYSQL_HOST: db
    ports:
      - 80:80
      - 443:443
    networks:
      - home-network

  php:
    image: php:7.4-fpm
    container_name: nextcloud_php
    restart: always
    volumes:
      - ./data:/var/www/html
    environment:
      WWW_DATA: /var/www/html
    networks:
      - home-network

  db:
    image: mysql:8.0
    container_name: nextcloud_db
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: nextcloud
    volumes:
      - dbdata:/var/lib/mysql
    networks:
      - home-network

volumes:
  dbdata:

3. Configure Network Settings

Update your router’s settings to allow traffic only from the IP address of your server on ports 80 and 443.


4. Set Environment Variables

1
2
3
4
export MYSQL_USER=yourusername
export MYSQL_PASSWORD=yourpassword
export MYSQL_ROOT_PASSWORD=root_password
docker-compose up -d --build

5. Troubleshooting and Optimization

In case of any issues, check the logs using docker-compose logs. To optimize performance, consider enabling caching solutions like Redis or Memcached.


Conclusion

By following these steps, you can securely expose your self-hosted services on the internet while maintaining optimal performance. Remember to keep your systems updated, monitor for potential vulnerabilities, and adhere to best practices in security and DevOps. Happy homelabbing!

This post is licensed under CC BY 4.0 by the author.