Я создал файл docker-compose, который описывает три сервиса: базу данных Postgres, сервер и Nginx. Вот его содержимое:
```yaml
services:
db:
container_name: db
restart: always
image: postgres:17
env_file: ./.env
expose:
- "5432"
volumes:
- local_postgres_data:/var/lib/postgresql/data
healthcheck:
test: [ "CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}" ]
interval: 10s
retries: 5
start_period: 30s
timeout: 10s
server:
container_name: server
restart: always
build:
context: .
dockerfile: Dockerfile
env_file: ./.env
expose:
- "8080"
depends_on:
db:
condition: service_healthy
nginx:
image: nginx:latest
container_name: nginx
build:
context: .
dockerfile: Dockerfile_nginx
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
ports:
- "80:80"
- "443:443"
depends_on:
- server
```
Кроме того, вот код файла nginx.conf, который я использую для простого обратного прокси:
```nginx
events {
worker_connections 1024;
}
http {
server {
listen 80;
location / {
proxy_pass http://server:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
```
При запуске сервера я использую хост `0.0.0.0`, чтобы Nginx в Docker мог получить доступ к сервису `server` в одной сети Docker. После запуска этого docker-compose всё функционирует корректно, и все GET и POST запросы обрабатываются через браузер и Postman. Однако, у меня возникла проблема с библиотекой Swagger на Go (ссылка на источник: <a href="http
Чтобы устранить проблему CORS (Cross-Origin Resource Sharing) при использовании Swagger с Nginx и Go-сервером, вам нужно будет убедиться, что ваш сервер правильно обрабатывает заголовки CORS, а также скорректировать настройки Nginx.
1. **Внедрение заголовков CORS на сервере**:
В вашем Go-коде при обработке HTTP-запросов необходимо устанавливать заголовки CORS. Обычно это делается в middleware. Пример простого middleware в Go:
```go
package main
import (
"net/http"
)
func enableCORS(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Access-Control-Allow-Origin", "*") // или укажите домен
w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization")
w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
if r.Method == http.MethodOptions {
w.WriteHeader(http.StatusOK)
return
}
next.ServeHTTP(w, r)
})
}
```
Затем оберните ваши маршруты в этот middleware:
```go
http.Handle("/", enableCORS(http.HandlerFunc(yourHandler)))
```
2. **Настройка Nginx**:
Вам также следует убедиться, что Nginx правильно передает CORS заголовки. Чтобы сделать это, вы можете добавить следующие директивы в ваш `nginx.conf`:
```nginx
server {
listen 80;
location / {
proxy_pass http://server:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# Задаем заголовки CORS
add_header 'Access-Control-Allow-Origin' '*'; # или укажите домен
add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization';
add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS';
# Если запрос OPTIONS, возвращаем 204
if ($request_method = OPTIONS) {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization';
add_header 'Content-Length' 0;
return 204;
}
}
}
```
Эти изменения позволят вашему приложению обрабатывать CORS запросы и позволят из Swagger отправлять запросы к вашему API.
После внесения изменений не забудьте перезапустить Nginx и ваш Go-сервер, чтобы применить новые настройки.