Automatically deploy FRP server and client services using Docker via bash script
Automatically deploy FRP server and client services using DockerAutomatically deploy fast reverse proxy server and client services using Docker.pngIt is an easy way to deploy FRP server and client services using Docker, which simplifies the setup process by breaking it down into four parts.Breakdown of contentPart1, Menu Settings function display_menu { echo "Please select a service as you want to deploy:" echo "1. FRP(S) Service" echo "2. FRP(C) Service" echo "0. Exit" }2023-03-21_120127.pngThe script starts with a menu that presents the user with three options to choose from. This menu is essential to guide the user through the rest of the process.Part2, FRP Server service deploy function handle_option_1 { }This part sets up the FRP server service as a function.include the followingif ! command -v docker &> /dev/null then echo "Docker is not installed. Installing Docker now..." curl -O https://kingtam.win/usr/uploads/script/install-docker.sh && chmod +x install-docker.sh && ./install-docker.sh fiIt detects if Docker is installed and if not, installs it.echo "What port would you like to use for the frps service? Press enter to use the default port of 7000, type 'r' to generate a random port, or enter a port number:" read -r port_choice if [[ $port_choice == "r" ]]; then port=$(shuf -i 7001-9000 -n 1) elif [[ -z $port_choice ]]; then port=7000 else port=$port_choice fi echo "What port would you like to use for the HTTP service? Press enter to use the default port of 80, or enter a port number:" read -r http_choice if [[ -z $http_choice ]]; then http=80 else http=$http_choice fi echo "What port would you like to use for the HTTPS service? Press enter to use the default port of 443, or enter a port number:" read -r https_choice if [[ -z $https_choice ]]; then https=443 else https=$https_choice fi echo "Would you like to generate a random token or enter a password for the frps service? Press enter to generate a random token, or enter a password:" read -r token_choice if [[ -z $token_choice ]]; then token=$(openssl rand -hex 16) else token=$token_choice fiThen it prompts the user to create the FRP server service, HTTP, HTTPS, and token.if [ ! -d "./frps/tmp" ]; then mkdir -p "./frps/tmp" else sudo rm -rf "./frps" && mkdir -p "./frps/tmp" fiIt also checks if the folder ./frps/tmp exists and creates it if it doesn't.cat >> "./frps/frps.ini" << EOF [common] bind_addr = 0.0.0.0 bind_port = $port vhost_http_port = $http vhost_https_port = $https dashboard_tls_mode = false enable_prometheus = true log_file = /tmp/frps.log log_level = info log_max_days = 3 disable_log_color = false detailed_errors_to_client = true authentication_method = token authenticate_heartbeats = false authenticate_new_work_conns = false token = $token max_pool_count = 5 max_ports_per_client = 0 tls_only = false EOF cat >> "./frps/docker-compose.yml" << EOF version: '3' services: frps: image: snowdreamtech/frps:latest container_name: frps network_mode: "host" restart: always volumes: - "$PWD/frps/frps.ini:/etc/frp/frps.ini" - "$PWD/frps/tmp:/tmp:rw" EOF docker-compose -f "./frps/docker-compose.yml" up -d sleep 3 sudo cat "./frps/tmp/frps.log" echo -e "\033[1;32mServer IP Address:\033[0m $(curl -s ifconfig.co)" echo -e "\033[1;32mService Port:\033[0m $port" echo -e "\033[1;32mToken:\033[0m $token" echo -e "\033[1;32mHTTP Port:\033[0m $http" echo -e "\033[1;32mHTTPS Port:\033[0m $https"Finally, it creates the FRP server config file, docker-compose.yml file, starts up the docker-compose, and prints the frps.log with information in color.2023-03-21_120218.pngPart3, FRP Client service deploy function handle_option_2 { }This part sets up the FRP client service as a function.include the followingif ! command -v docker &> /dev/null then echo "Docker is not installed. Installing Docker now..." curl -O https://kingtam.win/usr/uploads/script/install-docker.sh && chmod +x install-docker.sh && ./install-docker.sh fiIt also detects if Docker is installed and installs it if it isn't.read -p "Enter the FRP(S) Server ip address or domain: " frpsip read -p "Enter the FRP(S) Service port (press Enter for default **7000** or manual to input a port): " port if [ -z "$port" ] then port=7000 else read -p "Enter the FRP(S) Service port: " port fi read -p "Enter the FRP(S) Service token: " token read -p "Enter the port of FRP(C) admin console (press Enter for default **7400** or manual to input a port): " cport if [ -z "$cport" ] then cport=7400 else read -p "Enter the FRP(C) admin console port: " cport fi read -p "Enter the username of FRP(C) console (press Enter for default **admin** or manual to input a name): " cname if [ -z "$cname" ] then cname=admin else read -p "Enter the username of FRP(C) console: " cname fi echo "Would you like to generate a Random Console Password (Press Enter) or enter a password for the FRP(C) console?" read cpasswd if [[ -z $cpasswd ]]; then ctoken=$(openssl rand -hex 12) else ctoken=$cpasswd fiThen the user is prompted to create the FRP client service, FRP server IP address or domain, port, token, admin address, console, and console token.if [ ! -d "./frpc/tmp" ]; then mkdir -p ./frpc/tmp else sudo rm -rf ./frpc && mkdir -p ./frpc/tmp fiIt also checks if the folder ./frpc/tmp exists and creates it if it doesn't.cat >> frpc/frpc.ini << EOF [common] server_addr = $frpsip server_port = $port token = $token log_file = /tmp/frpc.log log_level = info log_max_days = 3 disable_log_color = false admin_addr = 0.0.0.0 admin_port = $cport admin_user = $cname admin_pwd = $ctoken EOF cat >> frpc/docker-compose.yml << EOF version: '3' services: frpc: image: snowdreamtech/frpc:latest container_name: frpc network_mode: "host" restart: always volumes: - ./frpc.ini:/etc/frp/frpc.ini - ./tmp:/tmp:rw EOF docker-compose -f ./frpc/docker-compose.yml up -d sleep 3 sudo cat ./frpc/tmp/frpc.log echo -e "Please use below information to Login console and setup your FRP(C) services" echo -e "The address of console: \033[1;32mhttp://localhost:$cport\033[0m" echo -e "The username of console: \033[1;32m$cname\033[0m" echo -e "The password of console: \033[1;32m$ctoken\033[0m"Finally, it creates the FRP client config file, docker-compose.yml file, starts up the docker-compose, and prints the frpc.log with information in color.2023-03-21_120312.pngPart4, Use case statement display_menu read -p "Enter your choice [0-2]: " choice case $choice in 1) handle_option_1 ;; 2) handle_option_2 ;; 0) echo "Exiting..." exit 0 ;; *) echo "Invalid choice" ;; esacThe case statement that evaluates the value of $choice and executes the corresponding code block. If the user enters a value that is not one of the three options, the * case matches and an error message is displayed.Use The Script:Save the contents of the script in a file, e.g., frp.sh.Make the script executable with chmod +x frp.sh.Run the script as root or with sudo: sudo ./frp.sh.Also, We can using a single command line in the terminal. (Root Privileges is requires)curl -O https://kingtam.win/usr/uploads/script/frp.sh && chmod +x frp.sh && ./frp.shThis command will download the script from URL, make it executable, and then run it. If any of the commands fail, the subsequent commands will not be executed.Conclusion:This bash script simplifies the deployment of FRP server and client services using Docker. Its four parts guide the user through the setup process, making it easy to create and run the services. By breaking down the process into manageable parts, this script reduces the complexity of the setup process for users.Related:Use Docker to Deploy FRP ServicesLet NPM and FRP share 80/443 ports with Wildcard Domain Name