Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
127 changes: 127 additions & 0 deletions cmd/mediashare/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
// Package main provides the entry point for the MediaShare service.
package main

import (
"flag"
"log"
"os"
"strconv"

"github.com/ritlug/teleirc/internal/mediashare"
)

func main() {
// Command line flags
port := flag.Int("port", 0, "Port to listen on (overrides MEDIASHARE_PORT)")
apiKey := flag.String("key", "", "API key for uploads (overrides MEDIASHARE_API_KEY)")
baseURL := flag.String("url", "", "Base URL for generated links (overrides MEDIASHARE_BASE_URL)")
storagePath := flag.String("storage", "", "Path to store files (overrides MEDIASHARE_STORAGE_PATH)")
dbPath := flag.String("db", "", "Path to SQLite database (overrides MEDIASHARE_DB_PATH)")
maxSize := flag.Int64("maxsize", 0, "Maximum file size in bytes (overrides MEDIASHARE_MAX_FILE_SIZE)")
retention := flag.Int("retention", 0, "File retention in hours (overrides MEDIASHARE_RETENTION_HOURS)")
serviceName := flag.String("name", "", "Service name for branding (overrides MEDIASHARE_SERVICE_NAME)")
language := flag.String("lang", "", "Language code pl/en (overrides MEDIASHARE_LANGUAGE)")
showList := flag.Bool("showlist", false, "Show file list on main page (overrides MEDIASHARE_SHOW_LIST)")
mainImage := flag.String("mainimg", "", "Path/URL to main page image (overrides MEDIASHARE_MAIN_IMG)")
flag.Parse()

// Load configuration from environment with flag overrides
config := &mediashare.Config{
Port: getEnvInt("MEDIASHARE_PORT", 8080),
APIKey: getEnv("MEDIASHARE_API_KEY", ""),
BaseURL: getEnv("MEDIASHARE_BASE_URL", "http://localhost:8080"),
StoragePath: getEnv("MEDIASHARE_STORAGE_PATH", "./uploads"),
DBPath: getEnv("MEDIASHARE_DB_PATH", "./mediashare.db"),
MaxFileSize: getEnvInt64("MEDIASHARE_MAX_FILE_SIZE", 50*1024*1024), // 50MB default
RetentionHours: getEnvInt("MEDIASHARE_RETENTION_HOURS", 72),
ServiceName: getEnv("MEDIASHARE_SERVICE_NAME", "MediaShare"),
Language: getEnv("MEDIASHARE_LANGUAGE", "pl"),
ShowList: getEnvBool("MEDIASHARE_SHOW_LIST", false),
MainImage: getEnv("MEDIASHARE_MAIN_IMG", ""),
}

// Apply flag overrides
if *port != 0 {
config.Port = *port
}
if *apiKey != "" {
config.APIKey = *apiKey
}
if *baseURL != "" {
config.BaseURL = *baseURL
}
if *storagePath != "" {
config.StoragePath = *storagePath
}
if *dbPath != "" {
config.DBPath = *dbPath
}
if *maxSize != 0 {
config.MaxFileSize = *maxSize
}
if *retention != 0 {
config.RetentionHours = *retention
}
if *serviceName != "" {
config.ServiceName = *serviceName
}
if *language != "" {
config.Language = *language
}
if *showList {
config.ShowList = true
}
if *mainImage != "" {
config.MainImage = *mainImage
}

// Ensure storage directory exists
if err := os.MkdirAll(config.StoragePath, 0755); err != nil {
log.Fatalf("Failed to create storage directory: %v", err)
}

// Start server
server, err := mediashare.NewServer(config)
if err != nil {
log.Fatalf("Failed to create server: %v", err)
}
defer server.Close()

if err := server.Start(); err != nil {
log.Fatalf("Server error: %v", err)
}
}

func getEnv(key, defaultValue string) string {
if value := os.Getenv(key); value != "" {
return value
}
return defaultValue
}

func getEnvInt(key string, defaultValue int) int {
if value := os.Getenv(key); value != "" {
if intVal, err := strconv.Atoi(value); err == nil {
return intVal
}
}
return defaultValue
}

func getEnvInt64(key string, defaultValue int64) int64 {
if value := os.Getenv(key); value != "" {
if intVal, err := strconv.ParseInt(value, 10, 64); err == nil {
return intVal
}
}
return defaultValue
}

func getEnvBool(key string, defaultValue bool) bool {
if value := os.Getenv(key); value != "" {
if boolVal, err := strconv.ParseBool(value); err == nil {
return boolVal
}
}
return defaultValue
}
2 changes: 1 addition & 1 deletion cmd/teleirc.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ func main() {
signal.Notify(signalChannel, os.Interrupt, syscall.SIGTERM)

var tgapi *tgbotapi.BotAPI
tgClient := tg.NewClient(&settings.Telegram, &settings.IRC, &settings.Imgur, tgapi, logger)
tgClient := tg.NewClient(&settings.Telegram, &settings.IRC, &settings.Imgur, &settings.MediaShare, tgapi, logger)
tgChan := make(chan error)

ircClient := irc.NewClient(&settings.IRC, &settings.Telegram, logger)
Expand Down
17 changes: 17 additions & 0 deletions deployments/container/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,20 @@ Using TeleIRC with Docker
The files included here are examples for you to use.
For more information on using them, [read the documentation](https://docs.teleirc.com/en/latest/deploy-teleirc/#docker).
Before using them, copy files you intend to use to the root directory of the repository.

## Included Dockerfiles

- `Dockerfile` - TeleIRC main bot
- `mediashare.Dockerfile` - MediaShare media hosting service (optional)

## Using MediaShare

MediaShare is an optional service for hosting Telegram media files. See [MediaShare documentation](../../docs/user/mediashare.md) for details.

To run both TeleIRC and MediaShare together, use the docker-compose example:

```bash
cp docker-compose.yml.example docker-compose.yml
# Edit .env to configure both services
docker-compose up -d
```
20 changes: 20 additions & 0 deletions deployments/container/docker-compose.yml.example
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,23 @@ services:
dockerfile: ./deployments/container/Dockerfile
env_file: ../../.env
user: teleirc
depends_on:
- mediashare

mediashare:
build:
context: ../../
dockerfile: ./deployments/container/mediashare.Dockerfile
ports:
- "8090:8090"
volumes:
- mediashare-data:/app/data
environment:
- MEDIASHARE_API_KEY=${MEDIASHARE_API_KEY}
- MEDIASHARE_BASE_URL=${MEDIASHARE_BASE_URL:-http://localhost:8090}
- MEDIASHARE_RETENTION_HOURS=${MEDIASHARE_RETENTION_HOURS:-168}
- MEDIASHARE_LANG=${MEDIASHARE_LANG:-en}
- MEDIASHARE_SERVICE_NAME=${MEDIASHARE_SERVICE_NAME:-MediaShare}

volumes:
mediashare-data:
36 changes: 36 additions & 0 deletions deployments/container/mediashare.Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
FROM golang:1.22-alpine AS builder

WORKDIR /app

COPY go.mod go.sum ./
RUN go mod download

COPY . ./

RUN go build -o mediashare ./cmd/mediashare

# Use a minimal base image to run the binary
FROM alpine:latest

RUN adduser -D mediashare-user && \
mkdir -p /app/data/uploads && \
chown -R mediashare-user:mediashare-user /app

USER mediashare-user

COPY --from=builder /app/mediashare /app/mediashare

WORKDIR /app

# Default environment variables
ENV MEDIASHARE_PORT=8090
ENV MEDIASHARE_STORAGE_PATH=/app/data/uploads
ENV MEDIASHARE_DB_PATH=/app/data/mediashare.db
ENV MEDIASHARE_RETENTION_HOURS=168
ENV MEDIASHARE_LANG=en

EXPOSE 8090

VOLUME ["/app/data"]

ENTRYPOINT ["./mediashare"]
Loading