A Reddit-like REST API backend written in Go. Supports posts, comments, voting, and JWT-based authentication.
| Layer | Technology |
|---|---|
| Language | Go 1.25 |
| HTTP | net/http (stdlib) |
| Auth | JWT (golang-jwt/jwt/v5) |
| Database | PostgreSQL 16 |
| Sessions | Redis 7 |
| Config | cleanenv + .env |
| Containerization | Docker + Docker Compose |
┌─────────────────────────────────────────────────────┐
│ Client (SPA) │
└─────────────────────────┬───────────────────────────┘
│ REST API
┌─────────────────────────▼───────────────────────────┐
│ HTTP Server (Go) │
│ │
│ ┌─────────────┐ ┌──────────────────────────┐ │
│ │ Middleware │ │ Handlers │ │
│ │ │ │ │ │
│ │ • LoggerMW │───▶│ UserHandler │ │
│ │ • AuthMW │ │ • Register │ │
│ └─────────────┘ │ • Login │ │
│ │ │ │
│ │ PostHandler │ │
│ │ • List / GetByID │ │
│ │ • Add / Delete │ │
│ │ • AddComment │ │
│ │ • DeleteComment │ │
│ │ • Upvote/Downvote/Unvote│ │
│ └──────────┬───────────────┘ │
└────────────────────────────────┼────────────────────┘
│
┌──────────────────┼──────────────────┐
│ │ │
┌─────────────▼──────┐ ┌────────▼───────┐ ┌───────▼───────┐
│ session.MemoryRepo│ │UserStorageMngr │ │PostStorageMngr│
│ │ │ │ │ │
│ Register │ │ CreateUser │ │ GetAll │
│ Authorize │ │ AuthUser │ │ GetByID │
└─────────────┬──────┘ └───────┬────────┘ └──────┬────────┘
│ │ │
┌─────────────▼──────┐ ┌───────▼──────────────────▼────────┐
│ Redis │ │ PostgreSQL │
│ │ │ │
│ sessions:{user} │ │ users posts comments votes │
└────────────────────┘ └───────────────────────────────────┘
redditclone/
├── cmd/
│ └── redditclone/
│ └── main.go
├── internal/
│ ├── config/
│ ├── handler/
│ ├── logger/
│ ├── middleware/
│ ├── post/
│ ├── session/
│ └── user/
├── Volume/
│ └── sample_db.sql
├── static/
├── env/
│ ├── .env.example
│ └── .env
├── Dockerfile
└── docker-compose.yml
| Method | Path | Description |
|---|---|---|
POST |
/api/register |
Регистрация |
POST |
/api/login |
Вход, получение JWT |
GET |
/api/posts |
Все посты |
GET |
/api/posts/{category} |
Посты по категории |
GET |
/api/post/{id} |
Пост по ID |
GET |
/api/user/{login} |
Посты пользователя |
| Method | Path | Description |
|---|---|---|
POST |
/api/posts |
Создать пост |
DELETE |
/api/post/{id} |
Удалить пост |
POST |
/api/post/{id} |
Добавить комментарий |
DELETE |
/api/post/{postId}/{commentId} |
Удалить комментарий |
GET |
/api/post/{id}/upvote |
Проголосовать за |
GET |
/api/post/{id}/downvote |
Проголосовать против |
GET |
/api/post/{id}/unvote |
Убрать голос |
# 1. Клонировать репозиторий
git clone https://github.com/your-username/redditclone.git
cd redditclone
# 2. Создать файл конфигурации
cp env/.env.example env/.env
# При необходимости отредактировать env/.env
# 3. Запустить все сервисы
docker compose up --build
# Приложение доступно на http://localhost:8080# Остановить и удалить контейнеры
docker compose down
# Остановить и удалить контейнеры вместе с данными
docker compose down -vВсе параметры задаются через переменные окружения (или файл env/.env).
| Переменная | По умолчанию | Описание |
|---|---|---|
HTTP_SERVER_ADDRESS |
:8080 |
Адрес и порт сервера |
HTTP_SERVER_READ_TIMEOUT |
10s |
Таймаут чтения запроса |
HTTP_SERVER_WRITE_TIMEOUT |
10s |
Таймаут записи ответа |
JWT_SECRET |
change-me-in-production |
Секрет для подписи JWT |
SESSION_STORAGE_ADDRESS |
localhost |
Адрес Redis |
SESSION_STORAGE_PORT |
6379 |
Порт Redis |
USER_STORAGE_ADDRESS |
localhost |
Адрес PostgreSQL |
USER_STORAGE_PORT |
5432 |
Порт PostgreSQL |
USER_STORAGE_USERNAME |
— | Пользователь БД |
USER_STORAGE_PASSWORD |
— | Пароль БД |
USER_STORAGE_DB_NAME |
— | Имя базы данных |
Обязательно смените
JWT_SECRET
Приложение пишет структурированные JSON-логи в несколько файлов:
logs/
├── sql.json # работа с хранилищем
├── redis.json # работа с сессиями
└── http.json # HTTP-запросы
MIT