Use syslog for non-chroot configuration, support MacOS launchd

This commit is contained in:
Vladimir Dubrovin 2026-04-05 12:46:57 +03:00
parent 28969bbc5a
commit dc83562700
11 changed files with 376 additions and 11 deletions

View File

@ -509,10 +509,22 @@ if(NOT WIN32)
install(FILES scripts/add3proxyuser.sh DESTINATION ${CMAKE_INSTALL_BINDIR}) install(FILES scripts/add3proxyuser.sh DESTINATION ${CMAKE_INSTALL_BINDIR})
endif() endif()
# Install service files (systemd, init.d, or rc.d) # Install service files (systemd, launchd, init.d, or rc.d)
if(NOT WIN32) if(NOT WIN32)
if(CMAKE_SYSTEM_NAME MATCHES "FreeBSD|Darwin|OpenBSD|NetBSD") if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
# BSD/macOS - install rc.d script # macOS - install launchd plist
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/scripts/org.3proxy.3proxy.plist.in
${CMAKE_CURRENT_BINARY_DIR}/org.3proxy.3proxy.plist
@ONLY
)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/org.3proxy.3proxy.plist
DESTINATION /Library/LaunchDaemons
)
message(STATUS " launchd: YES (/Library/LaunchDaemons)")
elseif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD|OpenBSD|NetBSD")
# BSD - install rc.d script
set(RCD_DIR "/usr/local/etc/rc.d") set(RCD_DIR "/usr/local/etc/rc.d")
configure_file( configure_file(
@ -566,7 +578,12 @@ if(NOT WIN32)
message(STATUS " systemd: YES (${SYSTEMD_UNIT_DIR})") message(STATUS " systemd: YES (${SYSTEMD_UNIT_DIR})")
else() else()
# No systemd - install init.d script # No systemd - install init.d script
install(FILES scripts/init.d/3proxy.sh configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/scripts/init.d/3proxy.in
${CMAKE_CURRENT_BINARY_DIR}/3proxy.init
@ONLY
)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/3proxy.init
DESTINATION /etc/init.d DESTINATION /etc/init.d
RENAME 3proxy RENAME 3proxy
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
@ -576,7 +593,12 @@ if(NOT WIN32)
endif() endif()
else() else()
# Other Unix - install init.d script # Other Unix - install init.d script
install(FILES scripts/init.d/3proxy.sh configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/scripts/init.d/3proxy.in
${CMAKE_CURRENT_BINARY_DIR}/3proxy.init
@ONLY
)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/3proxy.init
DESTINATION /etc/init.d DESTINATION /etc/init.d
RENAME 3proxy RENAME 3proxy
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
@ -584,6 +606,18 @@ if(NOT WIN32)
message(STATUS " init.d: YES (/etc/init.d)") message(STATUS " init.d: YES (/etc/init.d)")
endif() endif()
# Create proxy user and group during installation
install(FILES scripts/postinstall.sh
DESTINATION ${CMAKE_INSTALL_BINDIR}
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
)
install(CODE "
execute_process(
COMMAND ${CMAKE_INSTALL_FULL_BINDIR}/postinstall.sh
RESULT_VARIABLE POSTINSTALL_RESULT
)
")
endif() endif()
# Install man pages # Install man pages

53
README
View File

@ -21,10 +21,10 @@ Devel branch - 3proxy 10 (don't use it)
* Windows installation * Windows installation
3proxy --install 3proxy [path_to_config_file] --install
installs and starts proxy as Windows service installs and starts proxy as Windows service
(config file should be located in the same directory) (config file should be located in the same directory or may be optionally specified)
3proxy --remove 3proxy --remove
@ -33,13 +33,14 @@ Devel branch - 3proxy 10 (don't use it)
* To build in Linux * To build in Linux
install git and build-essential packages, use With Makefile:
<pre>
git clone https://github.com/z3apa3a/3proxy git clone https://github.com/z3apa3a/3proxy
cd 3proxy cd 3proxy
ln -s Makefile.Linux Makefile ln -s Makefile.Linux Makefile
make make
sudo make install sudo make install
</pre>
Default configuration (for Linux/Unix): Default configuration (for Linux/Unix):
3proxy uses 2 configuration files: 3proxy uses 2 configuration files:
@ -58,15 +59,59 @@ usage: /etc/3proxy/conf/add3proxyuser.sh username password [day_limit] [bandwidt
or modify /etc/3proxy/conf/ files directly. or modify /etc/3proxy/conf/ files directly.
With CMake:
<pre>
git clone https://github.com/z3apa3a/3proxy
cd 3proxy
mkdir build && cd build
cmake ..
cmake --build .
sudo cmake --install .
</pre>
CMake does not use chroot configuration, config file is /etc/3proxy/3proxy.cfg
* For MacOS X / FreeBSD / *BSD * For MacOS X / FreeBSD / *BSD
With Makefile:
<pre>
git clone https://github.com/z3apa3a/3proxy git clone https://github.com/z3apa3a/3proxy
cd 3proxy cd 3proxy
ln -s Makefile.FreeBSD Makefile ln -s Makefile.FreeBSD Makefile
make make
</pre>
(binaries are in bin/ directory) (binaries are in bin/ directory)
With CMake (recommended):
<pre>
git clone https://github.com/z3apa3a/3proxy
cd 3proxy
mkdir build && cd build
cmake ..
cmake --build .
sudo cmake --install .
</pre>
This installs binaries to /usr/local/bin/, configuration to /etc/3proxy/,
plugins to /usr/local/lib/3proxy/, rc scripts to rc.d for BSD and launchd plist to /Library/LaunchDaemons/ for MacOS.
Service management on macOS:
<pre>
# Load and start service
sudo launchctl load /Library/LaunchDaemons/org.3proxy.3proxy.plist
# Stop service
sudo launchctl stop org.3proxy.3proxy
# Start service
sudo launchctl start org.3proxy.3proxy
# Unload and disable service
sudo launchctl unload /Library/LaunchDaemons/org.3proxy.3proxy.plist
</pre>
Features: Features:
1. General 1. General
+ IPv6 support for incoming and outgoing connection, + IPv6 support for incoming and outgoing connection,

View File

@ -12,6 +12,7 @@
<ul> <ul>
<li><A HREF="#INSTNT">How to install/remove 3proxy under Windows NT/2000/XP</A> <li><A HREF="#INSTNT">How to install/remove 3proxy under Windows NT/2000/XP</A>
<li><A HREF="#INSTUNIX">How to install/remove 3proxy under Unix/Linux</A> <li><A HREF="#INSTUNIX">How to install/remove 3proxy under Unix/Linux</A>
<li><A HREF="#INSTMACOS">How to install/remove 3proxy under macOS</A>
<li><A HREF="#INSTDOCKER">How to use 3proxy with Docker</A> <li><A HREF="#INSTDOCKER">How to use 3proxy with Docker</A>
</ul> </ul>
<li><A HREF="#SERVER">Server configuration</A> <li><A HREF="#SERVER">Server configuration</A>
@ -182,6 +183,51 @@ Add 3proxy to the system startup scripts or use systemd:
sudo systemctl enable 3proxy sudo systemctl enable 3proxy
sudo systemctl start 3proxy sudo systemctl start 3proxy
</pre> </pre>
</p>
<li><A NAME="INSTMACOS">How to install/remove 3proxy under macOS</A>
<p>
<b>Using CMake (recommended):</b>
<pre>
mkdir build && cd build
cmake ..
cmake --build .
sudo cmake --install .
</pre>
This installs:
<ul>
<li>Binaries to <code>/usr/local/bin/</code></li>
<li>Configuration to <code>/etc/3proxy/</code></li>
<li>Plugins to <code>/usr/local/lib/3proxy/</code></li>
<li>Launchd plist to <code>/Library/LaunchDaemons/org.3proxy.3proxy.plist</code></li>
</ul>
</p>
<p>
<b>Using Makefile:</b>
<pre>
ln -sf Makefile.FreeBSD Makefile
make
sudo make install
</pre>
This installs binaries to <code>/usr/local/3proxy/bin/</code> and configuration to <code>/usr/local/etc/3proxy/</code>.
</p>
<p>
<b>Service management with launchd:</b>
<br>After installation via cmake, the service can be managed with launchctl:
<pre>
# Load and start the service
sudo launchctl load /Library/LaunchDaemons/org.3proxy.3proxy.plist
# Stop the service
sudo launchctl stop org.3proxy.3proxy
# Start the service
sudo launchctl start org.3proxy.3proxy
# Unload and disable the service
sudo launchctl unload /Library/LaunchDaemons/org.3proxy.3proxy.plist
</pre>
The service runs as user <code>proxy</code> (created during installation).
Configuration file: <code>/etc/3proxy/3proxy.cfg</code>
</p> </p>
<li><A NAME="INSTDOCKER">How to use 3proxy with Docker</A> <li><A NAME="INSTDOCKER">How to use 3proxy with Docker</A>
<p> <p>

View File

@ -12,6 +12,7 @@
<ul> <ul>
<li><a href="#INSTNT">Как установить/удалить 3proxy под Windows NT/2000/XP/2003 как службу</a> <li><a href="#INSTNT">Как установить/удалить 3proxy под Windows NT/2000/XP/2003 как службу</a>
<li><a href="#INSTUNIX">Как установить/удалить 3proxy под Unix/Linux</a> <li><a href="#INSTUNIX">Как установить/удалить 3proxy под Unix/Linux</a>
<li><a href="#INSTMACOS">Как установить/удалить 3proxy под macOS</a>
<li><a href="#INSTDOCKER">Как использовать 3proxy с Docker</a> <li><a href="#INSTDOCKER">Как использовать 3proxy с Docker</a>
</ul> </ul>
<li><a href="#SERVER">Конфигурация сервера</a> <li><a href="#SERVER">Конфигурация сервера</a>
@ -178,6 +179,48 @@
sudo systemctl enable 3proxy sudo systemctl enable 3proxy
sudo systemctl start 3proxy</pre> sudo systemctl start 3proxy</pre>
</p> </p>
<li><a name="INSTMACOS"><i>Как установить/удалить 3proxy под macOS</i></a>
<p>
<b>С помощью CMake (рекомендуется):</b>
<pre>
mkdir build && cd build
cmake ..
cmake --build .
sudo cmake --install .</pre>
Это установит:
<ul>
<li>Исполняемые файлы в <code>/usr/local/bin/</code></li>
<li>Конфигурацию в <code>/etc/3proxy/</code></li>
<li>Плагины в <code>/usr/local/lib/3proxy/</code></li>
<li>Launchd plist в <code>/Library/LaunchDaemons/org.3proxy.3proxy.plist</code></li>
</ul>
</p>
<p>
<b>С помощью Makefile:</b>
<pre>
ln -sf Makefile.FreeBSD Makefile
make
sudo make install</pre>
Это установит исполняемые файлы в <code>/usr/local/3proxy/bin/</code> и конфигурацию в <code>/usr/local/etc/3proxy/</code>.
</p>
<p>
<b>Управление службой через launchd:</b>
<br>После установки через cmake службой можно управлять с помощью launchctl:
<pre>
# Загрузить и запустить службу
sudo launchctl load /Library/LaunchDaemons/org.3proxy.3proxy.plist
# Остановить службу
sudo launchctl stop org.3proxy.3proxy
# Запустить службу
sudo launchctl start org.3proxy.3proxy
# Выгрузить и отключить службу
sudo launchctl unload /Library/LaunchDaemons/org.3proxy.3proxy.plist</pre>
Служба запускается от имени пользователя <code>proxy</code> (создаётся при установке).
Файл конфигурации: <code>/etc/3proxy/3proxy.cfg</code>
</p>
<li><a name="INSTDOCKER"><i>Как использовать 3proxy с Docker</i></a> <li><a name="INSTDOCKER"><i>Как использовать 3proxy с Docker</i></a>
<p> <p>
<b>Использование готовых образов из GitHub Container Registry:</b> <b>Использование готовых образов из GitHub Container Registry:</b>

View File

@ -1,2 +1,4 @@
#!/usr/local/bin/3proxy #!/usr/local/bin/3proxy
#path to plugins:
#use standard syslog logging
log @3proxy

View File

@ -4,6 +4,9 @@ Documentation=man:3proxy(1)
After=network.target After=network.target
[Service] [Service]
Type=simple
User=proxy
Group=proxy
Environment=CONFIGFILE=/etc/3proxy/3proxy.cfg Environment=CONFIGFILE=/etc/3proxy/3proxy.cfg
ExecStart=@CMAKE_INSTALL_FULL_BINDIR@/3proxy ${CONFIGFILE} ExecStart=@CMAKE_INSTALL_FULL_BINDIR@/3proxy ${CONFIGFILE}
ExecReload=/bin/kill -SIGUSR1 $MAINPID ExecReload=/bin/kill -SIGUSR1 $MAINPID
@ -13,6 +16,7 @@ RestartSec=60s
LimitNOFILE=65536 LimitNOFILE=65536
LimitNPROC=32768 LimitNPROC=32768
RuntimeDirectory=3proxy RuntimeDirectory=3proxy
RuntimeDirectoryMode=0755
[Install] [Install]
WantedBy=multi-user.target WantedBy=multi-user.target

View File

@ -1,3 +1,3 @@
# tmpfiles.d configuration for 3proxy # tmpfiles.d configuration for 3proxy
# This creates the runtime directory for 3proxy # This creates the runtime directory for 3proxy
d /run/3proxy 0755 root root - d /run/3proxy 0755 proxy proxy -

109
scripts/init.d/3proxy.in Normal file
View File

@ -0,0 +1,109 @@
#!/bin/sh
### BEGIN INIT INFO
# Provides: 3proxy
# Required-Start: $network $local_fs
# Required-Stop: $network $local_fs
# Should-Start:
# Should-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start/stop 3proxy
# Description: Start/stop 3proxy, tiny proxy server
### END INIT INFO
# chkconfig: 2345 20 80
# description: 3proxy tiny proxy server
DAEMON=@CMAKE_INSTALL_FULL_BINDIR@/3proxy
CONFIGFILE=/etc/3proxy/3proxy.cfg
PIDFILE=/var/run/3proxy/3proxy.pid
USER=proxy
GROUP=proxy
# Source function library if available
if [ -f /etc/init.d/functions ]; then
. /etc/init.d/functions
fi
case "$1" in
start)
echo -n "Starting 3Proxy: "
if [ ! -d /var/run/3proxy ]; then
mkdir -p /var/run/3proxy
chown $USER:$GROUP /var/run/3proxy 2>/dev/null || true
fi
if command -v start-stop-daemon >/dev/null 2>&1; then
# Debian/Ubuntu style
start-stop-daemon --start --quiet --pidfile $PIDFILE \
--chuid $USER:$GROUP --exec $DAEMON -- $CONFIGFILE
elif [ -f /etc/init.d/functions ]; then
# RedHat/CentOS style
daemon --user=$USER $DAEMON $CONFIGFILE
else
# Fallback
su -s /bin/sh $USER -c "$DAEMON $CONFIGFILE"
fi
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch /var/lock/subsys/3proxy
;;
stop)
echo -n "Stopping 3Proxy: "
if command -v start-stop-daemon >/dev/null 2>&1; then
# Debian/Ubuntu style
start-stop-daemon --stop --quiet --pidfile $PIDFILE
elif [ -f /etc/init.d/functions ]; then
# RedHat/CentOS style
killproc -p $PIDFILE $DAEMON
else
# Fallback
if [ -f $PIDFILE ]; then
kill `cat $PIDFILE` 2>/dev/null
else
killall 3proxy 2>/dev/null
fi
fi
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f /var/lock/subsys/3proxy
;;
restart|reload)
echo -n "Reloading 3Proxy: "
if [ -f $PIDFILE ]; then
kill -s USR1 `cat $PIDFILE` 2>/dev/null
RETVAL=$?
else
echo "PID file not found, cannot reload"
RETVAL=1
fi
echo
;;
status)
if command -v status >/dev/null 2>&1; then
status -p $PIDFILE $DAEMON
elif [ -f $PIDFILE ]; then
if kill -0 `cat $PIDFILE` 2>/dev/null; then
echo "3proxy is running (pid `cat $PIDFILE`)"
RETVAL=0
else
echo "3proxy is dead but pid file exists"
RETVAL=1
fi
else
echo "3proxy is not running"
RETVAL=3
fi
;;
*)
echo "Usage: $0 {start|stop|restart|reload|status}"
exit 1
esac
exit ${RETVAL:-0}

View File

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>org.3proxy.3proxy</string>
<key>ProgramArguments</key>
<array>
<string>@CMAKE_INSTALL_FULL_BINDIR@/3proxy</string>
<string>/etc/3proxy/3proxy.cfg</string>
</array>
<key>UserName</key>
<string>proxy</string>
<key>GroupName</key>
<string>proxy</string>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>StandardOutPath</key>
<string>/var/log/3proxy.log</string>
<key>StandardErrorPath</key>
<string>/var/log/3proxy.log</string>
<key>SoftResourceLimits</key>
<dict>
<key>NumberOfFiles</key>
<integer>65536</integer>
</dict>
<key>HardResourceLimits</key>
<dict>
<key>NumberOfFiles</key>
<integer>65536</integer>
</dict>
</dict>
</plist>

45
scripts/postinstall.sh Normal file
View File

@ -0,0 +1,45 @@
#!/bin/sh
# Post-install script for 3proxy
# Creates proxy user and group if they don't exist
set -e
# Check if user already exists
if id proxy >/dev/null 2>&1; then
echo "User 'proxy' already exists"
exit 0
fi
echo "Creating proxy user and group..."
# Determine which commands are available
if command -v groupadd >/dev/null 2>&1; then
# Linux (shadow-utils)
groupadd -r proxy 2>/dev/null || true
useradd -r -g proxy -d /var/run/3proxy -s /usr/sbin/nologin proxy 2>/dev/null || true
elif command -v addgroup >/dev/null 2>&1; then
# Alpine Linux / BusyBox
addgroup -S proxy 2>/dev/null || true
adduser -S -D -H -G proxy -s /sbin/nologin proxy 2>/dev/null || true
elif command -v pw >/dev/null 2>&1; then
# FreeBSD
pw groupadd proxy 2>/dev/null || true
pw useradd proxy -g proxy -d /var/run/3proxy -s /usr/sbin/nologin 2>/dev/null || true
elif command -v dscl >/dev/null 2>&1; then
# macOS
dscl . create /Groups/proxy 2>/dev/null || true
dscl . create /Users/proxy 2>/dev/null || true
dscl . create /Users/proxy UserShell /usr/bin/false 2>/dev/null || true
dscl . create /Users/proxy NFSHomeDirectory /var/run/3proxy 2>/dev/null || true
else
echo "Warning: Could not create proxy user - no suitable user management tool found"
exit 0
fi
if id proxy >/dev/null 2>&1; then
echo "User 'proxy' created successfully"
else
echo "Warning: Failed to create user 'proxy'"
fi
exit 0

View File

@ -13,6 +13,7 @@ command="@CMAKE_INSTALL_FULL_BINDIR@/3proxy"
pidfile="/var/run/3proxy/${name}.pid" pidfile="/var/run/3proxy/${name}.pid"
command_args="${3proxy_config:-/etc/3proxy/3proxy.cfg}" command_args="${3proxy_config:-/etc/3proxy/3proxy.cfg}"
required_files="${3proxy_config:-/etc/3proxy/3proxy.cfg}" required_files="${3proxy_config:-/etc/3proxy/3proxy.cfg}"
command_user="proxy:proxy"
start_precmd="3proxy_precmd" start_precmd="3proxy_precmd"
@ -20,6 +21,7 @@ start_precmd="3proxy_precmd"
{ {
if [ ! -d /var/run/3proxy ]; then if [ ! -d /var/run/3proxy ]; then
mkdir -p /var/run/3proxy mkdir -p /var/run/3proxy
chown proxy:proxy /var/run/3proxy
fi fi
} }