A modern, Go-based pastebin service inspired by 0x0.st.
- File uploads and URL shortening
- Multiple storage providers (local and S3)
- Simple and clean API
- Docker support
- Configurable through environment variables
- Rate limiting
- Analytics
- OG image support for text pastes
- Go 1.21+
- The desire to live dangerously
# Clone the repository
git clone https://github.com/watzon/0x45.git
cd 0x45
# Install dependencies
go mod download
# Configure settings
vim config/config.yaml
# Start the server (migrations will be run automatically)
go run cmd/server/main.go
Alternatively for speedier local development, you can install the air package and run:
air
Build and run locally:
docker build -v ./uploads:/app/uploads --tag 0x45 ./docker
docker run -d -p 3000:3000 0x45
Or use the pre-built image:
docker pull ghcr.io/watzon/0x45:main
docker run -d -p 3000:3000 ghcr.io/watzon/0x45:main
Configuration is done through the config/config.yaml
file. See the example config for more information on the available options. When running in a docker container it might be more convenient to set the environment variables instead, here is a list of available options:
Controls the database connection settings.
Environment Variable | Description | Default |
---|---|---|
0X_DATABASE_DRIVER | Database driver to use (sqlite/postgres) | sqlite |
0X_DATABASE_HOST | Database host | localhost |
0X_DATABASE_PORT | Database port | 5432 |
0X_DATABASE_USER | Database username | "" |
0X_DATABASE_PASSWORD | Database password | "" |
0X_DATABASE_NAME | Database name | paste69.db |
0X_DATABASE_SSLMODE | SSL mode for postgres | disable |
Configure one or more storage backends for file storage. Multiple backends can be configured using numbered environment variables (0-9).
Environment Variable | Description | Default |
---|---|---|
0X_STORAGE_0_NAME | First storage backend name | local |
0X_STORAGE_0_TYPE | First storage type (local/s3) | local |
0X_STORAGE_0_DEFAULT | First storage is default | true |
0X_STORAGE_0_PATH | First local storage path | ./uploads |
0X_STORAGE_0_S3_BUCKET | First S3 bucket name | "" |
0X_STORAGE_0_S3_REGION | First S3 region | "" |
0X_STORAGE_0_S3_KEY | First S3 access key | "" |
0X_STORAGE_0_S3_SECRET | First S3 secret key | "" |
0X_STORAGE_0_S3_ENDPOINT | First S3 endpoint | "" |
0X_STORAGE_1_NAME | Second storage backend name | "" |
... | (and so on for STORAGE_1 through STORAGE_9) |
Core server settings and behavior.
Environment Variable | Description | Default |
---|---|---|
0X_SERVER_ADDRESS | Server listen address | :3000 |
0X_SERVER_BASE_URL | Base URL for the server | "" |
0X_SERVER_MAX_UPLOAD_SIZE | Maximum upload size in bytes | 5242880 |
0X_SERVER_DEFAULT_UPLOAD_SIZE | Default upload size in bytes | 5242880 |
0X_SERVER_API_UPLOAD_SIZE | API upload size in bytes | 5242880 |
0X_SERVER_PREFORK | Enable prefork mode | false |
0X_SERVER_SERVER_HEADER | Server header value | Paste69 |
0X_SERVER_APP_NAME | Application name | Paste69 |
0X_SERVER_CORS_ORIGINS | CORS allowed origins | [] |
0X_SERVER_VIEWS_DIRECTORY | Directory for view templates | ./views |
0X_SERVER_PUBLIC_DIRECTORY | Directory for public files | ./public |
Settings for automatic content cleanup.
Environment Variable | Description | Default |
---|---|---|
0X_SERVER_CLEANUP_ENABLED | Enable automatic cleanup | true |
0X_SERVER_CLEANUP_INTERVAL | Cleanup interval in seconds | 3600 |
0X_SERVER_CLEANUP_MAX_AGE | Maximum age for content | 168h |
Controls rate limiting behavior.
Environment Variable | Description | Default |
---|---|---|
0X_SERVER_RATE_LIMIT_GLOBAL_ENABLED | Enable global rate limiting | true |
0X_SERVER_RATE_LIMIT_GLOBAL_RATE | Global requests per second | 100.0 |
0X_SERVER_RATE_LIMIT_GLOBAL_BURST | Global burst size | 50 |
0X_SERVER_RATE_LIMIT_PER_IP_ENABLED | Enable per-IP rate limiting | true |
0X_SERVER_RATE_LIMIT_PER_IP_RATE | Per-IP requests per second | 1.0 |
0X_SERVER_RATE_LIMIT_PER_IP_BURST | Per-IP burst size | 5 |
0X_SERVER_RATE_LIMIT_USE_REDIS | Use Redis for rate limiting | false |
0X_SERVER_RATE_LIMIT_IP_CLEANUP_INTERVAL | IP cleanup interval | 1h |
Email sending configuration.
Environment Variable | Description | Default |
---|---|---|
0X_SMTP_ENABLED | Enable SMTP functionality | false |
0X_SMTP_HOST | SMTP server host | "" |
0X_SMTP_PORT | SMTP server port | 587 |
0X_SMTP_USERNAME | SMTP username | "" |
0X_SMTP_PASSWORD | SMTP password | "" |
0X_SMTP_FROM | From email address | "" |
0X_SMTP_FROM_NAME | From name | Paste69 |
0X_SMTP_STARTTLS | Use STARTTLS | true |
Redis connection settings.
Environment Variable | Description | Default |
---|---|---|
0X_REDIS_ENABLED | Enable Redis | false |
0X_REDIS_ADDRESS | Redis server address | localhost:6379 |
0X_REDIS_PASSWORD | Redis password | "" |
0X_REDIS_DB | Redis database number | 0 |
Content retention policy settings.
Environment Variable | Description | Default |
---|---|---|
0X_RETENTION_NO_KEY_MIN_AGE | Minimum retention days without key | 7.0 |
0X_RETENTION_NO_KEY_MAX_AGE | Maximum retention days without key | 128.0 |
0X_RETENTION_WITH_KEY_MIN_AGE | Minimum retention days with key | 30.0 |
0X_RETENTION_WITH_KEY_MAX_AGE | Maximum retention days with key | 730.0 |
0X_RETENTION_POINTS | Number of retention curve points | 50 |
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature
) - Commit your changes (
git commit -am 'Add amazing feature'
) - Push to the branch (
git push origin feature/amazing-feature
) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.