У сервера должны быть две сетевые карты:
После установки нового сервера, подключаемся по SSH
Правила межсетевого экрана в файле /etc/firewall.sh
#!/bin/sh fwcmd="/sbin/ipfw" ${fwcmd} -f flush ${fwcmd} add allow ip from any to any via lo0 ${fwcmd} add deny ip from any to 127.0.0.0/8 ${fwcmd} add deny ip from 127.0.0.0/8 to any ${fwcmd} add deny ip from any to ::1 ${fwcmd} add deny ip from ::1 to any ${fwcmd} add allow ipv6-icmp from :: to ff02::/16 ${fwcmd} add allow ipv6-icmp from fe80::/10 to fe80::/10 ${fwcmd} add allow ipv6-icmp from fe80::/10 to ff02::/16 ${fwcmd} add allow ipv6-icmp from any to any ip6 icmp6types 1 ${fwcmd} add allow ipv6-icmp from any to any ip6 icmp6types 2,135,136 ${fwcmd} nat 1 config ip XXX.XXX.XXX.XXX ${fwcmd} add nat 1 ip from 192.168.0.0/24 to any out via vtnet0 ${fwcmd} add nat 1 ip from any to XXX.XXX.XXX.XXX in via vtnet0 ${fwcmd} add allow ip from any to any ${fwcmd} add deny ip from any to any
Устанавливаем права выполнения на скрипт
chmod +x /etc/firewall.sh
Автозапуск межсетевого экрана
echo 'firewall_enable="YES"' >> /etc/rc.conf echo 'firewall_script="/etc/firewall.sh"' >> /etc/rc.conf
Включить прохождение пакетов через шлюз при следующей загрузке
echo 'gateway_enable="YES"' >> /etc/rc.conf
Включить межсетевой экран и NAT после перезагрузки
cat << EOF > /boot/loader.conf ipfw_load="YES" ipfw_nat_load="YES" EOF
Перезагружаем VPS
nano - консольный текстовый редактор, используемый в Linux и многих других UNIX системах.
Открытие файла для редактирования
nano ~/file.txt
После создания или редактирования файла:
Поиск и замена текста
Проблема с принудительным переносом строк в больших файлах
Внести в файл ~/.nanorc строку
set nowrap
Оригинал статьи: http://vbs.pp.ua/ceph.html
Будет рассмотрена работа с блочными устройствами (RBD) и распредененной файловой системой (CephFS).
Конфиг кластера:
Устанавливаем на все ноды кластера ntp
и импортируем ssh ключи для беспарольного доступа пользователю root
:
[root@ceph1 ~]# ssh-keygen [root@ceph1 ~]# ssh-copy-id ceph2
Добавляем необходимые репы на ноду с которой будем запускать ceph-deploy
:
root # yum install -y yum-utils
root #yum-config-manager --add-repo https://dl.fedoraproject.org/pub/epel/7/x86_64/
root #yum install --nogpgcheck -y epel-release
root #rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
root # rm /etc/yum.repos.d/dl.fedoraproject.org*
Создаем репу Ceph релиз jewel для CentOS 7
[root@ceph1 ~]# vim /etc/yum.repos.d/ceph.repo [ceph-noarch] name=Ceph noarch packages baseurl=http://download.ceph.com/rpm-jewel/el7/noarch enabled=1 gpgcheck=1 type=rpm-md gpgkey=https://download.ceph.com/keys/release.asc
Устанавливаем ceph-deploy
[root@ceph1 ~]# yum update && sudo yum install ceph-deploy
Создаем директорию для размещения конфигов кластера при деплое
[root@ceph1 ~]# mkdir mycluster [root@ceph1 ~]# cd mycluster
Создаем непосредственно кластер ceph
[root@ceph1 mycluster]# ceph-deploy new ceph1
Добавляем в файл ceph.conf
в директории mycluster
следующие строки:
public network = 172.22.12.0/24 osd pool default size = 2 osd_crush_update_on_start = false<
У вас должно получится что-то вроде этого:
[root@ceph1 mycluster]# cat ceph.conf [global] fsid = 11d81bd3-fd49-4169-b38c-bfaa475ab1b5 mon_initial_members = ceph1 mon_host = 172.22.12.31 auth_cluster_required = cephx auth_service_required = cephx auth_client_required = cephx public network = 172.22.12.0/24 osd pool default size = 2 osd_crush_update_on_start = false
Остановимся на том беспределе, что мы внесли в конфиг. Строка public network = 172.22.12.0/24
указывает кластеру менеджмент сеть. По ней так же будет осуществляться и репликация данных между нодами. В боевых системах стоит разделять эти вещи в разные сети и вешать на разные сетевые интерфейсы. Строка osd pool default size = 2
говорит о том, что мы будем использовать репликацию с коэффициентом 2, по умолчанию ceph использует реплику 3, но так как у нас всего две ноды и реплика будет идти между ними, то выбор очевиден. Последняя запись osd_crush_update_on_start = false
запрещает ceph управлять CRUSH картой кластера. Ее мы будем править руками и импортировать в кластер.
Так как я запускаю ceph-deploy
с ноды кластера, то нужно закоментить репу ceph, чтобы при установке основных пакетов скрипт правильно отработал. Если вы запускаете деплой со своего ноута или PC, тогда этот шаг можно пропустить.
[root@ceph1 mycluster]# mv /etc/yum.repos.d/ceph.repo /etc/yum.repos.d/ceph.repo.old
Устанавливаем ceph на ноды ceph1 и ceph2 явно указывая версию кластера --release jewel
[root@ceph1 mycluster]# ceph-deploy install --release jewel ceph{1,2}
Если все прошло успешно, устанавливаем монитор mon
и создаем ключи для ceph. Монитор в нашем случае один, так как для создания кворума нужно нечетное число мониторов, а нод у нас всего две. Но для тестов пойдет. Главное, когда будете ломать кластер не убивайте ноду с монитором или не останавливайте сервис ceph.mon
. Или добавьте еще одну ноду без дисков и разместите на ней монитор и на второй ноде с дисками. Итого у вас будет их три, тогда и ломайте.
[root@ceph1 mycluster]# ceph-deploy mon create-initial
Создаем osd
, т.е. включаем наши диски, выделенные для данных на нодах в кластер. В моем случае я использую диски vdb и vdc на обеих нодах. Журналы osd
у меня будут хранится на тех же дисках, ceph автоматом создаст под них партиции. Можно конечно скормить и директории в системе в роли дисков, но для удобства, я рекомендую под osd
отдавать непосредственно сам диск или на крайний случай lvm.
[root@ceph1 mycluster]# ceph-deploy osd create --zap-disk ceph{1,2}:vd{b,c}
Данная команда сотрет все данные с дисков и отформатирует их в xfs.
Копируем конфиг ceph который мы заполняли в самом начале в файле ceph.conf
на все наши ноды кластера командой:
[root@ceph1 mycluster]# ceph-deploy admin ceph{1,2}
Тепрь займемся созданием CRUSH карты. Вытягиваем текущую карту кластера командой:
[root@ceph1 mycluster]# ceph osd getcrushmap -o map.current
Декомпилируем ее в человеческий формат:
[root@ceph1 mycluster]# crushtool -d map.current -o map.decompile
И приводим ее к такому виду:
[root@ceph1 mycluster]# cat map.decompile # begin crush map tunable choose_local_tries 0 tunable choose_local_fallback_tries 0 tunable choose_total_tries 50 tunable chooseleaf_descend_once 1 tunable chooseleaf_vary_r 1 tunable straw_calc_version 1 # devices device 0 osd.0 device 1 osd.1 device 2 osd.2 device 3 osd.3 # types type 0 osd type 1 host type 2 chassis type 3 rack type 4 row type 5 pdu type 6 pod type 7 room type 8 datacenter type 9 region type 10 root # buckets host ceph1 { id -1 alg straw hash 0 # rjenkins1 item osd.0 weight 0.010 item osd.1 weight 0.010 } host ceph2 { id -2 alg straw hash 0 # rjenkins1 item osd.2 weight 0.010 item osd.3 weight 0.010 } root default { id -3 # do not change unnecessarily # weight 0.000 alg straw hash 0 # rjenkins1 item ceph1 weight 0.020 item ceph2 weight 0.020 } # rules rule replicated_ruleset { ruleset 0 type replicated min_size 1 max_size 10 step take default step chooseleaf firstn 0 type host step emit } # end crush map
Компилируем ее обратно и скармливаем ceph:
[root@ceph1 mycluster]# crushtool -c map.decompile -o map.new [root@ceph1 mycluster]# ceph osd setcrushmap -i map.new
Проверяем состояние кластера командой ceph -s
. Через какоето время он перестроит pg
и вывод будет примерно таким:
[root@ceph1 mycluster]# ceph -s cluster 11d81bd3-fd49-4169-b38c-bfaa475ab1b5 health HEALTH_OK monmap e1: 1 mons at {ceph1=172.22.12.31:6789/0} election epoch 3, quorum 0 ceph1 osdmap e11: 4 osds: 4 up, 4 in flags sortbitwise pgmap v42: 64 pgs, 1 pools, 0 bytes data, 0 objects 131 MB used, 20304 MB / 20435 MB avail 64 active+clean
Чтобы проверить карту osd сделаем так:
[root@ceph1 mycluster]# ceph osd tree ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY -3 0.03998 root default -1 0.01999 host ceph1 0 0.00999 osd.0 up 1.00000 1.00000 1 0.00999 osd.1 up 1.00000 1.00000 -2 0.01999 host ceph2 2 0.00999 osd.2 up 1.00000 1.00000 3 0.00999 osd.3 up 1.00000 1.00000
Здесь мы видим что все osd, они же диски имеют статус UP и относятся нужным нодам, согласно нашей crush карте. На этом создание кластера закончено. Далее будем создавать пулы RBD и CephFS.
Для функционирование распределенной файловой системы служат серверы mds
. на них хранятся метаданные. В нашем случае мы создадим два сервера метаданных на обеих нодах в режиме standby_replay (главный и запасной). В случае отказа основного mds его роль подхватит второй. Важное замечание: в нашей тестовой схеме только один сервер мониторов mon
, поэтому важно обеспечить его доступность. В продакшене у вас должно быть три и более монитора. Еще одно замечание: если у вас вдруг будут недоступны сера mds, то файловые операции просто застопорятся. При восстановлении работы сервера метаданных - система продолжит работу.
Создадим сервера MDS на ceph1
и ceph2
:
[root@ceph1 mycluster]# ceph-deploy mds create ceph{1,2}
Создадим пулы для данных и метаданных в кластере для нашей файловой системы:
[root@ceph1 mycluster]# ceph osd pool create cephfs_data 64 pool 'cephfs_data' created [root@ceph1 mycluster]# ceph osd pool create cephfs_metadata 64 pool 'cephfs_metadata' created
Если посмотреть состояние кластера после создание пулов, то будем иметь следующую картину:
[root@ceph1 mycluster]# ceph -s cluster 11d81bd3-fd49-4169-b38c-bfaa475ab1b5 health HEALTH_ERR 64 pgs are stuck inactive for more than 300 seconds 17 pgs peering 64 pgs stuck inactive monmap e1: 1 mons at {ceph1=172.22.12.31:6789/0} election epoch 3, quorum 0 ceph1 osdmap e15: 4 osds: 4 up, 4 in flags sortbitwise pgmap v119: 192 pgs, 3 pools, 0 bytes data, 0 objects 133 MB used, 20302 MB / 20435 MB avail 128 active+clean 47 creating+activating 17 creating+peering
В данный момент кластер занят ребалансировкой и созданием pg. Через несколько секунд снова проверяем статус и видим что все ок:
[root@ceph1 mycluster]# ceph -s cluster 11d81bd3-fd49-4169-b38c-bfaa475ab1b5 health HEALTH_OK
Установим пулам cephfs_data и cephfs_metadata режим реплики size 2
, обеспечим работу кластера в режиме деградации пока доступна хотя бы одна копия данных в пуле min_size 1
и укажем правило репликации pg crush_ruleset 0
согласно нашей crush карте, что значит реплицировать пул между хостами кластера.
[root@ceph1 mycluster]# ceph osd pool set cephfs_data size 2 set pool 1 size to 2 [root@ceph1 mycluster]# ceph osd pool set cephfs_data min_size 1 set pool 1 min_size to 1 [root@ceph1 mycluster]# ceph osd pool set cephfs_data crush_ruleset 0 set pool 1 crush_ruleset to 0 [root@ceph1 mycluster]# ceph osd pool set cephfs_metadata size 2 set pool 2 size to 2 [root@ceph1 mycluster]# ceph osd pool set cephfs_metadata min_size 1 set pool 2 min_size to 1 [root@ceph1 mycluster]# ceph osd pool set cephfs_metadata crush_ruleset 0 set pool 2 crush_ruleset to 0
Создаем нашу файловую систему:
root@ceph1 mycluster]# ceph fs new cephfs cephfs_metadata cephfs_data
Посмотрим на состояние кластера и увидим, что файловая система создалась
[root@ceph1 mycluster]# ceph -s cluster 11d81bd3-fd49-4169-b38c-bfaa475ab1b5 health HEALTH_OK monmap e1: 1 mons at {ceph1=172.22.12.31:6789/0} election epoch 3, quorum 0 ceph1 fsmap e6: 1/1/1 up {0=ceph2=up:active}, 1 up:standby osdmap e22: 4 osds: 4 up, 4 in flags sortbitwise pgmap v179: 192 pgs, 3 pools, 2068 bytes data, 20 objects 135 MB used, 20300 MB / 20435 MB avail 192 active+clean
Проверим статус наших серверов метаданных:
[root@ceph1 mycluster]# ceph mds stat e6: 1/1/1 up {0=ceph2=up:active}, 1 up:standby
Нам сообщают, что в данный момент активен mds на ноде ceph2 и второй (ceph1) в режиме standby. Если погасить сервис mds на ноде ceph2, то активным станет mds на ceph1.
[root@ceph1 mycluster]# ceph mds stat e11: 1/1/1 up {0=ceph1=up:active}
Перейдем к созданию пользователя для аутентификации при монтировании файловой системы на клиентах, так как делать это от админа не очень хорошо в целях безопасности. Дадим пользователю cephfs права на чтение из mon и mds и полные права на пулы cephfs_data
и cephfs_metadata
[root@ceph1 mycluster]# ceph auth get-or-create client.cephfs mon 'allow r' mds 'allow r' osd 'allow rwx pool=cephfs_metadata,allow rwx pool=cephfs_data' -o /etc/ceph/client.cephfs.keyring
У вас должен был создаться новый пользователь в кластере:
[root@ceph1 mycluster]# ceph auth list client.cephfs key: AQBdX0NXobyACBAArLIkcDRrAHYEDc3izToMnA== caps: [mds] allow r caps: [mon] allow r caps: [osd] allow rwx pool=cephfs_metadata,allow rwx pool=cephfs_data
Монтировать будем через модуль ядра. Для этого нам нужно установить недостающие пакеты на клиенте:
root@client ~ # yum update&&yum install ceph-fs-common
Создадим файл ключа пользователя cephfs для монтирования FS на клиенте и директорию для монтирования /mnt/cephfs
:
root@client ~ # mkdir -p /etc/ceph root@client ~ # echo "AQBdX0NXobyACBAArLIkcDRrAHYEDc3izToMnA==" > /etc/ceph/cephfskey root@client ~ # sudo mkdir /mnt/cephfs
В отличии от glusterfs в cephfs можно монтировать сразу директории из корневой fs. В нашем случае у нас их пока нет, поэтому понтируем корень. Команда имеет следующий формат mount -t ceph [mon_ip_or_fqdn]:[mon_port]:/ /mnt/cephfs/ -o name=cephfs,secretfile=[path_secretfile]. Порт монитора можно опустить, так как он стандартный:
mount -t ceph 172.22.12.31:/ /mnt/cephfs/ -o name=cephfs,secretfile=/etc/ceph/cephfskey
Смотрим вывод dh -h и видим, что cephfs примонтирована и ее текущий размер 20GB. Это полезный объем данных, сырой объем в кластере 20GB (4 osd по 10GB реплика 2):
Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 6.7G 1.4G 5.4G 21% / devtmpfs 235M 0 235M 0% /dev tmpfs 245M 0 245M 0% /dev/shm tmpfs 245M 4.4M 241M 2% /run tmpfs 245M 0 245M 0% /sys/fs/cgroup /dev/vda1 497M 165M 332M 34% /boot tmpfs 49M 0 49M 0% /run/user/0 172.22.12.31:/ 20G 132M 20G 1% /mnt/cephfs
Собственно можно пользоваться и проводить тесты.
При создании кластера ceph по умолчанию создается пул rbd. С ним мы и будем работать. Вы можете создать отдельный пул или несколько для работы с libvirt, все зависит от ваших нужд. К примеру пул для gold image и пул для vm image. В пулах мы будем размещать блочные устройства и отдавать виртуалкам в виде дисков и получить кучу плюсов. Помимо надёжности и производительности RBD также предоставляет функциональность корпоративного уровня подобную полным и инкрементальным снимкам, динамичному выделению (thin provisioning), клонированию копированием при записи (copy on write), динамическое изменение размеров и тому подобное. RBD также поддерживает кеширование в памяти.
Вернемся на любую из нод кластера и посмотрим статистику занятого места по пулам:
[root@ceph1 mycluster]# ceph df GLOBAL: SIZE AVAIL RAW USED %RAW USED 20435M 20300M 135M 0.66 POOLS: NAME ID USED %USED MAX AVAIL OBJECTS rbd 0 0 0 10150M 0 cephfs_data 1 0 0 10150M 0 cephfs_metadata 2 2378 0 10150M 20
Мы видим три пула: rbd, cephfs_data, cephfs_metadata которые имеют одинаковую емкость. Это обусловлено тем, что каждому пулу изначально доступно все место в кластере. Расширяя объем кластера - вы автоматически расширяете все пулы. Хорошо это или плохо - решать вам.
Теперь перейдем к созданию пользователя libvirt в ceph. Тут все аналогично как и с cephfs, только мы не указываем права на mds, так как для работы блочных устройств сервер метаданных не нужен. Даем права на чтение из mon и полные права на пул rbd. прошу обратить внимание, что пулы которые мы создали для cephfs не будут доступны пользователю libvirt. Это хорошо и правильно.
root@ceph1 mycluster]# ceph auth get-or-create client.libvirt mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=rbd' [client.libvirt] key = AQCsY0NXYEbzFhAAS/JicyexWrrcnVm0XUFEeA==
Создадим блочное устройство в пуле rbd размером 10G:
[root@ceph1 mycluster]# rbd create rbd/vm-test.img --size 10G [root@ceph1 mycluster]# rbd ls -p rbd vm-test.img
Если посмотреть информацию по vm-test.img
то увидим, что оно не занимает место на диске. Это дополнительная плюшка ceph, которая и реализует thin provisioning
[root@ceph1 mycluster]# rbd info vm-test.img -p rbd rbd image 'vm-test.img': size 10240 MB in 2560 objects order 22 (4096 kB objects) block_name_prefix: rbd_data.10502ae8944a format: 2 features: layering, exclusive-lock, object-map, fast-diff, deep-flatten flags: [root@ceph1 mycluster]# rbd du vm-test.img -p rbd NAME PROVISIONED USED vm-test.img 10240M 0
Идем на гипервизор и создаем файл секрета для доступа libvirt к ceph rbd:
cat > secret.xml <<EOF <secret ephemeral='no' private='no'> <usage type='ceph'> <name>client.libvirt secret</name> </usage> </secret> EOF
Импортируем файл через virsh
:
[root@ceph1 mycluster]# virsh secret-define --file secret.xml Secret 36607386-41fe-4730-9c13-624081e5d21a created
Устанавливаем ключ пользователя libvirt из ceph который мы получили выше:
[root@ceph1 mycluster]# sudo virsh secret-set-value --secret 36607386-41fe-4730-9c13-624081e5d21a --base64 AQCsY0NXYEbzFhAAS/JicyexWrrcnVm0XUFEeA== Secret value set [root@ceph1 mycluster]# sudo virsh secret-list UUID Usage -------------------------------------------------------------------------------- 36607386-41fe-4730-9c13-624081e5d21a ceph client.libvirt secret
Правим конфиг виртуалки через virsh edit vm-test
, которой хотим отдать блочное устройство из ceph
<disk type='network' device='disk'> <source protocol='rbd' name='rbd/vm-test.img'> <host name='172.22.12.31' port='6789'/> </source> <auth username='libvirt'> <secret type='ceph' uuid='36607386-41fe-4730-9c13-624081e5d21a'/≶ </auth> <target dev='vda' bus='virtio'/> </disk>
Небольшое пояснение: <source protocol='rbd' name='rbd/vm-test.img'>
сообщает, что мы будем использовать блочное устройство с именем vm-test.img которое находится в пуле rbd. Пул и rbd диск должен существовать (и то и другое было создано выше). Указываем наш монитор <host name='172.22.12.31' port='6789'/>
. Их должно быть столько же, сколько у нас мониторов. Реализуется просто добавлением аналогичных строк в секции <source></source>
. Тут мы передаем указатель на секрет, созданный выше <secret type='ceph' uuid='36607386-41fe-4730-9c13-624081e5d21a'/>
.
Если у вас гипервизор находится на ноде, которая не входит в кластер ceph, то придется установить пакеты ceph для обеспечения работы. Нормальной практикой считается совмещение ролей compute и storage на одной ноде с целью уплотнения потребления ресурсов, энергии и места в стойке.
На этом все, спасибо за внимание и всем кто дошел до конца статьи. Понадобилось много терпения чтобы дописать ее до конца.
Подготовил Величко Алексей https://vk.com/tureckij. Копирование материалов только со ссылкой на автора. 2016
После установки нового сервера, подключаемся по SSH и обновляем список пакетов
pkg update
Устанавливаем пакет mpd5
pkg install mpd5
Добавляем mpd5 в автозапуск
echo 'mpd_enable="YES"' >> /etc/rc.conf
Добавляем конфигурационный файл /usr/local/etc/mpd5/mpd.conf
startup: default: load l2tp_server l2tp_server: # # Define dynamic IP address pool. set ippool add pool1 10.10.2.20 10.10.2.254 # Create clonable bundle template named B create bundle template B set iface enable proxy-arp set iface idle 1800 set iface enable tcpmssfix set iface route 10.10.2.1 set iface up-script /usr/local/etc/mpd5/l2tp_server_up.py set iface down-script /usr/local/etc/mpd5/l2tp_server_down.py set ipcp yes vjcomp # Specify IP address pool for dynamic assigment. set ipcp ranges 10.10.2.1/24 ippool pool1 set ipcp dns 10.10.2.1 # The five lines below enable Microsoft Point-to-Point encryption # (MPPE) using the ng_mppc(8) netgraph node type. set bundle enable compression set ccp yes mppc set mppc yes e40 set mppc yes e128 set mppc yes stateless # Create clonable link template named L create link template L l2tp # Set bundle template to use set link action bundle B # Multilink adds some overhead, but gives full 1500 MTU. set link enable multilink set link yes acfcomp protocomp set link no pap chap set link enable chap set link enable chap-msv1 set link enable chap-msv2 set link keep-alive 10 60 # We reducing link mtu to avoid GRE packet fragmentation set link mtu 1460 # Configure l2tp # IP set l2tp self 0.0.0.0 # Allow to accept calls set link enable incoming
Добавляем тестового пользователя в файл /usr/local/etc/mpd5/mpd.secret
user password
Дополнительных пользователей добавляем сюда же следующими строками
Устанавливаем интерпретатор Python 3.6 для работы скриптов. Это необязательный шаг, но работать через Python удобнее
pkg install python36
Добавить скрипты
Скрипт, выполняемый при подключении к серверу клиента: /usr/local/etc/mpd5/l2tp_server_up.py
#!/usr/bin/env python3.6 __author__ = 'RemiZOffAlex' __email__ = 'remizoffalex@mail.ru' import sys import logging logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) handler = logging.FileHandler( '/var/log/vpn-users.log', encoding = "UTF-8" ) formatter = logging.Formatter('[%(asctime)s] %(message)s') handler.setFormatter(formatter) logger.addHandler(handler) logger.info( 'Пользователь [{}] подключился и получил IP: {}'.format( sys.argv[5], sys.argv[4] ) )
Скрипт, выполняемый при отключении от сервера клиента: /usr/local/etc/mpd5/l2tp_server_down.py
#!/usr/bin/env python3 __author__ = 'RemiZOffAlex' __email__ = 'remizoffalex@mail.ru' import sys import logging logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) handler = logging.FileHandler( '/var/log/vpn-users.log', encoding = "UTF-8" ) formatter = logging.Formatter('[%(asctime)s] %(message)s') handler.setFormatter(formatter) logger.addHandler(handler) logger.info( 'Пользователь [{}] отключился'.format( sys.argv[5] ) )
Устанавливаем права выполнения на скрипты
chmod +x /usr/local/etc/mpd5/l2tp_server_up.py /usr/local/etc/mpd5/l2tp_server_down.py
Правила межсетевого экрана в файле /etc/firewall.sh
#!/bin/sh fwcmd="/sbin/ipfw" ${fwcmd} -f flush ${fwcmd} add allow ip from any to any via lo0 ${fwcmd} add deny ip from any to 127.0.0.0/8 ${fwcmd} add deny ip from 127.0.0.0/8 to any ${fwcmd} add deny ip from any to ::1 ${fwcmd} add deny ip from ::1 to any ${fwcmd} add allow ipv6-icmp from :: to ff02::/16 ${fwcmd} add allow ipv6-icmp from fe80::/10 to fe80::/10 ${fwcmd} add allow ipv6-icmp from fe80::/10 to ff02::/16 ${fwcmd} add allow ipv6-icmp from any to any ip6 icmp6types 1 ${fwcmd} add allow ipv6-icmp from any to any ip6 icmp6types 2,135,136 ${fwcmd} nat 1 config ip XXX.XXX.XXX.XXX ${fwcmd} add nat 1 ip from 10.10.2.1/24 to any out via vtnet0 ${fwcmd} add nat 1 ip from any to XXX.XXX.XXX.XXX in via vtnet0 ${fwcmd} add allow ip from any to any ${fwcmd} add deny ip from any to any
Устанавливаем права выполнения на скрипт
chmod +x /etc/firewall.sh
Автозапуск межсетевого экрана
echo 'firewall_enable="YES"' >> /etc/rc.conf echo 'firewall_script="/etc/firewall.sh"' >> /etc/rc.conf
Включить прохождение пакетов через шлюз при следующей загрузке
echo 'gateway_enable="YES"' >> /etc/rc.conf
Включить межсетевой экран и NAT после перезагрузки
cat << EOF > /boot/loader.conf ipfw_load="YES" ipfw_nat_load="YES" EOF
Перезагружаем VPS
Alembic - инструмент, использующий SQLAlchemy в качестве движка, для управления базой данных как на уровне SQL запросов, так и с помощью сценариев. Хорошо подходит для миграций и версионирования.
cd yourproject alembic init alembic
В файле alembic.ini указываем путь до файла базы данных sqlite3
sqlalchemy.url = sqlite:////home/USERNAME/app/data/db.sqlite3
Открываем файл env.py и ищем строку:
target_metadata = None
Изменяем её на:
# Импорт вышестоящего каталога import os import sys sys.path.insert(0, '/'.join(os.path.dirname(os.path.abspath(__file__)).split('/')[:-1])) from myapp.mymodel import Base target_metadata = Base.metadata
где:
alembic revision --autogenerate -m "Структура БД"
alembic upgrade head
Выдаёт сырой SQL код
alembic upgrade head --sql
alembic revision -m "Add a column"
alembic -c alembic.ini history
mako.exceptions.CompileException: Unicode decode operation of encoding 'ascii' failed in file 'alembic/script.py.mako' at line: 0 char: 0
Добавить в alembic/script.py.mako первой строкой
# -*- coding: UTF-8 -*-