Pure-FTPd is a free and secure FTP server. It doesn’t provide useless bells and whistles, but focuses on efficiency and ease of use. It provides simple answers to common needs, plus unique useful features for personal users as well as hosting providers.


This how to guide will help you to setup Pure-FTPD with MySQL as user database. Also providing detailed instruction to create user and test.

Step 1: Install MySQL ( Skip if Already Have )

Firstly we need to install MySQL on our system using following steps of command.

# yum install mysql mysql-server

click here for detailed instruction’s for mysql installation.

Step 2: Install Pure-FTPD

Use following command to install pure-ftpd on your linux system.

# yum install pure-ftpd

Step 3: Create MySQL User and Database

After installation pure-ftpd package, lets create a mysql database, table and user for storing user information.

# mysql -u root -p
Enter password:

mysql> CREATE DATABASE pureftpd;
mysql> GRANT ALL ON pureftpd.* to 'pureftpd'@'localhost' IDENTIFIED BY '_password_';
mysql> use pureftpd;
mysql> CREATE TABLE `users` (
  `User` varchar(32) NOT NULL DEFAULT '',
  `Password` varchar(64) NOT NULL DEFAULT '',
  `Uid` int(3) NOT NULL DEFAULT '500',
  `Gid` int(3) NOT NULL DEFAULT '500',
  `Dir` varchar(255) NOT NULL DEFAULT '',
  `QuotaSize` int(4) NOT NULL DEFAULT '50',
  `Status` enum('0','1') NOT NULL DEFAULT '1',
  `ULBandwidth` int(2) NOT NULL DEFAULT '100',
  `DLBandwidth` int(2) NOT NULL DEFAULT '100',
  `Date` date NOT NULL DEFAULT '0000-00-00',
  `LastModif` varchar(255) NOT NULL DEFAULT '',
  UNIQUE KEY `User` (`User`),
  KEY `Uid` (`Uid`),
  KEY `Gid` (`Gid`),
  KEY `Dir` (`Dir`)

mysql> quit

Step 4: Configure Pure-FTPD

We are going to configure pure-ftpd to store user login details in mysql database. First edit pure-ftpd main configuration file

# vim /etc/pure-ftpd/pure-ftpd.conf

and make following changes.

   ChrootEveryone              yes
   MaxClientsNumber            50
   MaxClientsPerIP             2
   VerboseLog                  yes
   AnonymousOnly               no
   NoAnonymous                 yes
   MaxIdleTime                 15
   MySQLConfigFile             /etc/pure-ftpd/pureftpd-mysql.conf
   PAMAuthentication    	no
   UnixAuthentication     	no

After making changes in pure-ftpd configuration, let edit pure-ftpd mysql configuration file

# vim /etc/pure-ftpd/pureftpd-mysql.conf

and update following variables

   MYSQLUser       pureftpd
   MYSQLPassword   _password_
   MYSQLDatabase   pureftpd
   MYSQLCrypt      md5

Step 5: Test Pure-FTPD Setup

At this step we have completed pure-ftpd setup, Now we need to test our setup by creating our first ftp account. To test our setup, first we need to create an user in linux system. After that we will use that users UID and GID to create our virtual ftp accounts.

Create User Account:

# useradd demouser1
# passwd demouser1

Get UID and GID of this Account:

# cat /etc/passwd | grep demouser1

As per above output we found that usres UID is 504 and GID is 505.

Create FTP Account
Lets login to mysql server or access through phpMyAdmin and create your first account. For this tutorial, I am using command line.

# mysql -u root -p
Enter password:

mysql> INSERT INTO `users` (`User`, `Password`, `Uid`, `Gid`, `Dir`, `QuotaSize`,
`Status`, `ULBandwidth`, `DLBandwidth`, `Date`, `LastModif`)
VALUES ('ftpuser1', md5('_password_'), '504', '505', '/home/demouser1',
'20', 2, '10', '10', now(), '');
mysql> quit

As per above query we have successfully created our first ftp account ftpuser1 with password _password_,

Connect to FTP Server using newly created ftp account and try to upload a test file.

C:> ftp ftp.tecadmin.net

Connected to ftp.tecadmin.net.
220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------
220-You are user number 1 of 50 allowed.
220-Local time is now 21:39. Server port: 21.
220-This is a private system - No anonymous login
220-IPv6 connections are also welcome on this server.
220 You will be disconnected after 15 minutes of inactivity.
User (ftp.tecadmin.net:(none)): ftpuser1
331 User ftpuser1 OK. Password required
230 OK. Current restricted directory is /
ftp> put test.txt
200 PORT command successful
150 Connecting to port 57216
226-File successfully transferred
226 0.004 seconds (measured here), 0.65 Mbytes per second
ftp: 2593 bytes sent in 0.00Seconds 2593.00Kbytes/sec.
ftp> bye
221-Goodbye. You uploaded 3 and downloaded 0 kbytes.
221 Logout.

As per above results we have successfully connected to ftp user and uploaded a test file. Lets check the permissions of that files on server.

# ls -l /home/demouser1/test.txt
-rw-r--r-- 1 demouser1 demouser1 2525 Dec  4 21:39 /home/demouser1/test.txt

Now you can see that the files gets the permissions of that user which UID, GID we have used for that FTP accounts.