Skip to content
Merged
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
19 changes: 19 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Исключаем файлы и директории, не нужные для сборки
.git
.gitignore
README.md
LICENSE
*.md
test/
data/
dist/
Dockerfile*
.dockerignore
.releaserc
.github/
.idea/
.vscode/
*.local
*.tmp
*.log
.DS_Store
56 changes: 56 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
name: Release

on:
push:
tags:
- 'v*'

permissions:
contents: write
packages: write

env:
DOCKER_REGISTRY: rd2w

jobs:
release:
name: Build Release
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/tags/v')
steps:
- name: Checkout
uses: actions/checkout@v5
with:
fetch-depth: 0

- name: Set up Go
uses: actions/setup-go@v6
with:
go-version: '1.25'

- name: Install syft
run: |
curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b /usr/local/bin
syft --version

- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: Set up QEMU
uses: docker/setup-qemu-action@v3

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Run GoReleaser
uses: goreleaser/goreleaser-action@v6
with:
distribution: goreleaser
version: latest
args: release --clean
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
DOCKER_REGISTRY: ${{ env.DOCKER_REGISTRY }}
213 changes: 213 additions & 0 deletions .goreleaser.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,213 @@
version: 2

# Определяем проект и его метаданные
project_name: go-notes

# Определяем, что мы хотим выпускать
builds:
# Сборка grpc-server
- id: grpc-server
main: ./cmd/grpc-server
binary: grpc-server
goos:
- linux
- darwin
- windows
goarch:
- amd64
- arm64
env:
- CGO_ENABLED=0
gcflags:
- all=-trimpath
ldflags:
- -s -w
- -extldflags '-static'
- -X main.version={{.Version}}
- -X main.commit={{.Commit}}
- -X main.date={{.Date}}
flags:
- -a
tags:
- osusergo
- netgo
- static

# Сборка web-server
- id: web-server
main: ./cmd/web-server
binary: web-server
goos:
- linux
- darwin
- windows
goarch:
- amd64
- arm64
env:
- CGO_ENABLED=0
gcflags:
- all=-trimpath
ldflags:
- -s -w
- -extldflags '-static'
- -X main.version={{.Version}}
- -X main.commit={{.Commit}}
- -X main.date={{.Date}}
flags:
- -a
tags:
- osusergo
- netgo
- static

# Упаковка артефактов
# Один архив для каждой комбинации OS/Arch, содержащий оба бинарника (grpc-server и web-server)
archives:
- name_template: "{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}"
ids:
- grpc-server
- web-server
files:
- LICENSE
- README.md
- src: config/config.toml
dst: config/config.toml
format_overrides:
- goos: windows
formats: ["zip"]
formats: ["tar.gz"]

#archives:
# - id: grpc-server
# name_template: "{{ .ProjectName }}-grpc-server_{{ .Version }}_{{ .Os }}_{{ .Arch }}"
# ids:
# - grpc-server
# files:
# - LICENSE
# - README.md
# - src: config/config.toml
# dst: config/config.toml
# format_overrides:
# - goos: windows
# formats: ["zip"]
# formats: ["tar.gz"]
#
# - id: web-server
# name_template: "{{ .ProjectName }}-web-server_{{ .Version }}_{{ .Os }}_{{ .Arch }}"
# ids:
# - web-server
# files:
# - LICENSE
# - README.md
# - src: config/config.toml
# dst: config/config.toml
# format_overrides:
# - goos: windows
# formats: ["zip"]
# formats: ["tar.gz"]

# Docker образы
dockers_v2:
# grpc-server мультиплатформенный образ
- id: grpc-server
dockerfile: Dockerfile.grpc
# Указываем платформы для сборки
platforms:
- linux/amd64
- linux/arm64
# Флаги для docker build
flags:
- --pull
- --push
- --provenance=false
- --sbom=false
# Файлы, которые нужно добавить в контекст сборки
extra_files:
- config/config.toml
# Теги для образа
images:
- "{{ .Env.DOCKER_REGISTRY }}/{{ .ProjectName }}"
tags:
- "grpc-server-{{ .Version }}"
- "grpc-server-latest"
# Метки для Docker образа (опционально)
labels:
org.opencontainers.image.title: "{{.ProjectName}}-grpc-server"
org.opencontainers.image.version: "{{.Version}}"
org.opencontainers.image.created: "{{.Date}}"
org.opencontainers.image.revision: "{{.Commit}}"
org.opencontainers.image.source: "https://github.com/rd2w/go-notes"
org.opencontainers.image.licenses: "MIT"

# web-server мультиплатформенный образ
- id: web-server
dockerfile: Dockerfile.web
platforms:
- linux/amd64
- linux/arm64
flags:
- --pull
- --push
- --provenance=false
- --sbom=false
# Файлы, которые нужно добавить в контекст сборки
extra_files:
- config/config.toml
images:
- "{{ .Env.DOCKER_REGISTRY }}/{{ .ProjectName }}"
tags:
- "web-server-{{ .Version }}"
- "web-server-latest"
labels:
org.opencontainers.image.title: "{{.ProjectName}}-web-server"
org.opencontainers.image.version: "{{.Version}}"
org.opencontainers.image.created: "{{.Date}}"
org.opencontainers.image.revision: "{{.Commit}}"
org.opencontainers.image.source: "https://github.com/rd2w/go-notes"
org.opencontainers.image.licenses: "MIT"

checksum:
name_template: "checksums.txt"

sboms:
- artifacts: archive

# Проверка обновлений
changelog:
sort: asc
filters:
exclude:
- "^Merge pull request" # ← Убирает Merge PR
- "^Merge branch" # ← Убирает Merge branch
- "^$" # ← Убирает пустые коммиты
groups:
- title: New Features
regexp: "^.*(?i)(feat|feature)[(:].*$"
order: 0
- title: Bug Fixes
regexp: "^.*(?i)(fix|bug)[(:].*$"
order: 1
- title: Build System
regexp: "^.*(?i)build[(:].*$"
order: 2
- title: Documentation
regexp: "^.*(?i)(doc|docs)[(:].*$"
order: 3
- title: CI/CD
regexp: "^.*(?i)ci[(:].*$"
order: 4
- title: Tests
regexp: "^.*(?i)test[(:].*$"
order: 5
- title: Other Changes
order: 999

# Публикация в GitHub Releases
release:
github:
owner: RD2W
name: go-notes
name_template: "v{{.Version}}"
draft: false
prerelease: auto # Автоматически помечает как pre-release для тегов с v* (например v1.0.0-rc1)
35 changes: 35 additions & 0 deletions Dockerfile.grpc
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
FROM alpine:latest

# Устанавливаем только ca-certificates для TLS соединений и tzdata для корректной работы с временными зонами
RUN apk --no-cache add ca-certificates tzdata && \
update-ca-certificates && \
ln -sf /usr/share/zoneinfo/Europe/Moscow /etc/localtime && \
echo "Europe/Moscow" > /etc/timezone

# Создаем пользователя для безопасности
RUN addgroup -g 1000 appuser && \
adduser -u 1000 -G appuser -D appuser

WORKDIR /app

# Создаем структуру директорий
RUN mkdir -p /app/config

# Копируем скомпилированное приложение из стадии сборки
ARG TARGETPLATFORM
COPY --chown=appuser:appuser $TARGETPLATFORM/grpc-server /app/grpc-server

# Копируем конфигурационный файл
COPY --chown=appuser:appuser config/config.toml /app/config/config.toml

# Устанавливаем исполняемый бит
RUN chmod +x /app/grpc-server

# Меняем пользователя на непривилегированного
USER appuser

# Устанавливаем порт gRPC
EXPOSE 5051

# Устанавливаем точку входа
ENTRYPOINT ["/app/grpc-server"]
35 changes: 35 additions & 0 deletions Dockerfile.web
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
FROM alpine:latest

# Устанавливаем только ca-certificates для HTTPS и tzdata для корректной работы с временными зонами
RUN apk --no-cache add ca-certificates tzdata && \
update-ca-certificates && \
ln -sf /usr/share/zoneinfo/Europe/Moscow /etc/localtime && \
echo "Europe/Moscow" > /etc/timezone

# Создаем пользователя для безопасности
RUN addgroup -g 1000 appuser && \
adduser -u 1000 -G appuser -D appuser

WORKDIR /app

# Создаем структуру директорий
RUN mkdir -p /app/config

# Копируем скомпилированное приложение из стадии сборки
ARG TARGETPLATFORM
COPY --chown=appuser:appuser $TARGETPLATFORM/web-server /app/web-server

# Копируем конфигурационный файл
COPY --chown=appuser:appuser config/config.toml /app/config/config.toml

# Устанавливаем исполняемый бит
RUN chmod +x /app/web-server

# Меняем пользователя на непривилегированного
USER appuser

# Устанавливаем порт web-server
EXPOSE 8080

# Устанавливаем точку входа
ENTRYPOINT ["/app/web-server"]
7 changes: 4 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@

Репозиторий для изучения языка Go, демонстрирующий создание веб-сервера и gRPC-сервера с возможностью управления заметками и пользователями.

[![Go Version](https://img.shields.io/badge/Go-1.25+-blue.svg)](https://golang.org)
[![Release](https://img.shields.io/github/v/release/RD2W/go-notes.svg?label=Release)](https://github.com/RD2W/go-notes/releases/latest)
[![Go Version](https://img.shields.io/badge/Go-1.25.4-blue.svg)](https://golang.org)
[![License](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)
[![Go Test Coverage](https://img.shields.io/badge/Coverage-Test%20Coverage-1abc9c.svg)](https://golang.org)
![Tests](https://github.com/RD2W/go-notes/actions/workflows/branch_merges.yml/badge.svg)
Expand Down Expand Up @@ -108,7 +109,7 @@ go run cmd/web-server/main.go
go run cmd/grpc-server/main.go
```

Сервер будет доступен по адресу `localhost:50051`.
Сервер будет доступен по адресу `localhost:5051`.

### Запуск gRPC-клиента

Expand Down Expand Up @@ -269,7 +270,7 @@ curl -X DELETE http://localhost:8080/api/notes/{note_id} \

### Сервер
- `SERVER_PORT` - порт для HTTP сервера (по умолчанию: :8080)
- `GRPC_PORT` - порт для gRPC сервера (по умолчанию: :50051)
- `GRPC_PORT` - порт для gRPC сервера (по умолчанию: :5051)
- `SERVER_READ_TIMEOUT` - таймаут чтения запроса в секундах (по умолчанию: 15)
- `SERVER_WRITE_TIMEOUT` - таймаут записи ответа в секундах (по умолчанию: 15)

Expand Down
Loading