TimeWeb. Создание и удаление сервера
Для запуска Claude Code (Open Code) требуется достаточно мощный сервер (минимум 2 vCPU и 4 ГБ оперативной памяти), который стоит недешево. Но можно создавать такой сервер утром, перед началом работы. И удалять вечером, когда рабочий день закончился. Вечером, перед удалением сервера — создавать образ диска. Утром — восстанавливать состояние из этого образа.
Для решения задачи потребуется сервер-диспетчер (24/7), который будет отправлять команды в облако с помощью утилиты командной строки twc-cli от Timeweb Cloud (документация).
Подготовка «Диспетчера» (ПК или сервер)
Шаг 1. Выпустить API-токен в панели управления Timeweb Cloud в разделе «API и Terraform».
Шаг 2. Установить pipx (нужен Python) на управляющий компьютер/сервер
$ sudo apt update $ sudo apt install pipx $ pipx ensurepath
Команда pipx ensurepath выполняет настройку путей (переменная PATH), чтобы операционная система знала, где искать установленные через pipx утилиты.
Шаг 3. Установить консольную утилиту на управляющий компьютер/сервер
$ pipx install twc-cli $ source ~/.bashrc $ twc --version
Шаг 4. Авторизовать утилиту с помощью созданного на первом шаге токена
$ twc config
Create new configuration file. Enter your API token.
Token: токен
Done! Configuration is saved in /home/evgeniy/.twcrc
Шаг 5. Узнать идентификаторы ресурсов на аккаунте с помощью команд
$ twc server list
ID NAME REGION STATUS IPV4 1111111 Сервер one nl-1 on 111.111.111.111 2222222 Сервер two nl-1 on 222.222.222.222
$ twc ip list
IP PTR ZONE ANTI_DDOS USED_ON 111.111.111.111 None ams-1 False server:1111111 222.222.222.222 None ams-1 False server:2222222
Автоматическое создание сервера
Создаем на управляющей машине скрипт server_start.sh, который будет разворачивать сервер из последнего созданного снапшота и привязывать к нему постоянный IP-адрес.
$ nano /usr/local/bin/server_start.sh
#!/bin/bash # Настройки MY_STATIC_IP='123.123.123.123' # Постоянный IP-адрес SERVER_NAME='Claude Code NL' # Название сервера PRESET_ID='3346' # Идентификатор пресета REGION_ID='nl-1' # Локация сервера echo '1. Проверка: сервер с таким именем уже существует?' EXISTING_ID=$(twc server list --output json | jq -r --arg NAME "$SERVER_NAME" \ '.servers[] | select(.name==$NAME) | .id') if [ -n "$EXISTING_ID" ] && [ "$EXISTING_ID" != "null" ]; then echo "Сервер '$SERVER_NAME' уже существует (ID: $EXISTING_ID). Выход." exit 0 fi echo '2. Поиск самого свежего автоматического образа...' JSON_FILTER='[.images[] | select(.name | startswith("Auto-Backup-CCNL"))] | sort_by(.created_at) | last | .id' IMAGE_UUID=$(twc image list --output json | jq -r "$JSON_FILTER") if [ -z "$IMAGE_UUID" ] || [ "$IMAGE_UUID" = "null" ]; then echo 'Ошибка: Свежий образ Auto-Backup-CCNL не найден в аккаунте!' exit 1 fi echo "Найден образ ID: $IMAGE_UUID" echo '3. Создание нового сервера из сохраненного образа...' NEW_SERVER_ID=$(twc server create --name "$SERVER_NAME" --image "$IMAGE_UUID" \ --public-ip "$MY_STATIC_IP" --preset-id $PRESET_ID --region "$REGION_ID" \ --output json | jq -r '.server.id') if [ -z "$NEW_SERVER_ID" ] || [ "$NEW_SERVER_ID" = "null" ]; then echo 'Ошибка создания сервера!' exit 1 fi echo "Сервер успешно инициализирован. Получен ID: $NEW_SERVER_ID" echo '4. Ожидание перехода сервера в статус готовности...' ATTEMPT=0 MAX_ATTEMPTS=20 while [ $ATTEMPT -lt $MAX_ATTEMPTS ]; do STATUS=$(twc server get $NEW_SERVER_ID --output json | jq -r '.server.status') if [ "$STATUS" = "on" ]; then echo 'Сервер готов, продолжаем...' break fi ATTEMPT=$((ATTEMPT + 1)) echo "Попытка $ATTEMPT из $MAX_ATTEMPTS. Статус: [$STATUS]. Ждём..." sleep 15 done if [ $ATTEMPT -ge $MAX_ATTEMPTS ]; then echo 'Ошибка: сервер не запустился за отведённое время.' exit 1 fi echo '=== УТРЕННИЙ ПРОЦЕСС ЗАВЕРШЕН ==='
$ chmod +x /usr/local/bin/server_start.sh
Автоматическое удаление сервера
Создаем скрипт server_stop.sh, который создает актуальный снимок системы, дожидается завершения операции и полностью удаляет сервер, чтобы за него перестали списываться деньги (при этом IP-адрес сохраняется).
$ nano /usr/local/bin/server_stop.sh
#!/bin/bash # Настройки MY_STATIC_IP='123.123.123.123' SERVER_NAME='Claude Code NL' IMAGE_NAME="Auto-Backup-CCNL-$(date +%F)" echo '1. Поиск ID сервера по имени...' SERVER_ID=$(twc server list --output json | \ jq -r --arg NAME "$SERVER_NAME" '.servers[] | select(.name==$NAME) | .id') if [ -z "$SERVER_ID" ] || [ "$SERVER_ID" = "null" ]; then echo "Ошибка: Сервер '$SERVER_NAME' не найден." exit 1 fi echo "Успешно. ID Сервера: $SERVER_ID" echo '2. Получение ID жесткого диска...' DISK_ID=$(twc server disk list $SERVER_ID --output json | \ jq -r '.server_disks[] | select(.is_system==true) | .id') if [ -z "$DISK_ID" ] || [ "$DISK_ID" = "null" ]; then echo 'Ошибка: Диск сервера не найден.' exit 1 fi echo "Успешно. ID Диска: $DISK_ID" echo '3. Остановка сервера перед созданием образа...' twc server stop $SERVER_ID # Ожидание полной остановки ATTEMPT=0 MAX_ATTEMPTS=10 while [ $ATTEMPT -lt $MAX_ATTEMPTS ]; do STATUS=$(twc server get $SERVER_ID --output json | jq -r '.server.status') if [ "$STATUS" = "off" ]; then echo 'Сервер остановлен, продолжаем...' break fi ATTEMPT=$((ATTEMPT + 1)) echo "Попытка $ATTEMPT из $MAX_ATTEMPTS. Статус: [$STATUS]. Ждём..." sleep 10 done if [ $ATTEMPT -ge $MAX_ATTEMPTS ]; then echo 'Ошибка: сервер не остановился за отведённое время.' echo 'Образ НЕ будет создан в целях безопасности данных.' exit 1 fi echo '4. Запуск асинхронного создания образа...' NEW_IMAGE_ID=$(twc image create $DISK_ID --name "$IMAGE_NAME" --output json | jq -r '.image.id') echo "Задача отправлена в облако. ID нового образа: $NEW_IMAGE_ID" echo '5. Ожидание завершения копирования (с защитой от зависания)...' ATTEMPT=0 MAX_ATTEMPTS=20 while [ $ATTEMPT -lt $MAX_ATTEMPTS ]; do RAW=$(twc image get $NEW_IMAGE_ID --output json) STATUS=$(echo "$RAW" | jq -r '.image.status // .status // empty') if [ "$STATUS" = "created" ]; then echo 'Образ успешно создан, можно продолжать...' break elif [ "$STATUS" = "new" ] || [ "$STATUS" = "creating" ] || [ "$STATUS" = "queued" ]; then ATTEMPT=$((ATTEMPT + 1)) echo "Попытка $ATTEMPT из $MAX_ATTEMPTS. Статус: [$STATUS]. Ждём..." sleep 30 else echo "Неожиданный статус: [$STATUS]. Сырой ответ API:" echo "$RAW" echo 'Сервер НЕ будет удален.' exit 1 fi done # Если вышли из цикла по тайм-ауту, а не по успеху if [ $ATTEMPT -ge $MAX_ATTEMPTS ]; then echo 'Ошибка: Превышено время ожидания создания образа (10 минут). Операция прервана.' echo 'Сервер НЕ будет удален в целях безопасности данных.' exit 1 fi echo '6. Безопасное удаление сервера (IP останется на аккаунте)...' twc server remove --keep-public-ip --yes $SERVER_ID echo '7. Очистка: удаление устаревших автоматических образов...' # Находим ID самого свежего образа (он уже создан на шаге 4) # Удаляем все Auto-Backup образы КРОМЕ только что созданного OLD_IMAGE_IDS=$(twc image list --output json | jq -r --arg KEEP "$NEW_IMAGE_ID" \ '.images[] | select(.name | startswith("Auto-Backup-CCNL")) | select(.id != $KEEP) | .id') for OLD_ID in $OLD_IMAGE_IDS; do echo "Удаление устаревшего образа: $OLD_ID" twc image remove $OLD_ID --yes done echo '=== ВЕЧЕРНИЙ ПРОЦЕСС ЗАВЕРШЕН ==='
$ chmod +x /usr/local/bin/server_stop.sh
Добавление скриптов в cron
На управляющей машине добавляем в cron запуск скриптов в 8:55 утра и 18:05 вечера.
$ crontab -e
# Каждый день в 08:55 утра создавать и запускать сервер 55 08 * * * /usr/local/bin/server_start.sh # Каждый день в 18:05 вечера сохранять и удалять сервер 05 18 * * * /usr/local/bin/server_stop.sh
Утилита командной строки twc-cli
Утилита twc-cli полностью дублирует возможности веб-панели Timeweb Cloud. Она позволяет управлять серверами, дисками, сетями, базами данных и бэкапами через обычные консольные команды. Ответы можно получать как в виде читаемых таблиц, так и в формате JSON для автоматизации.
1. Справка по утилите twc-cli
Общая справка по всем командам
$ twc --help
Usage: twc [OPTIONS] COMMAND [ARGS]...
CLI for Timeweb Cloud services.
Options:
--version Show version and exit.
-v, --verbose Enable verbose mode.
-c, --config FILE Use config.
-p, --profile NAME Use profile.
--install-completion Install completion for the current shell.
--show-completion Show completion for the current shell, to copy it or
customize the installation.
-h, --help Show this message and exit.
Commands:
account Manage Timeweb Cloud account.
apps Manage apps.
balancer Manage load balancers. (aliases: balancers, lb)
cluster Manage Kubernetes clusters. (aliases: clusters, kubernetes, k8s)
config Manage CLI configuration.
database Manage databases. (aliases: databases, db)
domain Manage domains and DNS records. (aliases: domains, d)
firewall Manage Cloud Firewall rules and groups. (aliases: fw)
image Manage disk images. (aliases: images, i)
ip Manage floating IPs. (aliases: ips)
project Manage projects. (aliases: projects, p)
server Manage Cloud Servers. (aliases: servers, s)
ssh-key Manage SSH-keys. (aliases: ssh-keys, k)
storage Manage object storage buckets. (aliases: storages, s3)
version Show version and exit.
vpc Manage virtual networks
Подробная справка по одной команде
$ twc command --help
2. Команда twc server
Общая справка по команде twc server
$ twc server --help
Usage: twc server [OPTIONS] COMMAND [ARGS]...
Manage Cloud Servers.
Options:
-h, --help Show this message and exit.
Commands:
backup Manage Cloud Server disk backups.
boot Boot Cloud Server. (aliases: start)
clone Clone Cloud Server.
create Create Cloud Server.
dash Open Cloud Server dashboard in web browser.
disk Manage Cloud Server disks.
get Get Cloud Server info.
history View Cloud Server events log.
ip (Deprecated) Manage public IPs.
list List Cloud Servers. (aliases: ls)
list-configurators List Cloud Server configurators (sets of configuration
constraints). (aliases: lc)
list-os-images List prebuilt operating system images. (aliases: li)
list-presets List configuration presets. (aliases: lp)
list-software List software. (aliases: lsw)
reboot Reboot Cloud Server. (aliases: restart)
reinstall Reinstall OS or software.
remove Remove Cloud Server. (aliases: rm)
reset-root-password Reset root user password.
resize Update vCPUs number, RAM, disk and bandwidth.
set Set Cloud Server properties.
set-boot-mode Set Cloud Server boot mode.
set-nat-mode Set Cloud Server NAT mode.
shutdown Shutdown Cloud Server. (aliases: stop)
vnc Open Cloud Server web VNC console in browser.
Просмотр справочников
Список операционных систем list-os-images
$ twc server li
ID FAMILY NAME VERSION CODENAME REQUIREMENTS 47 linux ubuntu 18.04 bionic 50 windows windows 2016 datacenter Disk >= 35G 61 linux ubuntu 20.04 focal 67 linux debian 11 bullseye 69 windows windows 2022 datacenter Disk >= 35G .....
Список готовых конфигураций list-presets
$ twc server lp
ID REGION PRICE CPU FREQ RAM DISK TYPE BANDW LAN 2451 ru-1 800 2 3.3 2G 40G nvme 1000 True ..... 2937 kz-1 611 2 3.3 2G 40G nvme 100 True ..... 3011 ru-2 207 1 3.3 1G 15G nvme 100 True ..... 3340 nl-1 2090 1 3.3 1G 15G nvme 200 True ..... 3795 kz-1 4030 2 3.3 2G 40G nvme 100 True .....
Сборка сервера на заказ list-configurators
$ twc server lc
ID REGION TYPE CPU(MIN/MAX) RAM(MIN/MAX) DISK(MIN/MAX) BW(MIN/MAX) 11 ru-1 nvme 1/104 1024/747520 15360/2048000 1000/1000 17 pl-1 nvme 2/104 2048/747520 40960/2048000 100/1000 21 nl-1 nvme 2/104 2048/747520 40960/2048000 1000/1000 23 kz-1 nvme 2/104 2048/747520 40960/2048000 100/1000 79 de-1 nvme 2/104 2048/747520 40960/2048000 200/1000 .....
Список программного обеспечения list-software
$ twc server lsw
ID NAME OS 25 Docker 47, 61, 79, 99 28 Node.JS 47, 61, 79, 99 71 Wireguard 61, 99, 79 79 WordPress 79, 99 129 OpenVPN 79 .....
Управление сервером
Просмотр списка всех серверов на аккаунте
$ twc server list
ID NAME REGION STATUS IPV4 1111111 Сервер one nl-1 on 111.111.111.111 2222222 Сервер two nl-1 on 222.222.222.222
Вывод детальной информации о конкретном сервере
$ twc server get 1111111 --output json
{ "response_id": "16c28e44-a67d-4393-b85e-de742df8c3d5", "server": { "id": 1111111, "cpu": 1, "ram": 1024, "location": "nl-1", "name": "Сервер one", "availability_zone": "ams-1", "preset_id": 3340, "status": "on", // ..... "disks": [ // диски ], "networks": [ // публичная и приватная сеть ], "os": { // операционная система }, } }
Запуск, остановка или перезагрузка сервера
$ twc server start [SERVER_ID] $ twc server stop [SERVER_ID] $ twc server reboot [SERVER_ID]
Создание нового сервера из пресета (ID=2573), ОС Ubuntu 20.04 (ID=61)
$ twc server create --name "MyServer" --preset-id 2573 --image 61 --availability-zone ams-1
В качестве значения --image можно указывать ID операционной системы или UUID образа.
Создание сервера из существующего образа
$ twc server create --name "MyServer" --preset-id 2573 --image [IMAGE_UUID]
Опция public-ip позволяет привязать к серверу плавающий ip-адрес. Если опция не указана — будет привязан новый ip-адрес. Опция no-public-ip позволяет не привязывать к серверу новый ip-адрес.
Создание сервера из существующего образа через конфигуратор
$ twc server create \ > --name "MyServer" \ > --image [IMAGE_UUID] \ > --configurator-id 43 \ > --cpu 2 \ > --ram 4096 \ > --disk 15360 \ > --region ru-2 \ > --availability-zone msk-1
Timeweb Cloud размещает инфраструктуру в дата-центрах по всему миру, используя систему регионов и зон доступности.
Регион — Санкт-Петербург, Москва, Новосибирск, Амстердам (Нидерланды), Франкфурт-на-Майне (Германия), Алматы (Казахстан).
Зона доступности — это изолированная часть инфраструктуры внутри региона, можно воспринимать её как конкретный дата-центр.
| Регион | | Зона доступности | |------------------------|------|----------------------------| | Санкт-Петербург | ru-1 | spb-1, spb-2, spb-3, spb-4 | | Москва | ru-2 | msk-1 | | Новосибирск | ru-3 | nsk-1 | | Амстердам (Нидерланды) | nl-1 | ams-1 | | Франкфурт (Германия) | de-1 | fra-1 | | Алматы (Казахстан) | kz-1 | ala-1 |
Важно! Timeweb Cloud постепенно отказывается от концепции зон доступности. Благодаря новой реализации сетей связность сервисов внутри одного региона доступна вне зависимости от зоны.
Удаление сервера
$ twc server remove [SERVER_ID]
При удалении сервера — удаляется плавающий ip-адрес, привязанный к серверу. Сохранить ip-адрес на аккаунте можно с помощью опции keep-public-ip.
Список дисков сервера
$ twc server disk list [SERVER_ID]
ID NAME MOUNTED SYSTEM TYPE STATUS SIZE USED 24601314 vda True True nvme done 40G 2.5G 24631020 vdc True False nvme done 10G 0.0G
Добавить новый диск
$ twc server disk add [SERVER_ID] --size 10G
Удалить диск
$ twc server disk remove [DISK_ID]
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 40G 0 disk # ← старый диск ├─sda1 8:1 0 39G 0 part / ├─sda14 8:14 0 4M 0 part ├─sda15 8:15 0 106M 0 part /boot/efi └─sda16 259:0 0 913M 0 part /boot sdb 8:16 0 10G 0 disk # ← новый диск vda 253:0 0 1M 1 disk # ← служебный, метаданные cloud-init
Для подготовки диска к работы выполняем шаги
- Форматируем в ext4
sudo mkfs.ext4 /dev/sdb - Создаём точку монтирования
sudo mkdir -p /mnt/data - Монтируем диск
sudo mount /dev/sdb /mnt/data
После этого снова выполняем команду lsblk — для проверки полученного результата. Чтобы не монтировать диск вручную — добавляем автомонтирование в /etc/fstab при загрузке. Важно добавить опцию nofail, чтобы система не зависла при загрузке, если диск был удален.
# ❌ Опасная запись — сервер зависнет если диска нет /dev/sdb /mnt/data ext4 defaults 0 2 # ✅ Безопасная запись — сервер загрузится без диска /dev/sdb /mnt/data ext4 defaults,nofail 0 2
Дополнительная защита — монтировать по UUID, а не по имени. Имя диска (sdb) может измениться после перезагрузки, если дисков несколько. UUID — не меняется никогда.
Узнать UUID диска можно с помощью команды blkid
$ sudo blkid /dev/sdb
Теперь можно использовать UUID диска в /etc/fstab
UUID=a1b2c3d4-e5f6-... /mnt/data ext4 defaults,nofail 0 2
3. Команда twc image
Общая справка по команде twc image
$ twc image --help
Usage: twc image [OPTIONS] COMMAND [ARGS]... Manage disk images. Options: -h, --help Show this message and exit. Commands: create Create image from existing Cloud Server disk. get Get image info. list List images. (aliases: ls) remove Remove image. (aliases: rm) set Change image name and description. upload Upload image from URL.
Справка по команде twc image create
$ twc image create --help
Usage: twc image create [OPTIONS] DISK_ID Create image from existing Cloud Server disk. Arguments: DISK_ID [required] Options: -v, --verbose Enable verbose mode. -c, --config FILE Use config. -p, --profile NAME Use profile. -o, --output FORMAT Output format, one of: [default|raw|json|yaml]. --name TEXT Image human readable name. --desc TEXT Image description. -h, --help Show this message and exit.
Создать образ диска сервера
$ twc image create [DISK_ID] --name "backup-$(date +%F)"
Для создания образа нужен DISK_ID, который можно получить, если есть SERVER_ID
$ twc server disk list [SERVER_ID]
ID NAME MOUNTED SYSTEM TYPE STATUS SIZE USED 24601314 vda True True nvme done 40G 2.5G 24631020 vdc True False nvme done 10G 0.0G
Идентификатор сервера SERVER_ID можно получить, если вывести список всех серверов
$ twc server list
ID NAME REGION STATUS IPV4 1111111 Сервер one nl-1 on 111.111.111.111 2222222 Сервер two nl-1 on 222.222.222.222
Посмотреть список всех сохраненных образов дисков
$ twc image list
ID TYPE REGION STATUS SIZE 71bb1332-7251-4c13-9167-6e3c94320a9e qcow2 nl-1 created 15G 9a01f088-3c07-48df-9068-14cdfa266bf6 qcow2 ru-1 created 7G cc6dc8a0-1c21-48d4-a07d-349ecb1ff7a0 qcow2 ru-3 created 3G
$ twc image list --output json
{ "images": [ { "created_at": "2026-17-13T15:22:27", "deleted_at": null, "description": "", "disk_id": 20260765, "id": "71bb1332-7251-4c13-9167-6e3c94320a9e", "is_custom": false, "location": "nl-1", "name": "Сервер в Нидерландах 17.05.2026", "os": "ubuntu", "progress": 100, "size": 15326, "status": "created", "type": "qcow2", "virtual_size": 15360 }, // ..... ], "meta": { "total": 4 }, "response_id": "239f8361-ee3a-4f01-9a30-dc45be4f418e" }
Удалить старый ненужный образ (чтобы не платить за хранение)
$ twc image remove [IMAGE_UUID]
4. Команда twc ip
Справка по команде twc ip
$ twc ip --help
Usage: twc ip [OPTIONS] COMMAND [ARGS]... Manage floating IPs. Options: -h, --help Show this message and exit. Commands: attach Attach floating IP to service. create Create new floating IP. detach Detach floating IP from service. get Get floating IP. list List floating IPs. (aliases: ls) remove Remove floating IPs. (aliases: rm) set Set floating IP parameters.
Посмотреть список всех IP-адресов на аккаунте
$ twc ip list
IP PTR ZONE ANTI_DDOS USED_ON 111.111.111.111 xxx.twc1.net ams-1 False server:1111111 222.222.222.222 None msk-1 False server:2222222 123.123.123.123 None ams-1 False None
Заказать новый чистый плавающий IP-адрес
$ twc ip create --availability-zone spb-1
msk-1, spb-1, spb-2, spb-3, ams-1, fra-1).
Привязать IP-адрес 123.123.123.123 к серверу
$ twc ip attach --server [SERVER_ID] 123.123.123.123
Отвязать IP-адрес 123.123.123.123 от сервера
$ twc ip detach --server [SERVER_ID] 123.123.123.123
Задать PTR mail.example.org для IP-адреса 123.123.123.123
$ twc ip set --ptr mail.example.org 123.123.123.123
Образ диска и снапшот
В контексте Timeweb Cloud и большинства облачных провайдеров понятия «снапшот» (snapshot) и «образ» (image) очень близки, так как оба являются точными копиями диска. Однако между ними есть принципиальная разница в логике использования, управлении и стоимости.
1. Снапшот (снимок системы)
Снапшот — это «замороженный» снимок состояния конкретного сервера в определенный момент времени.
- Привязка к железу. Снапшот жестко привязан к тому серверу, с которого он был сделан. Его главная цель — дать возможность быстро «откатиться» назад, если что-то пошло не так (например, после неудачного обновления конфигурации).
- Скорость создания. Создается очень быстро, часто за счет инкрементного копирования (фиксируются только изменения с момента последнего снимка).
- Восстановление. Восстановить снапшот можно, как правило, только на тот же самый сервер, затерев его текущее состояние.
2. Образ (кастомный образ диска)
Образ — это независимый, самостоятельный шаблон операционной системы со всеми файлами и настройками.
- Универсальность. Образ полностью отвязан от конкретного сервера. Из одного образа можно развернуть 5, 10 или 100 абсолютно одинаковых новых серверов. Более того, при разворачивании можно выбрать другую конфигурацию (например, сделать новый сервер мощнее исходного).
- Портативность. Образы можно переносить между разными дата-центрами (локациями) внутри одного провайдера или скачивать к себе на ПК (если провайдер поддерживает экспорт).
- Скорость создания. Создается дольше, так как система упаковывает весь диск целиком в единый независимый файл-шаблон.
Поиск: Bash • CLI • Linux • twc • Сервер • Cloud • Облако • Образ • TimeWeb • Снапшот