r/tutorials • u/rubinakhan45 • Nov 16 '11
r/tutorials • u/rubinakhan45 • Nov 20 '11
Wordpress Themes Tutorials: Most Wanted Wordpress Best Tutorials
r/tutorials • u/[deleted] • Sep 05 '22
Installing a headless Debian (Linux) server for file storage and other cool stuff [Text]
How do you install a Debian server with network accessible file storage and web-based management interface?

You’ll need to install Debian first, of course, which you can get on Debian’s official website.
I use a minimal installer, which will download the rest of the installation files - meaning you’ll need an active internet connection. If this installer complains about “missing drivers”, you can install the "non-free firmware" version. If you don’t have a connection yet, you can download the CD-ROM or DVD. With Rufus, you can easily turn this into a bootable USB.
Debian will first ask you to select your region, time zone and keyboard layout.
More countries can be found under “other”:

Then, you can pick your host name, set the root password, and the user(s) and their password(s).
A bit more important are the settings for partitioning. If you don’t know what to do, choose "Guided - use entire disk" and, 2 screens later, "All files in one partition (recommended for new users)". Whatever you do now can be modified later on anyway.

After that, "Finish partitioning and write changes to disk":

And say "Yes" one last time:

After this, the installer will download and install the required components. Sit back and relax. You’ll be asked which repository you want to use; I’d advise one in your country, because those are often faster. If necessary, we can see which mirror is fastest for you, using the program "apt-netselect".
After this, you can choose which components you want to install. Definitely tick "SSH server" and "standard system utilities". We won’t be using a desktop environment, nor a window manager, because we’ll install Webmin to manage our server via a very nice web interface.

Okay, so Debian’s installed and booted up. But this is on a server, perhaps not physically close to you, and I promised a shiny, easy web interface, so what’s up?
PuTTY is what’s up. With PuTTY, you can connect to your server via SSH (Secure SHell). All PuTTY needs to know is your server’s IP address.
I’m connecting to my server on IP address 192.168.1.19 (192.168.x.x is a very common prefix for home networks). Accept PuTTY's warning and enter the username you also entered during the installation + that user’s password. Pay attention, because you won’t see anything when you type the password - not even the usual stars or asterisks.
When you’ve logged in, we can get this puppy ready for work.
We’ll start with very basic security. Debian (and many other distros distros) use sudo (= super user do) for administrative tasks (for which regular user accounts have insufficient access rights), but sudo isn’t the safest in the world, so we’ll install doas, a forked program from OpenBSD. Because you will need those admin rights for this, type su - and enter the root password. This will switch you to the root (admin) account.
Type the following in your console:
apt update(see if any currently installed programs have any updates).If this command returns results, then also type
apt upgrade(to download and install those updates).After that:
apt install git curl wget apt-transport-https dirmngr build-essential make bison flex libpam0g-dev(programs required for future steps).Now, let’s replace “sudo” with “doas”. Type
git clone https://github.com/slicer69/doas.git
to download doas from Github.Then we change directories (“cd”) to the just-downloaded doas folder with
cd doas. The typemake
(to make the installation files) andmake install(to install doas).After that, we just have to configure doas a little bit:
nano /usr/local/etc/doas.conf(nano is a text editor).
In this file, type permit john as root (my name is just an example here). Then, press Ctrl+X (close) and then "y" + Enter (confirm to save and close). Last but not least, type su john ("su" meaning "switch user") and doas apt update to check if doas was correctly installed and configured. If it was, then apt (Advanced Packaging Tool) will do its thang. Don’t forget to start with "doas", because apt-commands need admin rights - which we just assigned to you with “permit <user> as root”, remember?
Great; we have doas. Now, let’s install some interesting stuff.
Debian’s standard software repositories (colloquially called “repos”) won’t cut it, so let’s add some.
Start with
doas nano /etc/apt/sources.list, which makes the text editor nano open your sources.list. Mine looks like this:

Whatever starts with a “#” is ignored. Lines which start with "deb-src" (so-called "binaries") aren’t really necessary but will slow apt down when you update, so I disabled those. Of course, I know what I’m doing and if I’ll know when I do need them, and enable them in those cases.
In your sources.list, press
Ctrl + 6(select text) (the 6-key under the F-keys; not the numpad 6), go all the way down with the arrow key and pressCtrl + k(delete text). This is quicker and simpler than deleting everything character by character.You’re still in PuTTY - open your browser and go to the Debian sources.list generator.
Here, untick "Use deb.debian.org" and choose your country and release (which is "Stable (Buster)" in the case of this tutorial).
Almost at the bottom of the page, tick “Webmin” and click "Generate".
The next page will tell you that you need to install a few things, but you already did (if you followed this tutorial). Select the entire text of the sources.list (not the GPG keys below it) and paste it into your sources.list in your terminal by simply right-clicking in PuTTY. Close and save with Ctrl+X and “Y”+Enter.
Now the last step here: copy the entire line under “GPG keys” (Gnu Privacy Guard), right-click in PuTTY to paste and press Enter:
wget http``://www.webmin.com/jcameron-key.asc&& apt-key add jcameron-key.asc éé rm jcameron-key.asc("wget" downloads, then the url, ".asc" is a common extension for these keys, "&&" means “execute the next command after (and only if) the previous command has been successsfully executed”, "apt-key add" adds the key to apt's database, "rm" means "remove")Type
doas apt updateagain and thendoas apt install webmin
Apt will do its thang and install Webmin.
After that, surf to https://ip-address-of-your-server:10000 (so not http://) and this is what you’ll see:

Log in as root with the name “root” and the password you entered for that account).
You’ll land on this page:

Go to System -> Users and Groups (blue menu bar) and click on your personal user account (not the root account). Scroll down to "Group Membership" and look for "sudo" in the left box. Click it to add yourself to that group.

Click "Save" and Guillermo’s your uncle.
Then, click on "Un-used Modules":

Scroll down and click on "Samba Windows File Sharing" and install it.
When that’s done, click on "Refresh Modules" and you’ll find Samba back under “Servers”.
Click it and:

As you can see, I already have 4 shares: "Home", "Business", "Plex" and "ISOs".
But what if you can’t share anything with Samba because you haven’t mounted your disks yet?
Back to PuTTY!
The command lsblk shows all currently connected disks:

I use LVM (Logical Volume Manager).
LVM’s structure is as follows: Physical Disks are grouped together in Volume Groups. In my example, there are 3 disks ("sda", "sdb" en "sdc" in the Volume Group "StorageOldBeast".
"StorageOldBeast", in turn, is divided into 2 Logical Volumes (kinda like disk partitions): "Storage" and "OSBackups".
The Volume Group "StorageOldBeast" "spans" 3 actual disks, but your PC sees it and treats it as 1 disk. If I’m low on storage space, I can simply hook up another disk, add it to this Volume Group and assign the new space to one or several Logical Volumes.
Simple partitions don’t offer this functionality, so let’s go with LVM, shall we? Let’s pretend I still have to make mine:
lsblk(list block devices) in PuTTY, to see which disks I have.If, for some unholy reason, you do want to partition, you can do so with the command
doas/sbin/fdisk /dev/sda(fdisk can modify and partition disks), then n ("n" = new partition) and then Enter to the end (type of file system, partition number start sector, end sector, etc. This will make 1 partition which you can also use for LVM. You can also enter "size" as+10Gto create a 10GB partition 10GiB). Repeat as necessary.Let’s assume you were smart enough to NOT partition, though. We’ll now create Physical Volumes which we can then add to Volume Groups:
doas pvcreate /dev/sda(sda is just an example: uselsblkto see the actual name of your disks).
Withdoas pvcreate /dev/sdayou’ll use the entire un-partitioned disk, withdoas pvcreate /dev/sda1you’ll use partition 1 if you went that route. To create several PVs, "simply" (lol) type something likepvcreate /dev/sda /dev/sdb /dev/sdc.After that, "vgcreate" creates a Volume Group to which we’ll attach those PVs:
doas vgcreate VG-1 /dev/sda /dev/sdb /dev/sdcmakes the new Volume Group "VG-1" and adds the disks sda, sdb and sdc to it.
If <sda = 100GB>, <sdb = 200GB> and <sdc = 300GB> then they’ll for a Volume Group of 600GB, which can be divided in any number of Logical Volumes of any size of a combined total of 600GB. The commanddoas vgdisplaydisplays information about your newly created Volume Group:

So I have the VG "StorageOldBeast" with 2 LVs ("Storage" and "OSBackups") and the VG “StorageOldBeast” consist of 3 PVs.
Now, we’ll create the Logical Volumes: doas lvcreate -L 300G -i3 -I64 -n OSBackups StorageOldBeast
An explanation of this compound command:
doas = do as root
lvcreate = create Logical Volume
-L = size (300GB)
-i3 = number of “stripes”, meaning: to how many disks your data is written. This increases read/write-speeds, because reading from/writing to multiple disks at once is faster. I have sda, sdb and sdc in my VG, so the LV "OSBackups" can “stripe” to 3 disks.
-I64 = the size of the data blocks written to individual stripes, in kB (so 64kB in this example)
-n = name; here: "OSBackups".
And then, unceremoniously, the name of the VG ("StorageOldBeast") in which the LV "OSBackups" will be created.
I would then repeat this process for my LV "Storage":
doas lvcreate -l 100%FREE -i3 -I64 -n Storage StorageOldBeast- here, I used-l 100%FREE(small “l” for "lima", not a capital i) to assign 100% of the remaining space to this LV.
Okay, let’s continue. Debian’s "root directory" is /. Just "/", nothing more. In here, all users have their personal folders under /home - mine being /home/john.
In there, I have the directories Plex (for the LV "Storage") and Shared (for the LV "OSBackups" - so the full paths to those 2 directories are /home/john/Plex and /home/john/Shared).
Now, I want to mount my shiney new LV to those directories, but then those directories do have to exist, of course. We’ll create them with mkdir /home/john/{Plex,Shared}.
mkdir /home/john/Plex only creates the directory "Plex". Doas isn’t necessary because this is my personal home directory, so I have rwx (read, write, execute) rights.
I’ll mount those LVs with:
doas mount /dev/mapper/StorageOldBeast-Storage /home/john/Plex
mounts the LV "Storage" (contained by the VG "StorageOldBeast") to the directory /home/john/Plex
doas mount /dev/mapper/StorageOldBeast-OSBackups /home/john/Shared
Whatever I put in those directories now, will be placed on those LVs ("Storage" and "OSBackups"), which are both inside a VG ("StorageOldBeast"), and that VG consolidates disks sda, sdb and sdc. Still with me? I used the notation "/dev/mapper/and-the-rest" (instead of "/dev/sda/and-the-rest") because LVs and VGs are managed by the mapper.
This mounts these two LVs, but they won’t be mounted after a restart unless we change that: doas nano /etc/fstab (File System Tab):

fstab tells your computer where to mount which disks. I added the last 2 entries: the installer created the other ones when I installed. Use <Tab> (not space) in between elements.
So:
/dev/mapper/NameVolumeGroup-NameLogicalVolume
<Tab>
the desired directory to mount it in
<Tab>
the file system of this disk (which is ext4)
<Tab>
options (set this to "default")
<Tab>
the "dump" (which should be set to “0”)
<Tab>
the "pass number" (which should be set to "2").
Close as usual: Ctrl+X, “Y”+Enter.
Important: ANY AND ALL configuration files MUST have an empty line at the bottom!
After this, these LVs will be mounted after reboots. Now, let’s do some Samba sharing via Webmin:

My share "Plex":

"Share name" can be set to whatever you want. The "Directory to share" is the actual directory you’ll share. Click on the foldeer icon to navigate and select it, or just type in in the text field. Set "Browseable" to "yes". Save and go to "File Permissions" and set these two to 0755:

0755 means that anyone can read and execute, but only the owner (which is you) can also add/delete files.
In Samba’s main screen, go to "Convert users" to convert the Debian-user "john" to an authorised Samba-user:

Click on "Convert Users" (and don’t change any settings).
Windows file explorer now shows my 4 shares:

When you access a share, you’ll be asked for your Debian password. If yours isn’t accepted, then set it to whatever you like in Webmin, via Samba -> Samba Users -> <your User Name>.
Have fun!
r/tutorials • u/zaiquia • Mar 11 '26
[Text] How to Use Kakobuy (Beginner Guide) — Ordering From Weidian & Taobao
🧭 How to Use Kakobuy (Beginner Guide) — Ordering From Weidian & Taobao
A lot of people keep asking how Kakobuy works, so here’s a simple breakdown of the full process for beginners.
If you've never used a shopping agent before, the system can seem confusing at first — but once you understand the steps, it’s actually very straightforward.
This guide explains:
• What Kakobuy is
• How ordering works
• Where people find products
• Shipping tips
• Common beginner mistakes
🛒 What Kakobuy Is
Kakobuy is a shopping agent.
It allows you to purchase items from Chinese marketplaces such as:
• Weidian
• Taobao
• 1688
These platforms normally do not ship internationally, so Kakobuy acts as the middleman.
Instead of buying directly from the seller, Kakobuy:
Purchases the item for you
Receives it at their warehouse
Provides QC photos
Ships the parcel internationally
📋 Where People Find Products
The hardest part is usually finding good sellers and products.
Most experienced buyers avoid random TikTok or social media links because those often disappear or get replaced.
Instead, many people browse organized spreadsheets that track reliable sellers.
These spreadsheets usually include:
• Product categories
• Seller links
• QC photos
• Updated listings
⭐ Kakobuy Spreadsheet
Many users browse Kakobuy spreadsheets to quickly find items like:
• Sneakers
• Hoodies
• Jackets
• Bags
• Accessories
Everything is organized so you don’t have to search marketplaces manually.
📦 How Ordering Works
Once you find a product link, the ordering process is simple.
Step 1 — Copy the Product Link
This usually comes from a spreadsheet or product list.
Step 2 — Paste the Link Into Kakobuy
Kakobuy loads the product information including:
• Price
• Size options
• Color selections
Step 3 — Place the Order
You pay for:
• The item
• Domestic shipping to the Kakobuy warehouse
Step 4 — Review QC Photos
When the item arrives at the warehouse, Kakobuy provides QC photos so you can check:
• Product accuracy
• Color / size
• Visible flaws
Step 5 — Ship Your Parcel
After approving QC photos, you select an international shipping method and send the package to your country.
🚚 Shipping Tips
Shipping is usually the most expensive part of the process.
Helpful tips:
• Combine multiple items into one parcel
• Avoid unnecessary packaging
• Use recommended shipping lines
• Declare realistic parcel values
Planning shipments properly can save money.
⚠️ Common Beginner Mistakes
New users often run into the same issues:
• Ordering large hauls on the first purchase
• Ignoring QC photos
• Using outdated links
• Declaring unrealistic values
• Rushing the shipping process
Starting with a small test order is usually the safest approach.
💬 Final Thoughts
Kakobuy is one of several shopping agents that allow international buyers to access Chinese marketplaces.
When used correctly it provides:
• Access to Weidian and Taobao sellers
• Warehouse consolidation
• QC photo verification
• International shipping options
If you're new, start small, learn the process, and scale up once you're comfortable.
Question for the community:
Do most people here use Kakobuy as their main agent, or just as a backup?
r/tutorials • u/IEpicDestroyer • Jun 10 '18
Looking for opinions on /r/Tutorials future!
Hi everyone!
As I am a new moderator here, as you may not know me, I am /u/IEpicDestroyer and I am trying to do my best to be able to improve this subreddit! I enough helping people and assisting on a subreddit meant to help people with doing certain things is even better!
I am working for a better /r/Tutorials subreddit. I know this subreddit is filled with spam and it will take sometime before I have the time to remove every single spam post but I am moderating the new posts as they come out. I have also recently removed every single post from the fellow spambot that was recently banned. I understand a lot of the spambots tend to like to post here and I'll try my best to keep up with them!
I'm looking for suggestions on how legitimate human visitors would like this subreddit to be shaped. While I have had moderating experience elsewhere, subreddit moderation is something new for me which is why I would like to ask the community. I should be doing things that the community wants anyway, not something only myself would want so I would love to receive any sort of idea you have.
TL;DR: I'm looking for your opinion for the future of this subreddit, it doesn't what matter it is, please just submit them below!
Thanks for your help everyone! Look forward to engaging with the community more often!
r/tutorials • u/[deleted] • Sep 30 '20
[VIDEO] My tutorial on how to draw a realistic eye!
r/tutorials • u/lepczynski_it • Oct 27 '25
[Video] Connect Raspberry Pi to Your PC Using ONLY a USB Cable (No WiFi, No Ethernet!)
r/tutorials • u/[deleted] • Sep 06 '22
Installing Docker and a media stack (Plex, *arrs, download clients, elaborate script) [Text]
A new tutorial, about Docker - and some basic scripting, I guess you could say, in the hopes that it's useful.
Now, I’ve already shown you how to set up a simple headless Debian server, so follow that one first, up to installing Webmin (because Webmin is pretty awesome and although it can’t do everything, there’s a lot it can do).
Docker does require a bit of (directory) planning:
all container images will be put in your /var directory, so that needs to be big enough (I’d recommend at least 20 GB, but mine is 40 GB) (and GB is not the same as GiB, remember?).
I would put all the configuration files for your containers in a separate dir, but that dir doesn’t need to be very big because config files and the databases are tiny (the total size of these apps’ files combined is just around 1 GB). IMO, the most logical dir for that is /opt.
Some containers need to have their PUID / PGID set (user and group IDs). I'm using 1000 and 1001 for those in this example, but you'll need to change those to whatever yours is. If you don't have an appropriate group, you should create one.
My partitioning scheme:

This way, if I do have to reinstall, I only need to reinstall / and /var, and I can keep the other partitions as-is. During installation of Debian, those partitions will also be shown (though not with mount point, so carefully identify them) and I’ll simply leave /opt (and possibly /home and /tmp, too) untouched - in that case, just select them and mount them to the correct directory without formatting/wiping them (by selecting “do not format” after selecting the partition). This allows me to reinstall and have my system up and running again in a matter of minutes.
Anywho…
Now that you have your headless Debian server running, and you’ve installed doas and Webmin, we’ll get things rolling by installing:
Docker (containerization)
docker-compose (configuring and starting Docker containers) and
Portainer (for container management)
After we’ve installed those, I’ll add the following containers:
Bazarr (these are collectively called the *arr’s, see Servarr)
Webmin
Pihole (a network-wide adblocker) (number 13 in the screenshot)
As you can see, I have them installed on my server:

Last but not least, and not in the top menu, is Muximux, which is the server dashboard you see above. You also have Heimdall, Organizr and a few others, but I like Muximux.
Have a look at my containers (the screenshot is from Portainer (in Muximux)):

As you can see, Portainer - the container manager - is a container itself.
I also have Watchtower installed, which I’ve configured to automatically look for updates every 2 days.
Let me preface this by saying I’ll install from repositories as much as possible, as opposed to installing from Github, packages (rpm or deb, for instance) or “convenience scripts.”
Installing Docker
First, we’ll take care of some dependencies with
doas apt-get install ca-certificates curl gnupg lsb-release
and then
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
The second command will:
retrieve (with the command
dpkg --print-architecture) your system’s architecture (“amd64” in my and most other cases) and add (withecho) the linedeb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian bullseye stablefeed (with the pipe command (
|) that string totee, which will create the file docker.list(which doesn’t exist yet, and which will be placed in the directory /etc/apt/sources.list.d, which also doesn’t exist yet)feed (
>) tee’s terminal output to /dev/null so it’s not displayed in the terminal.
tee reads the standard input and writes it to both the standard output and one or more files. The command is named after the T-splitter used in plumbing. It basically breaks the output of a program so that it can be both displayed and saved in a file. It does both the tasks simultaneously: copies the result into the specified files or variables and also display the result.
We’ll use tee because it has the nifty capability to simultaneously create docker.list and write this content to it. Because tee both writes and displays the output but we already know what that output will be, so we’ll discard it by routing that output to /dev/null.
By the way: echo has similar capabilities; you can use > to overwrite the entire contents of a file or >> to add the content at the end of the file - but echo can’t create files or directories.
Right; on with the show. Install Docker with doas apt install docker-ce
This will also install (the necessary) docker-ce-cli (command line interface) and containerd.io.
Installing Docker-compose
Thanks to having added that docker repo in docker.list, this is as simple as just running
doas apt install docker-compose
Done.
Before you continue, add yourself to the docker group (so that you can spin up containers without doas / sudo / root privileges) with doas usermod -a -G docker your_username
-ameans that you’ll be added to that group (without this switch, you’ll be removed from any other group(s) you’re a member of)-Gmeans “add as a secondary group”. Multiple groups can be linked with a comma:doas usermod -aG group1,group2,group3 your_usernameThere's no difference between
-aGand-a -G.
Installing Portainer
We’ll first create the volume on which Portainer will store its database with
docker volume create portainer_data
(for which you don’t need doas, because you’ve added yourself to the docker group in the previous step).
Let’s spin that bad boi up with
docker run -d -p 8000:8000 -p 9443:9443 --name portainer \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce:latest or with
docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest
Those back slashes (“\“) don’t mean anything other than “the command continues on the next line, so look there, too.” I think we can all agree that the first version is easier to read.
-dmeans detached (from the root process)-pis for ports (<host:container>)-vis for mounting host volumes inside the Docker container (again: <host:container>)
So above, we are:
spinning up the Portainer container (either the existing image will be used, or it’s downloaded if not)
linking host ports 8000 and 9443 to container ports 8000 and 9443(you can also link different host ports to the container ports, if you like, as long as you use the same container ports - the container ports never change)
mounting the host’s /var/run/docker.sock to the container’s /var/run/docker.sock(the root directory of Docker, so that Portainer has the necessary access to Docker)
mounting the host’s previously created volume portainer_datato the container’s directory /data
giving the name of the container, which will be downloaded from the Docker repository (docker.io). The container naming format is creator/container_name:version
Installing our “media stack”
I’ve made one single docker-compose.yml file which will download, create and start my *arrs, Transmission, SABnzbd and Plex. Let’s see what that looks like:
---
version: "2.1"
services:
### first we'll install the download clients Transmission and SABnzbd ###
### Transmission (torrents)
### -------------------------------------------------- ###
transmission:
image: http://lscr.io/linuxserver/transmission
container_name: transmission
environment:
- PUID=1000 # User ID for the container
- PGID=1001 # Group ID for the container
- TZ=Europe/Brussels # relevant time zone
- TRANSMISSION_WEB_HOME=/combustion-release/
volumes:
- /opt/Docker_Images/Transmission/config:/config # config file dir
- /home/john/Data/Media/downloads:/downloads # download dir
- /home/john/Shared/Downloads:/watch # watch dir
ports:
- 9091:9091 #port for web UI
- 51413:51413 # TCP port for Transmission to use
- 51413:51413/udp # UDP port for Transmission to use
restart: unless-stopped
### -------------------------------------------------- ###
### SABnzbd (usenet)
sabnzbd:
image: http://lscr.io/linuxserver/sabnzbd
container_name: sabnzbd
environment:
- PUID=1000
- PGID=1001
- TZ=Europe/Brussels
volumes:
- /opt/Docker_Images/SABnzbd/config:/config
- /home/john/Data/Media/downloads:/downloads
- /home/john/Data/Media/downloads/incomplete:/incomplete-downloads
ports:
- 8081:8080 # port for web UI
- 9090:9090 # port SABnzbd uses for downloading
restart: unless-stopped
### ---------------------------------------------------- ###
### then we'll install the indexer (which provides centralized management of our various download sources (i.e. torrent sites and usenet servers)) ###
### Prowlarr
prowlarr:
image: ghcr.io/linuxserver/prowlarr:develop
container_name: prowlarr
environment:
- PUID=1000
- PGID=1001
- TZ=Europe/Brussels
volumes:
- /opt/Docker_Images/Prowlarr/config:/config
ports:
- 9696:9696
restart: unless-stopped
### and then the media managers ###
### Radarr (movies)
radarr:
image: http://lscr.io/linuxserver/radarr
container_name: radarr
environment:
- PUID=1000
- PGID=1001
- TZ=Europe/Brussels
volumes:
- /opt/Docker_Images/Radarr/config:/config
- /home/john/Data/Media/plex/movies:/movies
- /home/john/Data/Media/downloads:/downloads
ports:
- 7878:7878
restart: unless-stopped
### -------------------------------------------------- ###
### Sonarr (series)
sonarr:
image: http://lscr.io/linuxserver/sonarr
container_name: sonarr
environment:
- PUID=1000
- PGID=1001
- TZ=Europe/Brussels
volumes:
- /opt/Docker_Images/Sonarr/config:/config
- /home/john/Data/Media/plex/series:/tv
- /home/john/Data/Media/downloads:/downloads
ports:
- 8989:8989
restart: unless-stopped
### --------------------------------------------------- ###
### Lidarr (music)
lidarr:
image: http://lscr.io/linuxserver/lidarr
container_name: lidarr
environment:
- PUID=1000
- PGID=1001
- TZ=Europe/Brussels
volumes:
- /opt/Docker_Images/Lidarr/config:/config
- /home/john/Data/Media/plex/music:/music
- /home/john/Data/Media/downloads:/downloads
ports:
- 8686:8686
restart: unless-stopped
### --------------------------------------------------- ###
### and Bazarr will fetch subtitles for everyting ###
bazarr:
image: http://lscr.io/linuxserver/bazarr
container_name: bazarr
environment:
- PUID=1000
- PGID=1001
- TZ=Europe/Brussels
volumes:
- /opt/Docker_Images/Bazarr/config:/config
- /home/john/Data/Media/plex/movies:/movies
- /home/john/Data/Media/plex/series:/tv
ports:
- 6767:6767
restart: unless-stopped
### ---------------------------------------------------- ###
### finally Plex Media Server ###
plex:
container_name: plex
image: plexinc/pms-docker
environment:
- TZ=Europe/Brussels
- PUID=1000
- PGID=1001
- ADVERTISE_IP=http://192.168.1.9:32400/
- PLEX_CLAIM=your_claim_key_here
network_mode: host
volumes:
- /home/john/Data/plexdata:/config
- /home/john/Data/Media/plex/transcode:/transcode
- /home/john/Data/Media/plex:/data
restart: unless-stoppedThat looks like a lot, but, after a fresh install of Debian, all it takes is:
cd /opt/Docker_Images(where this docker-compose.yml file is located on my server)docker-compose up -d
That’s it. That single docker-compose command will spin up Transmission, SABnzbd, the *arrs and Plex! And seeing the config files are located on a partition I won’t wipe when reinstalling, all settings of all programs are preserved.
Please note how my containers are set up: they all run as the same user (“1000”) and group (“1001”) so there are no permissions issues. Also note that all apps get pretty granular access to media folders. Radarr, for instance, only gets access to its config files (/opt/Docker_Images/Radarr/config), the download folder (/home/john/Data/Media/downloads) and the series or movies folder (/home/john/Data/Media/plex/series), while Plex get access to all of it (/home/john/Data/Media/plex). Transmission and SABnzbd get even less access (can you find the differences?)
…
That just leaves us with that time-consuming business of also reinstalling all the other stuff when you reinstall Debian but, for that, we can create a script like below, which can be run immediately after your reinstall, when you first start up your fresh headless Debian server, by connecting with PuTTY and running:
cd /home/john
(to change to the directory where I’ve stored install.sh)
and then:
./install.sh
The contents of my install.sh:
(note that # is normally used to comment lines out, but this first one is special and different: “#!” is called a “shebang”)
#!/bin/bash
# -*- ENCODING: UTF-8 -*-
### 1 PREP
### 1.1 Start by updating && upgrading our fresh install
apt update && apt upgrade
### 1.2 then MOUNT my DRIVES BY UUID, because UUIDs always stay the same
mount UUID=9faa6a02-84d1-4235-b878-8fb56f7d2515 /home/john/Shared
mount UUID=99a0b588-585c-45bf-8b04-2674d03ca424 /home/john/Data
### 1.3 and ADD my DRIVES TO FSTAB
echo "#Media storage
UUID=99a0b588-585c-45bf-8b04-2674d03ca424 /home/john/Data ext4 defaults 0 2
#Business storage
UUID=9faa6a02-84d1-4235-b878-8fb56f7d2515 /home/john/Shared ext4 defaults 0 2" >> /etc/fstab
# using ">>" here, so that my entire /etc/fstab isn't overwritten with just these 2 entries (which *would* happen if you used ">")
### <<< -------------------------------------------------------------------------------- >>> ###
### 2 DOAS ###
### 2.1 First, INSTALL DOAS' DEPENDENCIES
apt install -y git curl wget apt-transport-https dirmngr build-essential make bison flex libpam0g-dev
### 2.2 then git clone && cd into the directory && make installation files && install
git clone https://github.com/slicer69/doas.git && cd doas && make && make install
# With "command1 && command2", command2 only executes if command1 has executed. With "command1 ; command2", that doesn't matter.
### 2.3 and then GIVE myself ROOT PRIVILEGES
touch /usr/local/etc/doas.conf && echo "permit john as root" > /usr/local/etc/doas.conf
# "touch" to create the file, "echo" to write contents to it,
# ">" because it's empty anyway (so, in this particular case, ">>" would have the same result)
### <<< -------------------------------------------------------------------------------- >>> ###
### 3 WEBMIN
### 3.1 Create WEBMIN's independent SOURCES.LIST ###
echo "deb https://download.webmin.com/download/repository sarge contrib" | tee /etc/apt/sources.list.d/webmin.list > /dev/null
### 3.2 download (wget), read (cat) the gpg key, pipe (|) it to gpg for processing and ADD (>) WEBMIN's GPG KEY to the subdir /etc/trusted.gpg.d
wget https://download.webmin.com/jcameron-key.asc && cat jcameron-key.asc | gpg --dearmor >/etc/apt/trusted.gpg.d/jcameron-key.gpg
### 3.3 update apt && INSTALL WEBMIN
apt update && apt install -y webmin
# the switch "-y" answers "yes" to apt's possible question (such as "Do you want to install these packages?"
### <<< -------------------------------------------------------------------------------- >>> ###
### 4 SAMBA
### 4.1 Now let's INSTALL SAMBA ###
apt install -y samba
### 4.2 enable the daemon as a system service && stop it so we can edit the config file
systemctl enable samba && systemctl stop samba
### 4.3 ADD SAMBA's CONFIG (backed up)
\cp /opt/smb.conf /etc/samba
# using "\cp" instead of just "cp" will make sure that if that file already exists, it's replaced.
# Without this switch, you could get an error because/if the file already exists.
# Another possibility is to "cat" (read) the config file and output (">") the contents to the existing config file (created during installation)
### 4.4 and start samba again
systemctl start samba
### <<< -------------------------------------------------------------------------------- >>> ###
### 5 DOCKER & COMPOSE & PORTAINER
### 5.1.1 First we'll INSTALL Docker's DEPENDENCIES
apt install ca-certificates gnupg lsb-release
# curl is a dependency for Docker, but was already installed (on line 30)
### 5.1.2 then ADD DOCKER's GPG KEY
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
### 5.1.3 then we'll ADD DOCKER REPO in its own list
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
# this also works for gpg keys, instead of the process on line 55
### 5.2 update apt && install docker-ce (which will also install docker-ce-cli and containerd.io)
apt update && apt install -y docker-ce
### 5.3 INSTALL DOCKER-COMPOSE
apt install docker-compose
### 5.4 add myself to the newly created Docker group, so that the user "john" doesn't have to run Docker with elevated rights
usermod -a -G docker john
### 5.5 Finally INSTALL PORTAINER
### 5.5.1 first we create a volume for Portainer
docker volume create portainer_data
### 5.5.2 and then pull and build Portainer (command with line breaks ("\") for readability)
docker run -d \
-p 8000:8000 \
-p 9443:9443 \
--name portainer \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce:latest
### <<< -------------------------------------------------------------------------------- >>> ###
### 6 INSTALL STACKS located in /opt/Docker-Images/
cd /opt/Docker_Images
docker-compose -f media-stack.yml up -d
docker-compose -f muximux.yml up -d
docker-compose -f cloudflare-ddns.yml up -d
docker-compose -f nginx-proxy-manager.yml up -d
Side note: in the above script, you can also first add yourself to the dockergroup right after you install it, then su to your user:
su username
and then execute the docker commands. This is recommended for security reasons (so that docker containers don’t have root access to anything) but seeing this script is executed as root, you’d either have to su john before every single command, or put all the docker commands in a separate script which the first script can execute (“call”) as your user.
What’s cool is that this single script (which only took about 15 minutes to write) will do everything for me with just 2 commands:
cd /home/john
and then
./install.sh
(and no: cd /home/john isn’t necessary; you can execute the script right away by specifying the file path)
That configures my system, install all the things I want + their dependencies, then installs Docker, docker-compose and Portainer and then all my containers; all of them set up the same way as before the reinstall. I’ll just run this script after a fresh install, go to Muximux’s dashboard and see this again:

Exactly the same as in the beginning of this tutorial, and Radarr, Sonarr, Plex, etc. will all have the same settings (and content) as before.
Easy peasy lemon squeezy!
A little overview of the various commands and switches used here:
&&to chain commands dependently;to chain commands independentlytouchto create filesmkdirto create directoriesmkdir /dir/{dir1,dir2}to create multiple directoriesecho >to overwriteecho >>to appendteeto write to non-existent files (in non-existent (sub)directories)catto read a file’s contents|to pass command1’s output to command2cpto copy\cpto copy and overwrite without interactionwgetto download
r/tutorials • u/RunNGunPhoto • Jul 01 '19
[Video] Lightroom: Editing for Beginners
r/tutorials • u/NijaNur • Feb 12 '26
[Text] Complete Oopbuy Agent Guide (Beginner → Advanced)
🧭 Complete Oopbuy Agent Tutorial (Beginner → Advanced)
If you’re searching for a CNFans alternative with flexible ordering, solid shipping options, and strong spreadsheet compatibility, Oopbuy has quickly become one of the most popular choices in the community.
This guide explains:
✅ What Oopbuy is
✅ How to safely order using it
✅ How spreadsheets and link converters improve success
✅ Shipping tips most beginners miss
✅ Common mistakes to avoid
🛒 What Is Oopbuy?
Oopbuy is a shopping agent that allows international buyers to purchase products from Chinese marketplaces such as:
• Weidian
• Taobao
• 1688
Since these platforms usually don’t ship worldwide, Oopbuy acts as a middleman.
The Process Works Like This:
1️⃣ Copy a product link
2️⃣ Paste it into Oopbuy
3️⃣ Oopbuy purchases the item for you
4️⃣ The item is shipped to their warehouse
5️⃣ You review QC photos
6️⃣ You ship internationally
It works similarly to other agents but is known for flexibility and strong spreadsheet compatibility.
🧠 Why People Are Switching to Oopbuy
Many users now use Oopbuy as either a main agent or backup option.
Common reasons include:
✔ Flexible and competitive shipping options
✔ Fewer marketplace restrictions
✔ Strong compatibility with Weidian & Taobao products
✔ Works extremely well with curated spreadsheets
✔ Reliable backup if another agent becomes unstable
📋 Finding Good Products (The Most Important Step)
Ordering through an agent is actually the easy part.
Finding trusted products determines your success.
Most experienced buyers avoid random social media links and instead use curated spreadsheets because they:
✔ Organize items by category
✔ Include QC photo references
✔ Remove dead or bait-and-switch listings
✔ Stay updated regularly
⭐ Oopbuy Spreadsheet Example
Used for:
• Browsing verified product links
• Comparing sellers
• Finding QC photo examples
• Discovering trending items
📘 Full Spreadsheet Usage Guide
👉 https://oopbuy.gg/guide.html
(Optional but helpful if you’re new.)
🔗 Converting Links for Oopbuy (Strongly Recommended)
Many Weidian, Taobao, Reddit, or spreadsheet links do not always load correctly when pasted directly into Oopbuy.
Using a link converter solves most compatibility problems.
⭐ Oopbuy Link Converter Chrome Extension
👉 https://chromewebstore.google.com/detail/oopbuy-link-converter-plu/hgnnbhgbijnaijljegccnlcahcgenkjn
What It Does
✅ Converts links from Reddit, spreadsheets, social media, and marketplaces
✅ One-click conversion directly into Oopbuy
✅ Prevents “product not found” errors
✅ Saves time when browsing product sources
✅ Works across multiple shopping platforms
Most experienced buyers use converters because manual link editing often causes mistakes.
📦 Step-by-Step Ordering Process
🛍 Step 1 — Copy Product Link
Find an item from a spreadsheet or trusted source.
🔄 Step 2 — Convert or Paste Into Oopbuy
Use the link converter or paste directly into Oopbuy search.
🎨 Step 3 — Select Item Options
Choose:
• Size
• Color
• Quantity
💳 Step 4 — Pay for Item + Domestic Shipping
This covers shipping from seller → Oopbuy warehouse.
📸 Step 5 — Review QC Photos
This confirms quality and accuracy.
⚠️ Never skip QC photos.
🚚 Step 6 — Submit International Shipping
Choose your preferred shipping line and finalize your parcel.
🚚 Shipping Tips Most Beginners Miss
✔ Combine multiple items into one parcel
✔ Avoid oversized packaging
✔ Use recommended shipping lines
✔ Declare realistic parcel values
✔ Be patient — rushing shipments causes mistakes
⚠️ Common Beginner Mistakes
🚫 Skipping QC photos
🚫 Trusting random TikTok or influencer links
🚫 Using outdated spreadsheets
🚫 Forgetting to convert marketplace links
🚫 Declaring unrealistic package values
🚫 Ordering large hauls on first purchase
💬 Final Thoughts
Oopbuy is becoming one of the strongest CNFans alternatives when used correctly.
It offers:
✅ Flexible shipping options
✅ Excellent spreadsheet compatibility
✅ Reliable marketplace support
✅ Useful backup or primary agent
✔ Beginner Advice
Start with a small test haul.
Learn the ordering and shipping process.
Scale up once you’re comfortable.
If you want to explore additional agent resources or compare other shopping agents, community spreadsheets and portals can help simplify the process.
r/tutorials • u/[deleted] • Sep 06 '22
Installing the hypervisor Proxmox and spinning up your first Virtual Machines [Text]
Okay, so you’re ready to play around with virtualization - maybe to try new things, maybe for something specific, maybe you’re just curious.
There are various paid and free virtualization platforms out there but, of course, I won’t look at any paid ones here, in a Debian Space. For Debian, several options exist:
Qemu-kvm: powerful, but CLI only.
Qemu-kvm + Cockpit: user-friendly, but it has very limited functionality.
ESXi by VMWare: free, but also rather limited.
XCP-ng, which, personally, I’m not crazy about.
And the subject of this tutorial: Proxmox; available as either a Debian-based platform or a package installed on top of Debian, using APT (Debian’s Advanced Packaging Tool). I’ll assume that you’re installing the latest version of Proxmox. Put Proxmox on a USB device with Rufus, boot into it, and you’ll see this:

and because you’re new to Proxmox, we’ll choose the first/standard option.
On the next screen you can (optionally) select the disk to install Proxmox on:

(fun detail: screenshots in this tutorial are made while installing Proxmox on Proxmox (which is why my disk is called QEMU HARDDISK))
Select the disk you want to install Proxmox on, and don’t choose your storage disk. On my server, I installed Proxmox on a 146GB SAS disk, while I have a separate 3TB RAID10 drive for storage (1=mirrored, 0=striped). If I need to re-install for some reason, it’s a breeze and I won’t lose any of my VMs (Virtual Machines) or containers. Click on Options to go to the above screen, where you can set a few parameters. Hover on them to see what they do.
Anywhoo… Next will lead to the screen where you select your country, timezone and keyboard layout. On the screen after that you’ll enter your root password and email address. You never enter a user name and password because Proxmox doesn't use those by default (although you can create them if you want). On the screen after that, enter your management interface (Network Interface Card (NIC)), the hostname (FQDN) (which will be [name_you_choose].home, seeing .home is a very common standard domain name). FQDN stands for Fully Qualified Domain Name.
After entering this information, Proxmox will be installed. Once that’s done, Proxmox will restart and tell you that you can reach the web interface via https://ip-address-of-your-server:8006. Pay attention: this is https; not http.
When you log in, you’ll get a “warning” about not having an enterprise subscription. That’s very true, and I certainly understand that the good people at Proxmox also need to make money, but I’m never buying Proxmox Enterprise edition anyway, so I don’t need to keep seeing that warning forever (I did donate, btw).
Seeing Proxmox has Debian under the hood, let’s log in with PuTTY and get rid of that warning, shall we?
Log in with username “root” and your password. Execute cd /usr/share/javascript/proxmox-widget-toolkit (“cd” means “change directory”) and then ls to list the contents of that directory. We’re after the file called proxmoxlib.js, but let’s back that file up (just in case we fudge this up) with cp proxmoxlib.js proxmoxlib.js.bak, which creates the backup file proxmoxlib.js.bak. I bet you can guess what ".bak" indicates. If we do fudge something up, we’ll restore that backup with the same command but with the names the other way around.
Time for Mr. Warning Screen to go bye bye: nano proxmoxlib.js. Scroll down (using the arrow keys) until you see the part in my screenshot, and deactivate it the same way I did: with // at the beginning of every line:

Close with Ctrl+X, confirm with “Y”+Enter and that’s that. The next time you log in, that warning’s gone and you’ll see this:

Top left, you see Datacenter, Node and Pool.
Your Datacenter (server room or building) can contain several Nodes (physical computers). You can group Node resources (CPU power, RAM and storage) in Pools. Those resources will then be reserved for the VMs and containers to which that Pool is assigned. Seeing I have 1 physical server, my Datacenter has 1 Node.
In the middle, we have the Summary, Cluster (to cluster-manage several Datacenters), Ceph (which we won’t use because it’s cluster-related) and a whole lot more - all of which can be configured any time you want, so don’t worry about not doing that now. What we will have to configure, however, is your Storage, because you do have to be able to store those VMs somewhere, right?
Click on Storage and then Add to see the plethora of options Proxmox offers:

Directory creates a directory on the Proxmox install directory.
LVM and LVM-thin allow hooking up an LVM drive (the creaton and configuration of which I covered in my tutorial for installing Debian).
NFS, or Network File System, allows connecting Linux/UNIX directories on your network and requires you install nfs-kernel-server with
doas apt install nfs-kernel-server. NFS is cool, but not Windows compatible, which is why we’ll go with:CIFS (Common Internet File System), which is Windows compatible. NFS is better than CIFS in several regards, but only an option when you don’t need to connect to your shares from Windows machines. Seeing we installed Samba (Windows/Linux file sharing) in the linked tutorial for installing a headless Debian server, we’ll go with CIFS, to stay Windows compatible.
Google the other options if you want to know what they are and do, but I’ll skip them for now.
By the way: the storage locations local and local-lvm are created automatically by Proxmox during installation, but/and can be turned off (which I did, which is why they’re not in the list far left (under Datacenter and Node) in my screenshot).
In any case… click on CIFS to add a network-accessible folder:

As ID, enter whatever you like. For Server, enter the IP address of your remote server, Username and Password should be obvious. After that, you’ll log in automagically by clicking on Share, which shows the following in my case:

Those are my Samba shares! Which one do you think I’ll pick?
With Content, I can tell Proxmox what kind of files it should expect to find, and is allowed to store, in this location. I can choose one option, several or all:

In my case, I think it’s obvious that Proxmox should expect to find ISO images here. After clicking on Add to finalize, I’ll find this storage location back under Storage in the middle menu. FYI: Proxmox automatically created a directory under /mnt/pve/name_you_gave_this_location, to which the network location is mounted:

A little overview:

So I have 1 Node with 9 VMs (100 - 108), 4 Storage locations (which I added via the above method) including my 2 Logical Volumes on my 3TB LVM:

“But John, you said 3TB but this shows 2.73TiB: what’s up with that?"
That’s because there’s TB (terabyte) and TiB (tibibyte). 1 terabyte = 1000 gigabyte, while 1 tibibyte = 1024 gibibyte. Manufacturers advertise with terabytes, but your computer works with tibibytes - that’s why the 1TB drive you bought shows 931GiB on your computer. Sneaky…
Okay: we hooked up our storage to Proxmox, so now we can create a VM. What do you think the button Create VM does?

On the first screen, choose your Node (if you have several), the VM ID (which has to be a number), (freely choose) the Name for this VM and no Resource Pool, because we didn’t make one:

Then choose your ISO.
Please note that if I hadn’t told Proxmox that this storage location (also) contains ISO images (when I added my CIFS storage a little earlier), then Proxmox wouldn’t show them. Proxmox is an obedient bitch in that regard (as software should be).
So these ISO images are actually located on my server “OldBeast” (which you may remember from my other tutorials).
We won’t touch these settings:

Nor these, apart from, perhaps, your Storage location and the Disk size you’ll give to this VM:

The number of virtual processors (vCPUs) assigned to this VM is the number of Sockets x the number of Cores. As (processor) Type, choose host:

Then the RAM (2GiB in this case) and the network (don’t fudge around here: Proxmox automatically configured this for you when you installed).
Here we have a summary of the VM we just set up:

If you tick the box bottom left, the VM will be created and then started. If you don’t tick it, you can manually start the VM whenever you want.
When I create (but not yet start) the VM, it’s added to the far left list, and it has its own Summary:

Note that VM 109 has been made but has not been started (see list (far left) and log (bottom)).
Here, we have Start (to switch the VM on), Shutdown (with several options) and Console. When I Start the VM and then click on Console, this window pops out:

In this window, I can do anything I could also do in front of a physical machine - except pressing Ctrl+Alt+Del, for which we have a little menu on the left:

More hides a few options, one of which is to Remove the VM - for which you first have to Stop it (via Shutdown -> Stop)
Have fun experimenting!
r/tutorials • u/SplitterShot • May 20 '20
[Video] How to animate Stop Motion films - Tutorial
r/tutorials • u/JT_Armstrong • Sep 19 '18
[video] Photoshop & Lightroom Contrast tutorial
r/tutorials • u/Michael_Reeves • Apr 28 '17
[Video]Trying to make Coding Tutorials less Boring
r/tutorials • u/Spiritisabone • Nov 18 '22
[Video] How to code your own AI home assistant
r/tutorials • u/FunkyMonkey1360 • Jul 14 '21
[VIDEO] How to DISAPPEAR on Camera on ZOOM (Going Invisible)
r/tutorials • u/LissiKete • Mar 01 '21
[Video] Relaxing tutorial: How to find ceramic clay in nature and how to prepare it.
r/tutorials • u/NEOF • Jan 03 '21
[video] Hi I am making a tutorial series for people who want to learn game development
r/tutorials • u/Selfish_Philip • Jun 22 '20
[VIDEO] A quick tutorial on how to use the u/VredditDownloader bot (a bot that gives you a downloadable link to videos posted on Reddit. iOS version)
r/tutorials • u/Wells_Fuego • Apr 11 '20
[VIDEO] Create An Awesome Intro Sequence With Your Logo In Less Than An Hour! [Ae + Ai]
r/tutorials • u/psd-dude • Dec 28 '19