LINUX.ORG.RU

Сообщения constin

 

gitlab in k8s requirements

Привет, не очень понятно, что там по ресурсам. Я в курсе, что gitlab жрет как лошадь. Но в описании они хотят начиная от 30 гигов оперативки себе в k8s.

Нагрузка планируется следующая: около 15 юзеров, около 30 коммитов в день. Около 50 репов с пайплайнами (раннеры отдельно) + docker регистри.

Неужели под этого надо отдавать 30 гигов оперативки и 8 CPU?

 , , ,

constin
()

dovecot sieve redirect whitelist

Привет, почтовик с dovecot, у которого есть sieve Если пользователь прописывает себе какое-либо правило с редиректом, то письмо уходит от него самого c header envelop-from: user@domain.com, цель адресации видит изначального отправителя как отправителя.

dovecot.conf
....
protocol sieve {
.....
  sieve_redirect_envelope_from = recipient

....
}

Поскольку при переадресации отправитель типа наш юзер, аутифицированный и все такое, то postfix со спокойной душой отправляет это письмо в инет.

Задача в том, чтобы на каком-то любом этапе, запретить юзеру делать редиркеты на внешние домены, при этом оставив возможность делать редиректы на другие мылы внутренних сотрудников.

в стеке имеем: sogo/dovecot с sieve/rspamd/postfix

На вскидку, проме парсера юзерских sieve скриптов по крону мне пока больше ничего не придумалось, но это костыль.

Еще подумываю в сторону global-sieve-after, но я не знаю, может ли этот глобал отменить правило юзерского скрипта. Оно читает все и потом делает или оно делает шаг за шагом.

Еще можно в ,например, rsmapd парсить хедеры по идее.

 , , ,

constin
()

Нужен человек очень хорошо разбирающийся в веб серверах. Удаленка в неосновное время.

Нужен профессионал, который по основной работе занимается постоянно сопровождением web серверов и знает все тонкости. Возможно имеет опыт в high-load.

Небольшая группа разработчиков пишет CRM на PHP. Eще есть вордпрессы. CRM обычно общается с веб сайтами, с PBX и многим другим.

Поднять apache/nginx с php-fpm может любой, для этого много ума не надо. Нужно понимать почему, например, обработка php запроса на одном сервере идет 10 секунд, а на другом такая же 5 минут. Нужно уметь искать бутылочное горло и фиксить эти проблемы.

Стек обычный: apache/nginx/php-fpm/mysql. Можно ставить на ось, можно пихать в докеры, можно в k8s(если хочется).

Если есть другие скилы, то возможно они будут тоже применимы и оплачены.

Фирма в Германии, оплата белым по договору или счетам.

По деньгам что-то около 30 евро в час или какая-то сумма за конкретные кейсы. Ребята понимают, что платят не за время ,а за то, что человек знает как сделать, поэтому за конкретный кейс может быть выставлена и оплачена адекватная сумма. ( договоримся)

Нагрузка примерно 1 час в день, иногда меньше , иногда больше.

 , , ,

constin
()

relay bad reputation. решение проблемы для всех.

Привет всем, кто занимается почтой, строит и обслуживает почтовые сервера. Всем, кроме спамеров и рассыльщиков, так как эта тема их не касается.

В последние годы ситуация со свежими почтовыми серверами становится все хуже и хуже, большие почтовики игнорируют RFC и очень часто либо запихивают письма от нового почтовика в спам, либо, что тоже часто слуается, вообще не дают коннекта. При этом почтовый сервер может быть идиально настроен. По умолчанию новый IP для них имеет нулевую репутацию.

И если с некоторым саппортом крупных почтовиков можно договориться, то бывает, что саппорт не отвечает вообще. Например yahoo (и не только)

Недавно я обнаружил интересное и недорогое решения этой проблемы. И gsuite от google и office 365 от майкрософта дают возможность купив всего лишь 1 аккаунт у них ( 5 евро в месяц) пускать через их smtp сервера исходящий трафик ( и входящий тоже,если надо)

Те этот один технический ящик служит просто для опплаты. Все остальные адреса будут роутиться на ваш сервер. Ваш сервер сможет использовать smtp гугла и мелкомягких в качестве смартхоста. Вы можете иметь бесконечное кличнество адресов на вашем сервере как и обычно.

При этом там есть ограничения на количество трафика, но они такие, что коснутся лишь спамеров.

Сейчас, покупая сервер для почты, все равно приходится брать к нему additional IP и перебираать их , чтобы найти более менее чистый. Стоимость additional IP сейчас примерно 5 евро. Те ровно тоже самое, что и стоимость одного аккаунта на gsuite или office365.

На этом все, успехов.

 , , , ,

constin
()

pass gpg аутификация в скрпте

Хочу вытащить пароль из pass в скрипте. Поэтому скрипт должен уметь дать мастер пароль для pass, а точнее для gpg

тe, например, pass storage/test_password заупскает gpg и спрашивает меня пароль, хочу чтобы пароль вписывал сам скрипт

echo $master_pass | pass storage/test_password  # это не работает.

Сама gpg умеет так жрать пароль через –passphrase-fd , но какой командой тогда ее заставить разок запросить пароль, чтобы она сохранила его в свой кеш, чтобы потом уже в след команде pass не спрашивал пароль?

 , ,

constin
()

GCP Google Managed SSL без HTTPS Load Balancer

Привет, есть ли какая-то возможность использовать сертификаты от гугла не на HTTPS LB?

В идеале хотелось бы решение GKE+ TCP LB+ терминирование SSL на уровне ingress. Но подойдет вообще любой пример, где google managed ssl пихается на какой-то сервис, а не на https lb,(если это вообще возможно) а дальше уже я сам додумаю.

 , , ,

constin
()

kafka replicator не создает пустые топики на consumer

сабж.

Все хорошо, но пустые топики ( те топики, в которых нет сообщений) не хочет создавать на приемнике. Кто-нибудь сталкивался?

 

constin
()

простая заливалка файлов посоветуйте

Нужнен простой скрипт с вебмордой и примитивной автризацией , чтобы он умел заливать файл на сервер ( на котором он стоит) и показывать линк на этот файл. Я бы даже набросал сам на фласке, но времени нет. Может кто знает что-то подобное? Без кучи свистоперделок?

 

constin
()

python flask fastapi

Предварительный вопрос.

Сколько может стоить программист на удаленку, который бы решал несложные задачи бекенда на фласке. Например, портал для клиентов restful api. Где нужна база юзеров, авторизация, и модулми , которые обращаются к разным базам данных, достают данные и отдают фронту. Имел бы опыт agile, умел бы оценивать задачи по времени до начала работы, видел бы проект в целом так, чтобы предвидеть, что какие-то шаги приведут потом к косякам.

Как тут с рынком?

Перемещено leave из job

 ,

constin
()

gitlab cicd , тест приложения к докере.

Привет, есть апп, допустим на питоне, который в пайплайне собирается в докер, кладется к реп на gitlab и затем пушится в виде докера на прод.

Как его тестировать? Я бы хотел тестировать после билда, те в идеале я бы хотел взять Dockerfile из самого проекта, собрать апп( оно и так делается) и запускать тесты уже на собраном докере , а затем деплоить.

Я не хочу писать в тесте еще раз руками сборку того, что уже и так написано в Dockerfile

Вот тестовый проект

Dockerfile


FROM alpine:3.11

WORKDIR /app



RUN apk add --update --no-cache python3 openssl tzdata git\
 && pip3 install --upgrade pip \
 && pip3 install --upgrade flask flask-restful notion

COPY main.py /app

CMD ["python3", "-u", "/app/main.py"]

gitlab-ci.yml


stages:
  - publish
  - deploy

variables:
  TAG_LATEST: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME:latest
  TAG_COMMIT: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME:$CI_COMMIT_SHORT_SHA

publish:
  image: docker:latest
  stage: publish
  services:
    - docker:dind
  script:
    - docker build -t $TAG_COMMIT -t $TAG_LATEST .
    - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
    - docker push $TAG_COMMIT
    - docker push $TAG_LATEST

deploy:
  image: alpine:latest
  stage: deploy
  tags:
    - deployment
  script:
    - chmod og= $ID_RSA
    - apk update && apk add openssh-client
    - ssh -i $ID_RSA -o StrictHostKeyChecking=no $SERVER_USER@$SERVER_IP "docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY"
    - ssh -i $ID_RSA -o StrictHostKeyChecking=no $SERVER_USER@$SERVER_IP "docker pull $TAG_COMMIT"
    - ssh -i $ID_RSA -o StrictHostKeyChecking=no $SERVER_USER@$SERVER_IP "docker container rm -f my-app || true"
    - ssh -i $ID_RSA -o StrictHostKeyChecking=no $SERVER_USER@$SERVER_IP "docker run -d -p 5050:5050 --name my-app $TAG_COMMIT"
  environment:
    name: production
    url: http://XX.XX.XX.XX
  only:
    - master

 , , , ,

constin
()

как в гите сделать так, чтобы куча пробных коммитов в результате была записана как один результирующий?

У меня ситуация, когда програмист тыкает палочкой в код ( те делает кучу мелких коммитов), иногда ошибается и переделывает. Причем тыкает он не у себя локально, а на тестовом сервере с автодеплоем. В общем, по кейсу в резулате на гите куча коммитов, которые не информативны и нафиг не нужны. Хотелось бы , чтобы он тыкал в каком-нить бранче, а потом при мерже оставался один коммит со всеми изменениями по задаче.

Как это сделать?

 , ,

constin
()

terraform приклепляет локалку после провижена.

hcloud, но я не думаю, что это имеет значение.

Тут все работает, но мне нужны так же еще команды уже после того, как серверу был выдан айпи их локальной сети.

Но терраформ сначала создает сервер, затем запускает провижен, и только потом дает серверу локальный айпи.


...

hcloud_server.master[0] (local-exec): Warning: Permanently added '116.203.205.113' (ECDSA) to the list of known hosts.
hcloud_server.master[0]: Creation complete after 1m33s [id=8751744]
hcloud_server_network.k8s-net-master: Creating...


Вот пример main.tf


...

resource "hcloud_network" "k8s-net" {
  name = "k8s-net"
  ip_range = var.net_range
}

resource "hcloud_network_subnet" "k8s-subnet" {
  network_id = hcloud_network.k8s-net.id
  type = "cloud"
  network_zone = var.net_zone
  ip_range   = var.subnet_range
}

resource "hcloud_server_network" "k8s-net-master" {
  server_id = hcloud_server.master[0].id
  network_id = hcloud_network.k8s-net.id
  ip = var.master_ip
}

resource "hcloud_server_network" "k8s-net-node" {
  count       = var.node_count
  server_id = hcloud_server.node[count.index].id
  network_id = hcloud_network.k8s-net.id
}

resource "hcloud_server" "master" {
  count       = var.master_count
  name        = "master-${count.index + 1}"
  server_type = var.master_type
  image       = var.master_image
  ssh_keys    = [hcloud_ssh_key.k8s_admin.id]
  location    = var.datacenter_location

  connection {
    host        = self.ipv4_address
    type        = "ssh"
    private_key = file(var.ssh_private_key)
  }

  provisioner "file" {
    source      = "files/10-kubeadm.conf"
    destination = "/root/10-kubeadm.conf"
  }

  provisioner "file" {
    source      = "scripts/bootstrap.sh"
    destination = "/root/bootstrap.sh"
  }

  provisioner "remote-exec" {
    inline = ["DOCKER_VERSION=${var.docker_version} KUBERNETES_VERSION=${var.kubernetes_version} bash /root/bootstrap.sh"]
  }

  provisioner "file" {
    source      = "scripts/master.sh"
    destination = "/root/master.sh"
  }

  provisioner "remote-exec" {
    inline = ["FEATURE_GATES=${var.feature_gates} HCLOUD_API_TOKEN=${var.hcloud_token} bash /root/master.sh"]
  }

  provisioner "local-exec" {
    command = "bash scripts/copy-kubeadm-token.sh"

    environment = {
      SSH_PRIVATE_KEY = var.ssh_private_key
      SSH_USERNAME    = "root"
      SSH_HOST        = hcloud_server.master[0].ipv4_address
      TARGET          = "${path.module}/secrets/"
    }
  }
}

 

constin
()

вопрос по kubernetes. в целом о деплое кода на volume

Не люблю php и всякие wordpress, но так получилось, что есть кейс о том, чтобы их ( их много) автоматически масштабировать, реплицировать и все такое. В данный момент , допустим , они лежат все на docker-compose, сами файлы от worpdress замаунчены в шары. Соответственно есть webhook сервис, который следит за гит сервером и автодеплоит изменения с мастер веток. такой ci/cd на коленке.

Теперь к делу. Поднял я тестовый k8s кластер, чтобы напихать туда эти вордпрессы. Но eсли в python/java/nodejs/ruby мы пихаем наш код в сам докер, то имхо никто никогда не пихает в докер php код. И уж особенно в случае с worpdress. Таким образом под каждый сайт у нас есть 1 под, в котором стоит какой-нить php-fpm или апач, к этом поду примаунчен persistent volume , в котором лежит код wordpress.

Вопрос, а что делать дальше? Как деплоить изменения-то? k8s рассчитан на то, что код лежит в докерах, и при написании новых штук, мы пересобираем докер и деплоим его в k8s. Никто не хранит код в persistent volume. C другой стороны пихать код WP в докер тоже безумие.

А если я буду пихать в под самопильные сервисы с git и webhook , чтобы оним пуш деплой и кидали его в volume, то наифига мне тогда вооьще k8s, если надо строить велосипеда, то я могу обойтись и без k8s.

В общем, такое вот..

 , , ,

constin
()

Список легких( не жрущих ресурсы) сервисов.

Привет. Иногда бывает, что проект маленький, и деньги на ресурсы не безграничны. В тоже время есть плохая тенденция писать код на яве или на рельсах, не заботясь о ресурсах. Ну и самое хреновое в том, что любой проект на яве по умолчанию будет жрать.

Но почти всегда есть легкие замены, зачастую с тем же функционалом.

Например gitlab. Gitlab хочет 4-8 гигов оперативки и 2-4 ядра. Зачем? А если мы идем в gitlab ci, то любой его раннер будет жрать еще + 4 гига. Тогда как, например, gog или gitea выполняют те же функции на одном ядре и 500 метразх оперативки. А если к ним подрубить модули, то они будут делать и CI/CD.

Туда же в топку ELK , который может упасть даже на 16 гигах. Jira - 4 гига. и так далее.

Поделитесь леокими альтернативами.

Например: Gitlab - gitea

 , , ,

constin
()

nginx FastCGI ловит warning от воркеров PHP и пишет их в лог как Error


2020/10/27 16:18:52 [error] 2546#2546: *131 FastCGI sent in stderr: "76
PHP message: PHP   8. require_once() /var/www/******/public/wp-includes/template.php:730
PHP message: PHP Warning:  Use of undefined constant REQUEST_URI - assumed 'REQUEST_URI' (this will throw an Error in a future version of PHP) in /var/www/******/public/wp-content/themes/xxxxremake/footer.php on line 93
PHP message: PHP Stack trace:

Вот на такие ворнинги програмисты кладут болт. А мне не нужны логи засранные этим флудом.

Поэтому я хочу отключить ворниги в логах

location ~ \.php$ {

........
        fastcgi_param PHP_ADMIN_VALUE   "error_reporting=1";
......

    }

Но FastCGI воспринимает warning как ошибку и срет.

Что сделать?

 , ,

constin
()

uwsgi + python + venv + popen - не работает

Привет, пытаюсь написать ресивер для гитовских веб хуков.

Все отлично, но в конце мне надо выполнить команду git pull.

И все работает когда скрипт запущен руками, но когда он запущен из под uwsgi , то все.

Если я использую gitpython, то на uwsgi он выдает fatal: unable to fork Если я использую Popen, то при запуске через uwsgi в stdout тишина и ничего не происходит. но при запуске с консоли все работает.


...

pullcmd = ["/usr/bin/git","--git-dir=/var/www/test-repo/.git,"--work-tree=/var/www/test-repo/","pull"]
    p = subprocess.Popen(pullcmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    print(p.stdout.readline())
    print(p.stderr.readline())
    logging.info(p.stdout.readline())
    logging.info(p.stderr.readline())

# or with gitpython
#g = git.cmd.Git(git_dir)
#try:
    #    g.pull()
    #except git.exc.CommandError as e:
        #print(e)
    #    return json.dumps({'status': str(e)}) , 500

cat app.ini 
[uwsgi]
module = wsgi:app


master = true
processes = 5

socket = /tmp/webhook.sock
chmod-socket = 660
vacuum = true

die-on-term = true
 cat wsgi.py 
#!/usr/bin/env python3



from webhook import app


if __name__ == "__main__":
    app.run()
cat /etc/systemd/system/webhook.service 
[Unit]
Description=uWSGI instance webhook
After=network.target

[Service]
User=www-data
Group=www-data
WorkingDirectory=/opt/webhook
Environment="PATH=/opt/webhook/env/bin"
#Environment="GIT_PYTHON_GIT_EXECUTABLE=/usr/bin/git"
ExecStart=/opt/webhook/env/bin/uwsgi  --ini /opt/webhook/app.ini
#ExecStart=/usr/bin/uwsgi  --ini /opt/webhook/app.ini

[Install]
WantedBy=multi-user.target

 , , , ,

constin
()

нет места в / , хотя оно есть

нет места в руте, хотя оно есть. делал touch /forcefsck с ребутом не помогло. данные:


#df -h
Filesystem      Size  Used Avail Use% Mounted on
udev             10M     0   10M   0% /dev
tmpfs           3.2G  9.2M  3.1G   1% /run
/dev/sda1       9.1G  8.9G     0 100% /
tmpfs           7.8G   57M  7.8G   1% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           7.8G     0  7.8G   0% /sys/fs/cgroup

...

ncdu   --exclude /7200 --exclude /data --exclude /5400 --exclude qnap  /


  793.4MiB [##########] /usr                                                                                                                                                                                          
  407.1MiB [#####     ] /var
  340.9MiB [####      ] /lib
   56.8MiB [          ] /dev
   44.5MiB [          ] /boot
    9.2MiB [          ] /run
    9.0MiB [          ] /bin
    8.3MiB [          ] /sbin
    5.7MiB [          ] /etc
  120.0KiB [          ] /root
  104.0KiB [          ] /home
   32.0KiB [          ] /tmp
e  16.0KiB [          ] /lost+found
    8.0KiB [          ] /media
    4.0KiB [          ] /lib64
e   4.0KiB [          ] /srv
e   4.0KiB [          ] /opt
e   4.0KiB [          ] /mnt
.   0.0  B [          ] /proc
    0.0  B [          ] /sys
<   0.0  B [          ]  qnap
<   0.0  B [          ]  data
<   0.0  B [          ]  7200
<   0.0  B [          ]  5400

#df -i

Filesystem       Inodes IUsed    IFree IUse% Mounted on
udev            2033888   512  2033376    1% /dev
tmpfs           2037215   763  2036452    1% /run
/dev/sda1        610800 52389   558411    9% /
tmpfs           2037215    99  2037116    1% /dev/shm
tmpfs           2037215    17  2037198    1% /run/lock
tmpfs           2037215    16  2037199    1% /sys/fs/cgroup

...

lsof | grep '(deleted)'
monitor    669                  root    7u      REG                8,1          159     390944 /tmp/tmpf7HeckM (deleted)
ovsdb-ser  670                  root    7u      REG                8,1          159     390944 /tmp/tmpf7HeckM (deleted)

 , , , ,

constin
()

Debian использовать тестовый репозиторий только для списка пакетов.

В общем-то все в сабже. Возникла необходимость подключить тестовый репозиторий, но использовать его только для определенных пакетов.

Возможно ли такое?

 , , , ,

constin
()

ansible запустить playbook без хостов, так как хост создается в процессе

Привет, у меня хитрая плейбука.

Она должна работать с lxc контейнером, который не существует на момент запуска.

Первая задача это создание lxc контейнера, которая делигируется на localhost, затем хост созданного контейнера добавляется в инвентори и идет работа с самим контейнером

Примерно так:

- name: Create a started container
  lxd_container:
    name: "{{ lxc_name | default('test-container') }}"
    state: started
    source:
      type: image
      mode: pull
      server: https://images.linuxcontainers.org
      protocol: simplestreams
      alias: ubuntu/xenial/amd64
    profiles: ["test"]
    wait_for_ipv4_addresses: true
    timeout: 600
  delegate_to: 127.0.0.1

- name: register container
    add_host:
      name: "{{ lxc_name | default('test-container') }}"
      ansible_connection: lxd

-name: some task for container
.....

Как ее запустить, указав в инвентори хост, имя которого берется с переменной?

 

constin
()

ansible lxd работа с контейнерами через ansible_connection: lxd

хочу с помощью одной playbook поднимать контейнер и сразу же нагружать его задачами. Но в документации очень все расплывчато и не особо работает.

Вот пример моей тестовой плейбуки:

- hosts: localhost
  connection: local
  tasks:
    - name: Create a profile
      lxd_profile:
        name: test
        config: {}
        description: test
        devices:
            eth0:
                ipv4.address: 10.9.9.10
                name: eth0
                nictype: bridged
                parent: lxdbr0
                type: nic
            root:
                path: /
                pool: default
                type: disk
    - name: Create a started container
      lxd_container:
        name: mycontainer
        state: started
        source:
          type: image
          mode: pull
          server: https://images.linuxcontainers.org
          protocol: simplestreams 
          alias: ubuntu/xenial/amd64
        profiles: ["test"]
        wait_for_ipv4_addresses: true
        timeout: 600

    - name: register container
      add_host:
        name: mycontainer
        ansible_host: localhost:mycontainer
        ansible_connection: lxd

- hosts:
    - mycontainer
  tasks:
    - name: Install packages
      action: apt pkg={{ item }} state=present
      with_items:
        - nginx

она создает профиль и контейнер с этим профилем, но тестовый таск «Install packages» оно не может.

fatal: [mycontainer]: UNREACHABLE! => {"changed": false, "msg": "Authentication or permission failure. In some cases, you may have been able to authenticate and did not have permissions on the target directory. Consider changing the remote tmp path in ansible.cfg to a path rooted in \"/tmp\". Failed command was: ( umask 77 && mkdir -p \"` echo ~/.ansible/tmp/ansible-tmp-1575368853.0-168098739882633 `\" && echo ansible-tmp-1575368853.0-168098739882633=\"` echo ~/.ansible/tmp/ansible-tmp-1575368853.0-168098739882633 `\" ), exited with result 1", "unreachable": true}

Я перебрал довольно много вариантов, как, блин , заставить это работать?

команды типа lxc exec не предлагать, ставить на контейнер sshd и заходить по нему тоже не предлагать - это все костыли.

 , ,

constin
()

RSS подписка на новые темы