Skip to content

GhostBin is a lightweight, high-performance pastebin built with Go and Redis. Designed with simplicity and speed in mind, GhostBin offers a fast and efficient platform for sharing text snippets effortlessly.

License

Notifications You must be signed in to change notification settings

0x30c4/GhostBin

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

29 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

GhostBin

Test

GhostBin is a lightweight, high-performance pastebin built with Go and Redis. Designed with simplicity and speed in mind, GhostBin offers a fast and efficient platform for sharing text snippets effortlessly.

[email protected]

Why GhostBin?

I built GhostBin because I used to rely on ix.io, a similar service that provided a simple and efficient way to share text snippets and command outputs. However, ix.io has been down for a long time, leaving a gap for developers who needed a reliable, lightweight pastebin service.

Rather than waiting for ix.io to return or settling for bloated alternatives, I decided to build my own solution. GhostBin fills that void by providing:

  • Simplicity: Clean, minimal interface focused on functionality
  • Performance: Built with Go and Redis for speed and efficiency
  • Reliability: Self-hostable, so you're never dependent on external services
  • CLI-Friendly: Perfect for piping command outputs and automating workflows
  • Privacy-Focused: Control your own data by hosting your own instance

GhostBin brings back the simplicity and reliability that made ix.io so beloved by the developer community.



Table of Contents

How To Use GhostBin

Command Line Client

You can use this script to upload your pastes easily. gbin.sh

Usage: gbin.sh [-f filename] [-e expire_seconds] [-r max_reads] [-d deepurl_length] [-s secret]
  -f: The filename to upload. Use '-' to pipe output of a command.
  -e: Expire time in seconds (default: no expiration).
  -r: Maximum number of reads (default: unlimited).
  -d: Length of the URL (default: random URL length).
  -s: Secret for deletion (default: none).
#!/bin/bash

# Usage: ./ghostbin.sh [-f filename] [-e expire_seconds] [-r max_reads] [-d deepurl_length] [-s secret]

# Default values
EXPIRE="18446744073709551615"  # No expiration by default
READS="0"                      # No read limit by default
DEEPURL="0"                    # Default URL length
SECRET=""                      # No secret by default
FILENAME="-"                   # Default to pipe input

# Function to display usage
usage() {
  echo "Usage: $0 [-f filename] [-e expire_seconds] [-r max_reads] [-d deepurl_length] [-s secret]"
  echo "  -f: The filename to upload. Use '-' to pipe output of a command."
  echo "  -e: Expire time in seconds (default: no expiration)."
  echo "  -r: Maximum number of reads (default: unlimited)."
  echo "  -d: Length of the URL (default: random URL length)."
  echo "  -s: Secret for deletion (default: none)."
  exit 1
}

# Parse command-line arguments
while getopts "f:e:r:d:s:" opt; do
  case ${opt} in
    f ) FILENAME=$OPTARG ;;
    e ) EXPIRE=$OPTARG ;;
    r ) READS=$OPTARG ;;
    d ) DEEPURL=$OPTARG ;;
    s ) SECRET=$OPTARG ;;
    * ) usage ;;
  esac
done

# Check if filename is provided or input is piped
if [ -z "$FILENAME" ] && [ -t 0 ]; then
  usage
fi

# Build the curl command
CURL_CMD="curl -F \"f=@${FILENAME}\""
[ "$EXPIRE" != "18446744073709551615" ] && CURL_CMD+=" -F \"expire=${EXPIRE}\""
[ "$READS" != "0" ] && CURL_CMD+=" -F \"read=${READS}\""
[ "$DEEPURL" != "0" ] && CURL_CMD+=" -F \"deepurl=${DEEPURL}\""
[ -n "$SECRET" ] && CURL_CMD+=" -F \"secret=${SECRET}\""

# Append the GhostBin URL
CURL_CMD+=" gbin.me"

# Execute the curl command
if [ "$FILENAME" == "-" ]; then
  # Handle piped input
  cat | eval $CURL_CMD
else
  # Handle file input
  eval $CURL_CMD
fi

Basic Usage

# Upload a file
$ curl -F "[email protected]" gbin.me

Pipe Output of a Command

# Pipe output of a command
$ cat file | curl -F "f=@-" gbin.me
$ find /var/log/nginx -name "*.log" | curl -F "f=@-" gbin.me

Burn and Expire

# Paste will expire after 69 seconds
$ curl -F "[email protected]" -F "expire=69" gbin.me

# Paste will expire after 3 reads
$ curl -F "[email protected]" -F "read=3" gbin.me

# Set a custom URL length
$ curl -F "[email protected]" -F "deepurl=3" gbin.me

Secure Deletion

# Set a secret for deletion
$ curl -F "[email protected]" -F "secret=password" gbin.me

# Delete paste using secret
$ curl -XDELETE -F "secret=password" gbin.me/pasteid

Example

# Create a paste with specific settings
$ curl -F "[email protected]" -F "deepurl=12" -F "expire=69" -F "read=1" gbin.me

For more details and advanced usage, please refer to the documentation.

Deployment

Want to run a server like this? clone it! Remember centralization is bad.

Built With.

  • Docker - Platform and Software Deployment
  • Go - Backend Frame-work.
  • Redis - DataStore DataStore

Prerequisites.

Make sure you have git, make and Docker installed.

Docker Compose

GhostBin can be easily deployed using Docker Compose. Follow these steps to deploy GhostBin:

  1. Clone Repository: Clone the GhostBin repository to your server.

  2. Configuration: Duplicate the env-example file and rename it as .env.dev for local development or .env.prod for the production environment. Customize the contents of these files according to your requirements.

  3. Build Commands:

    Build the Docker images for GhostBin using the provided Makefile commands:

    # Build production Docker image
    make build
    
    # Build development Docker image  
    make build-dev
    
    # Build production Docker image (alias)
    make build-prod
  4. Development Environment:

    Start the development environment with hot reload:

    # Start development environment
    make up-dev
    
    # Start development environment in background
    make up-dev-detached
    
    # Stop development environment
    make down-dev
    
    # Restart development environment
    make restart-dev
    
    # Access development container shell
    make exec-dev
  5. Production Environment:

    Deploy the production environment:

    # Start production environment
    make up-prod
    
    # Stop production environment
    make down-prod
    
    # Restart production environment
    make restart-prod
    
    # Access production container shell
    make exec-prod
  6. Logging Commands:

    Monitor your application with comprehensive logging commands:

    # View production logs
    make logs
    
    # Follow production logs in real-time
    make logs-tail
    
    # View development logs
    make logs-dev
    
    # Follow development logs in real-time
    make logs-dev-tail
  7. Utility Commands:

    # Clean Docker system and volumes
    make clean
    
    # Clean all Docker data
    make clean-all
    
    # Run Go tests
    make backend-test
    
    # Generate test coverage SVG
    make gen-test-cover-svg
    
    # Show all available commands
    make help
  8. Quick Start:

    For development:

    git clone https://github.com/0x30c4/GhostBin.git
    cd GhostBin
    cp env-example .env.dev
    make up-dev

    For production:

    git clone https://github.com/0x30c4/GhostBin.git
    cd GhostBin
    cp env-example .env.prod
    # Edit .env.prod with your production settings
    make up-prod

Test

I am presently working on writing the unit tests. 🫠

Current Test Coverage

TODO

  • Write test for handlers
  • Write file delete daemon

Contributing

Contributions to GhostBin are welcome! If you find any issues or have suggestions for improvements, please feel free to open an issue or submit a pull request on our GitHub repository.

License

GhostBin is licensed under the BSD 3-Clause License.

Contribution

Pull requests are welcome.

For major changes, please open an issue first to discuss what you would like to change.

Donate

You can support this project via Liberapay. The monthly hosting cost is right now 12 Dollar.

Monero wallet address: 83BDAy6tN99PVud2sUnjyoMzsUDdXJCoMjjwJ59cVwPF91RccxLWCVsfD9imMqxUaMhMG1brzuVBeAM4KREUSf9U9efbKx1

About

GhostBin is a lightweight, high-performance pastebin built with Go and Redis. Designed with simplicity and speed in mind, GhostBin offers a fast and efficient platform for sharing text snippets effortlessly.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •