Files
configure_nginx_manager/docs/en/BUILD_GUIDE_EN.md

456 lines
9.1 KiB
Markdown

# 🔨 Executable Build Guide
This guide describes the process of compiling the `letsencrypt_regru_api.py` Python script into executable files for Linux and Windows using PyInstaller.
## 📋 Table of Contents
- [Advantages of Executable Files](#advantages-of-executable-files)
- [Quick Start](#quick-start)
- [Detailed Instructions](#detailed-instructions)
- [Cross-Compilation](#cross-compilation)
- [Troubleshooting](#troubleshooting)
---
## ✅ Advantages of Executable Files
### Pros:
-**Single file** - easy to distribute and deploy
-**Standalone** - no Python installation required on target system
-**All dependencies included** - requests, cryptography, and certbot modules are bundled
-**Simple execution** - just download and run
### Cons:
-**Large size** - ~40-60 MB (including Python runtime and libraries)
-**Certbot dependency** - system certbot is still required
-**Slow first launch** - unpacking takes a few seconds
-**Rebuild required** - code changes require recompilation
---
## 🚀 Quick Start
### Build for current OS:
```bash
make build
```
### Build for all platforms:
```bash
make build-all
```
### Full release (build + packages):
```bash
make release
```
---
## 📖 Detailed Instructions
### 1. Install Dependencies
#### Option A: Automatic Installation
```bash
make install-pyinstaller
```
#### Option B: Manual Installation
```bash
pip install pyinstaller
pip install -r requirements.txt
```
### 2. Build for Linux
**On Linux system:**
```bash
make build-linux
```
**Result:**
- File: `dist/letsencrypt-regru`
- Size: ~45-55 MB
- Format: ELF 64-bit executable
**Testing:**
```bash
./dist/letsencrypt-regru --help
sudo ./dist/letsencrypt-regru --check -c /etc/letsencrypt-regru/config.json
```
### 3. Build for Windows
**On Windows system (PowerShell/CMD):**
```bash
make build-windows
```
**Result:**
- File: `dist/letsencrypt-regru.exe`
- Size: ~40-50 MB
- Format: PE32+ executable (Windows)
**Testing:**
```powershell
.\dist\letsencrypt-regru.exe --help
```
### 4. Create Distribution Packages
#### Linux package (tar.gz):
```bash
make package-linux
```
**Package contents:**
- `letsencrypt-regru` - executable file
- `README.md` - documentation
- `systemd/` - systemd unit files
- `config.json.example` - configuration example
**Result:** `dist/letsencrypt-regru-linux-x86_64.tar.gz`
#### Windows package (zip):
```bash
make package-windows
```
**Result:** `dist/letsencrypt-regru-windows-x86_64.zip`
### 5. Full Release Cycle
Create release with all artifacts:
```bash
make release
```
**What happens:**
1. Clean old artifacts (`clean-build`)
2. Install/update PyInstaller
3. Build for Linux (`build-linux`)
4. Build for Windows (`build-windows`)
5. Create Linux package (`package-linux`)
6. Create Windows package (`package-windows`)
7. Generate SHA256 checksums
**Result in `dist/`:**
```
letsencrypt-regru # Linux executable
letsencrypt-regru.exe # Windows executable
letsencrypt-regru-linux-x86_64.tar.gz
letsencrypt-regru-windows-x86_64.zip
```
---
## 🔄 Cross-Compilation
### ⚠️ Important Notes
**Not recommended:**
- Building Linux version on Windows
- Building Windows version on Linux
- Building macOS version on other OSes
**Reasons:**
- System library incompatibility
- Different executable formats
- Path and separator issues
### Recommendations
#### For Linux builds:
1. Use Ubuntu 20.04+ or Debian 10+
2. Install build-essential
3. Use Python virtual environment
```bash
sudo apt-get update
sudo apt-get install -y python3 python3-pip build-essential
make build-linux
```
#### For Windows builds:
1. Use Windows 10/11
2. Install Python 3.8+
3. Use PowerShell or CMD
```powershell
python -m pip install --upgrade pip
make build-windows
```
#### For both platforms:
Use CI/CD (GitHub Actions, GitLab CI):
```yaml
# .github/workflows/build.yml
name: Build Releases
on:
push:
tags:
- 'v*'
jobs:
build-linux:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Build Linux
run: make build-linux
build-windows:
runs-on: windows-latest
steps:
- uses: actions/checkout@v3
- name: Build Windows
run: make build-windows
```
---
## 🛠️ All Makefile Commands
### Main Commands:
| Command | Description |
|---------|-------------|
| `make build` | Build for current OS |
| `make build-linux` | Build for Linux |
| `make build-windows` | Build for Windows |
| `make build-all` | Build for all platforms |
| `make package-linux` | Create tar.gz package |
| `make package-windows` | Create zip package |
| `make release` | Full release cycle |
### Supporting Commands:
| Command | Description |
|---------|-------------|
| `make install-pyinstaller` | Install PyInstaller |
| `make test-build` | Test built file |
| `make clean-build` | Clean build artifacts |
| `make build-info` | Show environment info |
---
## 🐛 Troubleshooting
### Issue: PyInstaller not found
**Error:**
```
make: pyinstaller: Command not found
```
**Solution:**
```bash
make install-pyinstaller
# or
pip install pyinstaller
```
---
### Issue: Module imports not working
**Error:**
```
ModuleNotFoundError: No module named 'requests'
```
**Solution:**
```bash
pip install -r requirements.txt
# or add to PyInstaller command:
--hidden-import requests
--hidden-import certbot
--hidden-import cryptography
```
---
### Issue: Large file size
**Size ~100+ MB instead of 40-60 MB**
**Causes:**
- Extra modules included
- Not using `--onefile`
- Debug symbols included
**Solution:**
```bash
# Use optimization flags:
pyinstaller --onefile \
--strip \
--exclude-module tkinter \
--exclude-module matplotlib \
letsencrypt_regru_api.py
```
---
### Issue: Certbot not working in executable
**Error:**
```
certbot: command not found
```
**Solution:**
Certbot is called via `subprocess` and must be installed on the system:
**Linux:**
```bash
sudo apt-get install certbot
```
**Windows:**
- Not directly supported
- Use WSL or Docker
---
### Issue: File permission errors
**Error:**
```
Permission denied: /etc/letsencrypt/
```
**Solution:**
```bash
# Linux/macOS
sudo ./dist/letsencrypt-regru --check
# Or set proper permissions:
sudo chmod +x ./dist/letsencrypt-regru
sudo chown root:root ./dist/letsencrypt-regru
```
---
### Issue: Slow startup
**First launch takes 5-10 seconds**
**Reason:**
PyInstaller unpacks files to temporary directory on each run.
**Solution:**
- This is normal behavior for `--onefile`
- Use `--onedir` for faster startup (but many files)
- Temporary directory is cached automatically
---
### Issue: Antivirus blocking file
**Windows Defender marks .exe as virus**
**Reasons:**
- Self-extracting archive looks like malware
- No digital signature
- Unknown executable file
**Solution:**
1. **Add to exclusions:**
- Windows Defender → Settings → Exclusions
2. **Sign file with digital signature:**
```bash
# Requires Code Signing certificate
signtool sign /f cert.pfx /p password dist/letsencrypt-regru.exe
```
3. **Check on VirusTotal:**
- Upload file to virustotal.com
- Add results to README
---
## 📊 Comparison: Python vs Executable
| Feature | Python Script | Executable File |
|---------|---------------|-----------------|
| Size | ~50 KB | ~40-60 MB |
| Dependencies | Requires Python + pip | Standalone |
| Startup Speed | Fast (~1 sec) | Slow (~5-10 sec) |
| Updates | Just replace .py | Requires rebuild |
| Compatibility | Any OS with Python | Only target OS |
| Installation | Requires venv setup | Download and run |
| Certbot | Via subprocess | Via subprocess |
---
## 🎯 Recommendations
### Use Python script if:
- ✅ Python already installed on system
- ✅ Frequent code updates needed
- ✅ Using virtual environment
- ✅ Working on servers (production)
### Use executable file if:
- ✅ Python not installed
- ✅ Simple deployment needed
- ✅ Distributing to end users
- ✅ Testing on clean systems
---
## 📦 Using Built File Examples
### Linux:
```bash
# Download and extract
wget https://github.com/user/repo/releases/download/v1.0/letsencrypt-regru-linux-x86_64.tar.gz
tar -xzf letsencrypt-regru-linux-x86_64.tar.gz
# Install
sudo mv letsencrypt-regru /usr/local/bin/
sudo chmod +x /usr/local/bin/letsencrypt-regru
# Use
sudo letsencrypt-regru --help
sudo letsencrypt-regru --check -c /etc/letsencrypt-regru/config.json
```
### Windows:
```powershell
# Download and extract
Invoke-WebRequest -Uri "https://github.com/user/repo/releases/download/v1.0/letsencrypt-regru-windows-x86_64.zip" -OutFile "letsencrypt-regru.zip"
Expand-Archive -Path letsencrypt-regru.zip -DestinationPath "C:\Program Files\LetsEncrypt-RegRu"
# Use
cd "C:\Program Files\LetsEncrypt-RegRu"
.\letsencrypt-regru.exe --help
```
---
## 📝 Additional Resources
- [PyInstaller Documentation](https://pyinstaller.org/en/stable/)
- [PyInstaller FAQ](https://pyinstaller.org/en/stable/FAQ.html)
- [Building Cross-Platform Applications](https://pyinstaller.org/en/stable/operating-mode.html)
---
## 📄 License
This project uses the license as specified in the main README.md.
---
**Author:** Dmitry Fofanov
**Last Updated:** October 28, 2025