Buy Me a Coffee

[LDAP] How to set up local Open LDAP service

This post will show how to host a OpenLDAP service on the localhost step by step. 1. Prerequisites docker-compose installed. 2. Prepare LDAP data We will create some data for LDAP service and populate it when the service runs up. Create a directory, for example openldap, first, and create another sub-directory openldap/data. The structure of the LDAP data can be described by .ldif file. So we can create below file openldap/data/bootstrap.ldif as the LDAP boostrap data. ...

[cfssl] How to generate the custom TLS certificate in 2 mins

Nov 2025 Update ⚡ Generate instantly: OneClickTLS.com - create self-signed TLS/mTLS certificates in seconds, directly in your browser. No uploads, no storage, and no setup needed - just instant generation. If it saves you time, you can ☕ Buy me a coffee to support future tools like this. I originally wrote this post a couple of years ago to document my workflow for creating self-signed certificates. Since then, I’ve built a small online tool called OneClickTLS that lets you generate TLS and mTLS certificates instantly in your browser. Just enter your Common Name (CN) and Subject Alternative Names (SANs), and it will give you ready-to-use certificate and key files. ...

Docker Handbook (🚧Continuous Update)

1. Install docker and docker-compose on Ubuntu sudo apt-get update sudo apt install docker.io sudo apt install docker-compose 2. Configure rootless user to run docker sudo groupadd docker sudo usermod -aG docker $USER # Linux user can run below to activate the changes newgrp docker docker ps https://docs.docker.com/engine/install/linux-postinstall/ 3. List and delete images docker images docker iamge ls docker rmi <image_id_1> <image_id_2> 4. Check if the specific docker image exists IMAGE_ID=$(docker images | grep 'portainer/base' | awk '{ print $3 }') if [[ -n ${IMAGE_ID} ]]; then docker rm -f ${IMAGE_ID}; fi 5. Login remote registry # Default is dockerhub. username is docker hub id docker login # Login the specific registry docker login registry.private.com 6. Build image from Dockerfile docker build -t <user>/<repo>:<tag> -f Dockerfile . 7. Push the local image to remote registry docker image push <user>/<repo>:<tag> # Push to the private registry docker push registry.private.com/<repo>:<tag> 8. Add and view the docker volume # add volume docker volume create <volume_name> # view volume docker volume ls sudo ls /var/lib/docker/volumes 9. Check the volume detail docker volume inspect <volume_name> 10. Test docker container service connection with curl ping the http service ...

Linux Handbook (🚧Continuous Update)

1. Set up permanent alias alais boltbrowser="bb" source .bashrc 2. Mount the external drive permanently See other posts: How to mount the external hard drive permanently External hard drive is read-only 3. Check which process owns the specific port sudo netstat -tulpn sudo netstat -tulpn | grep 80 # or sudo ss -tulpn sudo ss -tulpn | grep 80 # or sudo ps aux sudo ps aux | grep 80 4. Open an url in web browser from Terminal xdg-open https://google.com 5. Delete the installed package with apt # Check the apt installed history gtrep " install " /var/log/apt/history.log # Only remove the package but keep the configuration sudo apt remove <package_name> # Remove both package and configuration sudo apt purge <package_name> 6. List all the block devices lsblk -f Output is like ...

[VSCode] module lookup disabled by GOPROXY

Sometimes when I open the Golang project with VSCode, some import packages are highlighted with error underline and the error message is like below error while importing github.com/jpillora/chisel/client: module lookup disabled by GOPROXY=off If you are sure that the packages are downloaded already, reloading the VSCode window should solve the issue.

[Golang] Code snippets - Semver comparison

To make the project backward-compatible, a common util function for comparing the semantic version is indispensable. Here is a Golang solution implemented by leveraging go-semver package. package utils import "github.com/coreos/go-semver/semver" // CompareSemanticVersion compares two string written in semver format // return 0 indicates that the first version equals to the second version // return 1 indicates that the first version is greater than the second version // return -1 indicates that the first version is less than the second version func CompareSemanticVersion(current, last string) int { if current == last { return 0 } currentVersion := semver.New(current) lastVersion := semver.New(last) if currentVersion.LessThan(*lastVersion) { return -1 } return 1 } The unit test: ...

[Windows] Enable Windows default SSH server

This topic is already well documented by mircosoft docs. You can find it from Get started with OpenSSH. Here I just want to give two tips for accelerating the setup. There are two ways to activate the open ssh server on Windows: from Windows Settings or PowerShell. Personally, I would recommend to use the PowerShell. Open the PowerShell as an Administrator. Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*' # Install server Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0 # Start the sshd service Start-Service sshd # OPTIONAL but recommended: Set-Service -Name sshd -StartupType 'Automatic' # Confirm the Firewall rule is configured. It should be created automatically by setup. Run the following to verify if (!(Get-NetFirewallRule -Name "OpenSSH-Server-In-TCP" -ErrorAction SilentlyContinue | Select-Object Name, Enabled)) { Write-Output "Firewall Rule 'OpenSSH-Server-In-TCP' does not exist, creating it..." New-NetFirewallRule -Name 'OpenSSH-Server-In-TCP' -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22 } else { Write-Output "Firewall rule 'OpenSSH-Server-In-TCP' has been created and exists." } When you try to connect the OpenSSH server, you’ll need to use ssh username@servername. The servername is your device’s IP address. For example, 192.168.1.5. The username may confuse you. But you can find it by typing whoami in PowerShell or Command. It may look like laptop-nbgksu9c\user. In the ~/.ssh/config file, you can configure it like ...

[Yarn] Unable to connect to github.com

Today when I cloned a new project and ran yarn install, the below error popped up. yarn install v1.22.17 [1/4] Resolving packages... [2/4] Fetching packages... error Command failed. Exit code: 128 Command: git Arguments: ls-remote --tags --heads git://github.com/WearyMonkey/ngtemplate-loader.git Directory: /home/xxx/source/github.com/xxx/xxx/app Output: fatal: unable to connect to github.com: github.com[0: 220.28.17.148]: errno=Connection timed out The solution is to execute the below command under the cloned git repository. git config --global url."https://".insteadOf git://

[Golang] Write a simple CLI program

I will show a simple example in this post. Let’s say the program called cli-example. package main import ( "flag" "fmt" "os" ) func main() { command := os.Args[1] os.Args = append(os.Args[:1], os.Args[2:]...) switch command { case "version": fmt.Println("1.1.1") } } The 1st argument will always be the binary name, so the command starts from the 2nd argument. If your app also needs the subcommand, then extract it from the 3rd argument, like docker image ls. ...

[Golang] Create Dockerfile for golang app

Containerizing the application is very popular nowadays and it makes the deployment so easy. This post will show how to create a Dockerfile for golang application. There are basically two steps in the Dockerfile: Build the golang program source code Containerize the golang app binary # Build source code FROM golang:1.18-alpine AS build WORKDIR /go/src/github.com/app COPY . . RUN go mod tidy RUN CGO_ENABLED=0 GOOS=linux go build -a -o main . # Containerize the binary FROM alpine COPY --from=build /go/src/github.com/app/main . EXPOSE 3500 CMD ["/main"] Exporting the port 3500 is because golang app listens to 3500. Here is just an example. ...

DigitalOcean Referral Badge
Sign up to get $200, 60-day account credit !