Поднятие прокси-сервера Squid при помощи Docker за 3 минуты
Поднятие прокси-сервера Squid при помощи Docker за 3 минуты
Squid — это мощный кеширующий прокси-сервер для протоколов HTTP, HTTPS и FTP. Он помогает ускорить доступ к веб-ресурсам, снижает нагрузку на канал и может использоваться для фильтрации трафика.
В этой статье мы развернём Squid в Docker-контейнере и настроим его работу.
Шаг 1: Создание конфигурационного файла
Создадим файл squid.conf с базовыми настройками:
Скрипт парсинга курсов Bestchange
Скрипт парсинга курсов Bestchange
Скрипт проводит выборку курсов по заданным входным параметрам и может выдавать готовую json структуру по заданным направлениям. Выборка курсов производится через публичный API и содержит в себе всю необходимую информацию по лучшим курсам и параметрам обменных пунктов:
- Минимальная цена заявки
- Максимальная цена заявки
- Курс
- Резервы
- Отзывы (Положительные — Отрицательные)
- Название обменного пункта
Пример работы скрипта:
Golang — использование envconfig для environment variables
Golang — использование envconfig для environment variables
Для работы с переменными окружения в Golang без использования библиотеки envconfig просто не обойтись:
//AppConfig struct to manage configuration env vars
type AppConfig struct {
DBHost string `envconfig:"DB_HOST" required:"true"`
DBPort int `envconfig:"DB_PORT" required:"true"`
DBUser string `envconfig:"DB_USER" required:"true"`
DBName string `envconfig:"DB_NAME" required:"true"`
DBPassword string `envconfig:"DB_PASSWORD" required:"true"`
}
...
// and let's use it in our main func:
var cfg AppConfig
err := envconfig.Process("myApp", &cfg)
if err != nil {
return nil, err
}
// finally, let's use our app configuration
fmt.Println(cfg.DBHost)
Библиотека также поддерживает default значения, required флаги, custom декодеры и многое многое другое.
Golang sqlmock db tests — SELECT тесты
Golang sqlmock db tests — SELECT тесты
func TestFindAll(t *testing.T) {
dbMock, mock, err := sqlmock.New()
if err != nil {
t.Errorf("An error '%s' was not expected when opening a stub database connection", err)
}
defer dbMock.Close()
columns := []string{"id", "date", "name", "code"}
expectedData := Data{
Id: 1,
Date: time.Time{},
Name: "Name",
Code: "Code",
}
dbConn := sqlx.NewDb(dbMock, "")
mock.ExpectQuery(`SELECT id,date,name,code FROM datas ORDER BY name ASC`).
WillReturnRows(sqlmock.NewRows(columns).AddRow(expectedData.Id, expectedData.Date, expectedData.Name, expectedData.Code))
r := NewRepository(dbConn)
currencies, err := r.FindAll()
assert.NoError(t, err)
if err := mock.ExpectationsWereMet(); err != nil {
t.Error(err)
}
expectedListOfDatas := []*Currency{&expectedData}
assert.Equal(t, expectedListOfDatas, datas)
}
Docker — сохранить image в tar
Docker — сохранить image в tar
Для сохранения image в tar контейнер достаточно выполнить:
docker save my_image > my_image.tar
Теперь мы можем спокойно переносить docker image и далее «загружать» image:
docker load <input_path>/my_image.tar
Golang — Mock для sqlx драйвера базы данных
Golang — Mock для sqlx драйвера базы данных
Для написания юнит тестов часто требуется «мокать» часть зависимостей, одна из самых распространенных — соединение и операции с базой данных. Если нет возможности использовать внедрение зависимости и использовать интерфейсы типа ExecerContext на входе функции то в дело вступают не совсем чистые хаки в виде Monkey patching.
Полезные curl для Digital Ocean API
Полезные curl для Digital Ocean API
При автоматизации инфраструктуры под Terraform понадобилось найти id SSH ключей и типы дроплетов чтобы их было возможно использовать в конфигурации. Делюсь примерами curl запросов к Digital Ocean API (статья будет дополняться со временем).
- Вывод SSH id keys, привязанных к аккаунту:
curl -X GET -H "Content-Type: application/json" -H "Authorization: Bearer $DIGITALOCEAN_TOKEN" "https://api.digitalocean.com/v2/account/keys" | jq
- Вывод всех типов дроплетов:
curl -X GET "https://api.digitalocean.com/v2/images?per_page=999" -H "Authorization: Bearer $DIGITALOCEAN_TOKEN" | jq
Поскольку вывод получается слишком большим можно воспользоваться сохранением ответа в файл:
GitHub API — пара полезных curl примеров
GitHub API — пара полезных curl примеров
Список команд в организации:
curl GET --url 'https://api.github.com/orgs/<organization-name>/teams?access_token=<TOKEN>’
Работа с GitHub Status API, установка badge для Pull Request:
curl -d '{"state": "success","target_url": "https://example.com/build/status","description": "The build succeeded!","context": "continuous-integration/jenkins"}' -H "Content-Type: application/json" -X POST "https://api.github.com/repos/<organization-name>/<project-name>/statuses/<sha-of-the-commit>?access_token=<github-token>”
Данный сниппет может быть использован для установки badges на определенном pull request.
При возникновении новых интересных запросов данный пост будет пополняться.
Установка Kubernetes nginx controller на bare metal
Установка Kubernetes nginx controller на bare metal
Подробная инструкция как установить nginx ingress controller на чистый bare metal кластер:
https://kubernetes.github.io/ingress-nginx/deploy/#bare-metal
Или по шагам:
- Устанавливаем ingress-nginx service с type NodePort:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/provider/baremetal/service-nodeport.yaml
Проверим, что установка завершена успешно:
kubectl get services -n ingress-nginx
Видим:
ingress-nginx ingress-nginx NodePort 10.245.213.134 <none> 80:31462/TCP,443:30310/TCP 2s
Поздравляем! Nginx контроллер успешно установлен, теперь можем сделать curl до машины с 31462 портом и получим ответ nginx:
Получение данных Jira тикета по Atlassian API
Получение данных Jira тикета по Atlassian API
Для получения данных по Jira тикету достаточно воспользоваться Atlassian REST API
curl -D- \ -X GET \ -H "Authorization: Basic <base64 encoded stuff>“ \ -H "Content-Type: application/json" \ "https://yourcompany.atlassian.net/rest/api/2/issue/TICKET-NUMBER"
В качестве токена авторизации можно (но не рекомендуется) воспользоваться base64 представлением вашего пароля:
echo -n '[email protected]:your-password' | openssl base64