[5 Mins Docker] Create Your Own Image Hosting Site - Picsur - Sharex Integration - NETSEC

Latest

Learning, Sharing, Creating

Cybersecurity Memo

Saturday, October 28, 2023

[5 Mins Docker] Create Your Own Image Hosting Site - Picsur - Sharex Integration

There are many free image hosting sites which you can upload your images then get URL to use it in your website or blog posts or social media sites. But there is a problem with those free sites, you will not have your own control for your data since that is free hosting. To make sure we got full control of our data, we will have to create our own self-hosting image hosting site. It has to be free and easy to set up. I am also using ShareX to capture screenshots then using built-in workflow to automatically upload to remote online storage website. The integration with ShareX will be essential feature for me as well, which might be not important for other. Ideatlly, you might want to have basic editting, expiring, and easy to backup/restore this kind of features. 

Github project Picsur meets all those requirements and this post will give you a quick guide how you can create your self hosted images bed. 



Github Project Link: https://github.com/caramelfur/picsur

Demo site:

Project Features and Screenshots

Simple Main Interface with login notification for uploading:


Login Page with default username admin:


System Settings:

Upload Image:


Features:
  •  Uploading and viewing images
  •  Anonymous uploads
  •  User accounts
  •  User roles and permissions
  •  Proper CORS restrictions
  •  Exif stripping
  •  Ability to keep original
  •  Support for many formats
  • QOI
  • JPG
  • PNG
  • WEBP (animated supported)
  • TIFF
  • BMP
  • GIF (animated supported)
  •  Convert images
  •  

    Edit images

    Resize
  • Rotate
  • Flip
  • Strip transparency
  • Negative
  • Greyscale
  •  Deletable images
  •  Proper DB migrations
  •  Show own images in list
  •  Correct previews on chats
  •  Expiring images
  •  ShareX endpoint
  •  ARM64 and AMD64 Docker image


Installation Steps


1 Log into your VPS and start to install required softwares

apt update && apt install docker.io -y && apt install docker-compose -y


2 Create a data folder 

sudo -i
mkdir -p /root/data/docker_data/picsur
cd /root/data/docker_data/picsur


3 Create Docker Composer File

vi docker-compose.yml

Here is the content of this file:

version: '3'
services:
  picsur:
    image: ghcr.io/caramelfur/picsur:latest
    container_name: picsur
    ports:
      - '8088:8080' #8088 can be changed to other unused tcp port
    environment:
      PICSUR_HOST: '0.0.0.0'
      PICSUR_PORT: 8080
      PICSUR_DB_HOST: picsur_postgres
      PICSUR_DB_PORT: 5432
      PICSUR_DB_USERNAME: picsur
      PICSUR_DB_PASSWORD: Secure_DB_passw0rd  # This has be same one as configured in the settings of picsur_postgres
      PICSUR_DB_DATABASE: picsur
      ## Default admin username's password
      PICSUR_ADMIN_PASSWORD: Secure_admin_passw0rd      
      ## optional. If not set here, it will be generated randomly. 
      # PICSUR_JWT_SECRET: CHANGE_ME
      # PICSUR_JWT_EXPIRY: 7d
      
      ## Maximum File zie
      PICSUR_MAX_FILE_SIZE: 10240000  # 10 MB
      ## No need to touch this, unless you use a custom frontend
      # PICSUR_STATIC_FRONTEND_ROOT: "/picsur/frontend/dist"
      ## Warning: Verbose mode might log sensitive data
      # PICSUR_VERBOSE: "true"
    restart: unless-stopped
    
  picsur_postgres:
    image: postgres:14-alpine
    container_name: picsur_postgres
    environment:
      POSTGRES_DB: picsur
      POSTGRES_PASSWORD: Secure_DB_passw0rd
      POSTGRES_USER: picsur
    restart: unless-stopped
    volumes:
      - ./picsur-data:/var/lib/postgresql/data 


4 Open Firewall Port

Here is an example using Oracle cloud: 



5 Test using public ip address

Get your VPSs's public IP

Curl ifconfig.me

Access your Picsur website using public ip with defined port: http://<Public IP>:8088



NPM - Setting Up Nginx Reverse Proxy Manager

 
Depending on what your domain is, it will be different.
For my demo: picsur.51sec.eu.org










Demo site: 

Update / Backup / Migrate Picsur

Following commands show how to backup and update docker: 


cd /root/data/docker_data/picsur
docker-compose down 
cp -r /root/data/docker_data/picsur /root/data/docker_data/picsur.archive  # backup
docker-compose pull
docker-compose up -d    # no need to use "docker-compose stop" to stop docker. "docker-compose up -d" will stop and auto update new docker. 
docker image prune  # prune command is used to remove all unused images

Migrate Picsure Docker:


Steps:
1. backup data folder and zip it into one file
2. transfer to a new server
3. Unzip backup file into same data folder
4. Install docker & docker-compose, then spin up docker using same docker run command or docker-compose.yml file


cd /root/data/docker_data/picsur
docker-compose down 
cp -r /root/data/docker_data/picsur /root/data/docker_data/picsur.archive  # backup to a different archive folder
docker-compose pull
docker-compose up -d    # no need to use "docker-compose stop" to stop docker. "docker-compose up -d" will stop and auto update new docker. 
docker image prune  # prune command is used to remove all unused images

ChatGPT suggested Backup Strategy for Home Data:

One of the most popular backup policies is the 3-2-1 backup rule. This rule states that you should have:

  • 3 copies of your data
  • 2 different types of media for storing the data
  • 1 copy stored offsite


This means that you should have three copies of your data: the original files and two backup copies. The original files and one set of backup data can reside at the same location but they must be stored on two different types of media. You must also have one offsite set of backup data.

For your home server, I would recommend using an external hard drive or cloud storage service to store your backups. You can use software like Veeam Backup & Replication or Acronis True Image to automate the backup process and ensure that your data is always up-to-date.


Clearn up / Remove Docker

 
It will completely remove picsur related configuration, files, etc. 

cd /root/data/docker_data/picsur
docker-compose down
cd ..
rm -rf /root/data/docker_data/picsur

Clean Up / Remove Docker

  • Delete Docker and related resources
    • cd /root/data/docker_data/<docker_name>
    • docker-compose down
    • cd ..
    • rm -rf /root/data/docker_data/<docker_name>
    • docker image prune


ShareX Custom uploader guide : Picsur Integration


What is custom uploader?

Custom uploader system in ShareX let users to upload image/text/file to hosting services or shorten/share URL. This feature is mainly used by users who host their own hosting services.


Export / Import

You can export your custom uploader with .sxcu extension which allows users to just double click that file to be able to use custom uploader.


If destination type is configured then ShareX can also set this custom uploader as selected custom uploader and change current destination to this custom uploader, so users won't need any additional configuration to use it.

Github : https://github.com/CaramelFur/Picsur

Steps:

1. Create API Key in Picsur


2. Set up API key for Sharex then export config


3. Import Configuration into Sharex


4. Configure Custom Uploader Settings...


When you choose Test for Image uploader, you will find a ShareX icon uploaded to the Picsur site and you will have a url for the image. 


Self Hosted Docker Installation Pre-requirements

Free resources you might need to complete this docker project:


Pre-installed services:

  • Docker, 
    • apt update
    • apt install docker.io
    • apt install docker-compose
    • apt upgrade docker.io
    • mkdir /root/data/docker_data/<docker_name>
  • Docker-Compose (Using Ubuntu OS for the commands)
    • Docker-compose down
    • Optional command : use following command to backup your Docker data. You might need to change your folder name based on your docker configuraiton
      • cp -r /root/data/docker_data/<docker_name> /root/data/docker_data_backup/<docker_name>
    • docker-compose pull
    • docker-compose up -d
    • docker image prune
  • Portainer (Optional)
    • docker volume create portainer_data
    • docker run -d -p 9000:9000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest
  • Install some applications: apt install wget curl sudo vim git (Optional)
  • aapanel with Nginx (Optional)
  • Nginx Proxy Manager (Optional)
  • Install screen (Optional)
    • Install screen (Depends on the Linux Distribution if it came pre installed or not) : yum install screen
    • Initiate a Screen : screen or  screen -S <screen name> <command to execute>
    • Detach from the screen : "CTRL+A,D" not "CTRL+A+D"
    • List all the screen currently working : screen -ls
    • Reattach to a screen : screen  -r  <session number> or screen -r <screen name>
    • Kill specific screen: screen -X -S <screen name> quit
    • Kill all screens : pkill screen

Monitoring Usage

  • Docker stats

Remove Docker and Related folders

  • docker stop <Docker Name> # stop the docker but not remove anything. 
  • docker rm -f <Docker Name>  # remove speficic container, but will not delete mapped volumes
  • rm -rf /root/data/docker_data/<Docker Mapped Volumns>  # remove all mapped volumes

Restrick Journal Log File Size:

  • journalctl --vacuum-size=100M
  • Limit it to 25M:
nano /etc/systemd/journald.conf
SystemMaxUse=25M
systemctl restart systemd-journald.service


or 
sudo bash -c 'echo "SystemMaxUse=100M" >> /etc/systemd/journald.conf'
sudo systemctl restart systemd-journald



Enable IPv6 and Limit Log File Size (Ubuntu)

Special command to cleans all logs and you don't need to stop the containers.

  • sudo sh -c 'truncate -s 0 /var/lib/docker/containers/*/*-json.log'
Add customized self defined IPv6 address segment to enable container's IPv6 fucntion. And limit log file's size and numbers in case log file to fill all hard drive's space. 

cat > /etc/docker/daemon.json << EOF
{
    "log-driver": "json-file",
    "log-opts": {
        "max-size": "20m",
        "max-file": "3"
    },
    "ipv6": true,
    "fixed-cidr-v6": "fd00:dead:beef:c0::/80",
    "eixperimental":true,
    "ip6tables":true
}
EOF

Restart Docker service:

systemctl restart docker

Limit number of log files:

cat /etc/logrotate.d/rsyslog
/var/log/syslog
/var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
/var/log/daemon.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/lpr.log
/var/log/cron.log
/var/log/debug
/var/log/messages
{
    rotate 4
    weekly
    missingok
    notifempty
    compress
    delaycompress
    sharedscripts
    postrotate
        /usr/lib/rsyslog/rsyslog-rotate
    endscript
}

You can change 4 to some other value, such as 1, so that only one file is stored.



Videos

 



No comments:

Post a Comment